Làm thế nào nhóm của tôi có thể tránh các lỗi thường xuyên sau khi tái cấu trúc?


20

Để cung cấp cho bạn một nền tảng nhỏ: Tôi làm việc cho một công ty có khoảng mười hai nhà phát triển Ruby on Rails (+/- interns). Công việc từ xa là phổ biến. Sản phẩm của chúng tôi được tạo thành từ hai phần: lõi khá béo và mỏng cho các dự án khách hàng lớn được xây dựng dựa trên nó. Dự án khách hàng thường mở rộng cốt lõi. Ghi đè các tính năng chính không xảy ra. Tôi có thể thêm rằng lõi có một số phần khá xấu đang cần khẩn cấp tái cấu trúc. Có thông số kỹ thuật, nhưng chủ yếu là cho các dự án khách hàng. Phần tồi tệ nhất của lõi chưa được kiểm tra (không phải như vậy ...).

Các nhà phát triển được chia thành hai nhóm, làm việc với một hoặc hai PO cho mỗi lần chạy nước rút. Thông thường, một dự án khách hàng được liên kết chặt chẽ với một trong các nhóm và PO.

Bây giờ vấn đề của chúng tôi: Khá thường xuyên, chúng tôi phá vỡ mọi thứ của nhau. Ai đó từ Đội A mở rộng hoặc tái cấu trúc tính năng cốt lõi Y, gây ra lỗi không mong muốn cho một trong các dự án khách hàng của Đội B. Hầu hết, các thay đổi không được công bố qua các đội, vì vậy các lỗi xảy ra gần như luôn luôn bất ngờ. Đội B, bao gồm PO, đã nghĩ về tính năng Y ổn định và không kiểm tra nó trước khi phát hành, không biết về những thay đổi.

Làm thế nào để thoát khỏi những vấn đề đó? Bạn có thể giới thiệu cho tôi loại 'kỹ thuật thông báo' nào?


34
Câu trả lời rõ ràng là TDD .
mouviciel

1
Làm thế nào đến bạn nêu rằng "ghi đè các tính năng quan trọng không xảy ra", và sau đó vấn đề của bạn là nó không xảy ra? Bạn có phân biệt nhóm của mình giữa "cốt lõi" và "tính năng chính" không, và bạn làm điều đó như thế nào? Chỉ cần cố gắng để hiểu tình hình ...
logc

4
@mouvciel Điều đó và không sử dụng kiểu gõ động , nhưng lời khuyên cụ thể đó đến hơi muộn trong trường hợp này.
Doval

3
Sử dụng một ngôn ngữ được gõ mạnh như OCaml.
Gaius

@logc Có thể tôi không rõ, xin lỗi. Chúng tôi không ghi đè lên một tính năng cốt lõi như chính thư viện bộ lọc, nhưng thêm các bộ lọc mới vào các lớp chúng tôi sử dụng trong các dự án khách hàng của mình. Một kịch bản phổ biến có thể là, những thay đổi trong thư viện bộ lọc sẽ phá hủy những bộ lọc được thêm vào đó trong dự án khách hàng.
SDD64

Câu trả lời:


24

Tôi khuyên bạn nên đọc Làm việc hiệu quả với Bộ luật kế thừa của Michael C. Feathers . Nó giải thích rằng bạn thực sự cần kiểm tra tự động, làm thế nào bạn có thể dễ dàng thêm chúng, nếu bạn chưa có chúng và "mã mùi" để tái cấu trúc theo cách nào.

Bên cạnh đó, một vấn đề cốt lõi khác trong tình huống của bạn có vẻ như thiếu sự giao tiếp giữa hai đội. Những đội này lớn như thế nào? Họ đang làm việc trên các tồn đọng khác nhau?

Hầu như luôn luôn là thực hành tồi để phân chia các đội theo kiến ​​trúc của bạn. Ví dụ, một nhóm cốt lõi và một nhóm không cốt lõi. Thay vào đó, tôi sẽ tạo các nhóm trên miền chức năng, nhưng thành phần chéo.


Tôi đã đọc trong "Tháng huyền thoại" rằng cấu trúc mã thường theo cấu trúc nhóm / tổ chức. Vì vậy, đây không thực sự là "thực hành xấu", mà chỉ là cách mọi thứ thường đi.
Marcel

