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

 smallcover Cuốn sách này được phát hành theo giấy phép tài liệu tự do GNU (GNU Free Documentation License). Bạn đọc có thể tùy ý sao chép và phân phối nội dung trong sách; và có thể tùy ý sửa chữa, nhằm điều chỉnh để nội dung phù hợp với các nhu cầu khác nhau, và để hình thành tài liệu mới. Phần nhiều nội dung cuốn sách giống với quyển Think Python đã được đăng trên blog này. Xin được giới thiệu phần nội dung riêng không có trong cuốn sách đó.

Lời tựa

David Beazley

Là giáo viên, nhà nghiên cứu, và tác giả viết sách, tôi rất mừng khi thấy cuốn sách này được hoàn thành. Python là ngôn ngữ lập trình thú vị và đặc biệt dễ dùng. Nó dần dần chiếm được sự phổ dụng trong vài năm gần đây. Được Guido van Rossum phát triển từ hơn 10 năm trước, Python với ngôn ngữ và hình thức đơn giản đã dựa nhiều vào ABC, một ngôn ngữ thiết lập từ những năm 1980 để phục vụ mục đích giảng dạy. Tuy nhiên, Python còn được tạo nên để giải quyết những bài toán thực tế và nó thừa hưởng nhiều đặc điểm từ những ngôn ngữ lập trình như C++, Java, Modula-3, và Scheme. Vì vậy, một trong những đặc điểm nổi bật của Python là có sức hấp dẫn đối với đông đảo những người phát triển phần mềm, giới khoa học, nghiên cứu, giới nghệ thuật và những giáo viên.

Mặc dù Python thu hút sự quan tâm của nhiều cộng đồng khác nhau như vậy, song bạn có thể vẫn hỏi “tại sao phải là Pythnon?” hoặc “tại sao lại dạy lập trình bằng Python?”. Để trả lời những câu hỏi như vậy thật không dễ dàng—đặc biệt là những ý kiến thường gặp lại nghiêng về phía các ngôn ngữ có xu hướng đánh đổi sự hào nhoáng lấy nỗi khổ khi lập trình, như C++ và Java. Tuy nhiên, tôi nghĩ câu trả lời thẳng thắn nhất, đó là lập trình bằng Python vui hơn và đạt hiệu quả sáng tạo cao hơn.

Khi tôi dạy các lớp khoa học máy tính, tôi muốn trình bày những khái niệm quan trọng ngoài việc làm cho bài giảng hấp dẫn gợi sự hứng thú cho người học. Không may là, hiện có hai xu hướng: đối với những khóa học nhập môn lập trình thì tập trung quá vào các phép trừu tượng toán học; đối với học viên là cản trở họ bằng những vấn đề khó chịu liên quan đến chi tiết cú pháp ở cấp độ thấp, đến khâu biên dịch, và những bổ sung đối với các quy tắc dường như hóc búa. Mặc dù những phép trừ tượng và hình thức như vậy rất quan trọng đối với kĩ sư phần mềm chuyên nghiệp và những sinh viên có ý định theo đuổi ngành khoa học máy tính, song với những phương pháp đó ở một lớp nhập môn sẽ chỉ khiến khoa học máy tính trở nên nhàm chán. Khi giảng dạy trên lớp, tôi không muốn có chỗ cho những sinh viên ít hứng thú, mà muốn xem họ cố gắng giải quyết vấn đề đáng lưu tâm bằng cách khám phá những ý tưởng khác nhau, chọn các phương pháp lạ, phá vỡ quy tắc, và học từ chính những lỗi mắc phải. Bằng cách này, tôi không muốn bỏ phí một nửa kì học để phân giải những vấn đề bí hiểm liên quan đến cú pháp, những thông báo lỗi ngây ngô phát ra từ trình biên dịch, hay hàng trăm cách khác nhau khiến cho một chương trình có thể gây ra lỗi bảo vệ chung (general protection fault).

