1 คะแนน โดย GN⁺ 2024-04-20 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 『Programming: Principles and Practice Using C++』 ฉบับที่ 3 มุ่งเป้าไปที่ผู้อ่านที่เพิ่งเริ่มเรียนการเขียนโปรแกรมเป็นหลัก และยังสามารถใช้เป็นหนังสือปูพื้นฐานสำหรับผู้อ่านที่มีประสบการณ์บ้างแล้ว เพื่อเรียนรู้ C++ สมัยใหม่ รวมถึงสไตล์และเทคนิคที่ดีกว่าเดิม
  • แกนหลักของหนังสือไม่ใช่การท่องจำรายละเอียดไวยากรณ์ของ C++ แต่เป็น หลักการพื้นฐานของการเขียนโปรแกรมและทักษะเชิงปฏิบัติ โดยครอบคลุมทั้งการเขียนโปรแกรมเชิงกระบวนคำสั่ง เชิงวัตถุ และแบบ generic
  • PPP3 มีขนาดลดลงเหลือประมาณ ครึ่งหนึ่ง ของ PPP2 โดยเสริมความแข็งแรงให้บทพื้นฐานที่ใช้ในคอร์สหนึ่งภาคการศึกษา พร้อมสะท้อน C++20·C++23 และโค้ด Graphics/GUI บนพื้นฐาน Qt
  • บทที่เฉพาะทางมากขึ้นและเนื้อหาอ้างอิงล้วน ๆ ถูกย้ายไปไว้บนเว็บเพื่อให้เปิดดูเมื่อจำเป็น และแนวทางคือเสริมข้อมูลอ้างอิงล่าสุดด้วยแหล่งข้อมูลบนเว็บอย่าง cppreference.com
  • มีตัวอย่าง PDF, โมดูลและเฮดเดอร์ PPP, โค้ด Qt GUI, สไลด์การสอน, คู่มือสไตล์การเขียนโค้ด ฯลฯ ให้ใช้ได้ทั้งในการเรียนการสอนและ การศึกษาด้วยตนเอง

เป้าหมายของหนังสือและผู้อ่าน

  • 『Programming: Principles and Practice Using C++ (3rd Edition)』 หรือเรียกย่อว่า PPP3 เป็นหนังสือปูพื้นฐานสำหรับผู้ที่ไม่มีประสบการณ์เขียนโปรแกรม
  • ผู้อ่านที่เคยเขียนโปรแกรมมาบ้างแล้วก็สามารถใช้เป็นสื่อเพื่อปรับปรุงสไตล์และเทคนิค หรือเรียนรู้ C++ สมัยใหม่ ได้
  • หนังสือออกแบบมาสำหรับใช้ในชั้นเรียน แต่ก็เขียนโดยคำนึงถึง การศึกษาด้วยตนเอง ด้วย
  • ฉบับก่อนหน้าเคยถูกใช้ในคอร์สเขียนโปรแกรมแรกสำหรับนักศึกษาวิศวกรรมไฟฟ้า วิศวกรรมคอมพิวเตอร์ และวิทยาการคอมพิวเตอร์ของ Texas A&M University รวมถึงในอีกหลายแห่ง

วิธีสอนการเขียนโปรแกรม

  • หนังสือตั้งเป้าให้ผู้อ่านสุดท้ายสามารถเขียนโปรแกรมที่ดีพอให้ผู้อื่นใช้งานและดูแลรักษาต่อได้
  • จุดเน้นอยู่ที่ แนวคิดและเทคนิคพื้นฐาน มากกว่ารายละเอียดปลีกย่อยเชิงเทคนิคของภาษา
  • โครงสร้างไม่ได้เป็นเพียงหนังสือเริ่มต้นภาษา C++ แต่เป็นหนังสือเริ่มต้นเรื่องการเขียนโปรแกรมโดยทั่วไป
    • การเขียนโปรแกรมเชิงกระบวนคำสั่ง
    • การเขียนโปรแกรมเชิงวัตถุ
    • การเขียนโปรแกรมแบบ generic
  • ครอบคลุมทั้งเทคนิคระดับสูงสมัยใหม่ และเทคนิคระดับต่ำที่จำเป็นต่อการใช้ฮาร์ดแวร์อย่างมีประสิทธิภาพ
  • ให้พื้นฐานสำหรับการเขียนโค้ดที่มีประโยชน์ ถูกต้อง ปลอดภัยด้านชนิดข้อมูล ดูแลรักษาได้ และมีประสิทธิภาพ
  • ครอบคลุมแนวคิดสำคัญ เทคนิคการออกแบบและการเขียนโปรแกรม ฟีเจอร์ของภาษา และไลบรารีอย่างกว้างขวาง

