Think Java: Cách suy nghĩ như nhà khoa học máy tính

thinkjava

Phiên bản 5.1.2

Xem thêm ở Facebook.

Think Java là cuốn sách giới thiệu về lập trình Java cho người mới học. Nó được soạn riêng cho học viên chuẩn bị thi Computer Science Advanced Placement (AP) Exam, nhưng cũng dành cho bất kì ai muốn học Java.

  • Think Java rất ngắn gọn. Sách chỉ dùng một bộ phận nhỏ của ngôn ngữ Java đủ để giúp học viên thực hiện những bài tập lớn mà không bị sa đà vào những tiểu tiết của ngôn ngữ lập trình.
  • Think Java dạy cách phát triển và gỡ lỗi chương trình; những chủ đề này được thảo luận trong suốt cuốn sách và được tóm tắt trong hai phụ lục.
  • Think Java bao gồm cả nghiên cứu cụ thể GridWorld vốn là một phần của đề thi AP. Cuốn sách này cung cấp kiến thức cơ sở cần để làm quen với GridWorld, cùng với những bài tập phụ thêm để thực hành.
  • Think Java được viết theo cuốn sách gốc How to Think Like a Computer Scientist, một cuốn sách trực tuyến quen thuộc với những phiên bản cho lập trình Python, C++ và OCaml, cùng với những bản dịch sang tiếng Tây Ban Nha, tiếng Pháp và những thứ tiếng khác.

Think Java là sách giáo trình tự do được phát hành theo giấy phép  Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.  Bạn đọc có thể tùy ý sao chép và phân phối nội dung trong sách; đồng thời cũng tùy ý sửa đổi để phù hợp với yêu cầu cụ thể, và để phát triển nội dung giảng dạy mới.

Mục lục

Chương 1: Lối đi của chương trình máy tính
Chương 2: Biến, biểu thức và câu lệnh
Chương 3: Phương thức rống
Chương 4: Câu lệnh điều kiện và đệ quy
Chương 5: GridWorld: Phần 1
Chương 6: Phương thức trả giá trị
Chương 7: Lặp
Chương 8: Chuỗi kí tự
Chương 9: Đối tượng có thể biến đổi
Chương 10: GridWorld: Phần 2
Chương 11: Tự tạo nên những đối tượng riêng
Chương 12: Mảng
Chương 13: Mảng các đối tượng
Chương 14: Đối tượng chứa các mảng
Chương 15: Lập trình hướng đối tượng
Chương 16: Grid World: Phần 3
Phụ lục A: Đồ họa
Phụ lục B: Nhập và xuất dữ liệu ở Java
Phụ lục C: Phát triển chương trình
Phụ lục D: Gỡ lỗi
 

Chương 0. Lời nói đầu

“Khi được hưởng những Thành quả lớn từ Phát minh của người khác, ta nên vui vẻ đó nhận Cơ hội để giúp đỡ người khác bằng Phát minh của ta, và việc này nên làm một cách tự ý và hào phóng.”
—Benjamin Franklin, trích từ cuốn Benjamin Franklin của tác giả Edmund S. Morgan.

Lý do mà tôi viết cuốn sách này

Đây là ấn bản thứ năm của cuốn sách mà tôi đã bắt đầu viết từ năm 1999, khi còn dạy ở trường Colby College. Tôi dẫ dạy một lớp học nhập môn khoa học máy tính bằng ngôn ngữ Java, nhưng chưa tìm được một cuốn giáo trình vừa ý. Một trong những lý do là, chúng quá dày! Không có cách nào mà sinh viên có thể đọc hết cuốn sách dày cỡ 800 trang, đầy những kiến thức kĩ thuật, kể cả tôi có yêu cầu họ thực hiện. Mà tôi chẳng muốn thế. Phần lớn những gì viết trong sách đều quá cụ thể—những chi tiết về Java cùng các thư viện của nó mà sẽ lạc hậu ngay khi học kì kết thúc, đồng thời những thứ đó sẽ làm lu mờ những kiến thức mà tôi thực sự muốn sinh viên học.

Một vấn đề khác mà tôi thấy, đó là phần giới thiệu lập trình hướng đối tượng là quá đột ngột. Nhiều sinh viên đáng ra đã học suôn sẻ rồi nhưng khi bắt đầu vào phần “đối tượng” là bị vấp, bất kể phần này được đưa vào đâu trong giáo trình.

Vì vậy tôi bắt tay vào viết. Mỗi ngày tôi viết một chương, liên tục trong 13 ngày đầu. Rồi ngày thứ 14 tôi biên tập lại. Sau đó tôi đi phô-tô và đóng bìa. Buổi học đầu tiên khi phân phát giáo trình, tôi dặn sinh viên mỗi tuần phải đọc một chương. Nói cách khác, họ cần đọc chậm hơn 7 lần so với tốc độ viết của tôi.

