Phát triển phần mềm phòng sạch (Cleanroom Software Development)

Cleanroom là một quy trình phát triển phần mềm hơn là một kỹ thuật kiểm thử. Cho đến bây giờ, kỹ thuật này vẫn được xem là một cách mới của việc suy nghĩ về kiểm thử và đảm bảo chất lượng phần mềm.

Ý tưởng của cleanroom là nhằm tránh tiêu tốn chi phí cho hoạt động phát hiện và gỡ bỏ các lỗi bằng cách viết mã lệnh chương trình một cách chính xác ngay từ ban đầu, với những phương pháp chính thống như kỹ thuật chứng minh tính đúng đắn trước khi kiểm thử.

1. Nghệ thuật của việc gỡ lỗi.

Kiểm thử phần mềm là một tiến trình có thể được vạch kế hoạch và xác định một cách hệ thống. Việc thiết kế trường hợp kiểm thử có thể tiến hành một chiến lược xác định và có kết quả được tính toán theo thời gian.

Gỡ lỗi xuất hiện như hậu quả của việc kiểm thử thành công. Tức là, khi một trường hợp kiểm thử phát hiện ra lỗi thì việc gỡ lỗi là tiến trình sẽ nảy sinh để loại bỏ lỗi. Mặc dù việc gỡ lỗi có thể nên là một tiến trình có trật tự, nó phần lớn còn là nghệ thuật.

Người kỹ sư phần mềm khi tính các kết quả của phép thử, thường hay phải đương đầu với chỉ dẫn “triệu chứng” và vấn đề phần mềm. Tức là, cái biểu lộ ra bên ngoài của lỗi và nguyên nhân bên trong của lỗi có thể có mối quan hệ không hiến nhiên tới một lỗi khác. Tiến trình tâm trí ít hiểu biết gần một triệu chứng với nguyên nhân chính của việc gỡ lỗi.

2. Tiến trình gỡ lỗi.

Gỡ lỗi không phải là kiểm thử, nhưng bao giờ cũng xuất hiện như một hệ quả kiểm thử. Kết quả được thẩm định và gặp việc thiếu sự tương ứng giữa kết quả trông đợi và thực tế. Trong nhiều trường hợp, dữ liệu không tương ứng là triệu chứng của một nguyên nhân nền tảng còn bị che kín. Tiến trình gỡ lỗi cố gắng ghép triệu chứng và nguyên nhân, từ đó dẫn tới việc sửa lỗi.

Tiến trình gỡ lỗi bao giờ cũng sinh ra một trong hai kết quả logic: Nguyên nhân sẽ được tìm ra, sửa chữa và loại bỏ hay nguyên nhân sẽ không được tìm ra. Trong trường hợp sau, người thực hiện gỡ lỗi có thể hoài nghi một nguyên nhân, thiết kế ra một trường hợp kiểm thử giúp hợp lệ hoá hoài nghi của mình và việc làm hướng tới việc sửa lỗi theo cách lặp lại.

Tại sao gỡ lỗi lại khó? Rất có thể tâm lý con người có liên quan nhiều tới câu trả lời hơn là công nghệ phần mềm. Tuy nhiên một vài đặc trưng của lỗi đưa ra vài manh mối:

– Triệu chứng và nguyên nhân có thể xa nhau về mặt địa lý. Tức là, những triệu chứng có thể xuất hiện trong một phần này của chương trình, trong khi nguyên nhân thực tế có thể định vị ở một vị trí xa. Các cấu trúc chương trình đi đôi với nhau làm trầm trọng thêm tình huống này.

– Triệu chứng có thể biến mất (tạm thời) khi một lỗi khác được sửa chữa.

– Triệu chứng thực tế có thể gây ra không lỗi (như do sự không chính xác của việc làm tròn số).

– Triệu chứng có thể được gây ra do lỗi con người không dễ lấn dấu vết.

– Triệu chứng có thể là kết quả của vấn đề thời gian, thay vì vấn đề xử lý.

– Có thể khó tái tạo lại chính xác các điều kiện vào (như ứng dụng thời gian thực trong đó thứ tự vào không xác định).

