Những rào cản ngăn cản việc áp dụng rộng rãi các phương pháp chính thức là gì? [đóng cửa]


13

Các phương thức chính thức có thể được sử dụng để chỉ định, chứng minh và tạo mã cho một ứng dụng. Điều này ít xảy ra lỗi - do đó chủ yếu được sử dụng trong các chương trình an toàn / quan trọng.

Tại sao chúng ta không sử dụng nó thường xuyên hơn cho lập trình hàng ngày hoặc trong các ứng dụng web, v.v ...?

Người giới thiệu :


3
Chúng ta có thể xây dựng những ngôi nhà với những bức tường dày 5 feet - giống như những lâu đài thời trung cổ. Hầu hết thời gian, đó sẽ là rắc rối nhiều hơn nó có giá trị.
Baldrickk

5
Bạn có thể thử áp dụng các phương thức chính thức cho một dự án phát triển web và xem nó diễn ra như thế nào. Rất có thể bạn sẽ nhận thấy rằng bạn đang đổ rất nhiều nỗ lực vào một hoạt động có giá trị thấp. Ngược lại với thử nghiệm khói nhanh, sẽ bắt được nhiều lỗi. Thật thú vị, các hệ thống kiểu tĩnh là một loại hệ thống chứng minh đơn giản, nhưng đặc biệt là phát triển web tránh các ngôn ngữ đó (thay vào đó thích các ngôn ngữ rất năng động như Ruby, PHP hoặc JavaScript). Tương quan không ngụ ý nhân quả, nhưng nó tạm dừng suy nghĩ.
amon

1
Vì vậy, bạn muốn chỉ định trong một ngôn ngữ đặc tả thay vì lập trình bằng ngôn ngữ lập trình? Ok, bạn sẽ có thể chứng minh rằng nó hoạt động theo thông số kỹ thuật. Nhưng làm thế nào bạn sẽ chứng minh rằng các đặc điểm kỹ thuật phản ánh vấn đề thực sự?
Christophe

3
@toto câu hỏi là: làm những điều đúng (làm việc theo thông số kỹ thuật) hoặc làm những điều đúng (có thông số kỹ thuật tốt). Trong khi về mặt lý thuyết spec là những gì chúng ta muốn, trong thực tế chúng ta hiếm khi biết chắc chắn những gì đang thực sự cần thiết: beyssonmanagement.com/2012/10/29/...
Christophe

3
Đối với những người thất vọng vì điều này đã bị đóng, giờ đây có một bài đăng blog tuyệt vời: Tại sao mọi người không sử dụng các phương pháp chính thức?
icc97

Câu trả lời:


19

Một kỹ sư là một người có thể làm với một đô la, điều mà bất kỳ kẻ ngốc nào cũng có thể làm với 10.

Hạn chế về nguồn lực, hạn chế về ngân sách, hạn chế về thời gian, chúng đều quan trọng.

Phát triển phần mềm bằng các phương pháp chính thức thường tốn kém hơn đáng kể và mất nhiều thời gian hơn không có. Ngoài ra, đối với nhiều dự án, phần khó nhất là hiểu được các yêu cầu kinh doanh. Tất cả những gì sử dụng các phương thức chính thức mua cho bạn trong trường hợp đó là bằng chứng cho thấy mã của bạn tương ứng 100% với sự hiểu biết không đầy đủ và không chính xác của bạn về các yêu cầu kinh doanh.

Vì lý do đó, việc sử dụng các phương pháp chính thức, bằng chứng, xác minh chương trình và các kỹ thuật tương tự thường bị giới hạn ở "những thứ quan trọng", tức là phần mềm điện tử hàng không, hệ thống điều khiển cho thiết bị y tế, nhà máy điện, v.v.


1
Tôi cũng nói thêm rằng việc đưa các phương thức chính thức vào ngôn ngữ lập trình là một lĩnh vực nghiên cứu đang hoạt động hiện tại tức là chưa sẵn sàng cho dòng chính
jk.

1
Tôi chấp nhận câu trả lời này, nhưng tôi cũng muốn có một cách tiếp cận về lý do tại sao các phương thức chính thức vẫn được coi là 'tốn kém' và 'tốn thời gian', đặc biệt là khi chúng ta biết việc bảo trì và theo dõi mã / sửa lỗi trong các dự án lớn tốn kém như thế nào.
toto