Tôi nghĩ trong " Động lực phát triển phần mềm ", người quản lý đằng sau Visual C ++ khuyên bạn nên có các nhóm tính năng một cách sinh động; Tôi chưa đọc "Tháng huyền thoại", @Marcel, nhưng AFAIK nó liệt kê các thực tiễn xấu trong ngành ...
logc

Marcel, đúng là đây là cách mọi thứ thường đi hoặc đi, nhưng ngày càng có nhiều đội làm điều đó khác nhau, ví dụ như các đội tính năng. Có các nhóm dựa trên thành phần dẫn đến thiếu giao tiếp khi làm việc trên các tính năng thành phần chéo. Bên cạnh đó, nó hầu như sẽ luôn dẫn đến các cuộc thảo luận về kiến ​​trúc không dựa trên mục đích của một kiến ​​trúc tốt, nhưng mọi người cố gắng đẩy trách nhiệm cho các nhóm / thành phần khác. Do đó, bạn sẽ nhận được tình huống được mô tả bởi tác giả của câu hỏi này. Xem thêm mountaingoatsoftware.com/blog/the-benefits-of-feature-teams .
Tohnmeister

Chà, theo như tôi hiểu về OP, anh ấy đã tuyên bố rằng các đội không được chia thành một đội cốt lõi và không cốt lõi. Các nhóm được chia ra "mỗi khách hàng", về cơ bản là "mỗi miền chức năng". Và đó là một phần của vấn đề: vì tất cả các đội được phép thay đổi cốt lõi chung, các thay đổi từ nhóm này ảnh hưởng đến nhóm khác.
Doc Brown

@DocBrown Bạn nói đúng. Mỗi đội có thể thay đổi cốt lõi. Tất nhiên, những thay đổi đó được cho là có lợi cho từng dự án. Tuy nhiên, họ làm việc trên các tồn đọng khác nhau. Chúng tôi có một cho mỗi khách hàng và một cho cốt lõi.
SDD64

41

Phần tồi tệ nhất của chúng tôi chưa được kiểm tra (vì nó phải là ...).

Đây là vấn đề. Tái cấu trúc hiệu quả phụ thuộc rất nhiều vào bộ kiểm tra tự động. Nếu bạn không có những thứ đó, những vấn đề bạn đang mô tả sẽ bắt đầu xuất hiện. Điều này đặc biệt quan trọng nếu bạn sử dụng ngôn ngữ động như Ruby, nơi không có trình biên dịch để bắt các lỗi cơ bản liên quan đến việc truyền tham số cho các phương thức.


10
Điều đó và tái cấu trúc trong các bước bé và cam kết rất thường xuyên.
Stefan Billiet

1
Có thể có rất nhiều lời khuyên có thể thêm lời khuyên ở đây, nhưng tất cả sẽ đi đến điểm này. Bất kể OPs "như thế nào" cũng phải nói đùa rằng họ biết đó là một vấn đề của chính nó, tác động của thử nghiệm theo kịch bản đối với tái cấu trúc là rất lớn: Nếu một đường chuyền trở thành thất bại, thì việc tái cấu trúc đã không hoạt động. Nếu tất cả các đường chuyền vẫn vượt qua, thì việc tái cấu trúc có thể đã hoạt động (di chuyển không vượt qua rõ ràng sẽ là một điểm cộng, nhưng giữ tất cả các đường chuyền là quan trọng hơn cả mức tăng, một thay đổi phá vỡ một bài kiểm tra và sửa năm điểm có thể là một cải thiện, nhưng không phải là tái cấu trúc)
Jon Hanna

Tôi đã cho bạn "+1", nhưng tôi nghĩ rằng "kiểm tra tự động" không phải là cách tiếp cận duy nhất để giải quyết vấn đề này. Một hướng dẫn tốt hơn, nhưng QA có hệ thống, có thể bởi một nhóm QA riêng biệt cũng có thể giải quyết các vấn đề chất lượng (và có lẽ có ý nghĩa khi thực hiện cả hai - kiểm tra tự động thủ công).
Doc Brown

Một điểm tốt, nhưng nếu lõi và các dự án khách hàng là các mô-đun riêng biệt (và hơn nữa là bằng ngôn ngữ động như Ruby), thì lõi có thể thay đổi cả thử nghiệm và triển khai liên quan của nó và phá vỡ mô-đun phụ thuộc mà không làm hỏng các thử nghiệm của chính nó.
đăng nhập

