Một phần tử lớn trong ngành lập trình đã luôn dành sự chỉ trích nhất định cho Java. Lời chỉ trích này chủ yếu tập trung vào tính dông dài của Java và số lượng code soạn sẵn (boilerplate code) không cần thiết mà nó tạo ra trong nhiều trường hợp. Những cáo buộc này không sai, tính dông dài và sự lộn xộn của Java có thể trở nên rất khó chịu trong nhiều trường hợp. Tuy nhiên, hầu hết thời gian, chúng ta phải chấp nhận rằng chúng ta không sống trong một thế giới hoàn hảo, và trong hầu hết các trường hợp, chúng ta phải chấp nhận nguyên tắc ít hơn hai tệ nạn (‘the lesser of two evils’ principle). Vì vậy, đúng, Java không hoàn hảo, tất cả chúng ta đều biết điều đó, nhưng câu hỏi chính là tại sao trước đó không có gì được thực hiện để giải quyết những mối quan tâm này?

Lý do duy nhất khiến các thay đổi diễn ra quá lâu là do không có đủ sự cạnh tranh, hay nói cách khác là các đối thủ cạnh tranh nghiêm túc với cho Java. 

Sự an toàn mạnh mẽ mà Java cung cấp và một số đặc điểm như cấu trúc tốt đã khiến nó trở thành một ngôn ngữ rất phổ biến cho các dự án lớn. Sử dụng Java, nhìn chung sẽ khiến mọi thứ trong tầm kiểm soát. Ngoài ra, một trong những đặc điểm chính của Java là ngôn ngữ đa nền tảng chạy trên máy ảo của riêng nó, đã khiến nó trở thành một kết hợp hoàn hảo cho nhiều tổ chức. Công với khả năng thực hiện các tối ưu hóa hiệu suất tự động thông qua trình biên dịch JIT (Just-in-time) nổi tiếng của nó giúp giảm thiểu các ảnh hưởng của code sai, thì bạn có một bộ lý do khá chắc chắn để sử dụng Java.

Nhưng sau đó điều gì đã xảy ra? Đó là các ngôn ngữ mới có thể chạy bằng JVM (Java Virtual Mahcine) giống như Java đã được đưa vào thị trường, những ngôn ngữ đó loại bỏ một số điểm khó chịu lớn nhất trong Java và cung cấp một môi trường tốt hơn cho các lập trình viên với đường cong học tập khá phẳng, trong một số trường hợp.

Trước khi chúng ta tiếp tục, hãy tóm tắt lại và tìm hiểu sơ qua về lịch sử của các ngôn ngữ JVM.

