2009-06-11 17 views
17

Tôi đã kế thừa chương trình 10K được viết bằng ngôn ngữ assembly 8051 yêu cầu một số thay đổi. Thật không may nó được viết trong truyền thống tốt nhất của mã spaghetti. Chương trình - được viết dưới dạng một tệp đơn - là một mê cung của câu lệnh CALL và LJMP (khoảng 1200 tổng), với các chương trình con có nhiều mục nhập và/hoặc các điểm thoát, nếu chúng có thể được xác định là các chương trình con. Tất cả các biến đều là toàn cục. Có ý kiến; một số là chính xác. Không có thử nghiệm hiện tại và không có ngân sách để tái cấu trúc.Unraveling Assembly Language Spaghetti Code

Một nền tảng nhỏ về ứng dụng: Mã kiểm soát trung tâm truyền thông trong ứng dụng bán hàng tự động hiện được triển khai trên phạm vi quốc tế. Nó xử lý hai luồng nối tiếp cùng một lúc (với sự trợ giúp của một bộ xử lý truyền thông riêng biệt) và có thể nói đến bốn thiết bị vật lý khác nhau, mỗi thiết bị từ một nhà cung cấp khác nhau. Nhà sản xuất một trong những thiết bị gần đây đã thực hiện thay đổi ("Vâng, chúng tôi đã thực hiện thay đổi, nhưng phần mềm hoàn toàn giống nhau!") Khiến một số cấu hình hệ thống không còn hoạt động nữa và không quan tâm đến việc thay đổi nó. họ không thay đổi).

Chương trình ban đầu được viết bởi một công ty khác, được chuyển cho khách hàng của tôi, sau đó được sửa đổi chín năm trước bởi một nhà tư vấn khác. Cả công ty ban đầu lẫn nhà tư vấn đều không có sẵn tài nguyên.

Dựa trên phân tích lưu lượng truy cập trên một trong các xe buýt nối tiếp, tôi đã tìm ra một bản hack, có vẻ hoạt động, nhưng nó rất xấu và không giải quyết nguyên nhân gốc rễ. Nếu tôi hiểu rõ hơn về chương trình, tôi tin rằng tôi có thể giải quyết vấn đề thực tế. Tôi có khoảng một tuần nữa trước khi mã được đóng băng để hỗ trợ ngày kết thúc của tháng.

Câu hỏi ban đầu: Tôi cần hiểu chương trình đủ tốt để thực hiện thay đổi mà không bị vỡ. Có ai phát triển kỹ thuật để làm việc với loại lộn xộn này không?

Tôi thấy một số đề xuất tuyệt vời ở đây nhưng bị giới hạn theo thời gian. Tuy nhiên, tôi có thể có một cơ hội khác trong tương lai để theo đuổi một số khóa học hành động có liên quan hơn.

+13

OUCH. –

+0

Tình cảm của tôi chính xác! –

+0

lời chia buồn của tôi! – none

Trả lời

17

Trước tiên, tôi sẽ cố gắng để liên lạc với những người ban đầu được phát triển mã hoặc những người ít nhất duy trì nó trước khi tôi, hy vọng nhận được đầy đủ thông tin để có được một sự hiểu biết cơ bản của mã nói chung , để bạn có thể bắt đầu thêm các nhận xét hữu ích vào nó.

Có thể bạn thậm chí có thể nhờ ai đó mô tả các API quan trọng nhất (bao gồm chữ ký, giá trị trả về và mục đích) cho mã. Nếu trạng thái toàn cầu được sửa đổi bởi một hàm, điều này cũng cần được làm rõ ràng. Tương tự, bắt đầu phân biệt giữa các hàm và thủ tục, cũng như thanh ghi đầu vào/đầu ra.

Bạn nên làm rõ với chủ của bạn rằng thông tin này là bắt buộc, nếu họ không tin bạn, hãy để họ thực sự ngồi xuống phía trước mã này trong khi bạn mô tả những gì bạn phải làm và cách bạn phải làm điều đó (kỹ thuật đảo ngược). Có một nhà tuyển dụng với một nền tảng về tính toán và lập trình sẽ thực sự hữu ích trong trường hợp đó!

