9 sai lầm bạn nên tránh khi lập trình Java chuyên nghiệp

09 tháng 04, 2021 - 8098 lượt xem

Trước khi viết nội dung chính tôi xin giới thiệu một chút, tôi lập trình Java từ năm 1995, hình như lúc đó là phiên bản 1.0. Không thường xuyên liên tục, mà cứ có dự án, có tiền mới làm. Khoảng 2 năm gần đây chuyển sang dạy lập trình Java coi như là nghề kiếm cơm, trước đó tôi dạy IOS, Node.js, Golang, Python, Flutter. Nhờ va chạm, tiếp xúc với đủ loại ngôn ngữ, lập trình, framework, pattern này kia, thế nên tôi có cái nhìn độc lập, thực dụng, không thiên vị hay không thần thánh bất kỳ công nghệ gì cả. Cái gì ra tiền, có nhiều cơ hội thì làm.

Tại sao giờ sinh viên nào cũng đi học Java vậy ta?

Khoảng 3 năm trở lại đây, nhu cầu chuyển đổi số mạnh lên. Doanh nghiệp lớn, ngân hàng, chứng khoán, các tổng công ty lo sợ mô hình kinh doanh truyền thống bị lỗi thời và sớm bị đào thải. Như trường hợp hợp Mai Linh, Vina Sun bị Uber, rồi Grab dành mất thị phần. Do đó họ tổ chức lại hệ thống CNTT, lấy CNTT là xương sống để kết nối các hoạt động của doanh nghiệp.

Ngân hàng từ trước đến giờ ưa dùng Oracle và Java. Thế nên khi họ chuyển đổi số nhu cầu tuyển dụng cao. Họ phải tăng lương để tuyển lập trình viên Java giỏi. Khiến cho các công ty đang có team Java tự nhiên bị mất người. Để bù vào 1 lập trình viên cứng Java kinh nghiệm 2 năm, phải tuyển thêm cỡ 5 lập trình viên Java trẻ (rơi rụng bớt sau 2 năm là vừa đẹp, còn tính cả nhu cầu tuyển dụng tăng nữa chứ).
Các tập đoàn lớn như Viettel, VinGroup, FSoft, CMC Global hay các công ty gia công cũng thích Java hơn Golang vì dễ tuyển dụng hơn (mặc dù cho cùng một tác vụ, Golang sẽ tốn ít bộ nhớ hơn, thời gian khởi động ngắn hơn, không phải cài JDK, hẹn một bài sau tôi sẽ chia sẻ khác biêt Java và Golang nhé).

Nếu cho một team lead, tech lead thành thạo nhiều ngôn ngữ lập trình nào, dựng một team dựng back end của một hệ thống tương đối lớn, nghiệp vụ phức tạp. Sau một hồi loay hoay, đo đếm, khả năng cao anh ta sẽ chọn Java chứ không phải là Ruby On Rails (cực khó tuyển dev), Node.js (dễ tuyển nhưng ngôn ngữ JavaScript rất lỏng lẻo, số và chuỗi cứ nhập nhằng), C# (chỉ có duy nhất lựa chọn ASP.net Core), Golang (nhanh, hiện đại, nhưng sinh viên ta ngại học cái này), Python (làm AI thì tốt, nhưng làm back end quá chậm), PHP (làm blog, quản lý content để đọc, SEO thì tốt, cứ làm hệ thống lớn thì rất chi là rối).

Vậy những sai lầm cần tránh khi học Java là gì?

1. Học Java để lập trình Android

Đây không hẳn là sai lầm, nhưng tạm gọi là thiếu cập nhật tình hình. Android ra đời với Java là ngôn ngữ lập trình chính. Nhưng vài năm trước, do xung đột bản quyền Java với Oracle, nên Google quyết định nghỉ chơi với Java chuyển sang khuyến khích dùng Kotlin. Kotlin có nhiều cải tiến cú pháp từ Java như khai báo class, property gọn hơn, hỗ trợ co-routine, xử lý thực thi song song nhẹ hơn thread. Tóm lại nếu thích lập trình Android, bạn nên dùng Kotlin chứ không phải Java.

2. Dùng Java để lập trình giao diện Desktop

