Think Python: Cách tư duy như nhà khoa học máy tính

Think Python: How to Think Like a Computer Scientist

Nội dung

Cuốn sách nhằm giới thiệu ngắn gọn, nhưng đầy đủ về quy trình thiết kế phần mềm bằng ngôn ngữ lập trình Python. Trọng tâm được đặt vào khâu lập trình, trong đó nhấn mạnh đến kĩ thuật gỡ lỗi. Cuốn sách gồm một loạt bài tập đa dạng, từ những ví dụ ngắn đến những dự án thực thụ, từ đó học viên sẽ có đầy đủ cơ hội để thực hành những khái niệm mới tiếp thu.

Tác giả

Allen B. Downey, là phó giáo sư ngành khoa học máy tính tại Olin College of Engineering ở Needham, Massachusetts. Ông đã từng dạy ở Wellesley College, Colby College, và UC Berkeley. Ông nhận bằng tiến sĩ ngành khoa khoa học máy tính từ UC Berkeley và bằng thạc sĩ từ MIT.

Một cuốn sách tương tự có tên: How to think like a computer scientist: learning with Python, được Allan Downey cùng hai đồng tác giả soạn nên. Chúng tôi đề cập đến những nội dung phụ thêm, bổ sung cho cuốn sách này.

Mục lục

Chương 1: Cơ chế 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: Hàm
Chương 4: Nghiên cứu cụ thể: Thiết kế giao diện
Chương 5: Câu lệnh điều kiện và đệ quy
Chương 6: Hàm trả lại kết quả
Chương 7: Lặp
Chương 8: Chuỗi kí tự
Chương 9: Nghiên cứu cụ thể: Trò chơi chữ
Chương 10: Danh sách

 

Chương 11: Từ điển
Chương 12: Bộ
Chương 13: Nghiên cứu cụ thể: … cấu trúc dữ liệu
Chương 14: File
Chương 15: Lớp và đối tượng
Chương 16: Lớp và hàm
Chương 17: … lập trình hướng đối tượng
Chương 18: Thừa kế
Chương 19: Nghiên cứu cụ thể: Tkinter
Phụ lục: Gỡ lỗi và Lumpy

Sự ra đời kì lạ của cuốn sách này

(Lời giới thiệu của tác giả)

Tháng Một năm 1999 tôi chuẩn bị dạy một lớp học nhập môn lập trình ngôn ngữ Java.  Tôi đã từng dạy khoá học này ba lần và cảm thấy không hài lòng.  Sinh viên có tỉ lệ thi trượt rất cao, và ngay cả những người qua được, thì điểm cũng không khả quan.

Một trong những vấn đề tôi thấy được là ở những cuốn sách giáo trình. Chúng thường quá dày, với nhiều chi tiết nhỏ nhặt về Java, và không có đủ những hướng dẫn lập trình theo tầm nhìn bao quát. Và chúng đều bị mắc phải hiệu ứng “cửa sập”: khởi đầu rất dễ dàng, phát triển từ từ, và đến Chương 5 thì lôi ra đủ mọi kiến thức. Sinh viên sẽ tiếp thu quá nhiều tài liệu, quá gấp gáp, và hậu quả cuối cùng là đến cuối kì thì “chữ thầy trả thầy”.

Hai tuần lễ trước khi khoá học bắt đầu, tôi quyết định viết quyển sách của riêng mình. Mục tiêu của tôi là:

  • Viết ngắn gọn. Để sinh viên đọc 10 trang thì hay hơn là 50 trang.
  • Chú ý đến từ ngữ. Tôi cố gắng hạn chế dùng các thuật ngữ, và mỗi khi dùng lần đầu thì định nghĩa chúng luôn.
  • Xây dựng dần dần. Để tránh các tình trạng “cửa sập”, tôi đem chia nhỏ những chủ đề khó thành một chuỗi các bước kế tiếp nhau.
  • Chú ý đến lập trình thay vì ngôn ngữ lập trình. Tôi chỉ trình bày phần rất nhỏ nhưng thiết yếu của Java và lược qua tất cả phần còn lại.

