Làm thế nào tôi có thể cấu trúc lại một cơ sở mã trong khi những người khác nhanh chóng cam kết với nó?


18

Tôi đang ở trong một dự án tư nhân mà cuối cùng sẽ trở thành nguồn mở. Chúng tôi có một vài thành viên trong nhóm, đủ tài năng với các công nghệ để xây dựng ứng dụng, nhưng không phải là nhà phát triển chuyên dụng có thể viết mã sạch / đẹp và quan trọng nhất là có thể duy trì lâu dài.

Tôi đã bắt đầu cấu trúc lại cơ sở mã, nhưng hơi khó sử dụng khi một người trong nhóm ở một quốc gia khác mà tôi không liên lạc thường xuyên có thể cập nhật điều hoàn toàn riêng biệt này.

Tôi biết một giải pháp là giao tiếp nhanh chóng hoặc áp dụng các thực tiễn PM tốt hơn, nhưng chúng ta vẫn chưa lớn. Tôi chỉ muốn dọn sạch mã và hợp nhất độc đáo vào những gì anh ấy đã cập nhật. Sử dụng một chi nhánh sẽ là một kế hoạch phù hợp? Một nỗ lực hợp nhất tốt nhất? Thứ gì khác?

Câu trả lời:


35

Một điều mọi người thường không cân nhắc là một kiến ​​trúc sạch sẽ không chỉ tăng tốc bảo trì dài hạn, mà còn tăng tốc độ phát triển ngay bây giờ . Đừng cố gắng bảo vệ những thay đổi của bạn với đồng nghiệp cho đến khi chúng được "hoàn thành". Những thay đổi của bạn sẽ giúp chúng có năng suất cao hơn và ít bị lỗi hơn.

Sai lầm thường gặp nhất mà mọi người mắc phải khi thực hiện một công cụ tái cấu trúc lớn là không hợp nhất thường xuyên, thay vào đó cố gắng thực hiện nó trong một "vụ nổ lớn". Cách đúng đắn để làm điều đó là tạo ra bộ tái cấu trúc nhỏ nhất có thể, kiểm tra nó, sau đó hợp nhất nó vào chi nhánh của đồng nghiệp của bạn và dạy anh ta về sự thay đổi để anh ta có thể kết hợp nó tiến lên. Lý tưởng nhất là bạn đang thực hiện một hợp nhất mỗi ngày hoặc ít nhất một lần mỗi tuần.


17
Có có có. Chống lại sự thôi thúc tham gia tour du lịch solo kéo dài một tháng chỉ để thấy rằng cơ sở mã hóa mà bạn phải tái cấu trúc đã thay đổi hoàn toàn và bạn phải bắt đầu lại từ đầu. Tốt hơn nên làm một bước tại một thời điểm.
tdammers

Chính xác! Tái cấu trúc lớn không đi đến đâu (xem Netscape 6 , hoặc Kim tự tháp dự án )
Andomar

8

Bạn không bao giờ "không đủ lớn để giao tiếp". Nếu ngón tay của bạn có thể gõ, đôi môi của bạn cũng có thể nói chuyện. Vào cuối ngày, cải tiến công nghệ là 85% giao tiếp và 15% kỹ thuật. Chỉ vì bạn thích ngồi đó viết mã hơn là nói chuyện khó khăn với ai đó ... không có nghĩa đó là một ý tưởng hay. Giao tiếp thực sự là phần khó khăn của những gì bạn đang cố gắng, nhưng đừng chỉ tránh nó.


Đó thực sự không phải là khó khăn trong giao tiếp, đó là tôi không muốn nhà phát triển hiện tại chậm lại. Trên thực tế, tôi thậm chí không chắc anh ta cần phải học đúng cách miễn là nó có thể được tái cấu trúc. Anh ấy không phải là một lập trình viên đầu tiên, anh ấy là một nhà khoa học trong lĩnh vực khác.
Ẩn danh

+1. Bạn không thể chia sẻ cơ sở mã với ai đó mà không liên lạc
MarkJ

4

Vâng, một chi nhánh là một giải pháp tốt cho việc này.

Tôi sẽ đề nghị bạn bắt đầu làm việc này trên một chi nhánh và đảm bảo rằng nó áp dụng hoàn toàn trên đầu trang của bạn HEADtrong thời gian này (nghĩa là thực hiện các cuộc nổi loạn thử nghiệm và hợp nhất theo định kỳ để đảm bảo bạn có thể áp dụng các thay đổi của mình một cách dễ dàng và các thử nghiệm của bạn vẫn vượt qua - - cũng xem xétgit rerere để được giúp đỡ gitvới điều này). Sau đó, khi bạn đã hoàn thành rebase và hợp nhất các thay đổi của bạn vào HEAD.