Lịch sử của một vài ngôn ngữ JVM

  1. Java: Tất nhiên, chúng ta phải bắt đầu với Java, ngôn ngữ lâu đời nhất và phổ biến nhất trong thế giới JVM. Java được chính thức phát hành vào tháng 01 năm 1996, đã 24 năm. Ban đầu, Java là một ngôn ngữ mệnh lệnh thuần túy theo phong cách lập trình hướng đối tượng thuần túy; nó cũng là một ngôn ngữ được định kiểu mạnh. Về mặt nào đó, cú pháp của Java tương tự như ngôn ngữ C++ và C, nhưng nó được coi là phiên bản cải tiến vì viết code bằng Java dễ dàng hơn nhiều so với C hoặc C++. Mặt khác, chúng tôi cho rằng lập luận lớn nhất trong số những người gièm pha là tính dài dòng của nó.
  2. Groovy: Ngôn ngữ JVM thứ hai được phát hành là Groovy. Ra đời từ năm 2003, mặc dù phiên bản 1.0 chính thức và tiêu chuẩn đầu tiên của nó đến tháng 01 năm 2007 mới được phát hành. Groovy cũng có lợi ích là có thể được sử dụng như một ngôn ngữ kịch bản (scripting language). Groovy là một ngôn ngữ được lập trình động, vì vậy việc kiểm tra kiểu (type check) xảy ra trong thời gian chạy; đây là một trong những lý do tại sao một số nhà phát triển không thích Groovy. Bạn viết code của mình trong Groovy và code có vẻ đúng vào giai đoạn dịch mã, nhưng sau đó trong thời gian chạy, bạn nhận ra có điều gì đó không ổn.
  3. Scale: Tiếp theo là một ngôn ngữ rất phổ biến trong vài năm. Chúng ta đang nói về Scala. Scala chính thức được phát hành vào năm 2004, và nó đã mang lại một mô hình lập trình mới cho thế giới JVM, với lập trình chức năng và hướng tiếp cận khai báo của nó. Chúng ta có thể khẳng định rằng Scala là ngôn ngữ đầu tiên đưa ra khái niệm về tính bất biến mà chúng ta đã nói trước đây, vì vậy nó đã làm rất tốt trong việc chuyển đổi Java. Mặt khác, những người gièm pha Scala không thích nó do ngữ pháp phức tạp và khả năng đọc thấp.
  4. Clojure: Ngôn ngữ tiếp theo xuất hiện trong thế giới JVM là Clojure, một ngôn ngữ thuần chức năng. Nó đã trở nên khá phổ biến gần đây, nhưng nó xuất hiện lần đầu tiên vào năm 2007. Clojure là một ngôn ngữ dựa trên ngôn ngữ LISP được đặc trưng bởi tính đơn giản và sử dụng các chức năng thuần túy. Trong số những hạn chế của nó, chúng ta có thể kể đến việc nó được gõ động (giống như Groovy) và đường cong học tập dốc hơn nhiều, vì cú pháp của nó hoàn toàn khác với các ngôn ngữ JVM khác.
    Một vài cuốn sách hay mà bạn nên đọc nếu muốn học Clojure: The Joy of Clojure và Programming Clojure: 3rd Edition.
  5. Kotlin: Cuối cùng nhưng không kém phần quan trọng, chúng ta có Kotlin. Kotlin được phát hành lần đầu tiên vào tháng 02 năm 2016, và kể từ đó, nó đã không ngừng trở nên phổ biến. Nó được thiết kế bởi công ty JetBrains với một mục tiêu rõ ràng: loại bỏ tất cả các “vấn đề Java” phổ biến nhất. Theo cách thiết kế, nó đã giữ được tất cả những điều tốt đẹp về Java nhưng đồng thời loại bỏ phần lớn các vấn đề của Java. Đó là lý do tại sao nó trở nên rất phổ biến và nhiều người cho rằng nó có thể đánh bại Java trong vài năm tới.
    Nếu bạn muốn biết thêm về Kotlin (khuyến khích bạn làm như vậy, vì đây là một ngôn ngữ tuyệt vời), bạn nên đọc cuốn sách “Kotlin in Action”.

Phía trên là những ngôn ngữ JVM quan trọng nhất. Bài viết đã bỏ qua một số ngôn ngữ khác không quá phổ biến, một số ngôn ngữ đó là: Python, Ruby, Ceylon, Fantom, v.v. Bạn có thể xem toàn bộ danh sách các ngôn ngữ JVM hiện có trên Wikipedia.

Java không có nhiều đối thủ cạnh tranh trong 08 - 10 năm đầu tiên, nhưng kể từ đó, sự cạnh tranh bắt đầu xuất hiện. Vậy có cạnh tranh là tốt hay xấu?

Lợi ích của việc gia tăng cạnh tranh

Như đã đề cập trước đó, Java đã không thay đổi quá nhiều trong những năm đầu có lẽ vì không cần thiết. Ngôn ngữ này đã được sử dụng rộng rãi và rất phổ biến mặc dù còn lâu mới hoàn hảo.

Nhưng sau đó các đối thủ cạnh tranh đã xuất hiện, các ngôn ngữ hiện đại hơn mang lại các tính năng mới và giải quyết một số điểm khó khăn mà các nhà phát triển Java đã phải chịu đựng trong một thời gian dài. Ví dụ: hãy xem xét ngôn ngữ Scala. Mức độ phổ biến của Scala đã tăng lên kể từ năm 2009. Các nhà phát triển đã chào đón kiểu chức năng mới này cho phép họ linh hoạt hơn và cũng có khả năng viết code song song một cách an toàn và dễ dàng.