Có mấy nguyên nhân bạn nên hạn chế phát triển ứng dụng Desktop bởi ứng dụng Web hiện nay đã đủ mạnh, và tinh tế để xử lý tốt thao tác giao diện như ứng dụng Desktop. Chưa kể ứng dụng Web được cập nhật mỗi lần mở trình duyệt. Còn ứng dụng Desktop phải cài đặt lại để nâng cấp. Các thư viện lập trình giao diện Desktop bằng Java (Swing, FX) chưa bao giờ chiếm nhiều thị phần: nó chậm chạp, và không phù hợp với những phần cứng ít ram. Học lập trình giao diên Desktop bằng Java xong, khó chuyển sang lập trình Web nơi HTML, CSS, JavaScript thống trị, mà cũng khó chuyển sang Android. Nếu làm đồ án môn học ở trường dùng JavaFX tạo form nhìn cho bắt mắt thì ok.

3. Java cũng không thể lập trình giao diện Web nhưng sức mạnh của nó nằm ở chỗ khác

Điểm 1 tôi nói rằng không nên code Android bằng Java. Điểm 2 không nên code Desktop app bằng Java. Điểm 3 nói tiếp không thể lập trình giao diện Web bằng Java, chắc đến đây nhiều bạn muốn bóp cổ tôi. Cứ từ từ các bạn ạ. Mọi người còn không lập trình AI bằng Java nữa cơ ! Do đó nếu bạn có ước mở trở thành AI developer hãy chuyển qua học Python càng sớm càng tốt.
Những trang web đẹp long lanh bạn thấy được code bằng HTML, CSS, JavaScript đó. Mà JavaScript chả anh em họ hàng gì với Java cả. Donald Trump là Donald Trump chứ không là Đỗ Nam Trung!

Sức mạnh của Java nằm ở:

  1. Trong sáng, dễ học. Cú pháp rất gần với tiếng Anh, ít những ký tự phức tạp thường thấy trong C++ (*, **, ~ ^ &, ->, ::), RUST hay Scala (: :: ::: ^). Python và Java được coi là 2 ngôn ngữ lập trình rất phù hợp với sinh viên đại học.
  2. Hỗ trợ đầy đủ lập trình hướng đối tượng, generic, lambda expression. Tất cả những Design Pattern nổi tiếng đều xuất phát từ Java và được minh hoạ đầu tiên bằng Java.
  3. Hỗ trợ reflection và quản lý thu dọn bộ nhớ (C, C++ không có tính năng này).
  4. Có rất nhiều thư viện chất lượng phục vụ cho nhiều mục đích khác nhau.
  5. Có một thời gian rất dài được dùng để lập trình web back end cho doanh nghiệp. Và giờ số lượng doanh nghiệp tầm trung và lớn vẫn ưu ái chọn Java để xây dựng ứng dụng logic nghiệp vụ bởi qua thời gian, Java chứng minh sự bền bỉ, ổn định của nó.
  6. Ngôn ngữ Java liên tục được nâng cấp, phát triển. Tốc độ rất nhanh, không có chút dấu hiệu gì chậm lại, hay mất phương hướng. 

Vậy bạn nên bắt đầu học Java Core và sau đó lập trình Java Back End (Spring Boot hay Quarkus...).

4. Dậm chân tại chỗ với Java Core quá lâu

Nhiều trường đại học dạy lập trình Java và thường kết thúc môn học ở phần lập trình hướng đối tượng Class, Interface.... Nhiều bạn cứ loay hoay mãi với những khái niệm OOP, hoặc là cố hiểu thật sâu, bản chất, cú pháp hoặc là coi nó rất kỳ bí. Thực tế là Golang không có khái niệm hướng đối tượng. Phần lớn các ứng dụng Deep Learning Python chỉ cần method, mà không khai báo class. Tốt hơn bạn hãy dùng Java code những ứng dụng hữu ích như tính chỉ số BMI, tính lãi suất ngân hàng, hoặc giải bài tập LeetCode, Hackerank, CodeLearn.io...

Bước tiếp theo có thể tìm hiểu về Thread, Process, cơ chế thực thi multi tasking. Học lập trình phần này mà không có ứng dụng thực tế cũng sẽ quên và vẫn thấy khó hiểu. Vậy sớm chuyển qua lập trình Web đi.

