ต้นทุนที่ YAGNI ไม่เคยพูดถึง
(newsletter.kentbeck.com)- YAGNI ไม่ใช่กฎประหยัดง่าย ๆ ที่บอกว่า “อย่าเขียนโค้ดที่ยังไม่จำเป็น” แต่เป็นหลักการที่พูดถึงต้นทุนของการ ยึดโครงสร้างไว้ล่วงหน้าจากการคาดเดา ก่อนที่ความต้องการจะได้รับการยืนยัน
- แก่นของปัญหาไม่ใช่ตัวการออกแบบเอง แต่คือ ควรออกแบบเมื่อไร และการจัดโครงสร้างเร็วเกินไปก็อาจเสี่ยงพอ ๆ กับการจัดโครงสร้างช้าเกินไป
- โครงสร้างที่ทำไว้ล่วงหน้าสร้างทั้ง ต้นทุนของทางเลือก จากการปิดตัวเลือกก่อนที่ข้อมูลจะมาถึง และ ต้นทุน NPV จากการดึงต้นทุนมาไว้ข้างหน้าและเลื่อนผลตอบแทนออกไป
- ต่อให้ต้นทุนการสร้างโค้ดลดลงจนแทบเป็นศูนย์ YAGNI ก็ไม่ได้หายไป กลับกัน การสร้างที่ราคาถูกอาจทำให้สร้าง framework ที่อิงการคาดเดา ได้ง่ายขึ้น
- ข้อสรุปที่ว่าให้สร้างเมื่อจำเป็น ไม่ได้มาจากต้นทุนการเขียนโค้ด แต่เพราะคุณค่าของ ทางเลือก ที่ยังไม่ใช้ และ เงิน ที่ยังไม่จ่าย ยังคงมีอยู่
YAGNI ไม่ได้ห้ามการออกแบบ
- YAGNI ย่อมาจาก “You Aren’t Gonna Need It” และไม่ใช่ข้ออ้างว่าจะต้องไม่ออกแบบสิ่งที่ยังไม่จำเป็นโดยเด็ดขาด
- ถ้าจำเป็นก็สร้างได้ แต่ประเด็นสำคัญคือ จังหวะเวลา
- จุดตั้งต้นมาจากเรื่องเล่าว่า ระหว่างทำโปรเจกต์ เมื่อมีสถานการณ์แบบ “อีก 3 สัปดาห์ implementation แบบง่ายคงไม่พอ งั้นอยากทำอะไรที่ซับซ้อนกว่านี้ตั้งแต่ตอนนี้” ก็จะมีคำตอบกลับมาซ้ำ ๆ ว่า “You aren’t going to need it”
- หลักการนี้มองว่าทั้งการสร้างโครงสร้างเร็วเกินไปและช้าเกินไปต่างก็มีความเสี่ยง
ปัญหาไม่ใช่ต้นทุนการเขียนโค้ด แต่คือโครงสร้างที่ตั้งอยู่บนการคาดเดา
- การตีความที่พบบ่อยคือมอง YAGNI เป็น กฎประหยัด แบบ “โค้ดที่ยังไม่จำเป็นมีราคาแพง จึงไม่ควรเขียน”
- แต่สิ่งที่ YAGNI มุ่งเป้าไม่ใช่ต้นทุนการผลิตโค้ด หากเป็น โครงสร้างเชิงคาดการณ์ (speculative structure) ที่สร้างไว้ล่วงหน้าก่อนที่ฟีเจอร์จริงจะต้องการมัน
- โครงสร้างแบบนี้ก่อให้เกิดต้นทุนอยู่ 2 ประเภท ด้วยจังหวะเวลาและเหตุผลที่ต่างกัน
ต้นทุนประเภทแรก: ทางเลือก
- เมื่อสร้างโครงสร้างก่อนที่ฟีเจอร์จะมาถึง เรากำลัง commit จากการคาดเดา ต่อความต้องการที่เรายังไม่รู้
- ฟีเจอร์ที่เตรียมเผื่อไว้มักไม่เหมือนกับฟีเจอร์ที่มาถึงจริง ส่งผลให้ต้องจ่ายต้นทุนสองรอบ
- ต้นทุนในการอ้อมข้อจำกัดของโครงสร้างที่มีรูปทรงไม่ถูกต้อง
- ต้นทุนในการรื้อโครงสร้างนั้นออกแล้วทำใหม่
- ปัญหานี้ไม่ได้จบแค่คำว่า “การคาดเดาทำได้ยาก”
- ต่อให้คาดเดาถูก ก็ยังเสียประโยชน์อยู่ดี เพราะเราสูญเสีย ทางเลือก ที่จะไม่ commit ล่วงหน้าและไปรอสร้างโครงสร้างที่ถูกต้องในภายหลัง
- การรอไม่ใช่ความขี้เกียจ แต่คือการถือครองสินทรัพย์ที่เรียกว่า ทางเลือก
ต้นทุนประเภทที่สอง: NPV
- เช่นเดียวกับที่เงินมีมูลค่าตามเวลา ฟีเจอร์ก็มี มูลค่าตามเวลา เช่นกัน
- ถ้าสร้างโครงสร้างตอนนี้เพื่อรองรับฟีเจอร์ที่ต้องใช้ในอีก 3 เดือน ต้นทุนจะถูกดึงมาเกิดก่อน ขณะที่การปล่อยฟีเจอร์ที่สร้างรายได้จริงจะยิ่งช้าลง
- ต้นทุนนี้เกิดขึ้นได้แม้จะคาดเดาถูก
- ต่อให้คาดการณ์ได้สมบูรณ์แบบ ก็ไม่อาจเปลี่ยนลำดับของต้นทุนและผลตอบแทนได้ และความสูญเสียเกิดจากช่วงห่างที่วางต้นทุนไว้ก่อนรายได้
- ต้นทุนของทางเลือกคือปัญหาประเภท “อย่า commit ก่อนที่ข้อมูลจะมาถึง” ส่วนต้นทุน NPV คือปัญหาประเภท “อย่าจ่ายก่อนที่จะจำเป็น”
- แม้จะมีข้อโต้แย้งว่า “ถ้าค่อยกลับมาแก้ทีหลังจะแพงเกินไป” การปรับแก้ที่แพงนั้นเองก็อาจเป็น การคาดการณ์ อีกรูปแบบหนึ่ง
ต่อให้การสร้างโค้ดถูกลง YAGNI ก็ยังอยู่
- ในต้นทุนทั้งสองประเภทนี้ ไม่มีข้อไหนรวม ต้นทุนของการพิมพ์โค้ด เอาไว้
- ถ้าต้นทุนการเขียนโค้ดลดลงจนแทบเป็นศูนย์ การตีความ YAGNI แบบกฎประหยัดที่ว่า “โค้ดถูกลงแล้ว งั้นสร้างเผื่อไว้ก่อนก็ได้สิ” ก็จะพังทลาย
- แต่เพราะ YAGNI ไม่ใช่กฎประหยัด การสร้างโค้ดราคาถูกจึงไม่ได้ทำให้ YAGNI ใช้ไม่ได้
- ต้นทุนของทางเลือกไม่ได้เกิดจากปริมาณแรงงาน แต่เกิดจาก การ commit ที่ปิดทางเลือกในอนาคต
- ต้นทุน NPV ไม่ได้เกิดจากราคาการผลิต แต่เกิดจาก จังหวะเวลา ของกระแสเงินสด
- การสร้างได้ฟรีไม่ได้ทำให้ YAGNI อ่อนแรงลง ตรงกันข้าม มันอาจยิ่งทำให้สร้าง framework ที่อิงการคาดเดาได้ง่ายขึ้น
- โครงสร้างที่ถูกสร้างขึ้นยังคงสร้างต้นทุนทั้งสองแบบอยู่ และเพราะไม่ได้ลงมือเขียนเอง ความเข้าใจต่อมันอาจยิ่งต่ำลง
- ข้อสรุปจึงไม่ใช่ “รอเพราะโค้ดแพง” แต่คือ สร้างเมื่อจำเป็น เพราะทางเลือกและเงินจะมีค่ามากกว่าเมื่อยังไม่ถูกใช้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มองว่า ต้นทุนในการเปลี่ยนโครงสร้าง ก็ลดลงเช่นกัน
ด้วย AI ต้นทุนในการเสริมการทำงานด้วยเทสต์ก่อนเปลี่ยนโครงสร้างลดลง และต้นทุนในการทำ migration แบบไม่มี downtime ก็ลดลงด้วย
หนึ่งในเหตุผลสำคัญที่ Rust ได้รับความสนใจตั้งแต่ก่อนยุค AI ก็คือต้นทุนในการเปลี่ยนโครงสร้างภายในแอปพลิเคชันต่ำ และตอนนี้ก็ยิ่งเป็นเช่นนั้น
ค่าเสียโอกาสจากการไม่สามารถเปลี่ยนโครงสร้างได้อย่างปลอดภัยเพิ่มขึ้นมาก และตอนนี้จึงปรับให้ความสามารถในการเปลี่ยนส่วนใหญ่ของโค้ดและผลิตภัณฑ์ได้อย่างรวดเร็วและปลอดภัยเป็นสิ่งสำคัญที่สุด
เพียงแต่ก่อนยุค AI การเปลี่ยนโครงสร้างใช้เวลานานกว่ามาก ดังนั้นอาจมองได้ว่าคุณค่าของสิ่งที่กำลังพยายาม optimize ในตอนนี้กลับลดลงก็ได้
ยังมีคุณค่าอยู่ แต่บางทีอาจน้อยกว่าเมื่อก่อนเล็กน้อย
เมื่อ เทสต์ที่ AI สร้างซึ่งเปราะบาง เพิ่มขึ้น ต้นทุนในการเปลี่ยนโครงสร้างจึงสูงกว่าเดิม
การจัดระเบียบชุดเทสต์ให้ตรวจสอบแก่นของปัญหา ไม่ใช่ตรวจสอบการตัดสินใจเชิงออกแบบที่เกิดขึ้นโดยบังเอิญ ยังเป็นสิ่งที่ AI ทำได้ไม่ดี
แต่ถ้าไม่ทำแบบนั้น การได้ ชุดเทสต์ที่เปราะบาง ซึ่งสุกงอมแค่ราว 75% ก็ง่ายเกินไป
หลายคนพอใจโดยมองว่าการเปลี่ยนจาก “เทสต์ธรรมดาและเปราะบางไม่กี่ตัวที่คนเขียน” ไปเป็น “เทสต์ธรรมดาและเปราะบางจำนวนมากที่ AI เขียน” คือการปรับปรุงอย่างเป็นรูปธรรม
เห็นด้วยอย่างยิ่งว่าควรใช้เครื่องมือในลักษณะนี้ แต่จึงยังบอกได้ยากว่าไม่ต้องกังวลกับการสร้างปราสาทลอยฟ้าที่ผิดพลาดเร็วเกินไป
สัญญาของเทสต์ที่สมบูรณ์แบบและทนต่อการ refactoring ยังออกแบบได้ค่อนข้างยากอยู่ดี
ของเก่ากลับมาเหมือนเป็นของใหม่อีกครั้ง
ตั้งแต่ประสิทธิภาพด้าน context ของแนวทางอย่าง DDD หรือ Clean Architecture ไปจนถึงประเด็นเหล่านี้ AI ไม่ได้สร้าง trade-off ใหม่ แต่ทำงานเหมือน เครื่องขยายสัญญาณ
มันเพิ่ม productivity ของทีมที่ทำอย่างถูกต้อง และเพิ่มหนี้ของทีมที่มีมาตรฐานด้านคุณภาพการออกแบบและสถาปัตยกรรมต่ำด้วย
สิ่งที่ได้มาก็มีแค่ไม่ต้องคิดให้ลึกเท่านั้น
การคิดให้ลึกไม่ได้ใช้เวลาหรือความพยายามมากขนาดนั้น ดังนั้นจะถูกคนที่ใช้ AI แบบเดียวกันแต่คิดมากพอไม่ให้กลายเป็นการคลำทางสะเปะสะปะทิ้งห่างไป
Kent Beck เปรียบโค้ดที่ยังไม่ได้เขียนกับ financial option ที่ซื้อได้ในราคาหนึ่ง
แต่นั่นก็เป็นเพียงคำเปรียบเทียบ และถ้าลากไปไกลเกินก็จะเริ่มแปลก
ถ้ายังไม่ได้เขียนโค้ดเลย ตัวเลือกจะไม่มีที่สิ้นสุดหรือ? แม้ยังไม่ได้ใช้เวลา ก็ดูไม่น่าจะถูก
มันอาจกลายเป็นเหตุผลให้ค้างอยู่ในขั้นวางแผนและเลื่อนการเขียนโค้ดออกไปไม่มีกำหนด เพื่อไม่ต้องตัดสินใจอะไรเลย
อย่างไรก็ดี หากคำเปรียบนี้ใช้ได้ ต้นทุนอาจอยู่ที่การอ่านโค้ด
โค้ดที่ไม่ได้เขียนก็ไม่จำเป็นต้องอ่าน และถ้าใช้ coding agent ก็ไม่ทำให้ context รกด้วยรายละเอียดที่ไม่เกี่ยวข้อง
โค้ดที่ยังไม่ได้เขียนก็ไม่ต้องทดสอบ และเทสต์ที่ยังไม่ได้เขียนก็ไม่กินเวลาในการรัน
ดังนั้นจึงควรรักษาโปรเจกต์ให้เล็กที่สุดเท่าที่ทำได้ และการเลื่อนฟีเจอร์ออกไปจะช่วยชะลอการเติบโตของ codebase ได้มากที่สุด
นั่นยังหมายความว่าการรันโค้ดของคนอื่นช่วยหลีกเลี่ยงต้นทุนได้มากมาย
หากใช้ API มาตรฐานได้ ก็ไม่จำเป็นต้องเข้าใจ implementation อย่างละเอียดหรือรันเทสต์ของมัน แต่การเพิ่ม dependency ก็มีความเสี่ยง
โค้ดที่ไม่ได้เขียน ไม่มีคุณค่า
เพื่อให้โค้ดที่เขียนในวันนี้สร้างคุณค่าได้ มันต้องแก้คำขอหรือ issue ของวันนี้ หรือเอนเอียงไปทางทำให้บางอย่างในวันพรุ่งนี้ง่ายขึ้น
หากก่อหนี้ทางเทคนิคด้วยวิธีแก้แบบ hacky หรือเสียเวลากับสิ่งที่ขัดกับ YAGNI ก็ไม่ได้สร้างคุณค่า
สิ่งสำคัญไม่ใช่โค้ดที่ไม่ได้เขียน แต่เป็นโค้ดที่จะเขียนต่อจากนี้และจุดประสงค์ของมัน
ต้องประนีประนอมให้ถูกต้องระหว่างการแก้ ticket/สิ่งที่ต้องทำของวันนี้ กับการไม่ยิงเท้าตัวเองในอนาคต
การเขียนโค้ดคือ คำมั่นสัญญา และคุณค่าของวันนี้มองเห็นได้ แต่คุณค่าของวันพรุ่งนี้ใกล้เคียงกับการคาดประมาณ
ถึงอย่างนั้น ต้นทุนที่ต้องจ่ายภายหลังก็มีอยู่เสมอ จึงต้องคาดเดาว่าอะไรจะจำเป็นเพื่อพยายามลดต้นทุนให้น้อยที่สุด
คิดว่าไม่ได้เน้น best practices ในยุค AI มากพอ แต่มีส่วนหนึ่งที่ Kent พลาดไปจริง ๆ
การค้นหาให้เร็วขึ้นว่าฟีเจอร์ที่จำเป็นคืออะไรมีคุณค่ามาก
การสร้างโครงสร้างเชิงคาดเดาอาจเป็นกลไกบังคับให้ requirement ชัดเจนขึ้น และอย่างน้อยก็เริ่มเผยให้เห็นรูปแบบความล้มเหลว
เพราะอาจแพงกว่าการรอ จึงไม่ควรทำแบบนั้นกับ requirement ส่วนใหญ่ แต่บางครั้งอาจเป็นทางเลือกที่ดีที่สุด
ต้นทุนในการสร้างสิ่งที่ผิดลดลงมากแล้ว ดังนั้นการคำนวณเกี่ยวกับ YAGNI ก็เปลี่ยนไป
แต่ก็ยังต้องคำนวณอยู่ดี และตอนนี้แต่ละทีมต้องหาคำตอบเองว่าสำหรับพวกเขามันเปลี่ยนไปอย่างไร
ถ้าไม่ทิ้ง มันก็จะกลายเป็นกลไกบังคับให้ได้ผลลัพธ์ที่เละเทะ
YAGNI คือปัญหาของการสร้างสิ่งที่ไม่ได้อยู่ใน requirement ปัจจุบัน เพราะคาดว่า requirement จะเปลี่ยนในภายหลัง
มันต่างจากการทำให้ requirement และข้อจำกัดปัจจุบันเป็นรูปธรรม
สิ่งเหล่านั้นส่วนใหญ่มาจากการสนทนากับ stakeholder·ผู้ใช้·ลูกค้า ทรัพยากร ข้อจำกัดทางวิศวกรรม และขีดความสามารถ
prototype มีคุณค่าเมื่อคุยกับ stakeholder สร้างโมเดลการจัดการโปรเจกต์ หรือทำการวิจัยทางวิศวกรรม
นอกเหนือจากนั้นคือการกลับเหตุและผล
แนวทางที่มองซอฟต์แวร์ที่กำลังรันอยู่เป็น สินทรัพย์ นั้นถูกต้อง
เพียงแต่ต้นทุนในการรันและสร้างใหม่ลดลงอย่างมาก
ต้นทุนที่ไม่ได้ลดลงคือค่าใช้จ่ายในการทำลาย ห่วงโซ่ความเชื่อมั่น ต่อผลลัพธ์ที่คาดการณ์ได้
ซอฟต์แวร์เวอร์ชันหนึ่งที่กำลังรันอยู่ได้สะสมความเชื่อมั่นมาแล้ว และถ้าเขียนใหม่ตั้งแต่ต้น ทุนส่วนนั้นจะถูกรีเซ็ตเมื่อ release
เมื่อถึงจุดหนึ่ง ความคิดก็เปลี่ยนไป
เลื่อนสิ่งที่เป็นรูปธรรมออกไปด้วย YAGNI และเขียน เวอร์ชันที่เป็นนามธรรม ให้มากที่สุดเท่าที่ทำได้
จะสร้าง UserStore ดีไหม? นั่นดูเหมือนจะเรียบง่ายที่สุด แต่เราอาจไม่จำเป็นต้องมีรูปแบบเฉพาะอย่าง User ก็ได้
ดังนั้นจึงสร้าง Store ที่เก็บอะไรก็ได้ที่สามารถจัดเก็บได้
ถ้าไม่คุ้นเคย มันอาจดูเหมือนการออกแบบเกินจำเป็นและ เต็มไปด้วย generic แต่กลับกัน มันเป็นวิธีที่ให้คำมั่นกับการใช้งานจริงแบบใดแบบหนึ่งน้อยที่สุด
ไม่ใช่แค่สร้างอินเทอร์เฟซ UserStore ที่อาจไม่จำเป็นเท่านั้น แต่ยังสร้าง abstraction ของ Store แบบทั่วไปที่แน่นอนว่าไม่จำเป็นขึ้นมาอีกด้วย
เท่ากับว่าเพื่อไม่ให้ผูกมัดกับการใช้งานจริงแบบใดแบบหนึ่ง ก็ไปสร้างเลเยอร์เหนียว ๆ ที่ไม่จำเป็นและมีแนวโน้มสูงว่าจะไม่จำเป็นต่อไป
ถ้าเป็น abstraction ที่ไม่ได้ตั้งอยู่บนความต้องการจริง ต่อให้ภายหลังจำเป็นขึ้นมา ก็มีโอกาสสูงมากว่าจะสร้างไว้ผิดทาง
สุดท้าย UserStore ก็จำเป็นอยู่ดี ดังนั้นควรสร้างมันก่อน
ไม่เห็นด้วยกับประโยคที่ว่า “นี่ไม่ใช่ข้ออ้างว่าการคาดการณ์นั้นยาก ในทำนองว่าถ้าเป็นสถาปนิกที่เฉียบคมกว่านี้ก็หลีกเลี่ยงได้”
ข้ออ้างนี้จะ成立ได้ก็ต่อเมื่อตั้งอยู่บนสมมติฐานว่า การคาดการณ์นั้นยาก
ถ้าปูพื้นล่วงหน้าสำหรับฟีเจอร์ที่มีโอกาสสูงมากไว้ก่อน แล้วทุกอย่างลงตัว ก็ปล่อยของได้เร็วขึ้น
ไม่มีอะไรรับประกันว่าทีมจะต้องโตขึ้นหรือจำนวนคนจะคงเดิม ดังนั้นการเฉลิมฉลองความยับยั้งชั่งใจจึงรู้สึกแย่กว่าการลนลานทำให้ตรงกับ YAGNI ก่อนเดดไลน์
ไม่นานมานี้ต้องแยกตัวออกจากโค้ดเบสที่สะสม YAGNI ไว้เต็มไปหมดในเชิงฟังก์ชัน และแม้จะมีเอเจนต์ก็ยังเป็น งานมหึมา
ในระบบแบบกระจาย เราจะรู้ได้อย่างไรว่าอะไรยังถูกใช้งานจริง? มีทั้งสิ่งที่ผมพลาดและสิ่งที่เอเจนต์พลาด และทั้งหมดใช้เวลานานเกินจำเป็น
นี่ไม่ใช่แค่การพอร์ตแบบ 1:1 ธรรมดา แต่ใช้เป็นโอกาสในการทำให้เรียบง่ายลงด้วย จึงต้องเข้าใจอย่างถ่องแท้ว่าระบบเดิมทำงานอย่างไร
สิ่งที่จริง ๆ แล้วไม่ได้ถูกใช้งานเลย หากระบุไม่ได้ว่าเป็นเช่นนั้น ก็ยังต้องรวมอยู่ในขอบเขตที่ต้องทำความเข้าใจ
สุดท้ายผมมองว่ามันลงเอยที่การสำรวจปัญหาและการนำวิธีแก้ไปใช้งาน
การแก้ปัญหาผิดย่อมมีต้นทุนเสมอ และการนำวิธีแก้ที่แย่ไปใช้กับสิ่งที่ไม่จำเป็นก็มีต้นทุนเช่นกัน
บางครั้งการพัฒนาซอฟต์แวร์อาจไหลไปเป็นแค่ การลองผิดลองถูก แทนที่จะคิดถึงกลยุทธ์และชุดปัญหาที่ควรสำรวจ
มีบางกรณีที่การสำรวจปัญหาไปในทิศทางใดทิศทางหนึ่งให้ลึกกว่าที่จำเป็นช่วยได้ในระยะยาว แต่การนำวิธีแก้ไปใช้โดยไร้จุดหมายนั้นไม่เคยเป็นเรื่องดี
ผมคิดว่าสิ่งที่ Kent Beck วิจารณ์จริง ๆ คือท่าทีแบบ “เผื่อไว้ก่อน” ที่ลงมือทำบางอย่างเพียงเพราะอนาคตอาจต้องใช้
เขาบอกว่า “ถ้าสร้างโครงสร้างก่อนฟีเจอร์จะมาถึง ก็เท่ากับให้คำมั่นกับการคาดเดา” แต่ผมคิดว่าไม่ว่าทางไหนก็มี การคาดเดา ทั้งนั้น
ฟีเจอร์อาจมีโอกาสมาสูง แต่ก็ไม่แน่นอน
ถ้าไม่สร้างโครงสร้างตอนนี้ ก็มีต้นทุนการรีแฟกเตอร์ ถ้าสร้างเร็วเกินไปแล้วฟีเจอร์ไม่มา ก็เสียแรงเปล่า
ต้นทุน ความน่าจะเป็น และการประนีประนอมระหว่างความเป็นไปได้เหล่านั้นคืออะไร? แน่นอนว่าย่อมขึ้นอยู่กับสถานการณ์
YAGNI ทั้งหมดเองก็เป็นการเหมารวมขนาดใหญ่โดยเจตนา
สุดท้ายก็ขึ้นอยู่กับบริบท
ไม่ว่าทางไหนก็มักเต็มไปด้วยการคาดเดาและคำอธิบายแบบกว้าง ๆ และเป็นปัญหาแบบเดียวกับการประเมินงานให้น่าเชื่อถือ
นักพัฒนาบางคนที่รับมือกับโลกที่ไม่แน่นอนได้ไม่ดี มักพยายามหากฎขาวดำให้กับทุกเรื่อง
https://www.sebastiansylvan.com/post/the-perils-of-future-co...
สรุปคือเข้าข้าง YAGNI
ผมไม่เคยเห็นอะไรในงานเขียนของ Kent Beck ที่น่าจะเป็นประโยชน์ต่อ บริษัทชิป
ในบริษัทชิป คนจำนวนมากต้องทำงานเป็นเวลานาน ลูกค้าจะไม่เห็นอะไรเลยจนกว่าจะเสร็จ และถ้าจะทำเงินได้ก็ต้องขายในระดับหลายล้านชิ้น
ฮาร์ดแวร์มีข้อจำกัดหนัก
เหตุผลที่ซอฟต์แวร์ถูกประดิษฐ์ขึ้นมาตั้งแต่แรกก็เพื่อหลุดพ้นจากข้อจำกัดแบบนั้นนี่เอง
จริงอยู่ว่าบริษัทชิปหลายแห่งไม่แชร์งานที่กำลังทำอยู่ แต่การแชร์ซิมูเลชัน โปรโตไทป์ และตัวอย่างวิศวกรรมเป็นสิ่งที่ทำได้และเกิดขึ้นจริง
แน่นอนว่าโดยทั่วไปต้องเป็นลูกค้ารายใหญ่
ข้อสังเกตจากอุตสาหกรรมที่ต้นทุนการเปลี่ยนแปลงค่อนข้างต่ำ ไม่ได้เอาไปใช้กับอุตสาหกรรมที่ต้นทุนการเปลี่ยนแปลงสูงได้ง่าย ๆ และในทางกลับกันก็มักเป็นเช่นเดียวกัน
บริษัทชิปวางแผนโปรเจกต์แบบนั้นกันอย่างไร? ใช้ Agile, Waterfall หรือเฟรมเวิร์กอื่นที่ต่างจากวงการซอฟต์แวร์?