Tôi đang mở rộng ý kiến của mình thành một câu trả lời vì tôi nghĩ rằng một số khía cạnh của vấn đề cụ thể hoặc bị bỏ qua hoặc được sử dụng để rút ra kết luận sai.
Tại thời điểm này, câu hỏi về việc có nên cấu trúc lại sớm hay không (mặc dù có thể nó sẽ được trả lời bằng một hình thức cụ thể là 'có').
Vấn đề trung tâm ở đây là (như đã lưu ý trong một số câu trả lời) các ý kiến bạn trích dẫn mạnh mẽ chỉ ra rằng mã có các điều kiện chủng tộc hoặc các vấn đề đồng thời / đồng bộ hóa khác, như được thảo luận ở đây . Đây là những vấn đề đặc biệt khó khăn, vì nhiều lý do. Thứ nhất, như bạn đã tìm thấy, những thay đổi dường như không liên quan có thể gây ra vấn đề (các lỗi khác cũng có thể có hiệu ứng này, nhưng lỗi đồng thời hầu như luôn xảy ra.) Thứ hai, chúng rất khó chẩn đoán: lỗi thường xuất hiện ở một nơi xa thời gian hoặc mã từ nguyên nhân, và bất cứ điều gì bạn làm để chẩn đoán nó có thể khiến nó biến mất ( Heisenbugs). Thứ ba, lỗi đồng thời rất khó tìm thấy trong thử nghiệm. Một phần, đó là do vụ nổ tổ hợp: nó đủ tệ cho mã tuần tự, nhưng việc thêm các xen kẽ có thể có của việc thực thi đồng thời sẽ thổi nó đến điểm mà vấn đề tuần tự trở nên không đáng kể. Ngoài ra, ngay cả một trường hợp thử nghiệm tốt cũng có thể chỉ thỉnh thoảng gây ra sự cố - Nancy Leveson tính toán rằng một trong những lỗi gây chết người trong Therac 25xảy ra trong 1 trong khoảng 350 lần chạy, nhưng nếu bạn không biết lỗi là gì hoặc thậm chí có lỗi, bạn không biết có bao nhiêu lần lặp lại để thực hiện một bài kiểm tra hiệu quả. Ngoài ra, chỉ có kiểm tra tự động là khả thi ở quy mô này và có thể trình điều khiển kiểm tra áp đặt các ràng buộc thời gian tinh vi sao cho nó sẽ không bao giờ thực sự kích hoạt lỗi (Heisenbugs một lần nữa).
Có một số công cụ để kiểm tra đồng thời trong một số môi trường, chẳng hạn như Helgrind cho mã bằng cách sử dụng pthread POSIX, nhưng chúng tôi không biết chi tiết cụ thể ở đây. Kiểm tra nên được bổ sung với phân tích tĩnh (hoặc là cách khác?), Nếu có các công cụ phù hợp cho môi trường của bạn.
Để thêm vào khó khăn, trình biên dịch (và thậm chí cả bộ xử lý, trong thời gian chạy) thường được tự do sắp xếp lại mã theo cách đôi khi khiến lý do về an toàn luồng của nó rất phản trực quan (có lẽ trường hợp nổi tiếng nhất là kiểm tra hai lần khóa thành ngữ, mặc dù một số môi trường (Java, C ++ ...) đã được sửa đổi để cải thiện nó.)
Mã này có thể có một vấn đề đơn giản gây ra tất cả các triệu chứng, nhưng nhiều khả năng là bạn có một vấn đề mang tính hệ thống có thể khiến kế hoạch của bạn thêm các tính năng mới bị đình trệ. Tôi hy vọng tôi đã thuyết phục bạn rằng bạn có thể có vấn đề nghiêm trọng trong tay, thậm chí có thể là mối đe dọa hiện hữu cho sản phẩm của bạn và điều đầu tiên cần làm là tìm hiểu điều gì đang xảy ra. Nếu điều này không tiết lộ các vấn đề tương tranh, tôi khuyên bạn nên khắc phục chúng trước, trước khi bạn đặt câu hỏi liệu bạn có nên thực hiện tái cấu trúc chung hơn không, và trước khi bạn cố gắng thêm nhiều tính năng hơn.