รักเธอ แต่เราไม่อาจอยู่ร่วมกัน

แม้​จะ​อยาก​พบ​ว่า pydev คือ IDE สำหรับ Python ที่​ทรง​พลัง​ที่​สุด​มา​ระยะ​หนึ่ง​แล้ว แต่​ด้วย​ขนาด​ถึง 120 เมกกะไบต์ และ​อัตรา​การ​กิน​แรม​แบบ​สูบ จน​วัน​นี้​ผม​ก็​ยัง​ไม่​ได้​ลอง​ใช้​งาน​มัน​ซัก​ที

คง​ต้อง​รอ​เครื่อง​ใหม่ อัด​แรม​สัก​สอง​สาม​กิก แล้ว​เรา​คง​ได้​อยู่​ด้วย​กัน

 

Native is Sucks! But you can’t live without it.

หลัง​จาก​ทำ​งาน​ด้าน​ซอฟต์แวร์​มา​ปีก​ว่าๆ สิ่ง​ที่​พบ​อย่าง​หนึ่ง​คือ​โลก​ธุรกิจ​ซอฟต์แวร์​บ้าน​เรา​ถูก​แบ่ง​ออก​เป็น​สอง​ขั้ว​โดย​ไม่​มอง​หน้า​กัน คือ โลก​ของ Managed Software อย่าง .NET และ Java กับ​โลก​ของ Native ที่​มี​สารพัด​จะัใช้​กัน​อยู่ ทั้ง​เครื่อง​ยูนิกซ์​รุ่น​เก่าๆ มา​จน​ถึง​ลิ​นุกซ์

ที่​น่า​รำคาญ​ใจ​ที่​สุด​คง​เป็น​เรื่อง​ของ​เมื่อ​เทคโนโลยี​ส่วน​หนึ่ง​ไม่​สามารถ​ตอบ​สนอง​ได้​ดี​พอ ธุรกิจ​ซอฟต์แวร์​บ้าน​เรา​กลับ​กลัว​ที่​จะ​ขอ​ความ​ช่วย​เหลือ​จาก​เทคโนโลยี​อื่นๆ เพื่อ​ลด​อุปสรรค แต่​กลับ​พยายาม​ใช้​เทคโนโลยี​ที่​ไม่​เหมาะ​สม​เพื่อ​ให้​ได้​ชื่อ​ว่า​ซอฟต์แวร์ X ทำ​งาน​อยู่​บน​เทคโนโลยี Y ให้​ได้

พอ​ดี​ว่า​อยู่​ฝั่ง Native หลาย​ครั้ง​ที่​อยาก​ร้อง​ขอ​เทคโนโลยี​ระดับ​สูง​กว่า เพื่อ​มา​ลด​งาน​ที่​น่า​เบื่อ (แต่​ต้อง​มา​ทำ​ใน C/C++) โดย​ได้​ประโยชน์​ด้าน​ประสิทธิภาพ​น้อย​กว่า​ร้อย​ละ 1 แต่​ก็​ไม่​ได้​เพราะ​เหตุผล​ที่​ว่า​เรา​ต้อง​การ​ให้​ซอฟต์แวร์​เป็น Native

ขณะ​เดียว​กัน​ผม​เชื่อ​ว่า​คน​ใช้​เทคโนโลยี​ฝั่ง Managed ทั้ง​หลาย ก็​หลีก​เลี่ยง​การ​เรียกฟังก์ชั่น Native ด้วย​ความ​กลัว​ว่า​มัน​จะ​ไม่ Portable หรือ​จะ​ต้อง​รอง​รับ​เทคโนโลยี​อื่น​เพิ่ม​เติม ไป​จน​ถึง​ปัญหา​การเมือง​อื่นๆ

ความ​กลัว​ที่​ไม่​เข้า​ท่า​เหล่า​นี้​สร้าง​ความ​น่า​เบื่อ​ให้​กับ​งาน​ใน​โลก​ซอฟต์แวร์​ไม่​ใช่​น้อย แทน​ที่​เรา​จะ​ใช้​สิ่ง​ที่​สร้าง​ขึ้น​มา​เพื่อ​แก้​ปัญหา​อย่าง​ตรง​ตัว เรา​กลับ​อ้อม​ไป​มา​ด้วย​ความ​กลัว​เกิน​เหตุ

บท​ความ​นี้​เขียน​ให้​ตัว​ผม​เอง​จำ​ไว้ วัน​ไหน​มี​อำนาจ​ตัดสิน​ใจ​แล้ว ก็​อย่า​กลัว​ที่​จะ​เรียน​รู้​เทคโนโลยี​ที่​เหมาะ​สม​กับ​ปัญหา​แล้ว​กัน

 

Clever

Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.

Brian Kernighan of C

 

แนวคิด

ผม​อ่าน​รายงาน benchmark มา​สอง​สาม​ที่ เรื่อง​หนึ่ง​ที่​แปลก​ใจ​คือ​ภาษา​จาวา​นั้น​ทำ​ผล​การ​ทด​สอบ​ได้​ใน​ระดับ​ดี​เยี่ยม​เสมอๆ เรียก​ว่า​ขี่ๆ กับ C/C++ กัน​เลย​ที​เดียว

เรื่อง​น่า​แปลก​ใจ​คือ ใน​โลก​ความ​เป็น​จริง ผม​ไม่​ค่อย​เจอ​โปรแกรม​จาวา​ความ​เร็ว​เป็น​ที่​น่า​พอ​ใจ​เท่า​ใหร่เลย แม้​จะ​ทำ​งาน​ใน​เครื่อง​ที่​มี​แรม​ให้​สูบ​อย่าง​เหลือ​เฟือ​แล้ว​ก็​ตาม

