Tôi và hành trình trốn chạy khỏi... Java
Bài đăng này đã không được cập nhật trong 2 năm
Chạy ngay đi, trước khi... máy của bạn nóng bỏng tay (vì chạy Netbeans với Eclipse đấy)
Một nỗi ám ảnh luôn đeo bám lấy chàng trai làm IT nghèo khó cho đến tận bây giờ - build Java app.
First things first
Vâng, lại là Minh Monmen trong một câu chuyện về hành trình gian nan trốn chạy khỏi Cựu ngôn ngữ phổ biến nhất thế giới - JAVA.
Nghe thì ngược đời nhỉ, cảm giác giống như tôi đang cố trốn chạy khỏi tiếng Anh dù rằng nó là ngôn ngữ quốc tế và là nấc thang lên thiên đường của mọi developer hướng ngoại (hướng ra nước ngoài) vậy. Thế nhưng sở thích của con người thì vốn kỳ lạ, và sở ghét thì lại càng kỳ lạ hơn. Ngay từ khi mới tiếp xúc, tôi đã có một cảm giác rất không hạp gu đối với Java rồi. Điều này được tích lũy dần trong quá trình học và tới cả khi đi làm, tôi đều luôn muốn tránh né những gì liên quan tới Java.
Thế nhưng cuộc đời thì lại lắm trớ trêu mà tình yêu thì cũng như con chó vậy, mình càng chạy thì nó lại càng đuổi theo mới tức chứ. Tôi càng cố né Java thì nó lại càng xuất hiện trong công việc của tôi nhiều hơn. Các bạn hãy cùng xem nhé.
Từ những ngày làm quen đầu tiên
Năm 2015...
Tôi, một chàng cử nhân mới toanh của đại học kinh tế hàng đầu Việt Nam - NEU, bước chân vào Aptech với hành trang là chiếc máy tính xách tay mới mua 18 củ với cấu hình:
- Intel Core i5 4200H (chip H hẳn hoi nhé)
- 4GB RAM (hồi 2015 thế là kinh zồi)
- 1TB ổ cứng đầy phim một tám à lộn một không tám không pê (1080p)
Sau khi học hết được kỳ đầu HTML, tôi đã đi làm intern PHP vì không thể mài mông trên ghế nhà trường thêm 3 học kỳ nữa mà không đi làm gì đó có ích cho đời. Và trong khi vừa đi làm vừa đi học thì Java va vào đời tôi như một hòn đá tảng. Bắt đầu từ Basic Java cho tới Advanced Java, từ Java console cho tới Java Web, rồi cả Java GUI cho app, tất cả chương trình học lúc ấy bủa vây tôi bằng Java với mục tiêu cho ra lò những ứng cử viên Java sáng giá cho những tập đoàn công nghệ hàng đầu (vì họ toàn xài Java).
Lúc ấy tôi cũng khá hào hứng vì nào là ngôn ngữ tường minh này, IDE thì gợi ý xịn xò này, học 1 mà biết làm 10 này (cả web cả app cả console luôn). Thế nhưng sự hào hứng với ngôn ngữ này của tôi chỉ tồn tại được vài tháng cho tới khi...
100% CPU
Em máy của tôi bắt đầu kêu vì tiếng quạt chạy vù vù trong một vài lần chạy app. Trước đó thì tôi vẫn tự hào vì máy của mình mua cũng thuộc dạng cấu hình cao rồi ấy, thế mà IDE với Java nó ăn hết. Ứng dụng của tôi bắt đầu chạy chậm dần mỗi khi phải build hay chạy debug và một thằng web developer như tôi lúc ấy bắt đầu hiểu tại sao ở công ty những anh làm app mobile (mà cụ thể là android) thường xuyên có thời gian ngồi đọc truyện tranh =)))
Không ổn không ổn, tôi thường là người rất vội vàng và không thể đủ kiên nhẫn ngồi chờ em máy mới tinh vừa kêu vù vù vừa đọc truyện tranh được. Và tất nhiên là tôi âm thầm gạch Java khỏi những ngôn ngữ đi làm của mình.
Cho tới những ngày lướt qua nhau
Tôi gặp lại Java trong một buổi chiều đầy nắng và gió, khi được tới tham quan một công ty cũng làm trong lĩnh vực tài chính - ngân hàng. Cụ thể là công ty ấy chuyên gia công các phần mềm cho ngân hàng sử dụng. Tất nhiên là tôi thì không được ngồi vào xem code của các anh rồi, thế nhưng theo sự tìm hiểu của tôi và những lời chia sẻ từ anh CTO thì lần đầu tiên tôi có một cái nhìn khá cụ thể về việc các ngân hàng đang sử dụng phần mềm thần thánh của họ như nào.
Ấn tượng đầu tiên là đóng. Code đóng, quy trình đóng, con người đóng,... mọi thứ đều đóng. Tất nhiên nó là đặc thù của công việc thôi. Nhưng cái sự đóng ấy nó toát lên không chỉ từ source code bị đóng hoàn toàn đâu mà nó còn từ phong cách ăn mặc cực kỳ formal, tư duy làm sản phẩm không hướng nhiều tới sự thay đổi và những con người vẫn mãi chỉ làm một thứ lặp đi lặp lại cho tới lúc già.
Well, ấn tượng của tôi về các anh làm Java lúc đó là những người thợ lành nghề ngại bước ra khỏi vòng an toàn của chính bản thân, sống một cuộc sống bảo mật khép kín và chẳng giao lưu được gì với thế giới bên ngoài.
Không ổn không ổn, tôi là một người rất thích chia sẻ, thích học hỏi cái mới và nhanh chóng chán những việc cứ thường xuyên lặp đi lặp lại. Ngoài ra thì tôi cũng không thích ăn mặc formal nữa. Nên sau đó tôi cũng thầm hứa với bản thân: Thôi thì tránh hết những công ty có tư duy quá đóng như ngân hàng. Và vô hình chung là ngân hàng thì gắn với Java nên cũng tránh luôn cả Java.
Thật ra bây giờ ngân hàng chuyển đổi số nhìn xịn lắm bạn ơi, còn kia chỉ là suy nghĩ của tôi vào thời điểm 2017-2018 là trước khi làn sóng chuyển đổi số diễn ra. Lúc ấy công nghệ của các ngân hàng hầu như là đóng và việc đầu tư của họ vào đội công nghệ không được mạnh như bây giờ. Nếu bây giờ ai có suy nghĩ giống tôi thì nên suy nghĩ lại nhé =))))
Và rồi ngày tái ngộ
Đến năm 2019, tôi tái ngộ với Java thêm nhiều lần nữa. Mặc dù đã rất cố tránh né từ những ngày đi làm đầu tiên như phải tự xây dựng hệ thống data analytic dựa trên node, php chứ quyết không đụng tới các phần mềm java, tuy nhiên đến lúc này thì không thể tránh được nữa rồi.
Lúc này tôi cũng phát hiện ra: Tất cả đồ nghề dành cho Big Data phần lớn đều code bằng Java hoặc dẫn xuất từ Java. Đó quả là một cú vả cực mạnh vào thanh niên có định kiến với ngôn ngữ đóng khi hầu hết những đồ nghề ấy lại là mã nguồn mở =)))
Ôi bạn ơi, bước chân vào thế giới Big Data rồi mà không biết Java nó cũng giống như đến Việt Nam mà lại không ăn phở ấy. Lúc tôi được tiếp cận với S.M.A.C.K stack mặc dù đã rất cố gắng xem có thể dùng ngôn ngữ khác để code thay cho Java như Scala hay python không nhưng cuối cùng vẫn phải từ bỏ. Dù có nhiều sản phẩm support nhiều ngôn ngữ nhưng cuối cùng thì Java vẫn gần như là native. Cùng một công viết Java có thể chạy được với mọi sản phẩm trong khi Scala hay Python thì bị dính nhiều hạn chế. (tôi còn chưa thèm nói tới NodeJS hay PHP đấy).
S.M.A.C.K stack là stack bao gồm Spark, Mesos, Akka, Cassandra, Kafka chuyên dùng để xây dựng các hệ thống xử lý dữ liệu lớn. Stack này là các công cụ về framework, orchestrator, streaming platform và cả database luôn.
Kể cả giờ né được phần code thì tôi còn làm cả DevOps. Tức là còn là người cài cắm và cấu hình những công cụ ấy nữa. Nên xung quanh tôi lúc nào cũng application properties rồi JVM configuration. Đúng là chạy đâu cũng không khỏi nắng.
Năm 2020 là khi tôi bước chân vào một tập đoàn lớn, đa quốc gia và... toàn là Java. Ahihi bất ngờ chưa. Tôi là 1 trong 4 người có làm Python trong đội backend Java vài chục người và có lẽ là người duy nhất được làm Golang cho dự án.
Mặc dù làm Golang nhưng tôi cũng không thể tránh khỏi số kiếp dùng những sản phẩm Java khi mà phải làm việc với Kafka và Apache Camel. Và chuỗi ngày đau đầu vì config Java vẫn tiếp diễn...
Apache Camel là một framework phục vụ quá trình tích hợp các hệ thống được tôi dùng với Kafka phục vụ quá trình backup, restore Kafka partition vào AWS S3. Nó có đặc điểm là Just work, tức là hoạt động luôn chả cần code thêm gì cả, nhưng mà cực kỳ nhọc công trong việc cấu hình để nó work.
Hầy, cuộc sống quả là trớ trêu với tôi mà. Một anh trong công ty cũng bảo tôi: "Ở công ty mình thì toàn Java nên anh em làm Java có nhiều đất diễn, được cầm nhiều dự án lớn lắm. Còn anh em mình thì chỉ là thiểu số thôi...".
Lúc ấy, tôi cũng không biết nên vui hay buồn vì mình không theo Java nữa. Vui vì mình là người tiên phong còn buồn vì mình lại là người đơn độc. Thế nhưng trong tôi cũng đã ngầm chấp nhận rằng: Có lẽ trong suốt quãng đời làm dev của mình thì vẫn sẽ phảng phất hình bóng của Java
Tôi thích Docker, nhưng Java thì... không
Những tưởng cuộc tình của tôi với Java sẽ êm đềm khi tôi chấp nhận Java như một phần không thể thiếu trong cuộc sống rồi. Thế nhưng không, chỉ cần sống chung vài ngày thôi tôi đã bàng hoàng nhận ra một sự thật: Java không thích Docker như tôi.
Đây quả là một sự khác biệt khó có thể dung hòa. Tôi thích Docker, tôi thích container và những ứng dụng trên cloud với footprint nhỏ nhắn xinh xinh như của Golang chẳng hạn. Nhưng Java thì khác, Java yêu thích Bare Metal và VM (Virtual Machine) hơn, được tối ưu cho VM nhiều hơn. Những ứng dụng Java (cũ) cũng đi kèm một môi trường máy ảo nặng nề để có thể chạy được.
Tôi vẫn nhớ khi 1 anh làm cho tập đoàn viễn thông khá lớn nói với mình rằng: "Bộ phận của anh đang chuyển đổi số, rất thích lên Kubernetes và container mà Docker image build ra toàn nặng 10 với 20GB, rồi cũng chỉ chạy được single instance. JVM thì toàn config để dùng 16 với 32GB RAM. Dùng kubernetes mà mỗi container chẳng khác nào những chiếc máy ảo VPS siêu to khổng lồ. Vậy thì phải làm thế nào hở em?"
Tất nhiên là tôi không còn cách nào khác ngoài giới thiệu cho anh một người yêu khác phù hợp với Java hơn chính là dùng Openstack để provision VM lên thôi chứ Container làm gì nữa.
Một lời khuyên cho các bạn: Với legacy app bằng Java và vẫn đang rất ổn trên VM thì đừng cố gắng chia cắt tình yêu của chúng nó để bắt Java chạy theo container làm gì. Cuộc tình dù đúng dù sai thì người đau khổ vẫn là các bạn (những người vận hành) mà thôi.
Tất nhiên là hiện tại Java đã biến hóa rất nhiều để phù hợp hơn với kiến trúc container hiện đại, thậm chí nhiều ứng dụng Java còn bỏ hẳn JVM để chạy trên các môi trường runtime khác nhẹ nhàng hơn. Tuy nhiên Build lâu và Image nặng vẫn là điểm yếu của tụi Java khi đóng gói bằng Docker image mà các bạn sẽ phải lưu tâm.
Cuối cùng là hẹn gặp lại
Java là một ngôn ngữ cổ xưa và chắc chắn là nó không tạo ấn tượng kiểu yêu từ cái nhìn đầu tiên như golang, python hay nodejs rồi. Vì nó cổ xưa nên nó vừa có một quá khứ huy hoàng, vừa gánh trong mình nhiều định kiến về mindset closed. Thế nhưng không thể phủ nhận cuộc sống của dev mà không có Java thì là một tổn thất không tài nào sánh nổi.
Thử xem nếu không có Studio 3T tôi dùng để access mongodb hàng ngày thì sẽ thế nào? Không có Apache Kafka thì thế hệ Micro-service hiện đại sẽ thế nào? Không có Cassandra, Spark hay vô vàn đồ nghề kinh khủng khác của giới enterprise thì Big Data sẽ thế nào?
Vậy nên từ một người có định kiến với Java thì tôi cũng khuyên các bạn đừng làm theo tôi làm gì. Khổ lắm mà chẳng tránh được Java đâu. Hãy trang bị cho mình chí ít là kiến thức về việc Java chạy như thế nào, cấu hình ra sao, JVM là gì,...
Lần gần nhất mà tôi né được 1 sản phẩm Java là xây dựng hệ thống calling. Thay vì xài jitsi (được build bằng java) thì tôi chuyển qua xài 1 sản phẩm opensource khác bằng Golang. Tôi phải đánh đổi khá nhiều khi sản phẩm kia mới đang ở giai đoạn thử nghiệm chứ không stable như jitsi. Tuy nhiên tương lai của sản phẩm kia là rất hứa hẹn và tôi chấp nhận rủi ro hiện tại vì nó.
Java của thế kỷ mới cũng có 1 trò rất hứa hẹn là Reactive Programming khi là nền tảng cho những ứng dụng non-blocking với khả năng đáp ứng tốt hơn và scale tốt hơn rất nhiều so với các ứng dụng blocking truyền thống. Đây là một bước chuyển mình rất đáng gờm của một ngôn ngữ được gọi là cổ xưa đó.
Thôi viết cũng dài rồi bai các bạn và hẹn gặp lại lần sau nha.
P/s: Tôi thì vẫn tiếp tục ghét Java vì quá trình build vừa lâu mà cho ra app lại còn nặng. Nhất là khi phải làm việc với docker thì app Java toàn có dung lượng lớn xong rồi start thì chậm như rùa thôi. Vẫn là không hợp với một người có thân hình gọn nhẹ như tôi.
All rights reserved