4 คะแนน โดย GN⁺ 2025-10-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • บทความนี้เสนอ รายวิชาวิทยาการคอมพิวเตอร์เชิงเสียดสีที่สมจริงซึ่งนักพัฒนาซอฟต์แวร์ควรได้เรียน แม้ว่าจะไม่มีอยู่จริงก็ตาม
  • แต่ละวิชาเปิดโปง ปัญหาในวัฒนธรรมการพัฒนาสมัยใหม่หรือกรอบความคิดที่มีอคติ อย่างมีวิจารณญาณ
  • ตัวอย่างเช่น ความศรัทธาแบบไม่ลืมหูลืมตาต่อกระบวนทัศน์เชิงวัตถุ การมองข้าม UX ของเครื่องมือ command line หรือความเข้าใจผิดเรื่องประสิทธิภาพของภาษาที่ช้า
  • ยังมีวิชาที่พูดถึง ความยึดติดทางจิตใจและนิสัยที่ไม่ก่อให้เกิดผลิตภาพ ของนักพัฒนาอีกด้วย
  • โดยรวมแล้ว บทความนี้นำเสนอ ข้อจำกัดของการศึกษาวิทยาการคอมพิวเตอร์และความจำเป็นของการทบทวนตนเองในวัฒนธรรมการพัฒนา อย่างมีอารมณ์ขัน

CSCI 2100: ลืมการเขียนโปรแกรมเชิงวัตถุเสียบ้าง

  • วิชานี้เป็นการเรียนรู้ แนวคิดของตัวแปรและฟังก์ชันที่ไม่ได้อยู่ในลำดับชั้นของอ็อบเจ็กต์
    • ก้าวออกจากกรอบคิดที่ยึด object-oriented เป็นศูนย์กลาง แล้วสำรวจความยืดหยุ่นและความเรียบง่ายของ functional programming
    • แนะนำ “function” ให้เป็น แนวคิดที่ทั่วไปกว่าและนำกลับมาใช้ซ้ำได้มากกว่า “method”
  • วิชาบังคับก่อนคือวิชาใดก็ตามที่เคยใช้คำว่า “abstract base class”
  • มีเป้าหมายเพื่อ รื้อถอนการพึ่งพากระบวนทัศน์เชิงวัตถุมากเกินไป และจัดวางวิธีคิดพื้นฐานของการเขียนโปรแกรมขึ้นใหม่

CSCI 3300: การศึกษาซอฟต์แวร์คลาสสิก

  • วิชาที่ วิเคราะห์และอภิปรายผลิตภัณฑ์ซอฟต์แวร์สำคัญในเชิงประวัติศาสตร์
    • ตัวอย่างที่นำมาศึกษาได้แก่ VisiCalc, AppleWorks, Robot Odyssey, Zork, MacPaint
  • เน้นที่ ส่วนติดต่อผู้ใช้ (UI) และ ผลกระทบของข้อจำกัดด้านฮาร์ดแวร์ต่อความคิดสร้างสรรค์
  • ใช้นวัตกรรมที่ถือกำเนิดขึ้นท่ามกลางข้อจำกัดในอดีต เพื่อย้อนมอง หลักการพื้นฐานของการออกแบบซอฟต์แวร์สมัยใหม่ อีกครั้ง

CSCI 4020: เขียนโค้ดให้เร็วด้วยภาษาที่ช้า

  • ว่าด้วยวิธีเขียนโค้ดประสิทธิภาพสูงด้วย ภาษาแบบ interpreter (เช่น Python)
    • สำรวจกลยุทธ์ในการทำ performance analysis ในระดับสูง และไปให้ถึง ประสิทธิภาพระดับ C++
  • มุ่งให้ได้ทั้ง การลดความเปราะบางของโค้ดและการคงความสนุกในการพัฒนา
  • เป็นวิชาที่ท้าทายความเชื่อว่า “ภาษาที่ช้าก็ช้าอยู่วันยังค่ำ” และแสดงให้เห็น ความเป็นไปได้ในการปรับให้เหมาะสมทั้งที่ระดับการออกแบบภาษาและสภาพแวดล้อมการรัน

