[ชวนคุยประสาคนเขียนโปรแกรม] ภาษา C วัตถุอันตรายกรุณาเก็บไว้ให้ไกลจากมือใหม่

ออกตัวก่อนว่าผมไม่ได้เรียนเขียนโปรแกรมมาโดยตรง ส่วนใหญ่ผมเรียนเองจากหนังสือและอ่านในเน็ตเกือบทั้งหมด(เปอร์เซ็นที่เหลือคือไปนั่งแจมตอนอาจารย์คอมสอนพิเศษช่วงพักเที่ยงเด็กคอมเขียนโปรแกรม) ดังนี้ภาษาเริ่มต้นของผมจึงไม่ใช่ C, C++ แต่เป็น Basic รุ่นเก่าหน้าจอดอส ยืมชีสอาจารย์มาลอง VB6 แต่ก็ไม่รุ่งไม่รู้เรื่องจนกระทั้งมาได้ Vb.net จาก VS 2003 (หนังสือเขียนโปรแกรมเพียง 3 เล่มที่ผมซื้อคือ ฐานข้อมูล VB 2003(เล่มเขียว), VB 2005(เล่มฟ้า) ของ Provision และ Professional VB 2005(เล่มแดง) ของ Wrox)

แต่หลังจากอิ่มตัวจาก OOP แล้วก็พบว่าผมชอบเขียนภาษา Javascript มากเนื่องจากความยืดหยุ่นสูง(ผมเขียน asp ด้วย Jscript ไม่ใช้ vbscript) แต่น่าแปลกผมกลับไม่ค่อยชอบ C# มากนักฮาๆ โดยผมมีความคิดว่าถ้า VB.net และ C# นั้นแทบไม่ต่างกันแล้ว ผมเลือกเขียนภาษาที่สามารถเขียนได้ง่ายอย่าง VB.Net ดีกว่า

อย่างไรก็ดีเมื่อผมลงลึกศึกษา CIL (เป็นภาษาเบื้องหลังในเครือของ .Net framework เป็น stack base language) เนื่องจากความอึดอัดในกรอบของ VB, C# ซึ่งผมค่อนข้างชอบในความเรียบง่ายแต่ทรงพลังของภาษานี้ดี และหลังจากศึกษาจนพอใจแล้วผมก็ได้ฤกษ์โยกไปยังภาษาระดับตำนาน ภาษา C นั่นเองครับ

หลังจากอ่าน document เรื่อง syntax และ language feature ของภาษา C เรียบร้อยแล้วผมก็เริ่มลงมือศึกษาทดลองก็พบว่าภาษา C นั้นเรียบง่ายมากต่างจาก C++ ที่ผมเคยลองศึกษามาบ้าง ขณะเดียวกันมันก็อิสระเหมือนกับ CIL มาก มากเสียจนต้องเรียกว่าเราต้องรู้ว่ากำลังทำอะไรอยู่เลยทีเดียว

เรื่องของเรื่องก็คือเมื่อผมคิดถึงสมัยก่อนที่สอนภาษา C เป็นภาษาแรกให้กับนักเรียน(ซึ่งปัจจุบันก็ยังคงมีอยู่บ้าง) ไม่ต่างจากให้คนขับรถเป็นใหม่ๆ เอารถระบบขับเคลื่อนแบบ FR (ซึ่ง oversteer ไถลได้ง่ายกว่ารถ FF)ไปลงสนามแข่งเพราะนอกจาก syntax เล็กๆ น้อยๆ แล้ว ภาษา C นั้นต่างจากภาษายอดนิยมยุคนี้โดยสิ้นเชิงทั้งหมด

1. C ไม่มีคอนเซปเชิง OOP ทำให้คนเรียนไม่มีทางเข้าใจถึง OOP ไม่มี public private internal assembly ให้ใช้เพื่อกำหนดการเข้าถึงค่า คลาสที่ภาษาอื่นใช้กันจนเสมือนลมหายใจนั้นลืมไปได้เลย เรื่องพื้นฐานอย่าง Namespace ก็ไม่มี(ตรงนี้เรื่องใหญ่มาก คนเขียนภาษาบนๆ อาจไม่เข้าใจว่ามันสำคัญอย่างไรแต่พอไม่มีเจ้านี้ละก็ แทบร้องไห้น้ำตาเป็นสายเลือดครับ) Overload method ตรงๆ ก็ทำไม่ได้(เป็นเรื่องพื้นฐานมากสำหรับภาษาระดับบนเช่นกัน) Property ที่ใช้กันเกร่อเองก็ไม่มีแน่นอนครับ นี่พูดเฉพาะพื้นฐานทั่วไปนะครับยังไม่รวมถึงระดับลึกที่ภาษา C นั้นไม่สามารถช่วยสอนให้กับมือใหม่ได้


2. C เน้นหนักไปทาง Pointer ซึ่งไม่ต่างจากให้คนขับรถทั่วไปเอารถ FR ไปดริฟเช่น

//core.h
struct Heap{ void *pointer; unsigned int size; };

//core.c
struct Heap *Heap_New(uint length){
    struct out[] = { malloc(length), length };
    return out; //อันนี้ผมเกรียนใส่ C จากความเคยชินใน CIL
}

void Heap_Write_Text(struct Heap *to, char *from){ strcpy(*(int *)to, from); }
//*(int *)to นี่ผมก็เกรียนเอา เป็นความเคยชินจาก CIL ที่ address ของ structure นั้นคือ address เดียวกับสมาชิกตัวแรกของ structure

