10 Aturan Pengembangan Perangkat Lunak NASA
(cs.otago.ac.nz)- Analisis kritis terhadap 10 aturan pengembangan perangkat lunak NASA
- Aturan-aturan ini ditujukan untuk sistem embedded yang sangat kritis (misalnya perangkat lunak wahana antariksa)
- Namun, perlu dibahas apakah aturan-aturan ini juga tepat untuk lingkungan pengembangan lain, atau dapat diterapkan pada bahasa lain (bukan C)
1. Pertahankan alur kontrol yang sederhana (larangan goto, setjmp/longjmp, rekursi)
- Aturan ini melarang penanganan pengecualian (
setjmp()/longjmp()) dan rekursi. - Rekursi tidak selalu tidak efisien. Dengan metode yang tepat, rekursi juga dapat dijamin berhenti.
- Memaksa rekursi diubah menjadi loop berisiko menghasilkan kode yang sulit dirawat.
Kritik:
- Jaminan terminasi memang penting, tetapi pembatasan yang ekstrem dapat menghambat keterbacaan dan pemeliharaan.
- Larangan rekursi tanpa pengecualian sangat mungkin menimbulkan kompleksitas yang tidak perlu.
2. Semua loop harus memiliki batas atas yang jelas
- Compiler harus dapat menganalisis secara statis jumlah iterasi loop.
- Namun, hanya dengan menetapkan batas atas tidak berarti waktu eksekusi nyata dapat dijamin.
- Membatasi kedalaman rekursi bisa sama amannya dengan memberi batas atas pada loop.
Kritik:
- Sekadar memberi batas atas tidak menjamin waktu eksekusi yang realistis.
- Walaupun ada batas atas, jika nilainya terlalu besar maka secara praktis tidak berbeda dari loop tak berujung.
3. Larangan alokasi memori dinamis setelah inisialisasi
- Dalam sistem embedded, memori terbatas sehingga tujuannya adalah mencegah crash akibat kehabisan memori.
- Namun, alokasi dinamis yang dapat diprediksi bisa jadi lebih aman daripada manajemen memori manual.
- Sebagai contoh, dengan menggunakan real-time garbage collector (RTGC), alokasi dinamis pun dapat dibuat dapat diprediksi.
Kritik:
- Daripada melarang alokasi dinamis itu sendiri, bisa jadi pendekatan yang lebih baik adalah menganalisis pola penggunaan memori untuk menjamin keamanan.
- Dengan memanfaatkan alat analisis statis modern (seperti SPlint), kesalahan terkait memori dinamis dapat dideteksi lebih awal.
4. Ukuran fungsi dibatasi tidak lebih dari satu lembar kertas A4 (sekitar 60 baris)
- Logikanya, fungsi yang terlalu panjang akan menurunkan keterbacaan.
- Namun, di lingkungan pengembangan modern ada fitur code folding, sehingga ukuran unit logis lebih penting daripada panjang fungsi.
Kritik:
- Yang seharusnya dijadikan acuan adalah kompleksitas logis, bukan ukuran fisik (jumlah baris).
- Memecah fungsi menjadi kecil-kecil itu sendiri tidak boleh menjadi tujuan → justru bisa membuat pemeliharaan lebih sulit.
5. Minimal gunakan dua pernyataan assert per fungsi
assertsangat berguna untuk debugging dan dokumentasi.- Namun, pembatasan jumlah yang kaku bisa tidak efisien.
Kritik:
- Yang penting bukan jumlah
assert, melainkan memperjelas lokasi yang memang memerlukan validasi data. - Memvalidasi semua argumen dan input eksternal lebih praktis.
6. Minimalkan scope objek data
- Ini prinsip yang baik karena mendorong penggunaan variabel lokal.
- Namun, bukan hanya fungsi, scope tipe dan fungsi juga perlu diminimalkan.
Kritik:
- Dalam Ada, Pascal, JavaScript, dan bahasa fungsional, tipe dan fungsi juga dapat dideklarasikan secara lokal → pendekatan yang lebih baik daripada aturan NASA.
7. Wajib memvalidasi nilai balik fungsi dan validitas parameter
- Nilai balik harus selalu diperiksa.
- Namun, memeriksa semua kasus secara menyeluruh sulit dilakukan dalam praktik.
Kritik:
- Untuk mencegah kesalahan saat runtime, pemeriksaan sebanyak mungkin memang diperlukan, tetapi batas praktis juga harus dipertimbangkan.
- Terutama di C, pemeriksaan nilai balik sangat penting, tetapi dalam bahasa modern (Java, Rust, dll.), ini bisa ditangani lebih aman dengan memanfaatkan sistem tipe.
8. Batasi penggunaan preprocessor (hanya include header dan makro sederhana yang diizinkan)
- Makro kompleks, token pasting, dan makro variadik
(...)dilarang. - Namun, makro variadik bisa berguna sebagai alat debugging.
Kritik:
- Daripada membatasi penggunaan preprocessor, lebih baik menganjurkan gaya makro yang mudah dibaca.
- Jika kompilasi kondisional seperti
#ifdefdilarang, menulis kode yang independen dari platform bisa menjadi sulit.
9. Batasi penggunaan pointer (larangan pointer ganda, larangan function pointer)
- Larangan penggunaan function pointer → bertujuan mencapai stabilitas yang tinggi.
- Namun, function pointer sangat penting untuk callback, strategy pattern, dan device driver.
Kritik:
- Jika pemilihan fungsi dipaksa lewat
switch-casetanpa function pointer, keterbacaan kode menurun dan pemeliharaan menjadi sulit. - Dalam pengembangan sistem operasi, network stack, dan driver, function pointer adalah hal yang esensial.
- Daripada membatasi pointer, metode yang menjamin penggunaan pointer secara aman (seperti smart pointer C++ atau Rust) adalah solusi yang lebih baik.
10. Untuk semua kode, aktifkan peringatan compiler pada tingkat maksimum dan gunakan alat analisis statis
- Aturan ini adalah rekomendasi yang sangat baik.
- Menghilangkan peringatan compiler + menggunakan alat analisis statis = peningkatan stabilitas.
Kritik:
- Aturan NASA lainnya (misalnya larangan pointer, pembatasan ukuran fungsi) pada dasarnya bertujuan mengatasi keterbatasan alat analisis statis.
- Namun, karena alat analisis statis modern sudah sangat berkembang, memanfaatkan teknik analisis yang lebih canggih lebih berguna daripada menerapkan pembatasan yang berlebihan.
6 komentar
Semuanya memang terlihat bisa dipahami dan diperlukan jika dilihat dari sudut pandang real-time dan embedded. Apakah penganalisis statis bisa menggantikan aturan-aturan ini?
Misalnya, jika alokasi dinamis diizinkan, apakah bisa dijamin bahwa alokasi memori akan berhasil dalam semua skenario penggunaan?
Kalau mempelajari pengujian perangkat lunak, selalu ada dalil yang disebut pada hari pertama jam pertama. Salah satunya adalah bahwa "pengujian yang sempurna itu mustahil".
Karena yang menentangnya lebih menarik perhatian saya,
sepertinya aturan ini tidak cocok dengan saya, haha
Sepertinya bukan hanya NASA, di industri yang berkaitan langsung dengan keselamatan jiwa seperti penerbangan/otomotif juga cukup sering diterapkan aturan coding yang mirip haha
https://github.com/kubernetes/kubernetes/…
Di antara kode sumber Kubernetes, ini mengingatkan saya pada blok kode bergaya "space shuttle style" yang katanya ditulis mengikuti cara penulisan kode sumber aplikasi NASA Space Shuttle.
Thread HN terkait: https://news.ycombinator.com/item?id=18772873
Komentar Hacker News
> Judul harus menunjukkan bahwa ini adalah kritik terhadap aturan tersebut
222