Như những người khác đã nhận xét. TDD. Bạn có thể đã nhận ra rằng bạn nên có các bài kiểm tra đơn vị cho càng nhiều mã càng tốt. Mặc dù viết các bài kiểm tra đơn vị chỉ vì lợi ích của nó là một sự lãng phí tài nguyên, khi bạn bắt đầu tái cấu trúc bất kỳ thành phần nào, bạn nên bắt đầu bằng cách viết bài kiểm tra mở rộng trước khi chạm vào mã lõi.
jb510

5

Các câu trả lời trước đây chỉ cho bạn các bài kiểm tra đơn vị tốt hơn là tốt, nhưng tôi cảm thấy rằng có thể có nhiều vấn đề cơ bản hơn để địa chỉ. Bạn cần các giao diện rõ ràng để truy cập mã lõi từ mã cho các dự án của khách hàng. Bằng cách này nếu bạn cấu trúc lại mã lõi mà không thay đổi hành vi như được quan sát thông qua các giao diện , mã nhóm khác sẽ không bị hỏng. Điều này sẽ giúp dễ dàng hơn nhiều để biết những gì có thể được tái cấu trúc "một cách an toàn" và những gì cần, có thể phá vỡ giao diện, thiết kế lại.


Tại chỗ trên. Thử nghiệm tự động hơn sẽ không mang lại gì ngoài lợi ích và hoàn toàn đáng làm, nhưng nó sẽ không giải quyết được vấn đề cốt lõi ở đây, đó là sự thất bại trong việc truyền đạt những thay đổi cốt lõi. Việc tách rời bằng cách gói các giao diện quanh các tính năng quan trọng sẽ là một cải tiến rất lớn.
Bob Tway

5

Các câu trả lời khác đã nêu bật các điểm quan trọng (nhiều bài kiểm tra đơn vị, nhóm tính năng, giao diện sạch với các thành phần cốt lõi), nhưng có một điểm tôi thấy thiếu, đó là phiên bản.

Nếu bạn đóng băng hành vi của lõi bằng cách thực hiện bản phát hành 1 và bạn đưa bản phát hành đó vào hệ thống quản lý nhân tạo riêng tư 2 , thì bất kỳ dự án khách hàng nào cũng có thể tuyên bố sự phụ thuộc của nó vào phiên bản lõi X và nó sẽ không bị phá vỡ bởi phiên bản tiếp theo X + 1 .

"Chính sách thông báo" sau đó chỉ giảm bớt việc có tệp THAY ĐỔI cùng với mỗi bản phát hành hoặc có một cuộc họp nhóm để thông báo tất cả các tính năng của mỗi bản phát hành cốt lõi mới.

Ngoài ra, tôi nghĩ bạn cần xác định rõ hơn "lõi" là gì và tập hợp con nào là "khóa". Bạn dường như (chính xác) tránh thực hiện nhiều thay đổi đối với "các thành phần chính", nhưng bạn cho phép thay đổi thường xuyên thành "lõi". Để dựa vào một cái gì đó, bạn phải giữ nó ổn định; nếu một cái gì đó không ổn định, đừng gọi nó là cốt lõi. Có lẽ tôi có thể đề nghị gọi nó là thành phần "người trợ giúp"?

EDIT : Nếu bạn tuân theo các quy ước trong hệ thống Phiên bản ngữ nghĩa , thì mọi thay đổi không tương thích trong API của lõi phải được đánh dấu bằng thay đổi phiên bản chính . Đó là, khi bạn thay đổi hành vi của lõi hiện có trước đó hoặc xóa một cái gì đó, không chỉ thêm một cái gì đó mới. Với quy ước đó, các nhà phát triển biết rằng việc cập nhật từ phiên bản '1.1' lên '1.2' là an toàn, nhưng đi từ '1.X' đến '2.0' là rủi ro và phải được xem xét cẩn thận.

1: Tôi nghĩ rằng đây được gọi là đá quý, trong thế giới của Ruby
2: Tương đương với Nexus trong Java hoặc PyPI trong Python