– Triệu chứng có thể có lúc có lúc không. Điều này đặc biệt phổ biến trong các hệ thống nhúng với việc đi đôi phần cứng và phần mềm không chặt chẽ.

– Triệu chứng có thể do nguyên nhân được phân bố qua một số các nhiệm vụ chạy trên các bộ xử lý khác nhau.

– Trong khi gỡ lỗi, chúng ta gặp không ít các lỗi chạy từ việc hơi khó chịu (như định dạng cái ra không đúng) tới các thảm họa (như hệ thống hỏng, gây ra các thiệt hại kinh tế hay vật lý trầm trọng). Xem như hậu quả của việc tăng lỗi, khối lượng sức ép để tìm ra lỗi cũng tăng thêm. Thông thường, sức ép buộc người phát triển phần mềm phải tìm ra lỗi và đồng thời đưa vào thêm hai lỗi nữa.

3. Xem xét tâm lý.

Không may, dường như có một số bằng cớ là sự tinh thông gỡ lỗi thuộc bẩm sinh con người. Một số người làm việc đó rất giỏi, số khác lại không. Mặc dù bằng chứng kinh nghiệm về gỡ lỗi vẫn còn để mở cho nhiều cách hiểu, nhưng biến thiên lớn nhất trong khả năng gỡ lỗi, đã được báo cáo lại đối với các kỹ sư phần mềm có cùng nền tảng kinh nghiệm và giáo dục.

Bình luận về khía cạnh gỡ lỗi của con người, Shneiderman phát biểu: “Gỡ lỗi là một trong những phần chán nhất của lập trình. Nó có yếu tố của việc giải quyết vấn đề hay vẫn để hóc búa, đi đôi với việc thừa nhận khó chịu rằng bạn đã sai lầm. Hay âu lo và không sẵn lòng chấp nhận khả năng lỗi làm tăng khó khăn cho công việc. May mắn là có sự giảm nhẹ và bớt căng thẳng khi lỗi cuối cùng đã được… sửa lỗi.”

Mặc dầu có thể khó học được việc gỡ lỗi, người ta vẫn đề nghị ra một số cách tiếp cận tới vấn đề. Chúng ta xem xét những vấn đề này trong mục tiếp theo.

4. Cách tiếp cận gỡ lỗi.

Bất kể dùng cách tiếp cận nào để gỡ lỗi cũng có một mục tiêu quan trọng hơn cả: tìm ra và sửa chữa nguyên nhân lỗi phần mềm. Mục tiêu này được thực hiện bằng tổ hợp các đánh giá có hệ thống, trực giác và may mắn.

Gỡ lỗi là việc ứng dụng trực tiếp phương pháp khó học đã từng được phát triển hơn 2500 năm qua. Cơ sở của việc gỡ lỗi là định vị nguồn gốc của vấn đề (nguyên nhân) bằng việc phân hạch nhị phân, thông qua các giả thiết làm việc để dự đoán các giá trị mới cần kiểm tra.

Ta hãy lấy một ví dụ không phải phần mềm: Đèn trong nhà tôi không làm việc. Nếu không có gì trong nhà làm việc, thì nguyên nhân phải là cầu chì chính hay ở bên ngoài; Tôi nhìn quanh để liệu xem hàng xóm có bị tắt đèn hay không. Tôi cầm chiếc đèn nghi ngờ vào ổ cắm khác, và cầm một đồ điện khác vào mạch nghi ngờ. Cứ thế tiến hành các phương án giải quyết kiểm thử.

Nói chung, có thể đưa ra ba loại các tiếp cận gỡ lỗi: Bó buộc mạnh bạo; Lật ngược; Loại bỏ nguyên nhân.

Loại bó buộc mạnh bạo có lẽ là phương pháp thông dụng nhất và kém hiệu quả nhất, để cô lập nguyên nhân của lỗi phần mềm. Chúng ta áp dụng phương pháp gỡ lỗi bó buộc mạnh bạo, khi tất cả các phương pháp khác đều thất bại. Dùng triết lý “cứ để máy tính tìm ra lỗi”, người ta cho xổ ra nội dung bộ nhớ, gọi tới chương trình lưu dấu vết khi chạy và nạp chương trình với lệnh WRITE.

