Posted on Saturday, May 10th, 2008 at 1:17 pm
Alan J. Perlis,เคยกล่าวไว้ว่า “A language that doesn’t affect the way you think about programming, is not worth knowing.” แปลลวก ๆ ก็คือ ภาษาที่ไม่กระทบต่อวิธีการคิดของคุณต่อการเขียนโปรแกรมนั้นไม่มีค่าพอที่จะไปเรียนรู้มัน ผมก็เลยลองไล่ ๆ ดูว่ามีภาษาอะไรบ้างที่”เปลี่ยน”วิธีการคิดของผมบ้างนะครับ
Pascal
เป็นภาษาแรกที่หัดเขียน (เด็กรุ่นผมส่วนใหญ่ ก็คงหัดเขียน Pascal แหละ รุ่นไหนเหรอ ก็รุ่น CW/RW นะ :P) ที่สำคัญคือ ตอนนั้นผมยังไม่มีคอมพิวเตอร์เป็นของส่วนตัว แต่ไปใช้คอมพ์ที่โรงเรียนแม่ ซึึ่งทั้งโรงเรียน มีคอมพ์อยู่ตัวเดียว (PC/XT รุ่น Floppy disk 5 1/4 คู่ด้วย) ทำให้ผมสามารถใช้คอมพ์ได้แค่อาทิตย์ละ 1-2 ชั่วโมง แต่เวลาแค่ 1-2 ชั่วโมงมันไม่พอจะให้หัดเขียนโปรแกรมหรอกครับ (เขียน Hello World ก็ใช้เวลาคอมไพล์สัก 5 นาทีได้แล้ว) ถ้าต้องมัวแต่ต้องไปนั่งคิด ๆ พิมพ์ ๆ ไป แก้โค้ดไป รับรองอาทิตย์หนึ่งได้แค่โปรแกรมเดียว วิธีการที่ผมใช้ก็คือ ผมจะเขียนโปรแกรมในกระดาษก่อน แล้วลองคอมไพล์ในหัวดูว่าโปรแกรมมันควรจะทำงานยังไง เวลาเจอข้อผิดผลาด ก็แก้ในกระดาษไปแบบนี้ ข้อดีของ Pascal ก็คือ syntax มันค่อนข้างชัดเจนและอ่านง่าย ทำให้เวลาจินตนาการในหัวแล้วสมองไม่ต้องทำงานหนักมาก (ลองจินตนาการการทำงานของโปรแกรมที่เขียนด้วย Perl ดูซิครับ…) แล้วพอคิดว่าโปรแกรมทำงานได้ถูกต้องดีแล้ว ก็ค่อยเอาไปทดสอบกับคอมพ์จริง ๆ อีกที ซึ่งส่วนใหญ่ก็จะคอมไพล์ทีเดียวผ่าน 😀 ด้วยการหัดเขียนภาษา Pascal แบบนี้ ทำให้ผมสามารถพัฒนาการมองโปรแกรมแล้วคิดตามในหัวได้ เรียกว่าผมสามารถคิดแบบเดียวกับที่คอมพิวเตอร์คิดได้ก็ด้วยการหัดเขียน Pascal ในกระดาษนี่แหละ
ถ้าไปหัดเขียนโปรแกรมกับคอมพสมัยนี้อาจจะทำไม่ได้ เพราะว่าคงจะใช้วิธีการเขียนไปแก้ไป (คอมพ์มันเร็ว มันทำแบบนั้นได้) ซึ่งข้อเสียก็คือ เราจะไม่สามารถคิดถึงโปรแกรมเป็น flow หรือเป็นภาพรวมได้
C
พอเขามหาวิทยาลัยก็โดนบังคับให้เขียน C ข้อดี(หรือว่าข้อเสียก็ไม่รู้) ของ C ก็คือมัน low level มาก แต่ไม่มากจนเกินไป การที่มันอยู่กึ่ง ๆ กลาง ๆ ทำให้เราสามารถคิดได้ง่ายขึ้นว่า การที่โปรแกรมทำงานอย่างหนึ่ง เช่นการคลิกเมาส์ที่ปุ่มหนึ่ง ในส่วนฮาร์ดแวร์มันเกิดอะไรขึ้นบ้าง เช่น ต้องมีการจอง memory ยังไง ต้องย้าย memory จากส่วนไหนไปไหน จำได้ว่าตอนสมัยเรียน อาจารย์ให้การบ้านภาษา C คือให้เด็กเขียน Text editor ภาษาไทย! ก็สนุกกันใหญ่แหละครับ ตั้งแต่จะสร้าง Data Structure เพื่อเก็บเอกสารยังไง จะแสดงผลภาษาไทยยังไง ต้อง map VRAM ยังไง (สมัยนั้น ยังฮิตใช้ Hercules card กันอยู่) สุดท้ายการเรียนภาษา C ก็สามารถสอนให้ผมเชื่อมการทำงานของ Software เข้ากับ Hardware ได้ อาจจะสงสัยว่าแล้ว assembly ละ คือว่า assembly มัน low level ไปนะครับ เขียนแล้วมองการทำงานของ Hardware ได้ทะลุ แต่เอามาเชื่อมกับ Software ไม่ได้
Smalltalk
จริงๆ ผมหัดเขียน C++ กับ Java มาก่อน แต่ว่าก็เป็นการเขียนแบบ procedural ธรรมดา ๆ เลย ไม่มีความเป็น OOP แต่อย่างไร เพราะตอนนั้นมันมองไม่แตกว่า OOP คืออะไร แต่พอตอนไปออสเตรเลีย ต้องได้ลงเรียนวิชา OOP ซึ่งเขาใช้ Smalltalk ในการเรียน ก็ทำให้ผมสามารถ”คิด”แบบ OOP ได้ เพราะว่าภาษามันไม่ยอมให้คิดแบบอื่นเลย ถ้าตอนนั้นไม่ได้เรียน Smalltalk ผมก็คงยังคิดแบบ OOP ไม่ได้
จริง ๆ หลัก ๆ ที่เห็นชัด ๆ ก็มีอยู่แค่นี้แหละครับ แต่ว่าตอนนี้กำลังพยายามลุ่มลึกกับ Python และ Haskell อยู่ รวมถึง Programming paradigm อื่น ๆ เช่น AOP, Event-Processing และ Functional Programming อยู่ครับ ก็คงต้องดูต่อไปว่าผมจะถูกเปลี่ยนด้วยภาษาไหน หรือว่า Paradigm แบบไหนอีกหรือเปล่า