Phản ứng của Oracle với xu hướng mới này là gì? Java Lambdas and Streams được phát hành vào năm 2014. Có lẽ tất cả những ai làm việc trong ngành đều có thể đồng ý rằng đó là khi Java thực hiện bước tiến lớn nhất để đánh bại Scala và cảm nhận được sự tụt dốc không phanh của Scala trong những năm gần đây.

Một lợi ích nữa khi có nhiều đối thủ cạnh tranh hơn trong thế giới JVM là những cải tiến liên tục mà trình biên dịch JIT và bản thân JVM đang trải qua. Giờ đây, có nhiều người quan tâm đến việc có một JVM được tối ưu hóa và cải thiện hiệu suất tối ưu. Vì vậy, cạnh tranh là một điều tốt cho tất cả mọi người!

Đối thủ cạnh tranh cuối cùng xuất hiện trong đấu trường là Kotlin, và Kotlin rất quan trọng bởi vì, theo một số cách, nó đã chỉ ra cho Oracle con đường đi tiếp. Kotlin đã chỉ ra rằng có thể giữ những phần tốt của Java nhưng tạo ra một ngôn ngữ ngắn gọn hơn để viết code nhanh hơn. Có vẻ như Kotlin trở nên khá phổ biến khá nhanh chóng. Tuy nhiên, nó dường như đã lắng xuống trong vài năm qua.

Oracle đã lưu ý tốt về phản ứng của ngành liên quan đến Kotlin. Nếu bạn xem các ghi chú phát hành JDK 15, bạn có thể thấy rằng một số tính năng mới của Java về cơ bản là bản sao của những gì Kotlin đã thay đổi. Ví dụ bao gồm các bản ghi Java mới, các khối văn bản mới (chuỗi nhiều dòng với ba dấu ngoặc kép) và câu lệnh switch mới, ít nhiều là bản sao của câu lệnh when trong Kotlin.

Tất cả những điều mà chúng ta đã nói đến, được gọi là Cuộc cách mạng Kotlin của Java. Bằng cách trở thành một đối thủ cạnh tranh mạnh hơn, Kotlin đã chỉ ra cho Java con đường để đi. Có thể nói, Kotlin là ngôn ngữ duy nhất vượt qua Java với tư cách là người dẫn đầu ngành.

"Cuộc cách mạng Kotlin" của Java

Một số tính năng sắp tới của Java sẽ là một cải tiến lớn về khả năng đọc và cải thiện một trong những điểm yếu chính của Java, đó là tính dài dòng. Có thể khẳng định rằng tất cả chúng đều có sự tương đồng đáng ngờ với một số tính năng của Kotlin.

Hãy nhớ rằng hầu hết các tính năng này là bản xem trước tính năng. Điều đó có nghĩa là nếu bạn cài đặt JDK 14 hoặc JDK 15 khi nó được phát hành, bạn sẽ không thể sử dụng chúng theo mặc định.

Xem trước tính năng Java là các tính năng mới được giới thiệu trong một bản phát hành nhưng bị tắt theo mặc định. Chúng được đưa vào bản phát hành chỉ để thu thập phản hồi từ cộng đồng các lập trình viên, vì vậy chúng vẫn có thể thay đổi. Đó là lý do tại sao không nên sử dụng chúng trong code sản xuất. Tất nhiên, bạn cũng có thể bật chúng trong IDE của mình, nhưng hãy cẩn thận để không bật bản xem trước theo mặc định trong tất cả các dự án mới của bạn!

Hãy cùng xem những thay đổi sẽ có tác động lớn hơn đến việc viết mã của chúng ta với các phiên bản Java trong tương lai.

Bản ghi Java

Bản ghi Java là một tính năng mà nhiều người trong chúng ta đã yêu cầu trong một thời gian dài. Có lẽ, bạn đã ở trong tình huống tương tự nhiều lần, khi bạn miễn cưỡng phải triển khai toString, hashCode, equals và getters cho mỗi trường hiện có (giả định rằng bạn không còn sử dụng phương thức thay đổi nữa và bạn chắc chắn không nên).

