공식적인 방법의 광범위한 채택을 방해하는 장벽은 무엇입니까? [닫은]


14

공식적인 메소드를 사용하여 애플리케이션의 코드를 지정, 증명 및 생성 할 수 있습니다. 이것은 오류 발생이 적기 때문에 대부분 안전 / 핵심 프로그램에서 사용됩니다.

일상적인 프로그래밍이나 웹 애플리케이션 등에서 더 자주 사용하지 않는 이유는 무엇입니까?

참고 문헌 :


3
중세 성처럼 5 피트 두께의 벽으로 집을 지을 수있었습니다. 대부분의 경우 가치가있는 것보다 문제가 더 많습니다.
Baldrickk

5
웹 개발 프로젝트에 공식적인 방법을 적용하여 어떻게 진행되는지 확인할 수 있습니다. 아마도 가치가 낮은 활동에 많은 노력을 기울이고 있음을 알 것입니다. 이미 많은 버그를 포착 할 수있는 빠른 연기 테스트와는 대조적입니다. 흥미롭게도 정적 유형 시스템은 단순한 종류의 증명 시스템이지만 특히 웹 개발은 이러한 언어를 피합니다 (루비, PHP 또는 JavaScript와 같은 매우 역동적 인 언어를 선호 함). 상관 관계는 인과 관계를 의미하지는 않지만 생각을 잠시 멈추게합니다.
amon

1
따라서 프로그래밍 언어로 프로그래밍하는 대신 사양 언어로 지정하는 것이 좋습니다. 좋아, 당신은 그것이 사양에 따라 작동한다는 것을 증명할 수 있습니다. 그러나 사양이 실제 문제를 반영한다는 것을 어떻게 증명할 것입니까?
Christophe

3
@toto 질문은 : 올바른 일 (사양에 따라 작동) 또는 올바른 일 (좋은 사양에 따라)을 수행하는 것입니다. 이론적으로 우리가 원하는 것이지만
Christophe

3
이것이 닫히는 것에 실망한 사람들을 위해 이제는 사람들이 공식적인 방법을 사용하지 않는
icc97

답변:


19

엔지니어는 모든 바보가 10으로 할 수있는 일을 달러로 할 수있는 사람입니다.

자원 제약, 예산 제약, 시간 제약, 모두 중요합니다.

공식적인 방법을 사용하여 소프트웨어를 개발하는 것은 일반적으로 비용이 훨씬 많이 들며 그렇지 않은 것보다 훨씬 오래 걸립니다. 또한 많은 프로젝트에서 가장 어려운 부분은 비즈니스 요구 사항을 이해하는 것입니다. 이 경우 공식적인 방법을 사용하면 코드가 비즈니스 요구 사항에 대한 불완전하고 부정확 한 이해에 100 % 부합한다는 증거입니다.

이러한 이유로, 공식적인 방법, 증명, 프로그램 검증 및 유사한 기술의 사용은 일반적으로 "중요한 것", 즉 항공 전자 공학 소프트웨어, 의료 기기 제어 시스템, 발전소 등으로 제한됩니다.


1
또한 현재 즉, 아직 주류에 대한 준비가되어 있지 프로그래밍 언어로 공식적인 방법을 퍼팅 활성 연구의 영역입니다 추가 할 것
JK.

1
이 답변을 수락하지만 공식적인 방법이 여전히 '비싸고'시간이 많이 걸리는 이유, 특히 대규모 프로젝트에서 유지 관리 및 코드 추적 / 디버깅 비용이 얼마나 비싼 지에 대한 접근 방식을 원했습니다.
toto

1
TDD & BDD는 공식 접근 방식의 기초 인 Hoare 논리의 원칙에 기반한 접근 방식입니다. 효율성을 향상시킵니다.
Martin Spamer