Nếu chủ lao động của bạn không có nền tảng kỹ thuật như vậy, hãy yêu cầu anh ta đưa một lập trình viên/đồng nghiệp khác giải thích các bước của bạn cho anh ấy, thực sự sẽ cho anh ấy thấy bạn nghiêm túc và trung thực về nó vấn đề - không chỉ từ quan điểm của bạn (hãy chắc chắn có các đồng nghiệp biết về 'dự án' này).

Nếu có sẵn và khả thi, tôi cũng sẽ nói rõ ràng rằng các nhà phát triển/nhà duy trì hợp đồng (hoặc ít nhất là liên hệ) (nếu họ không còn làm việc cho công ty của bạn). sẽ là điều kiện tiên quyết để cải thiện thực tế mã trong một khoảng thời gian ngắn và để đảm bảo rằng nó có thể được duy trì dễ dàng hơn trong tương lai.

Nhấn mạnh rằng toàn bộ tình huống này là do thiếu sót trong quá trình phát triển phần mềm trước đó và các bước này sẽ giúp cải thiện cơ sở mã. Vì vậy, các cơ sở mã trong hình thức hiện tại của nó là một vấn đề đang phát triển và bất cứ điều gì được thực hiện ngay bây giờ để xử lý vấn đề này là một khoản đầu tư cho tương lai. Điều này cũng rất quan trọng để giúp họ đánh giá và hiểu tình hình của bạn: Để làm những gì bạn phải làm bây giờ là xa tầm thường, và họ nên biết về nó - nếu chỉ để đặt kỳ vọng của họ thẳng (ví dụ liên quan đến thời hạn và sự phức tạp của nhiệm vụ).

Ngoài ra, cá nhân tôi sẽ bắt đầu thêm bài kiểm tra đơn vị cho những phần mà tôi hiểu đủ tốt, để tôi có thể từ từ bắt đầu tái cấu trúc/viết lại một số mã. Nói cách khác, tài liệu tốt và bình luận mã nguồn là một điều, nhưng có một bộ kiểm thử toàn diện là một điều quan trọng khác, không ai có thể thực sự sửa đổi một cơ sở mã không quen thuộc mà không có bất kỳ cách nào để kiểm tra chức năng chính. Với mã 10K, tôi cũng sẽ xem xét các phần tử con thành các tệp riêng biệt để làm cho các thành phần dễ nhận biết hơn, tốt nhất là sử dụng trình bao bọc truy cập thay vì các biến toàn cục và các tên tệp trực quan. Ngoài ra, tôi sẽ xem xét các bước để cải thiện hơn nữa khả năng đọc mã nguồn bằng cách giảm độ phức tạp, có thói quen phụ với nhiều điểm nhập (và thậm chí cả chữ ký tham số khác nhau?) Trông giống như một cách chắc chắn để làm xáo trộn mã không cần thiết.

Tương tự, các thường trình phụ rất lớn cũng có thể được tái cấu trúc thành các phần nhỏ hơn để giúp cải thiện khả năng đọc. Vì vậy, một trong những điều đầu tiên, tôi sẽ xem xét việc xác định những thứ làm cho nó phức tạp hơn để bẻ khóa cơ sở mã và sau đó làm lại các phần đó, ví dụ bằng cách chia nhỏ các tiến trình phụ rất lớn với nhiều nhập các điểm vào các thủ tục phụ riêng biệt gọi nhau thay thế. Nếu không thể thực hiện việc này vì lý do hiệu suất hoặc phí gọi điện, hãy sử dụng macro thay thế. Ngoài ra, nếu nó là một lựa chọn khả thi, tôi sẽ xem xét từng bước phần mã bằng cách sử dụng một ngôn ngữ cấp cao hơn, hoặc bằng cách sử dụng một tập hợp con của C, hoặc ít nhất bằng cách sử dụng quá nhiều macro lắp ráp giúp tiêu chuẩn hóa cơ sở mã, mà còn giúp bản địa hóa các lỗi tiềm ẩn.

