Làm thế nào tôi có thể định lượng số nợ kỹ thuật tồn tại trong một dự án?


67

Có ai biết nếu có một số loại công cụ để đặt một số vào nợ kỹ thuật của một cơ sở mã, như một loại số liệu mã? Nếu không, có ai biết về một thuật toán hoặc tập hợp các heuristic cho nó không?

Nếu cả hai điều đó không tồn tại cho đến nay, tôi sẽ quan tâm đến ý tưởng làm thế nào để bắt đầu với một thứ như vậy. Đó là, làm thế nào tôi có thể định lượng được khoản nợ kỹ thuật phát sinh theo một phương thức, một lớp, một không gian tên, một tổ hợp, v.v.

Tôi quan tâm nhất đến việc phân tích và đánh giá cơ sở mã C #, nhưng xin vui lòng đồng ý với các ngôn ngữ khác, đặc biệt nếu các khái niệm là ngôn ngữ siêu việt.


12
Nợ kỹ thuật xuất phát từ các quyết định, không phải mã. Nó tích lũy vì lựa chọn quản lý xấu. Không rõ ràng rằng "phương thức, một lớp, một không gian tên, một tổ hợp" có chứa nợ kỹ thuật. Họ đại diện cho một trách nhiệm pháp lý khi có một sự lựa chọn tốt hơn có sẵn.
S.Lott

7
Tôi sẽ lập luận (trong bối cảnh ẩn dụ của nợ) rằng các nhà quản lý có thể là chủ nợ, nhưng các tạo phẩm mã đại diện cho việc định giá nợ và có thể được định lượng. Đó là, tôi đồng ý rằng các nhà quản lý có thể đưa ra quyết định như "quên kiểm tra đơn vị vì chúng tôi không có thời gian" và do đó phát sinh nợ kỹ thuật. Nhưng, tôi chắc chắn nghĩ rằng bạn có thể đặt một số cho các phần tử mã riêng lẻ như một heuristic. Hãy nghĩ về nó theo cách này - nếu quản lý đưa ra một loạt các quyết định khủng khiếp cho tương lai, nhưng không có mã nào được viết, liệu có khoản nợ nào vào lúc đó không?
Erik Dietrich

3
"có khoản nợ nào tại thời điểm đó không?" Nợ cần phải tích lũy, bạn đúng. Nhưng nó không phải là mã; đó là khối lượng "công việc" được thực hiện cần phải hoàn tác. Thông số kỹ thuật, thiết kế, mã, DBA-work, tất cả đều phải được làm lại. Đo lường nợ từ các tạo phẩm phần mềm (như dòng mã nguồn) tương tự như dự đoán chi phí phát triển.
S.Lott

7
Đo lường nợ kỹ thuật là khó, cộng với nó gây nhầm lẫn cho các nhà quản lý. Tuy nhiên, tôi có thể cho bạn biết một cách tốt để chống lại nợ kỹ thuật: các nguyên mẫu rẻ, đẹp và hoạt động, đặc biệt nếu cơ sở mã xoay quanh GUI. Như Joel đề xuất ở đây: joelonsoftware.com/articles/fog0000000332.html , hãy dành một chút thời gian mỗi ngày để dọn dẹp mọi thứ. Sự thay đổi phải là những cải tiến tích cực, chứ không phải "OMG, nợ kỹ thuật của chúng tôi = pentablobs và nó đang tăng theo cấp số nhân với tốc độ ... bầu trời đang sụp đổ." Chỉ cần dành một chút thời gian mỗi ngày cho kaizen theo cách không phá vỡ những thứ hoạt động. Kết bạn.
Công việc

6
@ZoranPavlovic Tình huống khó xử sai lầm kỳ lạ và không được yêu cầu của bạn đang thiếu một lựa chọn thứ ba: Tôi muốn biết liệu có công cụ nào cố gắng định lượng nợ kỹ thuật hay không.
Erik Dietrich

Câu trả lời:


38