"Phiên bản" thực sự rất quan trọng, nhưng khi một người cố gắng giải quyết vấn đề được mô tả bằng cách đóng băng lõi trước khi phát hành, thì bạn sẽ dễ dàng kết thúc với nhu cầu phân nhánh & hợp nhất tinh vi. Lý do là trong giai đoạn "xây dựng phát hành" của đội A, A có thể phải thay đổi lõi (ít nhất là để sửa lỗi), nhưng sẽ không chấp nhận thay đổi đối với lõi từ các nhóm khác - vì vậy bạn kết thúc với một nhánh của cốt lõi của mỗi đội, được sáp nhập "sau này", là một dạng nợ kỹ thuật. Điều đó đôi khi ổn, nhưng thường thì nó chỉ hoãn lại vấn đề được mô tả đến một thời điểm muộn hơn.
Doc Brown

@DocBrown: Tôi đồng ý với bạn, nhưng tôi đã viết theo giả định rằng tất cả các nhà phát triển đều hợp tác và trưởng thành. Điều này không có nghĩa là tôi chưa thấy những gì bạn mô tả . Nhưng một phần quan trọng của việc làm cho một hệ thống đáng tin cậy là, tốt, phấn đấu cho sự ổn định. Hơn nữa, nếu đội A cần thay đổi X trong lõi và nhóm B cần thay đổi X trong lõi, thì có lẽ X không thuộc về lõi; Tôi nghĩ đó là điểm khác của tôi. :)
đăng nhập

@DocBrown Có, chúng tôi đã học cách sử dụng một nhánh của lõi cho mỗi dự án của khách hàng. Điều này gây ra một số vấn đề khác. Ví dụ: chúng tôi không muốn 'chạm' vào các hệ thống khách hàng đã triển khai. Kết quả là, họ có thể gặp phải một số phiên bản nhỏ nhảy lõi đã sử dụng sau mỗi lần triển khai.
SDD64

@ SDD64: đó chính xác là những gì tôi đang nói - không tích hợp các thay đổi ngay lập tức vào lõi chung cũng không phải là giải pháp lâu dài. Những gì bạn cần là một chiến lược kiểm tra tốt hơn cho cốt lõi của bạn - với các bài kiểm tra tự động và thủ công là tốt.
Doc Brown

1
Đối với hồ sơ, tôi không ủng hộ một lõi riêng cho mỗi nhóm, cũng không phủ nhận rằng các bài kiểm tra là bắt buộc - nhưng một bài kiểm tra cốt lõi và việc thực hiện nó có thể thay đổi cùng một lúc, như tôi đã nhận xét trước đây . Chỉ một lõi đóng băng, được đánh dấu bằng chuỗi phát hành hoặc thẻ cam kết, có thể dựa vào dự án xây dựng trên nó (không bao gồm sửa lỗi và với điều kiện chính sách phiên bản là âm thanh).
đăng nhập

3

Giống như những người khác đã nói, một bộ kiểm tra đơn vị tốt sẽ không giải quyết vấn đề của bạn: bạn sẽ gặp vấn đề trong khi hợp nhất các thay đổi, ngay cả khi mỗi bộ kiểm tra nhóm vượt qua.

Tương tự đối với TDD. Tôi không thấy làm thế nào nó có thể giải quyết điều này.

Giải pháp của bạn là không kỹ thuật. Bạn cần xác định rõ ràng ranh giới "cốt lõi" và gán vai trò "chó canh gác" cho ai đó, có thể là nhà phát triển chính hoặc kiến ​​trúc sư. Bất kỳ thay đổi nào đối với lõi phải thông qua cơ quan giám sát này. Anh ấy có trách nhiệm đảm bảo mọi đầu ra từ tất cả các đội sẽ hợp nhất mà không có quá nhiều thiệt hại tài sản thế chấp.


Chúng tôi đã có một "con chó canh gác", vì anh ấy đã viết hầu hết cốt lõi. Đáng buồn thay, ông cũng chịu trách nhiệm cho hầu hết các phần chưa được kiểm tra. Anh ta bị YAGNI mạo danh và đã được thay thế nửa năm trước bởi hai kẻ khác. Chúng tôi vẫn đấu tranh để tái cấu trúc những 'phần tối' đó.
SDD64

2
Ý tưởng là có một bộ thử nghiệm đơn vị cho lõi , là một phần của lõi , với sự đóng góp của tất cả các đội, không phải là các bộ thử nghiệm riêng biệt cho mỗi nhóm.
Doc Brown

