Có phải là một ý tưởng tốt để sắp xếp thời gian thường xuyên để làm sạch mã? [đóng cửa]


42

Tôi đang quản lý một nhóm nhỏ các nhà phát triển. Mỗi khi chúng tôi quyết định chúng tôi sẽ dành một hoặc hai ngày để dọn sạch mã của mình.

Sẽ là một ý tưởng tốt để sắp xếp thời gian thường xuyên, giả sử 1 tuần cứ sau 2 tháng, chỉ để dọn sạch cơ sở mã của chúng tôi?


9
Trước tiên tôi muốn bắt đầu đăng ký tất cả những thứ cần dọn dẹp trong một công cụ theo dõi vấn đề . Phân tích các vấn đề được ghi trong trình theo dõi có thể đưa ra một ý tưởng tốt hơn (tốt hơn nhiều) về cách tiếp cận phù hợp nhất cho một dự án cụ thể
gnat 18/03/13

4
Sẽ là một ý tưởng tốt hơn để sắp xếp thời gian thường xuyên cho đánh giá mã
l46kok 18/03/13

1
Ý bạn là gì khi bạn nói 'dọn dẹp'? Có phải nó đang chỉnh sửa mã hoặc xử lý tất cả các thẻ FIXME và TODO hoặc nhận được nhiều hiệu suất hơn từ mã được viết nhanh? Hay cái gì khác? Bất kỳ trong số này có thể được phân loại là dọn dẹp nhưng tôi sẽ đính kèm các ưu tiên khác nhau cho mỗi trong số chúng.
paul

Một "đóng cửa như quá phổ biến", hả, các bạn?
MGOwen

Câu trả lời:


100

Không.

Khắc phục sự cố trong khi bạn đang làm việc với nó:

  • Nếu bạn chờ đợi để cấu trúc lại bit bạn đang làm việc, bạn sẽ quên rất nhiều về nó và phải dành thời gian để làm quen với nó một lần nữa.
  • Bạn sẽ không kết thúc mã "mạ vàng" mà cuối cùng không bao giờ được sử dụng vì các yêu cầu đã thay đổi

2
Tiền của tôi cho câu trả lời này ..
Soner Gönül 18/03/13

2
+1 cho câu trả lời xuất sắc. Bạn sẽ không kết thúc mã "mạ vàng" mà cuối cùng không bao giờ được sử dụng vì các yêu cầu đã thay đổi
Md Mahbubur Rahman 18/03/13

8
Trên một dự án hoàn hảo với quản lý hoàn hảo và một nhóm các nhà phát triển đồng đều tuyệt vời, câu trả lời này sẽ có hiệu lực. Thật không may, tôi chưa bao giờ thấy hoặc nghe về một dự án như vậy trong mười năm trong ngành.
Ben

3
Cố gắng làm điều này nhưng khi bạn không thể (và nó sẽ xảy ra do áp lực thời gian hoặc vì đơn giản là bạn không biết làm thế nào cho đúng, chưa) tạo một vé trong hệ thống vé của bạn. Bằng cách này, bạn có thể hy vọng quay trở lại với nó trong khi vấn đề vẫn còn mới mẻ trong tâm trí bạn và không chỉ khi cuối cùng nó bắt đầu gây ra vấn đề.
Sarien 18/03/13

1
Tôi nghĩ rằng đây là lời khuyên tốt, nhưng không giải quyết câu hỏi được hỏi. Haivng quản lý một đội có cơ sở mã khủng khiếp (thật kinh khủng trước khi tôi đến đó). Đó là thời gian rất tốt dành để giải quyết tái cấu trúc và làm sạch các chức năng cụ thể. Chúng tôi gọi chúng là các dự án cơ sở hạ tầng và đưa chúng vào mọi giai đoạn nước rút có thể. Thường thì những thứ này là những thứ không phải là một phần của sự thay đổi khác, nhưng là những thứ mà nhóm đã xác định là khu vực có vấn đề. Chúng tôi đã thực hiện hồi cứu hàng quý và sẽ cập nhật danh sách này thường xuyên.
Bill Leeper

