Có hợp lý để nhấn mạnh vào việc tái tạo mọi khiếm khuyết trước khi chẩn đoán và sửa chữa nó?


70

Tôi làm việc cho một công ty sản phẩm phần mềm. Chúng tôi có khách hàng doanh nghiệp lớn, những người thực hiện sản phẩm của chúng tôi và chúng tôi cung cấp hỗ trợ cho họ. Ví dụ: nếu có lỗi, chúng tôi cung cấp các bản vá, v.v. Nói cách khác, Đó là một thiết lập khá điển hình.

Gần đây, một vé đã được phát hành và được giao cho tôi về một ngoại lệ được tìm thấy bởi một khách hàng trong một tệp nhật ký có liên quan đến việc truy cập cơ sở dữ liệu đồng thời trong việc triển khai cụm sản phẩm của chúng tôi. Vì vậy, cấu hình cụ thể của khách hàng này có thể rất quan trọng trong trường hợp xảy ra lỗi này. Tất cả chúng tôi nhận được từ khách hàng là tệp nhật ký của họ.

Cách tiếp cận tôi đề xuất với nhóm của mình là cố gắng tái tạo lỗi trong thiết lập cấu hình tương tự như của khách hàng và nhận được nhật ký tương đương. Tuy nhiên, họ không đồng ý với cách tiếp cận của tôi nói rằng tôi không cần phải tạo lại lỗi vì nó quá tốn thời gian và sẽ yêu cầu mô phỏng cụm máy chủ trên máy ảo. Nhóm của tôi đề nghị tôi chỉ cần "theo mã" để xem mã không an toàn của luồng và / hoặc giao dịch không an toàn và thay đổi hoạt động của một phát triển cục bộ đơn giản, không phải là triển khai cụm như môi trường mà từ đó xảy ra của lỗi bắt nguồn.

Đối với tôi, làm việc với một kế hoạch chi tiết trừu tượng (mã chương trình) chứ không phải là một biểu hiện rõ ràng, hữu hình (tái tạo thời gian chạy) có vẻ khó khăn, vì vậy tôi muốn hỏi một câu hỏi chung:

Có hợp lý để nhấn mạnh vào việc tái tạo mọi khiếm khuyết và gỡ lỗi trước khi chẩn đoán và sửa chữa nó không?

Hoặc là:

Nếu tôi là nhà phát triển cấp cao, tôi có thể đọc mã đa luồng và tạo một bức tranh tinh thần về những gì nó làm trong tất cả các tình huống sử dụng thay vì yêu cầu chạy ứng dụng, thử nghiệm các tình huống sử dụng khác nhau và thực hiện từng bước dòng mã theo dòng? Hay tôi là một nhà phát triển kém vì yêu cầu loại môi trường làm việc đó?

Là gỡ lỗi cho sissies?

Theo tôi, bất kỳ sửa chữa nào được gửi để phản hồi với một vé sự cố nên được kiểm tra trong một môi trường được mô phỏng gần với môi trường ban đầu nhất có thể. Làm thế nào khác bạn có thể biết rằng nó sẽ thực sự khắc phục vấn đề? Nó giống như phát hành một mô hình mới của một chiếc xe mà không thử nghiệm nó với một hình nộm để chứng minh rằng túi khí thực sự hoạt động.

Cuối cùng nhưng không kém phần quan trọng, nếu bạn đồng ý với tôi:

Làm thế nào tôi nên nói chuyện với nhóm của mình để thuyết phục họ rằng cách tiếp cận của tôi là hợp lý, bảo thủ và chống đạn hơn?


7
đôi khi, thật vô nghĩa khi cứ khăng khăng sao chép khi bạn có một bản ghi với dấu vết ngăn xếp. Một số lỗi đồng thời trong Java cũng giống như vậy, thực sự dễ nhất là khi bạn nhận được một bản ghi với NPE và ngăn xếp dấu vết trỏ đến một dòng "rõ ràng" sử dụng một số đối tượng được tạo new. Và các lỗi này không được đảm bảo có thể tái tạo một cách đáng tin cậy, theo đặc tả Mô hình bộ nhớ Java
gnat

5
Bạn có muốn câu trả lời "đúng" không - bạn phải sao chép mọi lỗi để bạn biết lỗi đã được sửa hoặc câu trả lời "giữ khách hàng trả tiền cho chúng tôi $$" - đôi khi bạn không có thời gian và nguồn lực để làm như vậy, và Sếp của bạn hy vọng bạn sử dụng chuyên môn của mình để cố gắng khắc phục nó?
KutuluMike


20
Ngạc nhiên vì cộng đồng ở đây phù hợp với bạn. Thành thật mà nói, tôi hoàn toàn đồng ý với các đồng đội của bạn. Đôi khi, đặc biệt là khi liên quan đến các lỗi trong điều kiện cuộc đua, việc hiểu theo mã đơn giản và hiệu quả hơn nhiều so với việc dành một tấn thời gian để tạo ra một môi trường thử nghiệm thậm chí không thể phơi bày vấn đề . Nếu bạn không thể tìm thấy bất cứ điều gì bằng cách truy tìm mã, thì chắc chắn, hãy xem liệu có hợp lý không khi bỏ công sức để tạo môi trường thử nghiệm, nhưng đó là sự phân bổ thời gian tồi tệ để bắt đầu bằng cách tạo môi trường thử nghiệm.
Ben Lee

5
Bạn không thể chứng minh rằng bạn đã khắc phục vấn đề mà không thể sao chép nó. Đôi khi, có thể có ý nghĩa để đoán làm hạn chế tài nguyên, nhưng tôi muốn đó là ngoại lệ không phải là quy tắc. Mặc dù, nếu thực sự khó tái tạo vấn đề thì có lẽ có điều gì đó không ổn như thiết kế hoặc kiến ​​trúc cơ bản.
Dietbuddha

Câu trả lời:


72

Có hợp lý để nhấn mạnh vào việc tái tạo mọi khiếm khuyết và gỡ lỗi trước khi chẩn đoán và sửa chữa nó không?

Bạn nên cho nó nỗ lực tốt nhất của bạn. Tôi biết rằng đôi khi có những điều kiện và môi trường phức tạp đến mức chúng không thể được sao chép chính xác , nhưng bạn chắc chắn nên thử nếu có thể.