2
@ SDD64: bạn dường như nhầm lẫn "Bạn không cần (chưa)" (đó là một điều rất tốt) với "Bạn không cần phải làm sạch mã của mình" - đó là một thói quen cực kỳ xấu và IMHO hoàn toàn ngược lại.
Doc Brown

Giải pháp watchdog thực sự, thực sự không tối ưu, IMHO. Nó giống như xây dựng một điểm thất bại duy nhất vào hệ thống của bạn, và trên hết là một điểm rất chậm, bởi vì nó liên quan đến một người và chính trị. Mặt khác, TDD tất nhiên có thể giúp đỡ với vấn đề này: mỗi bài kiểm tra lõi là một ví dụ cho dự án của khách hàng về cách sử dụng lõi hiện tại. Nhưng tôi nghĩ rằng bạn đã đưa ra câu trả lời của mình một cách thiện chí ...
logc

@DocBrown: Được rồi, có thể cách hiểu của chúng tôi khác nhau. Các tính năng cốt lõi, được viết bởi anh ta, quá phức tạp để đáp ứng ngay cả những khả năng kỳ lạ nhất. Hầu hết trong số họ, chúng tôi không bao giờ gặp phải. Sự phức tạp làm chúng ta chậm lại để tái cấu trúc chúng, ở phía bên kia.
SDD64

2

Là một sửa chữa dài hạn hơn, bạn cũng cần giao tiếp tốt hơn và kịp thời hơn giữa các đội. Mỗi nhóm sẽ sử dụng, ví dụ, tính năng cốt lõi Y, cần tham gia vào việc xây dựng các bản thử nghiệm được lên kế hoạch cho tính năng này. Kế hoạch này, về bản thân, sẽ làm nổi bật các trường hợp sử dụng khác nhau vốn có trong tính năng Y giữa hai đội. Khi tính năng này hoạt động như thế nào được đóng đinh và các bản thử nghiệm được triển khai và đồng ý, sẽ có một thay đổi bổ sung trong sơ đồ triển khai của bạn. Nhóm phát hành tính năng được yêu cầu để chạy thử nghiệm, không phải nhóm sắp sử dụng tính năng này. Nhiệm vụ, nếu có, điều đó sẽ gây ra va chạm, là việc bổ sung một bản thử nghiệm mới từ một trong hai đội. Khi một thành viên trong nhóm nghĩ về một khía cạnh mới của tính năng chưa được thử nghiệm, họ nên được tự do thêm một bản thử nghiệm mà họ đã xác minh chuyển qua trong hộp cát của riêng họ. Theo cách này, các va chạm duy nhất sẽ xảy ra sẽ ở cấp độ ý định và nên được đóng đinh trước khi tính năng tái cấu trúc được phát hành vào tự nhiên.


2

Mặc dù mọi hệ thống đều cần các bộ kiểm thử hiệu quả (có nghĩa là, trong số những thứ khác, tự động hóa) và trong khi các thử nghiệm này, nếu được sử dụng hiệu quả, sẽ nắm bắt được các xung đột này sớm hơn hiện tại, nhưng điều này không giải quyết được các vấn đề tiềm ẩn.

Câu hỏi cho thấy ít nhất hai vấn đề tiềm ẩn: thực tiễn sửa đổi "lõi" để đáp ứng các yêu cầu cho từng khách hàng và sự thất bại của các nhóm trong việc giao tiếp và phối hợp ý định của họ để thay đổi. Cả hai điều này đều là nguyên nhân gốc rễ, và bạn sẽ cần phải hiểu tại sao điều này được thực hiện trước khi bạn có thể khắc phục nó.

Một trong những điều đầu tiên được xác định là liệu cả nhà phát triển và nhà quản lý có nhận ra có vấn đề ở đây hay không. Nếu ít nhất một số người làm, thì bạn cần tìm hiểu lý do tại sao họ nghĩ rằng họ không thể làm bất cứ điều gì về nó, hoặc chọn không làm. Đối với những người không, bạn có thể cố gắng tăng khả năng dự đoán hành động hiện tại của họ có thể tạo ra vấn đề trong tương lai hoặc thay thế họ bằng những người có thể. Cho đến khi bạn có một lực lượng lao động nhận thức được mọi thứ đang diễn ra như thế nào, bạn không có khả năng khắc phục vấn đề (và có lẽ thậm chí là không, ít nhất là trong thời gian ngắn.)