Nợ kỹ thuật chỉ là một ý tưởng trừu tượng rằng, ở đâu đó dọc theo các dòng thiết kế, xây dựng, thử nghiệm và bảo trì một hệ thống, một số quyết định đã được đưa ra để sản phẩm trở nên khó kiểm tra và bảo trì hơn. Có nhiều nợ kỹ thuật hơn đồng nghĩa với việc tiếp tục phát triển hệ thống sẽ trở nên khó khăn hơn - bạn cần phải đối phó với nợ kỹ thuật và phân bổ ngày càng nhiều thời gian hơn cho những nhiệm vụ đơn giản hoặc bạn cần đầu tư nguồn lực (thời gian và tiền) vào việc giảm nợ kỹ thuật bằng cách tái cấu trúc mã, cải thiện các bài kiểm tra, v.v.

Có một số số liệu có thể cung cấp cho bạn một số dấu hiệu về chất lượng của mã:

  • Mã số bảo hiểm. Có nhiều công cụ khác nhau cho bạn biết bao nhiêu phần trăm chức năng, câu lệnh và dòng của bạn được bao phủ bởi các bài kiểm tra đơn vị. Bạn cũng có thể ánh xạ các kiểm tra hệ thống và chấp nhận trở lại các yêu cầu để xác định tỷ lệ phần trăm các yêu cầu được bao phủ bởi một thử nghiệm cấp hệ thống. Phạm vi bảo hiểm phù hợp phụ thuộc vào bản chất của ứng dụng.
  • Khớp nốisự gắn kết . Mã thể hiện khớp nối thấp và độ gắn kết cao thường dễ đọc, dễ hiểu và kiểm tra hơn. Có các công cụ phân tích mã có thể báo cáo số lượng khớp nối và sự gắn kết trong một hệ thống nhất định.
  • Độ phức tạp theo chu kỳ là số lượng đường dẫn duy nhất thông qua một ứng dụng. Nó thường được tính ở cấp độ phương thức / chức năng. Độ phức tạp theo chu kỳ có liên quan đến tính dễ hiểu và khả năng kiểm tra của một mô-đun. Không chỉ các giá trị độ phức tạp chu kỳ cao hơn chỉ ra rằng ai đó sẽ gặp nhiều rắc rối hơn khi theo mã, mà độ phức tạp theo chu kỳ cũng chỉ ra số lượng các trường hợp thử nghiệm cần thiết để đạt được phạm vi bảo hiểm.
  • Các biện pháp phức tạp khác nhau của Halstead cung cấp cái nhìn sâu sắc về tính dễ đọc của mã. Chúng đếm các toán tử và toán hạng để xác định khối lượng, độ khó và nỗ lực. Thông thường, những điều này có thể cho biết mức độ khó khăn của việc ai đó nhận mã và hiểu mã, thường là trong các trường hợp như xem xét mã hoặc nhà phát triển mới cho cơ sở mã.
  • Số lượng mã trùng lặp. Mã trùng lặp có thể chỉ ra tiềm năng tái cấu trúc cho các phương thức. Có mã trùng lặp có nghĩa là có nhiều dòng hơn cho một lỗi được giới thiệu và khả năng cao hơn là các lỗi tương tự tồn tại ở nhiều nơi. Nếu cùng một logic kinh doanh tồn tại ở nhiều nơi, việc cập nhật hệ thống để tính toán các thay đổi sẽ trở nên khó khăn hơn.

Thông thường, các công cụ phân tích tĩnh sẽ có thể cảnh báo bạn về các vấn đề tiềm ẩn. Tất nhiên, chỉ vì một công cụ chỉ ra một vấn đề không có nghĩa là có vấn đề - cần có sự phán đoán của con người để xác định xem có vấn đề gì xảy ra không. Các số liệu này chỉ cung cấp cho bạn các cảnh báo rằng có lẽ đã đến lúc xem xét một hệ thống hoặc mô-đun chặt chẽ hơn.

Tuy nhiên, các thuộc tính này tập trung vào mã. Họ không sẵn sàng chỉ ra bất kỳ khoản nợ kỹ thuật nào trong kiến ​​trúc hoặc thiết kế hệ thống của bạn có thể liên quan đến các thuộc tính chất lượng khác nhau.


1
Tôi hiện đang sử dụng các số liệu mã NDepend ( ndepend.com ), CodeRush và VS để theo dõi các số liệu bạn đề cập (ngoại trừ các biện pháp Halstead, mà tôi sẽ xem xét thêm). Tôi đã nghĩ rằng tôi có thể sử dụng một số sự hợp nhất của các số liệu này để cố gắng đưa một số loại vào một yếu tố mã nhất định mà gần như chỉ ra, trong nháy mắt, nó tốn kém như thế nào cho sự phát triển đang diễn ra.
Erik Dietrich