Nếu bạn không bao giờ tái tạo lỗi và tự nhìn thấy nó, làm thế nào bạn có thể chắc chắn 100% rằng bạn thực sự đã sửa nó? Có thể bản sửa lỗi được đề xuất của bạn giới thiệu một số lỗi tinh vi khác sẽ không xuất hiện trừ khi bạn thực sự cố gắng tái tạo lỗi ban đầu.

Nếu tôi là nhà phát triển cấp cao, tôi có thể đọc mã (đa luồng) và tạo một bức tranh tinh thần về những gì nó làm trong tất cả các tình huống sử dụng thay vì yêu cầu chạy ứng dụng, thử nghiệm các tình huống sử dụng khác nhau và thực hiện từng bước dòng mã theo dòng? Hay tôi là một nhà phát triển kém vì yêu cầu loại môi trường làm việc đó? Là gỡ lỗi cho sissies?

Tôi sẽ không tin ai đó chạy mã "trong đầu họ", nếu đó là cách tiếp cận duy nhất của họ . Đó là một nơi tốt để bắt đầu . Tái tạo lỗi và sửa lỗi và sau đó chứng minh rằng giải pháp ngăn chặn lỗi tái xuất hiện - đó là nơi cần kết thúc .

Làm thế nào tôi nên nói chuyện với nhóm của mình để thuyết phục họ rằng cách tiếp cận của tôi là hợp lý, bảo thủ và chống đạn hơn?

Bởi vì nếu họ không bao giờ tái tạo lỗi, họ không thể biết chắc chắn rằng nó đã được sửa. Và nếu khách hàng quay lại và phàn nàn rằng lỗi vẫn còn đó, đó không phải là một điều tốt. Rốt cuộc, họ đang trả cho bạn $$$ lớn (tôi giả sử) để giải quyết vấn đề này.

Nếu bạn không khắc phục vấn đề đúng cách, bạn đã mất niềm tin với khách hàng (ở một mức độ nào đó) và nếu có đối thủ cạnh tranh trong thị trường của bạn, họ có thể không còn là khách hàng của bạn.


3
"Tái tạo lỗi và sửa lỗi và sau đó chứng minh rằng giải pháp ngăn chặn lỗi tái xuất hiện - đó là nơi cần kết thúc." - quan điểm của tôi chính xác
lưỡng cư

2
"Bởi vì nếu họ không bao giờ tái tạo lỗi, họ không thể biết chắc chắn rằng nó đã được sửa." Amen ...
Marjan Venema

11
Tôi cũng muốn thêm vào câu trả lời này, là vì bạn không có cấu hình này, công ty của bạn nên tìm hiểu xem đây có phải là cấu hình được hỗ trợ hay không. Nếu công ty của bạn sẽ chính thức hỗ trợ các cấu hình như vậy, bạn thực sự phải có một môi trường được cấu hình tương tự chỉ để thực hiện công việc QA của bạn. Điều đó chắc chắn sẽ thêm chi phí, và đó là lý do tại sao công ty nên quyết định cấu hình sản phẩm của họ sẽ hỗ trợ.
Andy

Cần có một đối số chi phí / lợi ích ở đây. Nếu phải mất vài tuần để tái sản xuất, giá trị sinh sản có thể thấp do không giải quyết được các vấn đề khác. Nếu phải mất vài giây để tái tạo, giá trị tái tạo có thể cao, do tính chắc chắn của sửa chữa. Quyết định nên cố gắng cân bằng điều này, một tuyên bố "nên" hoặc "không nên" là vô ích.
orip

1
@orip: Phân tích chi phí / lợi ích cũng cần đưa khách hàng vào tài khoản: Chi phí bỏ qua khách hàng có nguy cơ mất tài khoản (và có thể mất khách hàng khác vì những gì họ nghe được từ khách hàng ban đầu này hay nếu họ nghe thấy cũng đang gặp lỗi nhưng vẫn chưa báo cáo chính thức) lớn hơn chi phí thời gian của nhà phát triển dành cho việc tái tạo và sửa lỗi?
Thất vọngWithFormsDesigner

35

Làm thế nào để họ có ý định xác minh rằng lỗi trong câu hỏi đã được sửa? Họ có muốn gửi mã chưa được kiểm tra cho người dùng và để họ tìm ra nó không? Bất kỳ thiết lập thử nghiệm nào không bao giờ được hiển thị để tái tạo lỗi đều không thể dựa vào để hiển thị sự vắng mặt của lỗi. Bạn chắc chắn không cần phải tạo lại toàn bộ môi trường máy khách, nhưng bạn cần đủ để tái tạo lỗi.

Tôi không nghĩ rằng thật vô lý khi cố gắng tái tạo mọi lỗi trước khi sửa. Tuy nhiên, nếu bạn cố gắng tái tạo nó và bạn không thể quyết định kinh doanh về việc liệu các bản vá mù có phải là một ý tưởng hay hay không.


2
Tôi đồng ý, tuy nhiên nếu một lỗi được tìm thấy bằng cách xem xét, nó có thể cung cấp thông tin quan trọng cần thiết để sao chép nó. Sau đó, bạn có thể sao chép nó và chứng minh rằng bản sửa lỗi là chính xác ...
mattnz

3
Nếu bạn có thể tìm thấy một điều kiện cuộc đua đa luồng bằng cách kiểm tra mã, bạn sẽ có thể sao chép nó một cách nhất quán bằng cách sửa đổi mã bằng các câu lệnh khóa bổ sung buộc các luồng bắt đầu / dừng theo trình tự kích hoạt nó. ex Thread1 - Khởi động và tạm dừng, thread2 - Khởi động và tạm dừng, 1 - bắt đầu sử dụng đối tượng chia sẻ và tạm dừng, 2 - sửa đổi đối tượng chia sẻ và tạm dừng, 1 - thử sử dụng đối tượng chia sẻ và barf. Vấn đề lớn nhất với cách tiếp cận này là trong khi đó là thứ bạn có thể chứng minh trong trình gỡ lỗi, nó không phù hợp để thêm vào bộ kiểm tra tự động. BTDT-GTTS.
Dan Neely