Có thể khó phân tích vấn đề theo thuật ngữ trừu tượng, ít nhất là ban đầu, vì vậy hãy tập trung vào một sự cố cụ thể dẫn đến sự cố và cố gắng xác định xem nó đã xảy ra như thế nào. Vì những người liên quan có khả năng phòng thủ, bạn sẽ cần cảnh giác với những lời biện minh tự phục vụ và hậu hoc để tìm hiểu điều gì đang thực sự xảy ra.

Có một khả năng mà tôi ngần ngại đề cập vì rất khó xảy ra: yêu cầu của khách hàng rất khác nhau đến mức không đủ điểm chung để biện minh cho mã lõi được chia sẻ. Nếu điều này là như vậy, thì bạn thực sự có nhiều sản phẩm riêng biệt và bạn nên quản lý chúng như vậy, và không tạo ra một khớp nối nhân tạo giữa chúng.


Trước khi chúng tôi di chuyển sản phẩm của mình từ Java sang RoR, chúng tôi thực sự đã làm như bạn đề xuất. Chúng tôi đã có một lõi Java cho tất cả các khách hàng, nhưng các yêu cầu của họ đã "phá vỡ" nó một ngày và chúng tôi phải chia nó ra. Trong tình huống đó, chúng tôi đã phải đối mặt với các vấn đề như: 'Anh bạn, khách hàng Y có một tính năng cốt lõi tốt như vậy. Quá tệ, chúng tôi không thể chuyển nó cho khách hàng Z, vì lõi của họ không tương thích '. Với Rails, chúng tôi hoàn toàn muốn thực hiện chính sách "một lõi cho tất cả". Nếu phải, chúng tôi vẫn cung cấp những thay đổi mạnh mẽ, nhưng những điều đó làm mất lòng khách hàng khỏi bất kỳ cập nhật nào khác.
SDD64

Chỉ gọi TDD dường như là không đủ với tôi. Vì vậy, bên cạnh việc chia tách gợi ý cốt lõi, tôi thích câu trả lời của bạn nhất. Đáng buồn thay, cốt lõi không được kiểm tra hoàn hảo, nhưng điều đó sẽ không giải quyết được tất cả các vấn đề của chúng tôi. Thêm các tính năng cốt lõi mới cho một khách hàng có vẻ hoàn toàn tốt và thậm chí cung cấp bản dựng xanh cho họ, vì chỉ các thông số kỹ thuật cốt lõi được chia sẻ giữa các khách hàng. Người ta không để ý, điều gì xảy ra với mọi khách hàng có thể. Vì vậy, tôi thích đề xuất của bạn để tìm hiểu các vấn đề và nói về những gì gây ra chúng.
SDD64

1

Chúng ta đều biết rằng các bài kiểm tra đơn vị là con đường để đi. Nhưng chúng ta cũng biết rằng thực tế phù hợp với những thứ này vào cốt lõi là khó khăn.

Một kỹ thuật cụ thể có thể hữu ích cho bạn khi mở rộng chức năng là cố gắng tạm thời và xác minh cục bộ rằng chức năng hiện tại không bị thay đổi. Điều này có thể được thực hiện như thế này:

Mã giả gốc:

def someFunction
   do original stuff
   return result
end

Mã kiểm tra tại chỗ tạm thời:

def someFunctionNew
   new do stuff
   return result
end

def someFunctionOld
   do original stuff
   return result
end

def someFunction
   oldResult = someFunctionOld
   newResult = someFunctionNew
   check oldResult = newResult
   return newResult
end

Chạy phiên bản này thông qua bất kỳ bài kiểm tra cấp hệ thống nào tồn tại. Nếu mọi thứ đều ổn, bạn biết rằng bạn đã không phá vỡ mọi thứ và sau đó có thể tiến hành xóa mã cũ. Lưu ý rằng khi bạn kiểm tra kết quả cũ và kết quả mới, bạn cũng có thể thêm mã để phân tích sự khác biệt để nắm bắt các trường hợp mà bạn biết phải khác nhau do thay đổi có chủ đích như sửa lỗi.


1

"Hầu hết, các thay đổi không được công bố qua các đội, vì vậy các lỗi xảy ra gần như luôn luôn bất ngờ"

