- บทความนี้เสนอ รายวิชาวิทยาการคอมพิวเตอร์เชิงเสียดสีที่สมจริงซึ่งนักพัฒนาซอฟต์แวร์ควรได้เรียน แม้ว่าจะไม่มีอยู่จริงก็ตาม
- แต่ละวิชาเปิดโปง ปัญหาในวัฒนธรรมการพัฒนาสมัยใหม่หรือกรอบความคิดที่มีอคติ อย่างมีวิจารณญาณ
- ตัวอย่างเช่น ความศรัทธาแบบไม่ลืมหูลืมตาต่อกระบวนทัศน์เชิงวัตถุ การมองข้าม 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 ความคิดเห็น
ความเห็นจาก Hacker News
CSCI 3300: Classical Software Studies
สิ่งที่ Alan Kay เน้นย้ำมาหลายทศวรรษคือ พวกเรายังคง ประดิษฐ์สิ่งเดิมขึ้นมาใหม่ ทั้งที่แนวคิดเหล่านั้นถูกวางรากฐานไว้ตั้งแต่ช่วงปลายยุค 70 แล้ว
ผมเห็นด้วยกับความผิดหวังของเขาที่ว่า โปรแกรมเมอร์ก็ควรเรียนรู้ประวัติศาสตร์ของวิทยาการคอมพิวเตอร์ เหมือนที่ศิลปินเรียนประวัติศาสตร์ศิลปะ
ผมคิดว่าการนำคอมพิวติงซึ่งพึ่งพาสมรรถนะของฮาร์ดแวร์จริง ๆ ไปเทียบกับศิลปะนั้นค่อนข้างฝืน
การมองว่าวิธีแก้ปัญหาในปี 1970 จะยังใช้ได้เหมือนเดิมในปี 2025 เป็นการมองข้ามความเป็นจริง
ความน่าสนใจอยู่ที่ วงจรการค้นพบซ้ำ ที่แต่ละรุ่นมักเข้าใจว่าตัวเองเป็นคนแรกที่พบมัน
การเรียนรู้ปัญหาและวิธีแก้ในอดีตไม่ใช่การเสียเวลาเปล่าเลย
กระบวนการนั้นทำให้ผมเข้าใจ วิวัฒนาการของ Unix และซอฟต์แวร์เชิงพาณิชย์ ได้ลึกขึ้นมาก และทำให้เห็นด้วยกับ Alan Kay แบบเต็มที่
CSCI 3240: Ignoring Hype
เป็นวิชาที่สอนวิธีไม่ไหลตามกระแสของแพลตฟอร์มหรือไลบรารีล่าสุด
ถัดจากนั้นคือ CSCI 3120: Novelty Driven Development ที่สอนในทางกลับกัน คือวิธีตามกระแสให้ทันเพื่อรักษาความสนุกในการทำงาน
สองวิชานี้ลงพร้อมกันไม่ได้
ยังมีวิชาอื่นอีก เช่น ทักษะการประชุม(PSYC 4870), การยอมรับแรงเสียดทานในองค์กร(PSYC 5630) ซึ่ง
ว่าด้วยเรื่อง การสื่อสารและแรงจูงใจ ในที่ทำงานจริง
CSCI 4810: The Refusal Lab
เป็นวิชาปฏิบัติการที่จำลองคำขอผลิตภัณฑ์ที่ผิดจริยธรรมและแรงกดดันจากเส้นตาย โดยจะผ่านได้ก็ต่อเมื่อปฏิเสธสิ่งเหล่านั้นตาม มาตรฐานวิชาชีพ
ข้อเสนอวิชาดีบัก
อยากให้มีวิชาที่สอนการหาสาเหตุรากของบั๊กและการใช้เครื่องมือต่าง ๆ ให้เป็น
printถึงเวลาแล้วที่จะต้องมีช่วงพูดถึงผู้กอบกู้แห่ง interactive debugging
CSCI 0001: Functional programming and type theory
ศัพท์เฉพาะและสมการที่เข้าใจยาก ในสายวิชาการเคยเป็นอุปสรรคต่อการทำให้การเขียนโปรแกรมเชิงฟังก์ชันเข้าถึงคนทั่วไป
ตอนนี้ได้เวลามาเรียนกันตรง ๆ แล้วว่าทำไม monad ถึงเป็น monoid ใน category ของ endofunctor
CSCI 4020: Writing Fast Code in Slow Languages
เป็นวิชาที่ใช้อัลกอริทึมในภาษาที่ช้า(VB, Ruby เป็นต้น) เพื่อสอนเรื่องความซับซ้อนเชิงอัลกอริทึม และแสดงให้เห็นว่า O(N) ของ Ruby อาจชนะ O(N²) ของ C++ ได้
ทำให้สัมผัสได้ว่าทำไม Python ถึงมีประโยชน์ในงาน AI
โค้ดที่เวกเตอร์ไรซ์บนหน่วยความจำเชิงเส้นเร็วกว่าโค้ดที่ใช้ข้อมูลกระจัดกระจายอยู่บน heap มาก
รวมซีรีส์ก่อนหน้า
ซีรีส์ “Computer science courses that don't exist, but should” มีต่อเนื่องเป็น
ฉบับปี 2015 (247 comments),
ฉบับปี 2017,
ฉบับปี 2018
ทำให้นึกถึงวิชา Software Archaeology ที่ผมเคยเรียนตอนมหาวิทยาลัย
เป็นคลาสที่ให้กลับไปทำโจทย์คอมไพเลอร์จากยุค 1970 ใหม่อีกครั้ง
ตอนนั้นรู้สึกว่าไร้ประโยชน์ แต่ภายหลังก็ช่วยมากในการเข้าใจการออกแบบระบบ
ความสามารถในการไล่ตามบั๊กเก่า วิกิ ประวัติเวอร์ชัน และประวัติทีม เป็นสิ่งจำเป็น
ทุกวันนี้หลักสูตรวิทยาการคอมพิวเตอร์จำนวนมากแทบจะกลายเป็น โรงเรียนฝึกอาชีพเขียนโค้ด ไปแล้ว
นักศึกษารู้วิธีใช้เฟรมเวิร์ก แต่ไม่เข้าใจปรัชญาการออกแบบภาษา หรือวิวัฒนาการของระบบ
เราไม่ควรลืมว่าคอมพิวติงไม่ใช่แค่เรื่องการลงมือทำ แต่เป็น ศาสตร์ของแนวคิดและไอเดีย ด้วย
เพราะข้อกำหนดด้านการรับรองทำให้หลักสูตรปรับออกนอกกรอบได้ยาก
CSCI 3210: Modern text encoding and processing
เป็นวิชาที่เรียน Unicode และ UTF-8 พร้อมกับทิ้งแนวคิดว่า ‘1 ตัวอักษร = 1 ไบต์’
ไม่ได้ครอบคลุมแค่ encoding แต่รวมถึง การค้นหา การจัดเรียง การเรนเดอร์ฟอนต์ และการจัดการอีโมจิ ด้วย
เป็นพื้นฐานมาก แต่มีไม่กี่คนที่เข้าใจอย่างถูกต้อง