สิ่งที่เปลี่ยนไปในฉบับที่ 3

  • PPP3 มีขนาดประมาณ ครึ่งหนึ่ง เมื่อเทียบกับ PPP2
  • ลดปริมาณเนื้อหาโดยเสริมบทพื้นฐานที่มักครอบคลุมในคอร์สหนึ่งภาคการศึกษาให้แน่นขึ้น
    • ใช้ส่วนสำคัญของ C++20 และ C++23
    • จัดโค้ดในบท Graphics/GUI ใหม่บนพื้นฐาน Qt โดยคำนึงถึงความสามารถในการพอร์ตไปยังสภาพแวดล้อมอย่างเบราว์เซอร์และโทรศัพท์มือถือ
  • บทที่เฉพาะทางมากขึ้น ซึ่งใน PPP2 เรียกว่า “broadening the view” ถูกนำไปไว้บนเว็บเพื่อให้ใช้งานได้เมื่อจำเป็น
  • เนื้อหาอ้างอิงล้วน ๆ ถูกตัดออก
    • สามารถหาข้อมูลที่มากกว่าและทันสมัยกว่าได้บนเว็บ โดยมีการกล่าวถึง cppreference.com เป็นตัวอย่าง

ขอบเขตมาตรฐาน C++ และไลบรารี

  • หนังสือใช้ C++20 และ C++23
  • ครอบคลุมการออกแบบและการใช้งานชนิดข้อมูลในตัวและชนิดข้อมูลที่ผู้ใช้กำหนดเอง
    • อินพุต
    • เอาต์พุต
    • การคำนวณ
    • กราฟิก/GUI แบบง่าย
  • รวมบทนำสู่ คอนเทนเนอร์และอัลกอริทึม ของ C++ Standard Library ด้วย

เอกสารตัวอย่างที่เผยแพร่

  • Preface: ครอบคลุมสิ่งที่หนังสือสัญญาและสิ่งที่ไม่ได้สัญญา
  • Table of Contents: PDF สารบัญ
  • Chapter 0: Notes to the Reader: แนวทางการอ่านของหนังสือ
  • Chapter 10: A Display Model: บทตัวอย่าง
    • ผู้เริ่มต้นแบบสมบูรณ์ยังไม่ควรอ่านบทนี้
    • เป็นบทที่ตั้งใจให้ครูและผู้อ่านที่มีประสบการณ์เห็นระดับที่หนังสือไปถึงราวสัปดาห์ที่ 5 เมื่อเรียนในอัตราประมาณ 2 บทต่อสัปดาห์
    • มีจุดประสงค์เพื่อแสดงส่วนหนึ่งของ C++ สมัยใหม่ด้วย

เอกสารสนับสนุนและโค้ด

  • Links: ลิงก์ไปยัง implementation ของ C++ และสภาพแวดล้อมการพัฒนา พร้อมคำแนะนำสั้น ๆ สำหรับการเริ่มต้น
  • How to use modules?: รวมวิธีใช้ PPP_support.h เพื่อ build module PPP
  • module PPP: โมดูล PPP สำหรับใช้เมื่อสามารถใช้โมดูลได้
  • header "PPP.h": เฮดเดอร์สำหรับใช้งานโมดูล std และ PPP ได้ง่ายที่สุด
  • header "PPPheaders.h": เฮดเดอร์สำหรับใช้เมื่อจำเป็นต้องกลับไปใช้ไฟล์เฮดเดอร์
  • GUI support: รวมไลบรารีอินเทอร์เฟซผู้ใช้ Graphics/GUI สำหรับบทที่ 10–14 ของ PPP3
    • ต้องติดตั้ง Qt เพื่อรัน
    • มี The User Manual ให้ด้วย
  • Sample code from the various chapters: โค้ดตัวอย่างจากหลายบท ระบุว่า TBD
  • Errata: รายการแก้ไขข้อผิดพลาด
  • Lectures based on PPP: สไลด์การบรรยายที่อัปเดตสำหรับ PPP3