Một trong những lí do khiến tôi thích Python là vì nó đạt được sự cân bằng thật hợp lí giữa tính thực dụng và lí thuyết. Vì Python được thông dịch nên người mới học có thể bắt tay vào sử dụng ngôn ngữ để viết ngay được những chương trình thật gọn ghẽ mà không bị lạc vào vấn đề liên quan đến biên dịch và kết nối. Hơn nữa, Python có sẵn một thư viện lớn chứa các module mà ta có thể dùng cho mọi loại việc từ lập trình web đến đồ họa. Có được một mục tiêu thực dụng như vậy là một cách hay để khơi gợi hứng thú cho sinh viên, đồng thời giúp cho sinh viên hoàn thành được những dự án tương đối lớn. Tuy nhiên, Python cũng có thể được dùng như một cơ sở vững chắc nhằm giới thiệu những khái niệm quan trọng về khoa học máy tính. Vì Python hỗ trợ hoàn toàn những thủ tục và lớp, nên sinh viên có thể được giới thiệu dần những chủ đề như trừu tượng về thủ tục, cấu trúc dữ liệu, và lập trình hướng đối tượng—tất cả đều áp dụng được cho những khóa học sau này về Java và C++. Python thậm chí còn vay mượn một số đặc điểm từ các ngôn ngữ lập trình hàm và có thể được dùng để giới thiệu những khái niệm mà lẽ ra được trình bày kĩ hơn nếu có khóa học về Scheme hoặc Lisp.

Khi đọc lời nói đầu do Jeffrey viết, tôi đã ấn tượng với những nhận xét của ông về việc Python đã giúp ông thấy được một “bậc thành công cao hơn và rào cản đã hạ thấp” và ông đã có thể “dạy được nhanh hơn với kết quả tốt hơn”. Mặc dù những nhận xét này dành cho lớp học nhập môn của Jeffrey, nhưng thỉnh thoảng tôi cũng dùng Python bởi chính những lí do đó, cho các lớp khoa học máy tính bậc cao học ở Đại học Chicago. Trong những khóa học này, tôi thường xuyên phải đối mặt với nhiệm vụ khó khăn là phải trình bày xong nhiều nội dung khó trong thời gian một nửa học kì gồm 9 tuần. Dù rằng đương nhiên tôi có thể làm khó học viên bằng cách dùng một ngôn ngữ như C++, song tôi vẫn thường coi cách làm này là phản sáng tạo—đặc biệt là khi khóa học về một chủ đề không chỉ liên quan đến “lập trình”. Tôi thấy rằng việc dùng Python đã giúp mình tập trung hơn về chủ đề thực sự hiện tại trong khi vẫn cho phép học viên hoàn thành những bài tập lớn.

Mặc dù Python vẫn là một ngôn ngữ trẻ và đang phát triển, song tôi tin rằng nó có tương lai xán lạn trong ngành giáo dục. Quyển sách này là một bước đi quan trọng theo hướng đó.

David Beazley
University of Chicago
Tác giả cuốn sách Python Essential Reference

Lời nói đầu

Jeff Elkner

Cuốn sách này ra đời bởi sự hợp tác soạn thảo, nhờ Internet và phong trào phần mêm tự do. Ba tác giả—một giáo sư đại học, một giáo viên trung học, và một lập trình viên chuyên nghiệp—chưa từng gặp mặt, nhưng đã có thể hợp tác ăn ý và được sự trợ giúp của nhiều người bạn tuyệt vời đã dành thời gian và công sức để cải thiện cuốn sách.

Chúng tôi nghĩ rằng cuốn sách là một bằng chứng cho thấy những ích lợi và triển vọng tương lai của hình thức hợp tác như thế này, mà bắt nguồn từ hệ thống được định hình bởi Richard Stallman và Quỹ phần mềm tự do.

Bằng cách nào và lý do nào tôi đã chọn sử dụng Python?