Triết lý ẩn sau cuốn sách

Sau đây là một số ý tưởng định hình cho cuốn sách:

  • Thuật ngữ là quan trọng. Sinh viên cần phải trao đổi được về chương trình máy tính và hiểu được điều tôi giảng. Tôi cố gắng giới thiệu một số tối thiểu các thuật ngữ, để định nghĩa được rõ ràng khi dùng lần đầu, và để tổ chức lại thành mục “Thuật ngữ” cuối từng chương. Trên lớp, tôi có đưa những câu hỏi liên quan đến thuật ngữ vào đề kiểm tra, đề thi, và yêu cầu sinh viên phải dùng thuật ngữ thích hợp để viết vào đáp án.
  • Để viết một chương trình, sinh viên cần phải hiểu được thuật toán, biết ngôn ngữ lập trình, và có khả năng gỡ lỗi. Tôi nghĩ rằng quá nhiểu quyển sách bỏ qua khâu gỡ lỗi. Cuốn sách này có một phụ lục viết về gỡ lỗi và một phụ lục về phát triển chương trình (giúp tránh được gỡ lỗi). Tôi khuyến khích sinh viên sớm đọc ngay những phần này và thường xuyên tham khảo đến chúng.
  • Một số khái niệm phải mất thời gian mới lắng đọng lại được. Một số chỗ khó trong sách, như đệ quy, sẽ xuất hiện vài lần. Bằng cách nêu lại những điểm này, tôi cố gắng tạo cho sinh viên cơ hội để ôn lại và củng cố, hoặc nếu lần đầu họ không nắm được, thì đó là cơ hội để theo kịp.
  • Tôi cố gắng dùng càng ít Java càng tốt để đạt được công hiệu lập trình tối đa. Mục đích của cuốn sách này là dạy lập trình và một số ý tưởng cơ bản về khoa học máy tính, chứ không phải dạy Java. Tôi bỏ qua một số đặc điểm của ngôn ngữ này, như lệnh switch, vốn không cần thiết, và tránh hầu hết các thư viện chương trình, đặc biệt những thư viện như AWT vốn đã thay đổi quá nhanh hoặc có xu hướng lỗi thời, phải thay thế.

Phương pháp tiếp cận theo xu hướng “tối thiểu” như vậy có một số ưu điểm. Từng chương chỉ dài khoảng 10 trang, không kể bài tập. Trên lớp, tôi yêu cầu sinh viên đọc mỗi chương trước khi thảo luận, và thấy được rằng họ sẵn sàng thực hiện và nắm bắt được lượng kiến thức. Sự chuẩn bị trước của sinh viên đã giúp dành khoảng thời gian trên lớp để thảo luận những nội dung trừu tượng hơn, để làm bài tập trên lớp, và những chủ đề thêm không có trong sách.

Nhưng xu hướng “tối thiểu” cũng có những nhược điểm. Không có nhiều chỗ thú vị về bản chất. Đa số các ví dụ trong sách nhằm minh họa cho cách sử dụng cơ bản nhất của ngôn ngữ, và nhiều bài tập có liên quan đến thao tác chuỗi kí tự và khái niệm toán học. Tôi nghĩ một số bài thì thú vị, song những thứ làm sinh viên thích ngành khoa học máy tính, như đồ họa, âm thanh và ứng dụng mạng, lại chỉ được giới thiệu qua loa.

Vấn đề nằm ở chỗ phần lớn các đặc điểm thú vị như vậy thì liên quan tới chi tiết vặt mà ít liên quan đến khái niệm. Xét trên khía cạnh giáo dục, điều này có nghĩa là nhiều công sức bỏ ra để thu được ít. Như vậy có một sự tráo đổi giữa nội dung mà sinh viên ưa thích và nội dung mang đậm tri thức. Việc giữ cân bằng hợp lý, tôi nhường lại cho giáo viên đứng lớp. Để giúp phần nào, cuốn sách này có phụ lục đề cập đến đồ họa, nhập liệu từ bàn phím và từ tập tin.

Lập trình hướng đối tượng

Một số quyển sách giới thiệu ngay khái niệm đối tượng; lại có quyển dạo đầu bằng phong cách lập trình thủ tục và dần dần xây dựng phong cách hướng đối tượng. Cuốn sách này thì theo lối “giới thiệu đối tượng sau”.

