วิธีการปรับปรุงเมื่อการพัฒนาทั้งหมดของคุณอยู่ในสาขา?


24

ที่ บริษัท ของฉันการพัฒนาของเราทั้งหมด (การแก้ไขข้อบกพร่องและคุณสมบัติใหม่) จะดำเนินการในสาขาแยกต่างหาก เมื่อเสร็จแล้วเราจะส่งมันออกไปยัง QA ที่ทำการทดสอบในสาขานั้นและเมื่อพวกเขาให้แสงสีเขียวแก่เราเราจะรวมมันเข้ากับสาขาหลักของเรา อาจใช้เวลาระหว่างวันและหนึ่งปี

หากเราพยายามบีบอัด refactoring เข้าไปในสาขาเราไม่รู้ว่ามันจะ "หมด" นานแค่ไหนดังนั้นมันอาจทำให้เกิดความขัดแย้งมากมายเมื่อถูกรวมเข้ามา

ตัวอย่างเช่นสมมติว่าฉันต้องการเปลี่ยนชื่อฟังก์ชั่นเนื่องจากคุณสมบัติที่ฉันใช้งานอยู่ใช้ประโยชน์จากฟังก์ชั่นนี้อย่างหนักและฉันพบว่าชื่อของมันไม่ตรงกับวัตถุประสงค์ของมันจริงๆ (อีกครั้งนี่เป็นเพียงตัวอย่าง) ดังนั้นฉันจึงไปรอบ ๆ และค้นหาการใช้งานฟังก์ชั่นนี้ทุกครั้งและเปลี่ยนชื่อพวกมันทั้งหมดเป็นชื่อใหม่และทุกอย่างทำงานได้อย่างสมบูรณ์แบบดังนั้นฉันจึงส่งมันออกไปยัง QA

ในขณะเดียวกันการพัฒนาใหม่กำลังเกิดขึ้นและฟังก์ชั่นการเปลี่ยนชื่อของฉันไม่อยู่ในสาขาใด ๆ ที่ถูกแยกออกจากหลัก เมื่อปัญหาของฉันถูกรวมกลับเข้ามาพวกเขาทั้งหมดก็จะพัง

มีวิธีจัดการกับสิ่งนี้หรือไม่?

ไม่ใช่ว่าผู้บริหารจะอนุมัติปัญหาเฉพาะผู้ผลิตซ้ำดังนั้นจึงต้องมีการบีบงานอื่น ๆ มันไม่สามารถพัฒนาได้โดยตรงบนหลักเพราะการเปลี่ยนแปลงทั้งหมดจะต้องผ่านการควบคุมคุณภาพและไม่มีใครอยากเป็นกระตุกที่แตกหลักเพื่อให้เขาสามารถทำ refactoring เล็กน้อยที่ไม่จำเป็น


คุณใช้การควบคุมเวอร์ชันใด มีวิธีการที่แตกต่างกันสำหรับ DVCS และแบบจำลองเซิร์ฟเวอร์ส่วนกลาง นอกจากนี้สาขาการพัฒนาถูกถอดออกจากอะไร? หากสาขาฟีเจอร์ได้รับการยอมรับส่วน dev อื่นจะรับการเปลี่ยนแปลงอย่างไร

2
นอกจากนี้ไดอะแกรมของโครงสร้างการแตกแขนงในปัจจุบันอาจมีประโยชน์จริงๆ มันค่อนข้างเป็นไปได้ว่ารากของปัญหาที่เกิดขึ้นด้วยความยากลำบากกับการ refactoring อยู่ในส่วนหนึ่งเกิดจากนโยบายบางอย่าง ... แขนงไม่เป็นทางการ (ดูprogrammers.stackexchange.com/questions/210360ตัวอย่างเช่นหนึ่ง) ฉันขอแนะนำให้อ่านvance.com/steve/perforce/Branching_Strategies.htmlเพื่อรับแนวคิดและพื้นหลัง (ถ้าฉันสามารถตอบคำถามนี้ได้ซึ่งจะเป็นจุดอ้างอิงหลัก)