21

Ý kiến ​​cá nhân của tôi: Nó hoàn toàn cần thiết cho 90% dự án.

Riêng đối với các dự án bị chi phối nhiều bởi doanh số, thường sẽ có một sự thúc đẩy lớn bao gồm các tính năng mới trong mỗi bản phát hành, và chắc chắn bạn sẽ phải thỏa hiệp bản năng tốt hơn của mình và giới thiệu một vài bản hack / hack ở đây và đó.

Cuối cùng, bạn đã tích lũy đủ 'nợ kỹ thuật' thông qua những thỏa hiệp nhỏ này mà cuối cùng bạn đã dành một lượng thời gian hợp lý để xử lý các lỗ hổng trong cơ sở mã và không thể sử dụng hết tiềm năng của nó.

Thông thường có hai loại vấn đề được tạo theo cách này:

  • Những cái nhỏ có thể dễ dàng sửa nhưng có thể mang tính hệ thống, ví dụ như các tham số được đặt tên không đúng, xử lý lỗi không đầy đủ, v.v. Chúng thường sẽ có ít tác động bên ngoài khối mã nơi chúng xuất hiện. Cách tốt nhất để giải quyết những vấn đề này là đánh giá mã và kiểm tra mã khi nó được viết / sửa đổi. Như những người khác đã tuyên bố, không cần thiết phải dành một chu kỳ tái cấu trúc đặc biệt để sửa các lỗi này.
  • Những cái lớn có thể phát sinh từ các thông số kỹ thuật chưa hoàn chỉnh hoặc các quyết định thiết kế kém từ sớm hoặc hai nhà phát triển / nhóm tạo ra hai giải pháp khác nhau cho cùng một vấn đề. Chúng thường khó sửa hơn và đòi hỏi nỗ lực phối hợp để khắc phục. Kết quả là chúng thường được hoãn lại, cho đến khi trở thành một mối phiền toái vĩnh viễn. Những loại vấn đề đòi hỏi một khoảng thời gian dành riêng để khắc phục.

Tôi thường cố gắng dành thời gian cho một chu kỳ tái cấu trúc / sửa lỗi thuần túy cứ sau 3 đến 4 chu kỳ. Tôi luôn yêu cầu các nhà phát triển của tôi nói với tôi khi họ cảm thấy thất vọng với cơ sở mã. Không phải mọi nhà phát triển đều phải nỗ lực dọn dẹp - bạn thường có thể (nhưng không phải luôn luôn) làm choáng các nhóm một chút, vì vậy chỉ có một nhóm làm việc dọn dẹp tại bất kỳ thời điểm nào.


1
Tôi không hiểu số lần đẩy lớn là một vấn đề nhanh.
JeffO 18/03/13

2
@JeffO Không, đó không phải là vấn đề nhanh. Đó là một vấn đề quản lý. Từ những gì tôi đã thấy, các công ty bị ảnh hưởng nặng nề bởi doanh số có xu hướng hấp dẫn các chu kỳ phát hành mạnh mẽ và các bộ tính năng lớn. Các chiến lược nhanh nhẹn có xu hướng hấp dẫn các công ty này (cho dù họ có thực sự tuân theo chiến lược hay không). Mặc dù tôi thích phát triển nhanh, nhưng kinh nghiệm của tôi đã chỉ ra rằng khi một công ty tự gọi mình là 'nhanh nhẹn', điều đó thường có nghĩa là tôi có thể mong đợi sẽ thấy một khoản nợ kỹ thuật khá lớn trong cơ sở mã.
pswg

Tôi đoán nếu họ không có phương pháp nào cả, họ có thể tự gọi mình bất cứ điều gì họ muốn. Vì nhanh nhẹn, là từ thông dụng hiện tại, nó hấp dẫn nhất. Đã được một lúc kể từ khi tôi tham gia một dự án thác nước; đó là một thảm họa theo nhiều cách khác nhau, đến nỗi tôi không bao giờ sử dụng nó như một lý lẽ chống lại phương pháp luận.
JeffO 18/03/13