1
@toto 증명은 정말 어렵습니다. 증거에서 수학자들이 당연하다고 생각하는 많은 것들이 프로그램에는 적용되지 않습니다. 예를 들어, C ++에서 덧셈은 연관 적이 지 않습니다 : (-1 + 1) + INT_MAX = INT_MAX, -1 + (1 + INT_MAX)는 정의되지 않은 동작입니다.
Hovercouch

1
@toto : "비싸고"시간이 많이 걸리는 이유는 공식적인 방법으로 개발 한 프로젝트를 살펴보고 해당 프로젝트를 개발하는 데 훨씬 오랜 시간이 걸린다는 것을 경험적으로 확인할 수 있기 때문입니다. 에 비해, 예를 들어, SEL4 / L4.verified의 개발 시간 봐 어떤 L4의 다른 구현입니다.
Jörg W Mittag

12

프로그래밍하거나 프로그래밍하지 않습니까?

소프트웨어 제품에 문제를 해결하기 위해, 요구 사항에 대한 이해를 가진 후, 당신은 할 수 있습니다 이든 프로그래밍 언어를 사용하여 프로그램을 작성 또는 공식 언어로 사용 코드 생성 도구를 사용하여 프로그램을 지정합니다. 후자는 단지 추상화 수준을 추가합니다.

올바른 일을하거나 올바른 일을 하는가?

공식적인 접근 방식은 소프트웨어가 사양에 따라 작동한다는 증거를 제공합니다. 따라서 귀하의 제품은 올바르게 작동합니다. 그러나 올바른 일을합니까?

작업중인 요구 사항이 불완전하거나 모호 할 수 있습니다. 그들은 심지어 버그가있을 수 있습니다. 최악의 경우 실제 요구 사항도 표현되지 않습니다. 그러나 그림은 천 단어의 가치가 있습니다. 예를 들어이 기사 에서 "고객이 원하는 것"에 대한 Google 이미지 만 있습니다 .

여기에 이미지 설명을 입력하십시오

형식 비용

완벽한 세상에서는 처음부터 완전히 상세하고 완벽한 요구 사항을 갖게 될 것입니다. 그런 다음 소프트웨어를 완전히 지정할 수 있습니다. 공식적으로 갈 계획이라면 생산성이 향상되도록 코드가 자동으로 생성됩니다. 생산성 향상은 공식 도구의 비용을 상쇄합니다. 그리고 모든 사람들은 이제 공식적인 방법을 사용했습니다. 왜 그렇지 않습니까?

실제로, 이것은 거의 현실이 아닙니다! 이것이 많은 폭포 프로젝트가 실패한 이유와 반복 개발 방법 (애자일, RAD 등)이 주도한 이유입니다 . 불완전하고 불완전한 요구 사항, 설계 및 구현을 처리하고 문제가 없을 때까지 개선 할 수 있습니다.

그리고 여기에 요점이 있습니다. 공식적인 방법을 사용하면 각 반복마다 완전히 일관된 공식 사양이 필요합니다. 공식적인 논리는 용서하지 않고 불완전한 생각을 좋아하지 않기 때문에 신중한 사고와 추가 작업이 필요합니다. 이 제약 조건 하에서 간단한 폐기 실험이 비싸집니다. 또한 역 추적으로 이어질 각 반복 (예 : 작동하지 않는 아이디어 또는 오해 된 요구 사항)도 마찬가지입니다.

실제로

법적 또는 계약상의 이유로 공식적인 방법을 사용할 의무가없는 경우, 계약 기반 프로그래밍 및 기타 모범 사례 (예 : 코드 검토, TDD 등) 를 사용하여 공식 시스템 없이도 매우 높은 품질을 얻을 수 있습니다 . 소프트웨어가 작동한다는 것을 증명할 수는 없지만 사용자는 소프트웨어 작업을 더 빨리 즐길 수 있습니다.

업데이트 : 측정 된 노력