1
ย่อหน้าสุดท้ายนั้นสรุป - หากธุรกิจไม่รับรู้คุณค่าไม่มีทางที่ผู้ปรับโครงสร้างรายใหญ่สามารถก้าวไปข้างหน้าได้ คุณต้องทำงานร่วมกับทีมทดสอบของคุณเพื่อแก้ไขเส้นเวลาของพวกเขา (ฉันสงสัยว่า QA ของคุณคือการทดสอบจริง ๆ ในการลาก (พวกเขาใส่วิกและลิปสติกบนและทำเป็นสิ่งที่พวกเขาไม่ใช่) ทีม QA จริงจะบอกคุณว่า refactor ไม่ได้ในแบบของคุณ)
mattnz

1
@ แมทท์: คุณพูดถูก พวกเขาไม่ใช่ทีม QA ที่แท้จริง พวกเขากำลังสนับสนุนลูกค้าส่วนใหญ่ ฉันคิดว่าความรับผิดชอบจำนวนมากของพวกเขาควรจะถูกย้ายกลับไปที่ทีม Dev เพราะพวกเขาไม่สามารถจัดการทุกอย่างที่เราทิ้งไว้ แต่นั่นเป็นปัญหาการจัดการและการต่อสู้ที่ฉันยังไม่ได้รับ
mpen

3
คุณคิดถึงฉันขุด ทดสอบ! = QA QA ดูแลคุณภาพและตั้งเป้าหมายที่จะปรับปรุงผลลัพธ์ทางธุรกิจ ทดสอบความพยายามที่จะพิสูจน์ว่าไม่มีข้อบกพร่องโดยการค้นหาพวกเขา
mattnz

คำตอบ:


12

มีปัญหาหลายอย่างที่ผสมเข้าด้วยกันเพื่อทำให้การรีแฟคเจอริ่งที่ท้าทายในสภาพแวดล้อมนี้ การผสมลงในนี้เป็นปัญหาที่ไม่ใช่ด้านเทคนิค ("แต่นั่นเป็นปัญหาด้านการจัดการและการต่อสู้ที่ฉันยังไม่ชนะ")

ปัญหาแรกที่ต้องดูคือสาขาที่ใช้เวลานาน สาขาเหล่านี้มีปัญหาในการติดตามการเปลี่ยนแปลงนอกมุมมองของนักพัฒนา เพื่อที่อยู่นี้:

  • เมื่อรหัสเสร็จสมบูรณ์ - ให้อีกครั้ง (ให้ฝ่ายสนับสนุนลูกค้าดูหากพวกเขาต้องการ) แต่ผสานเข้ากับการพัฒนาอย่างรวดเร็วเพื่อให้การเปลี่ยนแปลงอื่น ๆ ที่ขึ้นอยู่กับมันจะสามารถหยิบขึ้นมาและการเปลี่ยนแปลงที่มีการระบุความขัดแย้งก่อน ในกระบวนการ.
  • หากด้วยเหตุผลบางอย่าง brach จะทำงานได้นานในขณะที่การรีแฟคเตอร์กำลังดำเนินอยู่จึงมีแนวปฏิบัติที่ดีในการผสานจากคอกเข้ากับกิ่งเพื่อรับการเปลี่ยนแปลงและการเปลี่ยนสภาพ บ่อยครั้งสิ่งนี้จะช่วยลดความขัดแย้งและความประหลาดใจในการผสานจากฟีเจอร์สาขาไปยังสาขาที่มั่นคง
  • ทั้งหมดบูรณาการการทดสอบความต้องการที่จะทำในรุ่น - ไม่ได้มี ในคุณสมบัติสภาพแวดล้อมนี้อาจหรือไม่อาจรวมเข้ากับระบบ แม้ว่ามันจะเป็นไปได้ที่จะทำการตรวจสอบสติสัมปชัญญะในคุณลักษณะแยก แต่ก็ไม่ได้ระบุปัญหาเมื่อมีการเปิดตัว
  • จากช่วงเวลาของการทำให้โค้ดเสร็จสมบูรณ์ถึงการผสาน (ให้เรียกมันว่าการพัฒนา - การแตกสาขาจากมาสเตอร์ / เสถียร / รีลีสมีปัญหาของตัวเองที่ไม่รับการเปลี่ยนแปลงการพัฒนาล่าสุด) ไม่ควรยาวเกินไป ยิ่งคุณรอนานเท่าไรยิ่งมีความรู้ที่หายไปมากขึ้นและยิ่งยากขึ้นสำหรับการรวมโค้ดเข้ากับบรรทัดรหัสอื่น ๆ

