-
แนะนำหนังสือ
- มีหนังสือเล่มหนึ่งที่เคยให้ยืมแก่นักศึกษาไว้เป็นหนังสืออ่านช่วงฤดูร้อน
- หนังสือเล่มนี้เป็นหนึ่งในงานที่สำคัญที่สุดของวิทยาการคอมพิวเตอร์ และส่งอิทธิพลอย่างมากต่อเส้นทางอาชีพและงานวิจัยของผู้เขียน
- ชื่อหนังสือคือ Hal Abelson และ Jerry Sussman เขียน Structure and Interpretation of Computer Programs (SICP)
-
ความสำคัญของหนังสือ
- หนังสือเล่มนี้สร้างอิทธิพลอย่างมากเมื่อเริ่มทำความรู้จักกับวิทยาการคอมพิวเตอร์
- หนังสือแนะนำองค์ประกอบพื้นฐานของการเขียนโปรแกรมและสำรวจหัวข้อต่าง ๆ ที่หลากหลาย
- หัวข้อประกอบด้วย lambda abstraction, การคำนวณลำดับสูง, โครงสร้างข้อมูลที่ซับซ้อน, modularity, stream, lazy evaluation, การสร้าง interpreter และ compiler, การจัดการหน่วยเก็บข้อมูล เป็นต้น
-
แนวทางการออกแบบภาษา
- Hal และ Jerry มองทุกอย่างเป็นแบบฝึกหัดของการออกแบบภาษา
- หนังสือแนะนำแนวคิดการจัดโครงสร้างระบบที่ซับซ้อนด้วยการออกแบบแบบเป็นชั้น
- แต่ละชั้นถูกสร้างขึ้นโดยการผสานส่วนที่ถือเป็น primitive ในชั้นนั้นเข้าด้วยกัน
-
แก่นแท้ของวิทยาการคอมพิวเตอร์
- การปฏิวัติคอมพิวเตอร์คือการปฏิวัติของวิธีคิดและวิธีการแสดงออก
- หนังสือแนะนำแนวคิด procedural epistemology ซึ่งเป็นการศึกษาการจัดโครงสร้างความรู้จากมุมมองเชิงคำสั่ง
- วิทยาการคอมพิวเตอร์มอบกรอบความคิดสำหรับคำถามว่า "อย่างไร"
-
ความร่วมสมัยที่ยืนยาวของหนังสือ
- หนังสือเล่มนี้ที่ซื้อในปี 1988 ยังคงมีความเกี่ยวข้องมาจนถึงทุกวันนี้
- เป็นหนึ่งในไม่กี่เล่มในวิทยาการคอมพิวเตอร์ที่ยังทรงคุณค่าแม้เวลาจะผ่านไป
- คล้ายกับ Lectures on Physics ของ Feynman ตรงที่ถ่ายทอดแก่นแท้ของวิทยาการคอมพิวเตอร์ได้อย่างยอดเยี่ยม
-
อัปเดต
- อัปเดตเมื่อวันที่ 27 มกราคม 2024
- หนังสือเล่มนี้ยังถูกรวมอยู่ในบรรณานุกรมอ้างอิง Lisp แบบมีคำอธิบายประกอบด้วย
1 ความคิดเห็น
ความเห็นบน Hacker News
สามารถเรียนเนื้อหาในหนังสือได้จากวิดีโอบรรยายปี 1986 ของ Abelson และ Sussman คำอธิบายของทั้งคู่เรื่องการจัดลำดับชั้นของ abstraction มีประโยชน์สำหรับผมทั้งในฐานะผู้เรียนและเมนเทอร์
ตำราคลาสสิกอย่าง SICP พูดถึงการออกแบบโปรแกรม แต่ทุกวันนี้ผมคิดว่าการออกแบบระบบสำคัญกว่า ไม่แน่ใจว่าระบบแบบกระจายจะถือเป็นส่วนหนึ่งของวิทยาการคอมพิวเตอร์หรือไม่ แต่เป็นปัญหาทั่วไปที่ต้องแก้ ผมจะเขียนระบบให้เรียบง่ายที่สุด ใช้เครื่องมือสังเกตการณ์เพื่อหาข้อบกพร่องของการออกแบบ แล้วค่อยใช้โครงสร้างข้อมูลหรือวิธีเชิงวิทยาการคอมพิวเตอร์อื่น ๆ มาแก้ปัญหา ในกรณีส่วนใหญ่ Big O notation และ runtime complexity ไม่ได้สำคัญนัก เพราะอาร์เรย์กับ CPU ที่เร็วสามารถแก้ปัญหาส่วนใหญ่ได้ ถ้ามีปัญหาเรื่อง runtime ก็ควร profile โปรแกรมเพื่อหา hotspot วิทยาการคอมพิวเตอร์ไม่ได้สอนว่าการทำงานของ memory cache ของ CPU เป็นอย่างไร อัลกอริทึมกราฟเท่ ๆ อาจมี runtime complexity ที่ดี แต่กลับทำลาย CPU cache ไปหมด ทั้งที่อาจทำได้เร็วกว่าโดยใช้อาร์เรย์ ปัญหาที่ทั่วไปกว่าคือ fault tolerance, ความถูกต้องของ distributed lock และคิว รวมถึง scalability ของระบบ อาจเป็นเพราะผมมีพื้นฐานด้านวิศวกรรมคอมพิวเตอร์/ไฟฟ้าเลยมีอคติแบบนี้
ลิงก์ไปยังสำเนาฟรีเสียแล้ว ราวปี 2001 มีให้ใช้ฟรีแค่เวอร์ชัน HTML และมีคนหนึ่งแปลงมันเป็น TeXinfo ถ้าอยากศึกษา SICP ทุกวันนี้ ก็สามารถรันโค้ดได้บน MIT Scheme หรือ DrRacket
"The Elements of Programming Style" คุ้มค่าที่จะอ่านสามรอบ และผมก็ได้ประโยชน์มากจากการอ่านมากกว่านั้น อ้างอิงรีวิวปี 2010 ได้
ผมอยากชอบ SICP แต่รู้สึกว่า Lisp ยาก ผมชอบ Haskell กับ Standard ML เลยสงสัยว่าคนอื่นมีประสบการณ์คล้ายกันไหม น่าสนใจถ้าจะอ่านหนังสือที่มีแนวคิดแบบเดียวกับ SICP แต่ใช้ภาษาอื่น ผมไม่อยากเรียน SICP ด้วย JavaScript
อยากรู้ว่าคนอื่นคิดเห็นอย่างไรกับ "Software Design for Flexibility: How to Avoid Programming Yourself into a Corner"
SICP ช่วยให้ผมเข้าใจว่ามีโมเดลการเขียนโปรแกรมที่หลากหลาย หนังสือเล่มนี้ช่วยให้ผมอ่านเอกสารของภาษา ไลบรารี และเฟรมเวิร์กแล้วจับทิศทางได้
ผมเขียนโปรแกรมมา 25 ปี และมีหนังสือเล่มนี้อยู่ราว 10 ปี เพิ่งเริ่มจริงจังกับ Dr. Racket ไม่นานนี้ ข้อดีของ Dr. Racket คือเมื่อเอาเมาส์ไปชี้บนตัวแปร จะมองเห็นความเชื่อมโยงกับตำแหน่งอื่นในโค้ดได้แบบภาพ แต่ก็แอบขัดใจนิดหน่อยที่มันไม่ใช่ VS Code เลยจัดสภาพแวดล้อมให้ใช้ VS Code (จริง ๆ คือ Cursor) แก้แบบฝึกหัดได้ การรวมเข้ากับ LLM นั้นเจ๋งมาก เพราะผมสามารถให้ทั้งโค้ดและคำอธิบายที่เขียนเองแล้วขอฟีดแบ็กได้ ผมทำแบบฝึกหัดไปได้เล็กน้อย แล้วก็เอาโค้ด คำตอบที่เขียนไว้ และฟีดแบ็กจาก LLM มาทำเป็น static site เป็นวิธีฆ่าเวลาที่สนุกดี ผมคงไม่เข้าใจ SICP ได้ครบถ้วนหากไม่มีความช่วยเหลือจาก LLM แต่ก็น่าสนใจที่จะเห็นวิธีผสาน LLM เข้ากับการฝึกฝน
ในการอ่านรอบที่สอง ผมเริ่มไปสำรวจเชิงอรรถและบรรณานุกรม แล้วพบว่ามีโลกที่งดงามอยู่ มีบทความที่ Sussman และทีมออกแบบโปรเซสเซอร์แบบตั้งโปรแกรมได้เฉพาะทางเพื่อคำนวณคุณสมบัติของวัตถุท้องฟ้า น่าทึ่งเสมอ
ให้ลิงก์ทั้งเวอร์ชันต้นฉบับและเวอร์ชัน JavaScript