ACM 커뮤니케이션 2018 년 10 월호 에는 실제 노력에 대한 공식적인 검증 된 소프트웨어에 대한 흥미로운 기사가 있습니다.

흥미롭게도 (군용 장비의 OS 개발을 기반으로) 공식적으로 입증 된 소프트웨어를 제작하려면 기존 엔지니어링 기술보다 3.3 배 더 많은 노력 이 필요합니다 . 정말 비용이 많이 듭니다.

반면, 이러한 소프트웨어를 높은 보안 수준 (EAL 7)으로 인증하려는 노력을 추가 할 경우 기존의 소프트웨어보다 높은 보안 소프트웨어를 얻는 데 2.3 배 적은 노력 이 필요합니다 . 따라서 높은 안정성 또는 보안 요구 사항이있는 경우 공식적인 비즈니스 사례가 있습니다.

seL4 설계 및 코드 개발에는 2 년이 걸렸습니다. 수년에 걸쳐 모든 혈청 특이 적 증거를 합하면 8,700 줄의 C 코드에 대해 총 18 명의 사람이옵니다. 이에 비해, L4 제품군의 또 다른 마이크로 커널 인 L4Ka :: Pistachio는 seL4와 비슷한 크기로 6 년의 개발 기간이 소요되었으며 상당한 수준의 보증을 제공하지 않았습니다. 이는 검증 된 소프트웨어와 전통적으로 엔지니어링 된 소프트웨어 사이에 3.3 요소 만 있다는 것을 의미 합니다. Colbert와 Boehm의 평가 방법에 따르면, 8,700 줄의 C 코드에 대한 기존의 Common Criteria EAL7 인증은 45.9 명 이상의 사람이 필요합니다. 즉, 공식 이진 수준 구현 확인은 이미 2.3 이상의 요소입니다. 최고 수준의 Common Criteria보다 비용이 적게 들지만 훨씬 강력한 보증을 제공합니다.


계약 기반 프로그래밍은 최소한 비공식적 증거를 사용합니다.
Frank Hileman

@FrankHileman 예! 전제 조건, 사후 조건 및 불변 값을 명확하게 설명한다는 사실은 코드를 효율적으로 검토하고 오류를 줄이며 테스트를 체계화하는 데 크게 도움이됩니다.
Christophe

이것은 가장 좋은 대답이어야합니다.
Hashim

0

모든 언어의 모든 프로그램은 공식적인 사양으로 간주 될 수 있습니다 (일부 터닝 머신과 동일). 공식적인 정확성을 입증하는 데 사용되는 더 높은 수준의 '공식 사양'도 다른 프로그램입니다. 그러나 그것의 (보통) 나쁜, 불완전하고, 모호하고, 불충분하게 프로그램을 통한 생각. 그리고 우연히도, 일반적으로 프로그래밍 방법을 모르는 사람들 (일반적으로 도메인 전문가)이 작성했습니다.

따라서 하나의 프로그램이 더 높은 수준의 공식 요구 사항과 호환 가능 (동일한 답변을 생성하거나 특성화 함)하는 것을 입증하면 변하지 않는 것은 상위 수준의 공식 사양에서 모호성을 해결하는 방법에 달려 있습니다. 그렇게 할 수있는 일반적인 목적은 없습니다.

높은 수준의 요구 사항을 낮은 수준의 세부 사항에 매핑하는 것은 실제 프로그래밍의 핵심입니다. 프로그래머가 사양을 읽고 해석함으로써 수행되는 핵심 작업을 손으로 흔드는 것으로 대체 할 수 없다는 것은 놀라운 일이 아닙니다. 이제이 고급 공식 사양이이 샘플 프로그램에 의해 준수되는지 확인하십시오.

이 개념이 처음에는 유망한 것처럼 보이는 논리 프로그래밍 초기에도 (높은 수준의 사양과 실제 기본 프로그램을 동일한 언어로 작성할 수 있기 때문에)이 핵심 문제는 다루기 어려웠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.