Trong bất kỳ dự án nào, nhanh nhẹn hay không, tái cấu trúc và làm sạch mã là điều bạn làm khi bạn đi, để liên tục giữ các khoản nợ kỹ thuật ở mức tối thiểu. Nếu bạn không tính đến điều đó trong ước tính của mình, bạn sẽ phải bắt đầu làm điều đó. Bạn không thể để nợ kỹ thuật tích lũy cho đến khi bạn cần dừng mọi thứ để khắc phục. Thay vào đó hãy tuân theo quy tắc trinh sát: "Luôn để mã sạch hơn bạn đã tìm thấy."
Christoffer Hammarström

Theo kinh nghiệm của tôi, các nhóm thiếu kinh nghiệm bắt đầu với scrum, mà không tuân thủ các nguyên tắc mã hóa tốt (như XP), đôi khi có thể bị tập trung quá nhiều vào chức năng (các câu chuyện). Thay vào đó, họ nên nói rằng một câu chuyện không được thực hiện cho đến khi mã 'đủ', nhưng không phải ai cũng có đủ xương sống để làm điều đó theo thời hạn sắp tới. Và với Agile, bạn có xu hướng có nhiều thời hạn hơn trong thời gian ngắn hơn, vì vậy tôi cũng liên kết nó với các phương thức Agile, trong khi tôi hoàn toàn biết rằng chúng không phải là nguyên nhân.
markijbema

11

Tôi có các nhà phát triển của mình dọn dẹp mã của họ trước khi đăng ký (Subversion) hoặc hợp nhất với nhánh phát triển chính (Git).

Tôi có họ làm như sau:

  • Xóa các bình luận không liên quan
  • Đảm bảo rằng các phương thức, đối số và biến của chúng được đặt tên thích hợp
  • Hãy chắc chắn rằng có cấu trúc cho các lớp và các mục của chúng được gói gọn như chúng cần
  • Tái cấu trúc để cải thiện khả năng đọc và giảm bất kỳ mùi mã nào

Đối với các dự án lớn hơn, mã được xem xét chính thức trước khi sáp nhập từ nhánh phát triển sang nhánh chính.

Tôi nghĩ rằng "dành thời gian" sẽ có nghĩa là nó có thể bị trì hoãn hoặc bị hoãn lại do số lượng công việc liên quan. Bằng cách yêu cầu các nhà phát triển thực hiện trên mỗi lần đăng ký (tương đương với yêu cầu / vấn đề thay đổi trong JIRA), việc quản lý sẽ dễ dàng hơn nhiều.


Chỉ tò mò: Tại sao bạn sử dụng hai VCS khác nhau?
Eekhoorn 18/03/13

2
Đã có / là một giai đoạn di cư. Chúng tôi đã di chuyển hầu hết các kho SVN bây giờ, tôi đã đề cập đến cả hai cho một số bối cảnh.
Sam

Đây là những gì tôi làm. Làm sạch mã trước khi đăng ký và cấu trúc lại mã nếu tôi quay lại mã để cải thiện chức năng.
Barfieldmv

1
Điều này sẽ không giải quyết những vấn đề dai dẳng đang ẩn giấu trong các khu vực có thể không phải là một phần của yêu cầu tính năng từ nhóm sản phẩm.
Bill Leeper

9

Không theo ý kiến ​​của tôi. Nếu bạn để quá nhiều thời gian giữa khi bạn gặp phải nợ công nghệ và khi bạn sửa nó, bạn sẽ mất bối cảnh của vấn đề là gì. Phải mất nhiều thời gian để sửa chữa, và nó có xu hướng được sửa chữa tồi tệ hơn. Quan trọng nhất, mọi người rời khỏi các cửa sổ bị hỏng vì đó không phải là "tuần dọn dẹp".