Bạn càng bắt đầu làm việc này sớm thì càng tốt vì việc thay đổi kiến ​​trúc càng trở nên nhiều công việc thì mã càng lạnh. Ngoài ra, có thể có nhiều trường hợp mã được mã hóa nằm rải rác trong cơ sở mã, ví dụ như chức năng trình trợ giúp mới và trình trợ giúp của bạn có thể làm mọi thứ đơn giản hơn nhiều.


1
-1: Không. Xem câu trả lời của @Karl Bielefeldt.
Jim G.

Đúng? Tôi không đồng ý với Karl, đó là lý do tại sao tôi đưa ra quan điểm về việc bắt đầu nhanh.
Benjamin Bannier

Và tôi đang nói, "Đừng phân nhánh và sau đó hợp nhất lại". Tốt nhất, nó đã lãng phí công sức. Tệ nhất, bạn sẽ tạo ra một mớ hỗn độn lớn.
Jim G.

3

Bạn đã xem xét tùy chọn "Đừng làm điều đó chưa"?

Trong khi thực hiện công việc này trong một nhánh riêng biệt có lẽ là cách tiếp cận tốt nhất, bạn đang thiết lập cho mình một sự hợp nhất đau đớn lớn xuống dòng.

Những kẻ khác có lẽ đang thêm rất nhiều chức năng mới, thay đổi chức năng hiện có và có thể loại bỏ một số chức năng.

Một khi nhà phát triển chính đã làm việc chậm lại một chút tại một thời điểm nào đó trong tương lai, thì bạn có thể ở vị trí dễ dàng hơn nhiều để tái cấu trúc.


+1. Nếu cơ sở mã của bạn đang trong tình trạng thay đổi lớn, đó có lẽ không phải là thời điểm tốt nhất để thử viết lại lớn. Chọn một thời gian trong chu kỳ phát triển của bạn khi mọi thứ đã bình tĩnh hơn.
anon

2

tl; dr - Có vẻ như đã đến lúc bước lên các giải đấu lớn. Đặt son môi lên một con lợn không làm cho nó đẹp hơn, trừ khi bạn thuộc loại đó ...

Vấn đề con người

Vấn đề đầu tiên là đồng bộ hóa cam kết. NẾU bạn có nhiều người làm việc trên cùng một mã cùng một lúc, bạn chỉ cần một quy tắc để ngăn chặn sự cố:

Rule 1: Always pull before you merge/rebase

Khi nói đến DVCS, thật khó để thay đổi một nhánh từ xa (tức là kho lưu trữ chính) và rất dễ thực hiện các thay đổi đối với cục bộ. Mỗi người có trách nhiệm làm cho các bổ sung mã của riêng họ phù hợp với tổng thể lớn hơn mà không có vấn đề. Trừ khi 2 người cam kết cùng một lúc, bạn không nên trải nghiệm. Cam kết truy cập vào nguồn gốc / chủ từ xa chỉ nên giới hạn ở một vài nhà phát triển và họ nên kéo các thay đổi từ các nhà phát triển khác thông qua các nhánh theo dõi từ xa.

Vấn đề về mã

Làm thế nào để bạn biết rằng những thay đổi bạn thực hiện không phá vỡ mã?

Câu trả lời đơn giản ... Viết bài kiểm tra để chứng minh họ không. Nếu bạn bỏ qua trường phái tư tưởng TDD (Test Driven Design), toàn bộ điểm kiểm tra là thêm một mức xác minh cho phép bạn thay đổi mã mà không phá vỡ nó.

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

Ngoài ra, toàn bộ các bài kiểm tra nên được chạy trước khi bạn đẩy đến bản gốc / chủ từ xa.

Giữ cam kết của bạn nhỏ và súc tích nhất có thể. Bằng cách đó, nếu bạn cần sao lưu một thay đổi đã phá vỡ thứ gì đó sau này, bạn sẽ tiết kiệm được việc phải thực hiện lại các phần không phá mã.

Bạn có thể cần một số cấu trúc lại tổ chức đầu tiên

Nếu các giải pháp trên không thể dễ dàng được áp dụng, có thể có một số vấn đề với cấu trúc phát triển cần được giải quyết trước tiên.

Chủ dự án nên là người gác cổng. Nếu có sự cố đồng bộ hóa cam kết, có thể có quá nhiều người có quyền truy cập cam kết. Ngay cả trên các dự án lớn như nhân Linux, chỉ một số ít nhà phát triển có quyền truy cập vào kho lưu trữ gốc / từ xa. Thực tế có nhiều cấp kho để quản lý các cam kết. Thay vì một mô hình cam kết một lớp trong đó mọi người đang đẩy các thay đổi của họ về nguồn gốc, mô hình phân cấp có các người gác cổng kéo các thay đổi và xác minh chất lượng của họ trước khi đưa vào dự án. Mô hình cam kết phân cấp có thể mở rộng quy mô lớn hơn và hiệu quả hơn nhiều so với mô hình lớp đơn mà không làm giảm chất lượng.