Nếu viết lại gia tăng trong C là một lựa chọn khả thi, một cách có thể để bắt đầu sẽ là chuyển tất cả các chức năng hiển thị thành hàm C có phần thân được sao chép/dán từ tệp lắp ráp, để bạn kết thúc với các hàm C với nhiều assembly nội tuyến.

Cá nhân, tôi cũng sẽ thử chạy mã trong một số simulator/emulator để dễ dàng bước qua mã và hy vọng bắt đầu hiểu các khối xây dựng quan trọng nhất (trong khi kiểm tra đăng ký và sử dụng ngăn xếp), trình mô phỏng 8051 tốt với trình gỡ lỗi tích hợp nên có sẵn cho bạn nếu bạn thực sự phải làm điều này phần lớn trên của riêng bạn.

Điều này cũng sẽ giúp bạn tìm ra trình tự khởi tạo và cấu trúc vòng lặp chính cũng như biểu đồ cuộc gọi.

Có lẽ, bạn thậm chí có thể tìm thấy một trình mô phỏng 80851 mã nguồn mở có thể dễ dàng sửa đổi để cung cấp một biểu đồ đầy đủ tự động, chỉ cần thực hiện tìm kiếm nhanh, tôi tìm thấy gsim51. cũng.

Nếu tôi ở trong tình huống của bạn, tôi sẽ xem xét việc gia công nỗ lực sửa đổi công cụ để đơn giản hóa việc làm việc với mã nguồn này, tức là nhiều dự án sourceforge chấp nhận quyên góp và có thể bạn nói chuyện với chủ nhân của bạn.

Nếu không về tài chính, có thể do bạn cung cấp các bản vá tương ứng cho nó?

Nếu bạn đang sử dụng sản phẩm độc quyền, bạn thậm chí có thể nói chuyện với nhà sản xuất phần mềm này và nêu chi tiết yêu cầu của bạn và hỏi họ xem họ có sẵn sàng cải tiến sản phẩm này hay không. một giao diện cho phép khách hàng thực hiện các tùy chỉnh như vậy (một số dạng API nội bộ hoặc thậm chí có thể là các kịch bản lệnh đơn giản).

Nếu họ không đáp ứng, chỉ ra rằng sử dụng lao động của bạn đã được nghĩ đến việc sử dụng một sản phẩm khác nhau trong một thời gian bây giờ và rằng bạn đang là người duy nhất nhấn mạnh vào sản phẩm cụ thể được sử dụng để ... ;-)

Nếu phần mềm mong đợi một số phần cứng và thiết bị ngoại vi I/O nhất định, bạn thậm chí có thể muốn xem xét viết một vòng mô phỏng phần cứng tương ứng để chạy phần mềm trong trình mô phỏng. Cuối cùng, tôi biết một thực tế rằng cá nhân tôi sẽ tận hưởng nhiều hơn quá trình tùy biến phần mềm khác để giúp tôi hiểu một con quái vật mã spaghetti như vậy, hơn là tự bước qua mã và chơi trình mô phỏng, bất kể có bao nhiêu gallon của cà phê tôi có thể nhận được.Nhận được một đồ thị có thể sử dụng từ một trình mô phỏng 8051 mã nguồn mở không nên mất nhiều thời gian hơn một ngày cuối tuần (nhiều nhất), bởi vì nó chủ yếu có nghĩa là tìm kiếm các mã CALL và ghi địa chỉ của chúng (vị trí và đích), để tất cả mọi thứ được đổ vào một tập tin để kiểm tra sau này.

Có quyền truy cập vào nội bộ của trình mô phỏng thực sự cũng là một cách tuyệt vời để kiểm tra mã, ví dụ để tìm các mẫu mã định kỳ (nói 20-50 +), có thể được tính vào các hàm/thủ tục độc lập , điều này thực sự có thể giúp giảm kích thước và độ phức tạp của cơ sở mã hơn nữa.

