เช่นเดียวกับคำถามเหล่านี้ฉันคิดว่าคำตอบคือ:
มันขึ้นอยู่กับ
มีเหตุผลที่เชื่อได้ว่าการวางตำแหน่งที่โปรแกรมเมอร์ทุกคนควรรู้รหัสทุกบรรทัดจะเข้าใจผิด
หากเราสมมติว่าสักครู่ว่าคนที่มีความเข้าใจอย่างลึกซึ้งเกี่ยวกับชิ้นส่วนของรหัสจะทำการเปลี่ยนแปลงได้เร็วกว่าคนที่ไม่รู้จักเลย 5 เท่า (ไม่ใช่การก้าวกระโดดของศรัทธาในประสบการณ์ของฉัน) และใช้เวลาประมาณหนึ่งเดือน ของประสบการณ์การเขียนโปรแกรมเพื่อทำความเข้าใจที่ดีจริง ๆ ของโมดูลขนาดใหญ่ (ยังไม่ไร้เหตุผล) จากนั้นเราสามารถเรียกใช้ตัวเลข (ปลอมทั้งหมดและปลอม):
- โปรแกรมเมอร์ A: มีความเข้าใจอย่างลึกซึ้ง
- โปรแกรมเมอร์ B: ไม่มี
ช่วยให้โปรแกรมเมอร์ A ทำงาน 1 หน่วยต่อวัน ใน 4 สัปดาห์ของ 5 วันทำการเขา / เธอสามารถทำงานได้ 20 หน่วย
ดังนั้นโปรแกรมเมอร์ B เริ่มต้นที่ 0.2 หน่วยงานต่อวันและลงท้ายด้วย 0.96 หน่วยของงานในวันที่ 20 ของเขา (ในวันที่ 21 พวกเขาเก่งพอ ๆ กับโปรแกรมเมอร์ A) จะทำงาน 11.6 หน่วยในงานเดียวกัน ระยะเวลา 20 วัน ในช่วงเดือนนั้นโปรแกรมเมอร์ B มีประสิทธิภาพ 58% เมื่อเทียบกับโปรแกรมเมอร์ A อย่างไรก็ตามตอนนี้คุณมีโปรแกรมเมอร์คนอื่นที่รู้จักโมดูลนั้นและเป็นคนแรก
แน่นอนในโครงการขนาดเหมาะสมคุณอาจมี ... 50 โมดูล ดังนั้นการทำความคุ้นเคยกับพวกเขาทั้งหมดจะใช้เวลาประมาณ 4 ปีและนั่นหมายความว่าโดยเฉลี่ยโปรแกรมเมอร์การเรียนรู้ทำงานที่ประสิทธิภาพ 58% เมื่อเทียบกับโปรแกรมเมอร์ A ... hmmm
ลองพิจารณาสถานการณ์นี้: โปรแกรมเมอร์คนเดียวกันโครงการเดียวกัน (A รู้ทุกอย่างและ B ไม่รู้เลย) ให้บอกว่ามี 250 วันทำการในปี สมมติว่าเวิร์กโหลดมีการกระจายแบบสุ่มบนโมดูล 50 โมดูล ถ้าเราแยกโปรแกรมเมอร์ทั้งสองเท่า ๆ กัน A และ B ทั้งคู่จะได้รับ 5 วันทำการในแต่ละโมดูล A สามารถทำงานได้ 5 หน่วยในแต่ละโมดูล แต่ B จะได้รับตามการจำลอง Excel ของฉันเพียงเล็กน้อยเท่านั้น 1.4 งานที่ทำในแต่ละโมดูล รวม (A + B) คือ 6.4 หน่วยงานต่อโมดูล นั่นเป็นเพราะ B ใช้เวลาส่วนใหญ่ของพวกเขาโดยไม่มีทักษะใด ๆ กับโมดูลที่พวกเขากำลังทำงานอยู่
ในสถานการณ์นี้เป็นการดีที่สุดที่จะมุ่งเน้น B ไปที่เซตย่อยของโมดูลที่เล็กลง ถ้า B มุ่งเน้นไปที่เพียง 25 โมดูลพวกเขาจะได้รับ 10 วันในแต่ละคนรวม 3.8 หน่วยงานในแต่ละ โปรแกรมเมอร์ A สามารถใช้เวลา 7 วันต่อวันใน 25 โมดูลที่ B ไม่ทำงานและ 3 วันในการทำงานเดียวกันกับ B. ช่วงผลผลิตรวมอยู่ระหว่าง 6.8 ถึง 7 หน่วยต่อโมดูลเฉลี่ย 6.9 และสูงกว่าอย่างมาก มากกว่า 6.4 หน่วยต่อโมดูลที่เราทำเมื่อ A และ B กระจายการทำงานอย่างสม่ำเสมอ
ในขณะที่เรา จำกัด ขอบเขตของโมดูลที่ B ทำงานอยู่เราก็จะได้ประสิทธิภาพที่มากขึ้น (มากถึงหนึ่งจุด)
การอบรม
ฉันจะเถียงว่าคนที่ไม่รู้มากเกี่ยวกับโมดูลจะขัดจังหวะบุคคลที่ทำอะไรมากกว่าคนที่มีประสบการณ์มากกว่า ดังนั้นตัวเลขข้างต้นไม่ได้พิจารณาว่ายิ่งใช้เวลากับรหัสที่ไม่เข้าใจมากเท่าใดเวลาของ A ก็ยิ่งเพิ่มขึ้นด้วยการถามคำถามและบางครั้ง A ต้องช่วยแก้ไขหรือแก้ไขสิ่งที่ B ทำ การฝึกอบรมบางคนเป็นกิจกรรมที่ใช้เวลานาน
ทางออกที่ดีที่สุด
นั่นเป็นเหตุผลที่ฉันคิดว่าวิธีแก้ปัญหาที่ดีที่สุดต้องเป็นไปตามคำถามเช่น:
- ทีมของคุณใหญ่แค่ไหน? มันสมเหตุสมผลหรือไม่ที่จะให้ทุกคนได้รับการฝึกฝนในทุกส่วนหรือถ้าเรามีทีม 10 คนเราจะแน่ใจได้หรือไม่ว่าแต่ละโมดูลนั้นเป็นที่รู้จักกันอย่างน้อย 3 คน? (ด้วย 10 โปรแกรมเมอร์และ 50 โมดูลแต่ละโปรแกรมเมอร์จะต้องรู้ 15 โมดูลเพื่อให้ครอบคลุม 3x)
- การหมุนเวียนพนักงานของคุณเป็นอย่างไร หากคุณเปลี่ยนพนักงานโดยเฉลี่ยทุก ๆ 3 ปีและใช้เวลานานกว่านั้นในการรู้ทุกซอกทุกมุมของระบบพวกเขาจะไม่ได้อยู่ที่การฝึกอบรมเพื่อชำระคืน
- คุณต้องการผู้เชี่ยวชาญเพื่อวินิจฉัยปัญหาหรือไม่? ผู้คนจำนวนมากใช้ข้ออ้างว่า "จะเป็นอย่างไรถ้าคน ๆ นั้นไปพักผ่อน" แต่ฉันถูกเรียกมาหลายครั้งเพื่อวินิจฉัยปัญหาในระบบที่ฉันไม่เคยมีประสบการณ์มาก่อน อาจเป็นเรื่องจริงที่คนที่มีประสบการณ์สามารถค้นหาได้เร็วขึ้นมาก แต่ไม่ได้หมายความว่าคุณจะไม่สามารถอยู่ได้โดยปราศจากพวกเขาเป็นเวลาหนึ่งหรือสองสัปดาห์ ระบบซอฟต์แวร์ไม่กี่แห่งจึงมีภารกิจสำคัญที่จะต้องวินิจฉัยปัญหาใน 1 ชั่วโมงแทนที่จะเป็น 5 ชั่วโมงมิเช่นนั้นโลกจะสิ้นสุดลง คุณต้องชั่งน้ำหนักความเสี่ยงเหล่านี้
นั่นเป็นเหตุผลที่ฉันคิดว่า "มันขึ้นอยู่กับ" คุณไม่ต้องการแยก 20 โมดูลระหว่างโปรแกรมเมอร์สองตัวที่อยู่ตรงกลาง (10 หน่วย) เพราะคุณไม่มีความยืดหยุ่น แต่คุณไม่ต้องการที่จะฝึกอบรมโปรแกรมเมอร์ 10 ตัวในโมดูลทั้ง 50 เพราะคุณสูญเสียจำนวนมาก ประสิทธิภาพและคุณไม่ต้องการความซ้ำซ้อนมากนัก