อย่างที่เห็นไปในโค๊ด ไม่ใช่อะไรที่เหมาะสำหรับการสอนมือใหม่เลยครับ แถมภาษาระดับบนๆ ยังแทบไม่ได้เปิดโอกาสให้รับรู้ว่ามี Pointer อยู่ด้วยซ้ำ

3. Macro เป็น WMD(Weapon of mass destruction) ของภาษา C ซึ่งเอาไปใช่ต่อที่ไหนก็ไม่ได้(ยกเว้น C++)


#define Heap_New(length) { malloc(length), length }
#define Heap_Write_Text(to, form) strcpy(*(int *)to, from)

แน่นอนว่าโค๊ดนี้ทำงานได้เหมือนข้อ 2 และยังเร็วกว่าอีกด้วยเนื่องจากไม่ต้องสร้าง stack frame สำหรับ method ไม่ต้องคัดลอกค่าส่งไปยัง argument list อีกด้วย

4. C นั้นเหมือนรถไม่มีเบรกอย่าให้อะไรขวางทางล้ออย่างเด็ดขาด ต่างจากภาษาบนๆ ที่เต็มไปด้วยรั้วกันริมทาง เบรก ABS และบางภาษานี่มี IDE ช่วยขับเป็น auto pilot ด้วยซ้ำ การรับมือกับ error exception แบบภาษาบนๆ อย่าง try catch throw นั้นโยนทิ้งลงหน้าต่างไปได้เลย ถ้าไม่ตั้งด่านตรวจทุก 4 แยกก็ปล่อยโล่งไฟเขียวทุกแยกแล้วลุ้นเอาไป

แค่ 4 ข้อนี้ก็แทบจะหงายเก๋งแล้วละครับ ไหนจะต้องผจญกับ logic และ flow ในการเขียนโปรแกรมอีก ดริฟแหกโค้งดับกันกระจายครับ ถ้าคิดว่าเรียนเพื่อไปต่อยอดกับ C++ ละก็คิดผิดแล้วละครับ เหมือนคุณพึ่งเล่นความยากระดับ Very hard มาแล้วก้าวเข้ามาเล่นความยากระดับ Nightmare ละครับ เพราะ C++ นั้นคือ C ที่มี OOP และยังคงรักษาคุณสมบัติเดิมไว้บ้าง

อ่านแล้วอาจจะงงๆ ว่าเรียน C ก่อนไป  C++ ไม่ดียังไง เพราะว่า C++ นั้นเน้นไปทาง OOP มากกว่าจนหลายๆ อย่างจาก C แทบไม่ได้ใช้จนเรียกได้ว่าเริ่มต้นจาก C++ เลยยังเร็วกว่าอีก แต่อย่างไรก็ดี C++ เองก็ไม่ต่างจากรถระบบขับเคลื่อนแบบ MR ซึ่งยากกว่า C ใดด้านการเรียนรู้เพราะต้องเรียนคอนเซปจากทั้ง OOP และ Structure ของ C แต่ว่าตอนเขียนนั้นง่ายกว่ามากหลังจากเข้าใจแล้วเนื่องจากว่าเครื่องมือจาก OOP นั้นช่วยให้เขียนง่ายขึ้นมากๆ
(ยืมภาพประกอบจากกราฟการเรียนรู้(Learning curves)ของภาษาอื่นเพื่อความฮา)


ส่วนตัวผมคิดว่ามือใหม่นั้นน่าจะเริ่มจากภาษาที่เขียนง่ายอย่าง GO, Python หรือ Vb.net(IDE ของ Visual studio นี่แทบจะจับมือเขียนอยู่แล้ว แถมมีพิมพ์แก้โค๊ดให้เราด้วยซ้ำไป) ซึ่งจะได้โฟกัสไปยังเรื่อง logic และ flow มากกว่าต้องมานั่งกังวลเรื่อง syntax หรือคอนเซปอื่นๆ (ภาษาอย่าง C# และ Java นั้นผมเห็นว่าต้องคล่องมาระดับหนึ่งก่อนย้ายไปเขียนเพราะภาษาคู่นี้ค่อนข้างเคร่งกฏพอสมควร หยวนๆ ไม่ได้เด็ดขาด) หลังจากเข้าใจ logic และ flow แล้วเดียวก็จะมีเวลาศึกษา language feature ของภาษาและคอนเซป OOP เอง ซึ่งพอเข้าใจแล้วการย้ายไปภาษาอื่นก็เพียงศึกษา syntax เพียงเท่านั้น(เป็นส่วนที่เรียนง่ายที่สุด) และ language feature แต่ถ้าภาษาที่ย้ายไปมีคอนเซปอื่นอย่างเช่น Functional programming หรือ Parallel programming อันนี้ก็ต้องไปไต่เขาศึกษาเพิ่มเติมกัน

ฝากถึงน้องๆ ที่ได้เรียนเขียนโปรแกรมด้วยภาษาที่ง่ายอยู่แล้วอย่าง VB.Net ว่าน้องโชคดีแล้ว นั่นนะง่ายที่สุดแล้ว ไปเรียนเพิ่มเติมใน Youtube เอาก็ได้มีคนสอนเป็นภาษาไทยก็มี ไม่ต้องเอาการบ้านมาตั้งกระทู้ถามหรอกครับ ใครได้เรียน C ก็ค่อยๆ ศึกษาใช้ที่อาจารย์ให้มานั่นแหละครับอย่าไปเล่นของแปลกเพราะภาษานี้ Error เป็นเรื่องปรกติเหมือนการเป็นไข้หวัดหากยังไม่เข้าใจว่ากำลังเขียนอะไรอยู่

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