Tổ chức thiếu mã, bẩn?


22

Tôi muốn hỏi bạn một số câu hỏi về mã bẩn. Có một số người mới bắt đầu mã hóa trên một dự án vừa. Mã là một quả bóng bùn rất lớn. Họ không phải là những lập trình viên tiên tiến. Họ chỉ biết sử dụng bàn phím một chút về java. Họ chỉ viết mã với 12 000 dòng trong lớp chính của họ, tuy nhiên, 6 000 dòng thuộc về chính NetBeans.

Công việc của tôi là phân tích mã và đề xuất một cách tốt để duy trì mã. Ý tưởng của tôi là loại bỏ dự án và bắt đầu một dự án mới với phương pháp OOP. Gần đây tôi đã thu thập một số ghi chú và ý tưởng về vấn đề này, từ trang web này và một số người khác.

Bây giờ, tôi có các câu hỏi sau:

  1. Chúng ta có nên sửa mã và đổi nó thành OOP không? Chúng tôi đang gỡ lỗi nó.
  2. Mã này không có ý kiến, không có tài liệu, không có phong cách lập trình cụ thể, v.v. Thay đổi nó thực sự tốn kém và mất thời gian. Chúng ta có thể làm gì về điều này?
  3. Làm cách nào tôi có thể dạy họ tuân theo tất cả các quy tắc (nhận xét, OOP, chất lượng mã tốt, v.v.)?
  4. Mã bị lỗi và dễ bị lỗi. Chúng ta có thể làm gì? Kiểm tra? Chúng tôi gần như viết hai hoặc ba bài báo A4 để sửa, nhưng dường như là vô tận.

Tôi phải nói rằng tôi là người mới với họ. Tôi nghĩ rằng tôi cũng đã phá vỡ các quy tắc về việc thêm người quá muộn vào dự án. Bạn có nghĩ rằng tôi phải rời bỏ họ?


Điều này cần phải được chia thành hai hoặc ba câu hỏi, hiện tại nó quá rộng.
Jon Hopkins

2
Dự án này có được kiểm soát phiên bản không?
JBRWilkinson

2
Là mã hiện tại trong sản xuất?
JeffO

Vâng Jeff. Nó là một sản xuất, một dự án quản lý để quản lý một vấn đề tài chính!
Salivan

Xin lỗi JBR, họ đã không nghe thấy một điều như thế. Chỉ cần tạo một bản sao của mã dán sao chép trên tất cả các đĩa cứng là kỹ thuật của họ để thực hiện kiểm soát phiên bản.
Salivan

Câu trả lời:


36

Bước 0: Sao lưu vào SCM

Bởi vì, như được gợi ý bởi JBRWilkinson trong các bình luận, kiểm soát phiên bản là tuyến phòng thủ đầu tiên của bạn chống lại thảm họa (không thể đảo ngược).

Cũng sao lưu chi tiết cấu hình phần mềm, quy trình để tạo phân phối, v.v ...

Bước 1: Kiểm tra đầu tiên

Sau đó bắt đầu bằng cách viết bài kiểm tra :

  • cho những gì hoạt động,
  • và cho những gì thất bại.

Bất kể bạn quyết định làm gì, bạn đều được bảo vệ. Bây giờ bạn có thể:

  • bắt đầu từ đầuviết lại ,
  • hoặc sửa nó.

Lời khuyên của tôi sẽ là bắt đầu kiến ​​trúc chung từ đầu , nhưng trích xuất từ mớ hỗn độn các bộ phận xác nhận điểm kiểm tra và cấu trúc lại những thứ này khi bạn thấy phù hợp.

Bước 2: Xác minh và giám sát

Thiết lập hệ thống Tích hợp liên tục (để bổ sung cho bước 0bước 1 ) VÀ hệ thống Kiểm tra liên tục (để chuẩn bị cho bước 4 ).

Bước 3: Đứng trên vai người khổng lồ

(như bạn luôn luôn nên ...)

Bước 4: Làm sạch

Việc đó không cần phải nói, nhưng thay vì đọc lướt qua mã, bạn có thể chỉ muốn chạy linters / phân tích tĩnh và các công cụ khác trên cơ sở mã bị hỏng để tìm lỗi trong thiết kế và khi triển khai.

Sau đó, bạn cũng có thể muốn chạy một trình định dạng mã, điều đó sẽ giúp một chút với việc dọn phòng.

Bước 5: Xem lại

