Resmi yöntemlerin yaygın olarak benimsenmesini engelleyen engeller nelerdir? [kapalı]


14

Bir uygulama için kod belirlemek, kanıtlamak ve oluşturmak için biçimsel yöntemler kullanılabilir. Bu hatalara daha az yatkındır - bu nedenle çoğunlukla güvenlik / kritik programlarda kullanılır.

Neden günlük programlamada veya web uygulamalarında vb. Daha sık kullanmıyoruz?

Referanslar :


3
Ortaçağ kaleleri gibi 5 ayak kalınlığında duvarları olan evler inşa edebiliriz. Çoğu zaman, bu değerden daha fazla sorun olur.
Baldrickk

5
Bir web geliştirici projesine resmi yöntemler uygulamayı deneyebilir ve nasıl gittiğini görebilirsiniz. Büyük olasılıkla düşük değerli bir etkinliğe çok fazla çaba harcadığınızı fark edeceksiniz. Zaten birçok hata yakalayacak hızlı duman testi ile kontrast. İlginçtir, statik tip sistemler basit bir tür kanıtlama sistemidir, ancak özellikle web geliştirme bu dilleri kapatır (bunun yerine Ruby, PHP veya JavaScript gibi oldukça dinamik dilleri tercih eder). Korelasyon nedensellik anlamına gelmez, ancak düşünceyi duraklatır.
amon

1
Yani bir programlama dilinde programlama yerine bir spesifikasyon dilinde belirtmeyi tercih eder misiniz? Tamam, özelliklerine göre çalıştığını kanıtlayabileceksiniz. Ancak, spesifikasyonun gerçek problemi yansıttığını nasıl kanıtlayacaksınız?
Christophe

3
@toto: şeyleri doğru yapmak (spesifikasyonlara göre çalışmak) veya doğru şeyleri yapmak (iyi özelliklere sahip olmak). Teoride istediğimiz şey olsa da, pratikte gerçekten neye ihtiyaç duyulduğunu kesin olarak biliyoruz: beyssonmanagement.com/2012/10/29/…
Christophe

3
Bunun kapalı olduğunu hayal kırıklığına uğratanlar için şimdi harika bir blog yazısı var: İnsanlar Neden Resmi Yöntemleri Kullanmıyor?
icc97

Yanıtlar:


19

Bir Mühendis, herhangi bir salakın 10 ile yapabileceği bir dolar ile yapabilen bir kişidir.

Kaynak kısıtlamaları, bütçe kısıtlamaları, zaman kısıtlamaları, hepsi önemlidir.

Resmi yöntemleri kullanarak yazılım geliştirmek genellikle çok daha pahalıdır ve olmadan daha uzun sürer. Ayrıca, birçok proje için en zor kısım iş gereksinimlerini anlamaktır. Bu durumda, resmi yöntemleri kullanan her şey, kodunuzun iş gereksinimlerini tam ve yanlış anlamanıza% 100 karşılık geldiğinin kanıtıdır.

Bu nedenle, resmi yöntemlerin, ispatların, program doğrulamasının ve benzer tekniklerin kullanımı tipik olarak "önemli olan şeyler", yani aviyonik yazılım, tıbbi ekipman kontrol sistemleri, enerji santralleri vb. İle sınırlıdır.


1
Ben de şu anda yani henüz ana akım için hazır değil programlama diline resmi yöntemler koyarak aktif bir araştırma alanı olduğunu eklemek istiyorum
jk.

1
Bu yanıtı kabul ediyorum, ancak özellikle büyük projelerde bakım ve kod izleme / hata ayıklamanın ne kadar pahalı olduğunu bildiğimizde, resmi yöntemlerin neden hala 'pahalı' ve 'zaman alıcı' olarak kabul edildiğine dair bir yaklaşım istedim.
toto

1
TDD ve BDD, resmi yaklaşımların temeli olan Hoare mantığı prensipleri üzerine inşa edilmiş yaklaşımlardır. Ondan etkilenmeyen verimliliği arttırırlar.
Martin Spamer