2
@DanNeely: Nếu một luồng ghi một giá trị vào một mảng và sau đó lưu trữ một tham chiếu vào một trường và một luồng khác đọc trường đó và truy cập vào phần tử mảng tương ứng, làm thế nào một lỗi có thể xảy ra nếu JIT di chuyển tham chiếu ghi hoạt động trước khi viết phần tử một?
supercat

27

Lý tưởng nhất là bạn muốn có thể tái tạo từng lỗi để ít nhất, bạn có thể kiểm tra xem nó đã được sửa chưa.

Nhưng ... Điều đó có thể không phải lúc nào cũng khả thi hoặc thậm chí là có thể. Đặc biệt với phần mềm loại 'doanh nghiệp', nơi mỗi cài đặt là duy nhất. Ngoài ra còn có đánh giá chi phí / lợi ích. Một vài giờ tìm kiếm mã và đưa ra một vài phỏng đoán có giáo dục về một vấn đề không quan trọng có thể tốn ít tiền hơn nhiều so với việc nhóm hỗ trợ kỹ thuật dành hàng tuần để cố gắng thiết lập và sao chép chính xác môi trường của khách hàng với hy vọng có thể sao chép vấn đề. Quay lại khi tôi làm việc trong thế giới 'Doanh nghiệp', chúng tôi thường chỉ cần đưa các lập trình viên ra ngoài và nhờ họ sửa lỗi trên trang web, vì không có cách nào để sao chép thiết lập của khách hàng.

Vì vậy, hãy nhân đôi khi bạn có thể, nhưng nếu bạn không thể, thì hãy khai thác kiến ​​thức về hệ thống và cố gắng xác định thủ phạm trong mã.


11

Tôi không nghĩ bạn nên tạo ra một lỗi sao chép yêu cầu để xem xét lỗi. Như bạn đã đề cập, có một số cách để gỡ lỗi vấn đề - và bạn nên sử dụng tất cả chúng. Bạn nên tính mình may mắn khi họ có thể cung cấp cho bạn một tệp nhật ký! Nếu bạn hoặc ai đó ở công ty của bạn có thể tái tạo lỗi, thật tuyệt! Nếu không, bạn vẫn nên cố gắng phân tích các bản ghi và tìm các trường hợp xảy ra lỗi. Có thể, như các đồng nghiệp của bạn đề nghị, đọc mã, tìm ra những điều kiện lỗi có thể xảy ra, sau đó cố gắng tự tạo lại kịch bản.

Tuy nhiên, không phát hành bản sửa lỗi thực tế chưa được kiểm tra. Mọi thay đổi bạn thực hiện phải trải qua quá trình phát triển chuẩn, kiểm tra QA và kiểm tra tích hợp. Nó có thể khó kiểm tra - bạn đã đề cập đến mã đa luồng, rất khó để gỡ lỗi. Đây là nơi tôi đồng ý với cách tiếp cận của bạn để tạo cấu hình hoặc môi trường thử nghiệm. Nếu bạn đã tìm thấy một vấn đề trong mã, bạn sẽ thấy nó đơn giản hơn nhiều để tạo môi trường, tái tạo vấn đề và kiểm tra sửa lỗi.

Đối với tôi, đây không phải là vấn đề gỡ lỗi và nhiều vấn đề về dịch vụ khách hàng. Bạn đã nhận được một báo cáo lỗi từ một khách hàng; bạn có trách nhiệm thực hiện thẩm định để tìm ra vấn đề của họ và khắc phục nó.


5
"Tuy nhiên, không phát hành bản sửa lỗi thực tế chưa được kiểm tra." Làm thế nào? Nếu anh ta không thể tái tạo các điều kiện gây ra lỗi, anh ta sẽ tái tạo chúng như thế nào để kiểm tra sửa chữa? Ngoài ra tôi sẽ không cho rằng OP đã không nỗ lực hết mình.
Tulains Córdova

"Nếu bạn đã tìm thấy một vấn đề trong mã, bạn nên tìm thấy nó đơn giản hơn nhiều để tạo môi trường, tái tạo vấn đề và kiểm tra sửa lỗi." Tôi đã đọc câu hỏi của OP là "Tôi có nên yêu cầu tất cả các báo cáo lỗi phải có trường hợp repro trước khi cố gắng chẩn đoán vấn đề không?" Không, bạn không nên.
Michael K

Tôi hy vọng hầu hết các thử nghiệm sẽ là thử nghiệm hồi quy các tính năng hiện có.
Michael Durrant

4
@MichaelK: Câu trả lời của bạn dường như mâu thuẫn với chính nó. Nếu bạn không xác định các bước để tái tạo lỗi, làm thế nào bạn biết trường hợp kiểm tra của mình là gì? Bạn có thể không phải lúc nào cũng cần tự tái tạo các lỗi, nhưng hầu hết các trường hợp đó sẽ xảy ra khi các bước để tái tạo đã được biết đến. Nếu tất cả những gì bạn có là một tệp nhật ký không có các bước đã biết, thì bạn không có trường hợp kiểm tra nào đối với QA.
Ellesedil

8
Tôi nghĩ những gì anh ấy nói là, bạn không nhất thiết phải tái tạo vấn đề để điều tra cách khắc phục. Và giả sử bạn theo dõi nó và tìm cách khắc phục, thì bạn sẽ biết các điều kiện để thiết lập trên máy chủ thử nghiệm để sao chép. Tại thời điểm đó, bạn thậm chí còn biết cách thiết lập mã trước đó - thiết lập mã, xác minh rằng nó có thể tái tạo, triển khai sửa lỗi, xác minh rằng nó đã được sửa.
GalacticCowboy

9

Theo tôi ... là người ra quyết định, bạn phải có khả năng biện minh cho vị trí của mình. Nếu mục tiêu của bộ phận hỗ trợ dòng 3 là sửa lỗi trong khung thời gian ngắn nhất với nỗ lực chấp nhận được từ khách hàng, thì mọi cách tiếp cận đều phải tuân thủ mục tiêu đó. Hơn nữa, nếu cách tiếp cận có thể được chứng minh là cho kết quả mong đợi nhanh nhất, thì sẽ không có vấn đề gì trong việc thuyết phục đội.

Đã làm việc trong bộ phận hỗ trợ, tôi luôn mong muốn khách hàng có thể đưa ra một số "kịch bản" hành động mà họ đã thực hiện để tái tạo lỗi một cách nhất quán và nếu không nhất quán thì các ví dụ ứng viên đã tạo ra lỗi.