CSCI 2170: ประสบการณ์ผู้ใช้ (UX) ของเครื่องมือ command line

  • วิชาเบื้องต้นว่าด้วย หลักการออกแบบประสบการณ์ผู้ใช้ของโปรแกรมแบบ command line
    • ให้ความสำคัญกับ ความเกี่ยวข้อง ความอ่านง่าย และความกระชับของผลลัพธ์ที่แสดงออกมา
  • ใช้คำสั่ง ls ของ UNIX เป็นกรณีศึกษาในการวิเคราะห์ ปัญหาของตัวเลือกที่มากเกินไปและอินเทอร์เฟซที่ซับซ้อน
  • เน้นว่าเครื่องมือ command line เองก็ต้องการ การออกแบบที่ยึดผู้ใช้เป็นศูนย์กลาง ไม่ต่างจาก graphical UI

PSYC 4410: จิตวิทยาแห่งความยึดติดของโปรแกรมเมอร์

  • สำรวจ ความยึดติดที่ไม่ก่อให้เกิดผลิตภาพและรูปแบบความคิดแบบย้ำคิดย้ำทำ ที่นักพัฒนาซอฟต์แวร์มักตกอยู่ในนั้น
    • เช่น การจัดรูปแบบโค้ด ระบบการจัดหมวดหมู่ (taxonomy) type system การแยกไฟล์ยิบย่อยเกินไป เป็นต้น
  • วิเคราะห์ในเชิงจิตวิทยาถึง ปฏิกิริยาวิจารณ์แบบฉับพลัน (knee-jerk criticism) เมื่อเจอกับระบบที่ไม่คุ้นเคย
  • เป็นวิชาที่ช่วยทำความเข้าใจ อคติทางการรับรู้และแนวโน้มแบบสมบูรณ์นิยม ของนักพัฒนา พร้อมค้นหาสมดุลระหว่างการทำงานร่วมกันกับความคิดสร้างสรรค์