1
TDD & BDD là các cách tiếp cận được xây dựng dựa trên các nguyên tắc của logic Hoare, một nền tảng của các phương pháp chính thức. Họ cải thiện hiệu quả không làm mất giá trị của nó.
Martin Spamer

1
@toto Bằng chứng thực sự, THỰC SỰ khó. Rất nhiều điều mà các nhà toán học coi là bằng chứng không áp dụng trong các chương trình. Ví dụ, trong C ++, phép cộng không phải là kết hợp : (-1 + 1) + INT_MAX = INT_MAX, -1 + (1 + INT_MAX)là hành vi không xác định.
Hovercouch

1
@toto: Lý do chúng được coi là "tốn kém" và "tốn thời gian" là vì chúng ta có thể xem xét các dự án được phát triển bằng phương pháp chính thức và xác minh bằng thực nghiệm rằng các dự án đó mất nhiều thời gian hơn để phát triển. Nhìn vào thời gian phát triển của seL4 / L4.verified, ví dụ, so với bất kỳ triển khai L4 nào khác.
Jörg W Mittag

12

Lập trình hay không lập trình?

Để giải quyết vấn đề với sản phẩm phần mềm, sau khi hiểu rõ các yêu cầu, bạn có thể EITHER viết chương trình bằng ngôn ngữ lập trình HOẶC chỉ định chương trình bằng ngôn ngữ chính thức và sử dụng các công cụ tạo mã. Cái sau chỉ thêm một mức độ trừu tượng.

Làm những điều đúng hay làm những điều đúng?

Cách tiếp cận chính thức cung cấp cho bạn một bằng chứng rằng phần mềm của bạn hoạt động theo các thông số kỹ thuật. Vì vậy, sản phẩm của bạn làm những điều đúng. Nhưng nó có làm đúng không?

Các yêu cầu mà bạn đang làm việc có thể không đầy đủ hoặc mơ hồ. Họ thậm chí có thể có lỗi. Trong trường hợp xấu nhất, nhu cầu thực sự thậm chí không được thể hiện. Nhưng một bức tranh đáng giá cả ngàn từ, chỉ cần google hình ảnh cho "Những gì khách hàng muốn", ví dụ từ bài viết này :

nhập mô tả hình ảnh ở đây

Chi phí chính thức

Trong một thế giới hoàn hảo, bạn sẽ có những yêu cầu đầy đủ chi tiết và hoàn hảo ngay từ đầu. Sau đó bạn có thể chỉ định đầy đủ phần mềm của bạn. Nếu bạn đi chính thức, mã của bạn sẽ được tạo tự động để bạn có năng suất cao hơn. Tăng năng suất sẽ bù đắp chi phí của các công cụ chính thức. Và mọi người bây giờ sẽ sử dụng các phương pháp chính thức. Vậy tại sao không?

Trong thực tế, điều này hiếm khi là thực tế! Đây là lý do tại sao rất nhiều dự án thác nước thất bại, và tại sao các phương pháp phát triển lặp lại (nhanh nhẹn, RAD, v.v.) dẫn đầu: chúng có thể xử lý các yêu cầu không hoàn chỉnh và không hoàn hảo, thiết kế và triển khai và tinh chỉnh chúng cho đến khi chúng ổn.

Và đây là điểm. Với các phương thức chính thức, mỗi lần lặp lại đòi hỏi phải có một thông số chính thức hoàn toàn phù hợp. Điều này đòi hỏi suy nghĩ cẩn thận và công việc bổ sung, bởi vì logic chính thức không tha thứ và không giống như những suy nghĩ không hoàn chỉnh. Các thí nghiệm vứt bỏ đơn giản trở nên đắt đỏ dưới sự ràng buộc này. Và mỗi lần lặp lại sẽ dẫn đến quay lui (ví dụ: một ý tưởng không hoạt động hoặc yêu cầu bị hiểu sai).

Trong thực tế

Khi không bắt buộc phải sử dụng các phương pháp chính thức vì lý do hợp pháp hoặc hợp đồng, bạn cũng có thể đạt được chất lượng rất cao mà không cần hệ thống chính thức, ví dụ như bằng cách sử dụng lập trình dựa trên hợp đồng và các thực tiễn tốt khác (ví dụ: xem lại mã, TDD , v.v.). Bạn sẽ không thể chứng minh rằng phần mềm của bạn hoạt động, nhưng người dùng của bạn sẽ thích phần mềm hoạt động sớm hơn.