Nếu tôi chưa quen với hệ thống và không có nền tảng với mã, các bước đầu tiên của tôi sẽ là cố gắng xác định các nguồn có thể có lỗi. Có thể là việc đăng nhập không đủ để xác định mã ứng cử viên. Tùy thuộc vào khách hàng, tôi có thể có xu hướng cung cấp cho họ phiên bản gỡ lỗi để họ có thể cung cấp cho bạn các tệp nhật ký cung cấp thêm manh mối về vị trí của mã vi phạm.

Nếu tôi có thể nhanh chóng xác định khối mã thì ánh xạ trực quan của luồng có thể đủ để phát hiện mã. Nếu không, thì mô phỏng dựa trên thử nghiệm đơn vị có thể là đủ. Có thể là việc thiết lập môi trường sao chép máy khách mất ít thời gian hơn, đặc biệt nếu có nhiều khả năng nhân rộng của vấn đề.

Tôi nghĩ rằng bạn có thể thấy rằng cách tiếp cận của bạn nên là sự kết hợp của các giải pháp được đề xuất và việc biết khi nào nên bỏ một và chuyển sang tiếp theo là chìa khóa để hoàn thành công việc một cách hiệu quả.

Tôi khá chắc chắn rằng nhóm sẽ ủng hộ quan điểm rằng nếu có cơ hội, giải pháp của họ sẽ tìm ra lỗi nhanh hơn, sau đó cung cấp cho họ khung thời gian phù hợp để chứng minh rằng sẽ không ảnh hưởng quá nhiều đến thời gian cần khắc phục lỗi. tuyến đường bạn đi.


8

Có hợp lý để nhấn mạnh vào việc tái tạo mọi khiếm khuyết và gỡ lỗi trước khi chẩn đoán và sửa chữa nó không?

Tôi nói có, với một số hãy cẩn thận.

  • Tôi nghĩ không sao khi đọc qua mã và cố gắng tìm những nơi có vẻ như chúng có vấn đề. Tạo một bản vá và gửi nó cho khách hàng để xem nếu điều đó giải quyết vấn đề. Nếu phương pháp này tiếp tục thất bại, thì bạn có thể cần điều tra các lựa chọn khác. Chỉ cần nhớ rằng trong khi bạn có thể được giải quyết một lỗi nó có thể không được các lỗi đã được báo cáo.
  • Nếu bạn không thể sao chép nó theo lý do và bạn không thể tìm thấy bất kỳ cờ đỏ nào trong mã, thì nó có thể yêu cầu sự phối hợp chặt chẽ hơn với khách hàng. Tôi đã bay ra các trang web của khách hàng trước để thực hiện gỡ lỗi trang web. Đây không phải là môi trường phát triển tốt nhất, nhưng đôi khi nếu vấn đề là do môi trường, thì việc tìm ra nguyên nhân chính xác sẽ trở nên dễ dàng nhất khi bạn có thể tái tạo nó một cách nhất quán.

Tôi đã đứng về phía khách hàng của bàn trong kịch bản này. Tôi đang làm việc tại một văn phòng chính phủ Hoa Kỳ sử dụng một cụm cơ sở dữ liệu Oracle cực kỳ lớn (vài terabyte dữ liệu và xử lý hàng triệu bản ghi mỗi ngày).

Chúng tôi gặp phải một vấn đề kỳ lạ rất dễ xảy ra đối với chúng tôi. Chúng tôi đã báo cáo lỗi cho Oracle và quay lại với họ trong nhiều tuần, gửi cho họ nhật ký. Họ nói rằng họ không thể tái tạo vấn đề, nhưng đã gửi cho chúng tôi một vài bản vá mà hy vọng có thể giải quyết vấn đề. Không ai trong số họ đã làm.

Cuối cùng họ đã bay ra một vài nhà phát triển đến vị trí của chúng tôi để gỡ lỗi vấn đề trên trang web. Và đó là khi nguyên nhân gốc của lỗi được tìm thấy và một bản vá sau đó đã giải quyết chính xác vấn đề.


6

Nếu bạn không tích cực về vấn đề, bạn không thể tích cực về giải pháp. Biết cách tái tạo vấn đề một cách đáng tin cậy trong ít nhất một tình huống trường hợp kiểm tra cho phép bạn chứng minh rằng bạn biết cách gây ra lỗi và do đó cũng cho phép bạn chứng minh rằng vấn đề đã được giải quyết, do thiếu sót sau đó lỗi trong cùng một trường hợp thử nghiệm sau khi áp dụng sửa chữa.

Điều đó nói rằng, điều kiện chủng tộc, các vấn đề đồng thời và các lỗi "không xác định" khác là một trong những khó khăn nhất đối với nhà phát triển để khắc phục theo cách này, bởi vì chúng xảy ra không thường xuyên, trên một hệ thống có tải cao hơn và phức tạp hơn bất kỳ bản sao nào của nhà phát triển chương trình và chúng biến mất khi tác vụ được chạy lại trên cùng một hệ thống sau đó.

Thường xuyên hơn không, những gì ban đầu trông giống như một lỗi ngẫu nhiên cuối cùng có nguyên nhân xác định dẫn đến lỗi này có thể được tái sản xuất một cách xác định một khi bạn biết cách. Những con vật bất chấp điều này, Heisenbugs thực sự (những con bọ dường như ngẫu nhiên biến mất khi cố gắng kiểm tra chúng trong môi trường vô trùng, được theo dõi), có liên quan đến thời gian 99,9% và khi bạn hiểu điều đó, con đường phía trước của bạn sẽ rõ ràng hơn; quét những thứ có thể thất bại nếu có thứ gì đó khác nhận được từ edgewise trong quá trình thực thi mã và khi bạn tìm thấy lỗ hổng như vậy, hãy thử khai thác nó trong một thử nghiệm để xem liệu nó có thể hiện hành vi mà bạn đang cố gắng tái tạo hay không.

