NASA'nın Yazılım Geliştirme İçin 10 Kuralı
(cs.otago.ac.nz)- NASA'nın yazılım geliştirme için 10 kuralına dair eleştirel bir analiz
- Bu kurallar son derece kritik gömülü sistemler (ör. uzay aracı yazılımları) için tasarlanmıştır
- Ancak bu kuralların başka geliştirme ortamlarında da uygun olup olmadığı veya başka dillerde (C dışındaki dillerde) uygulanabilir olup olmadığı tartışılmalıdır
1. Basit kontrol akışını koru (goto, setjmp/longjmp, özyineleme yasak)
- Bu kural, istisna işleme (
setjmp()/longjmp()) ve özyinelemeyi yasaklar. - Özyineleme mutlaka verimsiz değildir. Uygun yöntemler kullanılırsa özyinelemede de sonlanma garanti edilebilir.
- Özyinelemeyi zorla döngüye dönüştürmek, bakımı zor kodlara yol açma riski taşır.
Eleştiri:
- Sonlanma garantisi önemlidir, ancak aşırı kısıtlamalar okunabilirlik ve bakım yapılabilirliği zedeleyebilir.
- Koşulsuz özyineleme yasağı, gereksiz karmaşıklığa yol açma potansiyeli taşır.
2. Tüm döngülerin açık bir üst sınırı olmalı
- Derleyicinin döngü tekrar sayısını statik olarak analiz edebilmesi gerekir.
- Ancak yalnızca bir üst sınır koymak, gerçek çalışma süresini garanti etmeye yetmez.
- Özyineleme derinliğine sınır koymak da döngü üst sınırı koymak kadar güvenli olabilir.
Eleştiri:
- Sadece üst sınır koymak, pratikte uygulanabilir yürütme süresini garanti etmez.
- Üst sınır belirlenmiş olsa da değer çok büyükse, fiilen sonsuz döngüden pek farklı olmayabilir.
3. Başlatmadan sonra dinamik bellek ayırma yasak
- Gömülü sistemlerde bellek sınırlı olduğundan, amaç bellek yetersizliğinden kaynaklanan çökmeleri önlemektir.
- Ancak elle bellek yönetimi yerine öngörülebilir dinamik ayırma daha güvenli olabilir.
- Örneğin gerçek zamanlı çöp toplayıcı (RTGC) kullanılırsa dinamik ayırma da öngörülebilir hale getirilebilir.
Eleştiri:
- Dinamik ayırmayı tamamen yasaklamak yerine, bellek kullanım kalıplarını analiz ederek güvenliği sağlamak daha iyi bir yaklaşım olabilir.
- Modern statik analiz araçları (SPlint vb.) kullanılarak dinamik bellekle ilgili hatalar önceden tespit edilebilir.
4. Fonksiyon boyutu bir A4 sayfasıyla sınırlı olmalı (yaklaşık 60 satır)
- Mantık, fonksiyon çok uzarsa okunabilirliğin düşmesidir.
- Ancak modern geliştirme ortamlarında kod katlama özellikleri bulunduğundan, fonksiyon uzunluğundan çok mantıksal birimlerin boyutu daha önemlidir.
Eleştiri:
- Fiziksel boyut (satır sayısı) yerine mantıksal karmaşıklık ölçüt alınmalıdır.
- Fonksiyonları küçük parçalara bölmek başlı başına amaç haline gelmemelidir → aksine bakımı zorlaştırabilir.
5. Her fonksiyonda en az iki assert ifadesi kullan
assert, hata ayıklama ve belgeleme açısından çok faydalıdır.- Ancak koşulsuz sayı zorlaması verimsiz olabilir.
Eleştiri:
assertsayısından çok, veri geçerliliği kontrolünün nerelerde gerektiğini netleştirmek önemlidir.- Tüm parametreleri ve dış girdileri doğrulamak daha pratiktir.
6. Veri nesnelerinin kapsamını en aza indir
- Yerel değişken kullanımını teşvik eden iyi bir ilkedir.
- Ancak yalnızca değişkenlerin değil, tiplerin ve fonksiyonların kapsamı da en aza indirilmelidir.
Eleştiri:
- Ada, Pascal, JavaScript ve fonksiyonel dillerde tipler ve fonksiyonlar da yerel olarak tanımlanabilir → bu, NASA kurallarından daha iyi bir yaklaşımdır.
7. Fonksiyon dönüş değerleri ve parametre geçerliliği mutlaka doğrulanmalı
- Dönüş değerleri mutlaka kontrol edilmelidir.
- Ancak her durumu kontrol etmek pratikte zordur.
Eleştiri:
- Çalışma zamanı hatalarını önlemek için mümkün olduğunca çok kontrol gerekir, ancak pratik sınırlar da dikkate alınmalıdır.
- Özellikle C'de dönüş değeri kontrolü önemlidir; ancak modern dillerde (Java, Rust vb.) tip sistemi kullanılarak daha güvenli işlemler yapılabilir.
8. Önişlemci kullanımını sınırla (yalnızca başlık ekleme ve basit makrolara izin verilir)
- Karmaşık makrolar, token birleştirme, değişken argümanlı makrolar (
...) yasaktır. - Ancak değişken argümanlı makrolar hata ayıklama araçları için yararlı olabilir.
Eleştiri:
- Önişlemci kullanımını kısıtlamak yerine, okunabilir makro stillerini teşvik etmek daha uygundur.
#ifdefgibi koşullu derlemeyi engellemek, platformdan bağımsız kod yazmayı zorlaştırabilir.
9. Pointer kullanımını sınırla (çift pointer yasak, fonksiyon pointer'ı yasak)
- Fonksiyon pointer'ı kullanımını yasaklar → amaç yüksek kararlılıktır.
- Ancak fonksiyon pointer'ları callback'ler, strategy pattern ve aygıt sürücüleri için gereklidir.
Eleştiri:
- Fonksiyon pointer'ları olmadan fonksiyon seçimini
switch-caseile zorlamak, kod okunabilirliğini düşürür ve bakımı zorlaştırır. - İşletim sistemi, ağ yığını ve sürücü geliştirmede fonksiyon pointer'ları vazgeçilmezdir.
- Pointer kısıtlamasından ziyade, güvenli pointer kullanımını garanti eden yöntemler (C++ smart pointer'lar, Rust vb.) daha iyi bir çözümdür.
10. Tüm kod için derleyici uyarılarını en yüksek düzeye getir ve statik analiz araçları kullan
- Bu kural çok iyi bir öneridir.
- Derleyici uyarılarını gidermek + statik analiz araçları kullanmak = daha yüksek güvenilirlik.
Eleştiri:
- NASA'nın diğer kurallarının bazıları (ör. pointer yasağı, fonksiyon boyutu sınırı), aslında statik analiz araçlarının sınırlamalarını aşma amacı taşır.
- Ancak modern statik analiz araçları çok gelişmiştir; bu yüzden aşırı kısıtlamalar yerine daha incelikli analiz tekniklerinden yararlanmak daha faydalıdır.
6 yorum
Bunların hepsi gerçek zamanlı, gömülü sistemler açısından bakınca anlaşılır ve gerekli kurallar gibi görünüyor. Statik analiz araçları bu kuralların yerini alabilir mi?
Örneğin, dinamik tahsisata izin verildiğinde tüm kullanım senaryolarında bellek tahsisinin başarılı olacağını garanti edebilir mi?
Yazılım testini öğrenirken hep ilk günün ilk saatinde değinilen önermeler vardır. Bunlardan biri de "mükemmel test imkansızdır" olur.
Karşı çıkan görüş daha çok dikkatimi çektiğine göre
sanırım bana uyan kurallar değilmiş haha
Sadece NASA’da değil, havacılık/otomotiv gibi hayatın doğrudan söz konusu olduğu sektörlerde de benzer kodlama kurallarının sıkça uygulandığı görülüyor gibi haha
https://github.com/kubernetes/kubernetes/…
Kubernetes kaynak kodunda, NASA Space Shuttle uygulama kaynak kodu yazım yöntemiyle yazıldığı söylenen 'space shuttle style' kod bloğu aklıma geldi.
İlgili HN başlığı: https://news.ycombinator.com/item?id=18772873
Hacker News yorumu
setjmp/longjmpsavunan bir yazıyı en baştan ciddiye almakta zorlandımsetjmp/longjmp'nin exception handling olduğunu iddia ediyorsetjmp()velongjmp()exception ele almanın kötü bir yoludur> Başlık bunun kurallara yönelik bir eleştiri olduğunu belirtmeli
222