ความหมดศรัทธาต่อซอฟต์แวร์
(tonsky.me)- ซอฟต์แวร์สมัยใหม่แทนที่จะตอบแทนความก้าวหน้าของฮาร์ดแวร์ด้วย ประสิทธิภาพ·ความเรียบง่าย·ความสมบูรณ์ กลับทำให้ความไร้ประสิทธิภาพกลายเป็นเรื่องปกติ โดยอาศัยสมมติฐานว่า “คอมพิวเตอร์เร็วพออยู่แล้ว”
- แม้แต่งาน พื้นฐาน อย่างการเลื่อนหน้าเว็บ, การเปิดอีเมลใน Google Inbox ที่ใช้เวลา 13 วินาที, การอัปเดต Windows 10 ที่ใช้เวลา 30 นาที, หรืออาการหน่วงตอนพิมพ์ในโปรแกรมแก้ไขข้อความ ก็ยังรู้สึกช้ากว่าที่ควรจะเป็น
- ระบบ Android 6GB, Windows 10 4GB, Google Keyboard 150MB รวมถึงกรณีของแอป Electron และ Slack แสดงให้เห็นว่าการ พองตัว ของแอปและแพลตฟอร์มนำไปสู่ต้นทุนด้านประสิทธิภาพ ความซับซ้อน และความน่าเชื่อถือ
- เช่นเดียวกับการอัปเดต OS·แอป·เบราว์เซอร์ และการยุติรองรับแอป 32 บิตใน iOS 11 ซอฟต์แวร์ที่เคยทำงานได้ดีในอดีตก็อาจช้าลงหรือพังไปตามกาลเวลา
- หากต้องการสร้างซอฟต์แวร์ที่ดีกว่าเดิม วิศวกรต้องเข้าใจ ประสิทธิภาพ·โครงสร้าง·ข้อจำกัด ของระบบที่ตนสร้าง และต้องทำให้ได้ผลลัพธ์ที่เร็วและคาดการณ์ได้ด้วยทรัพยากรที่น้อยลง
ซอฟต์แวร์ที่สิ้นเปลืองประสิทธิภาพ
- ซอฟต์แวร์สมัยใหม่มักถูกยอมรับได้ แม้จะทำงานด้วยเพียง 1% หรือ 0.01% ของประสิทธิภาพที่เป็นไปได้
- ในขณะที่รถยนต์ อาคาร และเครื่องบินค่อย ๆ เข้าใกล้ขีดจำกัดทางกายภาพหรือรูปแบบที่เหมาะสมที่สุด ซอฟต์แวร์กลับใช้คำว่า “คอมพิวเตอร์เร็วพออยู่แล้ว” มาอ้างความชอบธรรมให้กับความไร้ประสิทธิภาพ
- คำกล่าวที่ว่า “เวลาของโปรแกรมเมอร์แพงกว่าเวลาของคอมพิวเตอร์” อาจกลบความจริงที่ว่าเวลาของคอมพิวเตอร์กำลังถูกใช้เปลืองอย่างไม่เคยเป็นมาก่อน
- มีการยกทวีตตัวอย่างว่า แม้จะเขียนโปรแกรม Python ที่รันทุกวันใหม่ด้วย Rust แล้วลดเวลาจาก 1.5 วินาทีเหลือ 0.06 วินาที แต่กว่าจะชดเชยเวลา 6 ชั่วโมงที่ใช้พัฒนาได้ก็ต้องรอกว่า 41 ปี ซึ่งกลายเป็นกรณีตัวแทนของการถกเรื่องประสิทธิภาพ
ประสบการณ์พื้นฐานที่ช้าจนทนไม่ได้
- คอมพิวเตอร์พกพารุ่นใหม่มีพลังมากกว่าคอมพิวเตอร์ยุคลงจอดบนดวงจันทร์หลายพันเท่า แต่แม้แต่บน MacBook Pro รุ่นใหม่ก็ยังยากที่จะเลื่อนหน้าเว็บให้ลื่นที่ 60fps
- Inbox ที่สร้างโดย Google ใช้เวลาถึง 13 วินาที ในการเปิดอีเมลหนึ่งฉบับบน Google Chrome
- วิธีที่แอนิเมชันกล่องสีขาวเปล่าแทนเนื้อหาจริงนั้น ดูจะเป็นการประนีประนอมให้เข้ากับขีดจำกัดด้านประสิทธิภาพของเว็บเพจมากกว่า
- แม้ในยุคที่จอ 120Hz กลายเป็นกระแสหลัก ก็ยังมองว่าแม้แต่การแสดงคำตอบหนึ่งรายการในคอมมูนิตี้บนเว็บก็ยังรักษา 60Hz ให้เสถียรไม่ได้
- การอัปเดต Windows 10 ใช้เวลา 30 นาที และในเวลานั้นสามารถฟอร์แมต SSD ดาวน์โหลดบิลด์ใหม่ และติดตั้งซ้ำได้หลายรอบเสียด้วยซ้ำ
- โปรแกรมแก้ไขข้อความสมัยใหม่มีอาการหน่วงตอนพิมพ์มากกว่า Emacs ที่มีอายุ 42 ปี
- มีการชี้ว่าแม้แต่งานที่ต้องอัปเดตเพียงสี่เหลี่ยมเล็ก ๆ ทุกครั้งที่กดคีย์ ก็ยังทำไม่ทันภายใน 16ms
- ขณะที่เกม 3D ต้องเรนเดอร์ทั้งหน้าจอ จัดการอินพุต คำนวณโลก และบริหารทรัพยากรทั้งหมดภายใน 16ms เดียวกัน
- ฮาร์ดแวร์ที่เร็วขึ้นจึงไม่ได้ถูกใช้เพื่อรันซอฟต์แวร์ที่ดีขึ้น แต่กลับถูกใช้เพื่อรันซอฟต์แวร์ที่ทำสิ่งเดิมได้ช้าลง
แอปและแพลตฟอร์มที่พองตัว
- เว็บแอปสามารถเร็วขึ้นได้ถึง 10 เท่า เพียงแค่บล็อกโฆษณา และ AMP ก็ใกล้เคียงกับการตัดส่วนที่พองเกินจำเป็นออกมากกว่าจะเป็นเทคโนโลยีใหม่จริง ๆ
- ระบบ Android มีขนาด 6GB แม้ไม่มีแอปใด ๆ, Windows 95 มี 30MB และ Windows 10 มี 4GB
- มองว่า Windows 10 มีขนาดใหญ่กว่า Windows 95 ถึง 133 เท่า แต่ความสามารถพื้นฐานไม่ได้ต่างกันมากนัก
- และ Android ยังใหญ่กว่า Windows 10 อีก 1.5 เท่า
- Google Keyboard มักใช้พื้นที่ 150MB, แอป Google ใช้ 350MB, และ Google Play Services ใช้ 300MB
- มีการวิจารณ์ด้วยการตั้งคำถามว่า Google Keyboard ซึ่งเป็นเพียงแอปที่วาดปุ่มราวสามสิบปุ่มบนหน้าจอ ซับซ้อนกว่า Windows 95 ทั้งระบบถึง 5 เท่าจริงหรือ
- Google Play Services ลบออกไม่ได้แม้จะไม่ได้ใช้งาน
- สถานการณ์ที่หลังติดตั้งแอปพื้นฐานแล้วเหลือพื้นที่เก็บรูปเพียงประมาณ 1GB นั้น ตัดกับยุคที่ OS·แอป·ข้อมูลทั้งหมดต้องเก็บลงในฟลอปปีดิสก์อย่างชัดเจน
- แอป Todo ที่สร้างบน Electron อาจบรรจุแม้กระทั่งไดรเวอร์คอนโทรลเลอร์ Xbox 360, การเรนเดอร์กราฟิก 3D, การเล่นเพลง และความสามารถในการถ่ายภาพด้วยเว็บแคม
- Slack แม้จะเป็นแอปที่ใกล้เคียงกับแชตและโปรแกรมแก้ไขข้อความแบบง่าย ๆ แต่ก็ยังถูกจัดเป็นแอปหนักเพราะความเร็วในการโหลดและการใช้หน่วยความจำ
- ยิ่งแอปใหญ่ขึ้น การสูญเสียการควบคุม ต้นทุนความซับซ้อน การสูญเสียประสิทธิภาพ และหนี้ด้านความน่าเชื่อถือก็ยิ่งเพิ่มขึ้น และเราไม่ควรยอมรับ แอปที่หนักเกินเหตุ ว่าเป็นเรื่องปกติ
ซอฟต์แวร์ที่เสื่อมสภาพไปตามเวลา
- เมื่อ 3 ปีก่อน โทรศัพท์ Android 16GB ก็ยังเพียงพอ แต่พอถึงยุค Android 8.1 แอปต่าง ๆ กลับโตเป็นสองเท่าโดยไม่มีเหตุผลชัดเจน จนใช้งานได้ลำบาก
- iPhone 4s เปิดตัวพร้อม iOS 5 แต่การรัน iOS 9 กลับเป็นภาระหนัก และก็ไม่ได้หมายความว่า iOS 9 จะยอดเยี่ยมกว่าจนเป็นคนละระดับ
- iOS 11 ยุติการรองรับ แอป 32 บิต ทำให้แอปที่ไม่มีนักพัฒนาแล้วหรือไม่ได้อัปเดตอาจหายไปและไม่สามารถใช้งานได้อีก
- มีการอ้างทวีตว่า โปรแกรม DOS ยังรันได้บนคอมพิวเตอร์หลายรุ่นตั้งแต่ทศวรรษ 1980 โดยไม่ต้องแก้ไข แต่แอป JavaScript อาจพังได้แม้แต่กับการอัปเดต Chrome ครั้งถัดไป
- แม้แต่เว็บเพจที่วันนี้ยังใช้งานได้ดี ภายใน 10 ปีก็อาจไม่สามารถทำงานได้ถูกต้องบนเบราว์เซอร์ใดเลย
- เราซื้อโทรศัพท์ใหม่และ MacBook ใหม่เพื่อทำสิ่งเดิม แต่สุดท้ายก็เพียงเพื่อรันแอปเดิมให้ช้าลงอีกครั้ง
ความคาดหวังด้านคุณภาพที่ลดต่ำลง
- เมื่อเว็บเพจมีปัญหา มันมักไม่ได้ขอให้ตรวจหาสาเหตุ แต่บอกให้กดรีเฟรชแทน
- เว็บแอปสามารถปล่อยข้อผิดพลาด JavaScript แบบ “สุ่ม” ออกมาได้ แม้อยู่บนเบราว์เซอร์ที่รองรับก็ตาม
- มีการวิจารณ์ว่าการออกแบบเว็บเพจและฐานข้อมูล SQL ตั้งอยู่บนความหวังว่าข้อมูลจะไม่เปลี่ยนระหว่างที่ผู้ใช้กำลังดูหน้าเว็บที่เรนเดอร์แล้ว
- ฟังก์ชันทำงานร่วมกันก็มักอยู่เพียงระดับ “พยายามให้ดีที่สุด” และมีสถานการณ์ปกติที่อาจทำให้ข้อมูลสูญหายได้
- ไดอะล็อกอย่าง “จะเก็บเวอร์ชันไหนไว้?” แทบจะหมายถึงการให้เลือกว่าจะทำลายชิ้นงานไหนมากกว่า
- Linux แม้จะมีการออกแบบที่สามารถฆ่าโปรเซสแบบตามอำเภอใจได้ ก็ยังเป็นระบบปฏิบัติการที่ได้รับความนิยมที่สุดบนเซิร์ฟเวอร์
- กรณีของจอ Dell, AirDrop และ Bluetooth แสดงให้เห็นว่าซอฟต์แวร์ในอุปกรณ์และสเปกที่ซับซ้อนสร้างประสบการณ์ที่ต้องพึ่งการรีเซ็ตเป็นระยะหรืออาศัยดวง
- หากต้องการส่งมอบสิ่งที่ทำงานได้อย่างเสถียร เราต้องเข้าใจสิ่งที่สร้างทั้งภายในและภายนอก แต่กับระบบที่พองตัวเกินไป เรื่องนั้นกลับทำได้ยาก
ความสับสนของเครื่องมือเขียนโปรแกรมและแนวปฏิบัติการพัฒนา
- แม้แต่ในองค์ประกอบพื้นฐานอย่างการจัดการแพ็กเกจ ระบบบิลด์ คอมไพเลอร์ การออกแบบภาษา และ IDE ก็ยังยากจะเห็นความสมบูรณ์ที่ทั้งเร็ว มีประสิทธิภาพ และอยู่ได้นาน
- ระบบบิลด์แม้จะมีข้อมูลการเปลี่ยนแปลงทั้งหมดอยู่แล้ว ก็ยังมักเรียกร้องให้ล้างทุกอย่างแล้วทำใหม่เป็นระยะ
- มองว่าไม่มีเหตุผลเลยที่จะทำให้มันไม่น่าเชื่อถือ คาดการณ์ไม่ได้ และทำซ้ำไม่ได้
- มีการบรรยายว่า NPM อยู่ในสภาพ “บางทีก็ทำงาน” มานานหลายปี
- พร้อมอ้างทวีตว่า
rm -rf node_modulesดูเหมือนจะเป็นสิ่งที่หลีกเลี่ยงไม่ได้ในงานพัฒนา Node.js/JavaScript
- ความจริงที่ว่าคอมไพเลอร์และงานก่อน-หลังการประมวลผลใช้เวลาหลายนาทีหรือหลายชั่วโมงแต่ยังถูกยอมรับได้ ขัดกับคำพูดที่ว่า “เวลาของโปรแกรมเมอร์มีค่า”
- กรณีที่ยังเลือกใช้ Hadoop ทั้งที่ช้ากว่าการรันบนพีซีเครื่องเดียว แสดงให้เห็นว่าโปรแกรมเมอร์ไม่ได้ตัดสินใจอย่างมีเหตุผลเสมอไป
- มีการวิจารณ์ว่าแมชชีนเลิร์นนิงและ “ปัญญาประดิษฐ์” ได้พาซอฟต์แวร์เข้าสู่ยุคแห่งการเดาสุ่มที่ไม่น่าเชื่อถือ
- พร้อมอ้างทวีตที่บอกว่า เมื่อเห็นคำว่า “ปัญญาประดิษฐ์” หรือ “แมชชีนเลิร์นนิง” ในแอปหรือบริการ จะตีความได้เลยว่ามันไม่น่าเชื่อถือ คาดเดาไม่ได้ และอธิบายผลลัพธ์ได้ยาก
- วิธีการรัน VM บน Linux แล้วใส่ Docker ซ้อนใน VM ถูกมองว่าเป็นสัญญาณว่าเราไม่รู้วิธีจัดการโปรแกรม·ภาษา·สภาพแวดล้อมรันไทม์ให้เรียบร้อยจริง ๆ
- ความจริงที่ว่า ไฟล์รันเดี่ยว ของ Go ถูกยกเป็นข้อดีหลัก สะท้อนสถานการณ์ที่แค่ไม่เละเทะก็ถือว่าประสบความสำเร็จแล้ว
- การพึ่งพา dependency มักเข้ามาพร้อมต้นทุนการนำไปใช้และ dependency ตัวใหม่ ๆ เพราะพยายามแก้ปัญหาง่าย ๆ ด้วย “โซลูชันแพ็กเกจครบชุด”
- มีการชี้ว่าการใช้โปรแกรมโดยไม่รีสตาร์ตติดต่อกันหลายปีนั้นยาก และบางครั้งแม้แต่ไม่กี่วันก็ยังยาก
- การรีสตาร์ตโปรเซส, รีบูตฐานข้อมูล, watchdog ที่รีสตาร์ตแอปทุก 20 นาที, การใส่ทรัพยากรซ้ำซ้อน และการส่งข้อมูลแบบบีบอัด ล้วนเป็นวิธีข้ามปัญหาไปเร็ว ๆ แทนที่จะแก้ไขมัน
- แนวปฏิบัติเหล่านี้ไม่ใช่วิศวกรรม แต่คือ การเขียนโปรแกรมแบบขี้เกียจ และวิศวกรรมคือการเข้าใจประสิทธิภาพ โครงสร้าง และข้อจำกัดของสิ่งที่เราสร้างอย่างลึกซึ้ง
ความซับซ้อนที่ทับถมและความไม่ใส่ใจของตลาด
- ซอฟต์แวร์ปัจจุบันอยู่ในสภาพที่โค้ดซึ่งพอทำงานได้ถูกกองทับด้วยโค้ดที่พอทำงานได้อีกชั้น และมันก็ยังคงใหญ่ขึ้น ซับซ้อนขึ้น จนโอกาสจะเปลี่ยนแปลงยิ่งน้อยลง
- ระบบนิเวศที่ดีควรมีช่วงที่ต้องถอยหลังเพื่อเดินหน้าต่อได้บ้าง แต่มีการชี้ว่าเราไม่เห็นเคอร์เนล OS ใหม่มา 25 ปีแล้ว และตอนนี้มันก็ซับซ้อนเกินกว่าจะเขียนใหม่ได้
- เบราว์เซอร์เองก็เขียนเอนจินเลย์เอาต์ใหม่จากศูนย์ได้ยาก เพราะเต็มไปด้วย edge case และปัญหาทางประวัติศาสตร์
- ความก้าวหน้าในทุกวันนี้ดูเหมือนการเติมเชื้อไฟลงกองไฟ เช่น เอา microservices มาแก้ปัญหา monolith, เอา Docker มาแก้ปัญหา microservices, แล้วเอา Kubernetes มาแก้ปัญหา Docker อีกที
- มีการอ้างทวีตว่า เราเปลี่ยนจากการตั้งค่าแบบประกาศด้วย XML ไปเป็นการตั้งค่า microservices ด้วย YAML แต่ XML ในอดีตอย่างน้อยก็ยังมี schema
- ผู้ใช้แทบไม่มีทางเลือกนอกจากยอมรับสิ่งที่วิศวกรส่งมาให้ ไม่ว่าจะเป็นแอป Android ขนาด 350MB, การเลื่อนหน้าจอที่กระตุก, หรือคำแนะนำว่า “ถ้าไม่ทำงานก็รีบูต”
- หากผลิตภัณฑ์คู่แข่งทั้งหมดก็ช้า ใหญ่ และคุณภาพต่ำเหมือนกัน ก็ยากที่จะเกิดแรงกดดันจากการแข่งขัน
- แม้บางครั้งจะมีผลิตภัณฑ์ที่สร้างแรงกดดันได้ เช่น iPhone/iOS เทียบกับสมาร์ตโฟนอื่น หรือ Chrome เทียบกับเบราว์เซอร์อื่น แต่ก็มักอยู่ได้ไม่นาน
- ภารกิจของวิศวกรควรเป็นการแสดงให้เห็นว่า ด้วยคอมพิวเตอร์ยุคใหม่แล้ว อะไรบ้างที่เป็นไปได้ในด้านประสิทธิภาพ ความน่าเชื่อถือ คุณภาพ และความพร้อมใช้งาน
แต่ก็ยังมีทางเลือกให้เห็น
- LMAX Disruptor, SBE, Aeron ของ Martin Thompson ถูกยกเป็นตัวอย่างที่น่าประทับใจ เรียบง่าย และมีประสิทธิภาพ
- Xi editor ของ Raph Levien ถูกประเมินว่าเป็นงานที่สร้างขึ้นโดยยึดหลักการที่ถูกต้อง
- Jonathan Blow สร้างภาษาขึ้นมาใช้กับเกมของตัวเอง และบนโน้ตบุ๊กของเขาสามารถคอมไพล์ใหม่ทั้งหมดของโค้ด 500,000 บรรทัด ได้ในเวลา 1 วินาที
- นี่คือผลลัพธ์ของการคอมไพล์ใหม่ทั้งหมด ไม่ใช่ incremental build และไม่ใช่แคชระหว่างทาง
- มองว่าการเขียนโปรแกรมให้เร็วไม่ได้ต้องใช้ความเป็นอัจฉริยะหรือเวทมนตร์อะไร เพียงแค่ไม่สร้างมันบนกองขยะขนาดมหึมาของ toolchain ที่กำลังเป็นกระแส
ข้อเรียกร้องเพื่อซอฟต์แวร์ที่ดีกว่า
- วิศวกรรมซอฟต์แวร์ต้องไม่หยุดอยู่กับสภาพปัจจุบัน แต่ต้องดีขึ้นกว่านี้ และไม่จำเป็นต้องสร้างสิ่งเดิมซ้ำในรูปแบบที่ช้าลงและใหญ่ขึ้น
- การพัฒนาในทุกวันนี้ใกล้เคียงกับการประคองให้บรรลุเป้าหมายทางธุรกิจบนเครื่องมือที่ใกล้พัง มากกว่าจะเรียกว่าความก้าวหน้า
- มีการชี้ว่าผลจากการยึดติดกับการปรับให้เหมาะเฉพาะจุด ทำให้เราคุ้นชินกับสภาพที่พองตัวและไร้ประสิทธิภาพ
- วิศวกรสามารถ และควร สร้างแอปที่ดีกว่าด้วยเครื่องมือที่ดีกว่า โดยใช้ทรัพยากร น้อยลงหลายเท่า แต่ยังคงเร็ว คาดการณ์ได้ และน่าเชื่อถือ
- หากต้องการส่งมอบผลิตภัณฑ์คุณภาพสูงที่เชื่อถือได้และคาดการณ์ได้ เราต้องเข้าใจอย่างถ่องแท้ว่ากำลังทำอะไรและทำไปทำไม และข้ออ้างแบบ “ของที่ให้มาก็เป็นแบบนี้” นั้นยอมรับไม่ได้
2 ความคิดเห็น
บทความนี้มีฉบับแปลภาษาเกาหลีออกมาก่อนแล้ว ดังนั้นไปอ่านฉบับนั้นได้เลย.
https://tonsky.me/blog/disenchantment/ko/
ผมได้เปลี่ยนเป็นลิงก์ฉบับแปลไว้แล้ว.
ความคิดเห็นจาก Hacker News
โค้ดที่เล็กกว่า สะอาดกว่า มีบั๊กน้อยกว่า ปลอดภัยกว่า เร็วกว่า และอยู่ได้นานกว่านั้น แน่นอนว่าย่อมเป็นไปได้ ถ้าเราทำได้ตั้งแต่ยุคเริ่มต้นของยุคสารสนเทศ ก็ไม่มีเหตุผลอะไรที่ตอนนี้ซึ่งมีประสบการณ์หลายสิบปีและเครื่องมือทรงพลังแล้วจะทำไม่ได้
เหตุผลที่ไม่ทำก็เพราะมันไม่มีเงินอยู่ตรงนั้น และจริง ๆ แล้วแทบจะเป็นตรงกันข้าม สตาร์ทอัพที่รับเงิน VC ต้องออกสู่ตลาดก่อนถึงจะอยู่รอด ส่วนในองค์กรที่โตเต็มที่แล้ว ต้นทุนและการบวมพองก็ไม่ได้ถูกมองว่าเป็นปัญหา แต่ทำงานเหมือนเป็นฟีเจอร์ที่ช่วยเพิ่มบารมีของผู้จัดการ สุดท้ายต้นทุนก็ถูกผลักไปให้ลูกค้า
เหตุผลที่ “กลไกตลาดอันโหดเหี้ยม” ไม่แก้ความสิ้นเปลืองแบบนี้ น่าจะเป็นเพราะแม้ codebase ที่ดีกว่าอาจได้กุญแจสู่อาณาจักรในสักวัน แต่สภาพการแข่งขันจริงนั้นเปราะบางต่อพยาธิสภาพและกระแสนิยมมากเกินไป
อย่างไรก็ตาม สิ่งที่ทำได้ง่ายกว่าบริษัทที่รับเงิน VC คือการจัดสรรเวลาให้กับ การรีแฟกเตอร์และการจัดการหนี้ทางเทคนิค จริง ๆ แล้วตอนนี้กำลังเหยียบเบรกการพัฒนาฟีเจอร์ใหม่เป็นเวลา 45 วัน เพื่อจัดการปัญหาทางเทคนิคหลัก ๆ อยู่ ถ้าคาดว่าจะถูกซื้อกิจการในปีหน้า ก็คงลงทุนแบบนี้ได้ยาก และหนี้ทางเทคนิคก็จะกลายเป็นปัญหาของคนอื่น
ตราบใดที่ผลิตภัณฑ์ยังถูกพัฒนาต่อไป บั๊กและปัญหาใหม่ ๆ ก็จะเกิดขึ้นเรื่อย ๆ “โค้ดที่สมบูรณ์แบบ” เป็นไปได้เฉพาะในบริบทปิดที่ไม่มีการเพิ่มฟีเจอร์ใหม่อีกแล้วเท่านั้น
ผมมองว่า โมเดลการลงทุนแบบ VC คือสิ่งที่ผลักอุตสาหกรรมมาถึงจุดนี้ สตาร์ทอัพรับเงินหลายล้านดอลลาร์ แล้วต้องทำเงินให้เร็วพอที่จะคืนให้ผู้ลงทุน ดังนั้นจึงต้องรีดเงินจากแอปให้เร็วที่สุดเท่าที่ทำได้ งานที่ไม่มีตัวชี้วัด ROI ติดอยู่จะไม่ได้รับความสนใจจากใครเลย
โดยพื้นฐานแล้วมันเคยมีการเปิดให้เข้าถึงได้โดยตรง ไม่มีรหัสผ่านหรือใช้รหัสผ่านสั้น ๆ การจัดเก็บรหัสผ่านที่ไม่ปลอดภัย ทุกอย่างเป็นข้อความล้วน การไม่สนใจการทำความสะอาดอินพุต และสิ่งอย่าง telnet
อีกเหตุผลหนึ่งที่ซอฟต์แวร์บวมขึ้นก็อยู่ตรงนี้ เราเริ่มมองเห็นปฏิสัมพันธ์และความเสี่ยง และเมื่อเห็นแล้วก็ทำเป็นไม่เห็นไม่ได้ เงื่อนไขขอบเขต ที่ต้องจัดการไม่ได้ลดลง แต่เพิ่มขึ้น และฮาร์ดแวร์ที่ต้องรองรับก็มีมากขึ้นด้วย
กระบวนการเขียนโค้ดที่มีประสิทธิภาพดีสามารถปรับปรุงได้ แต่ในขณะเดียวกัน baseline ก็กำลังสูงขึ้นเร็วกว่าความเร็วที่เราไปถึงเสียอีก สิ่งที่น่าสนใจก็คือตอนนี้เรากำลังค่อย ๆ กลับไปในทิศทางที่ไม่ต้องใช้รหัสผ่านอีกครั้ง
test coverage ระดับ unit test ที่สูงจนทำให้การรีแฟกเตอร์เจ็บปวด มักขัดขวางการปล่อยฟีเจอร์ และผมคิดว่ามันเกิดขึ้นบ่อยกว่าที่พวกคลั่งไคล้ test-driven development อยากยอมรับมาก “แนวปฏิบัติที่ดีที่สุด” จำนวนมากในวงการนั้นใกล้เคียงกับหลักคำสอนที่ไม่สมจริง ซึ่งสร้างโดยคนที่อยู่ในบริษัทที่หา product-market fit เจอแล้วและเงินไหลเข้ามาเอง
ยังมี HP MS200 all-in-one ที่พอใช้งานได้แบบเฉียดฉิวอยู่เครื่องหนึ่ง ซื้อถูก ๆ จาก garage sale เมื่อปี 2017 และถ้าลง Linux หลังจาก Chrome โหลดเสร็จแล้ว ก็ยังสามารถวิดีโอคอล Skype เวอร์ชันเว็บแบบเต็มหน้าจอ หรือดู YouTube เต็มหน้าจอได้
ล่าสุดได้เครื่องนี้กลับมาและก่อนจะทำเป็นคอมพิวเตอร์ให้เด็ก ๆ ใช้ ก็ลองติดตั้ง FC38 กับ Chrome รุ่นล่าสุด ปรากฏว่าวิดีโอ YouTube กลายเป็นสไลด์โชว์ ปรับตั้งค่าเท่าไรก็ไม่ได้ผล จึงเพิ่ม RAM จาก 2GB เป็น 3GB แล้วมันก็กลับมาเล่น 720p เต็มหน้าจอได้ระดับเดียวกับเมื่อ 6 ปีก่อน
แปลว่าการทำสิ่งเดิมต้องใช้หน่วยความจำเพิ่มขึ้น 1.5 เท่า หรือเพิ่มอีก 1GB ผมก็เข้าใจคำพูดที่ว่า 16GB คือขั้นต่ำ แต่แม้บนเครื่องห่วย ๆ เครื่องนี้ Chrome ซึ่งแทบจะเป็นเว็บเบราว์เซอร์ที่อยู่เฉย ๆ ยังแสดง memory footprint ประมาณ 30GB ส่วนใหญ่น่าจะเป็นไฟล์ที่ mmap ไว้ แต่ถึงอย่างไรก็คือ 30GB
ในทางกลับกัน สำหรับอุปกรณ์ส่วนใหญ่ อายุแบตเตอรี่ที่เพิ่มขึ้น อุณหภูมิที่ต่ำลง และความต้องการ RAM/ดิสก์ที่น้อยลง ถือเป็นการปรับปรุงที่ชัดเจน YouTube อาจเก็บไฟล์ encoding แบบเก่าไว้ซ้ำบนเซิร์ฟเวอร์ก็ได้ แต่ในสถานการณ์ที่ผู้ใช้ส่วนใหญ่เข้าจากอุปกรณ์รุ่นใหม่ นั่นก็กลายเป็นการเปลืองพื้นที่
การใช้ RAM ที่เพิ่มขึ้นส่วนใหญ่ของ Chrome มาจากพัฒนาการของ สถาปัตยกรรม sandbox หน่วยความจำที่ใช้ร่วมกันและพื้นที่โปรเซสอาจถูกใช้ในการโจมตีเพื่อหลุดจาก sandbox ได้ จึงมีการเพิ่มการแยกกั้นมากขึ้น และการที่ Chrome เปิดโปรเซสอิสระใหม่สำหรับแต่ละแท็บและ extension ก็เป็นสาเหตุใหญ่เช่นกัน
ทุกวันนี้ ad blocker ก็มีผลมากเช่นกัน เมื่อเว็บแย่ลง ad blocker ที่มีประสิทธิภาพก็สร้างได้ยากขึ้นและต้องใช้ทรัพยากรมากขึ้น ซอฟต์แวร์ที่ช้าไม่ได้ช้าลงเพียงเพื่อกวนใจคน แต่บ่อยครั้งเป็นผลจากการเปลี่ยนแฮ็กที่อันตรายให้กลายเป็น implementation ที่ดี และจาก requirement ที่เปลี่ยนไป FLV ไม่เพียงพออีกต่อไป และ h264 เองก็ดูไม่น่าจะยืนระยะได้นานในอีก 5 ปีข้างหน้าเมื่อ h265 และ AV1 แพร่หลายขึ้น
toolchain สมัยใหม่มุ่งเน้นที่ “อย่าสร้างล้อขึ้นมาใหม่” แต่ถ้า dependency แต่ละตัวเลือกล้อคนละเวอร์ชันกัน แค่ดึง dependency มาไม่กี่ตัว ก็อาจมี implementation ของฟังก์ชันระดับต่ำเดียวกันเข้ามาทีละ 6 แบบ
แต่สิ่งที่ติดตั้งเป็น Flatpak และรู้สึกได้ถึงความบวม โชคดีที่ Chrome ยังติดตั้งแบบ native โดยตรงเป็น RPM ได้ และใช้ shared library ของ OS จริง ๆ
บทความนี้ไม่ได้แตะประเด็นความเจ็บปวดหลักอย่าง บั๊ก เลยด้วยซ้ำ ซอฟต์แวร์แทบทุกอย่างให้ความรู้สึกเหมือนเต็มไปด้วยบั๊กให้มากที่สุดเท่าที่จะเป็นไปได้ ทุกครั้งที่ต้องใช้ซอฟต์แวร์ในเส้นทางที่ไม่ค่อยพบบ่อยหรือโฟลว์ที่ผิดปกติ ก็รู้สึกกลัว และแทบจะล้มเหลวเสมอ
ไม่นานมานี้ตอนขายรถให้ Carvana ต้องสลับไปมาระหว่าง Chrome กับ Firefox ถึงจะทำจนเสร็จได้ ใน Chrome ตัวช่วยอัปโหลดรูปภาพเจอ JS exception และส่วนนั้นกลับทำได้อย่างน่าอัศจรรย์เฉพาะใน Firefox แต่ส่วนที่เหลือของเว็บมีปัญหาเยอะจนเห็นได้ชัดว่าไม่ได้ทดสอบบน Firefox
ที่แย่กว่านั้นคือเมื่อผู้ใช้ที่ไม่ใช่สายเทคนิคเจอบั๊ก พวกเขาจะคิดว่าตัวเองทำอะไรผิดไปเอง ถ้าเป็นซอฟต์แวร์ที่เสถียรและแข็งแรง ต่อให้เทอะทะและช้า ตอนนี้ผมก็ยินดีรับได้
อีกด้านหนึ่ง ก็ยังเห็นอยู่เรื่อย ๆ ว่าทุกอย่างเต็มไปด้วยบั๊กแค่ไหน และไม่รู้ว่าจริง ๆ แล้วมันมีบั๊กมากขึ้น หรือเป็นเพราะพออายุมากขึ้นและรู้เรื่องเบื้องหลังมากขึ้น ความอดทนต่อการพัฒนาซอฟต์แวร์แบบบริษัทใหญ่ก็ลดลงกันแน่ หงุดหงิดกับ product manager ในจินตนาการที่สั่งว่า “ปล่อยฟีเจอร์ X เดี๋ยวนี้” ทั้งที่บั๊ก UX ชัด ๆ จับได้ง่ายมาก
ผมเข้าใจและเห็นด้วยบางส่วนกับข้อโต้แย้งอย่างต้นทุน ค่าเสียโอกาส และ pragmatism แต่บางครั้งก็สลัดความรู้สึกไม่ได้ว่าเราแค่ยอมรับการใช้ชีวิตอยู่ในโลกที่สร้างเสร็จแค่ครึ่งเดียว
ตอนนี้ก็ไม่รู้สึกว่าดีขึ้น เด็กเล็ก ๆ พอได้จับโทรศัพท์หรือแล็ปท็อป แค่กดปุ่มเร็วเกินไปหรือกดในลำดับที่ไม่คาดคิด ก็ทำให้อุปกรณ์สมัยใหม่ค้าง หน่วง และแครชได้ค่อนข้างสม่ำเสมอ ทั้งที่ไม่ได้ทำให้พังทางกายภาพเลย แต่นี่คือสภาพของเทคโนโลยีสมัยใหม่
ผมเข้าใจว่าทำไมถึงยังไม่ถูกแก้ ผู้คนเริ่มคาดหวังไปแล้วว่าบางครั้งต้องรีสตาร์ต และกรณีแบบนี้ก็โยนความผิดให้เด็กได้ง่าย แถมรีสตาร์ตแล้วก็หาย แต่ถึงอย่างนั้น ในวงจรชีวิตของระบบปฏิบัติการ ผมก็หวังว่าตอนนี้มันควรจะดีขึ้นได้แล้ว
ในบทความที่เขียนเกี่ยวกับ C ผมไม่ได้พูดถึงเรื่องนี้ แต่หนึ่งในเหตุผลสำคัญที่ผมใช้ C คือมันทำให้สร้างซอฟต์แวร์ที่บวมเทอะทะได้ยาก จะเพิ่มฟีเจอร์ก็ได้ แต่การที่ฟีเจอร์เดียวจะทำให้ไฟล์ executable เพิ่มขึ้น 100KB ก็ยังไม่ง่าย
ตอนนี้ไม่ได้มีงานประจำ แต่ใช้เครื่องแรงสำหรับ “งาน” อยู่ ถึงอย่างนั้นก็ใช้ Neovim กับ tmux แทน IDE ใช้ Gentoo ที่ปรับแต่งหนัก ๆ แทน Linux distro ทั่วไป และใช้ OpenRC แทน systemd รวมถึงใช้ tiling window manager ชื่อ Qtile แทนเดสก์ท็อปเต็มรูปแบบ
ผมรักษาเครื่องให้ไม่บวมเทอะทะ จนตอนบูตและเพิ่งล็อกอินมีแค่ 40 โปรเซส ตอนนี้ผมกำลังทำวิศวกรรมซอฟต์แวร์จริง ๆ อยู่ พยายามลดปัญหาของ C อย่างได้ผล พร้อมกับรักษาซอฟต์แวร์ให้เล็กและเร็ว และหวังว่าสักวันจะสร้างธุรกิจบนสิ่งนั้นได้
คงได้เห็นกันว่ายังมีตลาดสำหรับซอฟต์แวร์ที่ไม่บวมและคล่องตัวอยู่หรือไม่
https://gavinhoward.com/2023/02/why-i-use-c-when-i-believe-i...
https://gavinhoward.com/2020/12/my-development-environment-a...
https://gavinhoward.com/2023/06/an-apology-to-the-gentoo-aut...
https://gavinhoward.com/2023/09/lessons-learned-as-a-user-3-...
โปรแกรมอย่าง WordPerfect, Lotus 123, MS-DOS 1.0 และ SubLogic Flight Simulator ก่อนที่ Microsoft จะเข้าซื้อ ในยุค 1980 ล้วนเขียนด้วย assembly ตอนนั้นผู้สังเกตการณ์ในอุตสาหกรรมมองว่า เพราะ MS Word และ MS Excel เขียนด้วย C ที่ “บวม” Microsoft จึงทำซ้ำฟีเจอร์ใหม่ ๆ ได้เร็วกว่า WordPerfect กับ Lotus 123 และพอร์ตไปยังสถาปัตยกรรมอื่นได้เร็วกว่า เพราะคู่แข่งยังอยู่กับ assembly นานเกินไป
ในซอฟต์แวร์ส่วนตัวก็เห็น trade-off แบบเดียวกัน ถ้าใช้ C#/Python ที่ระดับสูงกว่าและ “บวม” กว่า แทน C/C++ ที่เพรียวกว่า ก็ทำงานบางอย่างเสร็จได้เร็วขึ้นมาก ผมถนัด C++ มากกว่าและชอบไฟล์ executable ขนาดเล็ก แต่ถ้า C# ทำงานที่ต้องการให้เสร็จได้เร็วกว่า ข้อดีนั้นก็หมดความหมาย ผมเองก็เป็นส่วนหนึ่งของปัญหาซอฟต์แวร์บวมเหมือนกัน
“จะสร้างสะพานที่แข็งแรงที่สุดและเบาที่สุดในโลก” เป็นเรื่องน่าทึ่ง ส่วน “จะสร้างสะพานที่เบาพอและแข็งแรงพอ ในราคาที่ลูกค้าจ่ายไหว” นั่นคือวิศวกรรม
อ่านไปได้เกินครึ่งนิดหน่อยแล้วหยุด แต่ข้ออ้างหลักดูเหมือนจะเป็นว่า ซอฟต์แวร์ควรต้องเร็ว ส่วนการให้เหตุผลรองรับปรัชญานั้น เท่าที่จำได้ก็มีแค่นัยว่า “มันก็เป็นความจริงอยู่แล้ว” ยอมรับข้อโต้แย้งว่าบางครั้งผลประโยชน์ด้านประสิทธิภาพไม่อาจชดเชยต้นทุนเวลาที่ใช้ไล่ตามประสิทธิภาพได้ แต่ก็ข้ามไปโดยไม่ได้ต่อสู้กับเหตุผลนั้นอย่างจริงจัง
ลักษณะสำคัญอีกอย่างของบทความคือการเลือกหยิบข้อมูลเฉพาะที่เข้าทางและทำให้โดเมนดูเรียบง่ายเกินจริง มีการใช้อุทธรณ์ทางอารมณ์ซ้ำ ๆ ว่า “ตกลงซอฟต์แวร์มันใช้เวลาและพื้นที่ไปทำอะไรกันแน่?” แต่ไม่ได้พยายามตอบคำถามนั้นอย่างจริงจัง และใช้ข้อเท็จจริงที่ว่าไม่มีคำตอบ ราวกับเป็นหลักฐานว่าคำตอบนั้นผิด ยังเอาซอฟต์แวร์หลายตัวที่ไม่ได้มีฟีเจอร์เทียบเท่ากันมาเปรียบเหมือนต่างกันแค่ประสิทธิภาพด้วย
มีเรื่องให้พูดได้มากเกี่ยวกับต้นทุนทางสังคม สิ่งแวดล้อม และธุรกิจของความไร้ประสิทธิภาพ รวมถึงซอฟต์แวร์ที่มีประสิทธิภาพมากขึ้น แต่ก็มีประเด็นที่น่าถกเถียงเหมือนกันว่า ซอฟต์แวร์สมัยใหม่ทำให้แม้แต่คนที่เดิมคงสร้างอะไรไม่ได้เลย สามารถสร้างสิ่ง “แย่ ๆ” ที่ตัวเองต้องการได้ วิศวกรโครงสร้างเลือกสิ่งที่ “แข็งแรงพอ” ฉันใด นักพัฒนาสมัยใหม่ก็มักตั้งเป้าไว้ที่สิ่งที่ “เร็วพอ” ฉันนั้น
มีประเด็นให้ถกเถียงมากมาย แต่บทความนี้หยุดอยู่ที่ความโกรธเชิงอารมณ์ และไม่ได้รับมือกับเหตุผลและการโต้แย้งจริง ๆ บางข้ออ้างมีความจริงอยู่ แต่ตัวบทความเองทำให้เห็นชัดว่าไม่ได้ตั้งใจจะถกเถียง
เครือข่ายก็น่าจะไม่ใช่ 2G ระดับไม่กี่ kbps แต่เป็น 5G หลายร้อย Mbps หรือสายไฟเบอร์เสียมากกว่า สุดท้ายการกระทำดังยิ่งกว่าคำพูด และถ้าสังคมโดยรวมยึดสัจพจน์ว่า “ซอฟต์แวร์ที่เร็วขึ้น” ก็ยอมรับว่าเป็นความจริงได้
โดยเฉพาะเมื่อมันเป็นสัจพจน์ที่มาจากที่เดียวกับข้ออ้างว่า “เวลาของนักพัฒนามีค่ากว่า” ความต่างมีแค่ว่ากำลังประหยัดเวลาของใคร
ถ้านักพัฒนาไม่ทดสอบบน อุปกรณ์สเปกต่ำ ด้วย ก็จะไม่รู้ถึงปัญหานี้เลย ปัญหาจริง ๆ ไม่ได้อยู่ที่ด้านเทคนิคเท่ากับท่าทีของนักพัฒนาบางคนที่ตั้งรับและเริ่มเถียงทันทีเมื่อเจอความจริงที่ไม่สบายใจว่าโค้ดช้าเกินไป ควรไปนั่งกับผู้จัดการผลิตภัณฑ์ จัดเวลาสำหรับ profiling และ optimization แล้วดูว่าจะบรรเทาปัญหาประสิทธิภาพอย่างไรโดยไม่ต้องสร้างใหม่ตั้งแต่ต้น
BASIC กับ SQL ก็มีเจตนามานานแล้วที่จะทำให้ผู้คนสร้างอะไร “แย่ ๆ” ได้ และ Fortran รวมถึงภาษาและเทคโนโลยีจำนวนมากที่หายไปแล้วก็เช่นกัน
Python หรือ Java ถ้าพูดแบบใจดีก็ถือว่าอนุรักษนิยม และถ้าคิดถึงความก้าวหน้าของภาษาโปรแกรมมิงในยุค 70 จริง ๆ ก็ควรเรียกว่าล้าสมัยด้วยซ้ำ J หรือ Prolog ล้ำหน้ากว่า Rust หรือ Go มากในเชิงแนวคิด แต่ถูกสร้างมาก่อน C ที่สะสมมาจาก C89 ถึง C23 เป็นภาษาสมัยใหม่หรือไม่ หรือมีแค่ C23 ที่สมัยใหม่ และระหว่าง C89 กับ C23 มีความต่างใหญ่จริง ๆ หรือไม่ ก็ยังคลุมเครือ
ถ้าไม่ใช่เวลาที่ถูกสร้างขึ้นหรือผังวิวัฒนาการในจินตนาการ ก็สงสัยว่ามีวิธีอื่นในการนิยาม ความสมัยใหม่ หรือเปล่า
เป็นคำบ่นเก่า ๆ ความสะดวกสบายหลายอย่างที่เรามองว่าเป็นเรื่องปกติมีต้นทุน และต้นทุนนั้นสะสมจนใหญ่โต หน้าจอ 4K มีพิกเซลมากกว่า 800x600 ถึง 17 เท่า และใช้สี 32 บิต ดังนั้นขนาดดิบของกราฟิกสำหรับจอแสดงผลสมัยใหม่จึงใหญ่ขึ้นราว 68 เท่า
เมื่อก่อนภาพนิ่งก็เพียงพอแล้ว แต่ตอนนี้แอนิเมชันคุณภาพสูงเฟรมเรตสูงกลายเป็นมาตรฐาน Arial Unicode เป็นฟอนต์ขนาด 15MB และคงไม่สามารถใส่ในหน่วยความจำของคอมพิวเตอร์ส่วนใหญ่ที่รัน Windows 95 ได้ด้วยซ้ำ
การตรวจสะกดทุกที่กลายเป็นเรื่องปกติไปแล้ว และสิ่งเหล่านี้ก็สะสมกัน ถึงอย่างนั้นมันก็ทำให้คอมพิวเตอร์น่าใช้ขึ้นมาก ผมไม่คิดถึงโหมดวิดีโอ 16 สี หรือยุคที่ไม่สามารถใช้ภาษาที่ไม่ใช่ภาษาอังกฤษสองภาษาพร้อมกันได้โดยไม่ต้องใช้ทางอ้อมที่น่าหงุดหงิดมาก ๆ
แต่ไม่ต้องการแอนิเมชันที่มีเหตุผลเพียงเพื่อทำให้เวลารอดูน่าเบื่อน้อยลง Unicode ก็เป็นสิ่งที่คุ้มจ่าย
ถึงอย่างนั้น ก็ควรวาด glyph ลงบนหน้าจอได้ภายในเวลาไม่กี่มิลลิวินาทีเหมือนในปี 1981 พิกเซลและ glyph มีมากขึ้นก็จริง แต่ทำได้ เพียงแค่มันไม่ใช่ลำดับความสำคัญเท่านั้น
คล้ายกับจ่าย 100,000 ดอลลาร์ซื้อ BMW สมรรถนะสูง แล้ววิศวกรบอกว่าเร่ง 0-60mph ใช้เวลา 30 วินาที และผู้ใช้ไม่ใช่ผู้เชี่ยวชาญด้านสมรรถนะก็เลยต้องยอมรับไปตามนั้น
ในองค์กรปัจจุบันก็เคยเห็นกระแสคล้าย ๆ กัน ตอนแรกที่ทีมยังเล็ก รายละเอียดเป็นเรื่องสำคัญ ต้องไม่ช้า แอนิเมชันต้องลื่น ความเร็วในการเลื่อนหน้าและเวลาโหลดสำคัญ และพยายามสร้างผลิตภัณฑ์ที่มีประสิทธิภาพที่สุดเพื่อเพิ่มประสิทธิภาพของผู้ใช้
เมื่อทีมใหญ่ขึ้น ค่านิยมก็เปลี่ยนไปเป็นการเพิ่ม ประสิทธิภาพของนักพัฒนา มี abstraction, layer และ framework มากขึ้น และยอมรับการแลกเปลี่ยนที่ประหยัดเวลานักพัฒนาได้หนึ่งวัน แต่ใช้เวลารวมของผู้ใช้ไปหลายล้านวินาที
ความต่างอยู่ที่การมองเห็น ผู้บริหารมองเห็นต้นทุนฝั่งการพัฒนาได้ แต่ไม่เห็นประโยชน์ของเวลารันที่เร็วขึ้นเล็กน้อย แคชที่ดีขึ้น หรือการเลื่อนหน้าที่ลื่นขึ้น เพราะสิ่งเหล่านี้ไม่ได้ถูกวัด เมื่อองค์กรไปถึงจุดที่สนใจเฉพาะตัวเลขที่วัดได้ กระแสแบบนี้ก็ดูเป็นเรื่องธรรมชาติ
แน่นอนว่านี่คือเรื่องก่อนที่ AI จะไปถึงจุดที่แก้ได้ทั้งหมด ไม่ว่าจะเป็นสิ่งที่เราเขียนผิด สิ่งที่ AI เขียนผิด และแม้แต่ตัว AI เองที่ไร้ประสิทธิภาพอย่างมากตามที่บทความต้นทางคาดการณ์ไว้
รถยนต์ถูกปรับให้เหมาะสมก็ต่อเมื่อเกิดช็อกจากน้ำมันภายนอก และถึงอย่างนั้นก็ยังไม่สม่ำเสมออย่างมาก ในความเป็นจริง ผลิตภัณฑ์ที่ไม่มีประสิทธิภาพมักทำกำไรได้มากกว่า เพราะลูกค้าต้องเปลี่ยนบ่อยกว่า สาย iPhone ห่วย ๆ ที่แตกหลังผ่านไปหนึ่งปีทำให้ Apple เรียกเก็บเงินค่าเปลี่ยนได้ซ้ำแล้วซ้ำเล่า เครื่องใช้ไฟฟ้าสีขาวเสียบ่อยขึ้น แต่ผลิตได้ถูกลง ทำให้กำไรต่อหน่วยสูงขึ้น สิ่งสำคัญไม่ใช่ประสิทธิภาพการใช้งานหลังการขาย แต่คือประสิทธิภาพการผลิต
ในซอฟต์แวร์ ทุนนิยมทำงานด้วยการเทระบบอัตโนมัติใหม่ ๆ ออกมาให้เร็วที่สุด และปล่อยให้ผู้บริโภครับภาระการสูญเสียพลังงานและเวลา ห่วงโซ่การผลิตถูกทำให้เป็นมาตรฐานและปรับแต่งให้เหมาะสมมากขึ้นเรื่อย ๆ จนสามารถสับเปลี่ยนนักพัฒนา React หรือผู้ดูแล Kubernetes ได้เหมือนคนงานคลังสินค้า และเกิดแรงกดดันต่อค่าจ้างตามมา ระบบอัตโนมัติบางส่วนแทบจะเป็นการสร้างเหตุผลให้ตัวเองดำรงอยู่ เช่นทำให้ศัพท์บัญชียากเกินเข้าใจเพื่อให้มีงานรองรับ ส่วนที่เหลือเป็นเรื่องของกำไร
ทุกอย่างมีต้นทุน ถ้าต้นทุนด้านการคำนวณหรือประสบการณ์ผู้ใช้ที่แย่ลงมีขนาดใหญ่พอ ก็จะปรับประสิทธิภาพให้เหมาะสม โมเดล ML เป็นตัวอย่าง ในกรณีอื่นจะไม่ปรับ เพราะผู้ใช้ปลายทางไม่ได้ต้องการมันถึงขั้นยอมรับฟีเจอร์ที่น้อยลง
รถยนต์ในอดีตก็กินน้ำมันมาก แต่เมื่อค่าน้ำมันและความกังวลด้านสิ่งแวดล้อมทำให้ลูกค้าต้องการสิ่งอื่น มันก็เปลี่ยนไป วิศวกรจำนวนมากลืมไปว่าตัวเองได้รับค่าจ้างให้สร้างผลิตภัณฑ์สำหรับลูกค้า
อีกอย่าง ผู้เขียนต้นทางดูเหมือนจะไม่เคยรอให้เครื่อง Windows หรือ Linux รุ่นเก่าบูตจนเสร็จจริง ๆ เวอร์ชันสมัยใหม่บูตได้เร็วกว่ามากเพราะลูกค้าต้องการ โทรศัพท์เปิดอยู่ตลอด 24 ชั่วโมง ดังนั้นการบูตนานสักครั้งทุก ๆ หลายเดือนจึงไม่ใช่เรื่องที่ลูกค้าใส่ใจ
BIOS ของผมใช้เวลา POST ประมาณ 20 วินาที และเขาว่านี่เป็นเรื่องปกติ หลังจากนั้น OS บูตประมาณ 10 วินาที
อาจพูดได้ว่าแพทย์หรือวิศวกรก็ได้รับค่าจ้างให้พัฒนายาใหม่หรือแหล่งพลังงานใหม่ แต่สาขาเหล่านี้อ่อนไหวและสำคัญ จึงมีการควบคุมจากรัฐหลายชั้น ซอฟต์แวร์ยังไม่มีการควบคุมในระดับนั้น
พวกเขามีพลังในการหล่อหลอมสภาพแวดล้อมเอง จึงสามารถเปลี่ยนทิศทางผลลัพธ์ของ “ความต้องการของลูกค้า” ได้อย่างมาก
บทความนี้เขียนในปี 2018 และเคยมีการถกเถียงก่อนหน้านี้อยู่หลายครั้ง
https://news.ycombinator.com/item?id=18012334 (Sep 2018)
https://news.ycombinator.com/item?id=21929709 (Jan 2020)
https://news.ycombinator.com/item?id=31798580 (Jun 2022)
เห็นด้วยอย่างลึกซึ้ง สิ่งสำคัญคือในฐานะนักพัฒนา เราต้องจำไว้ว่าเรามีทางเลือก เราเลือกทุกอย่างไม่ได้ แต่เลือกทางเลือกที่แย่น้อยกว่าได้
ไม่จำเป็นต้องใช้ Node เสมอไป ใน ecosystem ของ .NET หรือ JVM ก็สามารถเขียนซอฟต์แวร์ที่ดีและรองรับย้อนหลังได้ และคาดหวังได้ว่ามันจะยังรันได้โดยไม่ต้องแก้ไขในอีก 10 ปีข้างหน้า
ไม่จำเป็นต้องสร้างเว็บเพจแบบ single-page เสมอไป HTML แบบเก่าที่โหลดทั้งหน้าใหม่ทุกครั้งที่คลิกก็ทำงานได้ดี และ ณ จุดนี้อาจมี latency ต่ำกว่าด้วยซ้ำ
ไม่จำเป็นต้องสร้างแอปเดสก์ท็อปด้วย Chromium เสมอไป การเริ่มใช้ UI framework อาจต้องลงแรงเพิ่มอีกเล็กน้อย แต่คุณภาพก็คุ้มค่า เราไม่ได้มีอำนาจตัดสินใจเสมอไป แต่เมื่อมี ก็ควรถอยออกจากตัวเลือกที่แย่