Một số lượng đáng kể kiểm tra mã chuyên sâu thường được yêu cầu trong các tình huống này; bạn phải xem mã, từ bỏ bất kỳ khái niệm định sẵn nào về cách mã được cho là hành xử và tưởng tượng các tình huống có thể thất bại theo cách mà khách hàng của bạn đã quan sát. Đối với mỗi kịch bản, hãy thử phát triển một thử nghiệm có thể chạy hiệu quả trong môi trường thử nghiệm tự động hiện tại của bạn (nghĩa là không cần ngăn xếp VM mới chỉ cho một thử nghiệm này), điều đó sẽ chứng minh hoặc chứng minh rằng mã hoạt động như bạn mong đợi ( mà, tùy thuộc vào những gì bạn mong đợi, sẽ chứng minh hoặc chứng minh rằng mã này là nguyên nhân có thể gây ra sự cố của khách hàng). Đây là phương pháp khoa học cho các kỹ sư phần mềm; quan sát, đưa ra giả thuyết, kiểm tra, phản ánh, lặp lại.


4

Có hợp lý để nhấn mạnh vào việc tái tạo mọi khiếm khuyết và gỡ lỗi trước khi chẩn đoán và sửa chữa nó không?

Không, nó chắc chắn là không. Đó sẽ là một chính sách ngu ngốc.

Vấn đề tôi thấy với câu hỏi của bạn và đề xuất của bạn là họ không phân biệt được

  • báo cáo lỗi
  • lỗi ( lỗi )
  • lỗi (đôi khi được gọi là lỗi )

Một báo cáo lỗi là truyền thông về một lỗi. Nó cho bạn biết ai đó nghĩ có gì đó không ổn. Nó có thể hoặc không thể cụ thể về những gì được cho là sai.

Một báo cáo lỗi là bằng chứng của một thất bại.

Một thất bại là một sự cố của một cái gì đó đi sai. Một trục trặc cụ thể, nhưng không nhất thiết với bất kỳ manh mối nào về những gì có thể đã gây ra nó.

Một lỗi có thể được gây ra bởi một lỗi.

Một lỗi là một nguyên nhân của thất bại; một cái gì đó có thể (về nguyên tắc) được thay đổi để ngăn chặn những thất bại mà nó gây ra trong tương lai.

Đôi khi, khi một lỗi được báo cáo, nguyên nhân ngay lập tức rõ ràng. Trong trường hợp như vậy, tái tạo lỗi sẽ là vô nghĩa. Vào những thời điểm khác, nguyên nhân hoàn toàn không rõ ràng: báo cáo lỗi không mô tả bất kỳ lỗi cụ thể nào, hoặc có, nhưng thất bại là do nó không cung cấp manh mối về nguyên nhân có thể là nguyên nhân. Trong những trường hợp như vậy, tôi cảm thấy lời khuyên của bạn là hợp lý - nhưng không phải lúc nào cũng vậy: người ta không khăng khăng đâm một tên lửa không gian trị giá $ 370 triệu thứ hai trước khi chấp nhận điều tra nguyên nhân khiến chiếc đầu tiên gặp sự cố (một lỗi cụ thể trong phần mềm điều khiển).

Và cũng có tất cả các loại trường hợp ở giữa; chẳng hạn, nếu một báo cáo lỗi không chứng minh được, nhưng chỉ gợi ý rằng một vấn đề tiềm ẩn mà bạn đã biết có thể đóng vai trò, thì điều này có thể đủ khích lệ để bạn xem xét kỹ hơn.

Vì vậy, trong khi nhấn mạnh vào khả năng tái sản xuất là khôn ngoan đối với các trường hợp khó khăn hơn, thì việc thi hành nó như một chính sách nghiêm ngặt là không khôn ngoan.


4
Nếu nó không hợp lý để tái tạo lỗi, làm sao bạn biết bạn đã sửa lỗi? Bất kể cách tái tạo lỗi phức tạp như thế nào.
Bовић

Bạn biết rằng bạn sẽ sửa lỗi khi dễ tái tạo mà bạn không cần.
rebierpost

Mục tiêu không phải là sửa lỗi, mục tiêu là có một sản phẩm tốt. Bạn thực hiện thay đổi mã để cải thiện mã, và theo ý kiến ​​của bạn và ý kiến ​​của người đánh giá, có thể khắc phục lỗi. Sau đó, sản phẩm sẽ được kiểm tra lại. Có thể bởi người kiểm tra không tự nguyện aka người dùng cuối.
gnasher729

Tôi đồng ý rằng việc kiểm tra lại phải luôn luôn được thực hiện khi có thể, nhưng đó là vấn đề bên cạnh. Câu hỏi ở đây là liệu có hợp lý không khi luôn khăng khăng vấn đề có thể tái sản xuất ngay từ đầu.
Revierpost

3

Như mọi thứ khác trong phát triển phần mềm, câu trả lời đúng là một sự thỏa hiệp.

Về lý thuyết, bạn không bao giờ nên cố gắng sửa lỗi nếu bạn không thể chứng minh rằng nó tồn tại. Làm như vậy có thể khiến bạn thực hiện các thay đổi không cần thiết đối với mã của mình mà cuối cùng không giải quyết được gì. Và chứng minh nó có nghĩa là tái tạo nó trước, sau đó tạo và áp dụng một bản sửa lỗi, sau đó chứng minh rằng nó không còn xảy ra nữa. Ruột của bạn ở đây đang hướng bạn đi đúng hướng - nếu bạn muốn tự tin rằng bạn đã giải quyết vấn đề của khách hàng, bạn cần biết nguyên nhân gây ra vấn đề đó ngay từ đầu.

Trong thực tế, điều đó không phải lúc nào cũng có thể. Có lẽ lỗi chỉ xảy ra trên các cụm lớn với hàng chục người dùng truy cập đồng thời mã của bạn. Có lẽ có một sự kết hợp cụ thể của các hoạt động dữ liệu trên các bộ dữ liệu cụ thể gây ra lỗi và bạn không biết đó là gì. Có lẽ khách hàng của bạn đã chạy chương trình tương tác không ngừng trong 100 giờ trước khi lỗi xuất hiện.