Bước tiếp theo có thể là kiểm tra ngăn xếp và đăng ký sử dụng. Và để xác định loại/kích thước của tham số chức năng được sử dụng, cũng như phạm vi giá trị của chúng - để bạn có thể thụ thai các phép thử đơn vị tương ứng.

Sử dụng các công cụ như dấu chấm/graphviz để trực quan hóa cấu trúc của trình tự khởi tạo và vòng lặp chính, sẽ là một niềm vui thuần khiết so với thực hiện tất cả các công cụ này theo cách thủ công.

Ngoài ra, bạn sẽ thực sự kết thúc với dữ liệu và tài liệu hữu ích có thể đóng vai trò là nền tảng cho tài liệu tốt hơn trong thời gian dài.

+1

Bây giờ, đó là câu trả lời. làm tốt. –

+0

không - nếu bạn thất nghiệp và có thời gian để viết các câu trả lời dài chi tiết như thế này, bạn sẽ sớm được thuê. Tốt quá trình suy nghĩ, viết rõ ràng, khoảng cách vật lý tốt và trình bày. Và nếu bạn đang làm việc tích cực, hãy yêu cầu ông chủ của bạn tăng lương! – Dan

+0

cảm ơn những phản hồi tích cực, thực sự phản ứng ban đầu của tôi chỉ là một bình luận dưới hình thức "lời chia buồn của tôi" (xem ở trên), tôi cảm thấy không công bằng và bận tâm để viết một câu trả lời, ngắn hơn so với hiện tại phản ứng, mà bằng cách nào đó kết thúc được sửa đổi một số thời gian. Cuối cùng, nó đã được sửa đổi thường xuyên đến mức nó * vô tình * trở thành một wiki cộng đồng ngay bây giờ. Vì vậy, đó là những gì bạn nhận được để được xây dựng ... Về việc nâng cao, gotta nói chuyện với bản thân mình sau đó (tự làm chủ). – none

1

Bạn không cần ngân sách đặc biệt để tái cấu trúc và thử nghiệm - chúng giúp bạn tiết kiệm tiền và cho phép bạn làm việc nhanh hơn - truy cập vào nó. Đó là kỹ thuật bạn nên sử dụng để thêm các thay đổi cho mã kế thừa, kế thừa vì đó là cách rẻ nhất để làm điều đó mà không cần "không vỡ".

Hầu hết thời gian, tôi nghĩ rằng có một sự cân bằng khi bạn có nhiều chất lượng hơn để đổi lấy nhiều thời gian hơn, nhưng với mã cũ mà bạn không quen thuộc, tôi nghĩ sẽ nhanh hơn để thực hiện các thử nghiệm - bạn phải chạy mã trước khi bạn gửi nó, phải không?

4

Tìm một công việc khác- nghiêm túc! Không biết rằng cuốn sách "làm việc hiệu quả với mã kế thừa" có thể giúp ích- mặc dù tôi nghĩ rằng nó đang đề cập đến mã kế thừa là mã không có kiểm tra đơn vị.

+1

Sách hay - Tôi sở hữu một bản sao. – bitFlipper

+0

Vâng tôi có nó trên kệ sách của tôi, tôi đã không may không có thời gian để đọc nó được nêu ra mặc dù. Tôi yêu cả loạt sách Martin Fowler và Robert Martin! – RichardOD

1

Đây là một trong vài lần tôi sẽ khuyên bạn nên đặt các kỹ năng mềm để làm việc, và trình bày PM/Manager/CXO của bạn với lý do đằng sau việc viết lại và tiết kiệm thời gian/chi phí một cam kết như vậy

7

Tôi e rằng không có viên đạn ma thuật nào cho loại vấn đề này. Tôi tìm ra giải pháp duy nhất là in ra tệp ASM rồi đi đâu đó yên tĩnh và mô phỏng chạy dòng chương trình theo dòng trong tâm trí của bạn (trong khi viết nội dung của sổ đăng ký và vị trí bộ nhớ trên notepad). Sau một thời gian bạn tìm thấy điều này không mất miễn là bạn mong đợi. Hãy chuẩn bị để dành nhiều giờ làm việc này và uống một gallon cà phê. Sau một thời gian, bạn sẽ có một sự hiểu biết về những gì nó đang làm và bạn có thể xem xét những thay đổi.