Thật dễ dàng để giới thiệu các lỗi nhỏ bằng cách tái cấu trúc hoặc dọn dẹp mọi thứ. Nó chỉ có một lựa chọn sai và nhấn nhanh vào một phím, và bạn có thể xóa một cái gì đó khá quan trọng mà không nhận ra lúc đầu. Và đôi khi hiệu ứng sẽ xuất hiện chỉ vài tháng sau đó. Tất nhiên, các bước trên giúp bạn tránh điều này (đặc biệt là bằng cách triển khai khai thác thử nghiệm mạnh), nhưng bạn không bao giờ biết những gì có thể và sẽ vượt qua. Vì vậy, hãy đảm bảo rằng các phép tái cấu trúc của bạn được xem xét bởi ít nhất một cặp bóng mắt chuyên dụng khác (và tốt nhất là nhiều hơn thế).

Bước 6: Chứng minh tương lai Quy trình phát triển của bạn

Lấy tất cả những điều trên và biến nó thành một phần vốn có của quá trình phát triển thông thường của bạn, nếu nó chưa có. Đừng để điều này xảy ra một lần nữa trên đồng hồ của bạn và cùng với nhóm của bạn thực hiện các biện pháp bảo vệ trong quy trình của bạn và thực thi điều này (nếu điều đó thậm chí có thể) trong chính sách của bạn. Làm cho sản xuất Mã sạch là một ưu tiên.


Nhưng thực sự, thử nghiệm . Rất nhiều .


Một gợi ý tuyệt vời - không quan trọng bạn gây thiệt hại gì nếu bạn có các bài kiểm tra có thể bắt được các vấn đề. Tất nhiên, tất cả chúng ta đều cho rằng họ đã kiểm soát phiên bản ..
JBRWilkinson

@JBRWilkinson: điểm tốt thực sự! Thật vậy, hoàn toàn giả định họ đã làm.
haylem

2
Bắt đầu kiểm soát phiên bản trước; muộn còn hơn không.
JeffO

@Jeff O: vâng, đó là những gì tôi đã thêm vào câu trả lời.
haylem

Viết lại để làm rõ hơn sau khi chỉnh sửa. Các bản phân phối còn lại :)
haylem

15

Cá nhân, tôi sẽ không bắt đầu dự án này cho đến khi tôi có một bản sao Làm việc hiệu quả với Legacy Code tiện dụng. Nghiêm túc mà nói, nó được viết cho chính xác loại điều này. Nó có đầy đủ các chiến lược để xử lý mã phức tạp và đi sâu vào chi tiết hơn nhiều so với những gì tôi có thể cung cấp cho bạn ở đây.


1
+1 để sử dụng tài liệu tham khảo bên ngoài mở rộng nói lên tất cả.
haylem

Thật không may, ở đây mọi người không có ý tưởng về việc đọc sách. Chỉ cần phát triển một dự án mà nó hoạt động là tất cả những gì họ cần. Tôi bắt đầu đọc cuốn sách mà bạn đề cập và MÃ HOÀN THÀNH 2, quá. Hãy để tôi nói rằng họ được viết tuyệt vời.
Salivan

1
@Salivan - Có lẽ họ chưa có ai thuyết phục họ rằng những cuốn sách như vậy đáng để đọc. Nếu chỉ có một người làm việc với họ, những người thích đọc những cuốn sách như vậy ...
Jason Baker

1
@Salivan - điều quan trọng là tìm một hoặc hai chiến thắng nhanh chóng. Làm một cái gì đó có một khoản hoàn vốn gần như ngay lập tức. Giống như kiểm soát phiên bản, vì vậy lần tới khi ai đó nói "điều đó đã xảy ra như thế nào", bạn có thể tra cứu nó. Sau đó dẫn họ vào một số gợi ý từ việc bạn đọc bản sao WELC của bạn. Đừng ném sách vào họ.

2
@Salivan Bạn có thể đọc sách cho họ và nhỏ giọt nội dung cho họ làm lời khuyên. Bạn có thể trở thành guru nhóm.
MarkJ

8

Tôi đã ở đó nhiều lần. Quy tắc của tôi là: nếu phần mềm không tầm thường (hơn 1 tuần làm việc cho tài nguyên bạn có) và nó hoạt động, thì hãy giữ nó và tiến hành tái cấu trúc gia tăng.

Nếu phần mềm không thực sự hoạt động (số lượng lỗi rất cao, yêu cầu không rõ ràng, v.v.) thì tốt hơn là nên viết lại từ đầu. Tương tự nếu nó khá nhỏ.