Nhiều đặc điểm hướng đối tượng của Java khởi nguồn từ các vấn đề đặt ra cho ngôn ngữ đi trước, và cách thực hiện những đặc điểm này chịu ảnh hưởng bởi quá trình lịch sử. Một số đặc điểm rất khó giải thích nếu người học không thạo những bài toán cần giải.

Việc hoãn lại kĩ thuật lập trình hướng đối tượng không phải là chủ ý của tôi. Trái lại, tôi cố gắng tới đó càng nhanh càng tốt, song bị hạn chế bởi ý muốn giới thiệu lần lượt từng khái niệm một, thật rõ ràng, theo cách mà sinh viên có thể thực hành riêng từng khái niệm trước khi chuyển tiếp. Nhưng cũng phải thừa nhận rằng phải mất một thời gian học mới đến được phần hướng đối tượng.

Kì thi Computer Science AP

Theo lẽ thường, khi được biết rằng Hội đồng tuyển sinh (College Board) công bố rằng nội dung thi AP sẽ chuyển sang dùng Java, tôi đã có kế hoạch cập nhật phiên bản Java của cuốn sách này. Đối chiếu với đề cương AP được đưa ra, tôi thấy rằng bộ phận nhỏ của Java dùng để thi rất giống với bộ phận mà tôi đã chọn.

Trong tháng 1 năm 2003, tôi đã soạn ấn bản thứ 4 của cuốn sách, với những sửa đổi sau:

  • Tôi đã thêm vào các mục nhằm bao quát được nội dung trong đề cương thi AP.
  • Tôi hoàn thiện các phụ lục về gỡ lỗi và phát triển chương trình.
  • Tôi đi tập hợp lại những bài tập, câu đố, và câu hỏi thi đã ra trên lớp rồi đưa vào cuối các chương, ngoài ra còn soạn thêm một số câu hỏi giúp chuẩn bị kì thi AP.

Cuối cùng, vào tháng 8-2011, tôi viết xong ấn bản thứ 5, bao quát được phần nghiên cứu cụ thể GridWorld là nội dung trong kì thi AP.

Sách phát hành tự do

Ngay từ đầu, cuốn sách này đã theo giấy phép mà bạn đọc được quyền sao chép, phân phối và sửa chữa nội dung. Độc giả có thể tải sách về với nhiều định dạng khác nhau và có thể đọc trên màn hình hoặc in ra giấy. Giáo viên có thể in bao nhiêu bản tùy ý. Và mọi người đều có thể sửa đổi sách theo nhu cầu.

Đã có người chuyển nội dung cuốn sách sang cho những ngôn ngữ lập trình khác (như Python và Eiffel), và những thứ tiếng khác (như Tây Ban Nha, Pháp, và Đức). Trong số đó, nhiều phiên bản được đăng theo hình thức tự do.

Với động lực từ Phần mềm nguồn mở, tôi đã đón nhận triết lý phát hành sách thật sớm và cập nhật thường xuyên. Tôi đã cố gắng hết sức để giảm thiểu các lỗi, những cũng nhờ bạn đọc giúp sức.

Tinh hình phản hồi thật tuyệt. Gần như ngày nào tôi cũng nhận được thông tin từ bạn đọc, với sự ưa thích cuốn sách đến nỗi họ gửi hẳn một “danh sách liệt kê lỗi”. Thông thường tôi chữa một lỗi mất vài phút và sau đó cập nhật ngay bản thảo qua sửa đổi. Tôi coi cuốn sách như một tác phẩm đang trong quá trình hoàn thiện, sẽ được cải tiến ít một mỗi khi tôi có thời gian soạn lại, hoặc khi bạn đọc gửi phản hồi.

À, còn về tiêu đề

Tôi đã thật buồn phiền về tiêu đề cuốn sách Không phải ai cũng hiểu được rằng chủ yếu đó chỉ là cách nói đùa. Có thể sau khi đọc cuốn sách này, bạn chưa tư duy được như nhà khoa học máy tính. Điều đó cần thời gian, kinh nghiệm, và có thể phải qua mấy lớp học nữa.

Nhưng có một điểm cốt lõi có thật ở tiêu đề này: cuốn sách này không phải viết về Java, và nó chỉ một phần là về lập trình. Nếu có chăng, sự thành công ở cuốn sách là nằm chỗ một cách nghĩ mới. Nhà khoa học  máy tính luôn có một cách tiếp cận để giải quyết vấn đề, và một cách định hình lời giản, rất độc đáo, linh hoạt và mạnh mẽ. Tôi hi vọng rằng cuốn sách này giúp bạn hình dung được phương pháp đó là gì, và ở những lúc nào đó bạn sẽ tự thấy mình có tư duy như nhà khoa học máy tính.

