- แม้จะเคยพูดถึงวิธีเลือกโปรแกรมที่ใช้งานได้ยาวนานและวิธีสร้างโครงสร้างพื้นฐานที่เชื่อถือได้ แต่ก็ยอมรับว่ายังทำสิ่งนั้นได้ไม่ดีนัก
- ช่วงเดือนที่ผ่านมาได้เขียนแกนหลักของโปรแกรมที่ใช้งานมา 2 ปีขึ้นใหม่ และจากนั้นก็ได้ย้อนมองการเปลี่ยนแปลงด้านการเขียนโปรแกรมตลอดชีวิตที่ผ่านมา
ปี 2015
- ตั้งข้อสงสัยกับ abstraction และให้ความสำคัญกับการทดสอบและการจัดการเวอร์ชัน
- คิดว่าสาเหตุของปัญหามาจากการใช้ abstraction มากเกินไป และการขาดการทดสอบ/การจัดการเวอร์ชัน
- ออกแบบแพลตฟอร์ม Mu1 โดยมีการทดสอบและเลเยอร์เป็นข้อจำกัดพื้นฐาน
ปี 2017
- เริ่มปรับ Mu1 ใหม่เป็น Mu ในปัจจุบัน
- ตอนแรกใช้ทั้งแนวคิดการทดสอบและเลเยอร์แบบใหม่ทั้งหมด แต่ค่อย ๆ เลิกใช้ไป
- Mu มีการทดสอบจำนวนมาก แต่เป็นแนวทางแบบเดิม และไม่ได้พอร์ตโครงสร้างพื้นฐานแบบเลเยอร์มา
ปี 2022
- เริ่มทำงานกับ Freewheeling Apps
- ตอนแรกเริ่มโดยไม่มีการทดสอบ ก่อนจะเขียนการทดสอบอย่างละเอียดให้กับส่วนแกนหลักของโปรแกรมแก้ไขข้อความ
- ส่วนที่เหลือทดสอบได้ยาก แต่ก็ทำงานได้ดี
ปี 2024
- เมื่อเดือนก่อนลบการทดสอบทั้งหมดทิ้ง
- ปรับโครงสร้างโปรแกรมแก้ไขข้อความใหม่แบบถอนราก โดยใช้วิธีที่เคยกังวลว่าจะทำให้เกิด merge conflict กับ Freewheeling Apps ตัวอื่น
- เลิกกังวลเรื่องการจัดการเวอร์ชัน
- เลิกยึดติดกับการทดสอบและเวอร์ชัน แล้วกลับสร้างโปรแกรมที่ดีกว่าเดิมได้มาก
มุมมองแบบบูรณาการในปัจจุบันต่อการเขียนโปรแกรมอย่างยั่งยืน
- การสร้างสิ่งที่ยั่งยืนสำหรับคนจำนวนมากนั้นยากเกินไป จึงไม่ควรแม้แต่จะพยายาม
- ซอฟต์แวร์ส่วนใหญ่ติดกับดักแรงจูงใจที่ต้องการให้บริการคนจำนวนมากในระยะสั้น ให้โฟกัสกับซอฟต์แวร์ที่มีโลโก้น้อย สร้างง่าย มี dependency น้อย และไม่อัปเดตอัตโนมัติ
- การเปลี่ยนแปลงเล็กน้อยของบริบทอาจเปลี่ยนไปอย่างสิ้นเชิงว่าตัวโปรแกรมเหมาะกับบริบทนั้นดีแค่ไหน
- โปรแกรมใหม่ย่อมมุ่งหน้าไปสู่โลกที่ยังไม่รู้จักไม่ทางใดก็ทางหนึ่ง หลายครั้งเราไม่รู้ชัดว่ากำลังทำอะไรอยู่ไม่ว่าจะไปในทิศทางไหน
- type, abstraction, การทดสอบ, เวอร์ชัน, state machine, immutability, formal analysis ฯลฯ คือเครื่องมือที่ใช้ได้เมื่ออยู่ในภูมิประเทศที่ยังไม่คุ้นเคย
- อย่างหลีกเลี่ยงไม่ได้ เราจะใช้เครื่องมือเหล่านี้บางอย่างมากเกินไป ปริมาณการใช้ที่เหมาะสมจริง ๆ น้อยกว่าที่เราคิดมาก การใช้เกินคือหนี้ทางเทคนิค
- เมื่อความเข้าใจในบริบทนิ่งพอแล้ว การทิ้งโปรแกรมไปเป็นส่วนใหญ่และเริ่มใหม่ตั้งแต่ต้นนั้นมีคุณค่า
- ก่อนจะเขียนใหม่ ต้องใส่ทุกอย่างที่ต้องการจากโปรแกรมและทุกสถานการณ์ที่โปรแกรมต้องรองรับไว้ในหัวพร้อมกันทั้งหมด
- สร้างทุกอย่างในคราวเดียว
- การทดสอบและการจัดการเวอร์ชันเป็นอุปสรรคต่อการไปถึงปลายทางสุดท้ายของวิวัฒนาการนี้
- การทดสอบทำให้เราลืมความกังวล ส่วนการจัดการเวอร์ชันทำให้เรายึดติดกับอดีต
ความเห็นของ GN⁺
- ถ้าโปรแกรมซับซ้อนเกินไป การจำทุกอย่างไว้ในขั้นที่ 8 อาจเป็นไปไม่ได้ ซึ่งใช้ได้กับซอฟต์แวร์ส่วนใหญ่ โดยเฉพาะซอฟต์แวร์ที่มีคนเขียนมากกว่าหนึ่งคน
- ซอฟต์แวร์ไม่ได้จำเป็นต้องไปถึงขั้นที่ 9 เสมอไป Freewheeling Apps จำนวนมากเรียบง่ายพอและวิวัฒนาการช้าพอที่จะคงตัวจนแทบไม่มีบั๊กได้ แม้จะมีผู้ใช้เพียงไม่กี่คน และไม่ว่าตัวเลือกการออกแบบตั้งต้นจะเป็นแบบใด
- data-oriented design มีประโยชน์อย่างชัดเจนต่อการไปถึงขั้นที่ 9 มันไม่ใช่เครื่องมือที่ใช้แบบหลับหูหลับตาได้ แต่เป็นกรอบคิดที่มองภาพใหญ่ของวิธีที่โปรแกรมเข้าถึงข้อมูล โดยไปไกลกว่าการเลือก immediate data structure
- ขั้นตอนเหล่านี้อาจไม่ได้ถูกต้องทั้งหมด อาจกำลังประเมินเครื่องมือที่ยังมีประสบการณ์น้อยต่ำเกินไป
- สงสัยว่าหลังจากขั้นตอนเหล่านี้แล้วจะยังมีขั้นไหนต่อไปอีก
1 ความคิดเห็น
ความเห็นจาก Hacker News
ถ้าไม่มีเทสต์ ก็จะมองไม่เห็นปัญหา ทำให้ดูเหมือนว่าปัญหาหายไปแล้ว
เมื่อเลิกใช้เทสต์และเวอร์ชันแล้ว กลับได้โปรแกรมที่ดีกว่าเดิม
ตอนแรกคิดว่าผู้เขียนคิดผิด แต่ก็มีมุมมองที่น่าสนใจ
การจัดการเวอร์ชันและ automated testing แก้ปัญหาที่มีอยู่จริง
ตอนเขียน/รีแฟกเตอร์โปรแกรมขนาดใหญ่ การเขียนแล้วทิ้ง แล้วเขียนใหม่อีกครั้ง เป็นสิ่งสำคัญ
บทความนี้ทำให้งง
การเปลี่ยนแปลงเล็กน้อยอาจเปลี่ยนความเหมาะสมของโปรแกรมได้อย่างมาก
การสร้างซอฟต์แวร์คนเดียวกับการสร้างเป็นทีมต่างกันโดยสิ้นเชิง
เริ่มทำงานกับ Freewheeling Apps ในปี 2022
ไม่เห็นด้วยกับแนวคิดที่ว่าการเปลี่ยนแปลงเล็กน้อยอาจเปลี่ยนความเหมาะสมของโปรแกรมได้มาก
ชอบผู้เขียน และชอบโปรเจกต์ Mu
รู้สึกถูกความซับซ้อนของ software engineering ถาโถม