ความ​เชื่อ​อย่าง​หนึ่ง​ของ​ผม​ใน​เรื่อง​นี้​คือ ที่​โปรแกรม​จาวา​มัน​ช้า เพราะ​น้อย​คน​จะ​เขียน​ให้​มัน​เร็ว มัน​ไม่​ใช่​เรื่อง​แปลก​อะไร​ที่​เรา​จะ​เห็น​ประโยค​ประมาณ​ว่า “เพราะ​คอมพิวเตอร์​ทุก​วัน​นี้​เร็ว​ขึ้น​มาก เรา​จึง​สามารถ…” ใน​หนังสือ​จาวา​ระดับ​เริ่ม​ต้น​จำนวน​มาก

โปรแกรมเมอร์​จาวา​จำนวน​มาก​ใน​โลก จึง​ถูก​สอน​การ​เขียน​โปรแกรม​มา​ด้วย​ความ​คิด​พื้น​ฐาน​ที่​ว่า​คอมพิวเตอร์​นั้น​เร็ว​เหลือ​เฟือ และ​สามารถ​หา​เครื่อง​ที่​เร็ว​กว่า หาก​เรา​ต้อง​การ​ได้​ไม่​ยาก​นัก นี่​อาจ​จะ​เป็น​เหตุผล​ที่​ว่า​ทำไม​เรา​จึง​ไม่​ค่อย​เห็น​โปรแกรม​ที่​ทำ​ความ​เร็ว​ได้​ดี​ใน​ภาษา​จาวา​กัน​เท่าใหร่

ปัญหา​ประมาณ​นี้​ไม่​ได้​มี​ใน​จาวา​อย่าง​เดียว​เท่า​นั้น ก่อน​หน้า​นี้​ปรัชญา​ที่​สร้าง​ความ​ปวด​เศียร​เวียน​กล้า​ให้​กับ​การ​ทำ​งาน​ก่อน​หน้า​นี้​คง​เป็น​ภาษา Perl ที่​สนับสนุน​การ​ใช้ Regular Expression อย่าง​สุด​โต่ง แถม​ยัง​มี​ปรัชญา​แนบ​ท้าย​ว่า “There’s more than one way to do it.”

ผล​ที่​ได้​คือ​โค้ด Perl ที่​ไม่​ค่อย​มี​ใคร​อ่าน​ออก​จำนวน​มาก​ใน​โลก​ทุก​วัน​นี้

ผม​เคย​ถก​กับ​พี่​คน​หนึ่ง​ที่​เข้า​ใจ​ว่า​ชอบ Perl พอ​ควร ส่วน​ผม​น่ะเกลียด​มาก พี่​คน​นั้น​ยก​ประเด็น​ว่า​เรา​สามารถ​เขียน Perl ให้​อ่าน​ง่ายๆ ได้​ถ้า​เรา​ต้อง​การ แต่​การ​สอน Regular Expression และ​การ​ใช้​ตัว​แปร Global ตั้งแต่​บท​แรกๆ ก็​ดู​เหมือน​จะ​ไม่​สนับสนุน​ให้ Perl มี​โปรแกรมเมอร์​ที่​เน้น​ความ​อ่าน​ง่าย​ของ​โปรแกรม​กัน​เท่าใหร่ แต่​เน้น​ว่า​โปรแกรม​สั้น ยิ่ง​สั้น​จะ​ดู​ยิ่ง​เจ๋งไป​ซะอย่าง​นั้น

Python สอน​ผม​สอง​เรื่อง คือ​การ Refactoring ที่​ให้​ทำ​เสมอๆ เมื่อ​มัน​ควร​ทำ ข้อ​นี้​อาจ​จะ​เป็น​หนังสือ​ที่​ผม​อ่าน​เอง แต่​โดย​ส่วน​ตัว​แล้ว​ผม​ก็​ยัง​เชื่อ​ว่า​ตัว​ภาษา​มี​ส่วน​ค่อน​ข้าง​มาก ไม่​ว่า​จะ​เป็น​การ​บังคับ​ใช้ self เมื่อ​ต้อง​การ​ใช้​ตัว​แปร​ใน​ออปเจกต์ ไป​จน​ถึงฟังก์ชั่น property ที่​ทำ​ให้​เรา​สามารถ​ประกาศ​ตัว​แปร​ใน​ออปเจกต์​ไป​ก่อน แล้ว​ไป​ใส่ฟังก์ชั่น get/set เอา​ที​หลัง โดย​ไม่​ต้อง​ไป​แก้​จาก​ภาย​นอก เรื่อง​ที่​สอง​คือ​แนว​คิด battery included ของ Python ทำ​ให้​ผม​เลิก reinvent the wheel ไป​ได้​มาก ด้วย​ความ​ที่​เคย​ชิน​ที่​จะ​หา​โมดูล​ที่​ทำ​งาน​ตาม​ที่​เรา​ต้อง​การ​ก่อน เมื่อ​ไม่​มี​ค่อย​เขียน​ใหม่ แทน​ที่​จะ​เป็น​การ​เขียน​เอง​เรื่อยๆ เหมือน​เมื่อ​ตอน​เขียน C/C++ นิสัย​พวก​นี้​อาจ​จะ​บอก​ได้​ว่า​เกิด​ขึ้น​มา by design ของ​ภาษา​กัน​เลย​ที​เดียว

หรือ​ไม่​จริง?