Điểm quan trọng trong việc tái cấu trúc (như trong cuốn sách của Fowler và của http://www.ievustriallogic.com/xp/refactoring/ ) là nó giữ cho hệ thống hoạt động, có thể việc tái cấu trúc sẽ mất gấp đôi thời gian nhưng rủi ro là bằng không.

Viết lại từ đầu có thể đưa ra nhiều rủi ro, từ yêu cầu hiểu sai đến thực hiện sai (sau khi tất cả các nhóm sẽ giống nhau).

Tôi thực sự đã thấy một thủ tục phức tạp được viết lại từ đầu hai lần và vẫn không hoạt động như mong đợi.


Tôi cũng sẽ đề nghị viết bài kiểm tra đơn vị cho các phương pháp thích hợp, nếu có thể. Họ sẽ giúp xác định rõ ràng những gì mã được cho là phải làm ở nơi đầu tiên, điều này sẽ hỗ trợ quá trình tái cấu trúc.
Michael K

2
Không cần phải nói ... Tôi coi TDD là một điều kiện cần thiết cho bất kỳ mã tốt nào (còn gọi là mã mới).
Uber đến

Viết từ đầu là một ý tưởng rất tốt. Nhưng trước tiên bạn cần phải có một số sơ đồ của công việc. Nhưng bạn sẽ làm gì nếu bạn phải phân tích mã để trích xuất các mối quan hệ? Bên cạnh đó, quy mô của dự án khiến nó không thể, hoặc nó sẽ khiến chúng tôi phải thuê một số lập trình viên khác.
Salivan

Kiểm tra hướng phát triển được đánh giá cao!
Salivan

"Nhưng bạn sẽ làm gì nếu bạn phải phân tích mã để trích xuất các mối quan hệ?" -> nếu đây là trường hợp, điều đó có nghĩa là dự án không nhỏ cũng không bị hỏng. Aka tôi sẽ bắt đầu thực hiện tái cấu trúc từng mảnh một. Xem thêm phương pháp Mikado. danielbrolund.wordpress.com/2009/03/28/...
Uberto

2

Tôi sẽ viết lại nó hoàn toàn. Đôi khi không thể sửa chữa một mã như vậy. Một lựa chọn khác là làm cho nó hoạt động, mà không cần thêm bất kỳ tính năng mới nào. Để dạy nhóm viết mã tốt (được thiết kế tốt, ghi lại, với các bài kiểm tra) hãy để họ sửa mã mà bạn có bây giờ. Hãy để mọi người sửa lỗi / xem lại mã của các nhà phát triển khác, không phải phần của anh ấy / anh ấy. Sau một số lần thử, họ sẽ hiểu rằng gần như không thể xem lại / sửa các mã đó.

Thêm người vào các dự án muộn giúp rất hiếm khi. Thông thường nó phá vỡ thời hạn. Bạn nên làm mọi thứ có thể để hoàn thành dự án thành công, và sau đó suy nghĩ về việc rời đi.


Mất bao nhiêu để viết lại nó hoàn toàn so với việc cải thiện nó? Cách tiếp cận nào sẽ cho kết quả nhanh nhất?
JBRWilkinson

@JBRWilkinson Nó phụ thuộc. Cách tiếp cận lặp lại là tốt, khi bạn có mã làm việc.
Duros

1
@duros, đối với mã bị hỏng, vâng. Mã này chạy trong sản xuất.

2

Lời khuyên của tôi sẽ không loại bỏ toàn bộ mã. Đây là vấn đề cuộc sống hàng ngày, mọi nhóm phát triển phải đối mặt. Tấn công một phần của mã tại một thời điểm. Sửa chữa nó, làm sạch nó, tài liệu nó. Và sau đó chuyển sang phần khác. Điều chính là luôn giữ một số mã có thể vận chuyển trong tay. Viết lại toàn bộ mã từ đầu sẽ mất khoảng thời gian đã sử dụng cho đến bây giờ và sẽ không có gì đảm bảo rằng nó sẽ đẹp hơn hiện tại.
Nhưng sau đó mọi người cũng nên tránh viết mã theo cách này. Dành thêm thời gian để đánh giá mã. Thích nghi với một số phong cách mã hóa thống nhất. Thảo luận về thiết kế đầu tiên và sau đó viết mã. Những điều đơn giản như vậy sẽ tạo ra những thay đổi lớn.

Blog hay nói lý do tại sao Netscape lỏng lẻo


2
Bắt đầu một dự án mới, trong khi cập nhật / gỡ lỗi phiên bản cũ trong thời gian trung bình (và bạn không thể tránh điều này vì vậy đừng mơ về nó) đang cố gắng bắn vào nhiều mục tiêu di chuyển.
JeffO

"Tấn công một phần của mã tại một thời điểm" không hoạt động, Manjo. với một nỗi buồn sâu sắc, mã chứa rất nhiều lỗi. Nó luôn luôn chuyển sang một cái gì đó khác. Chúng ta nên tấn công và phá hủy một phần của mã và xây dựng nó sau đó. Tôi đã gợi ý suy nghĩ này cho người quản lý một lần, nhưng các lập trình viên cần phải ngừng viết bất kỳ mã mới nào.
Salivan

@Salivan ... cần phải tắt bất kỳ mã mới nào . Tôi chắc rằng quản lý đang nói điều này. Nhưng điều đầu tiên cần làm khi bạn ở trong một cái hố là ngừng đào (đừng tiếp tục mắc lỗi tương tự). Để cho phép nhiều hơn được tạo ra trong các điều kiện này là tiếp tục đào hố. Phần khó khăn là làm thế nào để quản lý và các lập trình viên hiểu được các vấn đề.
SeraM

1

Nếu nó hoạt động, tái cấu trúc nó. Có những công cụ giúp bạn làm điều đó. Nếu nó không hoạt động, hãy sử dụng lệnh cải thiện mã ma thuật, tức là deltreetrên Windows resp. rm -rftrên Linux.


2
Đề xuất "xóa hoàn toàn tất cả các mã" đặc biệt không có ích - bạn có câu trả lời mang tính xây dựng hơn không?
JBRWilkinson

LOL. Tôi hoàn toàn đồng ý với bạn, ammoQ!
Salivan

JBRWilkinson: Thực hiện khởi động lại mới rất có thể là một cách tiếp cận tốt hơn so với cố gắng làm cho mớ hỗn độn hoạt động và sạch sẽ. Một công ty tôi từng làm việc đã thử điều đó, và năm này qua năm khác, họ đã lãng phí rất nhiều tài nguyên và hoàn toàn không đi đến đâu.
user281377

@ammoQ, bạn cần mã cũ để xem những gì nó thực sự đã làm, khi bạn nhận được nó sai.

1
Thorbjorn: Chúng ta đang nói về mã không hoạt động , phải không? Phân tích mã không bị lỗi, không làm được điều đó cho tôi biết nhiều hơn về tình trạng tinh thần của người tạo ra nó hơn bất kỳ điều gì khác.
user281377

1

Chúng ta có nên sửa mã và đổi nó thành OOP không? Chúng tôi đang gỡ lỗi nó. [... Chứa lỗi, không có tài liệu ...]

Tôi đã từng ở đó, bạn có cảm tình của tôi. Tôi thậm chí đã viết một bài báo về điều này có thể giúp bạn có được một số quan điểm. Nhưng tóm lại:

Nếu mã chứa nhiều bản sao, bạn nên viết lại. Nếu không có cấu trúc rõ ràng (không có giao diện rõ ràng, spaghetti), tái cấu trúc sẽ thất bại và có lẽ bạn nên viết lại.

Làm thế nào tôi có thể dạy họ tuân theo tất cả các quy tắc?

Bắt đầu với việc giải thích lý do tại sao họ có thể muốn làm điều đó bằng cách cho họ thấy những gì họ có thể nhận được từ cá nhân. Khi họ đồng ý với điều này và sẵn sàng học hỏi, hãy bắt đầu dạy họ bằng cách sử dụng shuhari .


Cảm ơn Martin. "Bắt đầu với việc giải thích lý do tại sao họ có thể muốn làm điều đó bằng cách cho họ thấy những gì họ có thể nhận được từ cá nhân. Khi họ đồng ý với điều này và sẵn sàng học hỏi, hãy bắt đầu dạy họ bằng cách sử dụng shuhari."
Salivan

0

Đề xuất của tôi là sự kết hợp giữa câu trả lời của @ duros & @Manoj R.

Bắt đầu từ đầu, hãy ghi nhớ để tạo mã tốt / OOP / nhận xét / vv lần này, tham khảo / sao chép và dán từ mã cũ của bạn. Khi bạn gặp các phần xấu của mã cũ, hãy viết lại / cấu trúc lại chúng.

Nếu các nhà phát triển của bạn không được đào tạo tốt, tôi nghĩ thật tốt khi gửi cho họ các khóa học. Nó quan trọng để đào tạo lại thường xuyên trong ngành công nghiệp CNTT thay đổi nhanh chóng

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.