สอนตัวเองเขียนโปรแกรมใน 10 ปี (1998)
(norvig.com)- ทักษะการเขียนโปรแกรมเกิดขึ้นได้ยากจากหนังสือปูพื้นฐานแบบ 24 ชั่วโมงหรือ 21 วัน และสิ่งที่ได้จากการเรียนระยะสั้นมักใกล้เคียงกับ ความคุ้นเคยแบบผิวเผิน
- งานวิจัยเรื่องความเชี่ยวชาญในหลายสาขา เช่น หมากรุก การประพันธ์ดนตรี จิตรกรรม ว่ายน้ำ และการวิจัย ชี้ว่าการไปถึงระดับสูงใช้เวลาประมาณ 10 ปี และหัวใจสำคัญไม่ใช่การทำซ้ำธรรมดา แต่คือ การฝึกอย่างมีเจตนา
- หากต้องการเป็นโปรแกรมเมอร์ที่ดี ควรรักษาความสนุกไว้ สร้างสิ่งต่าง ๆ ด้วยตัวเอง อ่านโค้ดของผู้อื่น ทำงานร่วมกับคนที่เก่งกว่า และรับฟีดแบ็ก
- การศึกษาในมหาวิทยาลัยและหนังสือช่วยเติมเต็มเรื่องคุณวุฒิ ระบบ และความลึกได้ แต่ไม่อาจแทนประสบการณ์จากโปรเจกต์จริงที่ต้องแก้ความล้มเหลวและรับมือการบำรุงรักษา
- ภาษาแรกเลือกได้จากเพื่อนและชุมชน ความเรียบง่าย และสภาพแวดล้อมรันแบบโต้ตอบ สิ่งสำคัญคือเลือกสักภาษาแล้ว เริ่มอย่างต่อเนื่อง
ข้อจำกัดของคำสัญญาว่าจะเรียนโปรแกรมมิงได้ในเวลาอันสั้น
- ในร้านหนังสือและออนไลน์มีหนังสือจำนวนมากที่อ้างว่าสอน Java, C, SQL, Ruby, อัลกอริทึม ฯลฯ ได้ภายในไม่กี่วันหรือไม่กี่ชั่วโมง
- การค้นหาขั้นสูงใน Amazon พบว่าหนังสือตั้งแต่ปี 2000 เป็นต้นมาที่มี
teach yourself hoursอยู่ในชื่อเรื่องมี 512 เล่ม และ 9 ใน 10 เล่มแรกเป็นหนังสือโปรแกรมมิง - แม้เปลี่ยน
teach yourselfเป็นlearnหรือเปลี่ยนhoursเป็นdaysก็ได้ผลลัพธ์คล้ายกัน
- การค้นหาขั้นสูงใน Amazon พบว่าหนังสือตั้งแต่ปี 2000 เป็นต้นมาที่มี
- ชื่อเรื่องเหล่านี้ทำให้รู้สึกว่าผู้คนอยากเรียนโปรแกรมมิงอย่างเร่งด่วน หรือทำให้เกิดความประทับใจว่าโปรแกรมมิงเรียนง่ายกว่าสาขาอื่นมาก
- How to Design Programs ของ Felleisen และคณะ เสียดสีแนวโน้มนี้ว่า “การเขียนโปรแกรมแย่ ๆ นั้นง่าย แม้แต่คนโง่ก็เรียนได้ใน 21 วัน”
“Teach Yourself C++ in 24 Hours” อาจหมายถึงอะไรได้จริง ๆ
-
Teach Yourself
- ภายใน 24 ชั่วโมงไม่มีเวลาพอที่จะเขียนโปรแกรมที่มีความหมายหลายชิ้น เรียนรู้จากความสำเร็จและความล้มเหลว ทำงานร่วมกับโปรแกรมเมอร์ที่มีประสบการณ์ และเข้าใจว่าการใช้ชีวิตอยู่ในสภาพแวดล้อม C++ หมายถึงอะไร
- ดังนั้นสิ่งที่เป็นไปได้จึงใกล้เคียงกับ ความคุ้นเคยแบบแตะผิว มากกว่าความเข้าใจเชิงลึก
-
C++
- หากรู้ภาษาอื่นอยู่แล้ว อาจเรียนไวยากรณ์บางส่วนของ C++ ได้ภายใน 24 ชั่วโมง
- แต่ยากที่จะเรียนรู้ว่า C++ เหมาะกับอะไร ไม่เหมาะกับอะไร และควรใช้ภาษานี้จริง ๆ อย่างไร
- ดังคำกล่าวของ Alan Perlis ว่า “ภาษาที่ไม่เปลี่ยนวิธีคิดของคุณเกี่ยวกับการเขียนโปรแกรม ก็ไม่คุ้มค่าที่จะรู้จัก”
-
24 Hours
- คุณอาจเรียน C++, JavaScript, Processing หรือสิ่งคล้ายกันได้เล็กน้อยเพื่อเชื่อมต่อกับเครื่องมือเฉพาะบางอย่าง
- ในกรณีนี้ สิ่งที่เรียนใกล้เคียงกับ วิธีทำงานเฉพาะอย่างหนึ่ง มากกว่าการเรียนโปรแกรมมิงเอง
ความเชี่ยวชาญต้องใช้เวลา
- งานวิจัยของ Bloom, Bryan & Harter, Hayes, Simon & Chase และคนอื่น ๆ แสดงผลว่า การสร้างความเชี่ยวชาญในหลายสาขาใช้เวลาประมาณ 10 ปี
- ตัวอย่างสาขารวมถึงหมากรุก การประพันธ์ดนตรี โทรเลข จิตรกรรม เปียโน ว่ายน้ำ เทนนิส การวิจัยด้านประสาทจิตวิทยา และโทโพโลยี
- หัวใจสำคัญไม่ใช่การทำซ้ำธรรมดา แต่คือ การฝึกอย่างมีเจตนา (deliberative practice)
- เลือกงานที่ยากกว่าความสามารถปัจจุบันเล็กน้อย
- วิเคราะห์ผลลัพธ์ระหว่างทำและหลังทำ
- แก้ข้อผิดพลาดแล้วทำซ้ำอีกครั้ง
- Mozart เป็นอัจฉริยะด้านดนตรีตั้งแต่อายุ 4 ขวบ แต่ต้องใช้เวลาเพิ่มอีก 13 ปีจึงสร้างดนตรีระดับโลกได้
- Beatles ได้รับความสนใจจากรายการ Ed Sullivan ในปี 1964 และเพลงฮิตอันดับหนึ่งหลายเพลง แต่พวกเขาเริ่มเล่นในคลับเล็ก ๆ ที่ Liverpool และ Hamburg ตั้งแต่ปี 1957 และ Sgt. Pepper’s ซึ่งประสบความสำเร็จอย่างสูงในเชิงวิจารณ์ ออกมาในปี 1967
- Malcolm Gladwell ทำให้คำว่า 10,000 ชั่วโมง เป็นที่รู้จักในวงกว้าง แต่สิ่งสำคัญตรงนี้ไม่ใช่ตัวเลขที่แม่นยำ หากเป็นการฝึกฝนอย่างต่อเนื่องตลอดหลายปี
- สำหรับ K. Anders Ericsson ตัวเลข 10,000 ชั่วโมงเป็นตัวเลขที่ช่วยให้รู้สึกได้ว่า แม้แต่คนมีพรสวรรค์ก็ยังต้องใช้เวลาหลายปี โดยฝึกสัปดาห์ละ 10–20 ชั่วโมง เพื่อไปถึงระดับสูงสุด
- ตัวเลขเดียวไม่อาจเป็นคำตอบทั้งหมดได้
- ยากที่จะมองว่าโปรแกรมมิง หมากรุก หมากฮอส และดนตรีต้องใช้เวลาเท่ากันเป๊ะทั้งหมด
- และยากที่จะมองว่าทุกคนเรียนรู้ด้วยความเร็วเท่ากัน
วิธีปฏิบัติเพื่อเป็นโปรแกรมเมอร์
- ต้องรู้สึก สนใจ โปรแกรมมิงและเริ่มจากความสนุก
- ความสนุกต้องคงอยู่มากพอที่จะทุ่มเท 10 ปีหรือ 10,000 ชั่วโมง
- ต้อง เขียนโปรแกรม ด้วยตัวเอง
- การเรียนรู้ที่ดีที่สุดคือการเรียนรู้ผ่านการลงมือทำ
- การเรียนรู้ที่ได้ผลต้องมีงานที่ชัดเจนและมีระดับความยากเหมาะกับแต่ละคน มีฟีดแบ็กที่เป็นประโยชน์ และมีโอกาสทำซ้ำพร้อมแก้ข้อผิดพลาด
- ต้องพูดคุยกับโปรแกรมเมอร์คนอื่นและอ่านโปรแกรมที่คนอื่นเขียน
- สิ่งนี้สำคัญกว่าหนังสือหรือหลักสูตรใด ๆ
- หากต้องการ อาจใช้เวลา 4 ปีในมหาวิทยาลัย หรือเรียนต่อในบัณฑิตวิทยาลัยเพิ่มเติม
- ปริญญาช่วยให้เข้าถึงงานที่ต้องการคุณวุฒิ และให้ความเข้าใจเชิงลึกเกี่ยวกับสาขาได้
- หากไม่สนุกกับโรงเรียน ก็อาจได้ประสบการณ์คล้ายกันด้วยความทุ่มเทผ่านการเรียนเองหรือในที่ทำงาน
- การเรียนจากหนังสือเพียงอย่างเดียวไม่เพียงพอ
- ต้องทำ โปรเจกต์ร่วมกัน กับโปรแกรมเมอร์คนอื่น
- ในบางโปรเจกต์ คุณอาจเป็นโปรแกรมเมอร์ที่เก่งที่สุด เพื่อทดสอบภาวะผู้นำและวิสัยทัศน์
- ในอีกบางโปรเจกต์ คุณอาจเป็นคนที่ยังขาดทักษะที่สุด เพื่อเรียนรู้ว่าผู้มีประสบการณ์ทำอะไร และไม่อยากทำอะไร
- ต้องรับมือกับ โปรเจกต์เดิม หลังจากโปรแกรมเมอร์คนอื่นจากไปแล้ว
- จะได้เรียนรู้ว่าอะไรจำเป็นต่อการทำความเข้าใจและแก้โปรแกรมที่คนอื่นเขียนไว้
- และทำให้คิดด้วยว่าควรออกแบบอย่างไรเพื่อคนที่จะมาบำรุงรักษาในภายหลัง
ประสบการณ์ที่กว้างขวางกับภาษาและระบบ
- ควรเรียน ภาษาโปรแกรมมิง อย่างน้อยหกภาษา
- ภาษาที่เน้น abstraction แบบคลาส: Java, C++
- ภาษาที่เน้น abstraction แบบฟังก์ชัน: Lisp, ML, Haskell
- ภาษาที่รองรับ abstraction เชิงไวยากรณ์: Lisp
- ภาษาที่รองรับข้อกำหนดแบบประกาศ: Prolog, C++ templates
- ภาษาที่เน้นการทำงานพร้อมกัน: Clojure, Go
- ต้องจำไว้ว่า “computer science” มีคำว่า computer อยู่ด้วย
- ควรรู้เวลาที่ใช้ในการรันคำสั่ง การดึงคำจากหน่วยความจำ cache miss การอ่านดิสก์แบบลำดับ และการ seek ดิสก์
- การลองมีส่วนร่วมในกิจกรรม มาตรฐานภาษา ก็ช่วยได้
- อาจเป็นกิจกรรมใหญ่ เช่น คณะกรรมการ ANSI C++ หรือระดับการกำหนดสไตล์โค้ดภายในท้องถิ่นว่าจะเยื้อง 2 ช่องหรือ 4 ช่อง
- คุณจะได้เรียนรู้ว่าคนอื่นชอบอะไรในภาษา และทำไมพวกเขาจึงรู้สึกแรงกล้ากับสิ่งนั้น
- ในกิจกรรมมาตรฐาน ยังต้องมี วิจารณญาณ ที่จะถอนตัวออกมาให้เร็วที่สุดเท่าที่ทำได้ด้วย
หนังสือและการศึกษาเพียงอย่างเดียวไม่เพียงพอ
- แม้อ่านหนังสือเกี่ยวกับการเลี้ยงลูกมามาก เมื่อมีลูกคนแรกก็ยังอาจรู้สึกเหมือนมือใหม่ และเมื่อลูกคนที่สองเกิด ก็มักพึ่งประสบการณ์ส่วนตัวมากกว่าจะกลับไปอ่านหนังสืออีกครั้ง
- No Silver Bullet ของ Fred Brooks เสนอแผนสามส่วนเพื่อค้นหานักออกแบบซอฟต์แวร์ที่ยอดเยี่ยม
- ระบุตัวนักออกแบบที่โดดเด่นให้เร็วที่สุดเท่าที่ทำได้อย่างเป็นระบบ
- มอบหมายที่ปรึกษาอาชีพให้รับผิดชอบการพัฒนาและดูแลแฟ้มประวัติอาชีพ
- เปิดโอกาสให้นักออกแบบที่กำลังเติบโตได้พบปะและกระตุ้นกันและกัน
- Alan Perlis กล่าวว่า “ทุกคนเรียนการแกะสลักได้ แต่สำหรับ Michelangelo คงต้องสอนเขาว่าจะไม่แกะสลักอย่างไร”
- โปรแกรมเมอร์ที่ยอดเยี่ยมอาจมีคุณลักษณะภายในบางอย่างที่เหนือกว่าการฝึกฝน แต่ไม่ตัดสินแน่ชัดว่าสิ่งนั้นเป็นมาแต่กำเนิดหรือพัฒนาจากความขยัน
- หนังสือ Java, Ruby, JavaScript, PHP อาจมีประโยชน์ แต่จะไม่เปลี่ยนชีวิตหรือความเชี่ยวชาญทั้งหมดได้ภายใน 24 ชั่วโมงหรือ 21 วัน
- การทำงานหนักเพื่อพัฒนาอย่างต่อเนื่องตลอด 24 เดือนเป็นจุดเริ่มต้นที่มีความหมาย
ความรู้สึกเรื่องเวลาการทำงานของคอมพิวเตอร์
- เวลาโดยประมาณของงานต่าง ๆ บน PC ทั่วไปมีดังนี้
- การรันคำสั่งทั่วไป: 1 นาโนวินาที
- ดึงข้อมูลจากหน่วยความจำ L1 cache: 0.5 นาโนวินาที
- branch prediction ล้มเหลว: 5 นาโนวินาที
- ดึงข้อมูลจากหน่วยความจำ L2 cache: 7 นาโนวินาที
- ล็อก/ปลดล็อก Mutex: 25 นาโนวินาที
- ดึงข้อมูลจากหน่วยความจำหลัก: 100 นาโนวินาที
- ส่ง 2KB ผ่านเครือข่าย 1Gbps: 20,000 นาโนวินาที
- อ่าน 1MB แบบลำดับจากหน่วยความจำ: 250,000 นาโนวินาที
- seek ไปยังตำแหน่งใหม่บนดิสก์: 8,000,000 นาโนวินาที
- อ่าน 1MB แบบลำดับจากดิสก์: 20,000,000 นาโนวินาที
- แพ็กเก็ตเดินทางไป-กลับระหว่างสหรัฐฯ กับยุโรป: 150 มิลลิวินาที หรือ 150,000,000 นาโนวินาที
เกณฑ์ในการเลือกภาษาโปรแกรมมิงภาษาแรก
- ไม่มีคำตอบเดียวที่ถูกต้องสำหรับภาษาแรก
- ใช้ เพื่อนและชุมชน เป็นเกณฑ์ได้
- คล้ายกับคำตอบเวลาเลือกระบบปฏิบัติการว่าให้ใช้สิ่งที่เพื่อนใช้
- ข้อได้เปรียบจากการเรียนกับเพื่อนสามารถชดเชยความแตกต่างของตัวระบบปฏิบัติการหรือภาษาได้
- ควรพิจารณาด้วยว่าภาษาที่เลือกมีชุมชน หนังสือ เว็บไซต์ และฟอรัมออนไลน์ที่กำลังเติบโตหรือไม่
- ความเรียบง่าย สำคัญ
- C++ และ Java ถูกออกแบบมาให้โปรแกรมเมอร์ที่มีประสบการณ์ใช้พัฒนาเชิงอาชีพในทีมขนาดใหญ่ และมีส่วนซับซ้อนที่คำนึงถึงประสิทธิภาพการรัน
- ผู้เริ่มต้นไม่จำเป็นต้องมีความซับซ้อนนั้น
- สภาพแวดล้อมรันแบบโต้ตอบ ทำให้เรียนรู้ง่ายขึ้น
- เหมือนการเล่นเปียโนที่เรียนรู้ได้ง่ายกว่าเมื่อกดคีย์แล้วได้ยินเสียงทันที เทียบกับวิธีแบบแบตช์ที่ต้องฟังหลังเล่นทั้งเพลงจบ
- ในการเขียนโปรแกรม ภาษาที่มีโหมดโต้ตอบจึงได้เปรียบ
- ตามเกณฑ์เหล่านี้ แนะนำ Python หรือ Scheme เป็นภาษาแรก
- JavaScript อาจเป็นตัวเลือกได้ ไม่ใช่เพราะเป็นภาษาที่ออกแบบมาสมบูรณ์แบบสำหรับผู้เริ่มต้น แต่เพราะมีบทเรียนออนไลน์จำนวนมาก
- ตัวอย่างเช่น บทเรียนของ Khan Academy
- ผู้เรียนที่อายุยังเป็นเลขหลักเดียวอาจชอบ Alice, Squeak, Blockly และผู้เรียนที่อายุมากกว่าก็อาจสนุกกับสิ่งเหล่านี้ได้เช่นกัน
- สิ่งสำคัญคือเลือกสักอย่างแล้ว เริ่มต้น
หนังสือและทรัพยากรแนะนำ
- แม้หนังสืออย่างเดียวไม่เพียงพอ แต่ทรัพยากรต่อไปนี้ช่วยในการเรียนรู้ได้
-
Structure and Interpretation of Computer Programs
- Structure and Interpretation of Computer Programs เป็นหนังสือปูพื้นฐานวิทยาการคอมพิวเตอร์ที่ยอดเยี่ยมมาก และสอนโปรแกรมมิงในฐานะวิธีทำความเข้าใจวิทยาการคอมพิวเตอร์
- สามารถดู วิดีโอบรรยาย และ ตัวเล่มออนไลน์ฉบับเต็ม ได้
- เป็นหนังสือที่ท้าทาย จึงอาจคัดผู้เรียนบางส่วนที่อาจประสบความสำเร็จด้วยแนวทางอื่นออกไป
-
How to Design Programs
- How to Design Programs เป็นหนึ่งในหนังสือที่ดีซึ่งใช้ Scheme อธิบายวิธีออกแบบโปรแกรมจริงอย่างสง่างามในแนวฟังก์ชัน
-
Python
- Python Programming: An Intro to CS เป็นหนังสือปูพื้นฐานที่ดีซึ่งใช้ Python
- Python.org มี บทเรียนสำหรับผู้เริ่มต้น หลายรายการ
-
Oz
- Concepts, Techniques, and Models of Computer Programming มีบางคนมองว่าเป็นผู้สืบทอดสมัยใหม่ของ Abelson & Sussman
- หนังสือครอบคลุมแนวคิดใหญ่ ๆ ของโปรแกรมมิงอย่างกว้างขวาง และแม้จะใช้ภาษา Oz ซึ่งไม่เป็นที่รู้จักแพร่หลาย แต่ก็สามารถเป็นพื้นฐานสำหรับการเรียนภาษาอื่นได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ในปี 1999 ผมซื้อ "Sams Teach Yourself C++ in 24 Hours" ที่ CompUSA แล้วพนักงานแคชเชียร์เห็นก็หัวเราะ ก่อนจะแนะนำบทความนี้ให้
ตอนอายุ 16 ผมกำลังดูหนังสือโปรแกรมมิงที่ Borders แล้วมีคนยื่น "The C Programming Language" ให้ และนั่นเปลี่ยนชีวิตผม
เส้นทางอาชีพส่วนใหญ่ของผมก่อรูปขึ้นจากการบังเอิญได้เจอนักพัฒนาหรือคนที่สนใจโปรแกรมมิงในโลกจริง
ครั้งสุดท้ายที่รู้สึกแบบนั้นคือออกจาก Microcenter พร้อม MacBook เครื่องใหม่กับ iPod Touch แล้วรู้สึกว่าพร้อมจะสร้าง Angry Birds ตัวต่อไปแล้ว
ราว 8 ปีต่อมา ตอนซื้อ Turbo Pascal ก็มีเอกสารที่จำเป็นทั้งหมดมาให้ ทำให้เรียนรู้ได้เร็ว และตอนเริ่มใช้ Linux ในปี 1995 ผมก็เรียนรู้แทบทุกอย่างที่จำเป็นต่อการเขียนโปรแกรมบนระบบนั้นได้จากหน้า man กับเอกสาร info เท่านั้น
ผมยังจำได้ว่าช่วงปลายยุค 90 เคยอ่านคู่มือ EGCS ตั้งแต่ต้นจนจบ
คิดถึงยุคที่ซอฟต์แวร์มาพร้อมข้อมูลที่จำเป็นทั้งหมด และเสียดายที่ตอนนี้ต้องค้น Google เพื่อหาหน้าผลิตภัณฑ์หรือคู่มือ
อีกสัก 5 ปีข้างหน้า ข้อมูลที่เกี่ยวข้องคงถูกโพสต์ไว้แต่ใน Discord และไม่ถูกทำดัชนี จนเราคงได้คิดถึงแม้แต่ การค้น Google ที่เคยใช้แทนคู่มือ
ช่วงต้นทศวรรษ 2000 ผมก็เรียน socket programming บน Linux และ FreeBSD จากหน้า man ล้วน ๆ และเมื่อมาอ่านหนังสือของ Stevens ภายหลัง ก็อ่านได้เร็วมากเพราะรู้จากหน้า man และมีประสบการณ์เขียนโปรแกรมมาบ้างแล้ว
ผมอยากเรียนวิธีทำ punter/prog หลังดาวน์โหลด Visual Basic 3.0 จาก AOL มาเป็นไฟล์แนบอีเมล 100 ไฟล์
ผมคัดลอกโค้ดจากหนังสือเพื่อให้เล่นไฟล์เสียงตอนเริ่มโปรแกรม และตอนมันใช้งานได้จริง ผมทึ่งมาก
หลังจากนั้น การได้สร้างอาชีพในสาย พัฒนาซอฟต์แวร์ ถือเป็นเกียรติอย่างยิ่ง
ในยุค 90 เป็นเรื่องค่อนข้างปกติที่จะไม่ได้คำแนะนำอะไรเลย มีแต่ ปฏิกิริยาแบบไม่อยากเชื่อ กลับมา
นักพัฒนาทุกคนควรอ่านและเรียน C กับ K&R อย่างน้อยสักครั้ง แม้สุดท้ายจะลืม C ไปในไม่ช้าก็ตาม
บทความนี้มีความหมายพิเศษสำหรับผม เพราะอ่านครั้งแรกตอนเป็นวัยรุ่นที่เพิ่งเริ่มเรียนเขียนโค้ด
พอกลับมาอ่านอีกครั้งก็แปลกใจที่เห็น Malcolm Gladwell เพราะจำได้ว่า Outliers กลายเป็นประเด็นดังหลังจากนั้นมาก
พอเห็นการอ้างถึง Ratatouille ถึงได้รู้ว่าบทความนี้ถูกอัปเดตหลังเผยแพร่ในปี 1998 และต้นฉบับยังอยู่ใน archive โดยสั้นกว่ามาก: https://web.archive.org/web/19980206223800/https://norvig.co...
น่านับถือที่ Peter Norvig คอยปรับแก้บทความของตัวเองต่อเนื่องมาหลายปี
เขาถูกอ้างถึงบ่อยเกินไป และ กฎ 10,000 ชั่วโมง ตอนนี้ให้ความรู้สึกเหมือนเป็นมีมไปแล้ว
ตอนนี้ผมเรียนโปรแกรมมิงด้วยตัวเองได้แล้ว แต่เส้นทางนั้นยากและคดเคี้ยวกว่าที่จินตนาการไว้ตอนนั้นมาก
ผมเองก็เป็นคนที่เรียนจากหนังสือได้ดี แต่ท่าทีแบบนั้นมักเหมาะกับ สาขาที่ไม่ใช่คอมพิวเตอร์ ซึ่งเปลี่ยนแปลงช้ากว่า เช่น คณิตศาสตร์และฟิสิกส์
ตัวอย่างแย่ ๆ ล่าสุดคือหนังสือ Quantum Programming ของ O'Reilly ซึ่งไม่ได้ลงรายละเอียดวงจรควอนตัมมากพอให้ผมเข้าใจจริง ๆ ว่ากำลังทำอะไรอยู่
แต่ก็อาจเป็นได้ว่านั่นเป็นความโอ้อวดของควอนตัมคอมพิวติ้งเอง และ Nielsen/Chuang ที่กำลังอ่านอยู่ตอนนี้แม้จะเป็นเชิงทฤษฎีมาก แต่ก็อธิบายชัดเจนมาก จนผมอาจกลับไปอ่านเล่มนั้นอีกทีภายหลัง
หนังสือเป็นเพียงเครื่องมือการเรียนรู้ และโปรเจกต์งานอดิเรกก็อาจเป็นเครื่องมือเรียนรู้ที่มีประสิทธิภาพยิ่งกว่า เพราะช่วยสะสมประสบการณ์
ถึงอย่างนั้น ความรู้คือพลัง และหนังสือก็ยอดเยี่ยมในการช่วยชี้ทิศทางที่ถูกต้อง โดยมีเงื่อนไขว่าคุณเจอหนังสือที่ตรงกับความต้องการของตัวเอง
ผมรู้จักบางคนที่ถ้าไม่มั่นใจว่าจะอ่านหนังสือจนจบได้ ก็จะไม่เปิดอ่านเลย ซึ่งผมมองว่าทัศนคติแบบนั้นไร้สาระ
ผมเพิ่งสั่งหนังสือ Generative Deep Learning ของ O'Reilly ไป และถ้าได้ประเด็นสักสองสามอย่างที่เอาไปใช้ในอาชีพได้ ก็คุ้มพอแล้ว
อย่างน้อยมันก็คงดูดีบนชั้นหนังสือ
ทุกสัปดาห์มี frontend framework ใหม่ออกมา แต่สุดท้ายทั้งหมดก็สร้าง HTML ออกมาอยู่ดี
เป็นเธรดย้อนหลัง 16 ปี
การรีโพสต์ถือว่าโอเคเมื่อผ่านไปราว 1 ปี และลิงก์ไปยังเธรดเก่า ๆ มีไว้สำหรับผู้อ่านที่อยากอ่านเพิ่มเติม
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=33287618 - ตุลาคม 2022, ความคิดเห็น 112 รายการ
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=27411276 - มิถุนายน 2021, ความคิดเห็น 115 รายการ
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=20543495 - กรกฎาคม 2019, ความคิดเห็น 87 รายการ
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=16574248 - มีนาคม 2018, ความคิดเห็น 51 รายการ
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=9395284 - เมษายน 2015, ความคิดเห็น 61 รายการ
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=5519158 - เมษายน 2013, ความคิดเห็น 86 รายการ
Teach Yourself Programming in Ten Years by Peter Norvig (2001) - https://news.ycombinator.com/item?id=3439772 - มกราคม 2012, ความคิดเห็น 29 รายการ
Teach Yourself Programming in 10 Years. - https://news.ycombinator.com/item?id=1060176 - มกราคม 2010, ความคิดเห็น 32 รายการ
Teach Yourself Programming in Ten Years - https://news.ycombinator.com/item?id=191235 - พฤษภาคม 2008, ความคิดเห็น 19 รายการ
Norvig: Teach Yourself Programming in Ten Years - https://news.ycombinator.com/item?id=43243 - สิงหาคม 2007, ความคิดเห็น 7 รายการ
น่าประทับใจที่ ลิงก์ Amazon.com เก่า ๆ บนหน้านั้น แม้จะมีพารามิเตอร์ query ค่อนข้างซับซ้อนต่อท้ายอยู่ ก็ยังคืนผลลัพธ์ที่เกี่ยวข้องได้อยู่
เป็นตัวอย่างที่ดีของ “Cool URIs don't change”
[0] http://www.amazon.com/gp/search/ref=sr_adv_b/?search-alias=s...
[1] https://www.w3.org/Provider/Style/URI
ได้เจอคนจำนวนไม่น้อยที่ถามว่าจะได้งานเขียนโปรแกรมในบริษัทหรือที่อื่น ๆ ได้อย่างไร
พอเล่าเส้นทางของตัวเองว่าเริ่มเรียนตั้งแต่เด็ก ทำเป็นงานอดิเรกจริงจัง เรียนปริญญาวิทยาการคอมพิวเตอร์และผ่านการฝึกงานมา พวกเขาก็แปลกใจและผิดหวังที่ไม่มีทางลัด
หรือจริง ๆ แล้วมีทางลัดกันนะ? สงสัยว่ามีใครเคยจบ บูตแคมป์ที่พาจากศูนย์ไปหนึ่ง ได้สำเร็จบ้างไหม
สมัยมัธยมและมหาวิทยาลัยเคยลงเรียนวิชาเขียนโปรแกรมเล่น ๆ อยู่ไม่กี่วิชา แต่ความรู้มีจำกัดมาก
บูตแคมป์นั้นสมชื่อจริง ๆ เวลาเรียนหลักคือ 9 โมงถึง 5 โมง แต่หลายคนมาถึงตอน 7 โมงเช้าและออกไปตอน 4 ทุ่ม
เสาร์อาทิตย์ก็ไปด้วย บางทีก็หยุดแค่วันอาทิตย์
ผมตั้งใจเลือกบูตแคมป์ในเมืองอื่นเพื่อไม่ให้ชีวิตสังคมมารบกวน
เน้น Ruby กับ JavaScript และไม่กี่เดือนหลังจบก็ได้งานเป็นอินเทิร์น C#/.NET
ผมเลือกตำแหน่งอินเทิร์นเพราะคิดว่าการโน้มน้าวให้ได้ตำแหน่งจูเนียร์ดีเวลลอปเปอร์ทันทีน่าจะยาก และภายใน 2 สัปดาห์ก็ได้เลื่อนเป็นจูเนียร์ดีเวลลอปเปอร์
โรงเรียนนั้นถูก Kaplan ซื้อกิจการไปแล้วก็หายไป
ผมเรียนพื้นฐาน JavaScript ด้วยตัวเองอยู่ 8 เดือนในชั้นใต้ดินบ้านแม่ แล้วก็หางานได้
หลังจากนั้นก็ทุ่มเวลาให้กับการเขียนโปรแกรมมหาศาล จนถึงตอนนี้น่าจะเกินหลายหมื่นชั่วโมงแล้ว
เคยทำคอมไพเลอร์ กราฟิก 3D เซมิคอนดักเตอร์ และเกมเอนจิน
ประสบการณ์ของผมดูเหมือนจะสนับสนุนทั้งสองฝั่ง
ราวปี 2012 การเข้าสู่วงการด้วยประสบการณ์น้อยยังค่อนข้างง่าย แต่หลังจากนั้น ถ้าจะเป็นวิศวกรที่ดีซึ่งคนอยากจ้างเพราะมีโปรเจกต์น่าสนใจ ก็ต้องใช้ความพยายามมหาศาล
จากข้อมูลที่มีจำกัด ก็เหมือนกับนักพัฒนาที่ผ่านการศึกษาแบบดั้งเดิม คือ แล้วแต่ดวง
ผลลัพธ์ที่ดีที่สุดคือกรณีคนที่มีการฝึกฝนสายคลาสสิกอย่างฟิสิกส์ เคมี วิศวกรรม แล้วอยากเปลี่ยนอาชีพ พวกเขาเหมือนจูเนียร์ระดับสูงที่เรียนรู้ได้เร็ว
ถ้าอยากใส่พนักงานใหม่ที่มีแรงจูงใจเข้าไปในพื้นที่ซอฟต์แวร์ที่การเขียนโปรแกรมล้วน ๆ ไม่ใช่เรื่องสำคัญมาก ก็อาจเป็นการจ้างที่ยอดเยี่ยม
ส่วนเบี่ยงเบนมาตรฐานกว้างมาก แต่ไม่แน่ใจว่ากว้างกว่าผู้จบหลักสูตร 2 ปีหรือไม่
ตอนมหาวิทยาลัยเรียนสายมนุษยศาสตร์ และไม่เคยโค้ดมาก่อน
2 ปีแรกหนักมากจริง ๆ เพราะไม่มีพื้นฐาน เลยรู้สึกเหมือนว่ายทวนกระแสน้ำตลอดเวลา
กว่าจะรู้สึกว่าสร้างคุณค่าได้อย่างอิสระก็เป็นช่วงท้ายของโปรแกรม 2 ปีแล้ว
ความรู้ของผมค่อนข้างเน้นการประยุกต์ใช้งาน และเพราะขาดพื้นฐานวิทยาการคอมพิวเตอร์ บางครั้งเลยยากกว่าเดิมเพราะต้องค่อย ๆ เรียนพื้นฐานแทรกไปด้วย
อย่างไรก็ตาม บทบาทปัจจุบันของผมคือ data engineer ดังนั้นด้านวิทยาการคอมพิวเตอร์แบบดั้งเดิมอย่างโครงสร้างข้อมูลและอัลกอริทึมจึงถูก要求ค่อนข้างน้อยกว่า
แก่นสำคัญคือ การฝึกฝนอย่างตั้งใจ
ไม่ใช่แค่ทำซ้ำ ๆ แต่ต้องท้าทายโจทย์ที่ยากกว่าความสามารถปัจจุบันเล็กน้อย ลองทำ วิเคราะห์ระหว่างทำและหลังทำ แก้ข้อผิดพลาด แล้วทำซ้ำอีก
ถ้าจะเรียนรู้อย่างต่อเนื่อง ก็ต้องท้าทายตัวเองและก้าวออกจาก comfort zone
ใช้มาหลายเดือนแล้วบังเอิญถูกล็อกเอาต์ ตอนนี้กลับรู้สึกว่าความไม่สะดวกเล็ก ๆ ของการไปค้นเอกสารทางการนั้นมีคุณค่า
สัปดาห์แรกรู้สึกแปลกใจว่าตัวเองช้าลงมาก
การยอมผ่านขั้นตอนเพิ่มเติมเพื่อเรียนจากแหล่งข้อมูลปฐมภูมิ และบางครั้งเห็นคุณค่าของความไม่สะดวก เป็นสิ่งสำคัญต่อการเติบโตเป็นโปรแกรมเมอร์
โดยเฉพาะถ้าทำงานระดับปี 1–2 ให้เสร็จด้วย Copilot อย่างเดียว ก็อาจเท่ากับทำให้ความมีประโยชน์ของตัวเองถูกทำให้เป็นอัตโนมัติจนหายไป
อีกด้านหนึ่ง เราก็เคยพูดคล้าย ๆ กันเกี่ยวกับ “เด็ก iPad”
iPad ก็มีระบบไฟล์ และแอปต่าง ๆ ก็มีฟีเจอร์มากขึ้นเรื่อย ๆ ภายใต้แนวทางที่ Apple อนุมัติ ดังนั้นผมไม่คิดว่ามันเป็นการประมาณโน้ตบุ๊กที่แย่นัก
ผมเองก็ใช้ Copilot แต่ใช้หลัก ๆ เป็น ระบบเติมคำอัตโนมัติที่ฉลาด สำหรับตั้งค่าตัวแปรหรืองานซ้ำ ๆ เล็กน้อย
มันมีไว้ประหยัดเวลาที่ควรใช้ไปกับการวางบริบทของการแก้ปัญหาและการโต้ตอบกับเพื่อนร่วมทีม ไม่ใช่สิ่งที่จะมาแทนวิศวกร
ความเชี่ยวชาญมาจากประสบการณ์ และประสบการณ์จะสะสมได้ก็ต่อเมื่อคุณกลับมาทำมันเรื่อย ๆ
บางคนผลักดันตัวเองให้ลำบากไม่รู้จบได้ แต่สำหรับคนทั่วไป การเริ่มจากการหาส่วนหนึ่งของซอฟต์แวร์ที่รักได้จริง ๆ แล้วค่อย ๆ บ่มเพาะมัน น่าจะเป็นทางที่ฉลาดกว่า
ผมเคยเห็นคนที่ฉลาดกว่าผมอย่างชัดเจนในสายโค้ด ออกจากสายนี้ไปเพราะฉลาดเกินไป
เพราะพวกเขารู้สึกว่ามันไม่ท้าทายอีกต่อไป หรือเหนื่อยกับความท้าทายผิดประเภทอย่าง “การรอให้คนอื่นตามทัน”
ส่วนใหญ่เป็นคนที่ทำงานกับเทคโนโลยีล้ำสมัยซึ่งมักกลายเป็นมาตรฐานในอีกไม่กี่ปีต่อมา
ถ้าแรงขับเคลื่อนคือความหลงใหล ก็อาจนับว่าโชคดีที่ไม่ได้ฉลาดเกินไป
แม้จะระบุว่าเป็นบทความปี 1998 แต่มีการพูดถึง Clojure และ Go จึงดูเหมือนเป็นบทความที่ถูกอัปเดตภายหลัง
เป็นบทความที่ดี
ถ้าคิดจากวันละ 8 ชั่วโมง สัปดาห์ละ 40 ชั่วโมง การจะสะสมให้ครบ 10,000 ชั่วโมง ต้องใช้เวลา 250 สัปดาห์
ต่อให้เขียนโปรแกรมแทบไม่หยุดก็ประมาณ 5 ปี และในความเป็นจริงมักใกล้ 10 ปีกว่าจะถึงเป้าหมาย
ถ้าเขียนโปรแกรมเยอะ ๆ ปีละ 3,000 ชั่วโมงก็ไปถึงได้ไม่ยาก
ผมเขียนโปรแกรมวันละ 12 ชั่วโมงในแทบทุกวัน และสัปดาห์ละ 6–7 วันในแทบทุกสัปดาห์
วันที่มีแรงจูงใจสูงมากก็ทำถึง 18 ชั่วโมง
ผมทำแบบนี้มาเกือบ 10 ปีแล้ว และบางครั้งก็พักประมาณหนึ่งเดือน โดยลดลงเหลือสัปดาห์ละ 3–4 วันแต่ยังทำเป็นเวลานาน
ต่อให้คำนวณแบบอนุรักษนิยมก็ราวปีละ 3,500 ชั่วโมง
เหตุผลที่ทำงานเยอะขนาดนี้คือผมรักการเขียนโปรแกรมจริง ๆ และนอกจากการโต้คลื่นตอนเช้าแล้ว ก็ไม่มีอะไรที่ผมอยากทำมากกว่านี้
ถึงอย่างนั้น การจะเป็นนักพัฒนาที่แข็งแกร่งโดยทั่วไปก็ดูเหมือนต้องใช้ประสบการณ์ทำงานจริงราว 10 ปี
ผมไม่เคยเห็นใครไปถึงระดับนั้นจริง ๆ ภายใน 5 ปี
คนที่หมกมุ่นทำมาตั้งแต่วัยรุ่นอาจลดเวลาได้หลายปี แต่พอถึงจุดหนึ่งช่วงเวลานั้นก็เริ่มซ้อนทับกัน
แน่นอนว่ายังมีคำพูดเก่า ๆ ว่าปัญหาคือ “ประสบการณ์ 1 ปีที่ทำซ้ำ 10 ครั้ง”
ผมเห็นนักพัฒนาที่มีประสบการณ์เกิน 10 ปีแต่ยังไม่แข็งแกร่งอยู่มากมาย
ดูเหมือนแค่เข้าไปในบทบาท junior แล้วทำงานไต่ระดับไปตลอด 5 ปีก็พอ
สัญชาตญาณจะค่อย ๆ สั่งสมจากการทำโจทย์ที่ยากขึ้นเรื่อย ๆ
ถึงจุดหนึ่ง คุณจะสามารถเชื่อมโยงและนำสิ่งที่รู้ในด้านหนึ่งไปใช้กับอีกด้านหนึ่งได้ และตอนนั้นเองที่ ความคิดสร้างสรรค์ เริ่มทำงาน
ผมหาแหล่งที่มาของวิดีโอที่ดูเมื่อ 5–6 ปีก่อนไม่เจอ แต่มันพูดทำนองว่าเมื่อจำนวนโปรแกรมเมอร์เพิ่มขึ้น คนส่วนใหญ่จึงมีประสบการณ์ต่ำกว่า 5 ปี
ในบริบทที่ IT และเว็บเข้ามาเกี่ยวข้องกับชีวิตมากขึ้นเรื่อย ๆ มันก็สมเหตุสมผล
[0] https://youtu.be/ecIWPzGEbFc?si=A4qBR2YdX-0CV2bM เจอได้เพราะคอมเมนต์ของ wild_egg
พอทำมา 20 ปี ตอนนี้ก็มีข้อมูลอยู่พอสมควรที่ผมไม่จำเป็นต้องรู้อีกแล้ว และหลายอย่างก็คงเป็นข้อมูลที่คนมีประสบการณ์ต่ำกว่า 5 ปีไม่จำเป็นต้องใช้เลย
ในทางกลับกัน ประสบการณ์ก็คือประสบการณ์ และการรู้ว่าสิ่งต่าง ๆ ถูกสร้างขึ้นด้วยโครงสร้างแบบใดและมีอยู่เพราะเหตุใดก็ช่วยได้เสมอ
มีโปรแกรมเมอร์จำนวนมากที่แม้มีประสบการณ์น้อยกว่าผม แต่ทำสิ่งต่าง ๆ ได้มากมายในแบบที่ผมยังจินตนาการไม่ออกด้วยซ้ำ
พูดตรง ๆ ว่าสาขาที่มี Turing completeness นี้กว้างมากทีเดียว
ผมไม่เคยท่องจำไวยากรณ์แยกต่างหาก และมักเปิด man page กับคู่มือไว้ขณะเขียนโปรแกรมเสมอ
แต่ทุกภาษาและเทคโนโลยีที่เรียนมา สอนบางอย่างที่มีประโยชน์เกี่ยวกับปัญหาพื้นฐานของคอมพิวติ้งและระบบ
วิธีรับมือกับปัญหาอาจเปลี่ยนเสื้อผ้าไป แต่ตัวปัญหาเองยังเหมือนเดิม
ไม่มีทางลัด และผมรู้แน่ชัดว่าตัวผมในฐานะโปรแกรมเมอร์ตอนนี้มีความสามารถมากกว่าตัวผมตอนปีที่ 5 หลายลำดับขั้น
เหตุผลที่ผมตั้งตารอการเรียนรู้สิ่งใหม่และทำงานใหม่ ๆ มากกว่าที่เคย คือสิ่งเหล่านั้นจะเปิดให้เห็นส่วนต่าง ๆ ของเทคโนโลยีนี้มากขึ้น
สิ่งที่กังวลมีเพียงว่าสักวันร่างกายและจิตใจจะตามไม่ไหว ไม่ใช่ว่าสิ่งให้เรียนรู้จะหมดลง หรือจะถูกคนรุ่นใหม่แซงหน้า
https://youtu.be/ecIWPzGEbFc?si=A4qBR2YdX-0CV2bM
ยังให้ความรู้สึกเหมือนยุคของนักเล่นแร่แปรธาตุ
สักวันหนึ่งนักเคมีจะปรากฏตัวขึ้น จัดระบบการสังเกตแบบแก้ขัด และทิ้งหลายสิ่งไป
จนกว่าจะถึงตอนนั้น… Newton ก็เป็นนักเล่นแร่แปรธาตุเช่นกัน แต่ก็ยังสร้างคุณูปการไว้ไม่น้อย