Tour de France #1 : Algorithm

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

    เอาหละ เมื่อคุณเลือกภาษาได้แล้ว (ไม่จำเป็นต้องเป็น C# อย่างผม) ก้าวต่อไปที่ควรจะทำคืออะไร ก็แน่นอนครับ คุณต้องศึกษา Syntax ต่างๆ ของภาษาให้เข้าใจ ถ้าหาใครสอนไม่ได้ก็ต้องพึ่งตำรา แต่ก็ต้องเลือกให้ดีครับ เพราะคุณภาพของตำราแต่ละเล่ม มันค่อนข้างแตกต่างกันมาก ใช่ว่าตำราฝรั่งทุกเล่มจะดีเสมอไปนะครับ ที่ดีก็มีน้อย เวลาเลือกต้องลองอ่านดูก่อน ตำรามันแพงครับ

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

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

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

    ซึ่งในบทนี้ ผมจะเน้นเฉพาะ Algorithm ครับ

Algorithm

    นักศึกษาสมัยนี้ ไม่ค่อยมีใครสนใจเรื่อง Algorithm กันแล้ว ส่วนมากจะเน้นไปที่การทำ Web เพราะคิดว่าตลาดทำ Web มันยังเปิดกว้าง ซึ่งมันก็จริงครับ แต่ถ้าคุณเริ่มเขียน Web หรือโปรแกรมอะไรลึกขึ้น เริ่มมีเนื้อ สุดท้ายคุณก็ติด ไปไม่รอด

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

    แน่นอนครับ ผมกำลังพูดถึง Algorithm ระหว่าง Algorithm ที่ดีแล้วแลว แล้ว Algorithm มันคืออะไร? ถ้าจะเอานิยามแบบชาวบ้าน Algorithm คือขั้นตอนในการแก้ปัญหาใดปัญหาหนึ่ง เมื่อเรามีปัญหา เช่น ต้องการไปเชียงใหม่ หรือ เราต้องการเรียงลำดับข้อมูล Algorithm จะเป็นวิธีการที่ทำงานนั้นให้สำเร็จครับ

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

    การที่จะบอกให้ได้ว่า Algorithm ใดดีกว่าอีกตัวหนึ่ง มีการคิดค้นตัววัดขึ้นมาครับ เช่นการใช้ Big O ซึ่งเป็นตัววัดเรื่องความเร็ว ในการวัดเรื่องความเร็วนี้ เราคงไม่สามารถใช้วิธีการจับเวลาได้ (Benchmark) เนื่องจาก มันมีตัวแปรเยอะเกินไป เช่นในเรื่องของการเรียงลำดับข้อมูล มันก็มีเรื่องการเรียงตัวกันของข้อมูลดิบ เป็นต้น ดังนั้น เราจึงใช้วิธีการทางคณิตศาสตร์ในการคำนวณหาค่า จะได้สามารถเปรียบเทียบโดยใช้ไม้บรรทัดเดียวกัน

    มีคนจำนวนไม่น้อยที่ศึกษา Algorithm อย่างหยาบๆ ทำนองว่า เก็บรวบรวม Algorithm แต่ตัวเองไม่ได้เจาะลึกศึกษาอย่างจริงจัง แต่เมื่อเวลาจำเป็นต้องนำมาใช้ ก็สามารถเรียกใช้ได้อย่างมีประสิทธิภาพ แบบนี้ก็ยังดีกว่าไม่สนใจเอาเสียเลย

    แต่ถ้าคุณคิดจะเป็นโปรแกรมเมอร์ที่เก่ง คุณไม่ควรทำอย่างนั้น เพราะการทำอย่างข้างบนนั้น ในมุมมองของผม คือคุณจับผลัดจับผลูมาเป็นโปรแกรมเมอร์ คุณไม่ได้มีใจรักมันจริงๆ

    ผมขอแนะนำให้คุณศึกษา Algorithm อย่างลึกซึ้ง ดูว่ามันทำงานได้อย่างไร ไม่เสียเปล่าหรอกครับ แนวคิดที่ซ่อนเอาไว้เหล่านี้ คุณสามารถนำเอาไปประยุกต์ใช้ในงานของคุณเองได้ แล้วคุณจะแปลกใจที่เห็นว่าคุณมีแนวคิดในการแก้ปัญหาใหม่ๆ เกิดขึ้นมา ยิ่งคุณศึกษา Algorithm มาขึ้นเท่าไหร่ คุณจะได้รับรางวัลตอบแทนมากขึ้นเท่านั้น

    ในส่วนต่อไปนี้ผมขอแนะนำหนังสือไว้ให้อ่านกันครับ

The Art of Computer Programming

    ในวงการคอมพิวเตอร์ มีหนังสือชุดหนึ่งที่เป็นที่ยอมรับกันมากว่าสุดยอด นั่นคือ The Art of Computer Programming ของ Knuth ซึ่งหนังสือชุดนี้ มีอายุประมาณ 30 ปีแล้ว แต่ก็ยังอภิมหาอมตะนิรันดร์กาลอยู่ เนื้อหาไม่ได้ล้าสมัยเลย ยังคงความ คมชัดลึก อยู่เต็มที่ครับ ความตั้งใจของผู้เขียน คือต้องการเขียนให้ได้ 7 เล่ม แต่ผ่านมาแล้ว 30 ปี ยังได้แค่ 3 เล่ม นัยว่าเล่ม 4 จะคลอดอีกในไม่ช้านี้ หนังสือชุดนี้ ถ้าคุณยังไม่เคยอ่าน ผมขอแนะนำว่าอย่าได้คิดไปอ่าน เพราะมันยากมาก ะตัวอย่างทั้งหมดใช้ภาษา Assembly ครับ แถมหนังสือทั้งเล่มยังเป็น คณิตศาสตร์ ทั้งเล่ม อ่านยากมากครับ แต่ถ้าคุณเอกคณิตศาสตร์ก็เป็นอีกเรื่องหนึ่ง

    คณิตศาสตร์เป็นสิ่งสำคัญสำหรับคอมพิวเตอร์ครับ แต่วิชาคณิตศาสตร์ต้องถือว่าเป็นหนึ่งในวิชาที่นักเรียนเกลียดกันมากที่สุด ดังนั้นจึงมีการยำเอาวิชาคณิตศาสตร์พื้นฐานที่คิดว่าเกี่ยวข้องกับคอมพิวเตอร์ แตกออกมาเป็นอีกสาขาหนึ่งที่ชื่อว่า คณิตศาสตร์ไม่ต่อเนื่อง (Discrete Mathematics) ก็เรื่องมันอิสระต่อกัน แต่ละเรื่องมันส่งเสริมความรู้ทางคอมพิวเตอร์เรื่องต่อเรื่องครับ ซึ่งสิ่งนี้ Knuth ไม่เห็นด้วยอย่างมาก เขาบอกว่า Discrete Math เป็นสิ่งที่ไม่พอสำหรับโปรแกรมเมอร์ ดังนั้น Knuth จึงคิดค้นคณิตศาสตร์สาขาใหม่ขึ้นมาที่ตั้งชื่อว่า Concrete Mathematics ซึ่งถ้าคุณจะศึกษาหนังสือของ Knuth จริงๆ ต้องหา Concrete Math มาอ่านเป็นการปูพื้นฐานก่อนครับ

    หนังสือชุดนี้ผมยอมรับครับว่าผมอ่านไม่จบ มันโหดเหลือเกิน ตั้งใจมานานแล้วว่าจะเอาชนะให้ได้ แต่จนวันนี้ก็ยังไม่มีหวังครับ เวลานี้ผมใช้มันเป็น Reference เท่านั้นครับ

 Algorithm ของ Sedgewick

    ถ้าคุณอยากศึกษา Algorithm แต่ไม่รู้จะเริ่มต้นที่ไหน ผมขอแนะนำของผู้เขียนเล่มนี้ มี version เป็นภาษา C, C++ และ Java  ชอบภาษาไหนเลือกเอาครับ หนังสือเล่มนี้ผู้แต่งคือ Sedgewick  ซึ่งผู้นี้เป็นลูกศิษย์ของ Dr. Knuth นั่นเอง หนังสือเล่มนี้วิธีการนำเสนอค่อนข้างง่ายครับ ตัดเอาคณิตศาสตร์ออกเกือบทั้งหมด แนวทางในการเขียนหนังสือ คล้ายกับ Knuth ครับ คือแบ่งออกเป็นส่วนๆ ทั้งหมดมี 8 ส่วน ขณะนี้เสร็จไปแล้ว 5 ส่วน ลองอ่านดูครับ ไม่ผิดหวังแน่นอน

Introduction to Algorithms ของ Cormen

    ถ้าคุณอ่านหนังสือของ Sedgewich จบ ก้าวต่อไปคุณน่าจะไปที่ Cormen หนังสือเล่มนี้มีอายุกว่า 10 ปีแล้ว เมื่อไม่นานมานี้มีการปรับปรุงครั้งใหญ่ เป็นครั้งที่ 2 หนังสือเล่มนี้เป็นหนังสือลูกหม้อของ MIT อย่างแท้จริงครับ นักศึกษา MIT ใช้หนังสือเล่มนี้เป็นหลัก จะให้น้อยหน้า Standford ของ Dr. Knuth ได้อย่างไรครับ เขาต้องมีเป็นของตัวเองบ้าง มิฉะนั้นจะเสียหน้ามาก

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

    หนึ่งในทีมเขียนหนังสือเล่มนี้คือ Ron Rivest ซึ่งเป็นตัว R ใน Algorithm RSA ที่ใช้เข้ารหัสข้อมูลยอดนิยม

    ถ้าคุณสามารถอ่านของ Cormen ได้ เป้าหมายต่อไป ผมว่าคุณสามารถเอาชนะหนังสือของ Knuth ได้โดยไม่ยากครับ

 

Specific Algorithm

    หนังสือทั้ง 3 เล่มนี้ เน้น Algorithm แบบทั่วไปเท่านั้น แต่ Algorithm มันไม่ได้จบเพียงเท่านี้นะครับ มันยังมี Algorithm อย่างอื่นอยู่อีก ผมจะลองยกตัวอย่างดู

Graphic

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

AI

    ผมค่อนข้างจะแปลกใจที่ AI ไม่ถูกรวมเข้าไปใน Generic Algorithm ซึ่งส่งผลให้ Resource ของ AI นั้นหายากซักหน่อย (มีใน Knuth ครับ) Algorithm ของ AI บางส่วนอิงกับ Graphic บางส่วนอิงกับ Compiler แต่ที่เป็นพื้นๆ คือเรื่องของการแก้ปัญหาครับ เช่น พวกเกมส์ต่างๆ แต่เกมส์ที่ดังๆ ก็เช่นหมากรุกครับ เพราะปัจจุบันสามารถโค่นแชมป์โลกลงได้เป็นที่เรียบร้อยแล้ว ถ้าสนใจเกี่ยวกับ Algorithm ทางด้านการแก้ปัญหา ลองหาดูจาก Algorithm ชื่อ MiniMax, Alpha-beta Pruning, Heuristic.

    ถ้าคุณสนใจทางด้าน AI ยังมีศาสตร์อีกตัวหนึ่งที่คุณควรศึกษา นั่นก็คือ Game Theory ซึ่งเป็นวิชาที่ทางด้านเศรษฐศาสตร์เขาศึกษากัน ซึ่งเกมส์หนึ่งในนั้นผมเคยนำเสนอไปแล้ว คือเรื่อง Prisoner Dilemma  ซึ่งใช้ Web Service Implement , อย่าเห็นว่า โจทย์นั้นง่ายๆ นะครับ แค่เรื่อง Prisoner Dilemma เรื่องเดียว เขียนวิเคราะห์กันได้เป็นเล่มๆ

Operation Research

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

 

Encryption

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

    Algorithm ในการเข้ารหัสนั้น เคยเป็นสิ่งที่เรียนรู้กันยาก เพราะ ถือว่าเป็นของต้องห้าม กระทบถึงความมั่นคง และอีกอย่าง คือเป็นคณิตศาสตร์ ที่ซับซ้อน ทำให้ใครรู้เรื่องนี้ ก็มีเชื่อเสียง แต่เชื่อผมเถอะ ศาสตร์นี้ไม่ใช่ของยาก ถ้าคุณสนใจเรื่องการเข้ารหัส ผมขอแนะนำหนังสือ  Applied Cryptography: Protocols, Algorithms, and Source Code in C ของ Schneier อ่านง่ายและค่อนข้างกว้าง

 

สรุป

    เลิกสนใจภาษา รีบเลือกแล้ว ไปให้ไกลกว่าที่เป็นอยู่ ดีกว่าครับ