@ErikDietrich Bạn có thể có thể, nhưng tôi có thể sẽ không định lượng được giá trị đó. Có lẽ một báo cáo kiểu "tóm tắt điều hành" về những gì các công cụ số liệu của bạn nói với bạn, liên quan đến những thay đổi theo thời gian, sẽ phù hợp hơn.
Thomas Owens

2
Một số liệu đơn giản khác tôi muốn thêm vào danh sách là số lượng TODO / HACK / WTF? nhận xét trong một cơ sở mã ...
MaR

@Mar Giả sử rằng bạn sử dụng đúng cách và không chơi chúng vì lợi thế của bạn. Muốn có thêm thời gian để dọn dẹp cơ sở mã, chỉ cần thêm những nhận xét này vào nơi chúng không phù hợp. Đừng quan tâm đến codebase, chỉ cần loại bỏ chúng khỏi nơi cần có. Bình luận có thể nói dối, mã không thể.
Thomas Owens

1
@Thomas Owens: đã đồng ý, nhưng hầu như bất kỳ số liệu nào cũng có thể bị lừa. Nếu được sử dụng đúng và trung thực, "số liệu TODO" cung cấp tổng quan giá rẻ về mã nào thực sự bị thiếu hoặc nên thay đổi (= nợ vô hình đối với các số liệu chỉ dựa trên mã).
MaR

23

Sonar có một khoản nợ kỹ thuật heuristic cũng như một số tính năng khác hữu ích cho một dự án phần mềm.

Nó cũng hỗ trợ một loạt các ngôn ngữ.

SonarQube (trước đây là Sonar ) là một nền tảng nguồn mở để Kiểm tra liên tục chất lượng mã ...

  • Hỗ trợ hơn 25 ngôn ngữ: Java, C / C ++, C #, PHP, Flex, Groovy, JavaScript, Python, PL / SQL, COBOL, v.v.
  • SonarQube cũng được sử dụng trong Android Deveopment.
  • Cung cấp các báo cáo về mã trùng lặp, tiêu chuẩn mã hóa, kiểm tra đơn vị, phạm vi mã, mã phức tạp, lỗi tiềm ẩn, nhận xét và thiết kế và kiến ​​trúc.
  • Cỗ máy thời gian và quan điểm khác biệt.
  • Phân tích hoàn toàn tự động: tích hợp với Maven, Ant, Gradle và các công cụ tích hợp liên tục (Atlassian Bamboo, Jenkins, Hudson, v.v.).
  • Tích hợp với môi trường phát triển Eclipse
  • Tích hợp với các công cụ bên ngoài: JIRA, Mantis, LDAP, Fortify, v.v.
  • Có thể mở rộng với việc sử dụng các plugin.
  • Triển khai phương pháp SQALE để tính nợ kỹ thuật ...

1
Tuyệt thật, cảm ơn nhé! Tôi có và sử dụng NDepend cho công việc C # của mình, nhưng tôi cũng làm một chút công việc Java và cũng quan tâm đến các số liệu ở đó. Ít nhất, điều này mang lại cho tôi chức năng cho Java và nó có thể trở thành một bổ sung tốt cho NDepend.
Erik Dietrich

Thật tuyệt vời, chúng tôi sử dụng Sonar nơi tôi làm việc và nó thực hiện một số điều thực sự tốt mang đến cho bạn cái nhìn sâu sắc về trạng thái của cơ sở mã của bạn.
Robert Greiner

2
@ErikDietrich, FYI Sonar cũng có plugin C # .
Péter Török

@ErikDietrich FYI hiện đã có plugin NDepend cho Sonar ndepend.com/docs/sonarqube-integration-ndepend
Patrick Smacchia - NDepend dev

Có sự thay thế nguồn mở?
Hellboy

5

