18 điểm bởi roxie 2024-11-05 | 58 bình luận | Chia sẻ qua WhatsApp
  • Ngôn ngữ tôi thích nhất là Python. Dù vậy, tôi dùng Java cho mọi thứ — kể cả các script đơn giản.
  • Một vài trải nghiệm:
    • Ở một công ty dùng Java làm nền tảng, tôi đã viết các kịch bản kiểm thử bằng JavaScript. Nhưng việc lần theo stack trace rất khó, và tôi đã tốn công vô ích để viết mã cầu nối giữa Java và JavaScript.
    • Chúng tôi lưu log ở định dạng JSON, và một đồng nghiệp đã tạo ra một chương trình tên là logcat để xử lý các log này. Tôi khá hài lòng với chương trình đó, nhưng sau này khi làm một chương trình tương tự bằng Java thì hiệu năng tăng hơn 10 lần.
    • Nhờ kinh nghiệm phong phú và tài liệu dồi dào về Java, trong việc xây dựng dịch vụ web thì Java nhanh hơn Python. Nói chính xác hơn, đây là lợi thế của việc dùng một ngôn ngữ duy nhất.
  • Tranh luận gay gắt nhất về Java là tính verbose (dài dòng). Nhưng đây hoàn toàn không phải nhược điểm. Hãy xem hai đoạn mã dưới đây.
// java  
Map<String,User> userIdMap = new HashMap<String,User>();  
// python  
userIdMap = {}  
Quảng cáo
  • Nhưng trên thực tế, mã Python nhiều khả năng sẽ được viết như bên dưới hơn. (Nếu không thì chắc sẽ rất khó bảo trì.)
# Map from user ID to User object.  
userIdMap = {}  
  • Nói cách khác, dùng ngôn ngữ kiểu động cũng giống như hy sinh năng suất sau 14 ngày để làm ra thứ gì đó trông ngầu trong 30 phút.
  • Stack Overflow đã dùng ASP.NET và (vào năm 2010) chịu được 60.000.000 pageview chỉ với 5 máy chủ.
  • Hãy xem ví dụ về kiểm thử đơn vị. Việc viết và bảo trì unit test tốn thời gian. Đặc biệt, những trường hợp ngoại lệ có thể kiểm tra đơn giản bằng kiểu dữ liệu thì cũng không dễ được unit test trong ngôn ngữ kiểu động bắt được (ví dụ: parser).
  • (Nếu thêm một lý do vì sao tôi không dùng Python) thì các giải pháp chắp vá tức thời (quick hack) dần dần phình to thành những công cụ rất quan trọng, nhưng lại không có thời gian để viết lại, nên cuối cùng mỗi lần dùng đều phải vật lộn với hiệu năng và khả năng bảo trì.
  • Cuối cùng, đây là những lý do tôi thích Java hơn các ngôn ngữ kiểu tĩnh khác
    • C/C++ khó áp dụng vào công việc của tôi
    • C# thiếu hỗ trợ đa nền tảng
    • Scala quá phức tạp
    • Các ngôn ngữ khác như D, Go vẫn còn quá mới để đưa vào công việc của tôi
Quảng cáo

  • Có vài lý do khiến tôi mang bài này lên GeekNews:
    • Tôi thấy thú vị vì đây là lần đầu tiên tôi thấy một bài kiểu “Tôi thật sự rất thích Java!” (Tôi cứ tưởng chỉ nhìn tiêu đề thôi rồi sẽ có cú lật ở cuối...)
    • Tôi thấy thú vị ở chỗ tác giả có hẳn một hộp công cụ riêng của mình (làm bằng Java). Tự nhiên tôi liên tưởng đến hình ảnh một ông lão lục lọi trong túi và lôi ra từng món vũ khí cổ đại.
    • Cá nhân tôi rất thích JavaScript và Python. Tuy nhiên, nhìn qua thì có vẻ xu hướng của các ngôn ngữ này cũng đang là “đưa kiểu dữ liệu vào bằng cách nào đó” (TypeScript cho JavaScript, typing/mypy cho Python). Trong bối cảnh đó, đọc bài này khiến tôi nghĩ rằng việc tôi dùng ngôn ngữ kiểu tĩnh theo cách không hề ép buộc kiểu có lẽ hơi mang tính tự thỏa mãn.
  • Tác giả có kinh nghiệm với Java và Python nên đã so sánh trực tiếp hai ngôn ngữ này, nhưng có lẽ không nhất thiết phải giới hạn cách nghĩ như vậy. Ở góc nhìn rộng hơn, mọi người nghĩ gì về ngôn ngữ kiểu tĩnh và kiểu động?