บทของ PPP2 ที่ยังอยู่บนเว็บ

สถานะการแปล

  • ยังไม่มีฉบับแปลของ PPP3
  • การแปลของฉบับก่อนหน้าสามารถดูได้ที่ book covers page

1 ความคิดเห็น

 
GN⁺ 2024-04-20
ความคิดเห็นจาก Hacker News
  • ผมมองว่าการที่ “โปรแกรมแรกแบบคลาสสิก” ของหนังสือเล่มนี้ใช้ import std; ตั้งแต่บรรทัดแรกเป็นปัญหาพอสมควร เท่าที่รู้ ไม่มีคอมไพเลอร์ไหนรองรับได้ดีในสถานะเริ่มต้น ยกเว้นประมาณ MSVC
    บน Debian แม้ใช้ g++ --std=c++23 -fmodules-ts ก็ไม่ได้ และถ้าดู https://en.cppreference.com/w/cpp/23 ข้อเสนอที่เกี่ยวข้องคือ P2465R3 แต่ clang++ 17 ก็ยัง “รองรับบางส่วน” แม้ติดตั้ง clang++17 ก็ยังได้ข้อความ module 'std' not found
    เข้าใจว่า import std; เป็นฟีเจอร์ใหม่มาก แต่หนังสือเล่มนี้เป็น สำหรับผู้เริ่มต้น C++ เลยสงสัยว่ามือใหม่โดยเฉลี่ยจะตอบสนองอย่างไร ตอนอ่าน “Tour of C++” เมื่อ 1–2 ปีก่อนก็เจอปัญหาเดียวกัน

    • เป็นข้อสังเกตที่ดี และผมก็เจอแบบเดียวกัน g++ ของผมก็แสดงข้อผิดพลาดและคำแนะนำเหมือนกันเป๊ะ
      ผมยังไม่ได้อ่านฉบับล่าสุดของ Stroustrup ที่กำลังพูดถึงกันอยู่ แต่เคยอ่านฉบับเก่าตอนที่ยังใช้ C++ ทุกวัน แม้ผ่านไป 20 ปีแล้ว ตอนนี้ก็ยังชอบ Accelerated C++ ของ Koenig และ Moo มากกว่า อาจมีหนังสือที่ดีกว่านี้ออกมาทีหลังก็ได้ แต่ผมยังไม่ได้อ่าน
      เท่าที่จำได้ Hello World ในหนังสือเล่มนั้นเป็นรูปแบบอย่าง #include, int main(), std::cout << "Hello, world!" << std::endl; และแม้ตอนนี้บน Arch Linux ก็ยัง build ด้วย g++ a.cpp แล้วรัน ./a.out ได้ตามเดิม
      โครงสร้างของหนังสือทั้งเล่มยอดเยี่ยมมาก เลียนแบบสไตล์ C++ สมัยใหม่ที่เรียบง่ายและสะอาดจนแทบเหมือน pseudocode โดยไม่ต้องใช้ pointer arithmetic ของ C คล้ายกับความเรียบร้อยของ Python ยุคแรก ๆ ซึ่งฝั่ง Python ก็ยังไม่มีองค์ประกอบแบบนั้น จนกระทั่งภายหลัง pandas ดึงไลบรารีที่ wrap C++ อย่าง numpy และ scipy เข้ามา
      ในงานจริง ผมแทบไม่เคยเห็นโค้ด C++ ที่สะอาดเลย ไม่ได้ทำงานที่ FAANG และในงาน prototype เร็ว ๆ ก็แทบไม่มี code review เลยไม่รู้ว่าแนวทางการสอนแบบ Koenig และ Moo แพร่หลายนอกโลก greenfield ที่ผมเจอมามากแค่ไหน อาจมีข้อยกเว้นในที่อย่างวงการรังสีรักษา ซึ่งไม่อยากกลายเป็น Therac-25 รายถัดไป
    • เอกสาร GCC 13.2.1 ปัจจุบันบอกว่า standard library ไม่ได้ถูกจัดเตรียมมาเป็น header unit ที่ import ได้ หากต้องการ import unit แบบนั้น ต้อง build อย่างชัดเจนก่อน และถ้าไม่ระวัง อาจเกิด declaration ซ้ำที่ระบบ module ต้อง merge กัน ทำให้การใช้ทรัพยากรของคอมไพเลอร์ได้รับผลจากวิธีแบ่ง header file
      ดังนั้นตอนนี้ต้องเขียน module file ที่เหมาะสมก่อน import จึงจะทำงานได้ อย่างไรก็ดี การอัปเดต standard C++ library ของ GCC น่าจะใช้เวลาไม่นานนัก ดังนั้นในอนาคตอาจใช้หนังสือเล่มใหม่นี้ได้ทันทีตามที่เขียนไว้
      สำหรับคนที่รู้ C++ แบบเก่าอยู่แล้วและแค่อยากอัปเดตความรู้ การเขียน module file นั้นเองก็อาจเป็นประสบการณ์เรียนรู้ที่ดี
    • ตอนนี้การดูแลโปรแกรม C++ ที่น่าสนใจโดยไม่มี build system ไม่ใช่เรื่องสมจริงแล้ว ถึงอย่างนั้น คำสั่ง g++ ที่ยกตัวอย่างมาก็น่าจะมีโอกาสทำงานได้ด้วยการจัดการพิเศษของคอมไพเลอร์ หากสักวันมีใครส่ง patch เข้า GCC
      โดยทั่วไป ถ้าไม่ใช่ตัวอย่างเพื่อการวิจัย วิธีผูกคำสั่ง g++ เองโดยตรงไม่สมจริงอีกต่อไป ภาษา compiled อื่น ๆ ก็ใช้ระบบอย่าง gobuild, cargo, Maven มากกว่าจะไปจับ gccgo, rustc, javac โดยตรง
      https://www.kitware.com/import-std-in-cmake-3-30/
    • เอกสารนี้ที่อ้างถึงในหน้าหนังสืออาจช่วยเรื่อง ปัญหา module ได้: https://www.stroustrup.com/module_use.html
  • ในบท GUI เปลี่ยนจาก FLTK เป็น Qt แล้ว ถือเป็นการเปลี่ยนแปลงใหญ่พอสมควร และน่าจะได้รับเสียงตอบรับดี เพราะ Qt ใช้กันแพร่หลายในอุตสาหกรรม แต่ไม่รู้ว่า learning curve จะเปลี่ยนไปอย่างไร

    • อยากรู้ว่า Stroustrup คิดอย่างไรกับ Meta Object Compiler ในบางแง่ Qt ให้ความรู้สึกเหมือนเป็น dialect ของ C++ เอง
    • ผมมองว่าเป็นทางที่ดีขึ้น เพราะ Qt มี Qt Creator
    • เนื่องจากใช้ไลบรารี wrapper ที่กำหนดเอง เลยไม่แน่ใจว่า Qt จริง ๆ ถูกเปิดเผยออกมามากแค่ไหน
    • ผมลองให้ AI coding assistant 4 ตัวที่เคยใช้ (claude3, gemini, gpt4, deepseek) เขียน boids และ Game of Life ด้วย C++ ทุกตัวใช้ SFML สำหรับกราฟิก
      เลยสงสัยว่าเป็นเพราะมัน cross-platform หรือเพราะในโค้ดที่โมเดลเหล่านี้เรียนรู้มีตัวอย่างการใช้ SFML มากกว่า SFML ดูค่อนข้างใหม่กว่า Qt หรือ FLTK จึงแปลกถ้าจะมีข้อมูลฝึกมากกว่า และก็แปลกที่ทั้ง 4 ตัวเห็นตรงกันว่าถ้าเป็นกราฟิก C++ ให้ใช้ SFML
  • สิ่งที่ผมชอบในโค้ดของ Stroustrup คือ using namespace std; ธรรมเนียมที่ต้องใส่ std:: หน้าแทบทุกอย่างแบบ std::every std::last std::bloody std::thing ทำให้คนเป็นบ้าได้

    • แล้วแต่กรณี ใน header file ห้ามใส่ using namespace ไม่ว่าจะ namespace ไหนโดยเด็ดขาด เพราะมันสร้าง name collision ที่ namespace ถูกสร้างมาเพื่อหลีกเลี่ยงนั่นแหละ
      แม้ใน implementation file ส่วนตัวก็ไม่ชอบ using namespace std; ผมมองว่าทำให้ความอ่านง่ายของโค้ดลดลง และเนื้อหาใน std:: ใหญ่มากและโตขึ้นเรื่อย ๆ จึงอยากหลีกเลี่ยงโอกาสเกิด name collision เองตั้งแต่ต้น
      โค้ดเขียนครั้งเดียวแต่อ่านหลายครั้ง ดังนั้นการเลือกชื่อสั้น ๆ รวมถึง namespace ดูเหมือนเป็นทางเลือกที่ไม่ดีในแง่ประสิทธิภาพ
    • การไม่มี name collision เป็นเรื่องดี แต่ยังไงก็ตาม ภาษาอื่น ๆ ก็แก้ปัญหานี้ได้
    • ถ้า C++ modules เข้าที่เข้าทางแล้ว เรื่องนี้ก็คงไม่ใช่ประเด็นถกเถียงอีกต่อไปไม่ใช่หรือ
    • มากกว่า std เอง สิ่งที่ดูน่าเกลียดคือ double colon :: ผมไม่เคยเข้าใจเลยว่าทำไมใช้แค่จุดเดียวเหมือนภาษาอื่น ๆ ไม่ได้
    • ดูเหมือนจะเรียนเขียนโปรแกรมบน Windows มา
  • แม้จะไม่ได้ใช้ C++ มานานกว่า 10 ปีแล้ว แต่ยังจำได้ว่าเคยศึกษา edition ก่อนหน้าของหนังสือเล่มนี้อย่างลึกซึ้งมาก ทั้งที่ตอนนั้นเพิ่งใช้ C++ แทบจะ 99% ตลอด 4 ปีในมหาวิทยาลัยมาแล้ว
    เป็นหนังสือที่ดีจริง ๆ ถ้าใช้เวลาทำความเข้าใจ C++ ในหนังสืออย่างถูกต้อง ก็ถึงขั้นรู้สึกเศร้าเล็กน้อยว่าทำไมโลกถึงหวาดกลัว C++ กันขนาดนั้น
    แน่นอนว่าหลังจากนั้นก็ได้เจอคนเป็นกองที่ไม่เคยอ่านหนังสือแบบนี้เลย แล้วเขียน โค้ด C++ ที่น่าสยดสยอง

  • คิดถึงช่วงที่ทำงานด้วย C++ รู้สึกเหมือนได้ลงไปอยู่ในชั้นที่ต่ำกว่าของ development stack เมื่อเทียบกับสมัยนี้ เมื่อก่อน UI, การ parse API, แทบทุกอย่างทำด้วย C++

    • เคยคิดถึง Fortran อยู่พักหนึ่ง แต่พอลองเขียนสัก 30 นาทีก็หายทันที ลอง parse JSON ด้วย C++ สักครั้ง แล้วดูว่าความคิดถึงจะทนผ่านกระบวนการนั้นได้ไหม
    • ผมก็คิดถึงมากเหมือนกัน มันก็ไม่ได้ผ่านมานานขนาดนั้น มีแอปที่ทั้ง client และ server เป็น C++ และ UI, API ทุกอย่างก็เป็น C++ รู้สึกจริง ๆ เหมือน ภาษาอเนกประสงค์ มาถึงแล้ว
      คงไม่บอกว่ามันสมบูรณ์แบบ แต่งานสนุก และการได้ทำงานกับคนเก่งระดับสูงที่ทำงานบน stack นั้นได้ก็เป็นเรื่องน่ายินดี ไม่มีมื้อเที่ยงไหนน่าตื่นเต้นเท่าตอนที่ทำให้ build เร็วขึ้นมากด้วยการรัน distcc บน blade server อีกแล้ว และก็ดีใจที่ไม่ได้เป็นผู้ใช้ Linux ตัวยงอยู่คนเดียว
    • ที่บริษัทเรา แทบทุกอย่างยกเว้น UI เป็น C++ เหตุผลเดียวที่ UI ไม่ใช่ C++ น่าจะเป็นเพื่อเหลือ ส่วนหนึ่งของ codebase ไว้ให้บัณฑิตจบใหม่เริ่มทำงานได้ทันที ก่อนจะได้รับการฝึก C++
    • เพื่อดับความกระหาย C++ ผมยังค่อย ๆ แตะ game engine เป็นโปรเจกต์ส่วนตัวอยู่ แม้จะมีคำวิจารณ์สารพัด แต่ผมชอบใช้ C++ จริง ๆ
    • ขอแค่ ไม่ต้องทำงานด้วย Python ก็พอ
  • ในช่วง 1 ปีที่ผ่านมาอ่าน edition 2 ไปเกือบหมดแล้ว เป็นหนังสือที่ยอดเยี่ยมจริง ๆ และช่วยให้ก้าวข้ามกำแพงทางความคิดหลายอย่างที่เคยเจอในการเขียนโปรแกรมมาตลอดหลายปี
    เหตุผลหลักที่ edition นี้สั้นลงคือ Part IV: Broadening the View ถูกตัดออกไป ส่วนนี้เคยครอบคลุมหัวข้อเพิ่มเติมอย่างการประมวลผลข้อความ การคำนวณเชิงตัวเลข และระบบฝังตัว ตอนนี้ย้ายไปให้บริการออนไลน์แล้ว บทเหล่านั้นยังเกี่ยวข้องอยู่และใช้ C++11/14 จึงไม่ได้ปรับปรุงใน edition 2

  • ขอแชร์ C++ Annotations หนังสือที่อัปเดตตาม C++ สมัยใหม่อย่างต่อเนื่องด้วย: http://www.icce.rug.nl/documents/cplusplus/

    • สงสัยว่าสำหรับโปรเจกต์ emulator การใช้ C ที่มี class แล้วเพิ่ม smart pointer กับ auto เข้าไปเท่านั้น จะเป็นแนวทางที่ค่อนข้างดีหรือเปล่า
      เคยได้ยินว่ามีคนแบ่ง C++ ออกเป็นสี่องค์ประกอบ อันแรกคือ “C” อันที่สองคือ object-oriented อันที่สามคือ productivity และ flexibility อย่าง STL กับ template และอันสุดท้ายคือสำหรับสถานการณ์เฉพาะอย่าง volatile, asm เขาแนะนำให้ใช้ข้อ 1 อย่างระมัดระวัง และหลีกเลี่ยงสถานการณ์ที่ต้องใช้ข้อ 4 เลยสงสัยว่านี่สมเหตุสมผลไหม
    • ขึ้น 404
  • นึกว่าจะเป็น หนังสือก้อนอิฐ ที่หนากว่านี้ แต่แปลกใจที่ลดลงเหลือครึ่งเดียว
    edition 2 เป็น paperback 1312 หน้า หนัก 4.81 ปอนด์ ส่วน edition 3 เป็น paperback 656 หน้า หนัก 2.71 ปอนด์

    • ดูจากคำนำแล้วเหมือนจะเอาเนื้อหาอ้างอิงจำนวนมากออกจากหนังสือ แล้วย้ายไปไว้ใน เอกสาร C++ บนอินเทอร์เน็ต
      “Programming: Principles and Practice Using C++” edition 3 มีขนาดประมาณครึ่งหนึ่งของ edition 2 และบอกว่านักศึกษาที่ต้องพกหนังสือไปมาน่าจะยินดีกับน้ำหนักที่เบาลง เหตุผลที่สั้นลงคือมีข้อมูลเกี่ยวกับ C++ และ standard library มากขึ้นบนเว็บ
    • ชอบที่นับความรู้ C++ เป็นหน่วยปอนด์
    • ตามตัวอักษรคือครึ่งหนึ่งพอดีเลย สงสัยว่าเลือกฟอนต์เล็กลงหรือเปล่า
  • สงสัยว่าทำไม Bjarne บางทีก็เว้นวรรคหลัง #include บางทีก็ไม่เว้น
    https://www.stroustrup.com/PPPheaders.h

    • ถ้ามี header ที่พิมพ์ด้วยมือปนกับ header ที่ IDE แทรกให้อัตโนมัติ แล้วตั้งค่าให้พับ import เป็นค่าเริ่มต้น หรือไม่ได้รัน clang-format ตอนบันทึก ก็อาจหลุดสายตาได้
  • ตื่นเต้นจริง ๆ ที่มีเวอร์ชันใหม่ออกมา แม้จะไม่สนใจ C++ หรือเป็นโปรแกรมเมอร์ที่เชี่ยวชาญอยู่แล้ว หนังสือเล่มนี้ก็ควรค่าแก่การอ่าน
    เท่าที่ผมรู้ นี่เป็นหนึ่งในตัวอย่างที่ดีที่สุดของการเขียนเชิงเทคนิคและ การสอนเขียนโปรแกรมคอมพิวเตอร์