Allen B. Downey
Needham Massachusett, Hoa Kì
13-7-2011

Danh sách bạn đọc đã đóng góp nội dung

Khi bắt đầu viết sách thể loại tự do, tôi vẫn chưa có ý định lập danh sách đóng góp từ phía bạn đọc. Rồi Jeff Elkner đề xuất, và rõ ràng tôi đã tỏ ra lúng túng vì thiếu sót này. Danh sách dưới đây tính từ ấn bản thứ 4, vì vậy nó không có tên nhiều người đã đóng góp, sửa đổi từ trước đó.

Nếu bạn có bất kì nhận xét nào thêm, hãy gửi thư về đại chỉ feedback@greenteapress.com

  • Ellen Hildreth đã dùng sách này để dạy môn học Cấu trúc dữ liệu ở trường Wellesley College, và cô đã gửi một loạt những chỗ cần đính chính, kèm theo một số đề xuất hay.
  • Tania Passfield chỉ ra rằng phần Thuật ngữ cuối Chương 4 đã ghi thừa một số mục không có trong sách.
  • Elizabeth Wiethoff nhận thấy cách tôi khai triển exp(−x2) là sai. Cô cũng đã soạn ra một phiên bản sách dùng ngôn ngữ lập trình Ruby!
  • Matt Crawford đã gửi một file “bản vá” đầy những chỗ cần sửa!
  • Chi-Yu Li chỉ ra một lỗi typo và một lỗi trong mã lệnh ví dụ.
  • Doan Thanh Nam chữa lại một ví dụ ở Chương 3.
  • Stijn Debrouwere phát hiện một typo trong biểu thức toán.
  • Muhammad Saied dịch cuốn sách sang tiếng A-rập, và phát hiện một số lỗi.
  • Marius Margowski phát hiện một điểm không nhất quán trong mã lệnh ví dụ.
  • Guy Driesen phát hiện một số lỗi typo.
  • Leslie Klein phát hiện một chỗ sai khác trong cách khai triển exp(−x2), phát hiện các typo trong hình vẽ biểu diễn mảng chứa các quân bài, và có đề xuất hay giúp cho bài tập được rõ ràng hơn.

Sau cùng, tôi xin được cám ơn Chris Mayfield đã đóng góp đáng kể cho phiên bản 5.1 của sách. Qua việc phản biện cẩn thận, ông đã chỉ ra hơn một trăm chỗ cần sửa và bổ sung. Một số đặc điểm mới gồm có liên kết đến các trang web và liên kết chéo giữa các mục trong sách, sự trình bày nhất quán về hình thức cho các bài tập, và tô màu mã lệnh Java [chỉ có ở sách gốc].

20 phản hồi

Filed under Think Java

20 responses to “Think Java: Cách suy nghĩ như nhà khoa học máy tính

  1. Pingback: Chương 1: Lối đi của chương trình máy tính | Blog của Chiến

  2. Pingback: Chương 2: Biến và kiểu | Blog của Chiến

  3. Pingback: Chương 3: Phương thức rỗng | Blog của Chiến

  4. Pingback: Chương 4: Câu lệnh điều kiện và đệ quy Java | Blog của Chiến

  5. Pingback: Chương 5: Grid World, phần 1 | Blog của Chiến

  6. Pingback: Chương 6: Phương thức trả lại giá trị | Blog của Chiến

  7. Mong đọc chương 7 của anh, thấy có bản dịch tiếng Việt làm biếng đọc tiếng Anh quá ^^

  8. Pingback: Chương 9: Đối tượng có thể biến đổi | Blog của Chiến

  9. Pingback: Chương 10: Grid World, phần 2 | Blog của Chiến

  10. Pingback: Chương 11: Tự tạo nên những đối tượng riêng | Blog của Chiến

  11. Pingback: Chương 12: Mảng | Blog của Chiến

  12. Pingback: Chương 13: Mảng chứa các đối tượng | Blog của Chiến

  13. Pingback: Chương 14: Đối tượng chứa các mảng | Blog của Chiến

  14. Pingback: Chương 15: Lập trình hướng đối tượng | Blog của Chiến

  15. Pingback: Chương 16: GridWorld, phần 3 | Blog của Chiến

  16. Pingback: Phụ lục A: Đồ họa | Blog của Chiến

  17. Pingback: Phụ lục B: Đầu vào và đầu ra trong Java | Blog của Chiến

  18. Pingback: Phụ lục C: Phát triển chương trình | Blog của Chiến

  19. Pingback: Phụ lục D: Gỡ lỗi | Blog của Chiến

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s