Rất nhiều người tìm đến với Java là do yêu cầu của dự án, chẳng hạn cần 1 website viết bằng JSP + Oracle, nghiên cứu uPortal hoặc những sinh viên muốn viết game cho mobile. Họ bắt đầu học Java như thế đấy.

Java đúng là mênh mông thật, rất nhiều, rất nhiều công nghệ, rất nhiều giải pháp, rất nhiều những sản phẩm nguồn mở. Vì lẽ đó, nhiều coder bắt tay vào học Java thường bị choáng ngợp bởi có quá nhiều thứ để học hỏi ở Java. Vậy thì bắt đầu từ đâu nhỉ ?

Vào java.sun.com download bản JDK mới nhất và dùng một text editor để học nó. Dĩ nhiên tôi không dùng Nodepad rồi vì nó quá sơ sài. Với những người thành thạo Linux có lẽ nên dùng Vi là thứ tốt nhất, còn Windows, bản thân tôi dùng TextPad, sau khi cài đặt (JDK và TextPad) hãy mở TextPad ra gõ vào chương trình nổi tiếng và thông dụng nhất System.out “Hello World !”, nhấn crtl-1 để dịch, nhấn ctrl-2 để chạy. Thế là bạn đã bắt đầu học Java. Nên download thêm từ Java.sun.com gói java doc để có được API Specification trong quá trình học và làm việc với Java.

Một kẻ mù mờ như tôi thì điều đầu tiên là phải thành thạo ngữ pháp, do đó, tôi thường kiếm những bài nho nhỏ để viết thử cho đến khi thuần thục cú pháp Java, chẳng hạn các bài toán sắp xếp, tìm kiếm số nguyên, các bài toán quản lý điểm chẳng hạn. Mục đích duy nhất khi viết chúng là để làm quen dần với cú pháp của một chương trình Java.

Tôi không thể tìm hiểu ngay bản chất của Java là gì ? Chẳng hạn, như làm thế nào để Virtual Machine chạy một class, tại sao lại là máy ảo, bản chất của Object, điều tôi quan tâm đầu tiên là làm sao biến mình thành một cái máy gõ code Java. Tôi học như một cái máy gõ chữ vậy.

Học lập trình Java cơ bản đến nâng cao

Sau khi đã thuần thục ngữ pháp Java, tôi bắt đầu đi tìm hiểu sơ đẳng những đặc điểm của một chương trình Java, chẳng hạn class, package là gì, thừa kế, interface đóng vai trò như thế nào, viết như vậy là một chương trình cấu trúc hay một hướng đối tượng. Dĩ nhiên tôi không thể hiểu rành mạch ngay được mà chỉ hiểu một chút ít. Sau khi tìm hiểu sơ sơ những vấn đề đó, tôi bắt tay vào tìm hiểu những thư viện trong Java.

Viết một cửa số bằng AWT, điều này làm tôi sung sướng vì bằng Java tôi có thể nhìn thấy kết quả của mình là một ứng dụng đồ họa nho nhỏ, tôi tìm hiểu về AWT để viết những bài tập bé bé, chẳng hạn một cửa sổ giao diện quản lý, cài đặt các action. Tuy nhiên, không nên mất nhiều thời gian vào AWT, tôi quay sang học java.lang và java.util.

Với java.lang đây là gói bao gồm rất nhiều những lớp cơ bản, String chẳng hạn, dĩ nhiên là phải làm thuần thục với string rồi ( cắt 1 string, thay thế từ, tìm vị trí từ,…) những bài tập rất nhỏ. Tiếp theo đó là StringBuffer, và ở Java 5 có một người anh em của nó là StringBuilder. Tôi hiểu sơ sơ về StringBuffer, nghĩa là chúng làm việc nhanh hơn khi nối string. Trong java.lang còn một lớp nữa là lớp Math, cũng cần tìm hiểu các hàm mà lớp này cung cấp để viết các bài tập nhỏ. Vậy là ok, tôi đã biết một số lớp cơ bản trong java.lang.

Java.util là gói tiếp theo tôi cần tìm hiểu, thử viết một bài toán về Vector, thêm bớt, xóa các thành phần, cái này giống “mảng động” quá. Sau Vector, tôi thử tìm hiểu lớp Date, in ngày tháng hiện tại, giờ giấc xem sao, tôi viết thử một chiếc đồng hồ bằng AWT có sử dụng lớp Calendar và lớp Date. Java.util còn một lớp tôi cần phải học đó là Hashtable, viết một ví dụ cho phép đặt cặp giá trị key – value vào đối tượng của lớp Hashtable. Như vậy là tôi đã xong Java.util.