Năm 1999, kì thi Advanced Placement (AP) Computer Science do Hội đồng tuyển sinh (College Board) đã lần đầu tiên có đề thi bằng lập trình C++. Cũng như ở nhiều trường trung học khắp nước Mỹ, quyết định thay đổi ngôn ngữ đã có một tác động trực tiếp đến giáo án môn khoa học máy tính tại trường trung học Yorktown ở Arlington, Virginia, nơi tôi giảng dạy. Cho tới thời điểm đó, Pascal vẫn là ngôn ngữ dạy cho các khóa học năm thứ nhất lẫn khóa luyện thi AP. Để tiếp tục thông lệ các năm trước, giúp học sinh có thời gian hai năm luyện tập ngôn ngữ để thi, chúng tôi quyết định chuyển sang C++ vào khóa học năm đầu của niên khóa 1997-98. Như vậy có thể theo kịp sự thay đổi của Hội đồng tuyển sinh đối với khóa học AP năm tiếp theo.

Hai năm sau đó, tôi buộc phải nhận thấy rằng C++ là lựa chọn dở trong vai trò giới thiệu khoa học máy tính cho sinh viên. Dù chắc chắn là một ngôn ngữ mạnh, nhưng nó cũng là một ngôn ngữ rất khó học và dạy. Nhiều khi bản thân tôi phải đánh vật với cú pháp khó của C++ và nhiều cách khác nhau để thực hiện cùng một công việc, và kết quả là học trò của tôi đã bỏ lớp rất nhiều. Bị thuyết phục rằng chắc hẳn phải có một ngôn ngữ thích hợp hơn để giảng dạy cho năm học thứ nhất, tôi đi tìm các giải pháp để thay thế cho C++.

Tôi cần một ngôn ngữ vừa chạy được trên máy tính cài Linux ở phòng thứ nghiệm, cũng như máy Windows và Mac của đa số học sinh- ở nhà. Tôi cũng muốn ngôn ngữ này phải miễn phí và cho phép sao lưu, nhờ vậy mọi học sinh có thể dùng nó ở nhà bất kể hoàn cảnh kinh tế. Tôi cần ngôn ngữ được những lập trình viên chuyên nghiệp sử dụng, và ngôn ngữ có một cộng đồng phát triển thường trực. Và điều quan trọng nhất là, ngôn ngữ này phải dễ học, dễ dạy. Khi tôi phân tích các lựa chọn với những tiêu chí này thì Python đã nổi lên như một ứng cử sáng giá nhất cho công việc.

Tôi đã đề nghị một học sinh giỏi của trường Yorktown, đó là Matt Ahrens, thử dùng Python. Và trong hai tháng, cậu ta không những học được ngôn ngữ này mà còn viết một trình ứng dụng có tên pyTicket để giúp cán bộ giáo viên báo lại những trục trặc kĩ thuật qua mạng. Tôi biết rằng Matt có thể đã không hoàn thành được một trình ứng dụng tầm cỡ đó và nhanh như vậy nếu lập trình bằng C++, và thành tích này, cùng với những nhận xét tốt đẹp của Matt về Python, đã cho tôi thấy rằng Python đúng là giải pháp mình đang tìm kiếm.

Đi tìm một cuốn giáo trình

Khi đã quyết định chọn dùng Python cho cả hai lớp nhập môn khao học máy tính trong niên khóa tiếp theo, vấn đề gay go nhất lúc bấy giờ là thiếu một cuốn sách giáo trình.

