กระทำ / ตรวจสอบในรหัสทุกวันเป็นแนวปฏิบัติที่ดีหรือไม่?


63

ฉันได้อ่านบันทึกของมาร์ตินฟาวเลอร์เกี่ยวกับการบูรณาการอย่างต่อเนื่องและเขาระบุว่าต้องเป็น "ทุกคนมุ่งมั่นที่จะทำการฉีดทุกวัน"

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

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

คำถาม:การกระทำทุกวันเป็นวิธีที่ดีที่ฉันควรเปลี่ยนเวิร์กโฟลว์ของฉันเพื่อรองรับหรือไม่แนะนำให้ทำ?

แก้ไข:ฉันเดาว่าฉันควรจะชี้แจงว่าฉันหมายถึง "กระทำ" ในความหมายของ CVS (aka "push") เนื่องจากเป็นไปได้ว่าสิ่งที่ Fowler จะมีความหมายในปี 2549 เมื่อเขาเขียนสิ่งนี้

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


20
คุณอาจส่งรหัสของคุณถ้ามันรวบรวมและดำเนินการตรรกะที่มีประโยชน์ ดีกว่าที่จะยอมรับรหัสในรอบสั้น ๆ ถ้าคุณทำงานในสภาพแวดล้อมแบบทีม
EL Yusubov

4
Martin Fowler สมมติว่า VCS ที่ไม่ได้เผยแพร่หรือไม่
user16764

4
สังเกตวันที่ในบทความนั้น: 1 พฤษภาคม 2549 Git และ Mercurial ไม่ได้เริ่มจนถึงเมษายน 2005 และความประทับใจของฉันก็คือพวกเขาเริ่มได้รับแรงฉุดในปี 2008 ฉันไม่พบบทความใด ๆ ในเว็บไซต์ของ Fowler ที่อ้างถึง เป็นหนึ่งในนั้นก่อนหน้า 2009 ดังนั้นบทความนี้จากปี 2006 ถือว่าระบบควบคุมแหล่งรวมส่วนกลางอย่าง SVN คำแนะนำไม่สามารถใช้ได้กับทีมที่ใช้ DVCS
Kyralessa

2
@Kyralessa: บทความยังระบุว่า "การโค่นล้มเป็นระบบ [version control version]" ที่ทันสมัย
che

4
ก่อนรหัสแล้วทดสอบ?

คำตอบ:


43

ฉันไม่เห็นด้วยกับกฎนี้และฉันเห็นด้วยกับสิ่งที่Mason Wheelerพูด ฉันต้องการเพิ่มแนวคิดเล็กน้อย

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

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

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

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

แค่ 2 เซ็นต์ของฉัน

แก้ไข

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


23
A 'commit' ไม่ใช่ 'เผยแพร่' 'กระทำ' หมายถึง 'ภาพรวม'; 'เผยแพร่' เรียกว่า 'push' ใน scm-lingo แน่นอน SVN เพียงรวมแนวคิดทั้งสองเข้าด้วยกันทำให้เวิร์กโฟลว์ที่สมเหตุสมผลจำนวนมากเป็นไปไม่ได้ แต่นั่นเป็นข้อ จำกัด ของเครื่องมือไม่ใช่การควบคุมเวิร์กโฟลว์โดยทั่วไป
tdammers

3
Revision control and data backup are two different thingsใช่ฉันรู้สึกแบบนี้อย่างแน่นอน
เลื่อน

1
@ ผู้ส่งอีเมล: ฉันหมายถึงการเผยแพร่ด้วยวิธีที่ไม่เป็นทางการ: ตราบใดที่รหัสอยู่บนคอมพิวเตอร์ของฉันการเปลี่ยนแปลงส่วนตัวของฉันคือรหัสทั่วไป ทันทีที่ฉันยอมรับมันมีการเผยแพร่ซึ่งเป็นที่รู้จักของทีมอื่น ๆ และเป็นส่วนหนึ่งของประวัติโครงการอย่างเป็นทางการ
จอร์โจ

1
ในกรณีนั้น 'ยอมรับ' อาจเป็นคำที่ผิด SCM จำนวนมากอนุญาตให้กระทำในท้องถิ่นและการแบ่งปันรหัสของคุณกับส่วนที่เหลือของทีมเป็นการกระทำที่แยกต่างหากซึ่งมักเรียกว่า 'ดัน' อีกครั้ง SVN รวบรวมสองแนวคิดเข้าด้วยกัน แต่นั่นเป็นข้อ จำกัด ของเครื่องมือและถ้ามันเข้าสู่เวิร์กโฟลว์ของคุณให้ลองเปลี่ยนไปใช้ SCM อื่น
tdammers

