ฉันจะสร้างฐานรหัสใหม่ได้อย่างไรในขณะที่คนอื่นยอมรับอย่างรวดเร็ว


18

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

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

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

คำตอบ:


35

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

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


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

ถูกต้อง! การปรับโครงสร้างครั้งใหญ่ไม่มีที่ใด (ดูNetscape 6หรือพีระมิดโครงการ )
Andomar

8

คุณไม่เคย "ไม่ใหญ่พอที่จะสื่อสาร" หากนิ้วคุณสามารถพิมพ์ข้อความได้ริมฝีปากของคุณก็สามารถพูดได้เช่นกัน ในตอนท้ายของการปรับปรุงเทคโนโลยีวันคือการสื่อสาร 85% และทางเทคนิค 15% เพียงเพราะคุณอยากจะนั่งที่นั่นมากกว่าการสนทนากับใครซักคน ... ไม่ได้หมายความว่าเป็นความคิดที่ดี การสื่อสารเป็นส่วนสำคัญของสิ่งที่คุณพยายามทำ แต่อย่าเพียงหลีกเลี่ยง


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

+1 คุณไม่สามารถแบ่งปันรหัสฐานกับใครบางคนโดยไม่ต้องสื่อสาร
MarkJ

4

ใช่สาขาเป็นทางออกที่ดีสำหรับเรื่องนี้

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

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


1
-1: ไม่ดูคำตอบของ @Karl Bielefeldt
Jim G.

ใช่? ฉันไม่เห็นด้วยกับคาร์ลนั่นเป็นเหตุผลว่าทำไมฉันถึงได้เริ่มต้นอย่างรวดเร็ว
Benjamin Bannier

และฉันกำลังพูดว่า "อย่าแยกสาขาแล้วผสานอีกครั้ง" ที่ดีที่สุดก็เสียความพยายาม ที่แย่ที่สุดคุณจะทำเรื่องยุ่งเหยิง
Jim G.

3

คุณได้พิจารณาตัวเลือก "ยังไม่ได้ทำเลย"?

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

ผู้ชายคนอื่น ๆ น่าจะเพิ่มฟังก์ชั่นใหม่มากมายเปลี่ยนฟังก์ชั่นที่มีอยู่และอาจลบฟังก์ชั่นบางอย่างออก

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


+1 หาก codebase ของคุณอยู่ในฟลักซ์ขนาดใหญ่นั่นอาจไม่ใช่เวลาที่ดีที่สุดในการลองเขียนซ้ำครั้งใหญ่ เลือกเวลาในวงจรการพัฒนาของคุณเมื่อสิ่งต่างๆสงบลง
anon

2

tl; dr - ฟังดูเหมือนว่าถึงเวลาที่จะก้าวขึ้นสู่ลีกใหญ่แล้ว การวางลิปสติกบนหมูไม่ได้ทำให้สวยกว่านี้เว้นแต่คุณจะชอบอะไรแบบนั้น ...

ปัญหาคน

ปัญหาแรกคือการส่งข้อมูลให้ตรงกัน หากคุณมีหลายคนทำงานกับรหัสเดียวกันในเวลาเดียวกันคุณต้องการเพียงหนึ่งกฎเพื่อป้องกันปัญหา:

Rule 1: Always pull before you merge/rebase

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

ปัญหารหัส

คุณจะรู้ได้อย่างไรว่าการเปลี่ยนแปลงที่คุณทำไม่เกิดการแตกหัก

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

Rule 2: Don't make assumptions, write proofs (ie tests).

นอกจากนี้ขอบเขตการทดสอบแบบเต็มควรรันก่อนที่คุณจะกดไปยังต้นแบบต้นกำเนิด / ต้นแบบระยะไกล

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

คุณอาจต้องปรับโครงสร้างองค์กรใหม่ก่อน

หากไม่สามารถแก้ไขปัญหาข้างต้นได้อย่างง่ายดายอาจมีปัญหาบางอย่างเกี่ยวกับโครงสร้างการพัฒนาที่จำเป็นต้องแก้ไขก่อน

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

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

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

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

ตำนานของ "The Mythical Man Month"

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

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

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

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


-1

รหัสการบำรุงรักษาที่สะอาด / สวยงามและที่สำคัญที่สุดในระยะยาว

ในประสบการณ์ของฉันสะอาด / สวยงามเป็นศัตรูของการบำรุงรักษา รหัสที่สวยงามมักจะ:

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

ในทางกลับกันรหัสบำรุงรักษา:

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

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

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