Và các tài liệu phát hành tự do đã giải thoát tôi. Trước đó, cũng trong năm, Richard Stallman đã giới thiệu Allen Downey với tôi. Cả hai chúng tôi đã viết thư cho Richard thể hiện mối quan tâm về việc phát triển tài liệu giảng dạy phát thành tự do. Allen đã viết một quyển giáo trình khoa học máy tính cho năm thứ nhất, có tên How to Think Like a Computer Scientist. Khi đọc cuốn này, tôi đã biết ngay rằng đây chính là cuốn tôi dùng được để dạy trên lớp. Đó là cuốn sách giáo trình mạch lạc nhất và hữu ích nhất mà tôi đã từng thấy. Sách nhấn mạnh vào những quá trình tư duy khi lập trình thay vì những đặc điểm của một ngôn ngữ cụ thể. Việc đọc cuốn sách nhanh chóng cải thiện khả năng sư phạm của tôi.

How to Think Like a Computer Scientist không chỉ là một cuốn sách xuất sắc, mà còn được phát hành theo giấy phép công cộng GNU, nghĩa là nó có thể được dùng tùy ý và được sửa đổi cho phù hợp với nhu cầu sử dụng. Một khi đã quyết định chọn Python, tôi chợt nhận thấy rằng mình có thể dịch bản gốc của Allen viết cho ngôn ngữ Java sang một ngôn ngữ mới. Dù tôi không thể tự mình viết một cuốn sách được, nhưng dựa trên bản thảo của Allen thì tôi đã có thể, và đồng thời cho thấy mô hình phát triển hợp tác, vốn được dùng nhiều trong lĩnh vực phần mềm, giờ lại có thể hiệu quả trong biên soạn tài liệu giáo dục.

Việc chuẩn bị cuốn sách này trong hai năm qua là phần thưởng đối với các học sinh cũng như bản thân tôi; và suốt trong quá trình, học sinh đã đóng vai trò quan trọng. Vì tôi chỉ có thể sửa đổi ngay mỗi khi một em phát hiện ra lỗi chính tả hoặc một đoạn văn khó hiểu, cho nên tôi khuyến khích học sinh tìm lỗi bằng cách tặng điểm thưởng mỗi khi  đề xuất sửa lỗi của họ được chấp nhận. Điều này có hai mặt lợi: vừa khuyến khích học sinh đọc kĩ sách, đồng thời cũng giúp bản thảo được duyệt lại kĩ lưỡng nhờ những ý kiến quan trọng nhất từ học sinh là người trực tiếp đọc nó.

Với nửa sau cuốn sách về lập trình hướng đối tượng, tôi biết rằng cần một người có nhiều kinh nghiệm lập trình thực thụ hơn tôi thì mới được việc. Phải mất một năm nữa chờ đợi để phần sau này được cộng đồng phần mềm tự do giúp sức hoàn thiện.

Tôi đã nhận được email mà Chris Meyer gửi đến để bày tỏ mối quan tâm đến cuốn sách. Chris là một lập trình viên chuyên nghiệp, và đã bắt đầu dạy một khóa lập trình Python vào năm ngoái ở trường Lane Community College, thành phố Eugene, Oregon. Triển vọng giảng dạy khóa này đã hướng sự chú ý của Chris đến cuốn sách, và anh đã bắt đầu giúp đỡ lập tức. Đến cuối năm học, anh đã tạo nên một dự án kèm theo cuốn sách, hiện ở website http://openbookproject.net/py4fun/ với tên gọi Python for Fun. Đồng thời, anh cũng đã dạy một số sinh viên giỏi nhất lớp tôi, hướng dẫn những điều vượt khả năng tôi đảm nhiệm.

Giới thiệu lập trình bằng Python

Quá trình dịch và sử dụng How to Think Like a Computer Scientist trong hai năm vừa qua đã khẳng định sự phù hợp của Python đối với việc dạy học sinh mới lập trình. Python làm đơn giản đi nhiều ví dụ và khiến cho những ý tưởng lập trình quan trọng trở nên dễ giảng dạy hơn.

Ví dụ đầu tiên trong cuốn sách đã minh họa cho điều này. Đó là chương trình truyền thống mang tên “hello, world”, mà ở phiên bản cuốn sách viết bằng C++ như sau:

   #include <iostream.h>

   void main()
   {
     cout << "Hello, world." << endl;
   }