Khi lập trình ứng dụng thực tế, bạn thường xuyên phải dùng các cấu trúc dữ liệu, thread, thread safe... ở Java Core linh hoạt hơn rất nhiều cách bạn làm những bài tập Java Core để nhớ lý thuyết máy móc. Do đó đừng dành hẳn 1 năm để làm chủ Java Core rồi mới học thứ khác. Bạn chỉ cần độ 3-4 tháng lập trình Java Core là tạm đủ.

5. Chọn web framework cũ hay quá lạ để học

Java có cực nhiều web framework. Việc chọn web framework nào để bắt đầu cần tính đến nhu cầu tuyển dụng, số lượng tài liệu, sách, video có sẵn sàng không. Rõ ràng là đừng nên học:

  • J2EE: đã quá cũ
  • Struts: cũng quá cũ để học.
  • Play: nổi lên một thời nhưng vẫn không có nhiều ví dụ và hướng dẫn. Team tôi đã dùng framework này, mất khá nhiều thời gian học mà kết quả đầu ra rất chậm chạp.
  • Vaadim : khá cool, lập trình cả giao diện web lẫn back end, nhưng không hiểu sao ở VN chả mấy công ty dùng. Framework có tính áp đặt công nghệ cao nên khó tuỳ biến. Một team ở Viettel đã thử nghiệm dùng Vaadim từ 2016-2018, sau này họ chọn Spring Boot.

Tại thời điểm này Spring Boot là phổ biến ở VN cũng như trên thế giới nên bạn có thể yên tâm chọn Spring Boot để học sau khi đã lập trình Java Core.

Tham khảo khoá Lộ trình Java Spring Boot Full Stack 7 tháng tại Techmaster

6. Lập trình Spring Boot không còn tập trung Server Side Render nữa

Như nói ở mục số 3. Java không dùng để lập trình Web Front End. Nhưng lập trình Web Back End thì rất hợp lý. Hiện nay thường là sinh viên sẽ bắt đầu lập trình với Thymeleaf để tạo trang web trả về trình duyệt vì dễ và trực quan. Thực tế là các doanh nghiệp chuyển đổi sang công nghệ React, Angular ở front end kết nối vào REST API ở back end ngày càng nhiều. Do đó nên dành nhiều thời gian để lâp trình REST, JWT, OAuth2, JPA...

7. Dừng lại ở kiến trúc Monolithics quá lâu, khó cạnh tranh khi đi xin việc

Các job lương cao hiện nay về Java thường yêu cầu lập trình viên có kinh nghiệm lập trình, tham gia team phát triển kiến trúc microservice. Tại sao?

Nếu lập trình Java mà chỉ dừng ở kiến trúc monolithics thì việc tạo ra REST API, hay lâp trình React, Angular cũng không có nhiều ý nghĩa thực tiến. Ứng dụng khó bảo trì và khó đáp ứng được số lượng truy cập lớn. Lương trả cho lập trình viên Java cao. Trong khi nhiều ứng dụng open source như WordPress, Joomla, Magento làm rất tốt với web site quy mô trung bình rồi.  Rõ ràng chả doanh nghiệp nào lại dùng Java cho một ứng dụng quy mô nhỏ cả. Vậy hãy từng bước chuyển sang kiến trúc microservice hay chí ít có thể scale out, load balancing...

Nên bắt đầu bằng học Docker - Docker Swarm để có thể thử nghiệm nhiều loại server: MongoDB, Postgresql, Redis, Kafka, Elastic Search Tiến tới hãy thử nghiệm các pattern hay ho như:

  • API Gateway
  • Single Signed On
  • Load Balancing
  • Service Discovery
  • SAGA
  • Domain Driven Design (cũng cần nhiều thời gian để hiểu, áp dụng hợp lý, code cũng phức tạp lên nhiều)
  • CQRS.. (khá khó áp dụng)

8. Sử dụng Spring Boot cho mọi dự án !