PS. Đừng hạ thấp một ngôn ngữ nào đó một cách vô nghĩa nhé :D

58 bình luận

 
kimjj81 2024-11-11

Có lẽ đây là trải nghiệm quá cá nhân, nhưng tôi nghĩ vấn đề lớn nhất của Java không phải là ngôn ngữ mà là JVM.
Tôi đã gặp quá nhiều trường hợp không quản lý được bộ nhớ trên nhiều phiên bản JVM khác nhau.

 
ahwjdekf 2024-11-09

Vậy thì hãy tự làm cả pandas, numpy bằng Java mà dùng. Ai đưa ra những lập luận như thế thì không nên để ở gần.

 
koreaisbest 2024-11-08

Cứ dùng Java thôi.

Java thì dùng cho web backend, còn Python thì dùng cho AI.
Nếu xét về hiệu năng thì phải dùng Rust chứ, chẳng phải ai cũng biết điều đó sao?
Nhưng với triển vọng sau này tỷ trọng của AI sẽ tăng cao, nên cũng có suy nghĩ kiểu
đã đến lúc bỏ cả Java rồi chăng? Ở nước mình có khá nhiều tư duy kiểu
không được để tụt lại phía sau mà, haha

 
savvykang 2024-11-08

Nếu AI ngày càng được ưa chuộng và các công việc như REST API thông thường hay CRUD đơn giản bị thay thế, khiến người ta không còn xây dựng những hệ thống như vậy nữa, thì lúc đó có lẽ cũng có thể bỏ Java.
Ngoài ra, cũng có những trường hợp dự án không được cấu thành bởi chỉ một ngôn ngữ, nên tôi nghĩ cũng không thể gán mục đích của dự án với ngôn ngữ theo kiểu một-một. Vì giao diện lập trình là Python còn những phần cần hiệu năng thì dùng mã native là chuyện khá phổ biến mà. Dù ở nước ta thì kiểu cấu hình dự án như vậy không mấy phổ biến.

 
carnoxen 2024-11-06

Phần giới thiệu hơi đáng tiếc. Nếu ngay từ đầu bạn cho biết ngày bài gốc được viết, thì chắc một nửa số người ở đây đã có thể phần nào đồng tình rồi...

 
roxie 2024-11-07

Tôi cũng nhận ra sau khi đọc bình luận của những người khác.

Nhưng tôi đã vội cho rằng bài này được viết gần đây, và khi đọc nội dung thì hoàn toàn không thấy gượng gạo chút nào. Ít nhất với tôi, đây vẫn là một bài viết có sức thuyết phục.

Ngoài chuyện đó ra, từ giờ tôi sẽ để ý ngày tháng hơn mỗi khi đọc haha

 
moderator 2024-11-06

Cuộc thảo luận đang trở nên quá nóng.
Nếu có ý kiến phản biện, vui lòng chỉ viết nội dung phản biện đó.
Các bình luận không phù hợp với quy định sử dụng trang web đã bị xóa.
Ngoài ra, xin lưu ý rằng các tài khoản có hoạt động lặp đi lặp lại không phù hợp với quy định sử dụng cũng đã bị chặn.
Mong mọi người thảo luận một cách lành mạnh.

 
kandk 2024-11-06

Tôi tin Google (V8) hơn Oracle (JVM).

 
ilotoki0804 2024-11-06

Lần đầu nhìn thấy Java sau khi dùng Python, tôi thực sự cảm thấy nó quá dài dòng, nhưng dạo này khi nhìn vào lượng mã cần thiết để thêm type hint đầy đủ cho Python thì hình như cũng không hẳn vậy nữa haha. Điểm đáng tiếc của Java có lẽ lại là quy ước đặt tên khiến người ta cố đặt tên method dài khủng khiếp.

 
tested 2024-11-06

Ngày 1 tháng 6 năm 2014

 
cosine20 2024-11-06