Cập nhật: nỗ lực đo lường

Trong số tháng 10 năm 2018 về Truyền thông của ACM có một bài viết thú vị về phần mềm được xác minh chính thức trong thế giới thực với một số ước tính về nỗ lực này.

Điều thú vị (dựa trên sự phát triển hệ điều hành cho thiết bị quân sự), dường như việc sản xuất phần mềm chính thức được chứng minh đòi hỏi nỗ lực gấp 3,3 lần so với các kỹ thuật kỹ thuật truyền thống. Vì vậy, nó thực sự tốn kém.

Mặt khác, đòi hỏi nỗ lực ít hơn 2,3 lần để có được phần mềm bảo mật cao theo cách này so với phần mềm được thiết kế theo truyền thống nếu bạn thêm nỗ lực để làm cho phần mềm đó được chứng nhận ở mức bảo mật cao (EAL 7). Vì vậy, nếu bạn có độ tin cậy cao hoặc yêu cầu bảo mật, chắc chắn có một trường hợp kinh doanh để đi chính thức.

Thiết kế seL4 và phát triển mã mất hai năm. Thêm tất cả các bằng chứng về ngôn ngữ học trong những năm qua có tổng cộng 18 năm người cho 8.700 dòng mã C. Để so sánh, L4Ka :: Pistachio, một hạt nhân khác trong họ L4, có kích thước tương đương seL4, mất sáu năm để phát triển và không cung cấp mức độ đảm bảo đáng kể. Điều này có nghĩa là chỉ có một yếu tố 3,3 giữa phần mềm được xác minh và phần mềm được thiết kế theo truyền thống. Theo phương pháp ước tính của Colbert và Boehm, 8 chứng nhận EAL7 tiêu chí chung truyền thống cho 8.700 dòng mã C sẽ mất hơn 45,9 năm người. Điều đó có nghĩa là xác minh thực hiện cấp nhị phân chính thức đã nhiều hơn hệ số 2,3 ít tốn kém hơn mức chứng nhận cao nhất của Tiêu chí chung nhưng vẫn đảm bảo chắc chắn hơn.


Lập trình dựa trên hợp đồng không sử dụng ít nhất bằng chứng không chính thức.
Frank Hileman

@FrankHileman có! Và thực tế đơn giản là làm rõ các điều kiện tiên quyết, hậu điều kiện và bất biến giúp đánh giá mã hiệu quả, giảm lỗi và kiểm tra hệ thống hóa.
Christophe

Đây sẽ là câu trả lời tốt nhất cho đến nay.
Hashim

0

Mỗi chương trình trong bất kỳ ngôn ngữ nào cũng có thể được coi là một đặc điểm kỹ thuật chính thức (tương đương với một số máy tiện). Bất kỳ mức độ cao hơn, "đặc tả chính thức" sẽ được sử dụng để chứng minh tính chính xác cũng là - chỉ là một chương trình khác. Nhưng nó (thường) là một suy nghĩ tồi tệ, không đầy đủ, mơ hồ, không đủ thông qua chương trình. Và không phải ngẫu nhiên, thường được viết bởi những người không biết cách lập trình (họ thường là chuyên gia về miền).

Và do đó, việc chứng minh rằng một chương trình tương thích (tạo ra cùng một câu trả lời hoặc theo cách bạn mô tả nó) với các yêu cầu chính thức ở cấp độ cao hơn, bất biến là cách bạn giải quyết sự mơ hồ trong đặc tả chính thức cấp cao hơn. Không có cách mục đích chung tốt để làm điều đó.

Việc ánh xạ các yêu cầu cấp cao đến các chi tiết cấp thấp hơn là ý chính của lập trình thực sự. Không có gì đáng ngạc nhiên khi công việc cốt lõi được thực hiện bởi các lập trình viên đọc và thông số kỹ thuật có thể được thay thế bằng cách vẫy tay và nói 'bây giờ hãy xem liệu đặc tả chính thức cấp cao này có tuân thủ theo chương trình mẫu này không'.

Ngay cả trong những ngày đầu lập trình logic, nơi khái niệm này lần đầu tiên có vẻ rất hứa hẹn (bởi vì cả đặc tả kỹ thuật cấp cao và các chương trình cơ bản thực tế có thể được viết bằng cùng một ngôn ngữ), vấn đề cốt lõi này đã tỏ ra khó hiểu.

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.