@tdammers: การมีความแตกต่างที่ชัดเจนระหว่างการมอบหมายและการเผยแพร่ในท้องถิ่นจะเป็นขั้นตอนต่อไป ใน SVN ฉันสามารถใช้สาขาแยกกันได้ แต่อีกครั้งฉันสงสัยว่าทำไมฉันต้องการติดตามการแก้ไขที่ไม่สมเหตุสมผลกับฉัน ฉันไม่เชื่อว่าฉันต้องการการแก้ไขใหม่ (แม้จะเป็นแบบส่วนตัว) เพียงเพราะเป็นเวลา 5 นาฬิกาและฉันจะกลับบ้าน ฉันต้องการสำรองข้อมูลแทน
จอร์โจ

107

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

คุณควรพิจารณาเลิกงานของคุณเพื่อให้คุณสามารถเช็คอินได้อย่างปลอดภัยวันละสองสามครั้ง

เหตุผลของเรื่องนี้คือสอง:

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

2
หากคุณมีปัญหาร้ายแรงเกี่ยวกับความขัดแย้งและการรวมปัญหานั่นหมายความว่าผู้จัดการโครงการของคุณไม่ทำงานของเขา หลายกรณีที่เกี่ยวข้องกับการทำงานที่คล้ายกันควรไปที่ผู้พัฒนารายเดียวกันอย่างแม่นยำเพื่อที่คุณจะได้ไม่มีตัวแปลงสัญญาณสองตัวขึ้นไปกระทืบการทำงานของกันและกัน
Mason Wheeler

14
@MasonWheeler - หลังจาก 3 วันของการทำงานที่ไม่ได้มีความมุ่งมั่นมีโอกาสที่ดีมากที่หนึ่งได้สัมผัสรหัสที่คนอื่นมีในเวลาเดียวกัน หากคุณมีโปรแกรมเมอร์จำนวนมากที่ทำสิ่งนี้เหตุการณ์ผู้จัดการโครงการที่ดีที่สุดจะไม่สามารถหลีกเลี่ยงความขัดแย้งที่เกิดขึ้นได้
Oded

3
@Oded: อาจจะ ฉันคิดว่าการตอบสนองของฉันมีสีตามประสบการณ์ของฉันใน codebase ขนาดใหญ่พอที่นักพัฒนาของเรา (ประมาณหนึ่งโหล coders ในทีม) ทั้งหมดมีแนวโน้มที่จะมีความรับผิดชอบที่ไม่ทับซ้อนกัน ไม่แน่ใจว่ามันจะแตกต่างกันอย่างไรในโครงการขนาดเล็ก
Mason Wheeler

3
@ArtB - จะเป็นอย่างไรถ้ามีคนอย่างคุณตรวจสอบทุก 3 วัน? หรือสัปดาห์ละครั้ง? คุณพึ่งพาผู้อื่นในการทำสิ่งที่ถูกต้อง
Oded

3
เมื่อฉันอ่านคำถามคำตอบของฉันคือ "มันเหมือนกับการถามว่าควรอาบน้ำทุกสัปดาห์หรือไม่"?
Andrew Grimm

39

ยึดมั่นในวิธีการหรือการปฏิบัติใด ๆ โดยไม่เข้าใจเหตุผลที่อยู่เบื้องหลังมันเป็นความคิดที่ดี นั่นคือที่มาของการเขียนโปรแกรมการขนส่งสินค้ามาจาก

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

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


1
ถ้ามันเป็นการรวมคุณสมบัติที่ซับซ้อน / การพัฒนามันยังคงเป็นความสูญเสียครั้งใหญ่ที่จะไม่ยอมรับมันอาจจะไม่ใช่กับลำต้น แต่อย่างน้อยก็ในสาขาสำหรับคุณสมบัตินี้นั่นคือสิ่งที่กิ่งไม้ใช้ทำ!
Vincent B.

2
คุณหมายถึง 'การเช็คอินที่คุ้มค่า' หมายถึงอะไร ถ้ามันไม่ทำลายรหัสของคนอื่นทำไมคุณไม่เช็คอินล่ะ
Kirk Broadhurst

2
"คุณหมายถึง 'การเช็คอินที่คุ้มค่า' ถ้าไม่ทำลายรหัสของคนอื่นทำไมคุณไม่ตรวจสอบใน?": เพราะฉันไม่ต้องการเก็บสำเนาเก่าของรหัสเพียงเพราะพวกเขามีอยู่ในบาง เจาะจงเวลา. ฉันต้องการเก็บสำเนาเก่าของรหัสด้วยหากมีข้อมูลที่เป็นประโยชน์ที่ฉันอาจต้องการเรียกคืนในอนาคต มิฉะนั้นฉันก็แค่สร้างเสียงที่ไร้ประโยชน์ในประวัติศาสตร์การแก้ไข
จอร์โจ

