เรียนรู้การเขียนโปรแกรมด้วยตัวเองในสิบปี
Teach Yourself Programming in Ten Years
http://www.norvig.com/21-days.html
ทำไมต้องรีบเร่งมากมายขนาดนี้ ?
เมื่อคุณเดินเข้าไปในร้านหนังสือ คุณจะพบหนังสืออย่าง “เรียนรู้ภาษาจาวาด้วยตัวเองใน ๗ วัน” (“Teach Yourself Java in 7 Days”) วางอยู่ท่ามกลางหนังสือประเภทเดียวกันนี้ที่มีอยู่อย่างมากมายมโหฬาร ไม่ว่าจะสอนภาษา Visual Basic สอนใช้ระบบปฏิบัติการ Windows สอนใช้อินเตอร์เน็ต หรือสอนอะไรต่างๆ ภายในเวลาไม่กี่วัน หรือเพียงไม่กี่ชั่วโมง ผมลองค้นชื่อหนังสือที่มีคำว่า “วัน” และมีคำว่า “เรียนรู้” หรือ “เรียนรู้ด้วยตัวเอง” ที่พิมพ์หลังปี 1992 ใน Amazon.com [1] และพบหนังสือ ๒๔๘เล่ม โดยที่ ๗๘เล่มแรกเป็นหนังสือคอมพิวเตอร์ (ส่วนเล่มที่ ๗๙คือหนังสือ “เรียนรู้ภาษาเบงกอลใน ๓๐ วัน”) เมื่อผมลองแทนคำค้นจาก “วัน” เป็น “ชั่วโมง” ผมก็พบผลการสืบค้นที่คล้ายกันมาก คือพบหนังสืออีก ๒๕๓ เล่ม โดยที่ ๗๗ เล่มแรกเป็นหนังสือคอมพิวเตอร์ และตามมาด้วย “เรียนรู้ไวยากรณ์และรูปแบบทางภาษาใน ๒๔ ชั่วโมง” (“Teach Yourself Grammar and Style in 24 Hours”) เป็นเล่มที่ ๗๘. จากหนังสือที่ค้นมาได้ ๒๐๐ เล่มแรก เป็นหนังสือคอมพิวเตอร์ถึง 96%
ดังนั้น ผมพอสรุปได้ว่า ผู้คนต้องการเรียนรู้คอมพิวเตอร์อย่างเร่งด่วน หรือไม่ก็ การเรียนรู้คอมพิวเตอร์เป็นเรื่องง่ายดายมากกว่าเรื่องอื่นๆ. ผมไม่เคยเห็นหนังสือสอนเรื่องบีโธเฟน (Beethoven) ควอนตัมฟิสิกค์ (Quantum Physics) หรือการตัดขนสุนัข ภายในเวลาสองสามวัน. Felleisen และคณะมองเห็นแนวโน้มของแนวคิดนี้ และเขียนในหนังสือของพวกเขาที่ชื่อ How to Design Programs ไว้ว่า “การเขียนโปรแกรมห่วยๆ นั้นทำได้ง่ายมาก คนปัญญาอ่อนก็เรียนรู้ได้ใน ๒๑ วัน แม้ว่าจะเป็นคนโง่ๆ แค่ไหนก็ตาม” [2]
เราลองมาวิเคราะห์กันหน่อยดีกว่าว่า ชื่อหนังสืออย่าง “เรียนรู้ภาษา C++ ภายใน ๓ วัน” บอกอะไรเราได้บ้าง:
- เรียนรู้: ภายใน ๓ วัน คุณไม่มีเวลาที่จะลงมือเขียนโปรแกรมอย่างเป็นเรื่องเป็นราวได้มากนัก จนสามารถเรียนรู้จากความสำเร็จและความล้มเหลวของโปรแกรมที่ได้เขียนไป. คุณไม่มีเวลาที่จะได้ทำงานร่วมกับโปรแกรมเมอร์ที่มีประสบการณ์ จนเข้าใจลึกซึ้งเพียงพอว่าการเขียนโปรแกรมด้วย C++ แท้จริงแล้วต้องคิดและทำงานกันอย่างไร. สรุปง่ายๆ คุณไม่มีเวลาที่จะเรียนรู้ได้มากนักหรอก หนังสือเล่มนี้เพียงแค่ให้ความเข้าใจอย่างผิวเผิน ไม่ได้ลงลึกอะไรมากมาย. Alexander Pope เคยกล่าวไว้ว่า การเรียนรู้อย่างผิวเผินเป็นเรื่องอันตราย.
- ภาษา C++ : ภายใน ๓ วัน คุณอาจศึกษาโครงสร้างภาษา C++ ได้บางส่วน (ถ้าคุณเคยรู้ภาษาคอมพิวเตอร์ภาษาอื่นมาก่อนแล้วนะ) แต่คุณแทบจะไม่ได้เรียนรู้ว่าจะใช้ภาษานั้นอย่างไร. สรุปสั้นๆ โดยสมมติว่า ถ้าคุณเป็นนักเขียนโปรแกรมภาษาเบสิค คุณสามารถเรียนรู้การเขียนโปรแกรมในสไตล์ของภาษาเบสิค ด้วยรูปแบบของภาษา C++. แต่คุณไม่สามารถเรียนรู้ได้ว่าภาษา C++ นั้นจริงๆ แล้วมีข้อดี (หรือข้อเสีย) ที่ตรงไหน. ถ้าเช่นนั้น ประเด็นของผมคืออะไร ? Alan Perlis เคยกล่าวไว้ว่า “ภาษาที่ไม่มีอิทธิพลต่อวิธีคิดในการเขียนโปรแกรมของคุณนั้น ไม่มีค่าพอที่จะเรียนรู้หรอก” อีกประเด็นที่เป็นไปได้คือ คุณอาจต้องการเรียนรู้ภาษา C++ บ้างนิดหน่อย (หรืออาจจะเป็นภาษาอื่นๆ เช่น JavaScript หรือ Flash Flex) เพียงเพราะว่าคุณต้องการใช้งานเครื่องมือที่มีอยู่แล้วเพื่อทำงานบางอย่างให้สำเร็จ แต่นั่นไม่ได้หมายความว่าคุณกำลังเรียนรู้การเขียนโปรแกรมหรอกนะ คุณกำลังเรียนรู้ที่จะทำงานชิ้นนั้นให้สำเร็จต่างหาก.
- ภายใน ๓ วัน : น่าเสียดาย เวลาเพียงแค่ ๓ วัน ไม่พอหรอก อย่างที่จะบอกให้หัวข้อถัดไป.
เรียนรู้การเขียนโปรแกรมด้วยตัวเองในสิบปี
บรรดานักวิจัย (Bloom 1985[3], Bryan & Harter 1899[4], Hayes 1989[5], Simmon & Chase 1973[6]) ได้แสดงให้เห็นว่า จะต้องใช้เวลาประมาณ ๑๐ ปี เพื่อพัฒนาความเชี่ยวชาญในแขนงต่างๆ ซึ่งรวมไปถึงการเล่นหมากรุก การประพันธ์ดนตรี การส่งโทรเลข การวาดภาพ การเล่นเปียโน การว่ายน้ำ การเล่นเทนนิส และการทำวิจัยด้านประสาทจิตวิทยา (neuropsychology) และทอพอโลยี (topology). สิ่งสำคัญคือการฝึกฝนอย่างมีแบบแผน[7] (deliberative practice) ซึ่งไม่ใช่เพียงแค่ทำซ้ำแล้วซ้ำเล่า แต่ต้องท้าทายตนเอง ด้วยการทำสิ่งที่เกินความสามารถในปัจจุบัน พยายามฝึกฝนและวิเคราะห์ตัวเองทั้งในขณะที่ทำงานนั้นๆ และหลังจากที่ทำเสร็จสิ้นแล้ว และแก้ไขความผิดพลาดทั้งหลายที่เกิดขึ้น หลังจากนั้นจึงทำซ้ำไปมาอย่างต่อเนื่อง. ดูเหมือนว่าจะไม่มีเส้นทางลัดแน่ๆ. แม้แต่โมสาร์ทซึ่งเป็นอัจฉริยะทางดนตรีตั้งแต่อายุ ๔ ขวบ เขาต้องใช้เวลามากกว่า ๑๓ ปี (ในการฝึกฝน) ก่อนที่จะเริ่มสร้างงานดนตรีระดับโลกได้. ในอีกฟากของวงการดนตรี ดูเหมือนว่าวงดนตรีสี่เต่าทอง (The Beatles) โด่งดังชั่วข้ามคืนด้วยเพลงฮิตอันดับหนึ่งหลายเพลงต่อเนื่อง และด้วยการปรากฏตัวในรายการ Ed Sullivan Show ในปี 1964 แต่จริงๆ แล้ว วงสี่เต่าทองเริ่มเล่นดนตรีในคลับเล็กๆ ในเมืองลิเวอร์พูลและฮัมบูร์ก มาตั้งแต่ปี 1957 และถึงแม้ว่าพวกเขาได้รับความนิยมอย่างมากตั้งแต่ช่วงแรกๆ แต่ความสำเร็จครั้งสำคัญครั้งแรกของพวกเขา กลับมาจากอัลบั้ม Sgt. Pepper's Lonely Hearts Club Band ซึ่งออกมาในปี 1967. Malcolm Gladwell รายงานผลการสำรวจนักศึกษาจากสถาบันดนตรีแห่งเบอร์ลิน โดยแบ่งนักศึกษาในชั้นออกเป็นสามกลุ่ม ได้แก่ กลุ่มท็อป กลุ่มปานกลาง และกลุ่มบ๊วย พร้อมกับถามนักศึกษาแต่ละคนว่าใช้เวลามากน้อยแค่ไหนในการฝึกฝนดนตรี.
นักศึกษาทุกคน จากทั้งสามกลุ่ม เริ่มเล่นดนตรีเมื่อมีอายุไล่เลี่ยกัน คือประมาณ ๕ ขวบ ในช่วง ๒-๓ ปีแรกๆ ทุกคนใช้เวลาฝึกฝนใกล้เคียงกัน ประมาณสองถึงสามชั่วโมงต่อสัปดาห์ แต่เมื่ออายุขึ้น ๘ ขวบโดยประมาณ ความแตกต่างก็เริ่มเกิดขึ้น เด็กที่จะกลายเป็นนักดนตรีที่เก่งกาจในรุ่น เริ่มฝึกซ้อมมากกว่าคนอื่นๆ: ๖ ชั่วโมงต่อสัปดาห์เมื่ออายุ ๙ ขวบ, ๘ ชั่วโมงเมื่ออายุ ๑๒, ๑๖ ชั่วโมงเมื่ออายุ ๑๔ และมากขึ้นเรื่อยๆ. จนเมื่ออายุ ๒๐ ปี เด็กพวกนี้ล้วนฝึกซ้อมมากกว่า ๓๐ ชั่วโมงต่อสัปดาห์. ตลอดช่วงเวลาตั้งแต่แรกหัดดนตรีจนมีอายุ ๒๐ ปี นักเรียนดนตรีชั้นยอดเหล่านี้ใช้เวลาฝึกซ้อมทั้งหมดนับ ๑๐,๐๐๐ ชั่วโมง ในขณะที่นักศึกษากลุ่มปานกลางใช้เวลาฝึกซ้อมรวม ๘,๐๐๐ ชั่วโมง และนักศึกษาที่น่าจะเป็นได้แค่ครูสอนดนตรีในอนาคต (เด็กกลุ่มบ๊วย – ผู้แปล) ใช้เวลาฝึกซ้อมรวมทั้งสิ้นเพียง ๔,๐๐๐ ชั่วโมง.
ดังนั้น มันอาจจะเป็นจำนวน ๑๐,๐๐๐ ชั่วโมง มิใช่ ๑๐ ปี ที่จะเป็นตัวเลขมหัศจรรย์ (Henri Cartier-Bresson (1908-2004) ช่างภาพชาวฝรั่งเศส ได้กล่าวไว้ว่า “ภาพถ่าย ๑๐,๐๐๐ ภาพแรกของคุณ ล้วนเป็นภาพที่แย่ที่สุด” แต่เขาถ่ายภาพได้ไม่กี่ภาพในหนึ่งชั่วโมง.) ส่วน Samuel Johnson (1709-1784) คิดว่ามันต้องใช้เวลานานกว่านี้: “ความเป็นเลิศในด้านใดก็ตาม จะได้มาก็โดยการทำงานหนักตลอดชีวิตเท่านั้น มันไม่สามารถซื้อหามาได้ที่ราคาต่ำกว่านี้.” และ Chaucer (1340-1400) เคยระบายออกมาว่า “ชีวิตแสนสั้น หากศิลปวิทยาล้วนมากมายเกินกว่าจะเรียนรู้หมดสิ้น.” Hippocrates (400 ปีก่อนคริสตกาล) บิดาแห่งการแพทย์แผนตะวันตก เป็นที่รู้จักกันดีจากวลี “ars longa, vita brevis” หรือ “ศิลปะยืนยาว ชีวิตสั้น” [8] อันเป็นส่วนหนึ่งของประโยคยาวๆ ที่ว่า "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile" ซึ่งถอดความได้ว่า “ชีวิตสั้น, ศิลปะยืนยาว, โอกาสมีน้อยนิด, การทดลองไม่น่าเชื่อถือ, การตัดสินล้วนยากเย็น.” ถึงแม้คำว่า “ars” ในภาษาละติน อาจหมายถึงได้ทั้งงานศิลปะและงานฝีมือ แต่คำว่า “techne” ในภาษากรีกหมายถึงทักษะเท่านั้น มิใช่ศิลปะ.
แสดงว่า คุณอยากจะเป็นโปรแกรมเมอร์ ?
นี่เป็นสูตรของผมที่จะประสบความสำเร็จในฐานะโปรแกรมเมอร์
- สนใจที่จะเขียนโปรแกรม และหัดเขียนโปรแกรมเพราะว่ามันสนุก. ต้องมั่นใจนะว่ามันสนุกมากพอที่คุณจะให้เวลากับมันเป็นสิบปี หรือ ๑๐,๐๐๐ ชั่วโมง.
- เขียนโปรแกรม. การเรียนรู้ที่ดีที่สุดคือการลงมือทำ (learning by doing) ถ้าจะว่ากันในทางเทคนิคแล้ว “คนเราจะบรรลุขีดความสามารถขั้นสูงสุดได้ มิใช่เกิดขึ้นเองจากการมีประสบการณ์อันยาวนาน แต่มาจากความพยายามตั้งใจแน่วแน่ที่จะปรับปรุงตนเองให้ดียิ่งขึ้น.”[9] และ “การเรียนรู้ที่ให้ผลดีที่สุด จะต้องประกอบด้วยภารกิจที่ชัดเจนและมีความยากในระดับที่เหมาะสมกับแต่ละบุคคล, เสียงสะท้อนตอบรับที่มีสาระ, และโอกาสที่จะทำงานซ้ำอีกครั้งเพื่อแก้ไขข้อผิดพลาดที่เคยเกิดขึ้น.” (หน้า ๒๐-๒๑) หนังสือชื่อ “Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life” เป็นแหล่งอ้างอิงที่น่าสนใจสำหรับมุมมองนี้.
- พูดคุยกับโปรแกรมเมอร์คนอื่นๆ และอ่านโปรแกรมของคนอื่น. เรื่องนี้สำคัญกว่าหนังสือหรือการฝึกอบรมมาก.
- ใช้เวลา ๔ ปีในรั้วมหาวิทยาลัย ถ้าคุณต้องการ (หรือมากกว่านั้น หากต้องการเรียนต่อปริญญาโทหรือเอก). การเรียนมหาวิทยาลัยจะทำให้คุณได้งานบางงานที่ต้องการความน่าเชื่อถือจากตัวคุณ (เช่น ใบปริญญา) และคุณจะได้เรียนรู้ความเข้าใจที่ลึกซึ้งในสาขาวิชานั้นๆ. หากคุณไม่ชอบเรียนหนังสือ แต่มีความทุ่มเท คุณสามารถหาประสบการณ์ที่คล้ายๆ กัน ได้ด้วยตัวเองหรือจากการทำงาน. ในหลายๆ กรณี การเรียนรู้จากหนังสือเพียงอย่างเดียวนั้น ไม่เพียงพอ. Eric Raymond ผู้เขียน “The New Hacker’s Dictionary” กล่าวไว้ว่า “การเรียนทางด้าน Computer Science ไม่ได้ทำให้ใครๆ เป็นโปรแกรมเมอร์ที่เก่งกาจได้ เช่นเดียวกับการเรียนเรื่องพู่กันและสี ก็ไม่สามารถทำให้คนๆ นั้นกลายเป็นจิตรกรใหญ่ไปได้.” โปรแกรมเมอร์ที่ดีที่สุดคนหนึ่งที่ผมเคยจ้างมา เรียนจบเพียงแค่ระดับมัธยมฯ ปลายเท่านั้น เขาเขียนซอฟต์แวร์ เจ๋งๆ มากมาย มีกลุ่มข่าว (news group) ของตัวเอง และทำงานจนได้สิทธิในหุ้นของบริษัทมากพอที่จะเปิดไนท์คลับของเขาขึ้นมาเอง.
- ทำโครงการหลายๆ ชิ้นร่วมกับโปรแกรมเมอร์คนอื่นๆ. ทำงานให้ดีที่สุดในบางโครงงาน และทำตัวให้แย่ที่สุดในงานที่เหลือ. ในโครงงานที่คุณทำดีที่สุด คุณจะได้ทดสอบความสามารถของคุณในการนำโครงงาน และการสร้างแรงบันดาลใจในทีมด้วยวิสัยทัศน์ของคุณ. ในโครงงานที่คุณทำตัวแย่ที่สุด คุณจะได้เรียนรู้ว่าผู้นำเก่งๆ เค้าทำอะไร และยังจะได้เรียนรู้อีกว่าเค้าจะไม่ทำอะไร (เพราะเค้าจะให้คุณทำแทนนั่นเอง).
- ทำโครงการหลายๆ ชิ้นต่อจากโปรแกรมเมอร์คนอื่นๆ. ทำความเข้าใจในโปรแกรมที่คนอื่นเขียน. ดูว่ามีอะไรเกิดขึ้นบ้าง เมื่อต้องทำความเข้าใจและแก้ไขโปรแกรมที่คนเขียนมันขึ้นมาไม่ได้อยู่ใกล้ๆ ให้สอบถาม. ให้ลองคิดว่า จะออกแบบโปรแกรมที่คนอื่นๆ สามารถดูแลแก้ไขต่อจากเราได้ง่ายขึ้น ได้อย่างไร.
- เรียนรู้ภาษาโปรแกรมคอมพิวเตอร์ต่างๆ อย่างน้อยครึ่งโหล. หนึ่งในนั้นต้องรองรับ class abstraction (เช่น Java หรือ C++), หนึ่งในนั้นต้องรองรับ functional abstraction (เช่น Lisp หรือ ML), หนึ่งในนั้นต้องรองรับ syntactic abstraction (เช่น Lisp), หนึ่งในนั้นต้องรองรับ declarative specification (เช่น Prolog หรือ C++ templates), หนึ่งในนั้นต้องรองรับ coroutine (เช่น Icon หรือ Scheme), และหนึ่งในต้องรองรับ parallelism (เช่น Sisal).
- จำไว้ว่า มีคำว่า “คอมพิวเตอร์” ใน “วิทยาการคอมพิวเตอร์”. ต้องรู้ว่าเครื่องคอมพิวเตอร์ของคุณจะใช้เวลามากน้อยแค่ไหนที่จะทำงานหนึ่งคำสั่ง, ที่จะดึงข้อมูลขนาดหนึ่ง word จากหน่วยความจำ (ทั้งกรณีที่เกิดและไม่เกิด cache miss), ที่จะอ่านข้อมูลหลายๆ word ติดต่อกันจากที่เก็บข้อมูล, และค้นหาตำแหน่งข้อมูลใหม่ในที่เก็บข้อมูล. (คำตอบอยู่ด้านล่าง)
- เข้าไปมีส่วนร่วมในการพยายามกำหนดมาตรฐานในการเขียนโปรแกรมคอมพิวเตอร์. อาจจะร่วมเป็นคณะกรรมการของANSI C++, หรืออาจจะตัดสินใจเลือกสไตล์การเขียนโปรแกรมร่วมกันในที่ทำงาน เช่นว่าในการร่นบรรทัดใหม่ควรจะเว้นช่องว่าง ๒ หรือ ๔ ตัวอักษรดี. ทั้งสองวิธีดังกล่าว คุณจะได้เรียนรู้ว่าคนอื่นๆ ชอบสิ่งใดบ้างในภาษานั้น, เขาหลงใหลมันเพียงใด, และอาจจะรู้บ้างว่าทำไมเขาจึงหลงใหลได้ขนาดนั้น.
- มีวิจารณญาณที่ดี ที่จะไม่ยึดติดในผลของการกำหนดมาตรฐานในการเขียนโปรแกรม โดยเร็วที่สุดเท่าที่จะทำได้.
จากทั้งหมดที่ว่ามา มันน่าสงสัยว่าคุณจะทำได้แค่ไหน เพียงการอ่านจากหนังสือ. ก่อนลูกคนแรกจะคลอด ผมอ่านหนังสือฮาวทูทั้งหมด และยังคงรู้สึกเป็นมือใหม่ที่ไม่รู้เรื่องรู้ราวอะไร. ๓๐ เดือนต่อมา ตอนลูกคนที่สองจะคลอด ผมได้กลับไปอ่านหนังสือเหล่านั้นอีกรึเปล่าน่ะเหรอ ? ไม่เลย ผมกลับเชื่อมั่นในประสบการณ์ของผมเอง ซึ่งปรากฏว่ามีประโยชน์มาก และให้ความมั่นใจมากกว่าหนังสือเป็นพันๆ หน้าที่เขียนโดยผู้เชี่ยวชาญ.
ในความเรียงเรื่อง “No Silver Bullet”, Fred Brooks กล่าวถึงแผนงาน ๓ ประการในการค้นหานักออกแบบซอฟต์แวร์ฝีมือดี
- ค้นหานักออกแบบชั้นยอดอย่างเป็นระบบ ตั้งแต่เนิ่นๆ
- มอบหมายให้มีผู้ดูแล ทำหน้าที่พัฒนาศักยภาพของผู้ได้รับการคัดเลือก และคอยดูแลเส้นทางวิชาชีพอย่างระมัดระวัง
- ให้โอกาสนักออกแบบรุ่นใหม่ๆ ได้มีปฏิสัมพันธ์และสร้างแรงกระตุ้นระหว่างกัน
แผนงานนี้ ตั้งอยู่บนสมมติฐานที่ว่า มีคนที่มีคุณสมบัติต่างๆ พร้อมที่จะก้าวขึ้นมาเป็นนักออกแบบชั้นยอด หน้าที่ของเราคือโน้มน้าวให้คนเหล่านี้ก้าวเดินไปตามทางที่เหมาะสม. Alan Perlis สรุปไว้อย่างตรงไปตรงมาว่า “เราสามารถสอนคนทั่วๆ ไปว่าทำอย่างไรจึงจะปั้นงานประติมากรรมได้: แต่กับคนอย่าง Michelangelo เราคงต้องสอนว่าไม่ควรจะทำอย่างไร ซะมากกว่า. โปรแกรมเมอร์ที่เก่งกาจ ก็เช่นเดียวกัน.” Perlis กำลังจะบอกว่า คนที่เก่งกาจจะมีคุณสมบัติภายในบางอย่าง ที่ทำให้พวกเขาไปได้ไกลกว่าสิ่งที่พวกเขาได้รับการสั่งสอนมา. แต่คุณสมบัติเหล่านี้ มาจากไหนกัน ? เป็นพรสวรรค์ตามธรรมชาติ หรือว่าพัฒนาขึ้นมาได้ด้วยความขยันหมั่นเพียร ? ดังที่ Auguste Gusteau (ตัวละครพ่อครัวใหญ่ในหนังอนิเมชัน Ratatouille) กล่าวไว้ “ใครๆ ก็ทำอาหารได้ แต่มีเพียงผู้ที่ไร้ซึ่งความเกรงกลัวใดๆ เท่านั้น ที่จะก้าวขึ้นสู่จุดยอดสุด.”[10] ผมคิดถึงประโยคนี้ไปในทางของความตั้งใจที่จะอุทิศตัวอุทิศชีวิตส่วนใหญ่ให้กับการฝึกฝนอย่างลึกซึ้งจริงจัง. แต่บางที วลี “ไร้ซึ่งความเกรงกลัวใดๆ” อาจใช้สรุปเรื่องนี้ได้ตรงกว่า. หรือ ดังที่ Anton Ego นักวิจารณ์อาหารในอนิเมชันเรื่องเดียวกัน กล่าวไว้ “ไม่ใช่ว่าคนไหนๆ จะสามารถเป็นศิลปินผู้ยิ่งใหญ่ได้ แต่ศิลปินผู้ยิ่งใหญ่สามารถก้าวออกมาจากที่ไหนๆ ก็ได้.”[11]
ถ้าเช่นนั้น ลองซื้อหนังสือ Java/Ruby/Javascript/PHP ประเภทนี้เลย. คุณอาจจะใช้มันให้เกิดประโยชน์ได้บ้าง. แต่คุณไม่สามารถเปลี่ยนชีวิตคุณ หรือความเชี่ยวชาญในการเขียนโปรแกรม ได้ภายใน ๒๔ ชั่วโมง, วัน, หรือสัปดาห์หรอก. คุณอยากลองทำงานหนักเพื่อปรับปรุงตัวเองอย่างต่อเนื่องตลอด ๒๔ เดือน ดูรึเปล่าล่ะ ? ถ้าอย่างนี้ คุณพอจะมีหวังไปถึงดวงดาวได้ ...
เชิงอรรถ:
[1] ค้นหาโดยคำสำคัญ pubdate: after 1992 and title: days and (title: learn or title: teach yourself) ซึ่งปัจจุบัน Amazon.com ไม่ได้ใช้การค้นหาแบบนี้แล้ว
[2] "Bad programming is easy. Idiots can learn it in 21 days, even if they are dummies."
[3] Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
[4] Bryan, W.L. & Harter, N. "Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375
[5] Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
[6] Chase, William G. & Simon, Herbert A. "Perception in Chess" Cognitive Psychology, 1973, 4, 55-81.
[7] http://www.gotoknow.org/posts/482627 (ผู้แปล)
[8] ถอดความโดย ศ.ศิลป์ พีระศรี (ผู้แปล)
[9] “Developing Expertise Notes” (Original URL: http://www2.umassd.edu/swpi/DesignInCS/expertise.html)
[10] "anyone can cook, but only the fearless can be great."
[11] "Not everyone can become a great artist, but a great artist can come from anywhere."
อ้างอิง:
Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
Bryan, W.L. & Harter, N. "Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375
Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
Chase, William G. & Simon, Herbert A. "Perception in Chess" Cognitive Psychology, 1973, 4, 55-81.
Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
คำตอบ:
เวลาโดยประมาณที่ใช้ในการทำงานประเภทต่างๆ บนเครื่องคอมพิวเตอร์ส่วนบุคคลทั่วๆ ไป:
|
ทำงานตามคำสั่งทั่วๆ ไป |
1/1,000,000,000 sec = 1 nanosec |
|
ดึงข้อมูลจากหน่วยความจำชนิด L1 cache |
0.5 nanosec |
|
คาดเดาคำสั่งแบบ branch ผิด |
5 nanosec |
|
ดึงข้อมูลจากหน่วยความจำชนิด L2 cache |
7 nanosec |
|
ล็อค/ปลดล็อค Mutex |
25 nanosec |
|
ดึงข้อมูลจากหน่วยความจำหลัก |
100 nanosec |
|
ส่งข้อมูลขนาด 2 Kbytes ผ่านเครือข่าย 1 Gbps |
20,000 nanosec |
|
อ่านข้อมูลขนาด 1MB ติดต่อกัน จากหน่วยความจำ |
250,000 nanosec |
|
ดึงข้อมูลจากตำแหน่งใหม่ใน disk (seek) |
8,000,000 nanosec |
|
อ่านข้อมูลขนาด 1MB ติดต่อกัน จาก disk |
20,000,000 nanosec |
|
ส่งข้อมูลระหว่างอเมริกาและยุโรป ทั้งไปและกลับ |
150 milliseconds = 150,000,000 nanosec |
การเลือกภาษาโปรแกรม:
หลายๆ คนถามมาว่าควรเรียนภาษาโปรแกรมคอมพิวเตอร์ตัวไหนก่อนดี มันไม่มีคำตอบตายตัวหรอกนะ แต่ลองพิจารณาประเด็นต่างๆ เหล่านี้:
- ใช้เพื่อนให้เป็นประโยชน์. เมื่อถูกถามว่า “ควรใช้ระบบปฏิบัติการตัวไหนดี Windows, Unix หรือว่า Mac ?”ผมมักจะตอบว่า “ใช้ตัวไหนก็ได้ที่เพื่อนๆ คุณใช้กัน.” ความได้เปรียบที่คุณมีในการเรียนรู้จากเพื่อนๆ จะชดเชยความแตกต่างขั้นพื้นฐานระหว่างระบบปฏิบัติการ หรือระว่างภาษาโปรแกรมคอมพิวเตอร์. และนึกถึงเพื่อนใหม่ๆ ในอนาคตไว้ด้วย: ชุมชนของเหล่าโปรแกรมเมอร์ที่คุณจะเข้าไปร่วมเป็นส่วนหนึ่งของกลุ่ม หากคุณเลือกภาษานั้นๆ. ดูว่าภาษาที่คุณเลือก มีชุมชนกลุ่มผู้ใช้ขนาดใหญ่ที่กำลังเติบโตขึ้น หรือชุมชนขนาดเล็กที่กำลังจะตาย ? มีหนังสือ, เว็บไซต์, หรือฟอรัม ที่พร้อมจะตอบคำถามของคุณหรือไม่ ? และคุณชอบผู้คนเหล่านี้ในฟอรัมรึเปล่า ?
- ทำให้ง่าย. ภาษาโปรแกรมคอมพิวเตอร์อย่าง C++ และ Java ถูกออกแบบมาสำหรับการพัฒนาโปรแกรมอย่างมืออาชีพ ด้วยทีมโปรแกรมเมอร์ที่มีประสบการณ์ ซึ่งเน้นในเรื่องประสิทธิภาพของโปรแกรมระหว่างทำงาน. ด้วยเหตุนี้ ภาษาเหล่านี้จึงมีส่วนที่ซับซ้อนเพื่อรองรับความต้องการด้านนี้. หากคุณต้องการเรียนรู้การเขียนโปรแกรม คุณควรหลีกเลี่ยงสิ่งที่ซับซ้อนเหล่านี้. คุณควรเลือกภาษาที่ถูกออกแบบมาให้โปรแกรมเมอร์มือใหม่ตัวคนเดียวสามารถเรียนรู้และจดจำได้ง่าย.
- เล่นให้สนุก. คุณอยากเรียนเปียโน ด้วยวิธีไหน: ระหว่าง วิธีปรกติที่การโต้ตอบเกิดขึ้นทันที (interactive mode) ซึ่งคุณจะได้ยินเสียงโน้ตเมื่อคุณกดแป้นเปียโน หรือ วิธีแบบชุดคำสั่ง (batch mode) ซึ่งคุณจะได้ยินเสียงโน้ตหลังจากคุณเล่นโน้ตทั้งเพลงจบลง ? แน่นอน การโต้ตอบในทันทีทำให้การเรียนเปียโนนั้นง่ายขึ้น การเรียนเขียนโปรแกรมก็เช่นเดียวกัน. เจาะจงเลือกภาษาที่มี interactive mode และใช้มัน.
จากเกณฑ์ต่างๆ ข้างต้น คำแนะนำของผมสำหรับภาษาโปรแกรมคอมพิวเตอร์ภาษาแรกที่ควรเรียนรู้คือ Python หรือไม่ก็ Scheme. แต่เงื่อนไขของคุณอาจแตกต่างออกไป และคุณก็มีทางเลือกดีๆ อื่นๆ อีกมากมาย. ถ้าคุณอายุไม่เกิน ๑๐ ขวบ, คุณอาจจะชอบ Alice หรือ Squeak (คนอายุมากๆ ก็ยังสนุกกับภาษาพวกนี้นะ). สิ่งสำคัญคือ คุณเลือก(ภาษา) และเริ่มต้นเรียนรู้ซะ.
เอกสารประกอบ: หนังสือและเอกสารอื่นๆ
หลายคนถามถึงหนังสือและเว็บเพจที่ควรอ่านเพื่อเรียนรู้การเขียนโปรแกรม ผมขอย้ำอีกครั้งว่า “การเรียนรู้จากหนังสือเพียงอย่างเดียว ไม่เพียงพอ” แต่ผมขอแนะนำหนังสือต่อไปนี้:
- Scheme: หนังสือชื่อ “Structure and Interpretation of Computer Programs” (Abelson & Sussman) น่าจะเป็นหนังสือระดับพื้นฐานทางด้านวิทยาการคอมพิวเตอร์ที่ดีที่สุด หนังสือเล่มนี้สอนการเขียนโปรแกรมเพื่อเป็นแนวทางที่จะเข้าใจถึงศาสตร์ทางด้านคอมพิวเตอร์. คุณอาจชมวิดีโอการสอน หรืออ่านหนังสือทั้งเล่มได้ทางออนไลน์. หนังสือเล่มนี้ท้าทายผู้อ่าน และอาจจะล้มเลิกความตั้งใจของหลายๆ คนซึ่งอาจจะประสบความสำเร็จได้ด้วยวิธีการอื่น.
- Scheme: หนังสือชื่อ “How to Design Programs” (Felleisen et al.) เป็นหนังสือที่ดีที่สุดเล่มหนึ่ง เกี่ยวกับเรื่องจะออกแบบโปรแกรมอย่างไร ที่ทั้งงดงามและทำงานได้ผล.
- Python: หนังสือชื่อ “Python Programming: An Intro to CS” (Zelle) ให้พื้นฐานที่ดีในการใช้งาน Python.
- Python: แบบเรียนออนไลน์หลายเรื่อง หาอ่านได้จาก Python.org
- Oz: หนังสือชื่อ “Concepts, Techniques, and Models of Computer Programming” (Van Roy & Haridi) เป็นหนังสือที่หลายคนมองว่าต่อยอดจากหนังสือของ Abelson & Sussman สำหรับโลกยุคใหม่ในปัจจุบัน. หนังสือเล่มนี้จะนำคุณไปรู้จักกับความคิดหลักๆ ทั้งหลายในการเขียนโปรแกรม ซึ่งครอบคลุมเนื้อหาที่กว้างกว่า Abelson & Sussman แถมยังอ่านง่ายและน่าติดตามกว่า. ถึงแม้ว่าหนังสือใช้ภาษา Oz ซึ่งไม่เป็นที่รู้จักกันมากนัก แต่มันจะเป็นพื้นฐานในการเรียนภาษาอื่นๆ ต่อไป.
Thai translation by Varunyu Vorachart (March 2014)
เกี่ยวกับผู้เขียน Peter Norvig:
Peter Norvig นักวิทยาศาสตร์ทางด้านคอมพิวเตอร์ชาวอเมริกัน เป็นผู้เชี่ยวชาญทางด้านปัญญาประดิษฐ์ ปัจจุบันเป็นผู้อำนวยการด้านงานวิจัยของกูเกิ้ล.
ขอบคุณครับที่แบ่งปันเรื่องราวดีๆ ชอบๆ ครับ
ขอบคุณมากๆค่ะ อ่านแล้วมีแนวคิดเพิ่มขึ้นอีกเยอะเล