Tôi ghét sử dụng một sự tương tự từ tài chính nhưng nó có vẻ thực sự thích hợp. Khi bạn định giá một thứ gì đó (tài sản thuộc bất kỳ loại nào), nó có thể có cả giá trị bên trong và bên ngoài. Trong trường hợp này, mã hiện tại có giá trị nội tại sẽ là một đại lượng tương ứng với chất lượng tương đối của mã đã nói và nó cũng sẽ có giá trị bên ngoài (giá trị từ những gì có thể được thực hiện đối với mã) và các đại lượng đó sẽ là phụ gia. Giá trị nội tại có thể được chia thành các khoản tín dụng và ghi nợ (tốt so với xấu) bằng bất kỳ phương pháp nào bạn đang sử dụng để chấm điểm mã (+5 cho nhận xét / khả năng đọc, -10 cho phạm vi bảo hiểm mã, v.v.)

Tôi chắc chắn không biết bất kỳ công cụ nào định lượng điều này ngày hôm nay và tôi nghĩ rằng bạn sẽ có một cuộc thảo luận hoàn toàn mới trong tay nếu bạn tranh luận về các chiến lược "định giá nợ" khác nhau nhưng tôi đồng ý với Matthew - khoản nợ là chi phí tích lũy để có được mã tốt nhất có thể có được, sử dụng bất kỳ phương pháp nào bạn sử dụng để tiêu tốn thời gian cần thiết để đạt được điều đó.

Một điều khác cần xem xét là chắc chắn có một thước đo về hiệu quả chi phí, theo đó khi gần hơn với "sự hoàn hảo", giá trị của một giờ dành cho cơ sở mã nhiều hơn có thể giảm theo cấp số nhân nên có thể có một vấn đề tối ưu hóa bổ sung tối đa hóa tiện ích của công việc được thực hiện.


Đúng vậy, khái niệm lợi nhuận cận biên giảm dần chắc chắn là điều mà tôi muốn giải quyết khi đưa ra và tinh chỉnh số liệu. Vì vậy, không chỉ "đây là lý lẽ khách quan của tôi để tái cấu trúc lớp này từ góc độ kinh doanh" mà còn "đây là lý do của tôi vì đã không làm phiền vào thời điểm này."
Erik Dietrich

5

Ở giữa các nhà phát triển, một biện pháp khá đáng tin cậy về nợ kỹ thuật dường như là WTFs / phút .

Vấn đề với "số liệu" này là việc giao tiếp "bên ngoài" thường khá khó khăn.

Số liệu làm việc cho tôi trong việc truyền nợ kỹ thuật cho "người ngoài" là số lượng thử nghiệm và nỗ lực sửa lỗi (đặc biệt là để sửa lỗi hồi quy ) cần thiết để giao hàng thành công.

Một lời cảnh báo: mặc dù cách tiếp cận này khá mạnh mẽ, người ta sẽ kiểm tra kỹ hơn với WTFs/ phút trước khi sử dụng nó. Điều quan trọng là, nó khá cồng kềnh: để có được dữ liệu, người ta phải theo dõi cẩn thận thời gian và đăng nhập chính xác theo từng danh mục phù hợp.

  • Tổng cộng đã dành 3 tuần để thực hiện tính năng A dễ dàng hơn nhiều so với
     
    tôi đã dành 14 giờ để thực hiện dự thảo tính năng A sau đó 29 giờ để kiểm tra khói sau đó 11 giờ để thực hiện các bản sửa lỗi cho hồi quy tôi đã phát hiện ra, sau đó 18 giờ để kiểm tra QA -được thực hiện tính năng. Sau đó, các chàng trai QA đã dành 17 giờ để thử nghiệm bản phát hành ứng cử viên ban đầu. Sau đó, tôi đã dành 13 giờ để phân tích các lỗi do QA gửi cho bản phát hành ứng cử viên ban đầu và 3 giờ để thực hiện các bản sửa lỗi. Sau đó, tôi đã dành 11 giờ để kiểm tra khói những thay đổi tôi đã thực hiện để phát hành ứng cử viên ban đầu. Sau đó...

Dù sao dữ liệu về thử nghiệm và nỗ lực sửa lỗi đã khá dễ dàng để giao tiếp theo kinh nghiệm của tôi.

Để phát hành gần đây, chúng tôi đã dành khoảng 90% thời gian để thử nghiệm và sửa lỗi hồi quy. Đối với bản phát hành tiếp theo, đề nghị phân bổ một số nỗ lực để giảm giá trị này xuống 60-70%.