Trong bất kỳ trường hợp nào, có nhiều khả năng bộ phận của bạn sẽ không có thời gian hoặc tiền bạc để tái tạo lỗi trước khi bạn bắt đầu làm việc. Trong nhiều trường hợp, nhà phát triển rõ ràng hơn nhiều đối với bạn, rằng có một lỗi trong mã chỉ cho bạn tình huống chính xác. Khi bạn đã chẩn đoán vấn đề, bạn có thể quay lại và tái tạo nó. Điều đó không lý tưởng, nhưng đồng thời, một phần công việc của bạn với tư cách là nhà phát triển cao cấp là biết cách đọc và giải thích mã, một phần để xác định các loại lỗi chôn này.

Theo tôi, bạn đang tập trung vào phần sai của câu hỏi. Điều gì xảy ra nếu cuối cùng bạn không thể tái tạo lỗi trong câu hỏi? Không có gì khiến khách hàng khó chịu hơn là nghe "ừ, chúng tôi biết bạn đã làm hỏng chương trình nhưng chúng tôi không thể sao chép nó, vì vậy đó không phải là một lỗi." Khi khách hàng của bạn nghe thấy điều này, họ giải thích nó là "chúng tôi biết phần mềm của chúng tôi có lỗi nhưng chúng tôi không thể sửa và sửa lỗi để chỉ cần vượt qua ngón tay của bạn." Nếu tốt hơn là đóng một lỗi được báo cáo là "không thể tái tạo" hoặc đóng nó là "không thể tái tạo, nhưng chúng tôi đã thực hiện một số thay đổi hợp lý để cố gắng cải thiện tính ổn định"?


3

Trừ khi lỗi là hiển nhiên, rõ ràng và tầm thường, với một thông báo lỗi rất cụ thể, v.v., thường sẽ rất khó để sửa lỗi nếu người dùng hoặc người bảo trì không thể sao chép nó.

Ngoài ra, làm thế nào bạn chứng minh với họ rằng lỗi đã được sửa nếu bạn không thể sao chép các bước?

Vấn đề với trường hợp của bạn là người dùng không biết lỗi đã xảy ra như thế nào, nghĩa là, trong màn hình thực hiện thao tác nào. Họ chỉ đơn giản là có nhật ký.

Tôi nghĩ rằng quan điểm của bạn là hợp lý. Nếu bạn có năng lực ngoại cảm , bạn có thể sẽ không làm việc với mức lương.

Tôi nghĩ bạn nên nói với các sếp của mình rằng nếu không thể sao chép lỗi thì sẽ mất một khoảng thời gian để tìm ra nó và bạn sẽ không có bất kỳ sự bảo đảm nào.

Vấn đề sẽ xảy ra khi một số đồng nghiệp của bạn phát hiện ra lỗi không may mắn và sửa nó.


3

Chúng ta hãy đưa nó đến mức cực đoan và giả sử rằng bạn đã tìm thấy lỗi sớm hơn nhiều: trong mã của bạn, khi bạn đang viết nó. Sau đó, bạn sẽ không có bất kỳ điều gì về việc sửa nó ngay tại đó - bạn thấy một lỗ hổng logic trong mã bạn vừa viết, nó không làm những gì bạn muốn nó làm. Bạn sẽ không cần phải thiết lập toàn bộ môi trường để chứng minh rằng đó thực sự là một lỗi.

Bây giờ một báo cáo lỗi đến. Có một số điều bạn có thể làm. Một trong số đó là quay lại mã và đọc lại nó. Bây giờ giả sử rằng trong lần đọc thứ hai này, bạn ngay lập tức tìm thấy lỗi trong mã - đơn giản là nó không làm những gì bạn dự định làm và bạn đã không nhận thấy khi bạn viết nó. , nó giải thích hoàn hảo lỗi vừa xuất hiện! Bạn sửa chữa. Phải mất hai mươi phút.

Điều đó có sửa lỗi gây ra báo cáo lỗi không? Bạn không thể chắc chắn 100% (có thể có hai lỗi gây ra điều tương tự), nhưng có lẽ nó đã xảy ra.

Một điều khác bạn có thể làm là tái tạo cấu hình của khách hàng cũng như bạn có thể (một vài ngày làm việc) và cuối cùng là tái tạo lỗi. Trong nhiều trường hợp, có các vấn đề về thời gian và đồng thời có nghĩa là bạn không thể tái tạo lỗi, nhưng bạn có thể thử rất nhiều thời gian và đôi khi thấy điều tương tự xảy ra. Bây giờ bạn bắt đầu gỡ lỗi, tìm lỗi trong mã, đặt nó vào môi trường và bạn thử lại rất nhiều lần. Bạn không thấy lỗi xảy ra nữa.

Điều đó có sửa lỗi gây ra báo cáo lỗi không? Bạn vẫn không thể chắc chắn 100% - một, bạn thực sự có thể đã thấy một lỗi hoàn toàn khác mà khách hàng đã làm, hai, có thể bạn không thử thường xuyên, và ba, có thể cấu hình vẫn hơi khác và đó là cố định trên hệ thống này, nhưng không phải của khách hàng.

Vì vậy, sự chắc chắn là không thể có được trong mọi trường hợp. Nhưng phương pháp đầu tiên là cách nhanh hơn (bạn cũng có thể cung cấp cho khách hàng bản vá nhanh hơn), rẻ hơn và, nếu bạn tìm thấy một lỗi mã hóa rõ ràng giải thích triệu chứng này, thực tế cũng có khả năng tìm thấy vấn đề hơn.

Vì vậy, nó phụ thuộc. Nếu nó rẻ để thiết lập môi trường thử nghiệm (hoặc tốt hơn: thử nghiệm tự động cho thấy sự cố), thì hãy làm điều đó. Nhưng nếu nó đắt tiền và / hoặc hoàn cảnh mà lỗi hiển thị là không thể đoán trước, thì tốt hơn hết là bạn nên cố gắng tìm lỗi bằng cách đọc mã trước.


bạn có cho rằng mã là của tôi để bắt đầu không?
lưỡng cư

Theo kinh nghiệm của tôi, các báo cáo lỗi thường kết thúc với anh chàng đã viết mã, nhưng điều đó không quan trọng đối với câu trả lời của tôi. Bạn cũng có thể đọc mã của người khác và thấy lỗi trong đó.
RemcoGerlich

1