Nhan đề cuốn sách tôi chọn theo ý thích của riêng mình, là Cách tư duy như nhà khoa học máy tính.

Phiên bản ban đầu rất sơ lược, nhưng đã có hiệu quả. Sinh viên nghiêm túc đọc tài liệu, và hiểu rằng khi lên lớp tôi chỉ giảng về những phần khó, còn những chủ đề hay (và quan trọng nhất) là để cho sinh viên luyện tập.

Tôi đã phát hành quyển sách theo giấy phép Văn bản tự do của GNU, theo đó người dùng có thể tự sao chép, sửa đổi và phân phối sách.

Câu chuyện tiếp diễn rất thú vị. Jeff Elkner, một giáo viên trung học dạy tại Virginia, đã chọn lấy cuốn sách của tôi và biên tập với ngôn ngữ Python. Ông đã gửi tôi một bản dịch, và tôi đã có một kinh nghiệm thú vị khi học được Python từ chính sách của mình.

Jeff và tôi đã hiệu đính lại quyển sách, thêm vào một phần ví dụ thực tế của Chris Meyers, và năm 2001 chúng tôi phát hành  Cách tư duy như nhà khoa học máy tính: Học với ngôn ngữ Python, cũng theo Giấy phép Văn bản tự do của GNU.

Với nhà xuất bản Green Tea, tôi phát hành quyển sách và bắt đầu bán những cuốn sách in, qua Amazon.com và các hiệu sách đại học. Những cuốn sách khác cùng nhà xuất bản Green Tea đều có tại greenteapress.com.

Năm 2003 tôi bắt đầu dạy tại Đại học Olin College, cũng là lần đầu tiên tôi dạy Python. Nét tương phản với Java thật là ấn tượng. Sinh viên đã đỡ vất vả, học được nhiều hơn, tham gia nhiều dự án thú vị hơn, và nói chung đều rất vui vẻ.

Trong khoảng năm năm qua tôi vẫn tiếp tục chỉnh biên cuốn sách, sủa lỗi, cải thiện các ví dụ và thêm vào tư liệu, đặc biệt là các bài tập. Trong năm 2008 tôi đã bắt đầu làm việc với một phiên bản chính—cùng lúc đó tôi có được hợp đồng với một biên tập viên tại Nhà xuất bản Đại học Cambridge. Họ muốn tiếp tục phát hành một ấn bản kế tiếp. Thật kịp thời!

Kết quả là cuốn sách này, bây giờ đã với tên gọi ngắn gọn hơn: Tư duy trong Python.  Một số sửa đổi bao gồm:

  • Tôi đã thêm vào một mục ở cuối mỗi chương, chuyên về gỡ lỗi. Mục này trình bày những kĩ thuật chung để phát hiện và tránh lỗi khi lập trình, và cảnh báo những bẫy nhỏ trong Python.
  • Tôi lược bỏ một số phần trong những chương cuối, về tạo lập các danh sách và cấu trúc cây. Mặc dù vẫn thích những chủ đề này, nhưng tôi nghĩ rằng chúng không phù hợp với phần còn lại của cuốn sách.
  • Tôi đã thêm vào các bài tập, từ những bài kiểm tra ngắn về độ hiểu bài cho đến một vài chương trình phần mềm thực sự.
  • Tôi bổ sung thêm một loạt các chương trình cụ thể—những ví dụ dài hơn với bài tập, lời giải, và biện luận. Một số trong đó dựa trên Swampy, một bộ chương trình Python mà tôi đã soạn thảo cho quá trình dạy trên lớp. Swampy, mã lệnh, và lời giải được tải lên trang thinkpython.com.
  • Tôi đã mở rộng các kế hoạch xây dựng chương trình và những kiểu mẫu thiết kế cơ bản.
  • Cách dùng của Python trong sách đã dựa vào nhiều điểm đặc thù của ngôn ngữ lập trình này. Dù rằng mục đích chủ yếu của cuốn sách là dạy về lập trình chứ chứ không phải Python, song tôi nghĩ rằng nhờ ngôn ngữ này mà chất lượng cuốn sách đã được nâng cao.