Cá nhân, tôi thương lượng để xóa nợ kỹ thuật mỗi lần chạy nước rút nếu tôi biết chúng tôi đã tạo ra một số trong lần chạy nước rút trước đó. Nó giữ cho món nợ luôn mới mẻ trong tâm trí mọi người. Nó giới hạn số lượng mã sử dụng mã vấn đề để việc tái cấu trúc dễ dàng hơn. Nó ngăn ngừa nợ kỹ thuật chồng chất. Và nó giúp thúc đẩy các nhà phát triển từ việc tát một cái gì đó lại với nhau, bởi vì tôi sẽ khiến họ làm điều đó ngay lần chạy nước rút tiếp theo (vì vậy cũng có thể làm điều đó ngay từ đầu).


Câu thứ hai của bạn mâu thuẫn với câu đầu tiên. Bạn nói không, nhưng sau đó nói bạn làm những việc này vào mỗi lần chạy nước rút. Theo cách đó là sắp xếp thời gian để làm điều đó.
Bill Leeper

2
@BillLeeper - tăng cường. Khi tôi nghe "thời gian thường xuyên" có nghĩa là có một khoảng thời gian thường xuyên để làm công việc dọn dẹp. IMO, điều đó không chính xác - tất cả thời gian là thời điểm thích hợp để thực hiện công việc dọn dẹp.
Telastyn

1
Điểm tốt, tôi đồng ý rằng thời gian thường xuyên không hoạt động tốt. Quá thường xuyên các ưu tiên khiến nó bị hủy, v.v.
Bill Leeper 18/03/13

4

Tôi chắc chắn sẽ nói có, với một điều kiện: nó nên được thực hiện thường xuyên, tốt nhất là trên cơ sở hàng tuần. Tôi tin rằng một đánh giá mã thường xuyên theo lịch trình cùng với việc thực sự hành động đối với các mặt hàng ra khỏi đánh giá mã sẽ được thanh toán rất nhanh. Xem câu trả lời của pswg

1 tuần cứ sau 2 tháng chắc chắn là không đủ. Điều này nói lên hầu hết các câu trả lời khác, những người trả lời 'Không' cho câu hỏi của bạn. Điểm chính của hầu hết các câu trả lời này là nếu bạn chờ quá lâu, bạn sẽ không còn liên lạc được với mã và thường mất nhiều thời gian hơn để sửa / dọn / tái cấu trúc.


Chúng tôi làm một "Thứ ba nợ kỹ thuật" cho việc này. Nửa chặng đường của nó đã ném một tuần làm việc của Israel và cho phép chúng tôi lùi lại một bước để giải quyết các vấn đề
Zachary K

1

Nó không rõ ràng nếu thỉnh thoảng bạn có nghĩa là một bài tập mã sạch bổ sung. Theo nghĩa đó, có. Những gì chúng ta thực hiện theo, một số suy thoái luôn xảy ra.

Bạn không nên sử dụng lý do đó để không làm điều đúng đắn [Áp dụng các nguyên tắc RẮN, kiểm tra đơn vị liên quan, kiểm tra, v.v.] ngay từ đầu.


1

Tôi nghĩ rằng hai câu trả lời "Không" "Có" phổ biến hiện nay là hai khía cạnh của cùng một sự thật. Hãy nhớ rằng OP đang nói về một nhóm mà anh ấy đang quản lý, không chỉ là cá nhân. Chúng tôi không thể cho rằng tất cả các nhà phát triển trong nhóm đều đủ kỷ luật để viết mã sạch, dễ đọc; và có vấn đề về áp lực bên ngoài và phương pháp luận nhanh nhẹn. Ngoài ra, ngay cả với những nỗ lực tốt nhất của mọi người, sự khác biệt trong phong cách của họ sẽ có nghĩa là họ có thể viết mã được coi là sạch khi tách rời, nhưng ô uế khi được xem xét cùng với những người khác (không đề cập đến các giao diện khó hiểu).

Mặt khác, "sửa nó trong khi làm việc với nó" theo ý kiến ​​của tôi là một lý tưởng để khao khát. Bạn có thể làm cho mã của mình trở nên "cố định" hơn nữa bằng cách

  • cẩn thận ngang hàng
  • viết bài kiểm tra đơn vị cùng với chính mã
  • áp dụng hướng dẫn mã hóa
  • sử dụng công cụ định dạng và linters tự động (nhưng YMMV)
  • Vân vân.

