Search Page (trang tìm kiếm tiếng Anh)

Lời nói đầu

LỜI CẢM TẠ

Đây là cuốn sách giáo trình nguồn mở.

Điều đó nghĩa là ai cũng có thể dùng nó cho mục đích phi thương mại, hoặc sửa đổi, mở rộng, dịch sách ra những ngôn ngữ khác, hoặc thậm chí lập một đoạn phim chứa những hình ảnh đẹp trong sách. Tuy nhiên, bất kì việc sử dụng nào cũng phải gắn liền với điều khoản hợp pháp tại http://creativecommons.org/licenses/by-nc-sa/3.0/

Chương đầu tiên là một trích đoạn từ bài hướng dẫn của Yusuf Motara. Hãy xem toàn bộ bài hướng dẫn ở http://www.ict.ru.ac.za/resources/way_of_the_program/. Tác giả này đã tạo nội dung bài giảng dựa vào một phiên bản sớm hơn của cuốn sách Python tại http://openbookproject.net/thinkcs/python/english3e/, và cuốn này thì lại dựa vào một phiên bản sớm nữa từ nhiều tác giả khác nhau. Và ngay cả mặc dù Yusuf viết phần lớn nội dung trong chương này, về sau này nó cũng được sửa bởi tác giả hiện nay, Peter Wentworth; tôi chịu trách nhiệm cuối cùng về bất cứ sai sót nào.

TẠI SAO?

Là quyển giáo trình, sách này cố gắng thực hiện một số điều khác với nhiều hướng tiếp cận thông thường.

Tôi cố gắng chuyển từ ý tưởng Tính toán theo Phép tính về Tính toán theo Tương tác. Ngày nay chúng ta tương tác với cỗ máy thông qua giao diện (UI). Những khái niệm về sự kiện và phản hồi đều thông dụng hơn những phép tính từ đầu đến cuối trong môi trường cửa sổ dòng lệnh. Nhiều sinh viên trường tôi còn chưa từng nhìn thấy một chương trình chạy trên cửa sổ lệnh, và có lẽ thậm chí không nhìn thấy nữa. Dự án mang tên Rethinking CS101 của Lynn Andrea Stein có ý nghĩa rất lớn, bạn hãy xem ở  http://www.cs101.org/

Gần đây lý thuyết về khái niệm ngưỡng và khái niệm rắc rối chính là lăng kính hữu dụng để nhìn nhận lý do mà sinh viên gặp khó khăn khi chuyển đổi cách suy nghĩ về một môn học. Dù rằng có thể không sớm có được sự tán thành rộng rãi về ý nghĩa của những khái niệm ngưỡng nêu trên với sinh viên, song cuốn sách đã tách biệt và nhấn mạnh một số khái niệm như trạng thái, dòng kiểm soát, đệ quy, biểu diễn, chuyển đổi dữ liệu, bó thông tin (mental chunking), v.v. Nếu bạn chưa gặp những khái niệm này, hãy xem bài http://crpit.com/confpapers/CRPITV95Rountree.pdf hoặc tra tìm Threshold Concepts trên Google.

Tôi thích những ví dụ có hình ảnh. Thật buồn khi một số sinh viên lớp tôi thường tỏ ra yếu trong lĩnh vực nhận thức mà lý thuyết Piaget gọi là “phép tính hình thức” và yếu khả năng trừu tượng hóa, thao tác, tư duy về, hay điều khiển phần vô hình bên trong của chương trình. Như vậy nghĩa là họ sẽ thấy dễ dàng theo cách cụ thể.

