คำถามนี้มีคำถามสองข้อจริง ๆ ซึ่งต้องแยกต่างหาก:
ทำไมบางทีมมีกระบวนการพัฒนาที่เข้มงวด?
คำตอบง่ายๆก็คือถ้าพวกเขาไม่ทำผิดก็เกิดขึ้น ข้อผิดพลาดราคาแพง สิ่งนี้เป็นจริงสำหรับการพัฒนาและเป็นจริงสำหรับส่วนที่เหลือของฟิลด์ไอทีเช่นกัน (sysadmins, DBAs ฯลฯ )
นี่เป็นเรื่องยากมากสำหรับนักพัฒนาและพนักงานไอทีที่จะเข้าใจเพราะพวกเราส่วนใหญ่เคยทำงานใน "สุดขั้ว" - บริษัท ใหญ่ที่มีสไตล์ฟอร์จูนอย่างน้อยหนึ่งโหลนักพัฒนาและกระบวนการที่เข้มงวดในการติดตามหรือ ขนาดเล็ก, micro-ISV หรือแม้กระทั่งงานอิสระที่ผู้คนไม่พลาดอย่างรุนแรงหรือค่าใช้จ่ายในการสกรูต่ำ
แต่ถ้าคุณเคยเห็น บริษัท ใดอยู่ระหว่างขั้นตอนเหล่านี้ - แม้กระทั่ง บริษัท ที่มีพนักงานไอทีที่เก่งและมีความสามารถ - คุณจะเข้าใจถึงอันตรายของการไม่มีกระบวนการหรือกระบวนการแบบครึ่งทาง คุณจะเห็นการสื่อสารระหว่างพนักงานทนทุกข์ทรมานจากการระเบิด Combinatorialปัญหา เมื่อคุณไปถึงระดับผู้พัฒนาประมาณ 6-10 คนในทีมเดียวสาเหตุหลักของข้อบกพร่องที่สำคัญหรือสำคัญคือการขาดความสามารถหรือความรู้ แต่ขาดการสื่อสาร
อลิซถามเมื่อเช้าวันจันทร์และตัดสินใจว่าจะทำการผ่าตัดแบบใหม่ในลำตัวเพราะไม่มีใครทำงานในส่วนนี้ บ็อบมาถึงหนึ่งชั่วโมงหลังจากนั้นกลับจากวันหยุดของเขาและเต็มไปด้วยพลังงานและตัดสินใจว่าเขาจะใช้คุณสมบัติที่สำคัญใหม่ในพื้นที่เดียวกันนั้นและทำไมต้องกังวลกับสาขาเพราะไม่มีใครแตะรหัสนั้น อลิซจ่ายเงินให้กับ "หนี้ทางเทคนิค" บ็อบใช้คุณสมบัตินักฆ่าของเขาที่อยู่ในเครื่องเผาไหม้เป็นเวลา 6 เดือนและเมื่อพวกเขาทั้งคู่ตรวจสอบรหัสของพวกเขา (ทันทีก่อนปิดเวลาในวันศุกร์แน่นอน) ทีมต้องอยู่ข้างหลังและพยายามทำงานผ่านนรกแห่งความขัดแย้งที่น่าหวาดเสียวซึ่งยังคงดำเนินต่อไปในฐานะแมลงและการถดถอยในสองสามสัปดาห์ข้างหน้า
อลิซและบ็อบทั้งคู่ทำงานได้ดีในงานเขียนโค้ด แต่พวกเขาทั้งคู่เริ่มต้นด้วยการตัดสินใจที่ไม่ดี หัวหน้าทีมหรือผู้จัดการโครงการนำพวกเขาผ่านการชันสูตรศพและทุบรายการตรวจสอบเพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้นอีก:
- เช็คอินจะต้องทุกวันเพื่อลดผลกระทบของความขัดแย้ง;
- การเปลี่ยนแปลงที่จะใช้เวลามากกว่า 1 วันจะต้องกระทำในสาขา
- งานที่สำคัญทั้งหมด (รวมถึงงานที่ไม่ใช่คุณสมบัติเช่นการเปลี่ยนโครงสร้างใหม่) ต้องได้รับการติดตามและกำหนดอย่างถูกต้องในตัวติดตามบั๊ก
ฉันจะเดิมพันนั้นสำหรับพวกเราหลายคน "กระบวนการ" นี้ดูเหมือนเป็นเรื่องธรรมดา มันเป็นหมวกเก่า แต่คุณรู้ไหมว่าทีมเล็ก ๆ จำนวนมากไม่ทำเช่นนี้? ทีมสองคนอาจไม่สนใจกับการควบคุมแหล่งข้อมูลเลย ใครสน? มันไม่จำเป็นโดยสุจริต ปัญหาเริ่มเกิดขึ้นเมื่อทีมเติบโตขึ้น แต่กระบวนการไม่ได้เกิดขึ้น
แน่นอนการเพิ่มประสิทธิภาพของกระบวนการเป็นเหมือนการเพิ่มประสิทธิภาพ มันเป็นไปตามเส้นโค้งแบบยกกำลังผกผัน รายการตรวจสอบข้างต้นอาจกำจัดข้อบกพร่อง 80% แต่หลังจากที่คุณใช้งานคุณจะพบว่ามีบางสิ่งที่บัญชี80% ของข้อบกพร่องที่เหลืออยู่ ในตัวอย่างสมมติของเราที่คุ้นเคย แต่อาจเกิดข้อผิดพลาดในการสร้างเนื่องจากมีสภาพแวดล้อมการสร้างที่แตกต่างกันซึ่งสืบเนื่องมาจากความจริงที่ว่าไม่มีฮาร์ดแวร์มาตรฐานและนักพัฒนาใช้ไลบรารีโอเพ่นซอร์สซึ่งได้รับการปรับปรุงทุก 2 สัปดาห์
ดังนั้นคุณมีตัวเลือกสามตัวเลือก: (a) สร้างมาตรฐานฮาร์ดแวร์และ จำกัด การใช้งานไลบรารีของบุคคลที่สามอย่างรุนแรงซึ่งมีค่าใช้จ่ายสูงและอาจกระทบต่อประสิทธิภาพการผลิตอย่างมากหรือ (b) ตั้งค่าเซิร์ฟเวอร์สร้างซึ่งต้องใช้ความร่วมมือจากกลุ่มดูแลระบบ นักพัฒนาเต็มเวลาเพื่อรักษามันหรือ (c) ให้นักพัฒนาทำเองด้วยการแจกจ่ายเครื่องเสมือนมาตรฐานและบอกให้นักพัฒนาสร้างต่อไป ชัดเจน (b) เป็นทางออกระยะยาวที่ดีที่สุด แต่ (c) มีความสมดุลของความน่าเชื่อถือและความรวดเร็วในระยะสั้นที่ดีกว่า
รอบต่อไปเรื่อย ๆ "นโยบาย" ทุกครั้งที่คุณเห็นมักได้รับการจัดตั้งขึ้นเพื่อแก้ไขปัญหาจริง ดังที่ Joel Spolsky เขียนมาตั้งแต่ปี 2000 (ในหัวข้อที่แตกต่างไปจากเดิมอย่างสิ้นเชิง แต่เป็นประเด็นที่เกี่ยวข้อง):
เมื่อคุณเข้าไปในร้านอาหารและคุณเห็นป้ายบอกว่า "ไม่อนุญาตให้เลี้ยงสุนัข" คุณอาจคิดว่าป้ายนั้นเป็นคำอธิบายที่ล้วนๆ: Mr. Restaurant ไม่ชอบสุนัขรอบ ๆ ดังนั้นเมื่อเขาสร้างร้านอาหารขึ้นเขาก็วางป้ายนั้น
ถ้านั่นคือทั้งหมดที่เกิดขึ้นก็จะมีป้าย "ไม่มีงู" ท้ายที่สุดไม่มีใครชอบงู และมีป้าย "ไม่มีช้าง" เพราะพวกเขาพังเก้าอี้เมื่อพวกเขานั่งลง
จริงด้วยเหตุผลที่ว่าสัญญาณก็คือมีประวัติศาสตร์: มันเป็นสัญลักษณ์ทางประวัติศาสตร์ที่บ่งชี้ว่าคนใช้ในการพยายามที่จะนำสุนัขของพวกเขาเข้าไปในร้านอาหาร
มันเหมือนกันในส่วนใหญ่ (ฉันจะไม่พูดทั้งหมด) ทีมซอฟต์แวร์: นโยบายเช่น"คุณต้องเพิ่มกรณีทดสอบสำหรับการแก้ไขข้อผิดพลาดทุกครั้ง"เกือบจะบ่งชี้ว่าทีมงานในอดีตมีปัญหาเกี่ยวกับการถดถอย การถดถอยเป็นอีกปัญหาหนึ่งที่ส่วนใหญ่มักเกิดจากการสื่อสารล้มเหลวแทนที่จะขาดคุณสมบัติ ตราบใดที่คุณเข้าใจนโยบายคุณอาจใช้ทางลัดที่ถูกกฎหมาย (เช่นฉันต้องแก้ไขข้อบกพร่องเล็ก ๆ 6 ข้อ แต่ทั้งหมดนี้อยู่ในคุณสมบัติเดียวกันดังนั้นฉันสามารถเขียนกรณีทดสอบหนึ่งข้อสำหรับทั้ง 9 ข้อ)
นั่นอธิบายว่าทำไมกระบวนการถึงอยู่ตรงนั้น แต่มันไม่ได้เป็นเรื่องราวทั้งหมด อีกครึ่งหนึ่งคือ:
ทำไมกระบวนการจึงยากที่จะติดตาม
นี่เป็นคำถามที่ตอบง่ายกว่า: เนื่องจากทีม (หรือการจัดการ) มุ่งเน้นไปที่ผลลัพธ์ที่ทำซ้ำและลดข้อบกพร่องให้น้อยที่สุด (ดังกล่าว) แต่ไม่ได้ให้ความสนใจเพียงพอในการปรับให้เหมาะสมและกระบวนการอัตโนมัติของกระบวนการนั้น
ตัวอย่างเช่นในคำถามเดิมฉันเห็นปัญหาต่าง ๆ :
ระบบควบคุมการแก้ไข (CVS) เป็นมรดกของมาตรฐานปัจจุบัน สำหรับโครงการใหม่มันถูกแทนที่ด้วยการโค่นล้ม (SVN) เกือบทั้งหมดซึ่งตัวมันเองก็ถูกบดบังโดยระบบกระจายเช่น Mercurial (Hg) อย่างรวดเร็ว สลับไปปรอทจะทำให้แตกแขนงและการผสานไกลง่ายและแม้กระทั่งในตัวอย่างสมมุติของฉันข้างต้นที่ต้องการในชีวิตประจำวันการกระทำจะกลายเป็นมากน้อยเจ็บปวด รหัสไม่จำเป็นต้องคอมไพล์เพราะที่เก็บเป็นแบบโลคัล - ในความเป็นจริงผู้พัฒนา lazier สามารถทำขั้นตอนนี้โดยอัตโนมัติหากพวกเขาต้องการตั้งค่าสคริปต์ออกจากระบบเพื่อยอมรับการเปลี่ยนแปลงในที่เก็บในเครื่องโดยอัตโนมัติ
ไม่มีการใช้เวลาโดยอัตโนมัติในกระบวนการเครื่องเสมือน กระบวนการทั้งหมดในการได้รับการกำหนดค่าและการดาวน์โหลดซอร์ส / ไลบรารีไปยังเครื่องเสมือนอาจเป็นไปโดยอัตโนมัติ 100% อาจเป็นกระบวนการที่ไม่ต้องใส่ข้อมูลที่คุณเรียกใช้บนเซิร์ฟเวอร์ส่วนกลางที่ใดที่หนึ่งขณะที่คุณทำงานกับการแก้ไขข้อบกพร่องในเครื่องของคุณ
ในอีกระดับหนึ่งโซลูชัน VM-per-Developer เริ่มโง่และคุณควรมีเซิร์ฟเวอร์การรวมอย่างต่อเนื่อง นั่นคือสิ่งที่ผลประโยชน์การผลิตที่แท้จริงเข้ามาเพราะ (ส่วนใหญ่) ช่วยให้นักพัฒนาอิสระไม่ต้องกังวลกับงานสร้างเลย ไม่จำเป็นต้องกังวลเกี่ยวกับการตั้งค่าเครื่องเสมือนที่สะอาดเพราะการสร้างเซิร์ฟเวอร์สะอาดเสมอ
ข้อความของคำถาม ("กรณีทดสอบพร้อมทุกขั้นตอน") แสดงถึงว่ามีการทดสอบด้วยตนเองเกิดขึ้น นี่อาจทำงานกับทีมเล็ก ๆ ที่มีภาระงานค่อนข้างต่ำ แต่ก็ไม่สมเหตุสมผลเลย การทดสอบการถดถอยสามารถและควรเป็นแบบอัตโนมัติ ไม่มี "ขั้นตอน" เพียงแค่คลาสหรือวิธีการที่เพิ่มลงในชุดทดสอบหน่วย / การรวมเข้าด้วยกัน
การย้ายจาก Bugzilla ไปเป็นระบบติดตามบั๊กที่ใหม่กว่านั้นจะทำให้ส่วนหนึ่งของประสบการณ์นั้นเจ็บปวดน้อยลง
บริษัท ไม่จำเป็นต้องถูกหรือโง่เพียงเพราะพวกเขายังไม่ได้แก้ปัญหาเหล่านี้ สิ่งที่พวกเขารู้ก็คือกระบวนการปัจจุบันทำงานได้และในบางกรณีพวกเขาไม่ชอบความเสี่ยงและลังเลที่จะเปลี่ยนแปลงอะไรก็ตาม แต่จริงๆพวกเขาก็จะต้องมีความเชื่อมั่นในผลประโยชน์
หากนักพัฒนาใช้เวลาหนึ่งสัปดาห์ในการติดตามเวลาของพวกเขาเกี่ยวกับงานที่ไม่ได้เข้ารหัสคุณสามารถเพิ่มได้อย่างง่ายดายแสดงการจัดการที่ (เช่น) การลงทุนที่ไม่มีเงินทุนศูนย์การลงทุน 100 ชั่วโมงต่อชั่วโมงในการอัพเกรดเป็น Mercurial ลดชั่วโมงการทำงานสูงสุดถึง 10 ชั่วโมงต่อสัปดาห์ในการแก้ไขข้อขัดแย้งการรวมกันนั่นคือผลตอบแทน 10 สัปดาห์และแน่นอนว่าพวกเขาจะเห็นด้วย แนวคิดเดียวกันกับ build servers (CI) หรือการติดตามบั๊กที่ดีขึ้น
สรุป: ทีมยังไม่ได้ทำสิ่งเหล่านี้เลยเพราะไม่มีใครมีความเชื่อมั่นการบริหารจัดการที่ว่ามันเป็นสิ่งสำคัญมากพอที่จะทำในวันนี้ ดังนั้นจงใช้ความคิดริเริ่มและเปลี่ยนเป็นสมการต้นทุน - ผลประโยชน์ ค้นหาว่าใช้เวลากับงานมากน้อยเพียงใดที่สามารถทำให้เรียบง่าย / อัตโนมัติโดยมีความเสี่ยงน้อยที่สุดและคำนวณจุดคุ้มทุนและการจ่ายผลตอบแทนในที่สุดของเครื่องมือหรือเทคนิคใหม่ หากพวกเขายังไม่ฟังคุณก็รู้อยู่แล้วว่าตัวเลือกที่เหลืออยู่ของคุณคืออะไร
หากนักพัฒนาใช้เวลาหนึ่งสัปดาห์ในการติดตามเวลาของพวกเขาเกี่ยวกับงานที่ไม่ได้เข้ารหัสคุณสามารถเพิ่มได้อย่างง่ายดายแสดงการจัดการ ... และเปลี่ยนเป็นสมการต้นทุนที่คุ้มค่า ฯลฯ
ส่วนด้านบนดูเหมือนจะคุ้มค่าต่อการขยายตัว
ฉันสามารถยืนยันได้ว่ามันใช้งานได้ โปรแกรมเมอร์ใช้มันสองสามครั้งในหนึ่งในโครงการที่ฉันทำงานและทุกครั้งที่มันนำไปสู่การเปลี่ยนแปลงที่ต้องการ
ความประทับใจโดยรวมของฉันคือถ้าทำถูกต้องเคล็ดลับนี้สามารถลบล้างความไม่รู้และความเฉื่อยของการจัดการจำนวนมาก
ฉันต้องการที่จะทราบว่า บริษัท ที่เรา (นักพัฒนา) ต้องหันมาใช้วิธีDIYแบบนี้ยังไม่บรรลุนิติภาวะด้านไอที ที่ผู้จำหน่ายซอฟต์แวร์ที่มีประสบการณ์มากขึ้นฉันเห็นสิ่งต่าง ๆ เช่นที่ผู้จัดการส่วนใหญ่ทำเอง และตามกฎแล้วพวกเขามีประสิทธิผลมากกว่าที่โปรแกรมเมอร์ของเรา มีประสิทธิภาพมากขึ้น