Tôi cũng thích các ngôn ngữ kiểu tĩnh.
Ngôn ngữ kiểu động có những điểm tiện lợi, nhưng trong môi trường production thì khá thường xuyên gặp trường hợp việc bảo trì trở nên khó khăn hơn.
Và các ngôn ngữ kiểu động thường có triết lý thiết kế hướng tới việc "viết code đơn giản", nên có nhiều thứ được ngôn ngữ ngầm quản lý ở cấp độ ngôn ngữ; vì vậy cũng có nhiều lúc dư địa để tối ưu hóa không nhiều.

Cuối cùng, có lẽ tốt nhất là cân nhắc và lựa chọn cho phù hợp với môi trường phát triển giữa hai phía: sự tiện lợi khi triển khai và nhiều dư địa để tối ưu hóa.

 
kandk 2024-11-06

Bài viết từ 10 năm trước, ghê thật.

 
callman7 2024-11-06

Đúng vậy đó kk

 
idunno 2024-11-06

Cứ dùng Java đi

Từ khi rời bỏ Java, cuộc sống của tôi đã trở nên yên bình hơn.

 
jjpark78 2024-11-06

Việc Java cứ liên tục tụt hạng về độ phổ biến trong khảo sát của Stack Overflow là có lý do cả.
Riêng ở Hàn Quốc, vì cái framework của chính phủ chết tiệt đó bị đóng đinh với Spring nên còn có chút giá trị khi xin việc,
nhưng ở phương Tây, ngoài mấy hệ thống legacy ra thì có vẻ gần như không còn ai chọn Java khi bắt đầu dự án mới nữa.

 
rabbitcarrot 2024-11-07

Đúng là có những lý do như vậy, nhưng có vẻ bạn đang nhìn nhận những lý do đó theo cách khác.

Ngay trên trang TIOBE cũng có nêu rõ rằng bảng xếp hạng ngôn ngữ lập trình chỉ nên dùng để tham khảo, và không có liên hệ trực tiếp với thị phần hay mức độ phổ biến trên thị trường.

Kết luận là: Python đứng số 1 với thị phần áp đảo, nhưng trên thị trường có công cụ nào được phát hành bằng nó không? Những thứ chúng ta thường gặp nhất là C/C++, .NET, rồi Java (Kotlin) và Swift.

Nhiều câu hỏi và lượt tìm kiếm không có nghĩa đó là ngôn ngữ được dùng nhiều. Python là ngôn ngữ mà ai cũng có thể dùng dù không học chuyên ngành. Không thể phủ nhận nó rất phổ biến, nhưng trong thị trường phát triển phần mềm thì lại là câu chuyện khác.

 
analogstar 2024-11-07

Instagram đang sử dụng Python cho backend.

 
ilotoki0804 2024-11-07

Cứ dùng Java thôi

Ý nghĩa của cụm "các công cụ đã ra thị trường" có hơi không rõ, nhưng... Django, FastAPI, PyTorch, NumPy, Pandas các thứ vẫn chưa đủ công cụ sao...?

 
skrevolve 2024-11-06

Nhìn tiêu đề là vào ngay vì hóng phần bình luận trước luôn lol Dạo này mức độ trông cậy vào ngôn ngữ cũng rộng hơn rồi nhỉ

 
bungker 2024-11-06

Nếu chỉ giới hạn ở bài toán chi phí thì Java lại tốn khá nhiều tiền trên cloud vì mức sử dụng bộ nhớ. Những chương trình viết bằng ngôn ngữ tĩnh chỉ cần 100MB, 200MB bộ nhớ, nếu viết bằng Java thì rất thường phải cần tới 1G, 2G, và lightweight thread cũng nhiều khi không dùng được vì vấn đề tương thích thư viện.

 
cosine20 2024-11-06

Cứ dùng Java thôi.

Java cũng là ngôn ngữ tĩnh, nhưng... vấn đề bộ nhớ là chuyện của garbage collector hoặc JVM, còn điều bạn nói là “chương trình cần 100MB, 200MB bộ nhớ vì là ngôn ngữ tĩnh” thì có lẽ phù hợp hơn với các ngôn ngữ native như C, C++.

 
bungker 2024-11-06

