ฉบับปรับปรุงครั้งที่ 3 ของ 『Programming: Principles and Practice Using C++』 โดย Stroustrup
(stroustrup.com)- 『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
- PPP Coding Style Guide
- Exercise Material: ระบุว่า TBD
บทของ PPP2 ที่ยังอยู่บนเว็บ
- บางบทของ PPP2 เขียนโดยใช้ C++14 แต่ยังคงถูกต้องและแนะนำหัวข้อเหล่านั้นได้อย่างสมเหตุสมผล
- เอกสาร PPP2 ที่มีให้:
สถานะการแปล
- ยังไม่มีฉบับแปลของ PPP3
- การแปลของฉบับก่อนหน้าสามารถดูได้ที่ book covers page
1 ความคิดเห็น
ความคิดเห็นจาก 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 รายถัดไป
ดังนั้นตอนนี้ต้องเขียน module file ที่เหมาะสมก่อน
importจึงจะทำงานได้ อย่างไรก็ดี การอัปเดต standard C++ library ของ GCC น่าจะใช้เวลาไม่นานนัก ดังนั้นในอนาคตอาจใช้หนังสือเล่มใหม่นี้ได้ทันทีตามที่เขียนไว้สำหรับคนที่รู้ C++ แบบเก่าอยู่แล้วและแค่อยากอัปเดตความรู้ การเขียน module file นั้นเองก็อาจเป็นประสบการณ์เรียนรู้ที่ดี
g++ที่ยกตัวอย่างมาก็น่าจะมีโอกาสทำงานได้ด้วยการจัดการพิเศษของคอมไพเลอร์ หากสักวันมีใครส่ง patch เข้า GCCโดยทั่วไป ถ้าไม่ใช่ตัวอย่างเพื่อการวิจัย วิธีผูกคำสั่ง
g++เองโดยตรงไม่สมจริงอีกต่อไป ภาษา compiled อื่น ๆ ก็ใช้ระบบอย่าง gobuild, cargo, Maven มากกว่าจะไปจับgccgo,rustc,javacโดยตรงhttps://www.kitware.com/import-std-in-cmake-3-30/
ในบท GUI เปลี่ยนจาก FLTK เป็น Qt แล้ว ถือเป็นการเปลี่ยนแปลงใหญ่พอสมควร และน่าจะได้รับเสียงตอบรับดี เพราะ Qt ใช้กันแพร่หลายในอุตสาหกรรม แต่ไม่รู้ว่า learning curve จะเปลี่ยนไปอย่างไร
เลยสงสัยว่าเป็นเพราะมัน cross-platform หรือเพราะในโค้ดที่โมเดลเหล่านี้เรียนรู้มีตัวอย่างการใช้ SFML มากกว่า SFML ดูค่อนข้างใหม่กว่า Qt หรือ FLTK จึงแปลกถ้าจะมีข้อมูลฝึกมากกว่า และก็แปลกที่ทั้ง 4 ตัวเห็นตรงกันว่าถ้าเป็นกราฟิก C++ ให้ใช้ SFML
สิ่งที่ผมชอบในโค้ดของ Stroustrup คือ
using namespace std;ธรรมเนียมที่ต้องใส่std::หน้าแทบทุกอย่างแบบstd::every std::last std::bloody std::thingทำให้คนเป็นบ้าได้using namespaceไม่ว่าจะ namespace ไหนโดยเด็ดขาด เพราะมันสร้าง name collision ที่ namespace ถูกสร้างมาเพื่อหลีกเลี่ยงนั่นแหละแม้ใน implementation file ส่วนตัวก็ไม่ชอบ
using namespace std;ผมมองว่าทำให้ความอ่านง่ายของโค้ดลดลง และเนื้อหาในstd::ใหญ่มากและโตขึ้นเรื่อย ๆ จึงอยากหลีกเลี่ยงโอกาสเกิด name collision เองตั้งแต่ต้นโค้ดเขียนครั้งเดียวแต่อ่านหลายครั้ง ดังนั้นการเลือกชื่อสั้น ๆ รวมถึง namespace ดูเหมือนเป็นทางเลือกที่ไม่ดีในแง่ประสิทธิภาพ
stdเอง สิ่งที่ดูน่าเกลียดคือ double colon::ผมไม่เคยเข้าใจเลยว่าทำไมใช้แค่จุดเดียวเหมือนภาษาอื่น ๆ ไม่ได้แม้จะไม่ได้ใช้ C++ มานานกว่า 10 ปีแล้ว แต่ยังจำได้ว่าเคยศึกษา edition ก่อนหน้าของหนังสือเล่มนี้อย่างลึกซึ้งมาก ทั้งที่ตอนนั้นเพิ่งใช้ C++ แทบจะ 99% ตลอด 4 ปีในมหาวิทยาลัยมาแล้ว
เป็นหนังสือที่ดีจริง ๆ ถ้าใช้เวลาทำความเข้าใจ C++ ในหนังสืออย่างถูกต้อง ก็ถึงขั้นรู้สึกเศร้าเล็กน้อยว่าทำไมโลกถึงหวาดกลัว C++ กันขนาดนั้น
แน่นอนว่าหลังจากนั้นก็ได้เจอคนเป็นกองที่ไม่เคยอ่านหนังสือแบบนี้เลย แล้วเขียน โค้ด C++ ที่น่าสยดสยอง
คิดถึงช่วงที่ทำงานด้วย C++ รู้สึกเหมือนได้ลงไปอยู่ในชั้นที่ต่ำกว่าของ development stack เมื่อเทียบกับสมัยนี้ เมื่อก่อน UI, การ parse API, แทบทุกอย่างทำด้วย C++
คงไม่บอกว่ามันสมบูรณ์แบบ แต่งานสนุก และการได้ทำงานกับคนเก่งระดับสูงที่ทำงานบน stack นั้นได้ก็เป็นเรื่องน่ายินดี ไม่มีมื้อเที่ยงไหนน่าตื่นเต้นเท่าตอนที่ทำให้ build เร็วขึ้นมากด้วยการรัน
distccบน blade server อีกแล้ว และก็ดีใจที่ไม่ได้เป็นผู้ใช้ Linux ตัวยงอยู่คนเดียวในช่วง 1 ปีที่ผ่านมาอ่าน edition 2 ไปเกือบหมดแล้ว เป็นหนังสือที่ยอดเยี่ยมจริง ๆ และช่วยให้ก้าวข้ามกำแพงทางความคิดหลายอย่างที่เคยเจอในการเขียนโปรแกรมมาตลอดหลายปี
เหตุผลหลักที่ edition นี้สั้นลงคือ Part IV: Broadening the View ถูกตัดออกไป ส่วนนี้เคยครอบคลุมหัวข้อเพิ่มเติมอย่างการประมวลผลข้อความ การคำนวณเชิงตัวเลข และระบบฝังตัว ตอนนี้ย้ายไปให้บริการออนไลน์แล้ว บทเหล่านั้นยังเกี่ยวข้องอยู่และใช้ C++11/14 จึงไม่ได้ปรับปรุงใน edition 2
ขอแชร์ C++ Annotations หนังสือที่อัปเดตตาม C++ สมัยใหม่อย่างต่อเนื่องด้วย: http://www.icce.rug.nl/documents/cplusplus/
autoเข้าไปเท่านั้น จะเป็นแนวทางที่ค่อนข้างดีหรือเปล่าเคยได้ยินว่ามีคนแบ่ง C++ ออกเป็นสี่องค์ประกอบ อันแรกคือ “C” อันที่สองคือ object-oriented อันที่สามคือ productivity และ flexibility อย่าง STL กับ template และอันสุดท้ายคือสำหรับสถานการณ์เฉพาะอย่าง
volatile,asmเขาแนะนำให้ใช้ข้อ 1 อย่างระมัดระวัง และหลีกเลี่ยงสถานการณ์ที่ต้องใช้ข้อ 4 เลยสงสัยว่านี่สมเหตุสมผลไหมนึกว่าจะเป็น หนังสือก้อนอิฐ ที่หนากว่านี้ แต่แปลกใจที่ลดลงเหลือครึ่งเดียว
edition 2 เป็น paperback 1312 หน้า หนัก 4.81 ปอนด์ ส่วน edition 3 เป็น paperback 656 หน้า หนัก 2.71 ปอนด์
“Programming: Principles and Practice Using C++” edition 3 มีขนาดประมาณครึ่งหนึ่งของ edition 2 และบอกว่านักศึกษาที่ต้องพกหนังสือไปมาน่าจะยินดีกับน้ำหนักที่เบาลง เหตุผลที่สั้นลงคือมีข้อมูลเกี่ยวกับ C++ และ standard library มากขึ้นบนเว็บ
สงสัยว่าทำไม Bjarne บางทีก็เว้นวรรคหลัง
#includeบางทีก็ไม่เว้นhttps://www.stroustrup.com/PPPheaders.h
ตื่นเต้นจริง ๆ ที่มีเวอร์ชันใหม่ออกมา แม้จะไม่สนใจ C++ หรือเป็นโปรแกรมเมอร์ที่เชี่ยวชาญอยู่แล้ว หนังสือเล่มนี้ก็ควรค่าแก่การอ่าน
เท่าที่ผมรู้ นี่เป็นหนึ่งในตัวอย่างที่ดีที่สุดของการเขียนเชิงเทคนิคและ การสอนเขียนโปรแกรมคอมพิวเตอร์