1
@toto Kanıtlar gerçekten çok GERÇEKTEN zor. Matematikçilerin kanıtlarda verilen pek çok şey programlarda geçerli değildir. Örneğin, C ++, ekleme birleştirici değildir (-1 + 1) + INT_MAX = INT_MAX, -1 + (1 + INT_MAX)tanımsız bir davranıştır.
Hovercouch

1
@toto: "Pahalı" ve "zaman alıcı" olarak değerlendirilmelerinin nedeni, resmi yöntemler kullanılarak geliştirilen projelere bakabilmemiz ve bu projelerin geliştirilmesinin daha uzun sürdüğünü ampirik olarak doğrulayabilmemizdir. SeL4 / L4'ün gelişim zamanına bakın. Örneğin, L4'ün diğer herhangi bir uygulamasına kıyasla doğrulandı .
Jörg W Mittag

12

Programlamak ya da programlamak değil mi?

Bir yazılım ürünü ile bir sorunu çözmek için, ihtiyaçları konusunda uzman yaptıktan sonra şunları yapabilirsiniz YA programlama dillerini kullanarak bir program yazmak YA resmi dil ve kullanım kod oluşturma araçlarını kullanarak programı belirtin. İkincisi sadece bir soyutlama seviyesi ekler.

İşleri doğru yapmak veya doğru şeyleri yapmak?

Resmi yaklaşım, yazılımınızın spesifikasyonlara göre çalıştığına dair bir kanıt sağlar. Böylece ürününüz her şeyi doğru yapıyor. Ama doğru şeyleri yapıyor mu?

Üzerinde çalıştığınız gereksinimler eksik veya belirsiz olabilir. Buggy bile olabilirler. En kötü durumda, gerçek ihtiyaçlar bile ifade edilmez. Ancak bir resim bin kelimeye bedeldir, sadece "Müşterinin ne istediği" için google resimleri, örneğin bu makaleden :

resim açıklamasını buraya girin

Formalitenin maliyeti

Mükemmel bir dünyada, baştan itibaren tamamen ayrıntılı ve mükemmel gereksinimlere sahip olacaksınız. Daha sonra yazılımınızı tam olarak belirtebilirsiniz. Biçimlendirmeyi tercih ederseniz, kodunuz daha üretken olmanız için otomatik olarak oluşturulur. Verimlilik kazanımları, resmi araçların maliyetini dengeleyecektir. Ve şimdi herkes resmi yöntemler kullanırdı. Öyleyse neden olmasın?

Pratikte, bu nadiren gerçek! Bu yüzden birçok şelale projesi başarısız oldu ve yinelemeli geliştirme yöntemleri (çevik, RAD, vb.) Neden liderlik etti: eksik ve eksik gereksinimleri, tasarımları ve uygulamaları ele alabilir ve iyiye ulaşıncaya kadar geliştirebilirler.

Ve işte mesele geliyor. Biçimsel yöntemlerle, her bir yinelemenin tamamen tutarlı bir biçimsel spekülasyona sahip olması gerekir. Bu, dikkatli düşünme ve ek çalışma gerektirir, çünkü resmi mantık affedici değildir ve eksik düşünceleri sevmez. Basit fırlatma deneyleri bu kısıtlama altında pahalı hale gelir. Ve geri izlemeye yol açacak her bir yineleme de (örneğin işe yaramayan bir fikir ya da yanlış anlaşılmış bir gereksinim).

Uygulamada

Yasal veya sözleşmeye bağlı nedenlerle resmi yöntemleri kullanmak zorunda olmadığında, resmi sistemlere gerek olmadan, örneğin sözleşmeye dayalı programlama ve diğer iyi uygulamaları (örn. Kod incelemesi, TDD , vb.) Kullanarak da çok yüksek kalite elde edebilirsiniz . Yazılımınızın çalıştığını kanıtlayamazsınız, ancak kullanıcılarınız daha önce çalışan yazılımların keyfini çıkaracaklardır.

Güncelleme: ölçülen çaba

ACM'nin Ekim 2018 sayısında , gerçek dünyada resmi olarak doğrulanmış yazılım hakkında , çabaların bazı tahminleri ile ilginç bir makale var .