Liệu 8051 có bất kỳ cổng IO không sử dụng nào không?Nếu nó có và bạn không thể làm việc ra khi một số thói quen được gọi là sau đó thêm mã để gửi các cổng dự phòng cao hay thấp. Sau đó khi chương trình đang chạy xem các cổng này với một dao động.

Chúc may mắn

+0

Đây là trường hợp bản in của thanh màu xanh lá cây tỏa sáng. – Maggie

+0

Ngắn hạn, thật không may, đây có lẽ là những gì tôi sẽ làm. May mắn thay, gallon cà phê không phải là một vấn đề! :) – bitFlipper

3

Bạn hiểu nền tảng phần cứng mà mã này đang chạy như thế nào?

  • Có được đưa vào điện xuống chế độ (PCON = 2) để tiết kiệm điện Nếu vậy làm thế nào là nó được đánh thức. (Reset hoặc trên phần cứng ngắt)

  • Bạn phải đợi một cho bộ dao động để chuồng sau một cường quốc lên trước khi làm truyền thông nối tiếp

  • Có được đưa vào chế độ ngủ (PCON = 1)

Có các phiên bản phần cứng khác nhau trong trường không?

Đảm bảo bạn có tất cả các biến thể phần cứng khác nhau để kiểm tra.

Đừng lãng phí thời gian của bạn bằng trình mô phỏng - rất khó để làm việc và bạn phải đưa ra nhiều giả định về phần cứng. Có được cho mình một In Circuit Emulator (ICE) và chạy trên phần cứng.

Phần mềm này được viết bằng trình lắp ráp vì lý do bạn cần tìm hiểu lý do. tức - hạn chế bộ nhớ - hạn chế tốc độ

Có thể có một lý do rằng mã này là một mớ hỗn độn

Hãy nhìn vào các tập tin liên kết cho:

XDATA SPACE, IDATA SPACE và MÃ SPACE :

Nếu không có không gian mã miễn phí hoặc Xdata hoặc Idata?

Tác giả gốc có thể đã Tối ưu hóa nó để vừa với không gian bộ nhớ khả dụng.

Nếu đó là trường hợp bạn cần nói chuyện với nhà phát triển ban đầu để tìm hiểu xem anh ấy đã làm gì.

+0

Cảm ơn các đề xuất. Không ngủ/tắt nguồn (nó là một phần của hệ thống lớn hơn có mức tiêu thụ được đo bằng KWh). Phiên bản duy nhất của phần cứng. Không có ngân sách cho ICE. Nhiều không gian: sử dụng ROM ở mức 60%; RAM gần như đầy đủ ở mức 94%. Tôi không thấy bất kỳ dấu hiệu tối ưu hóa nào; chỉ viết mã xấu. Một số mã có vẻ không thể truy cập được (tức là "đã chết"); một số RAM được gán cho các biến nhưng không được sử dụng. – bitFlipper

0

Tôi muốn nói câu trả lời của IanW (chỉ in ra và theo dõi) có lẽ là tốt nhất. Điều đó nói rằng, tôi có một chút ý tưởng tường:

Hãy thử chạy mã (có thể là nhị phân) thông qua bộ tách có thể tái tạo lại mã C (nếu bạn có thể tìm mã cho 8051). Có lẽ nó sẽ xác định một vài thói quen bạn không thể (dễ dàng).

Có thể nó sẽ hữu ích.

6