Chúng ta hy vọng rằng đâu đó, trong bãi lấy thông tin được tạo ra, chúng ta có thể tìm ra được một nguyên nhân của lỗi. Mặc dù đống thông tin được tạo ra cuối cùng, có thể dẫn tới thành công, nhưng thường hơn cả là nó dẫn đến phí phạm công sức và thời gian.

Lật ngược lại cách tiếp cận khá thông dụng có thể được dùng trong những chương trình nhỏ. Bắt đầu tại chỗ chúng được phát hiện ra, lật ngược theo những chương trình gốc (một cách thủ công) cho tới chỗ tìm ra nguyên nhân. Không may là khi số dòng chương trình gốc tăng lên, số con đường lật ngược tiềm năng có thể trở nên không quản lý nổi.

Cách tiếp cận thứ ba tới gỡ lỗi – loại bỏ nguyên nhân được biểu lộ bằng việc quy nạp hay diễn dịch, và đưa vào khái niệm về phân hạch nhị phân. Dữ liệu có liên quan tới việc xuất hiện lỗi được tổ chức để cô lập ra các nguyên nhân tiềm năng.

Một “giả thiết nguyên nhân” được nêu ra và dữ liệu trên được dùng để chứng minh hay bác bỏ giả thiết đó. Một cách khác, ta có thể xây dựng ra một danh sách mọi nguyên nhân đặc biệt có nhiều hứa hẹn, thì dữ liệu sẽ được làm mịn thêm để cố gắng cô lập ra lỗi.

Từng cách tiếp cận gỡ lỗi trên đây, đều có thể được bổ sung thêm bởi công cụ gỡ lỗi. Chúng ta có thể áp dụng một phạm vi rộng các trình biên dịch gỡ lỗi, như trợ giúp gỡ lỗi động (“Bộ dò dấu vết”), các bộ sinh trường hợp kiểm thử tự động, số bộ nhớ và bảng tham khảo chéo. Tuy nhiên, các công cụ đều không phải là cách thay thế cho việc đánh giá, dựa trên tài liệu thiết kế phần mềm đầy đủ và chương trình gốc rõ ràng.

Trong nhiều trường hợp, việc gỡ lỗi phần mềm máy tính tựa như việc giải quyết vấn đề trong thế giới kinh doanh. Brown và Sampson đã đưa ra một cách tiếp cận gỡ lỗi tên là “Phương pháp”, đó là việc thích nghi các kỹ thuật giải quyết vấn đề quản lý. Các tác giả này đề nghị phát triển một bản đặc tả về các độ lệch, mô tả cho vấn đề bằng cách phác họa “Cái gì? Khi nào? Ở đâu? Phạm vi nào?”

Mỗi một trong những vấn đề nêu trên (cái gì, khi nào, ở đâu và với phạm vi nào) đều được chỉ ra thành những đáp ứng là hay không, là để phân biệt rõ rệt giữa cái gì đã xảy ra và cái gì đã không xảy ra. Một khi thông tin về lỗi đã được ghi lại, thì người ta xây dựng ra một giả thiết nguyên nhân dựa trên các phân biệt quan sát được từ những đáp ứng là hay không là. Việc gỡ lỗi tiếp tục dùng cách tiếp cận quy nạp hay diễn dịch được mô tả ở phần trên trong mục này.

Bất kỳ thảo luận nào về cách tiếp cận và công cụ gỡ lỗi, cũng đều không đầy đủ nếu không nói tới một đồng minh mạnh mẽ: “Người khác”! Khái niệm về “lập trình vô ngã” của Weinberg (được thảo luận trước đây) nên được mở rộng thành gỡ lỗi vô ngã. Mỗi người chúng ta đều có thể nhớ lại điều gì khó xử khi mất hàng giờ, hàng ngày vì một lỗi dai dẳng.