Vấn đề truyền thông có ai không? Điều gì về (ngoài những gì mọi người khác đã chỉ ra, rằng bạn nên kiểm tra nghiêm ngặt) để đảm bảo rằng có giao tiếp phù hợp? Mọi người được biết rằng giao diện họ đang viết sẽ thay đổi trong phiên bản tiếp theo và những thay đổi đó sẽ là gì?
Và cung cấp cho họ quyền truy cập vào ít nhất một giao diện giả (với triển khai trống) càng sớm càng tốt trong quá trình phát triển để họ có thể bắt đầu viết mã của riêng mình.

Nếu không có tất cả những điều đó, các bài kiểm tra đơn vị sẽ không làm được gì nhiều, ngoại trừ chỉ ra trong giai đoạn cuối cùng có một cái gì đó vượt trội giữa các bộ phận của hệ thống. Bạn muốn biết điều đó, nhưng bạn muốn biết điều đó sớm, rất sớm và để các nhóm nói chuyện với nhau, phối hợp nỗ lực và thực sự có quyền truy cập thường xuyên vào công việc mà nhóm khác đang thực hiện (vì vậy, thường xuyên cam kết, không phải là một khối lớn cam kết sau vài tuần hoặc vài tháng, 1-2 ngày trước khi giao hàng).
Lỗi của bạn KHÔNG nằm ở mã, chắc chắn không phải ở mã của nhóm khác mà không biết bạn đang làm rối tung giao diện mà họ đang viết. Lỗi của bạn là trong quá trình phát triển của bạn, thiếu giao tiếp và hợp tác giữa mọi người. Chỉ vì bạn đang ngồi trong các phòng khác nhau không có nghĩa là bạn nên cách ly mình với những người khác.


1

Chủ yếu, bạn có một vấn đề giao tiếp (có lẽ cũng liên quan đến vấn đề xây dựng đội ngũ ), vì vậy tôi nghĩ rằng một giải pháp cho trường hợp của bạn nên tập trung vào ... tốt, giao tiếp, thay vì các kỹ thuật phát triển.

Tôi chấp nhận rằng không thể đóng băng hoặc rẽ nhánh mô-đun lõi khi bắt đầu một dự án khách hàng (nếu không thì bạn chỉ cần tích hợp trong lịch trình công ty của bạn một số dự án không liên quan đến khách hàng nhằm cập nhật mô-đun lõi).

Vì vậy, chúng tôi còn lại với vấn đề cố gắng cải thiện giao tiếp giữa các đội. Điều này có thể được giải quyết theo hai cách:

  • với con người. Điều này có nghĩa là công ty của bạn chỉ định ai đó là kiến trúc sư mô-đun cốt lõi (hoặc bất kỳ biệt ngữ nào tốt cho quản lý cấp cao), người sẽ chịu trách nhiệm về chất lượng và tính sẵn có của mã. Người này sẽ hóa thân vào cốt lõi. Do đó, cô sẽ được chia sẻ bởi tất cả các đội và đảm bảo sự đồng bộ thích hợp giữa họ. Hơn nữa, cô cũng nên đóng vai trò là người đánh giá mã được cam kết với mô-đun cốt lõi để duy trì sự gắn kết của nó;
  • với các công cụ và quy trình làm việc. Bằng cách áp đặt Tích hợp liên tục vào lõi, bạn sẽ biến mã lõi thành phương tiện truyền thông. Điều này sẽ đòi hỏi một số nỗ lực trước tiên (bằng cách bổ sung các bộ kiểm tra tự động trên đó) nhưng sau đó các báo cáo CI hàng đêm sẽ là một bản cập nhật trạng thái tổng thể của mô-đun lõi.

Bạn có thể tìm hiểu thêm về CI như một quá trình giao tiếp ở đây .

Cuối cùng, bạn vẫn có vấn đề với việc thiếu đội ngũ làm việc ở cấp công ty. Tôi không phải là một fan hâm mộ lớn của các sự kiện xây dựng đội nhóm, nhưng đây có vẻ là một trường hợp hữu ích. Bạn có các cuộc họp toàn nhà phát triển một cách thường xuyên không? Bạn có thể mời mọi người từ các đội khác đến hồi tưởng dự án của bạn không? Hoặc có lẽ đôi khi có một số bia tối thứ sáu?

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.