Một lời cảnh báo khác. Dữ liệu như 90% ở trên có thể được hiểu không chỉ là một dấu hiệu của nợ kỹ thuật, mà còn (bất ngờ bất ngờ) là dấu hiệu của một người không thành thạo về lập trình / công nghệ cụ thể. "Bạn chỉ tạo ra quá nhiều lỗi trong mã của bạn".

Nếu có nguy cơ dữ liệu bị hiểu sai theo cách đó, sẽ giúp có thêm một dữ liệu tham khảo về một thứ ít WTF dễ so sánh hơn.

  • Giả sử nếu có hai thành phần / ứng dụng tương tự được duy trì bởi cùng một nhà phát triển, lần đầu tiên phát hành với "tỷ lệ lãng phí" khoảng 50% và lần thứ hai là 80-90, thì điều này tạo ra một trường hợp khá mạnh đối với vấn đề thứ hai là nợ kỹ thuật.

Nếu có những người kiểm tra chuyên dụng trong dự án, họ cũng có thể đóng góp cho việc đánh giá khách quan hơn về dữ liệu. Như tôi đã đề cập trong một câu trả lời khác ,

Với người kiểm tra, bạn có được ai đó sao lưu sự hiểu biết của bạn về các vấn đề thiết kế. Khi chỉ có các nhà phát triển phàn nàn về chất lượng mã , điều này thường nghe giống như các WTF chủ quan từ phía sau cánh cửa đóng kín .
 
Nhưng khi điều này được lặp lại bởi anh chàng QA nói rằng component Acó 100 lỗi hồi quy cho 10 tính năng mới, trái ngược với component B10 lỗi hồi quy trên 20 tính năng mới , giao tiếp đột nhiên chuyển sang một trò chơi khác.


2
Tôi thích câu trả lời này rất nhiều. Với bộ phận QA chuyên dụng, tỷ lệ khuyết tật hồi quy với các khiếm khuyết mới rất đơn giản để tính toán và chắc chắn có thể cho bạn biết rất nhiều về nợ kỹ thuật.
Erik Dietrich

4

Tôi nghĩ câu hỏi là chi phí bao nhiêu để "mua lại" khoản nợ kỹ thuật của bạn - nghĩa là, cần bao nhiêu công sức để khắc phục nó? Vâng, tùy thuộc vào đội để tìm ra điều đó.

Trong quá trình lập kế hoạch nước rút, tôi yêu cầu nhóm ước tính mức độ phức tạp của việc sửa các khoản nợ kỹ thuật giống như cách họ ước tính mức độ phức tạp của câu chuyện người dùng. Vào thời điểm đó, đây là một trò chơi đàm phán giữa nhóm chủ sở hữu sản phẩm để xác định khoản nợ kỹ thuật nào có mức độ ưu tiên đủ cao để thực hiện trong giai đoạn nước rút hiện tại (thay thế câu chuyện người dùng thực tế) và điều gì có thể chờ đợi.

Nếu bạn không làm scrum, tôi sẽ dính vào tiền đề của tôi - nợ kỹ thuật nên được đo bằng chi phí của biện pháp khắc phục.


Vì vậy, trong bối cảnh các điểm câu chuyện, có công bằng không khi nói rằng bạn có thể thêm một vài điểm vào mỗi câu chuyện nếu có một mức nợ kỹ thuật cao được đại diện bởi các khu vực bị ảnh hưởng của mã? Đó là, nếu câu chuyện X liên quan đến việc thêm vào phần tử mã Y, điều này thật tồi tệ, bạn đã giải quyết một vài điểm cho câu chuyện cụ thể vì bản chất của Y? Và số điểm đó có giống hoặc liên quan đến số điểm cần thực hiện sửa lỗi mà bạn đã đề cập ước tính không?
Erik Dietrich

1
@Erik Dietrich - Chà, TD chắc chắn là thêm sự phức tạp cho giải pháp. Khó khăn có thể là việc sửa chữa TD piecemeal có thể tốn kém hơn một giải pháp bán buôn. Do đó, có thể bạn có 3 câu chuyện sẽ được xếp hạng 5 mỗi câu nếu TD bị loại, nhưng 8 câu chuyện có nợ - vì vậy có thêm tới 9 điểm TD. Nhiệm vụ để sửa chữa toàn bộ TD (không phân biệt câu chuyện) thực sự có thể là 8. Vì vậy, bạn có thể lập luận rằng giải pháp bán buôn có chi phí thấp hơn (8) so với từng phần (9). Đây sẽ là một phần của cuộc đàm phán
Matthew Flynn