Xin lỗi vì thông tin sai. hu hu Java cũng đúng là một ngôn ngữ tĩnh. Khi cộng gộp đủ loại chi phí trên cloud thì phải tính khoảng 30.000 won cho mỗi 1GB bộ nhớ, nên các dịch vụ phát triển bằng Java hóa ra phát sinh chi phí rất đắt.

 
constexprif 2024-11-06

Nếu có ngoại lệ thì đó là ngôn ngữ kiểu động. Ngoài ra, tôi đồng ý với luận điểm rằng hệ thống kiểu và việc sử dụng bộ nhớ là hai vấn đề riêng biệt.

 
cosine20 2024-11-06

Ý nghĩa của ngoại lệ mà bạn nói đến có vẻ quá rộng, bạn có thể giải thích chi tiết thêm một chút được không?
Theo định nghĩa về ngôn ngữ kiểu tĩnh/động mà tôi biết, nếu kiểu của biến được xác định ở thời điểm biên dịch và khi thay đổi nó phải được thực hiện một cách tường minh thì đó là ngôn ngữ kiểu tĩnh; còn ngôn ngữ kiểu động là ngôn ngữ mà ở thời điểm chạy có thể tùy ý xác định kiểu của biến và cũng có thể thay đổi nó một cách ngầm định.

 
constexprif 2024-11-06

Khi gặp những tình huống như thực hiện downcasting ở runtime, Java phải kiểm tra kiểu tại runtime. Vì lý do đó mà Java là ngôn ngữ kiểu động, và thứ phát sinh lúc này chính là ngoại lệ.
Về căn bản, nếu không có khoảng cách này thì không cần gọi ngoại lệ là ngoại lệ nữa. throw khi đó sẽ trở thành cú pháp đường cho mẫu lưu đối tượng được ném vào biến toàn cục rồi goto.

 
constexprif 2024-11-06

Tương tự như điều bạn nói, ngôn ngữ thực hiện kiểm tra kiểu tại thời gian chạy được gọi là kiểu động. Tuy nhiên, đây là câu chuyện áp dụng cho mọi giá trị được xử lý trong chương trình. Vì bài viết nói về Java nên lấy Java làm ví dụ: mã Java được kiểm tra kiểu tại thời gian biên dịch, nhưng điều này hàm ý một điểm quan trọng là giá trị được gán cho biến đó phải khớp với kiểu của biến.

 
rabbitcarrot 2024-11-06

Nếu kiểm tra kiểu được thực hiện ở runtime thì C cũng là ngôn ngữ kiểu động sao, vì tôi biết là có khái niệm con trỏ void? Hai thứ đó khác nhau như thế nào?

 
savvykang 2024-11-07

Có trình biên dịch C nào chèn kiểm tra kiểu vào mã và tạo ra lỗi tường minh khi kiểu không khớp không? Nếu có bản triển khai như vậy, xin hãy cho một ví dụ.

 
constexprif 2024-11-07

C trong quá trình đó không hề có cái gọi là kiểm tra kiểu. Đọc dữ liệu số thực dấu phẩy động như số nguyên mà cũng chẳng có vấn đề gì, đúng không? Không phải là kiểu động, mà đơn giản là nguy hiểm thôi.

 
secret3056 2024-11-07

Nếu kiểm tra kiểu được thực hiện ở runtime thì C cũng là ngôn ngữ kiểu động sao?

Đúng, nếu C kiểm tra kiểu ở runtime thì nó là ngôn ngữ kiểu động.
Vì không phải như vậy nên nó là kiểu tĩnh.

Con trỏ void chỉ đơn giản là một con trỏ raw không thể biết được kiểu dữ liệu gốc. Không thể biết ở địa chỉ mà con trỏ đó trỏ tới đang có kiểu nào.

 
readiz 2024-11-06

Theo quan điểm của tôi, ngôn ngữ tốt nhất là ngôn ngữ bạn đã quen dùng.

 
yhju101 2024-11-06

Tôi đồng ý. Có vẻ cũng không dễ để đi chệch khỏi ngôn ngữ mà đội nhóm hoặc tổ chức đang sử dụng.

 
savvykang 2024-11-06

Trong nhiều lý do khiến nội dung công việc hoặc việc phân công bị tách rời, việc bổ sung thêm ngôn ngữ có thể làm phát sinh tình trạng quá tải công việc cho một số nhân sự nhất định, và khi có biến động nhân sự thì công việc cũng không thể tiếp tục. Đây cũng là yếu tố ảnh hưởng đến tuyển dụng, nên tôi nghĩ cần phải rất thận trọng khi lựa chọn tech stack.