อีกประเด็นหนึ่งที่ผสมลงไปในเรื่องนี้คือสิ่งที่ฉันพูดถึงในประเด็นข้างต้นคือบทบาทที่เปลี่ยนไปของสาขาเมื่อเวลาผ่านไป มันเริ่มต้นจากการเป็นสาขาการพัฒนาที่นักพัฒนายอมรับและจากนั้นกลายเป็นพื้นที่ทดสอบ (การทดสอบใดที่ทำที่นี่ซึ่งมีความหมายในแอปพลิเคชันทั้งหมด?) ซึ่งจะรวมเข้ากับคอกม้า (และปล่อยอย่างแน่นอน) - ทดสอบอีกครั้งหรือไม่?)

ด้วยคุณสมบัติที่สั้นลงเริ่มต้นเวลาสิ้นสุดมันจะง่ายขึ้นสำหรับการปรับโครงสร้างเพื่อให้สามารถเลือกได้โดยสาขาอื่น

สนับสนุนให้นักพัฒนาได้รับสภาพแวดล้อมทั้งหมด เพียงแค่การเปลี่ยนแปลงการหยิบเชอร์รี่สามารถนำไปสู่ ​​... ช่วยบอกว่าสภาพแวดล้อมของนักพัฒนาซอฟต์แวร์น่าสนใจ ในขณะที่การเก็บเชอร์รี่นั้นมีประโยชน์สำหรับการที่จะเป็นโหมดเริ่มต้นของการดึงการเปลี่ยนแปลงในสาขาสามารถน่าเป็นห่วง

การปรับโครงสร้างใหม่นั้นเป็นสิ่งที่ควรทำอย่างต่อเนื่องหรือหากไม่ต่อเนื่องเมื่อใดก็ตามที่มีช่วงเวลาหยุดทำงานสั้น ๆ สาขาทำการปรับโครงสร้างอย่างง่ายทำการทดสอบหน่วยเพื่อตรวจสอบว่าทุกอย่างยังคงทำงานอยู่ (หน่วยที่ทดสอบถูกต้องใช่ไหม? ) จากนั้นผสานกลับเข้าที่มั่นคง ส่งผ่านข้อมูลสำหรับนักพัฒนาซอฟต์แวร์รายอื่นเพื่อดึงการเปลี่ยนแปลงเหล่านั้นที่คุณ refactored เป็นสาขาของตนเอง

เป็นสิ่งสำคัญสำหรับนักพัฒนาในการเป็นเจ้าของคุณภาพของรหัส ในขณะที่ทิศทางของคุณสมบัตินั้นมาจากภายนอกและการจัดสรรเวลามักไม่ใช่ของเราเอง แต่คุณภาพของโค้ดนั้นเป็นสิ่งที่เราจำเป็นต้องภาคภูมิใจและทำเวลาให้

คุณอาจพบคำถามต่อไปนี้มีประโยชน์ในการค้นหาเพื่อจัดสรรเวลาสำหรับจัดการกับหนี้ทางเทคนิค:

คุณอาจต้องการดูเครื่องมือต่าง ๆ เช่นโซนาร์ซึ่งสามารถช่วยระบุส่วนต่าง ๆ ของรหัสที่จำเป็นต้องใช้ในการปรับโครงสร้างให้มากที่สุด ปลั๊กอินหนี้ทางเทคนิคเป็นสิ่งที่สามารถนำมาใช้เพื่อจุดความช่วยเหลือจากการสะสมของหนี้ในช่วงเวลาในฐานรหัส

บ่อยครั้งที่จำเป็นต้องชี้ให้เห็นว่าROIสำหรับการจัดการกับหนี้ทางเทคนิคเป็นเวลาตอบสนองที่รวดเร็วขึ้นสำหรับคุณลักษณะและการแก้ไขข้อบกพร่องจากทีมพัฒนา