Tôi biết điều này nghe có vẻ điên rồ .... nhưng tôi thất nghiệp (tôi đã chọn sai thời gian để nói với đối tác kinh dị về địa ngục) và có thời gian rảnh. Tôi muốn sẵn sàng xem xét nó. Tôi đã từng viết assembly cho quả táo] [và máy tính ban đầu. Nếu tôi có thể chơi xung quanh với mã của bạn trên giả lập trong một vài giờ tôi có thể cung cấp cho bạn một ý tưởng nếu tôi có một cơ hội của tài liệu đó cho bạn (mà không chạy kỳ nghỉ không có kế hoạch của tôi). Vì tôi không biết gì về 8051, điều này có thể không xảy ra đối với một người như tôi, nhưng giả lập trông đầy hứa hẹn. Tôi sẽ không muốn bất kỳ tiền để làm điều này. Đủ của nó chỉ để có được tiếp xúc với 8.051 phát triển nhúng. Tôi đã nói với bạn điều này nghe có vẻ điên rồ.

+0

Không điên, và cảm ơn vì lời đề nghị tốt bụng. Tuy nhiên vì lý do quyền sở hữu/IP/bảo mật, tôi không được phép chia sẻ mã của khách hàng. – bitFlipper

+0

Tôi đã tìm được nhiều. :) – johnnycrash

1

Cắt thành từng miếng.

4

Tôi đã thực hiện loại điều này một vài lần. Một số kiến ​​nghị:

  • Bắt đầu bằng cách xem xét các sơ đồ, này sẽ giúp bạn hiểu những gì cảng và chân thay đổi bạn muốn tác động.
  • Sử dụng grep để tìm tất cả các cuộc gọi, chi nhánh, nhảy và trả lại. Điều này có thể giúp hiểu luồng và xác định các đoạn mã.
  • Xem bảng đặt lại và bảng ngắt để xác định các dòng chính .
  • Sử dụng grep để tạo tham chiếu chéo cho tất cả các nhãn mã và dữ liệu tham chiếu (nếu công cụ lắp ráp của bạn không thể làm điều này cho bạn).

Hãy Luật tâm Hofstadter của: Nó luôn luôn mất nhiều thời gian hơn bạn mong đợi, ngay cả khi bạn đưa vào Luật tài khoản Hofstadter của.

Chúc may mắn.

+0

Cảm ơn. Tôi yêu grep và sử dụng nó mỗi ngày. :) – bitFlipper

1

Tôi có một số vấn đề rất giống với phần mềm 8052. Vì vậy, công ty thừa hưởng một con thú, mã ROM đầy đủ (64Kbytes), khoảng 1,5 megs mô-đun spaghetti lắp ráp cộng với hai 3000 dòng PL/M mô-đun sáng tác này monstrosity mã hóa. Các nhà phát triển phần mềm ban đầu đã chết rất lâu (điều này không có nghĩa là không có ai, nhưng thực sự không ai hiểu nó như một tổng thể), các trình biên dịch biên dịch là từ những năm 80 chạy trên bộ mô phỏng MDS-70, và một số các mô-đun nằm ở giới hạn của các trình biên dịch này. Giống như thêm một biểu tượng toàn cầu nữa và trình liên kết sẽ bị lỗi. Thêm một biểu tượng nữa vào tệp ASM và trình biên dịch sẽ bị lỗi.

Vậy làm thế nào người ta có thể bắt đầu cắt điều này?

Trước tiên, bạn sẽ cần các công cụ.Ví dụ Notepad ++ là một điều rất hay vì nó có thể được sử dụng để tìm kiếm chéo dọc theo nhiều tệp cùng một lúc, lý tưởng để tìm mô-đun nào tham chiếu đến biểu tượng toàn cục. Đây có lẽ là yếu tố quan trọng nhất.

Nếu có thể, hãy lấy bất kỳ giấy tờ nào bạn có thể tìm thấy trên phần mềm. Vấn đề trước mắt nhất để giải quyết với những con thú này là hiểu cách chúng được cấu tạo gần như thế nào, kiến ​​trúc của chúng là gì. Điều này thường không được bao gồm trong bản thân phần mềm, ngay cả khi nó được bình luận đúng cách.