Tuy nhiên, ở chiều ngược lại, nếu chỉ vì đã quen mà vẫn cố chấp giữ một ngôn ngữ có nguồn ứng viên ít hoặc đòi hỏi phải học thêm riêng sau khi tuyển, thì đó cũng là vấn đề.

 
chwj1212 2024-11-06

Cứ dùng Java đi.

Vì sao C# lại thiếu tính đa nền tảng? Dạo này phần lớn ứng dụng server .NET đều được triển khai lên máy chủ Linux.
Python ngay từ đầu đã không phải đối tượng để so sánh, còn Kotlin thì đúng là so với C#, nó dài dòng hơn và thiếu khá nhiều tính năng cần thiết.

 
chwj1212 2024-11-06

À, đây là bài viết từ 10 năm trước rồi. Bây giờ tình hình đã thay đổi rất nhiều.

 
rabbitcarrot 2024-11-07

C# cũng là ngôn ngữ dùng máy ảo nên lẽ ra hỗ trợ đa nền tảng phải xuất hiện từ lâu, nhưng theo tôi biết thì chuyện đó chỉ mới có trong thời gian rất gần đây, vì vậy có lẽ trong một thời gian nữa người ta vẫn sẽ nhìn nhận nó ở mức là có thể chạy trên các HĐH khác ngoài Windows.
Hơn nữa, trong môi trường Linux thiên về máy chủ chạy 365 ngày một năm, cũng là sự thật khi người ta ngần ngại với .NET chưa được kiểm chứng đầy đủ bằng các ngôn ngữ khác đã được xác minh độ ổn định suốt hơn 10 năm trên hệ thống đó.
Có phải vì ý nghĩa đó mà người ta nói rằng nó thiếu tính đa nền tảng không?

 
lazydonkey456 2024-11-07

Nhưng rốt cuộc tiêu chí để xác minh tính ổn định là gì vậy? Tôi không hiểu lắm, ý bạn chỉ đơn giản là thời gian sử dụng thôi sao?

 
lazydonkey456 2024-11-07

Vì đây là bài viết từ 10 năm trước, được viết vào thời điểm không lâu sau khi .NET Core ra đời nên nội dung mới như vậy.
Hiện nay các ứng dụng .NET đã chạy ổn định và tốt trên Linux và Mac.

 
unsure4000 2024-11-06

Tôi từng tình cờ phát hiện ra GDScript khi đang tìm xem có ngôn ngữ nào có cú pháp ngắn gọn kiểu Python nhưng gắn thêm kiểu tĩnh không, nhưng nhược điểm quá lớn của nó là rất khó để dùng một cách phổ biến.
Nếu có cơ hội, tôi khuyên bạn hãy thử làm một dự án nhỏ bằng Godot và trải nghiệm GDScript.

 
joyfui 2024-11-06

Tôi từng bị ám ảnh ghét Java sau khi tiếp xúc với Kotlin...

 
nicewook 2024-11-06

Java khiến tôi có cảm giác rằng mỗi khi cần một tính năng nào đó thì luôn có một đáp án đã được kiểm chứng sẵn.

 
[Bình luận này đã bị ẩn.]
 
mammal 2024-11-06

Cứ dùng Kotlin đi.

 
roxie 2024-11-07

Tôi cũng đã hỏi ý kiến qua email về Kotlin (vì bản thân tôi cũng là người dùng Kotlin), nhưng ông ấy đã trả lời rằng vì chưa từng dùng nên khó có thể nói về trải nghiệm của mình.

 
regentag 2024-11-06

Tôi thích các ngôn ngữ kiểu tĩnh. Chúng giúp giảm bớt nhu cầu phải suy nghĩ về kiểu dữ liệu, để tôi có thể dành thời gian đó nghĩ đến những thứ khác.

Java là một ngôn ngữ có vị thế thực sự rất đặc biệt. Lần cuối tôi dùng Java cho công việc đã vào khoảng hơn 10 năm trước, nhưng đến giờ nếu phải phát triển một chương trình cho công việc chứ không phải làm vì sở thích, thì nó vẫn nằm trong danh sách những ngôn ngữ tôi sẽ cân nhắc đầu tiên.