การทดสอบจะดำเนินการเป็นหลักในเวลาสามจุดในเวลา หนึ่งครั้งเมื่อปัญหาถูกอ้างว่าได้รับการแก้ไข (เพื่อให้แน่ใจว่าเป็นไปตามข้อกำหนดทั้งหมดและไม่มีปัญหาที่สำคัญ) อีกครั้งเมื่อมันถูกรวมกลับเป็นค่าเริ่มต้น (การทดสอบการรวม) และอีกครั้งเมื่อเราสร้าง (บูรณาการกับเชอร์รี่ทั้งหมด ปัญหา / การดูครั้งสุดท้าย) ฉันคิดว่าการหยิบเชอร์รี่เป็นสิ่งจำเป็นในสภาพแวดล้อมของเราเนื่องจากเราดำเนินงาน SaaS กับลูกค้าที่เฉพาะเจาะจงมาก ฉันจะดูที่ลิงค์เหล่านี้ขอบคุณสำหรับพอยน์เตอร์! แก้ไข: มีการตรวจสอบการผลิตอีกครั้งหนึ่งเพื่อให้แน่ใจว่าใช้ได้
mpen

3

ฉันมักจะพัฒนารุ่น refactored ใน "ขนาน" กับปัจจุบันเช่นใน codebase เดียวกัน แต่ไม่ได้อ้างอิงจาก core application และเมื่อมีการแก้ปัญหาและทดสอบใหม่ฉันเริ่มการปรับสภาพจริง

ตัวอย่างที่ 1สมมติว่าฉันมีสิ่งที่ปล่อยให้เป็นได้ทั้งฟังก์ชันส่วนต่อประสานโมดูลหรืออะไรก็ตาม และฉันต้องการที่จะ refactor มัน ฉันกำลังสร้าง Thing2 ใน codebase เดียวกันมันเป็น refactored version ของ Thing เมื่อเสร็จแล้วและทดสอบฉันกำลัง refactoring ทุกอย่างที่อ้างอิงถึงสิ่งเพื่อแทนที่ด้วยสิ่ง 2 โดยปกติขั้นตอนนี้ใช้เวลาค่อนข้างน้อย

หากการรีแฟคเตอร์จริงใช้เวลามากเกินไปในการซิงค์โดยไม่มีการขันทีมฉันจะใช้ฟีเจอร์ที่เกี่ยวข้องทั้งหมด

ตัวอย่างที่ 2ฉันมีแบ็กเอนด์การเรนเดอร์ใหม่ซึ่งเป็นเวอร์ชันเก่าของ refactored แต่มันเข้ากันไม่ได้กับ frontend การเรนเดอร์แบบเก่า ดังนั้นฉันต้อง refactor ส่วนหน้า และอีกครั้ง: ใน codebase เดียวกัน เมื่อทุกอย่างเสร็จสิ้นฉันแค่เปลี่ยนคลาสของอินสแตนซ์ส่วนหน้าเป็นการดีที่จะใช้เวลาสั้น ๆ

ใช่คนที่เกิดซ้ำอาจสรุปได้ว่าทุกอย่างจะต้องทำควบคู่กัน แต่มักจะเกิดขึ้นเมื่อมีการเชื่อมต่อใน codebase มากเกินไปหรือเปลี่ยนแปลงเร็วเกินไป

ในที่สุดเมื่อรหัสใหม่รวมและทำงานได้ดีคุณสมบัติเก่าอาจถูกลบออกจาก codebase และคุณสมบัติใหม่อาจถูกเปลี่ยนชื่อเพื่อรับชื่อเก่า

โดยทั่วไปความคิดคือการเตรียมคุณสมบัติใหม่ในแบบคู่ขนานและสลับไปใช้โดยขั้นตอนเดียว

John Carmack ใช้วิธีนี้ (หรืออย่างน้อยก็คล้ายกัน) บางทีโพสต์บล็อกของเขาอธิบายได้ดีกว่า: (ลิงก์)


นี่เป็นวิธีการที่ดี ฉันพยายามที่จะจำสิ่งที่ถามคำถามนี้จริง ๆตอนนี้ ... ฉันไม่คิดว่ามันเป็นสิ่งที่คล้อยตามการขนาน หรือถ้าเป็นเช่นนั้นฉันคิดว่าข้อกังวลของฉันคือวิธีนี้ทำให้การกระจายตัวของโค๊ดเบสมาก เรามี "วิธีการแบบเก่า" ในการทำสิ่งต่าง ๆ และ "วิธีการใหม่" ในการทำสิ่งต่าง ๆ และสิ่งเก่า ๆ ถูกแทนที่ด้วยความเย็น แต่มันทำให้ปวดหัวสำหรับนักพัฒนาเพราะตอนนี้พวกเขาจำเป็นต้องรู้ระบบสองระบบ
mpen