Đọc câu hỏi, tôi không thấy bất kỳ sự đối lập cơ bản nào giữa vị trí của bạn và nhóm của bạn.

  • Có, bạn nên nỗ lực hết sức để tái tạo sự cố xảy ra trong cài đặt máy khách. Nhưng nỗ lực tốt nhất có nghĩa là bạn nên xác định một số hộp thời gian cho điều đó và có thể không có đủ dữ liệu trong nhật ký để thực sự tái tạo vấn đề.

    Nếu vậy, tất cả phụ thuộc vào mối quan hệ với khách hàng này. Nó có thể đi từ bạn sẽ không có bất cứ thứ gì khác từ anh ta, để bạn có thể gửi một nhà phát triển trên trang web với các công cụ chẩn đoán và khả năng chạy chúng trên hệ thống bị lỗi. Thông thường, chúng tôi ở đâu đó ở giữa và nếu dữ liệu ban đầu không đủ thì có nhiều cách để có thêm.

  • Có, một nhà phát triển cao cấp sẽ có thể đọc mã và có khả năng tìm ra lý do của vấn đề theo nội dung nhật ký. Thực sự, thường có thể viết một số bài kiểm tra đơn vị thể hiện vấn đề sau khi đọc kỹ mã.

    Viết thành công các bài kiểm tra đơn vị như vậy cũng gần như tái tạo môi trường chức năng phá vỡ. Tất nhiên, phương pháp này không phải là một đảm bảo rằng bạn sẽ tìm thấy bất cứ điều gì. Hiểu chính xác chuỗi sự kiện dẫn đến thất bại trong một số phần mềm đa luồng có thể rất khó tìm thấy chỉ bằng cách đọc mã và khả năng gỡ lỗi trực tiếp có thể trở nên quan trọng.

Cuối cùng, tôi sẽ thử cả hai cách tiếp cận đồng thời và yêu cầu một hệ thống trực tiếp thể hiện sự cố (và cho thấy rằng nó đã được khắc phục sau đó) hoặc cho một số thử nghiệm đơn vị phá vỡ sự cố (và cũng cho thấy nó đã được sửa sau khi sửa).

Cố gắng chỉ sửa mã và gửi nó trong tự nhiên, thực sự trông rất rủi ro. Trong một số trường hợp tương tự xảy ra với tôi (nơi chúng tôi không thể tái tạo khiếm khuyết bên trong), tôi đã nói rõ rằng nếu một sửa chữa xảy ra trong tự nhiên và không giải quyết được vấn đề của khách hàng, hoặc có bất kỳ hậu quả tiêu cực bất ngờ nào khác, anh chàng đã đề xuất nó sẽ phải giúp nhóm hỗ trợ tìm ra vấn đề thực sự. Bao gồm cả giao dịch với khách hàng nếu cần thiết.


1

Âm thanh với tôi như bạn cần đăng nhập chi tiết hơn.

Mặc dù việc thêm ghi nhật ký không thể đảm bảo rằng bạn sẽ không cần gỡ lỗi (hoặc, trong trường hợp này, tái tạo tình huống), nó sẽ giúp bạn hiểu rõ hơn về những gì thực sự đã sai.

Đặc biệt là trong các tình huống phức tạp / phân luồng hoặc bất cứ điều gì mà bạn không thể sử dụng trình gỡ lỗi, việc quay lại "gỡ lỗi bằng printf ()" có thể là cách duy nhất của bạn. Trong trường hợp đó, hãy đăng nhập càng nhiều càng tốt (nhiều hơn bạn mong muốn) và có một số công cụ tốt để lọc lúa mì từ vỏ trấu.


1

Có hợp lý để nhấn mạnh vào việc tái tạo mọi khiếm khuyết và gỡ lỗi trước khi chẩn đoán và sửa chữa nó không?

Vì chưa ai nói điều đó rõ ràng: Hoàn toàn không!

Giống như mọi thứ khác trong phát triển phần mềm, sửa lỗi có nghĩa là ghi nhớ thời gian, rủi ro và chi phí. Tìm sự cân bằng giữa những điều này là một nửa mô tả công việc của một nhà phát triển.

Một số lỗi không đủ quan trọng để dành 2 ngày, nhưng đủ quan trọng để dành 10 phút để sửa chúng. Các lỗi khác là không xác định và bạn đã biết môi trường kiểm tra không thể chứng minh rằng chúng đã được sửa. Nếu thiết lập môi trường kiểm tra mất 2 ngày, bạn không làm điều đó cho các lỗi này. Thay vào đó, bạn dành thời gian cho những thứ thông minh hơn, chẳng hạn như tìm cách thiết lập môi trường thử nghiệm trong 5 phút thay vì 2 ngày.

Và tất nhiên, có những lỗi mà nếu bạn hiểu sai, khách hàng sẽ mất $ 100'000. Và các lỗi mà khách hàng sẽ mất $ 100.000 mỗi giờ, lỗi không được sửa. Bạn cần xem xét lỗi và đưa ra quyết định. Báo cáo chăn để xử lý tất cả các lỗi giống nhau không làm việc.


0

Câu hỏi rất hay! Ý kiến ​​của tôi là nếu bạn không thể tái tạo vấn đề thì bạn không thể chắc chắn 100% nói rằng bản sửa lỗi bạn đã thực hiện sẽ không:

a) thực sự khắc phục vấn đề. b) tạo ra một lỗi khác

Đôi khi có một lỗi xảy ra và tôi sửa nó và tôi không muốn kiểm tra nó. Tôi biết 100% chắc chắn rằng nó hoạt động. Nhưng cho đến khi bộ phận QA của chúng tôi nói rằng nó hoạt động thì tôi vẫn coi đó là khả năng vẫn còn lỗi ... hoặc một lỗi mới được tạo từ bản sửa lỗi.

Nếu bạn không thể tái tạo lỗi và sau đó cài đặt phiên bản mới và xác nhận rằng nó đã được sửa thì bạn không thể, chắc chắn 100%, nói rằng lỗi đã biến mất.

Tôi đã cố gắng trong vài phút để nghĩ về một sự tương tự để giúp bạn giải thích cho người khác nhưng không có gì thực sự xuất hiện trong đầu. Thắt ống dẫn tinh là một ví dụ buồn cười nhưng nó không giống như vậy :-)