บริบทโดยรวม

  • รายการนี้ไม่ใช่แผนการสอนจริง แต่เป็น การวิจารณ์เชิงเสียดสีต่อการศึกษาวิทยาการคอมพิวเตอร์และวัฒนธรรมการพัฒนา
  • แต่ละวิชาเผยให้เห็น จุดบอดของวิธีคิดที่ยึดเทคโนโลยีเป็นศูนย์กลาง และกระตุ้นให้นักพัฒนา คิดอย่างยืดหยุ่นและทบทวนตนเอง
  • แม้จะเป็นโพสต์จากปี 2015 แต่ก็ยังสะท้อน ประเด็นปัญหาที่ใช้ได้อยู่จนถึงปัจจุบัน

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

 
GN⁺ 2025-10-25
ความเห็นจาก Hacker News
  • CSCI 3300: Classical Software Studies
    สิ่งที่ Alan Kay เน้นย้ำมาหลายทศวรรษคือ พวกเรายังคง ประดิษฐ์สิ่งเดิมขึ้นมาใหม่ ทั้งที่แนวคิดเหล่านั้นถูกวางรากฐานไว้ตั้งแต่ช่วงปลายยุค 70 แล้ว
    ผมเห็นด้วยกับความผิดหวังของเขาที่ว่า โปรแกรมเมอร์ก็ควรเรียนรู้ประวัติศาสตร์ของวิทยาการคอมพิวเตอร์ เหมือนที่ศิลปินเรียนประวัติศาสตร์ศิลปะ

    • ตอนที่ผมเรียนอยู่ที่ RIT มีวิชาเลือกชื่อ ‘History of Computing’ ครอบคลุมตั้งแต่ลูกคิดไปจนถึงเมนเฟรมและเครือข่าย และตอนนี้ก็ยังมีโน้ตการสอนเหลืออยู่
    • ประวัติศาสตร์ของศิลปะหรือปรัชญากินเวลานับพันปี แต่ประวัติศาสตร์ของคอมพิวติงมีแค่ราว หนึ่งชั่วอายุคน หรือสองสามชั่วอายุคนเท่านั้น
      ผมคิดว่าการนำคอมพิวติงซึ่งพึ่งพาสมรรถนะของฮาร์ดแวร์จริง ๆ ไปเทียบกับศิลปะนั้นค่อนข้างฝืน
      การมองว่าวิธีแก้ปัญหาในปี 1970 จะยังใช้ได้เหมือนเดิมในปี 2025 เป็นการมองข้ามความเป็นจริง
    • ผมเคยเห็นบน GitHub มีคนถามว่า “อันนี้ต่างจาก Ansible ยังไง?” แล้วมีคนตอบว่า “เพิ่งเคยได้ยินว่า Ansible คืออะไร”
      ความน่าสนใจอยู่ที่ วงจรการค้นพบซ้ำ ที่แต่ละรุ่นมักเข้าใจว่าตัวเองเป็นคนแรกที่พบมัน
    • เวลาได้ทำงานกับผู้ก่อตั้งบริษัท มักเจอการเอาแนวคิดที่มีอยู่แล้วมาห่อใหม่ให้ดูเหมือนของใหม่
      การเรียนรู้ปัญหาและวิธีแก้ในอดีตไม่ใช่การเสียเวลาเปล่าเลย
    • ตอนเรียนมหาวิทยาลัยมีงาน ‘เรียงความประวัติศาสตร์ระบบปฏิบัติการ’ และผมเลือก OS X(Snow Leopard)
      กระบวนการนั้นทำให้ผมเข้าใจ วิวัฒนาการของ Unix และซอฟต์แวร์เชิงพาณิชย์ ได้ลึกขึ้นมาก และทำให้เห็นด้วยกับ Alan Kay แบบเต็มที่
  • CSCI 3240: Ignoring Hype
    เป็นวิชาที่สอนวิธีไม่ไหลตามกระแสของแพลตฟอร์มหรือไลบรารีล่าสุด
    ถัดจากนั้นคือ CSCI 3120: Novelty Driven Development ที่สอนในทางกลับกัน คือวิธีตามกระแสให้ทันเพื่อรักษาความสนุกในการทำงาน
    สองวิชานี้ลงพร้อมกันไม่ได้
    ยังมีวิชาอื่นอีก เช่น ทักษะการประชุม(PSYC 4870), การยอมรับแรงเสียดทานในองค์กร(PSYC 5630) ซึ่ง
    ว่าด้วยเรื่อง การสื่อสารและแรงจูงใจ ในที่ทำงานจริง

  • CSCI 4810: The Refusal Lab
    เป็นวิชาปฏิบัติการที่จำลองคำขอผลิตภัณฑ์ที่ผิดจริยธรรมและแรงกดดันจากเส้นตาย โดยจะผ่านได้ก็ต่อเมื่อปฏิเสธสิ่งเหล่านั้นตาม มาตรฐานวิชาชีพ

    • CSCI 4812: The Career Lab ว่าด้วยความจริงที่ว่าคุณต้องมารับช่วงงานที่เหลือ หลังจากเพื่อนร่วมงานยอมรับคำขอที่ผิดจริยธรรมแล้วก็ลาออกไป
    • ในความเป็นจริง หลักสูตรปริญญาจำนวนมากก็มีวิชาที่เกี่ยวกับจริยธรรมอยู่แล้ว
    • แต่สุดท้ายมหาวิทยาลัยก็ยังให้ความสำคัญกับ ความสามารถในการหางานทำ ของบัณฑิตเป็นอันดับแรก
  • ข้อเสนอวิชาดีบัก
    อยากให้มีวิชาที่สอนการหาสาเหตุรากของบั๊กและการใช้เครื่องมือต่าง ๆ ให้เป็น

    • ถ้าเป็นเหมือนแล็บเคมี โดยให้ โค้ดเบส legacy ที่เต็มไปด้วยบั๊กกับนักศึกษา แล้วจบวิชาเมื่อทำให้ทุกเทสต์ผ่านได้ ก็น่าจะดี
    • ควรสอนการอ่านโค้ดของคนอื่น และการไม่ไปรื้อโครงสร้างเดิม(Chesterton’s fence) อย่างพลการด้วย
    • แม้แต่วิศวกรอาวุโสจำนวนมากก็ยังดีบักด้วย print
      ถึงเวลาแล้วที่จะต้องมีช่วงพูดถึงผู้กอบกู้แห่ง interactive debugging
  • CSCI 0001: Functional programming and type theory
    ศัพท์เฉพาะและสมการที่เข้าใจยาก ในสายวิชาการเคยเป็นอุปสรรคต่อการทำให้การเขียนโปรแกรมเชิงฟังก์ชันเข้าถึงคนทั่วไป
    ตอนนี้ได้เวลามาเรียนกันตรง ๆ แล้วว่าทำไม monad ถึงเป็น monoid ใน category ของ endofunctor

    • ฟังก์ชันบริสุทธิ์ทำงานได้อย่างเป็นธรรมชาติมากภายใน context window
  • CSCI 4020: Writing Fast Code in Slow Languages
    เป็นวิชาที่ใช้อัลกอริทึมในภาษาที่ช้า(VB, Ruby เป็นต้น) เพื่อสอนเรื่องความซับซ้อนเชิงอัลกอริทึม และแสดงให้เห็นว่า O(N) ของ Ruby อาจชนะ O(N²) ของ C++ ได้

    • ผมจำได้ว่าเคยอ่านหนังสือตอนเด็กที่เปรียบเทียบ bubble sort ของ FORTRAN กับ quicksort ของ BASIC และก็แปลกใจที่ BASIC กลับทำได้เร็วอย่างคาดไม่ถึง
    • ผมเคยทำแล็บที่แปลงลูป Python ไปเป็นการคำนวณแบบเวกเตอร์ของ numpy และโอเปอเรชันของ tensorflow แล้ววัดความต่างของความเร็ว
      ทำให้สัมผัสได้ว่าทำไม Python ถึงมีประโยชน์ในงาน AI
    • ถ้าวิศวกรที่ใช้ Python ทุกวันเข้าใจว่า ทำไมโค้ดถึงช้า ได้จริง ก็คงดีมาก
    • หลายครั้งสิ่งที่สร้างความต่างมากกว่าความซับซ้อนของอัลกอริทึม คือ การใช้ฮาร์ดแวร์ให้คุ้ม
      โค้ดที่เวกเตอร์ไรซ์บนหน่วยความจำเชิงเส้นเร็วกว่าโค้ดที่ใช้ข้อมูลกระจัดกระจายอยู่บน heap มาก
    • หนังสืออ้างอิง: Visual Basic Algorithms Ready-to-Run
  • รวมซีรีส์ก่อนหน้า
    ซีรีส์ “Computer science courses that don't exist, but should” มีต่อเนื่องเป็น
    ฉบับปี 2015 (247 comments),
    ฉบับปี 2017,
    ฉบับปี 2018

  • ทำให้นึกถึงวิชา Software Archaeology ที่ผมเคยเรียนตอนมหาวิทยาลัย
    เป็นคลาสที่ให้กลับไปทำโจทย์คอมไพเลอร์จากยุค 1970 ใหม่อีกครั้ง
    ตอนนั้นรู้สึกว่าไร้ประโยชน์ แต่ภายหลังก็ช่วยมากในการเข้าใจการออกแบบระบบ

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

    • แต่ในมหาวิทยาลัยรัฐขนาดใหญ่บางแห่ง ก็ยังคงโครงวิชาแกนหลักแบบเดียวกับเมื่อ 25 ปีก่อนไว้อยู่
      เพราะข้อกำหนดด้านการรับรองทำให้หลักสูตรปรับออกนอกกรอบได้ยาก
  • CSCI 3210: Modern text encoding and processing
    เป็นวิชาที่เรียน Unicode และ UTF-8 พร้อมกับทิ้งแนวคิดว่า ‘1 ตัวอักษร = 1 ไบต์’
    ไม่ได้ครอบคลุมแค่ encoding แต่รวมถึง การค้นหา การจัดเรียง การเรนเดอร์ฟอนต์ และการจัดการอีโมจิ ด้วย
    เป็นพื้นฐานมาก แต่มีไม่กี่คนที่เข้าใจอย่างถูกต้อง