Bởi vậy mỗi khi có thể, tôi đều ưu tiên để trạng thái tính toán thật rõ ràng. Tôi dùng một công cụ rùa (turtle) kiểu Logo, và dùng nhiều những khiển tố đồ họa trongnền tảng Windows Presentation Foundation. Và khi lần đầu ta gặp đệ quy, tôi sẽ dùng rùa để tạo các đường cong phân mảnh (fractal), vì tính trực quan rõ của qúa trình tháo gỡ chi tiết bên trong của thuật toán. Cách dạy truyền thống của ta cũng bó buộc với việc bắt sinh viên suy diễn và tự xây dựng các mô hình nhận thức về tính toán; sinh viên thường làm sai. Kết qủa là họ chỉ thu được những mô hình què quặt về những ý tưởng dùng là cơ bản nhất, như phép gán hoạt động ra sao. (Ở đây, què quặt nghĩa là khái niệm của họ có thể đúng cho một vài trường hợp, nhưng các trường hợp khác lại cho kết qủa sai.) Bởi vậy tôi nhấn mạnh vào việc gỡ lỗi, dò từng câu lệnh, khảo sát trạng thái bên trong chương trình khi nó chạy, v.v. với hi vọng chúng ta có thể lập những mô hình nhận thức đúng đắn.

Hãy tự hỏi hoặc hỏi người giáo viên đồng nghiệp thử ước tính xem thông thường có bao nhiều phần trăm sinh viên đã tham gia khóa học mà nắm vững được phép gán giá trị, hoặc hiểu rõ phép gán biến. Rồi so sánh kết qủa này với nghiên cứu công bố tại http://dl.acm.org/citation.cfm?id=1227481

Rồi sau đó, dĩ nhiên là ta phải đối diện với câu hỏi: “Liệu ta sẽ làm các đối tượng gnay từ đầu, hay là sẽ trì hoãn sau khi đã hình thành những kĩ năng lập thuật toán và gõ mã lệnh theo cách lập trình thủ tục?” Tôi thì ủng hộ việc sớm tiếp xúc với các đối tượng, thuật ngữ và những trường hợp áp dụng cụ thể, nhưng sẽ tổng hợp các đối tượng muộn hơn. Công cụ lý tưởng để thực hiện điều này dường như là một trình xây dựng giao diện đồ họa và vài ví dụ điều khiển rùa (turtle). Ta có thể làm việc với đối tượng từ một thư viện, và làm quen với những khái niệm lập trình hướng đối tượng (OOP) như thực thể, thuộc tính, trạng thái bên trong, thời gian tồn tại, sự kiện, thừa kế, v.v. từ lâu trước khi bắt tay vào “tổng hợp các đối tượng”. Theo tinh thần tương tự, tôi ghét những cách tiếp cận nhập môn dùng những lớp đơn giản đến mức tầm thường. Tôi cũng không thích các ví dụ OOP mà chỉ lập một thực thể duy nhất. Ở đây tôi để các sinh viên tự nỗ lực để phân biệt ý tưởng rằng lớp giống như một nhà máy, còn thực thể là những sản phẩm từ đó mà ra.

Như vậy lần đầu sinh viên bắt gặp kiểu Button, quyển sách này sẽ có ít nhất hai thực thể, hay ít nhất hai con rùa. Khi chúng ta học về thừa kế, tôi thích kế thừa từ thứ phức tạp và có tính năng hẳn hoi. (Trong cuốn sách này, kế thừa được ví dụ với kiểu Turtle và bổ sung tinh năng cũng nhưng một số ứng xử được chèn lên cái cũ.)

Trong cuốn sách này cũng có xu hướng giới thiệu khái niệm lần đầu một cách “nôm na”, bởi ta cần cho ví dụ thuyết phục hiện tại. Sau đó ta sẽ đến những chương ở đó gặp lại và trình bày khái niệm đầy đủ hơn. Vì thế bạn có thể gặp phải vòng lặp while ở Chương 7, và mảng trong Chương 8, dù những chương về các chủ đề này sẽ xuất hiện sau nữa trong sách. Tôi hi vọng bằng cách này sẽ tạo được ngữ cảnh sớm thúc đẩy việc học cấu trúc hoặc đặc điểm của ngôn ngữ C#. Cách này cũng giúp để nói với sinh viên “Đúng, ta vẫn chưa học đến điều đó. Vậy hãy tự đi tìm hiểu những đặc điểm kia xem như thế nào.”

Phụ lục Tips (mẹo vặt) trong cuốn sách này cũng giải thích một số ý tưởng cuả tôi về việc dạy Khoa học Máy tính: tôi muốn trình bày rõ nội dung của phụ lục này trước sinh viên lớp mình.