Bây giờ đến một gói thứ 3, java.io. Lớp đầu tiên cần phải học trong java.io đó là File. Tạo và xóa một file, đo độ dài một file. Tất cả các hàm đều được cung cấp trong File.class và tôi chỉ cần tạo một object rồi System.out giá trị để kiểm nghiệm lại trong Java. Hai lớp tiếp theo tôi cần tìm hiểu trong java.io là FileReader và FileWriter, tôi dùng hai lớp này để đọc và ghi dữ liệu vào một file text đơn giản.

Sau khi làm việc được với java.util, tôi trở lại gói java lang để tìm hiểu một lớp nữa, đó là java thread. Dĩ nhiên tôi không thể viết một ví dụ cỏn con về thread được, thế là google, tôi muốn tìm một ví dụ đơn giản nhất của thread. Tôi gõ vào cụm từ import java.io + public void run() và thế là google trả về cả triệu kết quả cho tôi, trong một mớ hỗn độn, tôi cần tìm ra một ví dụ đơn giản về thread, okies, tôi tìm được rồi, copy và TextPad, ctrl-1 -> ctrl-2 và tôi chạy nó. Từ ví dụ này tôi viết thử các ví dụ khác về thread, và tôi bắt đầu hiểu về thread. Sau khi đã nắm tương đối về thread tôi bắt đầu thử từ khóa synchronized, tôi viết một lớp có 2 thread, trong 2 thread cùng đọc một file và phương thức đọc file có synchronized. Bây giờ tôi quay lại gói java.util để cài thử một ví dụ về ArrayList và tìm hiểu vì sao ArrayList cũng làm việc như Vector nhưng người ta lại cài những 2 lớp này. Tôi viết một ví dụ nhỏ có 2 thread cùng add dữ liệu vào 1 ArrayList và làm tương tự với Vector. Ở 2 ví dụ tôi có đo thời gian chạy, tôi dùng 1 vòng lặp while chạy 1000 lần, rồi 10000. Tôi thử rất nhiều lần như vậy thì đều thấy ArrayList add dữ liệu nhanh hơn. Bây giờ tôi tìm hiểu từ khóa try catch, tôi lại dùng Google để tìm một ví dụ về try catch, sau khi hiểu sơ sơ tôi quay sang cài đặt các ví dụ có throws Exception. Hay quá, nếu có try catch, tôi có thể thông báo những lỗi xảy ra ở chương trình của tôi và chương trình vẫn tiếp tục làm việc, nếu không dùng try catch tôi thấy chương trình gặp lỗi và đơ luôn.

Qua hàng loạt những ví dụ, tôi bắt đầu hiểu sơ sơ về lập trình hướng đối tượng, tôi tìm muốn sách lý thuyết để đọc về chúng, okies tôi đã bắt đầu hiểu java và tiếp tục tìm hiểu những thứ cần thiết cho công việc của tôi.

Java không đơn thuần là một ngôn ngữ, nó là cả một nền tảng lập trình, một cộng đồng hay một văn hóa. Với quan niệm của tôi, ai đó có thể thuần thục cú pháp trong Java nhưng hiểu hết những tư tưởng tồn tại trong Java thì có lẽ cũng phải mất từ 3-6 tháng với một người thông minh và được đào tạo rất bài bản. Khi tìm hiểu Java, người ta thường không tìm hiểu kỹ những thành phần cơ bản của Java mà học vào một framework cụ thể với tư tưởng MVC. Đối với tôi, muốn giỏi lập trình java thì hai gói đầu tiên bạn phải thuần thục là java.lang và java.util. Tôi từng được một thạc sĩ CNTT hỏi trong có Queue và Stack không,…nếu không có thì chị sẽ tự cài lấy một cái, còn nếu có thì chị dùng ngay cho nó tiện. Tôi không coi đó làm điều ngạc nhiên hoặc cũng không dám chê chị dốt hay có những ý nghĩ khác không hay bởi chị rất giỏi nên việc cài đặt những thứ đó với chị quá đơn giản, nhưng điều đó giống như việc phát minh bánh xe và rất lãng phí. Do vậy khi học Java, tôi luôn tâm niệm rằng tôi đang học cả một nền tảng chứ không phải là đang học một ngôn ngữ lập trình.