Tôi hi vọng bạn thích đọc cuốn sách này, với mục đích giúp cho bạn học cách lập trình và suy nghĩ theo kiểu một nhà khoa học máy tính.

Allen B. Downey
Needham Massachusett, Hoa Kì.


Nếu đã đọc quyển Think Python, mong bạn dành ra ít phút để biểu quyết nội dung sau. Điều đó rất có ích với việc nâng cao chất lượng bài và chuẩn bị các bản dịch tiếp theo.

Cám ơn bạn!

44 bình luận

Filed under Think Python

44 responses to “Think Python: Cách tư duy như nhà khoa học máy tính

  1. Pingback: Think Stats: Xác suất thống kê dành cho người lập trình | Blog của Chiến

  2. Pingback: Chương 19: Nghiên cứu cụ thể: Tkinter | Blog của Chiến

  3. Pingback: Chương 3: Hàm | Blog của Chiến

  4. Liên kết của mục lục bị lỗi, nó trỏ đến Chương 10. Phải tìm cách mới đọc được các chương, mong tác giả sửa lại.

  5. ba0bab

    cảm ơn bạn nhiều! 😉
    Chúc bạn đầy phúc lạc. 😀

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

  7. Pingback: Chương 6: Các hàm trả lại kết quả | Blog của Chiến

  8. Pingback: Chương 18: Thừa kế | Blog của Chiến

  9. Pingback: Chương 17: Những đặc điểm của lập trình hướng đối tượng | Blog của Chiến

  10. Pingback: Chương 16: Lớp và hàm | Blog của Chiến

  11. Pingback: Chương 15: Lớp và đối tượng | Blog của Chiến

  12. Pingback: Chương 14: File | Blog của Chiến

  13. Pingback: Chương 13: Nghiên cứu cụ thể: lựa chọn cấu trúc dữ liệu | Blog của Chiến

  14. Pingback: Chương 12: Bộ | Blog của Chiến

  15. Pingback: Chương 11: Từ điển | Blog của Chiến

  16. Pingback: Chương 9: Nghiên cứu cụ thể: trò chơi chữ | Blog của Chiến

  17. Pingback: Chương 10: Danh sách | Blog của Chiến

  18. Pingback: Chương 8: Chuỗi kí tự | Blog của Chiến

  19. Pingback: Chương 7: Lặp | Blog của Chiến

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

  21. Pingback: Chương 4: Nghiên cứu cụ thể: thiết kế giao diện | Blog của Chiến

  22. Pingback: Chương 2: Biến, biểu thức và câu lệnh | Blog của Chiến

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

  24. Pingback: Cách nghĩ như nhà khoa học máy tính | Blog của Chiến

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

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

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

  28. Pingback: Phụ lục: Lumpy | Blog của Chiến

  29. vũ cao quý

    ANh có fb không anh,lang thang trên mạng tự nhiên thấy blog của anh,em tự học python mà k có bạn nản quá 😀

  30. Ki Anh Nguyen

    anh ơi có ebook không anh, em muốn down về in ra

  31. hhieu

    #em co code server the nay va 1 code client nhung e ko the cho no chay theo kieu multi client – server a co the giup em duoc ko a
    #server
    from Tkinter import *
    from socket import *
    from threading import *
    from ScrolledText import*
    class Receive():
    def __init__(self, server, gettext):
    #Thread.__init__(self)
    self.server = server
    self.gettext = gettext
    while 1:
    try:
    text = self.server.recv(1024)
    if not text: break
    self.gettext.configure(state=NORMAL)
    self.gettext.insert(END,’client >> %s\n’%text)
    self.gettext.configure(state=DISABLED)
    self.gettext.see(END)
    except:
    break
    class App(Thread):
    server = socket()
    server.bind((‘localhost’, input(“Port: “)))
    server.listen(5)
    client,addr = server.accept()
    def __init__(self, master):
    Thread.__init__(self)
    frame = Frame(master)
    frame.pack()
    self.gettext = ScrolledText(frame, height=10,width=100, state=NORMAL)
    self.gettext.pack()
    sframe = Frame(frame)
    sframe.pack(anchor=’w’)
    self.pro = Label(sframe, text=”Server>>”);
    self.sendtext = Entry(sframe,width=80)
    self.sendtext.focus_set()
    self.sendtext.bind(sequence=””, func=self.Send)
    self.pro.pack(side=LEFT)
    self.sendtext.pack(side=LEFT)
    self.gettext.insert(END,’Welcome to Chat\n’)
    self.gettext.configure(state=DISABLED)
    def Send(self, args):
    self.gettext.configure(state=NORMAL)
    text = self.sendtext.get()
    if text==””: text=” ”
    self.gettext.insert(END,’Me >> %s \n’%text)
    self.sendtext.delete(0,END)
    self.client.send(text)
    self.sendtext.focus_set()
    self.gettext.configure(state=DISABLED)
    self.gettext.see(END)
    def run(self):
    Receive(self.client, self.gettext)
    root = Tk()
    root.title(‘Server Chat’)
    app = App(root).start()
    root.mainloop()

    #client
    from Tkinter import *
    from socket import *
    from threading import *
    from ScrolledText import*
    class Receive():
    def __init__(self, server, gettext):
    self.server = server
    self.gettext = gettext
    while 1:
    try:
    text = self.server.recv(1024)
    if not text: break
    self.gettext.configure(state=’normal’)
    self.gettext.insert(END,’Server >> %s\n’%text)
    self.gettext.configure(state=’disabled’)
    self.gettext.see(END)
    except:
    break
    class App(Thread):
    client = socket()
    client.connect((‘localhost’, input(“Port: “)))
    def __init__(self, master):
    Thread.__init__(self)
    frame = Frame(master)
    frame.pack()
    self.gettext = ScrolledText(frame, height=10,width=100)
    self.gettext.pack()
    self.gettext.insert(END,’Welcome to Chat\n’)
    self.gettext.configure(state=’disabled’)
    sframe = Frame(frame)
    sframe.pack(anchor=’w’)
    self.pro = Label(sframe, text=”Client>>”);
    self.sendtext = Entry(sframe,width=80)
    self.sendtext.focus_set()
    self.sendtext.bind(sequence=””, func=self.Send)
    self.pro.pack(side=LEFT)
    self.sendtext.pack(side=LEFT)
    def Send(self, args):
    self.gettext.configure(state=’normal’)
    text = self.sendtext.get()
    if text==””: text=” ”
    self.gettext.insert(END,’Me >> %s\n’%text)
    self.sendtext.delete(0,END)
    self.client.send(text)
    self.sendtext.focus_set()
    self.gettext.configure(state=’disabled’)
    self.gettext.see(END)
    def run(self):
    Receive(self.client, self.gettext)
    root = Tk()
    root.title(‘Client Chat’)
    app = App(root).start()
    root.mainloop()

  32. HungAku

    Thanks Anh nhieu

  33. vuongsblog

    có phải cuốn này giờ mới dịch xong không anh, trước e thấy nó chỉ đến chương 9

    • Thanh Duong Nguyen

      quyển sách này áp dụng cho python2 hay python3 ạ

      • Ẩn danh

        Quyển này áp dụng cho Python 2. Nhưng về cơ bản chỉ cần chỉnh lại các lệnh in thành hàm print( ) là được.

  34. Ẩn danh

    quyển sách này áp dụng cho python3 hay python2 ạ

  35. Hhj

    Cảm ơn bạn nhiều

  36. Hhj

    Cảm ơn bạn nhiều

Bình luận về bài viết này