4 คะแนน โดย GN⁺ 2024-11-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แนะนำหนังสือ

    • มีหนังสือเล่มหนึ่งที่เคยให้ยืมแก่นักศึกษาไว้เป็นหนังสืออ่านช่วงฤดูร้อน
    • หนังสือเล่มนี้เป็นหนึ่งในงานที่สำคัญที่สุดของวิทยาการคอมพิวเตอร์ และส่งอิทธิพลอย่างมากต่อเส้นทางอาชีพและงานวิจัยของผู้เขียน
    • ชื่อหนังสือคือ 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 ความคิดเห็น

 
GN⁺ 2024-11-17
ความเห็นบน 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