Một đồng nghiệp vẩn vơ đi qua trong nỗi thất vọng, rồi chúng tôi giải thích và tung ra bản tin chương trình. Lập tức (dường như) nguyên nhân lỗi bị phát hiện ra. Mỉm cười một cách ngạo nghễ, anh bạn đồng nghiệp chúng ta biến mất. Một quan điểm mới mẻ, không bị che phủ bởi hàng giờ thất vọng, có thể tạo ra những điều kỳ diệu. Câu châm ngôn cuối cùng về gỡ lỗi có thể là: “Khi tất cả mọi thứ khác đều sai thì hãy nhờ sự giúp đỡ”.

Một khi lỗi đã được tìm ra, thì nó phải được sửa chữa. Nhưng khi chúng ta đã lưu ý, việc sửa một lỗi đôi khi có thể lại đưa vào một lỗi khác, và do đó lại gây hại hơn là tốt. Van Vleck gợi ý ba câu hỏi đơn giản, mà người kỹ sư phần mềm nên hỏi trước khi tiến hành sửa chữa, để loại bỏ nguyên nhân gây lỗi:

– Liệu nguyên nhân gây lỗi này, có bị tái tạo ở phần khác của chương trình hay không? Trong nhiều tình huống, một khiếm khuyết chương trình bị gây ra bởi một mẫu hình logic sai sót, có thể còn phát sinh ở đâu đó khác nữa. Việc xem xét tường minh về mẫu hình logic này có thể làm phát hiện ra thêm các lỗi khác.

– “Lỗi tiếp” có thể bị đưa vào là gì khi tôi chữa lỗi này? Trước khi việc sửa lỗi được tiến hành, chương trình gốc (hay tốt hơn, thiết kế) nên được đánh giá lại để thẩm định việc dính nối các cấu trúc logic dữ liệu. Nếu việc sửa lỗi được tiến hành trong một phần có độ dính nối cao, thì càng phải để tâm nhiều khi tiến hành bất kỳ một sự thay đổi nào.

– Ta có thể làm gì để ngăn cản lỗi này ngay từ đầu? Câu hỏi này là bước đầu tiên hướng tới việc thiết lập một cách tiếp cận đảm bảo chất lượng phần mềm thống kê. Nếu ta sửa chương trình cũng như sản phẩm, thì lỗi sẽ loại bỏ chương trình hiện tại và có thể bị khử bỏ mọi chương trình tương lai.

Cleanroom Software Development, hay còn gọi là Cleanroom Software Engineering, là một phương pháp phát triển phần mềm nhằm tạo ra các sản phẩm phần mềm với độ tin cậy cao. Phương pháp này được phát triển bởi IBM vào những năm 1980 và tập trung vào việc ngăn ngừa lỗi thay vì sửa lỗi.

Các nguyên tắc chính của Cleanroom Software Development bao gồm:

– Phát triển dựa trên các phương pháp chính thức: Sử dụng các công cụ toán học và logic để thiết kế và kiểm tra phần mềm.

– Triển khai theo từng bước nhỏ: Phần mềm được phát triển theo từng phần nhỏ và mỗi phần đều được kiểm tra chất lượng kỹ lưỡng.

– Kiểm thử thống kê: Sử dụng các phương pháp kiểm thử dựa trên thống kê để đảm bảo phần mềm đạt tiêu chuẩn chất lượng.

Phương pháp này giúp giảm thiểu lỗi và tăng độ tin cậy của phần mềm, đặc biệt hữu ích trong các dự án yêu cầu độ chính xác cao.

5. Ví dụ Cleanroom Software Development

Dưới đây là chi tiết về cách các công ty lớn đã áp dụng thành công phương pháp Cleanroom Software Development, kèm theo số liệu và bằng chứng cụ thể:

5.1. International Business Machines Corporation – IDM.

IBM đã sử dụng phương pháp Cleanroom trong nhiều dự án lớn, bao gồm hệ thống điều khiển không lưu và các ứng dụng ngân hàng. Một nghiên cứu điển hình được thực hiện bởi IBM trên một dự án phát triển phần mềm chuyển tiền điện tử cho một ngân hàng lớn.