và trong phiên bản Python nó trở thành:

   print "Hello, World!"

Mặc dù đây là một ví dụ nhỏ nhặt, song những ưu điểm của Python đã nổi bật. Môn học “Khoa học máy tính I” ở Yorktown không yêu cầu bất cứ kiến thức tin học nào, vì vậy với nhiều học sinh thì đây chính là chương trình đầu tiên mà các em biết đến. Hiển nhiên, có những em lo lắng một chút khi biết rằng lập trình rất khó học. Phiên bản dùng C++ luôn khiến tôi phải đứng trước hai lựa chọn không thoải mái gì: hoặc là giải thích đầy đủ  #includevoid main(), {, và }, đồng thời gây ra nguy cơ làm bối rối hoặc nhụt chí một số học sinh ngay từ đầu; hoặc là nói với họ “Đừng băn khoăn về những thứ đó; sau này ta sẽ nói đến sau,” và cũng có nguy cơ tương tự. Ở buổi học đầu, mục đích giảng dạy là giới thiệu ý tưởng của ngôn ngữ lập trình đến cho học sinh và giúp các em viết được chương trình đầu tiên, qua đó giới thiệu môi trường lập trình. Chương trình Python có được đúng những yếu tố để thực hiện các mục đích này, không hơn không kém.

Qua so sánh đoạn bài giảng để diễn giải cho từng phiên bản chương trình nói trên trong sách, ta còn thấy được điều này có ý nghĩa gì đối với học sinh. Trong phiên bản C++ có đến 13 đoạn giải thích “Hello, world!”, còn trong phiên bản Python, chỉ có 2 đoạn. Quan trọng hơn là, 11 đoạn chênh lệch này không có gì liên quan đến những “ý tưởng cơ bản” của việc lập trình mà chỉ là những tiểu tiết về cú pháp C++. Tôi cũng thấy được những điều tương tự trong suốt cuốn sách. Có những đoạn văn trong bản sách C++ sang đến bản Python đã biến mất, chỉ vì Python có cú pháp rõ ràng hơn nhiều, khiến cho lời giải thích trở nên không cần thiết.

Việc dùng một ngôn ngữ bậc cao như Python cho phép giáo viên trì hoãn việc nói về những đặc điểm bậc thấp của máy tính đến khi học sinh đã có đủ kiến thức nền tảng cần thiết để hiểu rõ hơn về từng chi tiết. Do vậy, ngôn ngữ bậc cao tạo ra khả năng bố trí xếp đặt kiến thức tuần tự theo đúng phương châm giảng dạy. Một trong những ví dụ rõ ràng nhất về điều này là cách mà Python xử lý các biến. Trong C++, một biến là tên một chỗ để đặt thông tin. Biến phải được khai báo kèm theo kiểu của nó, một phần là vì kích thước để đặt thông tin nói trên cần phải xác định trước. Vì vậy, khái niệm về biến gắn chặt với phần cứng máy tính. Khái niệm cơ bản và có tác dụng mạnh mẽ của “biến” vốn đã khó hiểu đối với học sinh mới học (cả ngành khoa học máy tính lẫn toán đại số). Byte và địa chỉ cũng không giúp giải thích gì đáng kể. Trong Python thì biến là một cái tên để chỉ thông tin nào đó. Đây là khái niệm trực quan hơn nhiều đối với học sinh mới và khái niệm này cũng gần sát hơn ý nghĩa của “biến” mà các em đã học từ môn toán. Ở năm học này so với năm trước, tôi đã bớt được nhiều khó khăn trong việc giảng về biến, và tôi giảm được thời gian cho việc  giúp học sinh giải bài tập có liên quan đến biến.