Kotlin cung cấp các lớp dữ liệu (data class) để giải quyết vấn đề này và Java đang có ý định làm điều tương tự bằng cách giải phóng các lớp bản ghi (record class), một thứ mà Scala cũng có với các lớp trường hợp (case class) của nó. Mục đích chính của các lớp này là giữ dữ liệu bất biến trong một đối tượng. Số lượng code của chúng ta sẽ trở nên tiết kiệm và đơn giản hơn rất nhiều.

Bây giờ chúng ta hãy xem sự khác biệt trong cải thiện câu lệnh switch là gì.

Cải thiện câu lệnh switch

Các câu lệnh switch mới trong Java giải quyết một số vấn đề cố hữu của việc sử dụng chúng trong Java. Luôn luôn tránh các câu lệnh chuyển đổi vào thời điểm này vì chúng rất dễ xảy ra lỗi và dẫn đến trùng lặp mã. Hiện tại, rất dễ dàng để lộ các trường hợp (case).

Với câu lệnh switch mới, vấn đề đó sẽ được giải quyết vì nó sẽ không biên dịch nếu câu lệnh switch của chúng ta không bao gồm toàn bộ vùng miền thuộc loại mà chúng ta chuyển vào câu lệnh. Bạn sẽ có thể thấy rất nhanh rằng các câu lệnh switch mới có thể được sử dụng như một biểu thức, không chỉ như một câu lệnh. Các kết quả trở nên ngắn gọn và mang tính diễn đạt hơn. Điều đó đủ để thuyết phục nhiều người trong chúng ta sử dụng chúng, nhưng một trong những cải tiến chính là giờ đây các câu lệnh switch sẽ không biên dịch nếu chúng ta không đề cập đến tất cả các trường hợp trong switch của mình. Điều này rất giống với câu lệnh Kotlin when mà bạn có thể đọc trong tài liệu.

Tiếp theo, hãy cùng xem xét các khối văn bản mới.

Khối văn bản 

Bạn đã bao giờ than vãn về việc gán một kiểu dữ liệu (blob) JSON cho một biến trong Java chưa? Java sẽ giới thiệu các chuỗi nhiều dòng (multi-line string) mà bạn có thể xác định bằng cách đặt chúng giữa các dấu ngoặc ba (triple quotes). Khi tính năng này chính thức được phát hành, việc xác định các chuỗi dài thành nhiều dòng sẽ dễ dàng hơn nhiều. Đây cũng là thứ được hỗ trợ trong Kotlin, như bạn có thể tìm thấy trong định nghĩa loại của nó.

Hãy xem xét sự khác biệt giữa hai chế độ. Hiện tại, nếu chúng ta muốn lưu trữ một JSON được định dạng trong một biến, nó sẽ trông xấu xí như này:

java text block

Mặt khác, khi các khối văn bản mới được phát hành, nó sẽ trông dễ dàng và sạch sẽ như sau:

Java text block

Vì vậy, chúng ta nhận thấy rằng Java đang “thừa hưởng” nhiều giải pháp cho các vấn đề của riêng nó từ một trong những đối thủ cạnh tranh: Kotlin. Chúng ta không biết liệu lần này Oracle đã phản ứng đúng lúc để chống lại sự trỗi dậy của Kotlin hay có thể là quá muộn. Có thể rằng Java đang có những bước đi đúng đắn, ngay cả khi những thay đổi này được các đối thủ cạnh tranh kích hoạt theo một cách nào đó và nó đến hơi muộn.

 

Kết luận

Sự cạnh tranh là điều tốt nhất từng xảy ra với ngôn ngữ Java. Nếu không thì Java đã hả hê nằm trên đỉnh vinh quang rồi. Ngoài ra, các đối thủ cạnh tranh của Java chỉ ra rằng các cách lập trình khác nhau là khả thi, chỉ ra cách hướng về phía trước và tránh bị lỗi thời trong việc viết code.

Những thay đổi trong Java gần đây, với tất cả các tính năng và cải tiến sắp tới, đang tạo ra một Java mạnh mẽ hơn bao giờ hết, một ngôn ngữ thích nghi với thời hiện đại, một ngôn ngữ muốn phát triển và không ngại phá vỡ truyền thống: một tương lai mới cho Java!

 

Tổng hợp việc làm IT - Software trên VietnamWorks
VietnamWorks InTECH
Theo A Bored Dev