Kết quả cho thấy phương pháp Cleanroom đã giúp giảm tỷ lệ lỗi xuống còn 0.2 lỗi/KLOC, so với mức trung bình ngành là 2-5 lỗi/KLOC. Độ tin cậy của hệ thống cũng được tăng lên đáng kể, với thời gian hoạt động trung bình lên tới 99.99%. (Tham khảo: Mills, H. D., Dyer, M., & Linger, R. C. (1987). Cleanroom software engineering. IEEE Software, 4(5), 19-25.).

5.2. National Aeronautics and Space Administration – NASA.

NASA đã áp dụng Cleanroom Software Development để phát triển phần mềm cho các nhiệm vụ không gian, bao gồm hệ thống điều khiển tàu vũ trụ. Ví dụ, trong dự án phát triển phần mềm cho tàu con la Pathfinder, NASA đã sử dụng Cleanroom và ghi nhận tỷ lệ lỗi chỉ 0.1 lỗi/KLOC.

Điều này góp phần quan trọng vào thành công của sứ mệnh Pathfinder, giúp NASA thu thập dữ liệu khoa học quan trọng từ sao Hỏa. (Tham khảo: Lyerly, R. R., & Linger, R. C. (1991). A case study in cleanroom software engineering: The IBM COBOL structuring tool. Proceedings of the 13th international conference on Software engineering, 173-182.).

5.3. Hughes Aircraft Company (Boeing Integrated Defense Systems).

Hughes Aircraft đã sử dụng Cleanroom Software Development để phát triển phần mềm cho các hệ thống radar và vệ tinh. Một dự án tiêu biểu là phát triển phần mềm điều khiển cho hệ thống radar phòng không.

Bằng cách áp dụng Cleanroom, Hughes Aircraft đã giảm tỷ lệ lỗi xuống 75% so với các dự án trước đó, đồng thời rút ngắn thời gian phát triển xuống 20%. (Tham khảo: Poore, J. H., & Trammell, C. J. (1984). Cleanroom software engineering: Technology and process. Proceedings of the 12th international conference on Software engineering, 178-187.).

Kết luận: Những ví dụ trên, cùng với số liệu và bằng chứng cụ thể, cho thấy phương pháp Cleanroom Software Development có khả năng mang lại hiệu quả cao trong việc phát triển phần mềm với độ tin cậy và chất lượng vượt trội. Việc giảm thiểu lỗi, tăng độ tin cậy và rút ngắn thời gian phát triển là những lợi ích đáng kể mà Cleanroom mang lại, đặc biệt trong các dự án phần mềm quan trọng và yêu cầu độ chính xác cao.

Tác giả: Thạc Bình Cường


Bạn đang xem bài viết:
Phát triển phần mềm phòng sạch (Cleanroom Software Development)
Link https://vnlibs.com/cong-nghe/phat-trien-phan-mem-phong-sach-cleanroom-software-development.html

Hashtag: #cleanroomsoftwareengineering #cleanroom #software #engineering #phanmemphongsach #vnlibs #congnghe

Mọi người cũng tìm kiếm: “Lợi ích của Cleanroom Software Development trong phát triển phần mềm”; “Cách áp dụng Cleanroom Software Development tại các công ty lớn”; “Phương pháp Cleanroom Software Development giúp giảm thiểu lỗi phần mềm”; “Cleanroom Software Development và các nguyên tắc phát triển phần mềm chính thức”; “Tại sao Cleanroom Software Development quan trọng trong các dự án phần mềm”; “Ứng dụng thực tế của Cleanroom Software Development trong ngành công nghiệp”; “Cleanroom Software Development: Quy trình và lợi ích”; “Cleanroom Software Development trong phát triển phần mềm an toàn và đáng tin cậy”; “Các bước triển khai Cleanroom Software Development trong dự án phần mềm”; “Cleanroom Software Development và kiểm thử thống kê phần mềm”; “Tìm hiểu về kỹ nghệ phần mềm phòng sạch”; “Quy trình kỹ thuật phần mềm phòng sạch”; “Phần mềm có mức độ tin cậy có thể chứng nhận”; “Vòng đời và các mô hình phát triển phần mềm sạch”; “Research Software Engineering”; “Cleanroom Software Engineering”; “software development process”