Bây giờ, nếu nhóm của OP chấp nhận những điều trên và nếu anh ta khuyến khích cấp dưới của mình - ví dụ như trong quá trình đánh giá mã và trong các phiên làm sạch mã định kỳ - để cố gắng lường trước những cạm bẫy và tránh sự xấu xí trước, anh ta sẽ hy vọng ít hơn thời gian dọn dẹp (Và sau đó họ có thể dành thời gian đó cho tài liệu, tái cấu trúc sâu hơn và chia sẻ kiến ​​thức về những gì họ đã viết và hợp nhất.)


1

Tôi nghĩ lập lịch trình thời gian thường xuyên là rất tốt cho dù đó là một nhiệm vụ trong một dự án phong cách thác nước thông thường, hoặc những câu chuyện trong một nhanh nhẹn. Có một thời gian định sẵn có thể không có giá trị như chỉ làm việc theo lịch trình của bạn. Điều này cho phép bạn hoàn thành nó như một phần của lịch trình so với việc hủy ngày dọn dẹp vì bạn bị chậm trễ trong dự án.

Sau khi quản lý một dự án có số nợ mã rất lớn, việc thực hiện chúng một cách thường xuyên là chìa khóa để mọi thứ hoạt động trơn tru. Một số thứ của chúng tôi rất lớn, một số thì nhỏ.

Sau một vài tháng làm việc như vậy, trưởng nhóm điều hành của chúng tôi đã nói với tôi rằng mọi thứ đều trôi chảy như thế nào.

Mỗi mặt hàng có vẻ không nhiều, nhưng cũng giống như tất cả các khoản nợ, nó quảng cáo lên.


1

Câu trả lời lý tưởng là Không, bởi vì bạn thực hiện các bước cần thiết để tránh làm điều này trở nên cần thiết (dọn dẹp khi bạn đi cùng vì một số lý do đã nêu).

Đây có thể là mục tiêu cuối cùng, nhưng bạn có thể có một đội còn lâu mới đưa điều này vào thực tế.

Người quản lý phải chịu một số trách nhiệm Không phải lúc nào cũng là lỗi của nhà phát triển. Các nhà quản lý có thể nói một điều, nhưng họ bắt đầu thúc đẩy các dự án hoàn thành và đưa ra các đề xuất thúc đẩy các thực tiễn xấu. Họ có thể nói theo nghĩa đen, "chúng ta sẽ dọn sạch nó sau" hoặc nếu nó hoạt động, điều đó đủ tốt.

Bạn có thể phải bắt đầu với việc dành một thời gian cụ thể để cho thấy điều này rất quan trọng. Một khi bạn biết nhóm của bạn có khả năng làm sạch mã của họ (không phải là nhất định), thì bạn có thể cố gắng kết hợp nó thường xuyên hơn.

Cuối cùng, bạn không cần phải thiết lập thời gian.

Cá nhân, tôi đấu tranh với việc giải quyết một vấn đề mới và khiến nó hoạt động trong khi cố gắng giữ mọi thứ gọn gàng. Tôi đang trở nên tốt hơn về nó, nhưng thường nghỉ ngơi có chủ ý và dọn dẹp mọi thứ. Đó là một suy nghĩ khác biệt đối với tôi. Cuối cùng, các thực hành vững chắc trở thành thói quen.


-1

Không, bạn nên làm điều này trong khi bạn đang viết mã. Điều này được gọi là tái cấu trúc nếu bạn đang sử dụng TDD. Vấn đề khi bạn đợi một hoặc hai tháng để sửa và làm sạch mã của bạn là bạn có thể thay đổi hành vi mã vì bạn không nhớ mọi đoạn mã của mình.

Tôi đề nghị tái cấu trúc dựa trên mã hóa trước tiên là mã cần thiết để làm cho một cái gì đó hoạt động và ngay khi nó hoạt động thiết kế lại nó, tối ưu hóa nó và làm cho nó đẹp hơn.


Điều này được gọi là tái cấu trúc cho dù bạn có sử dụng TDD hay không. Câu hỏi này không liên quan gì đến TDD ...
Ben Lee
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.