Điều đó có ý nghĩa. Và, chắc chắn, điều tôi mong muốn là tạo ra một trường hợp khách quan (phần nào) để nói điều gì đó như "trong một năm, chúng ta có thể phát triển các tính năng mới của X nếu chúng ta tiếp tục tiến lên, nhưng X + Y sẽ có các tính năng mới nếu chúng ta trả một số khoản nợ kỹ thuật này ".
Erik Dietrich

2

Có một nền tảng khá mạnh ngoài kia gọi là CASTđể tìm kiếm nợ kỹ thuật trong các ứng dụng lớn. Chúng tôi đã sử dụng nó trong một dự án nơi chúng tôi đã tiếp quản một sự cải tiến lớn cho một hệ thống cũ. Nó không cho bạn biết những gì trong đầu người đã viết mã, nhưng nó kiểm tra mã và tìm ra lỗi và mã kiến ​​trúc, sau đó định lượng cho nợ kỹ thuật nếu bạn muốn. Tuy nhiên, việc sử dụng thực sự trong việc xem xét điều này không phải là số tiền $ mà là danh sách các vấn đề đã có trong mã. Điều này cho bạn biết về một phần của khoản nợ kỹ thuật mà bạn có (vì vậy tôi không đồng ý với một số câu trả lời ở trên). Có một số khoản nợ kỹ thuật hoàn toàn dựa trên thiết kế và rất chủ quan - như nội dung khiêu dâm - bạn biết điều đó khi bạn nhìn thấy nó và biết bối cảnh. Tôi sẽ tranh luận liệu đó có thực sự là nợ "kỹ thuật" hay không. Có một số khoản nợ kỹ thuật hoàn toàn trong việc thực hiện và tôi tin rằng '


Tôi đã chia sẻ câu hỏi này trên twitter và ai đó đã trả lời khi nói về CAST. Tôi không thực sự rõ ràng về tất cả những gì nó làm sau khi kiểm tra trang web của họ. Có phiên bản miễn phí hoặc bản demo nào để dùng thử, dù sao đi nữa?
Erik Dietrich

2

Đây là một hội thảo trực tuyến của MIT mô tả nghiên cứu về nợ kỹ thuật trong các hệ thống phần mềm lớn: http://sdm.mit.edu/news/news_articles/webinar_050613/sturtevant-webinar-technical-debt.html

Các tác giả đã viết mã để phân tích một dự án và rút ra các số liệu 'độ phức tạp kiến ​​trúc'. Các số liệu này đã được chứng minh là có mối quan hệ chặt chẽ với mật độ khiếm khuyết, năng suất của nhà phát triển và doanh thu của nhân viên phát triển.

Công trình được mô tả trong Hội thảo trên web dựa trên nghiên cứu mô đun được thực hiện bởi Alan MacCormack và Carliss Baldwin tại Trường Kinh doanh Harvard. Tôi sẽ xem xét giấy tờ của họ là tốt. "Chi phí nhân giống" của họ có thể là những gì bạn đang tìm kiếm.


1

Tôi muốn nói rằng các số liệu mã tiêu chuẩn có thể được sử dụng như một quan điểm tương đối cấp cao về tình trạng mắc nợ kỹ thuật. VS Ultimate bao gồm Trình phân tích mã sẽ cung cấp cho bạn "Chỉ số duy trì" dựa trên độ phức tạp theo chu kỳ, khớp nối, LoC và độ sâu của kế thừa. Bạn có thể đi sâu vào bất kỳ điểm rắc rối nào và xem chi tiết (xuống mức chức năng). Tôi mới chạy nó trong dự án của mình và điểm số thấp nhất chúng tôi đạt được là 69 trên gói Dữ liệu của chúng tôi (định cấu hình và khởi tạo EF) và Test Suite của chúng tôi. Mọi thứ khác là 90 trở lên. Có những công cụ khác sẽ cung cấp cho bạn nhiều số liệu hơn như những công cụ được thảo luận trong PPP của chú Bob