İlginç bir şekilde (askeri teçhizat için işletim sisteminin geliştirilmesine dayanarak), resmi olarak kanıtlanmış yazılım üretmek , geleneksel mühendislik tekniklerinden 3.3 kat daha fazla çaba gerektiriyor gibi görünüyor . Bu yüzden gerçekten pahalı.

Öte yandan, bu tür bir yazılımı yüksek güvenlik düzeyinde (EAL 7) sertifikalı hale getirme çabasını eklerseniz, yüksek güvenlikli yazılımı bu yolla geleneksel olarak tasarlanmış yazılımlara göre 2.3 kat daha az çaba gerektirir . Bu nedenle, yüksek güvenilirlik veya güvenlik gereksinimleriniz varsa, resmi hale gelmek için kesinlikle bir iş durumu vardır.

seL4 tasarım ve kod geliştirme iki kişi-yıl sürdü. Yıllar boyunca tüm serospesifik kanıtları toplamak, 8.700 satır C kodu için toplam 18 kişi-yıla geliyor. Buna karşılık, L4 ailesindeki başka bir mikro çekirdek olan L4Ka :: Pistachio, boyut olarak seL4 ile karşılaştırılabilir, gelişmesi altı kişi yılı aldı ve önemli bir güvence düzeyi sağlamaz. Bu, doğrulanmış yazılım ile geleneksel olarak tasarlanmış yazılım arasında yalnızca bir faktör 3.3 olduğu anlamına gelir . Colbert ve Boehm tarafından yapılan tahmin yöntemine göre, 8,700 satır C kodu için geleneksel bir Ortak Kriterler EAL7 sertifikası 45,9 kişiden fazla sürecektir. Bu, resmi ikili düzeydeki uygulama doğrulamasının zaten 2,3 katından fazla olduğu anlamına gelir en yüksek Ortak Kriterler sertifikasyon seviyesinden daha az maliyetli olmakla birlikte, daha güçlü bir güvence sağlar.


Sözleşmeye dayalı programlama en azından gayri resmi kanıtlar kullanır.
Frank Hileman

@FrankHileman evet! Ön koşulların, son koşulların ve değişmezlerin açıklığa kavuşturulmasının basit gerçeği, kodu verimli bir şekilde gözden geçirmeye, hataları azaltmaya ve testleri sistematik hale getirmeye büyük ölçüde yardımcı olur.
Christophe

Bu açık ara en iyi cevap olmalı.
Hashim

0

Herhangi bir dildeki her program resmi bir şartname olarak düşünülebilir (bazı tornalama makinelerine eşdeğer). Resmi doğruluğu kanıtlamak için kullanılacak herhangi bir üst düzey 'resmi şartname' de - sadece başka bir program. Ancak (tipik olarak) kötü, eksik, belirsiz, program aracılığıyla yeterince düşünülmemiştir. Ve tesadüfen değil, tipik olarak nasıl programlanacağını bilmeyen insanlar tarafından yazılır (genellikle alan uzmanlarıdır).

Ve böylece, bir programın daha yüksek düzeydeki resmi gereksinimleriyle uyumlu olduğunu (aynı cevapları üretir ya da karakterize edersiniz) kanıtlamak için, değişmez olan, daha üst düzey resmi spesifikasyondaki belirsizlikleri nasıl çözdüğünüze iner. Bunu yapmanın iyi bir genel amacı yoktur.

Yüksek seviye gerekliliklerin daha düşük seviye detaylara eşlenmesi, gerçek programlamanın ne olduğunun özüdür. Spesifikasyonları okuyan ve yorumlayan bir programcı tarafından yapılan temel çalışmanın yerini elle sallayarak ve 'şimdi sadece bu yüksek seviyeli resmi spesifikasyonun bu örnek programa uyup uymadığını görün' diyerek değiştiremeyeceği şaşırtıcı olmamalıdır.

Bu kavramın ilk defa ümit verici göründüğü mantık programlamanın ilk günlerinde bile (hem üst düzey spesifikasyonlar hem de gerçek temel programlar aynı dilde yazılabildiğinden), bu temel sorun inatçı oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.