Năm 1995 là một trong những năm điên rồ nhất lịch sử máy tính. Phiên bản Java đầu tiên xuất hiện, và rồi lòi ra thêm cậu em JavaScript. Hai cái tên “na ná” nhau làm mọi người lầm tưởng cả hai là “anh em song sinh dính liền” vừa mới tách ra vậy, nhưng thực tế cả hai chả giống gì nhau cả. Một cái theo kiểu compiled và stactical, cái kia thì interpreted và dynamical. Và đây chỉ là khởi đầu cho sự khác biệt “trời-vực” giữa hai ngôn ngữ này. Sau này, sự xuất hiện của Node.js sẽ càng khiến người ta điên đầu.
Có lẽ, những bạn lập trình viên “già” vẫn còn nhớ ngày xưa, thời đỉnh điểm mà Java còn làm mưa làm gió trước khi dần nhường sân khấu cho những đàn em khác. Ngày ấy, mọi người cứ tưởng Java sẽ bất bại và thống trị cả thế giới máy tính cơ, nhưng đự đoán này chỉ đúng một nửa. Ngày nay, Java vẫn thống trị, nhưng chủ yếu trên Android, môi trường doanh nghiệp và thế giới embed (như blu-ray chẳng hạn).
Dù đã có nhiều thành công như vậy, Java chưa bao giờ có sức ảnh hưởng quá lớn trên môi trường desktop hay trình duyệt. Người ta cứ hay ca tụng sức mạnh của applets và những công cụ dựa trên Java khác, nhưng lại hay kết hợp loạn xạ cả lên. Và rồi server dần chuyển thành “điểm G” của Java.
Lúc này, nhiều người cho rằng JavaScript là một “người song sinh đần độn” của Java dần nhận ra sức mạnh của nó. Hiển nhiên, JavaScript trước đó vẫn “gắng gượng” được vài năm trong môi trường HTML, và Web cũng đang dần thống trị thế giới. Nhưng bỗng nhiên, AJAX xuất hiện, và “người song sinh đần độn” dần dần có thêm sức mạnh mới.
Rồi lại lòi ra thêm Node.js, với tốc độ làm biết bao developers chao đảo. JavaScript không những thao tác trên server nhanh hơn người ta dự đoán, mà còn nhanh hơn cả Java và vô số công cụ khác mới đáng sợ. Menu nhẹ, nhanh, request data vô tận tiếp tục khiến Node.js nổi tiếng đến tận ngày nay, và các trang Web ngày càng mọc ra nhiều hơn bao giờ hết.
20 năm trôi qua, có ai lại ngờ được: Cả hai người anh em này ngày nay lại “kẻ tám lạng người nửa cân” đến vậy, ai cũng lăm le thống trị thế giới lập trình. Một bên cán cân, ta có một nền móng bám sâu, mạnh với cấu trúc và nguyên lý vững vàng. Bên kia lại có sự đơn giản và linh hoạt không kém phần tinh tế. Thế giới compiler “hoài niệm” của Java sẽ giữ được ngôi vương, hay bị tốc độ và sự linh hoạt của JavaScript với Node.js lật đổ?
Thế mạnh của Java: Nền tảng vững chắc
Tôi bắt đầu nghe thấy tiếng vài người cười nhạo nhễ rồi đấy, có khi còn cười đến trụy tim cũng không chừng. Hiển nhiên, Java vẫn có glich và bug (chương trình nào lại không có chứ), nhưng công bằng mà nói, nền móng của nó vững như đá tảng. Còn với Node.js, muốn vững thế này chắc cũng phải… vài năm nữa. Thực ra, chắc cũng phải vài chục năm nữa thì phía JavaScript mới cho ra được mấy cái regression tests như Sun/Oracle làm được trên Java Virtual Machine. Khi bạn khởi động một JVM, bạn có ngay một “người” quản trị kỳ cựu 20 năm kinh nghiệm quyết tâm thống trị server doanh nghiệp. Còn khi bạn khởi động JavaScript, bạn cũng có ngay một “liên minh tạp nham”, “lâu lâu” mới muốn hợp tác một lần, nhưng “lâu lâu” cũng muốn dùng chuẩn JavaScript để ngầm đấu đá với nhau.
Thế mạnh của Node: Chỗ nào cũng góp mặt
Nhờ ơn Node.js, JavaScript mới bám vúi được một chút ở server và trên trình duyệt. Nhưng ở đời có chuyện gì chắc chắn đâu, cả ngành công nghiệp máy tính cũng vậy. Ta thà viết hết bằng JavaScript cho cả hai bên client/server, còn hơn là mải mê viết trước bằng Java rồi lại ngậm ngùi viết lại bằng JavaScript; bạn chắc hẳn phải viết lại nếu quyết định chuyển business logic đã viết cho server bằng Java sang browser đấy. Cũng có khi ông xếp còn sẽ nài nỉ bạn chuyển logic đã built cho browser về ngược lại server cũng nên. Dù có chuyển theo chiều nào đi nữa, Node.js và JavaScript vẫn giúp ta migrate code dễ hơn nhiều.
Thế mạnh nữa của Java: IDEs vượt trội
Lập trình viên Java có Eclipse, NetBeans và IntelliJ, đến 3 công cụ hàng đầu có tích hợp mạnh mẽ debuggers, decompilers, và servers. Cái nào cũng đã qua nhiều năm phát triển, với lượng người dùng trung thành, và hệ sinh thái đầy plugins.
Trong khi đó, đa số lập trình viên Node.js phải ngồi cặm cuội gõ từng từ vào command line và code vào text editor. Nhiều người lựa chọn Eclipse hoặc Visual Studio, cả hai đều có hỗ trợ Node.js. Hiển nhiên, sự chú ý gần đây vào Node.js đồng nghĩa với nhiều công cụ hơn nữa trong tương lai. Chẳng hạn như WebStorm từ JetBrains, xâu chuỗi nhiều công cụ command-line build lại với nhau, là một công cụ khá chất lượng. Nhưng muốn hoàn thiện như Eclipse. Còn lâu!
Tất nhiên, nếu bạn đang tìm kiếm một IDE giúp đơn thuần “cắt xén và tung hứng”, những công cụ mới có hỗ trợ Node.js đã khá đủ rồi. Nhưng nếu bạn đòi hỏi IDE vừa edit vừa vận hành trên soure code đang chạy như “vừa ăn vừa nói”, thì Java vẫn tốt hơn nhiều.
Thế mạnh của Node: dùng cùng một ngôn ngữ để đơn giản hóa build process
Các build tools phức tạp như Ant và Maven đã phần nào cách mạnh hóa cách lập trình trên Java. Nhưng vẫn còn một vấn đề. Bạn phải viết specification bằng XML, một kiểu data format không được thiết kế để hỗ trợ việc lập trình logic. Hiển nhiên, biểu thị branching bằng nested tags không khó. Nhưng việc chuyển đổi liên tục giữa Java và XML cũng không kém phần khó chịu.
Thế mạnh của Java: Debug từ xa
Java tràn ngập đủ loại công cụ mạnh mẽ giúp ta quản lý được hàng đống thiết bị. Thậm chí những công cụ đào sâu vào JVM và chi tiết hóa profiling giúp xác định bottlenecks và failures cũng không thiếu. Stack doanh nghiệp Java quản lý một trong những hệ thống servers phức tạp nhất hành tinh, và những công ty sử dụng những server này đã từng có những yêu cầu hàng đầu… từ xa. Tất cả những công cụ dùng để theo dõi và debug hầu như đã trưởng thành và sẵn sàng làm việc hết công suất.
Thế mạnh của Node: Database queries
Queries cho các database mới hơn, như CouchDB, được viết bằng JavaScript. Trộn lẫn giữa CouchDB và Node.js không cần phải đổi công cụ, nên cũng chả cần nhớ cả khác biệt cú pháp luôn.
Trong khi đó, Nhiều lập trình viên Java sử dụng SQL. Ngay cả khi sử dụng Java DB (database viết bằng Java cho lập trình viên Java) họ cũng viết queries bằng SQL. Nhiều bạn thấy chỉ việc call Java methods thôi phải không? Nhưng sai rồi. Bạn phải viết database code bằng SQL, rồi để Derby phân tích từ SQL. SQL là một ngôn ngữ hay, nhưng quá khác biệt và và có khi team phải cần đến hai người khác nhau để một người chuyên cho SQL, và người kia chuyên về Java.
Thế mạnh của Java: Thư viện
Hiện Java có một tập hợp thư viện khổng lồ, và những thư viện này là giải pháp rút ngắn mạnh mẽ. Những công cụ text indexing như Lucene, và computer vision toolkits như OpenCV là hai ví dụ open source projects có thể làm nền tảng vững chắc cho các project nghiêm túc. Còn có rất nhiều thư viện được viết bằng JavaScript, trong đó có không ít thư viện hết sức tuyệt vời, nhưng khó có thể so với Java code base, cả về chất lượng lẫn số lượng.
Thế mạnh của Node: JSON
Khi Database đã là câu trả lời cho nhiều vấn đề, Java lại nỗ lực hết sức để chuyển kết quả về phía Java objects. Giới lập trình chắc sẽ tranh cãi hàng tiếng đồng hồ về POJO mappings, Hibernate… Tinh chỉnh những công cụ này sẽ tốn hàng tiếng đồng hồ, thậm chí nhiều ngày liền. Dần dần, đoạn mã java này sẽ lấy tất cả các đối tượng sau khi chuyển đổi chúng.
Nhiều dịch vụ và database Web hiện định hoán data bằng JSON, một phần tự nhiên sẵn có của JavaScript. Format JSON hiện thông dụng và hữu ích, đến nỗi nhiều lập trình viên Java đã chuyển sang dạng JSON luôn, và như vậy việc các thư viện Java chuyển sang JSON là không thể tránh khỏi. Nhưng cần gì đến thư viện, JSON đã có sẵn trong JavaScript rồi còn gì, cứ lấy và dùng thôi.
Thế mạnh của Java: Kết cấu vững chắc
Nhìn chung, nhiều bộ phần mềm phức tạp cho các công trình khoa học được viết bằng Java, vì Java có nền tảng thuật toán siêu vững chắc. Sun dành nhiều thời gian để “rặng” ra chi tiết của utility classes. Còn có BigIntegers, elaborate IO routines, và code Date phức tạp có bổ sung cả lịch Gregorian và lịch Julian.
JavaScript, phù hợp với các công việc đơn giản hơn, và vẫn còn nhiều vướng mắc. Như ta thấy, trong JavaScript, một function không có kết quả được trả về đến ba kiểu: undefined, NaN, và null. Cái nào mới đúng? Mỗi kết quả đều có vai trò riêng — và cả ba đều có chung một mục đích là làm developer phát điên mới thôi. Những vấn đề “nho nhỏ” như thế này tuy không gây quá nhiều khó khăn cho những công việc đơn giản, nhưng khi động đến lượng lớn thuật toán phức tạp thì lại khác.
Điểm mạnh của Node: Tốc độ
Mọi người mải mê đắm say trong tốc độ của Node.js. Dữ liệu vào, kết quả ra với tốc độ ánh sáng. Node.js không không quá chú trọng vào setting thread độc lập với locking. Cũng không có overhead làm mọi thứ chạy chậm chạp hẳn đi. Bạn cứ việc dùng code đơn giản, và Node.js sẽ nhanh chóng hoàn thành mọi thứ.
Nhưng “nhân bất thập toàn”. Node.js yêu cầu code của bạn phải đơn giản và ít bug. Nếu bị deadlock, có khi cả server cũng lock up luôn. Lập trình viên bù đầu bứt tóc viết nets an toàn tránh lỗi bao nhiêu, Node.js lại quăng đi hết bấy nhiêu.
Điểm mạnh của Java: Threads
Web servers của Java đều là đa nhiệm. Tuy việc tạo nhiều threads sẽ tốn bộ nhớ và thời gian, nhưng kết quả đem lại hoàn toàn xứng đáng. Nếu một thread deadlocks, những thread khác sẽ theo sau. Nếu một thread cần tính toán lâu hơn, các thread khác (thường) sẽ không chen đẩy.
Khi một Node.js request chạy quá chậm chạm, cái gì cũng chậm hết. Vì Node.js chỉ có một thread duy nhất, và chỉ ra event khi nó sẵn sàng. Trông thì nhanh đấy, nhưng thực tế không khác gì bưu điện ngày tết mà chỉ có một ô phục vụ cả.
Bây giờ, khi người ta đã hướng đến những hệ thống có thể cùng lúc làm nhiều thứ. Tại sao phải quay lại thời máy tính đơn nhiệm thập niên 60 làm gì?
Thế mạnh của Node: Tuổi trẻ
Lời dạy “tham thì thâm” của các cụ có vẻ càng ngày càng đúng: Java có thể đuổi theo Node, nhưng có quá nhiều code cũ còn tồn tại. Chắc hẳn rồi, Java có IO routines mới, những vẫn còn IO routines cũ tồn tại. Quá nhiều applet và util class có thể gây nhiều khó khăn.
Thế mạnh của cả hai: Cross-compiling với nhau
Nên dùng Java hay Node.js cho server, có cãi đến tết công-gô cũng chưa quyết được. Thay vì tranh cãi, tại sao không dùng luôn cả hai. Java cũng có thể cross-compiled vào JavaScript được. Google rất hay áp dụng biện pháp này cho Google Web Toolkit, mà nhiều website quan trọng nhất có Java code chạy trong đó — Java đã được dịch sang JavaScript.
Tương tự, ngược lại ta có nhiều JavaScript engines như Rhino chạy JavaScript trong ứng dụng Java ở những điểm link được. Nếu “tham vọng”, bạn có thể link vào Google’s V8 engine.
Tuyệt vời chưa, tất cả code đều link vừa khít với nhau mà không cần phải “kén cá chọn canh”.