Để tự mình lấy kiến ​​trúc, trước tiên bạn có thể thử tạo biểu đồ cuộc gọi. Nó đơn giản hơn so với biểu đồ luồng dữ liệu vì thường có ít cuộc gọi qua nhiều tập tin & nhảy hơn các biến toàn cầu. Đối với đồ thị cuộc gọi này, chỉ xem xét các biểu tượng toàn cục giả sử các tệp nguồn được cho là các mô-đun (không nhất thiết phải đúng, nhưng thường là chúng phải là).

Để thực hiện việc này, hãy sử dụng công cụ của bạn để tìm kiếm tệp chéo, tạo danh sách lớn (ví dụ trong OpenOffice Calc) nơi bạn thu thập ký hiệu nào được xác định trong tệp nào và tệp nào tham chiếu đến biểu tượng này.

Sau đó lấy một số tờ lớn (!) Từ máy vẽ và bắt đầu vẽ. Nếu bạn rất thành thạo trong một số phần mềm đồ thị, bạn có thể sử dụng nó, nhưng trừ khi nó là như vậy, nó có nhiều khả năng giữ bạn trở lại. Vì vậy, phác thảo biểu đồ cuộc gọi hiển thị tệp có các cuộc gọi đến các tệp khác (không hiển thị biểu tượng, với 50 tệp trở lên, bạn sẽ không thể quản lý nó).

Rất có thể kết quả của việc này sẽ là mì spaghetti. Mục đích là để làm thẳng nó ra để có được nó một cây phân cấp với một gốc (đó sẽ là tập tin có chứa các điểm vào chương trình) mà không có vòng lặp. Bạn có thể nuốt vài tờ trong quá trình này lặp đi lặp lại thẳng con thú ra. Bạn cũng có thể tìm thấy một số tập tin nhất định có liên quan đến nhau đến mức chúng không thể được biểu diễn mà không có vòng lặp. Trường hợp này rất có thể là một "mô-đun" đơn lẻ bị phân tách bằng hai cách nào đó, hoặc nhiều mô-đun khái niệm bị rối tung lên. Quay trở lại danh sách cuộc gọi của bạn và nhóm các ký hiệu để cắt các tệp có vấn đề trong các đơn vị độc lập nhỏ hơn (bạn cũng sẽ cần phải kiểm tra tệp cho các bước nhảy cục bộ tại đây để xem đoạn cắt giả định của bạn).

Để kết thúc trừ khi bạn đã làm việc ở một nơi khác vì lợi ích của riêng bạn, bạn sẽ nhận được biểu đồ cuộc gọi phân cấp với các mô-đun khái niệm. Từ đó, có thể khấu trừ kiến ​​trúc cố ý của phần mềm và làm việc thêm.

Mục tiêu tiếp theo là kiến ​​trúc . Bằng bản đồ được tạo trước đây của bạn, bạn sẽ cần điều hướng dọc theo phần mềm, tìm ra các luồng của nó (các tác vụ chương trình gián đoạn và chính), và mục đích thô của mỗi mô-đun/tệp nguồn. Làm thế nào bạn có thể làm điều này và những gì bạn nhận được ở đây phụ thuộc nhiều hơn vào miền ứng dụng.

Khi hai điều này được thực hiện, phần còn lại "" khá đơn giản. Bằng cách này, về cơ bản bạn nên biết những gì mỗi phần của điều này là nghĩa vụ phải làm, và vì vậy bạn biết những gì bạn có khả năng đối phó với khi bạn bắt đầu làm việc trên một tập tin nguồn. Điều quan trọng là mặc dù bất cứ khi nào bạn tìm thấy một cái gì đó "cá" trong một nguồn, chương trình dường như làm điều gì đó không liên quan, để quay lại kiến ​​trúc và đồ thị của bạn, và sửa chữa nếu cần thiết.

Để phần còn lại, các phương pháp khác được đề cập áp dụng tốt. Tôi chỉ nêu ra những điều này để cung cấp một số thông tin chi tiết về những gì có thể được thực hiện trong các trường hợp thực sự ghê tởm. Tôi ước tôi chỉ có 10 nghìn dòng mã để xử lý ngược lại ...