3
+1 ฉันเคยทำงานในทีมที่เราต้องตรวจสอบรหัสลง vcs ทุกวันแม้ว่ารหัสนั้นจะเป็นการขัดขวางหรือการสอบสวนที่ไร้ประโยชน์ มันพิสูจน์แล้วว่าไม่มีประสิทธิภาพและสิ้นเปลืองโดยเฉพาะอย่างยิ่งเพราะต้องมีการบำรุงรักษาเป็นระยะเพื่อทำความสะอาด vcs มันเป็นเพราะการรวมกันของความหวาดระแวงกับความเสี่ยงที่อาจสูญเสียเวลาเล็กน้อยในการทำซ้ำบางสิ่งบางอย่างและเพราะผู้จัดการได้อ่านในหนังสือที่คุณควรกระทำทุกวัน ตัวอย่างที่สุดโต่ง แต่อย่างจริงจังหากคุณยังไม่ได้ตัดสินใจว่าจะตรวจสอบสิ่งที่ "คุ้มค่า" หรือไม่คุณอาจไม่เหมาะสมกับงาน
S.Robins

14

Oded ให้เหตุผลสำคัญสองข้อในการส่งรหัสบ่อยที่สุดเท่าที่จะทำได้ ฉันจะเพิ่มอีกไม่กี่:

  1. ขณะที่ทำงานกับรหัสของคุณส่วนอื่น ๆ อาจต้องการฟังก์ชั่นบางอย่างในรหัสนั้น พวกเขาไม่ควรรอ 6 วันเพื่อรับมัน ในกรณีนี้เพื่อนร่วมงานของฉันมักจะสร้างต้นแบบในส่วนของรหัสของฉันกระทำมันฉันเพิ่มร่างกายและกระทำอีกครั้ง และมักจะทำในไม่กี่ชั่วโมง

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


1
ทำไมคำตอบนี้กับ (IMO) คำตอบเดียวที่ถูกต้องและแม่นยำ (จุดที่ 2) ได้คะแนนต่ำมาก! แน่นอนว่าเป็นจุดของสาขา! @ Mason Wheeler: ดังนั้นคุณสนุกกับการเขียนโปรแกรมหลายวันในดิบโดยไม่ต้องกระทำครั้งเดียว? ถ้าอย่างนั้นทำไมต้องใช้ระบบควบคุมเวอร์ชัน!
Vincent B.

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

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

8

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

  • พวกเขาทำลายการสร้างหรือไม่
  • คุณกำลังทำซ้ำความพยายามของสมาชิกในทีมอื่นหรือไม่
  • คุณกำลังทำอะไรผิดหรือเปล่า?
  • หรือคนกำลังรอคอยสิ่งต่าง ๆ จากคุณ?

การเปลี่ยนแปลงเล็ก ๆ น้อย ๆ นั้นง่ายต่อการจัดการ

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

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


5

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

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

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

ตอนนี้สิ่งที่ดีเกี่ยวกับวิธีการทำงานนี้

  1. การไม่ใส่โค้ดขนาดใหญ่หรือการเปลี่ยนแปลงที่ปฏิวัติจะช่วยลดโอกาสในการทำลายโครงสร้าง
  2. หากความมุ่งมั่นของคุณทำลายงานสร้างมันเป็นเรื่องเล็กน้อยพอสมควรที่จะระบุว่าปัญหาคืออะไรเพื่อย้อนกลับและสร้างเวอร์ชันคงที่อย่างรวดเร็ว
  3. ด้วยการทำให้แน่ใจว่าการทดสอบทั้งหมดทำงานกับการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ในโค้ดคุณมั่นใจได้ว่าคุณไม่ได้แนะนำข้อบกพร่องหรือการถดถอยที่อาจเกิดจากการที่โค้ดมีการเติบโตนอกรูปแบบการรวมอย่างต่อเนื่อง

แน่นอนว่าการเปลี่ยนแปลงทั้งหมดไม่ได้ให้ตัวเองกับแนวทางนี้ ตามที่คนอื่น ๆ ชี้ให้เห็นไม่มีกฎใดที่สมบูรณ์ อย่างไรก็ตามสำหรับการเปลี่ยนแปลงที่คาดว่าจะอยู่นอกเหนือจากการฉีดเป็นเวลานานให้ตั้งค่าการฉีดขึ้นรูปแบบใหม่ด้วยแผนการผสมผสานอย่างต่อเนื่องของตัวเองและปฏิบัติตามแนวทางเดียวกันที่มีต่อมัน ด้วย VCS แบบกระจายของวันนี้มันค่อนข้างง่ายที่จะทำ


