จงเป็น Polyglot Programmer!

Nuttavut Thongjor

ช่วงนี้เริ่มเห็นคนพูดถึง Polyglot Programmer มากขึ้น บางบริษัทเริ่มหาเหยื่อที่เป็น polyglot ร่วมทำงานบ้างแล้ว ก่อนที่เราจะไปถึงจุดนั้นมารู้จักกันก่อนครับว่า polyglot programmer คืออะไร เกี่ยวข้องอะไรกับแผนกทะลวงไขมันรอบพุงของประตูน้ำโพลี่คลินิกไหม

ต้องออกตัวก่อนครับว่าผู้เขียนไม่ได้เก่งขนาดจะแนะนำความเป็น polyglot programmer ได้ ให้ถือซะว่าบทความนี้เป็นเพียงมุมมองส่วนหนึ่งของผู้เขียนครับไม่ใช่คำแนะนำ แต่ถ้าเพื่อนๆคนไหนจะหยิบยกไปใช้ผู้เขียนก็จะยินดียิ่งฮะ

Polyglot Programming คืออะไร

ภาษาโปรแกรมแต่ละตัวเหมาะกับงานแต่ละแบบ แม้บางภาษาจะขนานนามตัวเองว่าเป็น general-purpose programming หรือทำได้ตั้งแต่สากกะเบือยันเรือรบ แต่เชื่อเถอะว่าไม่มีภาษาไหนเก่งจนทำได้ดีในทุกด้านขนาดนั้น

เว็บแอพพลิเคชันที่เราใช้งานกันทุกวันนี้อย่างน้อยก็ต้องประกอบด้วย JavaScript โดยภาษาฝั่งข้างหลังเป็นได้ตั้งแต่ PHP, Ruby, Java ยัน Cobol ภาษาแต่ละตัวล้วนเก่งกันคนละด้านและมีข้อจำกัดที่ไม่เหมือนกัน เราจึงต้องเลือกใช้ภาษาที่เก่งในด้านที่เราต้องการใช้ ทั้งนี้เพื่อให้ตอบสนองกับความต้องการของลูกค้าหรือพระเจ้าทางธุรกิจของเรา

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

ภาวะร่วมที่เราใช้มากกว่าหนึ่งภาษาเพื่อให้แอพพลิเคชันของเราทำงานได้เรียกว่า polyglot programming หลักการของเราคือ ไม่ได้ใช้ภาษาตามเทรน ไม่ได้เลือกภาษาตามความชอบใจส่วนตัว แต่เราเลือกภาษาที่เหมาะกับงานในส่วนนั้นหรือเรียกเป็นภาษาฝรั่งแบบเท่ๆว่า use the right tool for the right job!

รู้จัก Polyglot Programmers

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

เพื่อนๆบางคนอาจเกิดคำถาม ก็ฉันเป็น iOS developer ทำไมฉันต้องไปรู้จัก PHP ด้วยหละ เราก็มีทีมทำ API server แยกอยู่แล้วไม่ใช่หรอ? จะศึกษาภาษาเพิ่มไปเพื่อ... เสียเวลาจับโปเกมอนชะมัด

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

โปรแกรมเมอร์ที่รอบรู้หลายภาษานี่หละครับเรียกว่า polyglot programmers แต่ช้าก่อนการที่เรารู้หลายภาษาไม่ใช่เรื่องดีไปกว่าการรู้ภาษาเดียวอย่างเข้าใจนะครับ มันต้องมีหลายกลไกที่ทำให้คุณเป็นผู้ช่ำชองทางภาษา มากกว่าการเป็นนักท่องไวยากรณ์ตัวยง

หนทางสู่ Polyglot Programmers

สำหรับผม polyglot programmer ไม่ใช่นักท่องไวยากรณ์ครับ เพื่อนๆไม่จำเป็นต้องพูดได้ 5 ภาษาแบบคุณนาxxาน โอxxxน แต่ละภาษาส่วนใหญ่จะมีจุดร่วมคล้ายๆกันครับ ถ้าเป็นหนึ่งภาษาแล้วจะสามารถเดินต่อไปภาษาที่สองสามสี่ได้ง่าย แต่อุปสรรคที่ทำให้ไปไม่ถึงดวงดาวนั่นคือ programming paradiam หรือแปลเป็นไทยง่ายๆว่า กระบวนทัศน์การเขียนโปรแกรม (นี่ง่ายแล้วหรอ - -)