Vì vậy, giả sử bạn có thứ gì đó không có trong bộ kiểm tra hoặc gói dữ liệu đạt điểm dưới 90. Bạn có ngưỡng số mà bạn nói, "được rồi, điều đó không đủ tốt và chúng tôi sẽ tái cấu trúc"? Hoặc, bạn có sử dụng thông tin này để đưa ra trường hợp quản lý hoặc một số bên liên quan rằng việc tái cấu trúc là cần thiết không? Đó là, các nhà quản lý / các bên liên quan có quan tâm đến chỉ số bảo trì của Microsoft hay bạn trình bày thông tin đó theo một cách khác? Hoặc, bạn chỉ không trình bày nó và lặng lẽ khắc phục vấn đề trên của riêng bạn?
Erik Dietrich

Tôi thích câu hỏi đó. Câu trả lời của tôi sẽ luôn là việc viết mã tốt nhất bạn có thể không phải là điều bạn xin phép làm. Tôi sử dụng cái mà chú Bob gọi là "quy tắc tẩy chay" (luôn để mã trong tình trạng tốt hơn so với khi bạn đến) và tôi gọi tái cấu trúc cơ hội. Ý tưởng là khi bạn phải sửa đổi mã hiện có, hãy dành thời gian để a) che nó trong các bài kiểm tra đơn vị b) tái cấu trúc nó để sạch hơn. Michael Feathers làm việc hiệu quả với Legacy Code cung cấp một số hướng dẫn để làm điều này.
Michael Brown

@ Mike-Điều đó sẽ khiến bạn bị sa thải trong nhiều môi trường phát triển nơi kiểm soát chặt chẽ tất cả các thay đổi mã được theo dõi và giám sát. Đặc biệt là nếu sự cải thiện dường như vô hại của bạn mà không ai nói với bạn rằng cuối cùng đã phá vỡ thứ gì đó đã từng làm việc.
Dunk

Lưu ý tôi đã không nói lặn trong và willy-nilly làm sạch mã. Tôi đã nói để dọn sạch mã mà bạn đang làm việc. Tôi cũng đã làm việc với mã được kiểm soát chặt chẽ (được chỉ định một mục công việc, phải cung cấp danh sách các thay đổi được thực hiện để giải quyết mục công việc để phê duyệt, thực hiện các thay đổi được phê duyệt ). 9/10 lần giải thích việc tái cấu trúc trong yêu cầu thay đổi sẽ dẫn đến sự chấp thuận.
Michael Brown

0

Tôi sẽ không nghĩ về nợ kỹ thuật là đô la khi bạn cần một mô hình ưa thích để định lượng nó. Tôi sẽ nghĩ về nó như ủng hộ. Nếu ai đó làm bạn một việc và bạn có khả năng quên, bạn viết nó ra. Khi bạn cắt ngắn, viết nó xuống. Điều này giúp bạn ghi nhớ, và bất lực hơn buộc bạn phải thừa nhận nó. Không có công cụ ưa thích là cần thiết. Notepad hoặc Ecxel có thể thực hiện các mẹo.


2
Từ góc độ realpolitik, tôi sẽ lập luận rằng những người sẵn sàng chịu đựng sự tồi tệ lâu dài cho kết quả ngắn hạn có lẽ cũng là những người ít có khả năng ghi lại quyết định của họ. Vì vậy, tôi đồng ý với ý tưởng của bạn trên lý thuyết, nhưng tôi nghĩ rằng "những người yêu cầu ưu tiên" nối tiếp sẽ ít có khả năng theo dõi sự cân bằng của các ưu đãi.
Erik Dietrich

@ErikDietrich - Tôi đồng ý. Và những kẻ phạm tội hàng loạt tồi tệ hơn thậm chí không biết họ đang thêm vào khoản nợ của mình. (Tương tự như những người phạm tội thẻ tín dụng tồi tệ nhất phá vỡ xếp hạng tín dụng của họ.) Nhưng điểm khởi đầu giả định mong muốn định lượng, và thật khó để người không viết bài định lượng nó. Bạn không biết phân của nó ở đâu trừ khi đó là con chó của bạn, hoặc bạn tình cờ bước vào đó.
MathAttack

0