Một ví dụ cho thấy Python giúp ích trong việc dạy và học lập trình là ở chỗ cú pháp của nó để biểu diễn hàm. Học sinh trong lớp tôi luôn gặp nhiều khó khăn trong việc hiểu được hàm. Vấn đề chính xoay quanh sự khác biệt giữa lời định nghĩa hàm và lời gọi hàm, cùng với việc phân biệt tham số với đối số. Python đã giúp giải quyết vấn đề này bằng quy tắc cú pháp không gì đẹp hơn. Các định nghĩa hàm đều bắt đầu bằng từ khóa  def, vì vậy tôi chỉ việc bảo học sinh, “Khi các em định nghĩa một hàm, hãy bắt đầu bằng  def, tiếp theo là viết tên hàm; còn khi gọi hàm, chỉ cần gõ tên của nó là được.” Tham số đi với định nghĩa, đối số đi với lời gọi. Không hề nói đến kiểu được trả lại, kiểu tham số, hay tham chiếu và tham số giá trị, vì vậy giờ đây tôi có thể dạy về các hàm trong chưa đầy nửa quãng thời gian của trước kia, mà lại trình bày thông suốt hơn.

Việc dùng Python đã làm cải thiện tính hiệu quả của chương trình khoa học máy tính của trường tôi đối với tất cả học sinh. Tôi thấy được một bậc thành công cao hơn và rào cản đã hạ thấp so với những gì tôi đã trải qua trong suốt hai năm giảng dạy C++. Tôi dạy được nhanh hơn với kết quả tốt hơn. Nhiều học sinh học xong đã có thể viết được những chương trình có ý nghĩa với thái độ tích cực hơn về những trải nghiệm với sự thay đổi ngôn ngữ lập trình này.

Thành lập một cộng đồng

Tôi đã nhận được email từ nhiều độc giả trên thế giới đã sử dụng cuốn sách để học hoặc giảng dạy lập trình. Một cộng đồng người sử dụng đã bắt đầu hình thành, và nhiều người đã đóng góp đến dự án bằng cách gửi tài lệu đến cho trang web tại http://www.thinkpython.com.

Với việc xuất bản sách in giấy, tôi mong đợi cộng đồng người dùng sẽ tiếp tục lớn mạnh. Sự hình thành cộng đồng người dùng này cùng khả năng của nó trong việc khuyến khích hợp tác giữa các giáo viên đã và đang là những điều thú vị nhất trong dự án này đối với tôi. Bằng cách làm việc cùng nhau, chúng ta có thể nâng cao chất lượng tài liệu để sử dụng và tiết kiệm thời gian quý giá. Xin mời bạn tham gia cộng đồng chúng tôi; rất mong bạn gửi ý kiến đóng góp. Hãy gửi thư cho các tác giả cuốn sách này theo địa chỉ feedback@thinkpython.com.

Jeffrey Elkner
Yorktown High School
Arlington, Virginia

12 phản hồi

Filed under Think Python

12 responses to “Cách nghĩ như nhà khoa học máy tính

  1. Pingback: Thao tác đơn giản với dữ liệu trong Python | Blog của Chiến

  2. Pingback: Bổ sung Think Python: bảng số, histogram | Blog của Chiến

  3. Pingback: Bổ sung: Ma trận | Blog của Chiến

  4. Pingback: Bổ sung Think Python: trò chơi bài Old Maid | Blog của Chiến

  5. Pingback: Danh sách liên kết | Blog của Chiến

  6. Pingback: Think Python: Cách tư duy như nhà khoa học máy tính | Blog của Chiến

  7. Pingback: Ngăn xếp | Blog của Chiến

  8. Pingback: Hàng đợi | Blog của Chiến

  9. Pingback: Cây | Blog của Chiến

  10. Pingback: Tạo ra kiểu dữ liệu mới | Blog của Chiến

  11. Pingback: Tài liệu cần tìm đọc thêm về Python | Blog của Chiến

  12. Pingback: Think Python: Cách tư duy như nhà khoa học máy tính » Book Python

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