+1: "แน่นอนว่าการเปลี่ยนแปลงทั้งหมดไม่ได้ให้วิธีการนี้กับตัวเอง" ฉันคิดว่านี่เป็นประเด็น ฉันพบว่าคำแนะนำของ Fowler ตกลง แต่เราควรตัดสินจากกรณีหนึ่งไปอีก คำแนะนำนี้มักจะเป็นกฎทั่วไปแน่นอนและปฏิบัติตามโดยไม่ต้องพิจารณาเพิ่มเติม
Giorgio

@Giorgio ฉันเห็นด้วยกับคุณอย่างแน่นอน ไม่ควรให้คำแนะนำเป็นกฏเด็ดขาดไม่ว่าใครจะอยู่เบื้องหลัง
harald

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

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

3

ข้อโต้แย้งในการตรวจสอบทุกวัน:

  • รหัสจะถูกจัดเก็บและสำรองข้อมูลจากความล้มเหลวของฮาร์ดไดรฟ์
  • สามารถบันทึกกิจกรรมในบันทึกการกระทำ ( ฉันทำอะไรในวันพฤหัสบดี ... ? )
  • การผสานรวมกับฐานรหัสที่มีอยู่เกิดขึ้นก่อนหน้านี้และในกลุ่มย่อยที่มีขนาดเล็กลงหวังว่าจะระบุความขัดแย้งหรือรวมปัญหาได้เร็วขึ้น
  • ทีมของคุณมองเห็นสิ่งที่คุณกำลังทำอยู่
  • เพื่อนร่วมงานของคุณสามารถทำงานกับอินเทอร์เฟซของคุณได้เร็วขึ้นทำให้พวกเขามีเวลามากขึ้นในการรวมเข้ากับ 'โค้ดที่ซับซ้อนขนาดใหญ่' ของคุณ
  • รหัสของคุณจะถูกทดสอบในโลกแห่งความเป็นจริงไม่ช้าก็เร็วหรืออย่างน้อยก็มีการใช้งานมากกว่าที่คุณจะให้มันซึ่งจะนำไปสู่การระบุข้อผิดพลาดหรือการละเว้นก่อนหน้านี้

มีข้อโต้แย้งในการเช็คอินทุกวัน:

  • ไม่ต้องการหรือไม่ต้องการ
  • ยังไม่ได้ 'ล้างข้อมูล' รหัสของฉันมันเป็นระเบียบ
  • ไม่มีเวลา

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

ฉันชอบที่จะทำผิดเกี่ยวกับเรื่องนี้ดังนั้นโปรดแจ้งให้เราทราบข้อโต้แย้งที่ถูกต้องตามกฎหมายต่อการเช็คอินทุกวัน


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

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

@Giorgio คุณใช้เวลาหลายวันในการทำความสะอาดรหัสของคุณหรือไม่ ฉันได้รับเหตุผลที่ดีสำหรับการตรวจสอบรายวัน - เหตุผลของคุณคือคุณจะต้องทำความสะอาดรหัสของคุณหรือไม่ เพียงแค่เขียนรหัสทำความสะอาดตรงขึ้น
Kirk Broadhurst

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

@Giorgio คุณไม่มีสาขาพัฒนาที่คุณเช็คอินอยู่หรือไม่ ควรตรวจสอบรหัสเพื่อให้คนอื่นสามารถตรวจสอบและทดสอบได้เช่นกัน
Kirk Broadhurst

2

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

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

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

ในช่วงเวลาที่การโค่นล้มเป็นเทคโนโลยีล่าสุดและไม่มีทางแยกและรวมสาขาต่าง ๆ โดยไม่มีความเจ็บปวดอย่างรุนแรงมีการฉีดที่ลักษณะต่าง ๆ หลายอย่างในการก่อสร้างพร้อมกันอาจเป็นวิธีที่ดีที่สุด แต่ความเหนือกว่านี้ไม่ได้เกินกว่าปี 2010


2

ใน Team Foundation Server คุณสามารถ 'Shelve' ซึ่งไม่เหมือนกับการเช็คอิน แต่เพียงแค่ทำการสำรองข้อมูลรหัสของคุณเพื่อที่ว่าหากเครื่องของคุณตายคุณจะไม่สูญเสียการเปลี่ยนแปลง

ฉันเคยเห็นบ้านซอฟต์แวร์ที่มี 'สายนักพัฒนา' และ 'ฉีด' Devs มีอิสระที่จะตรวจสอบสายพัฒนาเมื่อใดก็ตามที่พวกเขาเห็นว่าเหมาะสมและหัวหน้าทีมเท่านั้นที่มีสิทธิ์เข้าถึงการฉีดเพื่อให้พวกเขารับผิดชอบในการคัดลอกรหัสจาก dev ไปยังหลักเมื่อพร้อมที่จะผลิต

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