Ngôn ngữ chính tôi dùng cho công việc hiện nay là Ada và C, nhưng những công cụ để dùng cá nhân hoặc trong nội bộ nhóm thì tôi chủ yếu viết bằng PowerShell. Tuy nhiên chỉ cần viết xong rồi để một lúc thôi (chỉ 5 phút thôi...) là tôi lại bắt đầu nghĩ: "Biến này có kiểu gì nhỉ?". Vì thế dạo gần đây tôi luôn ghi rõ kiểu. (PowerShell cho phép chỉ định kiểu khi khai báo biến, hoặc lược bỏ để dùng động)

Tôi cũng không thích C lắm. Những lỗi liên quan đến kiểu mà nếu là Ada thì compiler đã chặn lại, còn C thì hoàn toàn không bắt được. Tôi cũng thường nghĩ sẽ thật tuyệt nếu có một ngôn ngữ với cú pháp kiểu C nhưng lại hỗ trợ hệ thống kiểu của Ada.

Tôi không thấy hợp với Javascript và Python. Còn Perl hay Shell Script thì... tôi thậm chí còn chẳng muốn nghĩ đến nữa.

 
fooandbar 2024-11-06

Có vẻ là điều không thể tránh khỏi vì triết lý cơ bản của ngôn ngữ C là "hãy tin vào lập trình viên"..

 
regentag 2024-11-06

À, với lại tôi thích Java nhưng ghét Maven.
Hồi thời hoàng kim, người ta có thể làm mọi thứ bằng Ant!

 
savvykang 2024-11-06

Thật may là Java cũng đang dần theo kịp các ngôn ngữ hiện đại, như việc bổ sung record và pattern matching.

 
aer0700 2024-11-05

Java có nhiều tài liệu tham khảo nên đúng là rất tốt, nhưng nếu chỉ có vậy thì tôi tự hỏi vì sao lại không phải là C++.
Tôi nghĩ sẽ tốt hơn nếu có thêm một chút về những ưu điểm của Java.

 
aer0700 2024-11-07

Tôi chủ yếu dùng C++ nên chỉ lấy C++ làm ví dụ thôi. Bản thân tôi cũng nghĩ Java là một ngôn ngữ tốt, nhưng điều tôi muốn chỉ ra là bài đăng gốc đó thiếu phần nói về ưu điểm của Java.
Nếu đã viết là "Java tuyệt lắm", thì phần chính lẽ ra phải là nói về các ưu điểm của Java, nhưng có vẻ phần chính lại là phê phán các ngôn ngữ khác.
Đúng như bạn nói, tôi cũng cho rằng JVM của Java là cực kỳ tốt.

 
roxie 2024-11-07

Tôi hoàn toàn đồng ý. Lời chú thích rằng không nhất thiết phải giới hạn câu chuyện chỉ trong Java là nhằm mục đích đó. Có vẻ như ý này đã không được truyền đạt rõ ràng...

 
anjwoc 2024-11-06

Việc lấy Java và C++ làm nhóm so sánh khiến độ tin cậy tự nhiên tụt hẳn luôn nhỉ haha

 
geekhada 2024-11-06

Cứ dùng Java thôi.

Java chạy trên JVM nên có thể thiết lập môi trường local và môi trường máy giống hệt nhau. Nếu muốn làm cho mọi lập trình viên và mọi môi trường máy đều giống nhau bằng C++ thì sẽ tốn khá nhiều thời gian. Cũng khó bảo trì nữa...

 
regentag 2024-11-06

Có vẻ như tác giả gốc chỉ dùng Java vì đây là công việc khó áp dụng C++. Có lẽ nếu phải chọn giữa Python và C++, chẳng phải anh ấy đã chọn C++ sao?

 
roxie 2024-11-05

sửa: "cuối cùng là những lý do không chọn các ngôn ngữ kiểu tĩnh khác" -> "cuối cùng, những lý do ưu tiên Java thay vì các ngôn ngữ kiểu tĩnh khác"

 
fau1ty 2024-11-07

Mồi bén lửa thật đấy.. cực lực đề cử

 
roxie 2024-11-07

Đây không phải ngọn lửa mà tôi mong muốn T_T

 
plaaat0102 2024-11-08

Ấm áp..nhỉ..