Tôi làm việc cho một công ty đang xem xét chính xác điều này. Dưới đây là 3 số liệu có thể hành động mà chúng tôi khuyên bạn nên xem xét khi xử lý nợ kỹ thuật. Để biết thêm thông tin về "cách" và "khi nào" để theo dõi chúng, chúng tôi tập hợp một bài viết tóm tắt 3 Số liệu để hiểu và giải quyết nợ kỹ thuật .

Quan điểm của bạn là gì? Rất vui được trả lời bất kỳ câu hỏi nào và khao khát được nghe phản hồi của bạn :).

Quyền sở hữu để ngăn ngừa khuyết điểm và nợ công nghệ không mong muốn

Quyền sở hữu là một chỉ số hàng đầu của sức khỏe kỹ thuật.

Các phần của codebase nhận được sự đóng góp từ nhiều người tích lũy hành trình theo thời gian, trong khi những phần nhận được đóng góp từ ít người hơn có xu hướng ở trạng thái tốt hơn. Việc duy trì các tiêu chuẩn cao trong một nhóm chặt chẽ được thông tin đầy đủ về một phần của cơ sở mã là dễ dàng hơn.

Điều này cung cấp một số sức mạnh dự đoán: các bộ phận thuộc sở hữu yếu của codebase có khả năng tích lũy nợ theo thời gian và ngày càng khó làm việc. Cụ thể, có khả năng nợ vô tình bị xử lý , đơn giản chỉ là tác dụng phụ của thông tin không đầy đủ và quyền sở hữu chất lượng của mã bị pha loãng.

Điều này hơi giống với bi kịch của chung .

Sự gắn kết để cải thiện kiến ​​trúc

Sự gắn kết là một chỉ số kéo dài của các thành phần được xác định rõ.

Sự gắn kết và đối tác của nó, khớp nối, từ lâu đã được công nhận là khái niệm quan trọng cần tập trung khi thiết kế phần mềm.

Mã được cho là có sự gắn kết cao khi hầu hết các yếu tố của nó thuộc về nhau. Sự gắn kết cao thường được ưa thích hơn vì nó liên quan đến khả năng bảo trì, tái sử dụng và mạnh mẽ. Độ gắn kết cao và khớp nối lỏng lẻo có xu hướng đi đôi với nhau.

Ngoài việc được liên kết với mã có thể tái sử dụng và duy trì nhiều hơn, sự gắn kết cao cũng giảm thiểu số lượng người cần tham gia để sửa đổi một phần nhất định của cơ sở mã giúp tăng năng suất.

Churn để xác định khu vực có vấn đề

Churn (hoạt động lặp đi lặp lại) giúp xác định và xếp hạng các khu vực chín muồi để tái cấu trúc trong một hệ thống đang phát triển.

Khi các hệ thống phát triển, các nhà phát triển sẽ khó hiểu kiến ​​trúc của họ hơn. Nếu các nhà phát triển phải sửa đổi nhiều phần của cơ sở mã để cung cấp một tính năng mới, họ sẽ khó tránh khỏi việc đưa ra các tác dụng phụ dẫn đến lỗi và họ sẽ làm việc kém hiệu quả hơn vì họ cần làm quen với nhiều yếu tố và khái niệm hơn.

Đây là lý do tại sao điều quan trọng là phải phấn đấu cho một trách nhiệm duy nhất để tạo ra một hệ thống ổn định hơn và tránh những hậu quả không lường trước được. Mặc dù một số tệp là trung tâm kiến ​​trúc và vẫn hoạt động khi các tính năng mới được thêm vào, bạn nên viết mã theo cách mang lại sự đóng cửa cho các tệp và xem xét nghiêm ngặt, kiểm tra và kiểm tra các khu vực khuấy QA.

Churn hiển thị các tệp đang hoạt động này để bạn có thể quyết định xem chúng có nên được chia nhỏ để giảm diện tích bề mặt thay đổi trong cơ sở mã của bạn hay không.


-1

Nếu bạn có một lịch sử tốt thông qua một bugtracker hoặc một loại phần mềm nhanh nhẹn nào đó, bạn có thể giữ cho nó đơn giản. Thời gian dành để hoàn thành các nhiệm vụ cơ bản. Ngoài ra, độ tin cậy của các ước tính khi dự án còn trẻ so với bây giờ.

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.