ภาษาโปรแกรมต่างกันย่อมมีรูปแบบการเขียนต่างกัน บางภาษาเป็น Object-Oriented ก็จะมีจุดร่วมที่คล้ายกับ OOP ภาษาอื่น ส่วนภาษาตระกูล Functional Programming ก็จะมีจุดคล้ายของภาษาตระกูลเดียวกันเช่นกัน การหัดเขียนภาษาโปรแกรมอื่นใน paradiam เดียวกันจึงเป็นเรื่องที่ง่ายมาก แทบไม่ต้องเปลี่ยนหัวคิด แค่ศึกษาไวยากรณ์ของภาษาใหม่แค่นั้น

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

  • OOP: เลือกหนึ่งภาษาจาก C++, C#, Java, Ruby
  • Functional: เลือกหนึ่งภาษาจาก Haskell, Erlang, Elixir, Clojure
  • Declarative: เลือกหนึ่งภาษาจาก SQL
  • Logic: เลือกหนึ่งภาษาจาก Prolog, GHC, Parlog

จากตัวอย่างข้างต้นผมอาจจะหัด OOP จากภาษา Java เลือกฝึก functional programming จาก Clojure และฝึกคิดเพื่อเขียน AI ไปกับ Prolog เป็นต้น

สำหรับผมแนะนำว่าเพื่อนๆควรจะจับ OOP ให้เป็นซักภาษา ศึกษา functional programming ให้ได้ซักภาษา และอย่าลืมอีกสองภาษาที่เป็น dynamic programming และ static programming (typed system) ด้วยเช่นกัน

สิ่งสำคัญสำหรับ Polyglot Programmers

ตามที่กล่าวข้างต้นครับ polyglot programmers ไม่ใช่นักท่องไวยากรณ์ เราคือผู้รู้รอบเพื่อปรับเปลี่ยนตัวเองได้ง่ายต่อการเรียนรู้ภาษาอื่น ดังนั้นแล้วสิ่งต่อไปนี้จำเป็นยิ่งต่อการเป็น polyglot programmers

รากฐานคณิตศาสตร์

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

ถ้าเพื่อนๆคนไหนจบจากสาขาคอมพิวเตอร์โดยตรง วิชาแรกที่ได้เรียนน่าจะเป็น discrete mathematics แปลเป็นไทยว่าคณิตศาสตร์แบบจำนวนไม่ต่อเนื่อง ในวิชาแคลคูลัสเราศึกษาถึงความต่อเนื่องของตัวเลขครับ เช่นการหาลิมิตเมื่อ x เข้าใกล้ศูนย์ ลองจินตนาการดูครับคำว่าเข้าใกล้ศูนย์แสดงว่า x อาจเป็น 0.000001 ก็ได้ หรือเป็น 0.0000001 ก็ย่อมได้เพราะทั้งคู่ล้วนใกล้ศูนย์ เลขเหล่านี้มันอยู่ติดๆกันบนเส้นจำนวนใช่ไหมครับ เราจึงบอกว่าเลขเหล่านี้มีความต่อเนื่อง แต่ discrete mathematics จะเป็นเรื่องของสิ่งที่เป็นค่าไม่ต่อเนื่องกัน เช่น True, False สองตัวนี้คือค่าบูลีนจากตรรกศาสตร์ จะเห็นว่ามันแยกกันเลย True ก็คือ True ไม่มี True.5 เหมือน 0.5 ที่อยู่ระหว่าง 0 กับ 1 ใช่ไหมครับ นั่นหละครับมันจึงไม่ต่อเนื่องเพราะมีค่าเฉพาะตัวไปเลย

นอกเรื่องซะเยอะ กลับเข้าฝั่งกันเถอะ discrete mathematics เป็นหัวใจของศาสตร์คอมพิวเตอร์ครับ มันรวมทุกสิ่งอย่างที่เราใช้เขียนโปรแกรมกันทุกวันนี้ ไม่ว่าจะเป็นตรรกศาสตร์ที่เราใช้ตั้งประโยคเงื่อนไขใน if-else ทุกวันนี้ หรือเรื่อง recusive function ก็อยู่ในวิชา discreate mathematics เช่นกัน ในส่วนของ data structure พวก graph ก็อยู่ในส่วนของ graph theory ของ discrete mathematics ด้วย แม้แต่การออกแบบคอมไพเลอร์ก็ยังอิงกับทฤษฎีการคำนวณเช่นกัน จึงไม่ต้องแปลกใจครับที่วิชานี้จะเป็นวิชาบังคับของเด็กปี 1