Đối với các nhà phát triển mà không được cam kết truy cập, họ nên học cách tạo ra các chi nhánh theo dõi từ xa của mình (git và gitorious là tốt cho điều này) để các nhà phát triển người làm đã cam kết truy cập có thể dễ dàng kéo / integrate cành vào gốc. Nếu những thay đổi là nhỏ, các bản vá sẽ hoạt động tốt.

Khả năng kéo các thay đổi trước khi thực hiện hợp nhất / rebase giả định rằng bạn không phát triển trên nhánh chính cục bộ của mình. Cách dễ dàng để xử lý việc này là tạo một lực kéo ban đầu trước khi bạn bắt đầu viết mã, sau đó thực hiện tất cả công việc của bạn trên nhánh đó. Cách khó là phân nhánh nó ngay trước khi hợp nhất và khôi phục lại bản gốc.

Xác định phong cách mã hóa cho tổng thể dự án và làm cho các nhà phát triển tuân theo nó. Các nhà phát triển đóng góp nên viết mã tuân thủ các tiêu chuẩn / định mức của dự án để giảm thiểu việc dọn dẹp. Phong cách mã hóa có thể là một rào cản bản ngã lớn trong một dự án mở. Nếu không có tiêu chuẩn nào được đặt ra, mọi người sẽ viết mã theo kiểu ưa thích của riêng họ và cơ sở mã sẽ trở nên rất xấu rất nhanh.

Huyền thoại về "Tháng đàn ông huyền thoại"

Dù bạn có tin hay không, các dự án nguồn mở lớn hơn / thành công hơn không chạy như một nền dân chủ. Họ chạy như một hệ thống phân cấp. Nói rằng một dự án không thể phát triển hiệu quả ngoài 8-10 nhà phát triển là ngây thơ. Nếu đó là sự thật thì các dự án lớn như Linux Kernel sẽ không tồn tại. Vấn đề sâu xa hơn là việc cho phép mọi người truy cập cam kết chỉ khiến việc giao tiếp trở nên quá khó khăn để xử lý.

Vấn đề của tháng người đàn ông huyền thoại thực sự có thể được khắc phục. Bạn chỉ cần chạy dự án của bạn như quân đội. Có nhiều cấp độ trong hệ thống phân cấp vì kiến ​​thức phổ biến rằng mỗi người thực sự chỉ hiệu quả trong việc quản lý thông tin liên lạc với một số ít người. Miễn là không một cá nhân nào chịu trách nhiệm quản lý công việc của hơn 5 - 7 người, hệ thống có thể mở rộng quy mô vô thời hạn.

Nó có thể hạn chế các nhà phát triển giỏi nhất / có kinh nghiệm thực hiện tích hợp nhiều hơn và thiết kế / lập kế hoạch cấp cao hơn nhưng đó không phải là điều xấu. Một phần của việc nhân rộng là làm cho việc di chuyển để quyết định rằng dự án cần một kế hoạch dài hạn. Những người ở cấp cao nhất có đầu tư lớn nhất (thời gian cũng là một nguồn lực) trong tương lai của các dự án nên được giao trách nhiệm đưa ra các quyết định lớn.

Thật tuyệt khi nghe về một dự án nguồn mở đang trải qua những cơn đau ngày càng tăng. Chúc mừng và chúc may mắn.


-1

sạch / đẹp và quan trọng nhất là mã duy trì lâu dài.

Theo kinh nghiệm của tôi sạch / đẹp là kẻ thù của duy trì. Mã đẹp thường:

  • Có một lớp trên khung giới thiệu mức độ trừu tượng cao hơn
  • Tối ưu hóa cho việc sử dụng lại mã, dẫn đến rất nhiều phụ thuộc
  • Cố gắng giải quyết vấn đề chung thay vì vấn đề cụ thể

Mặt khác, mã duy trì:

  • Được viết trực tiếp trên khung, vì vậy tất cả các nhà phát triển có thể đọc nó
  • Tối ưu hóa cho số lượng phụ thuộc thấp, do đó, thay đổi trong một lĩnh vực không ảnh hưởng đến khu vực khác
  • Không cố gắng giải quyết nhiều vấn đề hơn nó phải

Mô tả mã đẹp của bạn cũng có thể đi đôi với mã có thể bảo trì vì khi bạn giới thiệu mức độ trừu tượng cao hơn và tối ưu hóa mã của bạn để sử dụng lại, đó là cách dễ dàng hơn để duy trì.
Karthik Sreenivasan

Ngoại trừ việc trừu tượng sẽ không chịu được thử thách của thời gian. Và bất kỳ vấn đề nào với sự trừu tượng sẽ nâng một bản sửa lỗi cục bộ thành một bản sửa lỗi có khả năng có tác động trên toàn ứng dụng.
Andomar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.