1

มันอาจดูเหมือนยากในด้านเทคนิคเมื่อจริง ๆ แล้วมันอยู่ในด้านความต้องการ

ในกรณีที่การพัฒนามุ่งเน้นไปที่ความต้องการที่แตกต่างกันในสาขาที่แตกต่างกันนั้นเป็นความยากลำบากที่แท้จริง ผู้จัดการและสถาปนิกของทีมควรตัดสินใจที่อาจทำให้ความต้องการทางธุรกิจที่แตกต่างกันอยู่ร่วมกัน

กระบวนการ ZBB และ Co-Dev "ประนีประนอม" เมื่อเสร็จสิ้นการตัดสินใจที่ถูกต้องด้วยข้อมูลที่เกี่ยวข้องจากนักพัฒนาทุกคนควรให้ afterwords ช่วยให้คุณสามารถใช้สิ่งที่คุณต้องการโดยไม่ต้องคิด - ฉันจะผสานรหัสของฉันอย่างไร

ZBB หมายถึงการจัดทำงบประมาณแบบไม่มีศูนย์ โดยการพูด Co-Dev ฉันหมายถึงคนไม่กี่คนที่ทำงานในการเขียนโปรแกรมแบบขนาน


2
"ZBB" และ "Co-Dev" คืออะไร
ริ้น

ZBB - en.wikipedia.org/wiki/Zero-based_budgeting โดยการพูด Co-Dev ฉันหมายถึงคนไม่กี่คนที่ทำงานในการเขียนโปรแกรมแบบขนาน
Yosi Dahari

1

ปัญหาดูเหมือนว่าสำหรับคุณที่ทำงานมากเกินไปในสาขา ค่าใช้จ่ายของความขัดแย้งเพิ่มขึ้นแบบทวีคูณโดยความยาวที่ทุกคนอยู่ในสาขาดังนั้นด้วยความขัดแย้งที่ยาวนานมากคุณมีโอกาสเพียงเล็กน้อยที่จะทำการปรับโครงสร้างใหม่


0

ปัญหาของคุณคือรูปแบบสาขาที่คุณใช้ คุณสามารถพัฒนาบนสาขาและเมื่อเสร็จสมบูรณ์และพร้อมสำหรับ QA สาขาจะถูกรวมเข้ากับ 'trunk กลาง' บางครั้งเรียกว่า Integration หรือ Test เมื่อคุณพัฒนาฟีเจอร์ถัดไปคุณสามารถแยกได้จาก trunk กลางนี้แทน

รุ่นนี้ช่วยให้คุณพัฒนาคุณสมบัติหลายอย่างพร้อมกันในสาขาที่แตกต่างกันรวมพวกเขาทั้งหมดเข้าด้วยกันเพื่อบูรณาการสาขาเพื่อส่งไปยัง QA และยังรักษาลำตัวของการเผยแพร่เดียว (คุณผสาน codebase QA ที่ได้รับกับลำต้นหลักเมื่อพวกเขารับรอง )

คุณกำลังสันนิษฐานว่าการเปลี่ยนแปลงที่ส่งไปยัง QA จะถูกส่งผ่านโดยไม่มีการดัดแปลงที่สำคัญแม้ว่า - หากรหัส QA กลับมาพร้อมคำแนะนำในการลบการเปลี่ยนแปลงครึ่งหนึ่งคุณจะต้องเปลี่ยนกลับ แต่ถ้าไม่ได้เกิดขึ้น การพัฒนาของคุณราบรื่นยิ่งขึ้น ดังนั้นโดยพื้นฐานแล้วคุณกำลังนำสาขาสำหรับฟีเจอร์ใหม่ ๆ ออกมาว่าโค้ด mainline ของคุณจะเป็นอะไร (เช่น trunk หลังจากการรวมในรหัสที่ส่งผ่านไปยัง QA) แทนที่จะเป็นในวันนี้ (เช่น trunk ในปัจจุบัน) และดังนั้น .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.