และสิ่งต่อไปนี้คือคณิตศาสตร์ที่ผมคิดว่ามีความจำเป็นยิ่งต่อความเป็น polyglot programmer

  • discrete math: อันนี้ตามอธิบายข้างต้นครับ จำเป็นมาก
  • วิชาสถิติและความน่าจะเป็น: ต้องบอกว่าวิชานี้คือวิชาโคตรจะสำคัญครับ ทุกส่วนของคอมพิวเตอร์คือสถิติ ทุกส่วนของโปรแกรมคือความน่าจะเป็น คุณจะทำ data mining คุณจะเรียน machine learning คุณจะวิเคราะห์อัลกอริทึม ทุกอย่างล้วนใช้สถิติครับ
  • แคลคูลัส: การออกแบบอัลกอริทึมก็ต้องใช้ คอมพิวเตอร์กราฟฟิกก็ต้องใช้ การประมวลผลภาพก็ต้องใช้ สรุปคือจำเป็นอย่างยิ่งเช่นกันครับ แต่สำหรับผมให้เป็นรองสถิติอีกที
  • พีชคณิตเชิงเส้น (Linear Algebra) เป็นอีกวิชาที่โคตรสำคัญเช่นกันครับ
  • อื่นๆ เช่น ทฤษฎีกราฟ, ทฤษฎีจำนวน, ทฤษฎีการเข้ารหัส เป็นต้น

จากเหตุผลข้างต้นคณิตศาสตร์จึงเป็นเรื่องสำคัญครับ คุณเป็น coder เมื่อคุณเขียนโค๊ดได้ คุณแก้ปัญหาด้วยโค๊ดได้อย่างดีคุณจึงเป็น programmer คุณวิเคราะห์และเข้าใจระบบอย่างที่มันเป็น สื่อสารกับเพื่อนร่วมทีมและร่วมโลกธุรกิจอย่างเข้าใจ คุณจึงเป็น developer แต่ถ้าคุณอยากเป็น polyglot programmer คุณต้องเก่งคณิตศาสตร์

อัลกอริทึม

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

เพื่อนๆที่สนใจอัลกอริทึมสามารถติดตามอ่านบทความได้ที่ สอนการออกแบบและวิเคราะห์อัลกอริทึม

Design Pattern

นี่คือเรื่องสำคัญลำดับสาม ไม่ว่าคุณจะรู้ภาษาอะไร เขียนให้มันใช้งานได้ดีขนาดไหน แต่จะลืมไม่ได้ว่าเราใช้เวลาเขียนโค๊ดชิ้นใหม่แค่ 20% อีก 80% ที่เหลือเรามักใช้ไปกับการอ่านโค๊ดเดิมหรือแก้ไขสิ่งที่เคยเขียนมาแล้ว ต่อให้คุณมีอัลกอริทึมเทพขนาดไหน ถ้าเพื่อนร่วมทีมอ่านไม่รู้เรื่อง ธุรกิจของคุณก็เดินต่อไปไม่ได้ ด้วยเหตุนี้ถ้าเราไม่รู้จักการออกแบบโค๊ดที่ดีเพียงพอ ต่อให้เรารู้ภาษาเยอะแค่ไหนก็ได้แค่เปลี่ยนไวยากรณ์โดยโค๊ดจากภาษาใหม่ก็ยังดูไม่เข้าท่าเช่นเดิม

เพื่อนๆที่สนใจอ่านเพิ่มเติมเกี่ยวกับ design pattern สามารถดูเพิ่มเติมที่ชุดบทความ Principle และ Design Pattern สำหรับโลก OOP สมัยใหม่

ภาษาอังกฤษ

ภาษาอังกฤษมีส่วนสำคัญต่อการอ่านเอกสารต่างๆทางภาษา เทคโนโลยีใหม่ๆทางคอมพิวเตอร์ล้วนมาจากฝั่งตะวันตก ถ้ายังไม่ถึงศตวรรษที่ 22 ยังไม่มีโดราเอมอนและยังขาดแคลนวุ้นแปลภาษา พวกเราก็คงต้องก้มหน้าก้มตาเรียนภาษาอังกฤษไปแบบ snakeๆ fishๆ กันต่อไปฮะ

การที่เราเขียนโปรแกรมได้หลายรูปแบบจะช่วยให้เราเขียนโปรแกรมได้ดีขึ้น เราทราบดีว่า functional programming ทำให้เราทดสอบโปรแกรมง่ายขึ้น แต่การทำงานบนเว็บยังอิงอยู่กับ JavaScript เมื่อเราเป็นการเขียนโปรแกรมแบบฟังก์ชัน เราจึงประยุกต์เอาข้อดีของมันมาใช้กับ JavaScript ได้โดยไม่ต้องเปลี่ยนภาษาโปรแกรม และนั่นหละครับคือข้อดีของการเป็น polyglot programmer

สารบัญ

สารบัญ

  • Polyglot Programming คืออะไร
  • รู้จัก Polyglot Programmers
  • หนทางสู่ Polyglot Programmers
  • สิ่งสำคัญสำหรับ Polyglot Programmers