Giả sử, ví dụ người ta nhận được một báo cáo rằng chương trình thỉnh thoảng định dạng không chính xác một số số có định dạng thập phân khi được cài đặt trên phiên bản Windows của Pháp; một tìm kiếm mã cài đặt văn hóa cho thấy người ta phát hiện ra một phương thức lưu văn hóa luồng hiện tại và đặt nó vào InvariantCulturetrong một CompareExchangevòng lặp, nhưng sau đó đặt lại nó [như vậy nếu CompareExchangelần đầu tiên thất bại, biến văn hóa "đã lưu" sẽ bị ghi đè] . Tái tạo các trường hợp thất bại sẽ khó khăn, nhưng mã rõ ràng là sai và có thể gây ra vấn đề được chỉ định.
supercat

Trong trường hợp như vậy, có cần phải tái tạo lỗi không, hoặc thực tế là mã được đề cập rõ ràng có khả năng gây ra lỗi như chỉ định là đủ nếu người ta kiểm tra mã cho bất kỳ nơi nào khác có chế độ lỗi tương tự có thể xảy ra?
supercat

Vâng, đó là toàn bộ, "nó phụ thuộc" vào tranh luận tình huống. Nếu đó là một nhiệm vụ quan trọng đối với sự sống hoặc hệ thống tử vong hoặc khách hàng mong đợi loại thử nghiệm đó thì có, hãy nỗ lực hết sức để tái tạo vấn đề và thử nghiệm. Tôi đã phải tải mã xuống máy khách hàng để tôi có thể gỡ lỗi vì chúng tôi không thể tạo lại sự cố trong các máy chủ thử nghiệm của mình. Đó là một số loại vấn đề bảo mật windows. Tạo một bản sửa lỗi và mọi người đều hạnh phúc. Thật khó nếu thiết lập môi trường kiểm tra khó hơn sửa lỗi. Sau đó, bạn có thể hỏi khách hàng. Hầu hết thời gian họ đều ổn với việc tự kiểm tra nó.
Jaydel Gluckie

Với các vấn đề luồng bị nghi ngờ, ngay cả khi người ta có thể xoay xở mọi thứ theo cách buộc mọi thứ xảy ra vào đúng thời điểm "sai", có cách nào để thực sự biết liệu vấn đề bạn tái tạo có giống như đã xảy ra không khách hàng? Nếu mã có khiếm khuyết sao cho mọi thứ xảy ra với một thời điểm nhất định sẽ gây ra lỗi và ít nhất về mặt lý thuyết có thể xảy ra cho thời gian đó, tôi nghĩ rằng mã phải được sửa chữa cho dù người ta có thể tạo ra môi trường thử nghiệm hay không thời gian cần thiết xảy ra. Trong nhiều tình huống như vậy ...
supercat

... môi trường thử nghiệm và sản xuất có khả năng có đủ sự khác biệt về thời gian để đánh giá xem thời gian xấu cụ thể có thực sự xảy ra hay không là cực kỳ khó khăn và không có nhiều thông tin. Điều quan trọng là kiểm tra những nơi có khả năng nhạy cảm với thời gian để đảm bảo rằng chúng không có, vì các xét nghiệm về độ nhạy thời gian có xu hướng có nhiều âm tính giả.
supercat

0

[lỗi liên quan đến] truy cập cơ sở dữ liệu đồng thời, thực hiện theo cụm, đa luồng

Có hợp lý để nhấn mạnh vào việc tái tạo mọi khiếm khuyết và gỡ lỗi trước khi chẩn đoán và sửa chữa nó không?

Tôi sẽ không mất quá nhiều thời gian để cố gắng tái tạo nó. Điều đó có vẻ như là một vấn đề đồng bộ hóa và những vấn đề thường được tìm thấy bằng cách suy luận (bắt đầu từ các nhật ký như bạn phải xác định hệ thống con trong đó xảy ra sự cố) hơn là có thể tìm cách tái tạo nó và tấn công nó bằng trình gỡ lỗi . Theo kinh nghiệm của tôi, việc giảm mức tối ưu hóa của mã hoặc đôi khi và thậm chí kích hoạt thiết bị bổ sung có thể đủ để thêm đủ độ trễ hoặc thiếu nguyên thủy đồng bộ hóa để ngăn lỗi xuất hiện.

Có, nếu bạn không có cách tái tạo lỗi, bạn sẽ không thể chắc chắn rằng mình đã sửa nó. Nhưng nếu khách hàng của bạn không cung cấp cho bạn cách tái tạo nó, bạn cũng có thể đang tìm kiếm thứ gì đó tương tự với hậu quả tương tự nhưng nguyên nhân gốc rễ khác.


0

Cả hai hoạt động (xem xét mã và kiểm tra) đều cần thiết, không đủ.

Bạn có thể mất hàng tháng để xây dựng các thử nghiệm cố gắng khắc phục lỗi và không bao giờ đi đến đâu nếu bạn không nhìn vào mã và hình thành một giả thuyết để thu hẹp không gian tìm kiếm. Bạn có thể thổi hàng tháng vào rốn của mình khi cố gắng hình dung một lỗi trong mã, thậm chí có thể nghĩ rằng bạn đã tìm thấy nó một lần, hai lần, ba lần, chỉ để khách hàng ngày càng thiếu kiên nhẫn nói: "Không, lỗi vẫn còn đó. "

Một số nhà phát triển tương đối tốt hơn ở một hoạt động (xem xét mã so với xây dựng thử nghiệm) so với hoạt động khác. Một người quản lý hoàn hảo cân nhắc những điểm mạnh này khi gán lỗi. Một cách tiếp cận nhóm có thể thậm chí hiệu quả hơn.

Cuối cùng, có thể không có đủ thông tin để sửa lỗi và bạn phải để nó ướp trong một thời gian với hy vọng một khách hàng khác sẽ tìm thấy một vấn đề tương tự, giúp bạn hiểu rõ hơn về vấn đề cấu hình. Nếu khách hàng nhìn thấy lỗi thực sự muốn sửa nó, họ sẽ làm việc với bạn để thu thập thêm thông tin. Nếu vấn đề này chỉ xảy ra một lần, thì đó có lẽ không phải là lỗi ưu tiên cao ngay cả khi khách hàng quan trọng. Đôi khi không làm việc một lỗi thông minh hơn là thổi bay hàng giờ đồng hồ xung quanh để tìm kiếm một khiếm khuyết thực sự tối nghĩa với không đủ thông tin.

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.