Spring Boot là một framework rất phổ biến, dễ học, dễ dùng, có thể làm nhi. Khi dự án đã chia tách thành nhiều microservice, yêu cầu tạo ra những microservice đóng gói trong Docker gọn nhẹ, khởi động nhanh, tiết kiệm bộ nhớ. Lúc này Spring Boot không còn là lựa chọn duy nhất. Bạn có thể cân nhắc sử dụng Quarkus + Graalvm để tối ưu tài nguyên sử dụng và hiệu năng. Theo bài viết này Quarkus Vs Spring Boot: A Real-world Performance Comparison, khi chuyển từ Spring Boot sang Quarkus:

  • Bộ nhớ heap giảm trung bình 55Mb
  • Trong 24 giờ, số lần dọn dẹp bộ nhớ (Garbage Collection) giảm từ 131 xuống còn  39 lần, tổng thời gian thực thi việc dọn dẹp (GC) cũng nhanh hơn nhiều
  • Spring Boot cứ 10 phút phải dọn dẹp bộ nhớ một lần, còn Quarkus 30 phút mới phải dọn một lần. Có thể hiểu Quarkus tạo ra ít rác trong vùng nhớ hơn.
  • Quarkus nạp ít hơn 2119 class và dùng ít hơn trung bình 6 thread so với Spring Boot.
  • Từ lúc khởi động động cho đến lúc có thể phục vụ request đầu tiên, Quarkus cũng nhanh hơn Spring Boot đến 6 giây.
  • Số lượng request phục vụ trong 1 giây cao hơn và độ trễ (latency) ở Quarkus cũng tốt hơn Spring Boot.

Nếu bạn phải tạo ra 30 REST microservice node thì việc chuyển từ Spring Boot sang Quarkus + Graalvm sẽ tiết kiệm tài nguyên, và cải tiến hiệu năng hơn nhiều so với Spring Boot. Vậy đừng thần tượng Spring Boot quá các bạn ạ.

9. Bạn ở lại quá lâu với JDK 11

JDK 11 rất ổn định, phổ biến. Nếu bạn xây dựng một dự án monolithics hơn 100,000 dòng code. Thì việc nâng cấp JDK có thể gây ra vài lỗi không tương thích, khiến nhiều team Java chùn tay. Nếu dự án chia nhỏ ra nhiều dịch vụ nhỏ, có thể kiểm thử dễ dàng từng dịch vụ nhỏ. Không có gì ngăn cản các bạn thử nghiệm tính năng mới của JDK bản mới nhất. Code sẽ viết gọn hơn, nhiều lỗ hổng bảo mật được vá. Đặc biệt gần đây có Graalvm cho phép biên dịch ứng dụng Java ra native app chứ không còn là pseudo binary code phải cần JVM để chạy như trước kia. Tốc độ, hiệu năng tăng lên đáng kể.

Bình luận

avatar
Dsoft Vietnam 2021-06-25 15:57:17.23315 +0000 UTC

Chào Cường thân mến!

quá lâu không gặp lại bạn hiền!

 

vẫn còn nhớ Cường ở Mai Hắc Đế.. 79, 97 chi đó.. cũng có vài lần tìm lại nhưng không gặp được.

 

nay tình cờ có duyên mà hơn 20 năm sau lại tình cờ đọc bài viết này mà lại nhận ra Cường.. vẫn khuôn mặt đó!

Hy vọng bạn còn nhớ ra Thân Hải Dương- Bách khoa 37 (cùng lớp tiếng Nhật)??!

 

Liên lạc lại nhé :

thanhaiduong@yahoo.com 

vietnam.dsoft@gmail.com 

 

 

Avatar
avatar
Trịnh Minh Cường 2021-06-27 11:13:10.379573 +0000 UTC

Hi Dương,

Thật tuyệt khi gặp lại bạn. Vẫn sử dụng tiếng Nhật đấy chứ?
 

Avatar
avatar
anh tuan 2022-10-18 03:28:13.826697 +0000 UTC

Một bài viết xuất sắc, đọc comment mơi biết người viết là dân dạo cội trong ngành.

Avatar
avatar
Nam Can 2023-02-04 15:44:59.971652 +0000 UTC

Cháu chào bác ạ, hiện tại cháu đang là sinh viên ngành cntt, cháu đã được học qua cơ bản cả 2 ngôn ngữ java và javascript. Hiện tại cháu đang phân vân giữa học Javaspringboot và Nodejs. Mong bác có thể tư vấn cho cháu về hướng đi và cơ hội việc làm của Javaspringboot và Nodejs được không ạ. Cháu cảm ơn ạ

Avatar
* Vui lòng trước khi bình luận.
Ảnh đại diện
  +7 Thích
+7