Java.util là gói tôi thích nhất, bởi từ Java.util, tôi kiểm nghiệm lại những lý thuyết về cấu trúc dữ liệu và giải thuật. Dĩ nhiên framework này không bao giờ đề cập hết được tất cả các thuật toán cũng như cấu trúc dữ liệu, nhưng tôi có thể tìm hiểu những vấn đề cơ bản ở đây rồi từ đó dùng google search thêm những đoạn code khác. Có khá nhiều những thư viện ngoài cài đặt collections framework, Apache, Trove hay FastUtil chẳng hạn. Mục đích của những thư viện này là cải thiện tốc độ của collections framework và không phải là họ không thu được kết quả gì. Điều đặc biệt hơn nữa là rất nhiều trường đại học trên thế giới cung cấp những cài đặt về cấu trúc dữ liệu và giải thuật , cũng có cái hay, cũng có cái dở. Tôi bắt đầu trả lời được một thắc mắc của mình là tại sao Java dùng merge-sort chứ không dùng quick-sort, và tại sao ở những phiên bản đầu java chậm, càng những phiên bản về sau thì càng nhanh hơn.

Gói tôi thích thứ 2 là gói java.util.concurrent , tôi tìm hiểu để thỏa mãn từ khóa synchronized và hiểu được vì sao java từng lạm dụng từ khóa này một cách quá đáng; tìm hiều các vấn đề về pooling. Tôi cố gắng thuần thục java.io với hàng loạt lớp Reader và Writer rồi mở rộng khả năng hiểu biết của bản thân với java.nio. Tôi tìm hiểu về java.net rồi kiếm sách vở về networking đọc thêm, sau đó tự cài đặt các ví dụ, chương trình đầu tiên trong cuộc đời lập trình của tôi là C2 – chat và chơi cờ qua mạng là cách để tôi tìm hiểu về java.net. Cứ như vậy, tôi học java mãi cho đến tận bây giờ.

Theo quan điểm cá nhân tôi, nếu muốn lập trình tốt java bạn cần phải thuần thục những gói sau (bao gồm cả các gói con của nó) là : java.lang (java.math, java.lang.ref java.lang.reflect ), java.util(java.util.concurrent , java.util.logging, java.util.prefs, java.util.regex, java.util.zip ), java.io (java.nio), java.net. Một khi đã vững những vấn đề và thư viện trong đó, bạn có thể học tiếp những framework như jdbc, swing, servlet+jsp, struts, jsf, hibernate,… để phục phụ trực tiếp vào công việc. Khi học java, tốt nhất đừng dùng các IDE như JBuilder, Eclipse hay Netbean, hãy dùng một TextEditor cố gắng gõ code nhiều nhất. Cũng đừng bao giờ cố gắng hiểu cặn kẽ những tư tưởng mà người ta đã cài đặt, hãy code và chạy, lúc đó bạn sẽ chiêm nghiệm được và khi đó, cầm lại cuốn sách đọc là hiểu rành mạch nhất.

Tôi thường vào những cộng đồng trên mạng để cập nhật những vấn đề cũng như tham khảo các bài viết của họ, tôi ít khi vào java.sun.com bởi các bài viết ở đó cũng không có nhiều bài hay. Nhiều người chọn theserverside.com để cập nhật công nghệ cho mình còn tôi, tôi chọn 2 trang chủ chốt là java.net và jroller.com. Trên java.net, tôi bắt gặp rất nhiều vấn đề bao trùm cả 3 lĩnh vực j2se, j2ee và j2me, nhiều nhất vẫn là j2se. Ở đây có những bài viết rất tuyệt từ những người đang trực tiếp phát triển java hàng ngày. Còn jroller.com, một cộng đồng blogger từ nhiều nơi trên thế giới đề cập tất cả các chủ đề, khía cạnh và liên tục cập nhật. Javalobby là một diễn đàn cũng tương đối thú vị, ở đó có những tranh luận tạo nhiều góc cạnh trong cái nhìn tổng thể về một chủ đề, còn article quý báu thì lại nằm rất nhiều trên javaworld.com. Tôi có một thói quen tệ, viết code chúa ghét là chèn những dòng comment rối tung rối mù lên, khi đọc, tôi khoái đọc code hơn là đọc chứ, bởi bản thân chúng gần như toát lên hết những vấn đề đã được đề cập.Ước gì có thể dùng photoshop vẽ ra được phần mềm chứ không cần phải code.