การเป็นวิศวกรที่ดี
(0x0001.cc)- วิศวกรซอฟต์แวร์จำนวนมากทำงานโดยไม่มี ความหลงใหลในซอฟต์แวร์
- หลายคนทำงานเพียงเพื่อให้ได้ค่าตอบแทนที่ดี แต่หากขาดความหลงใหล สุดท้าย ผลงานจะลดลง
- หากยึดติดอยู่กับเทคโนโลยีเก่าและความเชื่อที่ผิดโดยไม่เรียนรู้ ก็จะไม่สามารถเติบโตได้
- องค์ประกอบที่จำเป็นในการเป็นวิศวกรที่ดี
- ต้อง เข้าใจแก่นแท้ของวิศวกรรม และสั่งสมความรู้เชิงลึก
- ต้อง เรียนรู้เทคโนโลยีใหม่อย่างต่อเนื่องและเข้าหาอย่างมีวิจารณญาณ
- จำเป็นต้องมี นิสัยในการนำความรู้ที่เรียนมาไปใช้จริงและปรับปรุงต่อ
# อะไรที่ทำให้เป็น วิศวกรที่ดี
- นิยามของวิศวกร
"ผู้ที่ประยุกต์ใช้หลักการทางวิทยาศาสตร์เพื่อวิเคราะห์ปัญหา และแก้ปัญหาพร้อมทำให้โลกดีขึ้นผ่านการออกแบบ การเขียนโค้ด การสร้าง และการสร้างสรรค์"
- ความสามารถที่วิศวกรซอฟต์แวร์ควรมี
- ต้องเข้าใจหลักการว่าคอมพิวเตอร์ทำงานอย่างไร
- ต้องมีความเข้าใจเชิงลึกเกี่ยวกับวิธีที่ฮาร์ดแวร์และซอฟต์แวร์โต้ตอบกัน
- ไม่ควรพึ่งพาเพียงภาษาหรือเทคโนโลยีที่ถูกทำให้เป็นนามธรรมไว้แล้ว แต่ควรเรียนรู้จากพื้นฐาน
ความเข้าใจเชิงลึกเกี่ยวกับโดเมน
- จำเป็นต้องมีความเข้าใจที่แข็งแรงเกี่ยวกับหลักการพื้นฐาน
- วิศวกรเครื่องกล → คุณสมบัติของวัสดุและความรู้ในการประยุกต์ใช้
- วิศวกรซอฟต์แวร์ → เข้าใจหลักการทำงานของหน่วยความจำและ CPU
- ต้องเรียนรู้ตั้งแต่หลักการพื้นฐาน
- จำเป็นต้องเข้าใจแนวคิดพื้นฐานอย่างลึกซึ้ง เช่น HTTP, โครงสร้างหน่วยความจำ, การทำงานของระบบ
- อย่าเริ่มจากระดับบน แต่ค่อย ๆ สร้างจากพื้นฐานขึ้นไป
การเรียนรู้อย่างต่อเนื่อง
- ต้องเรียนรู้เทคโนโลยีล่าสุดและแนวโน้มการพัฒนาอย่างต่อเนื่อง
- ต้องวิเคราะห์ข้อดีและข้อเสียของเทคโนโลยีใหม่อย่างมีวิจารณญาณ
- เจาะลึกหัวข้อใหม่ที่ค้นพบระหว่างกระบวนการเรียนรู้
- เหมือนกับการเรียนคณิตศาสตร์ที่เชื่อมไปยังหัวข้อย่อยต่าง ๆ เราควรขยายความลึกของการเรียนรู้เช่นกัน
ทำความเข้าใจข้อจำกัดและปัญหาของเทคโนโลยี
- ต้องเข้าใจข้อดีข้อเสียของเครื่องมือหรือภาษาอย่างชัดเจน
- ควรระวังท่าทีที่เชื่อมั่นในภาษาใดภาษาหนึ่งหรือเครื่องมือใดเครื่องมือหนึ่งมากเกินไป
- การเลือกเครื่องมือที่เหมาะสมที่สุดกับโปรเจ็กต์เป็นสิ่งสำคัญ
นำความรู้ไปใช้ในงานจริง
- การรู้แค่ทฤษฎีอย่างเดียวไม่มีความหมาย
- ต้องนำความรู้ที่เรียนไปใช้กับโปรเจ็กต์จริง
- ควรใช้เพื่อแก้ปัญหาหรือพิสูจน์แนวคิด
- ตัวอย่างของการนำไปใช้จริง
- สร้างต้นแบบขนาดเล็ก
- แก้ปัญหาที่เกิดขึ้นในชีวิตประจำวัน
- อธิบายและสอนสิ่งที่เรียนให้ผู้อื่น
# วิธีเป็นวิศวกรที่ดีขึ้น
พัฒนาความสามารถในการคิดเชิงวิพากษ์
- การคิดเชิงวิพากษ์คือองค์ประกอบสำคัญของวิศวกรรม
- จำเป็นต่อการทำความเข้าใจแนวคิด ผลกระทบ และการตั้งคำถามต่อสิ่งเหล่านั้น
- หากขาดการคิดเชิงวิพากษ์หรือมองข้ามไป จะนำไปสู่ความไม่มีประสิทธิภาพและความซับซ้อน
- เสริมสร้างความสามารถในการคิดเชิงวิพากษ์
- เมื่อพบแนวคิดใหม่ อย่ารับมาโดยอัตโนมัติ แต่ควรตรวจสอบประสิทธิผลและความสมเหตุสมผล
- ต้องวิเคราะห์ข้อดีข้อเสียและทางเลือกของแนวทางหนึ่ง ๆ อย่างมีเหตุผล
- แหล่งเรียนรู้การคิดเชิงวิพากษ์: ดู Critical Thinking
อ่านหนังสือให้มากขึ้น
- การอ่านเป็นวิธีที่มีประสิทธิภาพในการรับความรู้
- มีหนังสือหลากหลายหัวข้อเกี่ยวกับวิศวกรรมซอฟต์แวร์
- อย่ารับเนื้อหาในหนังสือมาแบบตรง ๆ แต่ควรเข้าหาอย่างมีวิจารณญาณ
- ตัวอย่างคำถามเพื่อการอ่านอย่างมีวิจารณญาณ
- "แนวทางนี้มีปัญหาหรือไม่?"
- "มีวิธีที่ดีกว่านี้หรือไม่?"
- "ถ้าเป็นฉันจะทำต่างออกไปอย่างไร?"
- "สิ่งที่หนังสืออธิบายนี้ถูกต้องจริงหรือไม่?"
- สร้างนิสัยในการจดโน้ต
- จัดระเบียบและบันทึกสิ่งที่เรียนรู้รวมถึงความคิดของตนเอง
- หากมีการกล่าวถึงหัวข้อที่ไม่รู้จัก ให้ค้นคว้าเพิ่มเติม
- แนะนำ Obsidian เป็นเครื่องมือจดโน้ต (เลือกตามความชอบส่วนตัวได้)
- รายการอ่านที่แนะนำ
นำความรู้ที่เรียนไปใช้กับโปรเจ็กต์
- เชื่อมจากทฤษฎีสู่ภาคปฏิบัติ
- การเรียนรู้ที่แท้จริงจะเกิดขึ้นเมื่อคุณนำสิ่งที่เรียนไปใช้ในโปรเจ็กต์จริง
- การลงมือทำแนวคิดจริงช่วยให้เข้าใจได้ลึกยิ่งขึ้น
- ต่อให้เป็นโปรเจ็กต์เล็กหรือต้นแบบก็สำคัญที่จะลองสร้างด้วยตัวเอง
- ประโยชน์ที่ได้จากกระบวนการนำไปใช้จริง
- จะได้เผชิญกับ ปัญหาจริง ที่มองไม่เห็นจากทฤษฎี
- สามารถทำให้ความรู้เป็นรูปธรรมและปรับปรุงได้ผ่านกระบวนการแก้ปัญหา
- ความสามารถในการแก้ปัญหาและการคิดอย่างมีเหตุผลจะแข็งแกร่งขึ้น
- วิธีนำสิ่งที่เรียนไปใช้
- สร้างต้นแบบขนาดเล็ก
- หลังเรียนรู้เฟรมเวิร์ก ภาษา หรือแนวคิดใหม่ ให้ลองทำโปรเจ็กต์เล็ก ๆ
- ตัวอย่าง: หลังเรียนรู้การทำ indexing ของฐานข้อมูล ให้สร้างระบบค้นหาอย่างง่ายและเปรียบเทียบประสิทธิภาพ
- แก้ปัญหาจริง
- ลองแก้ปัญหาเล็ก ๆ ที่เกิดขึ้นในชีวิตประจำวันหรือการทำงาน
- ตัวอย่าง: ทำงานที่ต้องทำซ้ำด้วยมือให้เป็นอัตโนมัติ หรือปรับปรุงปัญหาประสิทธิภาพที่ตกลง
- สอนสิ่งที่เรียนมา
- การอธิบายสิ่งที่เรียนให้ผู้อื่นฟังช่วยเสริมความเข้าใจ
- เขียนบล็อก เขียน Twitter thread หรืออภิปรายกับเพื่อนร่วมงาน
- ระหว่างการสอน คุณอาจค้นพบมุมมองใหม่ได้
- หากนำความรู้ไปใช้อย่างต่อเนื่อง ความเข้าใจเชิงทฤษฎีจะเปลี่ยนเป็นความสามารถเชิงปฏิบัติ และช่วยให้เติบโตเป็นวิศวกรที่มีความสามารถมากขึ้น
ประเมินและปรับปรุงโค้ดของตนเอง
- การวิจารณ์ตนเองคือหนึ่งในนิสัยหลักของวิศวกรที่ยอดเยี่ยม
- วิศวกรจำนวนมากทำผิดพลาดโดยคิดว่าเมื่อโค้ดทำงานได้ก็ "เพียงพอแล้ว"
- แต่วิศวกรที่แท้จริงตระหนักว่า ยังมีพื้นที่ให้ปรับปรุงได้เสมอ
- เป้าหมายของการประเมินตนเอง
- ไม่จำเป็นต้องเข้มงวดกับตัวเองจนเกินไป
- หัวใจสำคัญคือการมองหาโอกาสในการพัฒนาอย่างต่อเนื่อง
- อย่าพอใจเพียงแค่ทำให้โค้ดทำงานได้ แต่ควรมองหาวิธีปรับปรุงด้านประสิทธิภาพ การบำรุงรักษา และความอ่านง่าย
- ผลของการประเมินตนเองอย่างต่อเนื่อง
- คุณภาพของโค้ดจะดีขึ้นทีละน้อย
- ความสามารถในการแก้ปัญหาจะแข็งแกร่งขึ้นผ่านการวิจารณ์ตนเอง
- สามารถพัฒนาความรู้และความสามารถของตนได้อย่างไม่หยุดยั้ง
# รายการแนะนำสำหรับวิศวกรซอฟต์แวร์
หนังสือแนะนำ
- Designing Data-Intensive Applications – การออกแบบแอปพลิเคชันที่ขับเคลื่อนด้วยข้อมูล
- Introduction to Algorithms – (ฉบับภาษาเกาหลีก็ใช้ชื่อภาษาอังกฤษ)
- Writing a C Compiler
- Essential Maths for Data Science – คณิตศาสตร์ที่จำเป็นสำหรับนักพัฒนา
- Elements of Information Theory
โปรเจ็กต์แนะนำ
- Compiler - ลองเขียน compiler สำหรับภาษาที่คุณเลือก โดยอ้างอิง LLVM หรือ JVM
- Emulator - เขียน emulator สำหรับ CPU แบบง่าย (เช่น 8086)
- Render engine / game engine - เขียนโปรแกรมกราฟิกโดยใช้ OpenGL หรือ Vulkan
- เขียน memory viewer และ editor - เขียนโปรแกรมที่โต้ตอบกับหน่วยความจำของโปรแกรมอื่น
- เขียน HTTP server - เขียน HTTP server ด้วยภาษาระดับต่ำ
- ควรหลีกเลี่ยงเว็บไซต์หรือโปรเจ็กต์ที่เรียบง่าย เพราะอาจให้ผลต่อการเรียนรู้น้อย เลือกหนึ่งโปรเจ็กต์จากที่กล่าวข้างต้น ศึกษาหัวข้อนั้น แล้วลองลงมือทำเอง
สรุป
- การเป็นวิศวกรที่ดีไม่ได้หมายถึงการรู้ภาษาการเขียนโปรแกรมจำนวนมาก
- ความเข้าใจเชิงลึกในหลักการพื้นฐาน + การคิดเชิงวิพากษ์ + การนำไปใช้จริง คือหัวใจสำคัญ
- จำเป็นต้องมีท่าทีที่พร้อมเรียนรู้ นำไปใช้ และปรับปรุงอย่างไม่หยุดยั้ง
- วิศวกรรมคือการเดินทางที่ไม่มีวันสิ้นสุด และท่าทีที่มุ่งเติบโตคือสิ่งสำคัญ
สรุป
- แก่นแท้ของการเป็นวิศวกรที่ดี
- ไม่ใช่การรู้ภาษาการเขียนโปรแกรมมากที่สุด การเชี่ยวชาญเฟรมเวิร์กล่าสุด หรือการไล่ตามเทคโนโลยีใหม่
- หัวใจสำคัญคือ ความเข้าใจอย่างลึกซึ้งในหลักการพื้นฐานของวิศวกรรม
- ต้อง นำความรู้ที่เรียนไปใช้กับโปรเจ็กต์จริง, คิดอย่างมีวิจารณญาณ, และ เติบโตอย่างต่อเนื่อง
- ลักษณะของวิศวกรระดับยอดเยี่ยม
- ไม่หยุดเรียนรู้และแสวงหาความรู้ใหม่อยู่เสมอ
- ตั้งคำถามกับสมมติฐานของตนเองอยู่ตลอดและมองหาวิธีปรับปรุง
- นำความรู้ที่เรียนมาไปใช้แก้ปัญหาจริง และเติบโตร่วมกับเพื่อนร่วมงานผ่านการทำงานร่วมกัน
- วิศวกรรมคือการเดินทางตลอดชีวิต
- ต้องมี ความอยากรู้อยากเห็น (curiosity), ความมีวินัย (discipline) และ ความมุ่งมั่นต่อการเติบโต
- หากนำหลักการเหล่านี้ไปปฏิบัติ คุณอาจก้าวข้ามจากการเป็นวิศวกรที่ดีไปสู่การเป็น วิศวกรที่ยิ่งใหญ่
9 ความคิดเห็น
ผมเองก็เคยมีส่วนร่วมกับงานด้านการจัดการหน่วยความจำของ Linux kernel และคิดว่าพอเข้าใจการทำงานระดับล่างอยู่พอสมควร แต่พอมองว่าท้ายที่สุดกลับต้องมาทำงานที่ไม่ได้เกี่ยวกับการพัฒนาอย่างที่ไม่ได้ตั้งใจ ก็เลยรู้สึกว่าถ้าอยากเป็นวิศวกรที่ไปได้สวย อาจต้องทำตรงกันข้ามกับสิ่งที่บทความนี้พูดก็ได้
พอกลับเกาหลีมาก็พบว่าตลาดที่นี่เล็กเกินไปและการแข่งขันก็รุนแรง ทำให้มีบริษัทหรือโพสิชันที่สามารถโฟกัสกับงานพัฒนาได้จริง ๆ ไม่มากนัก และเมื่อทุกคนแย่งชิงตำแหน่งอันน้อยนิดนั้นกัน สุดท้ายก็ดูเหมือนว่าต้องโฟกัสกับสิ่งที่สะดุดตาคนอื่นให้มาก ถึงจะได้ทำงานพัฒนาที่ตัวเองอยากทำ
ผมก็เห็นด้วยเหมือนกัน! แล้วผมก็รู้สึกว่าคำว่า 'วิศวกรที่ดี' ที่พูดถึงกันตรงนี้ แต่ละคนตีความต่างกันมากเกินไปด้วย แม้อาจจะฟังดูสุดโต่ง แต่ถึงจะรู้ถึงความสำคัญของความรู้พื้นฐาน ก็อดคิดไม่ได้ว่าวิศวกรที่ไม่มีคุณค่าในตลาดจะถือว่าเป็นวิศวกรที่ดีหรือเปล่า
เห็นด้วยจริงๆ,,,
น่าเสียดายที่มันไม่ใช่เกมของการเข้าใจแก่นแท้ให้ถูกต้องและจัดการมันได้ดีแค่ไหน
แต่เป็นเกมของการใช้ภาษาเฉพาะกับเทคโนโลยีเฉพาะให้เข้ากับเทรนด์ได้ดีแค่ไหน,,
ผมคิดว่าในเกาหลีก็มีวิศวกรเก่ง ๆ อยู่มากเหมือนกัน แต่ผมเองก็รู้สึกเสียดายในหลายจุดเพราะขนาดของตลาด
ก็เลยอดคิดไม่ได้ว่าคงดีไม่น้อยถ้าที่อย่าง FuriosaAI ประสบความสำเร็จได้มากกว่านี้
FuriosaAI เจ๊งแล้วเหรอ...?
ก็พอจะรู้สึกร่วมอยู่บ้างนะ.. 555
หรือว่าเป็นแค่ตลาดเกาหลีเท่านั้น...
เมื่อไม่นานมานี้ที่บริษัท ผมเคยจัดสัมมนาเพื่อการศึกษาเกี่ยวกับภาษา Kotlin อยู่ครั้งหนึ่ง และพอลองอธิบายโดยใช้วิธีเปรียบเทียบกับภาษา C++ ที่แผนกใช้เป็นหลัก ก็จำได้ว่าได้รับการตอบรับที่ดี ทั้งที่จริงแล้วผมแทบไม่ได้ใช้ C++ เอง และสมาชิกในแผนกก็เป็นสถานการณ์ที่เพิ่งได้สัมผัส Kotlin เป็นครั้งแรก แต่ดูเหมือนว่าในหลายแง่มุมมันจะช่วยต่อการเติบโตของทุกคนได้มากครับ
ความคิดเห็นบน Hacker News
ชอบความเห็นเรื่องการอ่านหนังสือมาก มักเห็นบ่อยว่าวิศวกรจำนวนมากพลาดหลายอย่างไป เพราะชอบวิดีโอและโพสต์สั้นตื้น ๆ มากกว่าเอกสารและหนังสือ
เห็นด้วยกับหลายประเด็นที่กล่าวถึงในบทความนี้ แต่ยังไม่แน่ใจว่าการรู้พื้นฐานเชิงลึกอย่าง CPU, หน่วยความจำ, HTTP ฯลฯ ช่วยให้เป็นวิศวกรที่ดีขึ้นได้อย่างไร
ผมอาจไม่ได้รู้ลึกถึงขั้นพื้นฐานอย่างแท้จริง แต่ผมเคยเห็นว่าถ้าไม่รู้พื้นฐาน จะสร้างผลลัพธ์ที่ทั้งน่าเหลือเชื่อและคาดไม่ถึงอย่างยิ่งได้จริง ๆ
ยกตัวอย่างเช่น ทำระบบให้ดึงทุกเรคอร์ดใน DB มาใส่ไว้ในหน่วยความจำทั้งหมด แล้วค่อยค้นหาในหน่วยความจำ
ตอนที่มีเรคอร์ดน้อยก็ทำงานได้ดี แต่พอเรคอร์ดมากขึ้น หน่วยความจำก็ระเบิด
ที่เขียนแบบนี้ก็เพราะไม่เข้าใจเลยว่าหน่วยความจำกับ DB ต่างกันอย่างไร
นี่เป็นแค่ตัวอย่างหนึ่ง และทุกครั้งก็มักจะอิมพลีเมนต์ไปในทิศทางที่คาดไม่ถึงจริง ๆ
โปรแกรมเมอร์ทั่วไป(?) คงจินตนาการไม่ออกจริง ๆ