Sebuah pesawat terbang, berlawanan dengan, misalnya, situs web, adalah sistem di mana setiap kegagalan dalam sistem tertentu sama sekali tidak dapat diterima, karena kesalahan dalam pemantauan penerbangan misalnya dapat menyebabkan autopilot tidak berfungsi dan melakukan penyelaman. Jelas, ini tidak terjadi karena para insinyur brilian di Boeing dan Airbus melakukan pengecekan dalam autopilot untuk memastikan tidak tiba-tiba memutuskan bahwa penyelaman adalah manuver yang dapat diterima dan aman. Atau mungkin komputer crash, dan pilot di pesawat fly-by-wire yang lebih baru tidak bisa lagi benar-benar menerbangkan pesawat. Tentu saja, ada berbagai prosedur keselamatan dan redudansi yang dibangun ke dalam sistem ini untuk mencegah kecelakaan (baik dari perangkat lunak dan pesawat terbang).
Namun, di sisi lain, cukup jelas bahwa perangkat lunak tidak sempurna - baik perangkat lunak open source dan tertutup melakukan crash secara teratur, dan hanya program "Hello World" yang paling sederhana tidak gagal. Bagaimana para insinyur yang merancang sistem perangkat lunak di industri penerbangan, medis, dan kehidupan atau mati lainnya dapat menguji perangkat lunak mereka sehingga tidak gagal (dan jika gagal, setidaknya gagal dengan anggun)?
Saya sangat berharap bahwa Anda tidak semua akan pergi: "Oh, saya bekerja untuk Boeing / Airbus / (beberapa perusahaan lain) dan tidak! Bersenang-senang dengan penerbangan / kunjungan rumah sakit berikutnya."
Jawaban:
Saya telah melakukan banyak pekerjaan dalam kontrol industri. Tidak harus dalam industri yang mulia seperti dirgantara. Hampir setiap mesin industri memiliki energi potensial yang cukup untuk menyebabkan cedera serius atau kematian. Saya telah ada ketika orang terluka. Jika Anda menghabiskan sebagian besar waktu Anda di meja di kantor, Anda mungkin akan terkejut melihat betapa berbahayanya pekerjaan pabrik (dan tentu saja sampai saat ini). Sekarang kami memiliki metode pengamanan mesin yang lebih baik. Begini cara kerjanya dalam praktik (meskipun bervariasi dari yurisdiksi ke yurisdiksi):
Ada standar OSHA di AS, dan pedoman serupa (biasanya lebih ketat) di UE. Ini biasanya dimulai dengan mengharuskan Anda untuk melakukan analisis risiko. Ini berarti Anda membuat daftar semua bahaya dan kemudian mengkategorikan bahaya itu, dengan mempertimbangkan hal-hal seperti seberapa sering seseorang akan terpapar risiko, seberapa mudahnya untuk menghindari risiko (tergantung pada kecepatan, dll.), Dan apa adalah tingkat keparahan hasilnya (potong, amputasi, kematian, dll.).
Banyak analisis terkait dengan menjaga bahaya. Jika Anda meletakkan sangkar besar di sekitar mesin dan mengencangkannya dengan ketat, maka mesin Anda dianggap aman jika komponen mesin tidak dapat menembus pelindung. Jika Anda membutuhkan alat untuk masuk, itu dianggap sebagai tugas pemeliharaan, dan orang pemeliharaan seharusnya dilatih tentang cara bekerja dengan aman pada mesin. Namun pada kenyataannya, sebagian besar alat berat memerlukan interaksi teratur dengan operator sehingga kami harus meletakkan pintu akses di pelindung, atau gorden ringan, dll. Pintu dan gorden ringan itu perlu dipantau dan kekuatan terhadap bahaya yang dipaparkan oleh operator kepada diri mereka sendiri. harus dimatikan dengan cara "control reliable".
Berdasarkan analisis itu, risiko dimasukkan ke dalam berbagai kategori. Skala klasifikasi umum adalah Kategori 1 hingga Kategori 4 (berdasarkan standar EN 954-1). Berdasarkan kategori-kategori tersebut, Anda diharuskan secara hukum untuk memberikan tingkat perlindungan dan keamanan alat berat tertentu.
Kategori 4, misalnya, mensyaratkan bahwa:
Ini bisa sulit untuk dicapai dalam praktiknya, tetapi dibuat lebih sederhana dengan ketersediaan komponen standar yang disertifikasi untuk Kategori 4. Misalnya, satu komponen umum dalam sistem ini adalah Relay Keselamatan. Ini lebih dari sekadar relay mekanis:
Seperti yang Anda tahu, ini adalah perangkat yang rumit. Biaya tipikal dalam kisaran $ 200 hingga $ 600 untuk setiap relay keselamatan. Jelas ada perangkat lunak di perangkat ini. Untuk mendapatkan relay keselamatan Anda, Anda biasanya harus mengikuti desain seperti ini:
Setelah Anda merancang sistem keselamatan untuk alat berat Anda, menggunakan komponen yang diberi peringkat keselamatan, maka Anda harus meninjau desainnya dan dicap oleh Insinyur Profesional. Maka Anda membangun mesin. Lalu P.Eng. akan meninjau konstruksi mesin memastikan itu dibangun dengan desain. Mereka akan mendokumentasikannya, dan akan melakukan beberapa tes untuk memastikannya berfungsi seperti yang diharapkan. Ini disebut tinjauan pra-mulai (PSR) dan tidak dilakukan di setiap yurisdiksi. Setelah PSR berlalu, Anda diizinkan memiliki operator yang menjalankan mesin.
Dalam beberapa tahun terakhir telah terjadi beberapa revolusi dalam sistem keselamatan. Untuk sementara waktu tidak ada yang memercayai pengiriman data keselamatan melalui jaringan, jadi apa yang biasanya disebut "sistem I / O terdistribusi" seperti DeviceNET dan EtherCAT tidak diizinkan di bagian keamanan sistem. Namun, protokol terbaru sekarang memungkinkan perangkat keselamatan untuk menjalankan jaringan industri ini. Protokol menggunakan pesan yang dicap waktu, dan pemrosesan ganda berlebih pada kedua ujung koneksi.
Relai keselamatan perlahan menuju burung dodo, digantikan oleh PLC Keselamatan yang lebih rumit, yang seperti cara untuk membangun logika keselamatan dalam bahasa diagram blok fungsi. Sekali lagi, PLC keselamatan ini menggunakan semuanya yang berlebihan. Saat program disetujui, sebelum mesin dioperasikan, P.Eng. akan mencap program dan program / PLC akan dikunci dengan kata sandi. Ini juga membutuhkan hash dari program dan hash itu dicatat dalam dokumentasi (itulah yang P.Eng benar-benar cap).
Sekarang setelah Anda merancang sistem keselamatan Anda, logika yang Anda tulis untuk mengendalikan mesin itu sendiri bisa sangat nyaman. Pemrogram sering kali membuat crash mesin yang menyebabkan ribuan dolar kerusakan, tetapi setidaknya tidak ada yang terluka.
sumber
Ada langkah serius menuju verifikasi formal daripada pengujian fungsional acak.
Instansi pemerintah seperti NASA dan beberapa organisasi pertahanan semakin banyak menghabiskan uang untuk teknologi ini.
Mereka masih PITA untuk programmer rata-rata, tetapi mereka sering lebih efektif dalam menguji sistem kritis.
Ada juga kecenderungan untuk mencoba lebih banyak teknik dari akademisi, untuk hal-hal seperti memvalidasi kode multithreaded.
sumber
Tergantung pada apa perangkat lunaknya. Sebagai contoh, di pesawat biasanya ada pemrosesan dual-redundan untuk sistem kritis; dalam kasus ekstrem dapat ada 2 desain perangkat keras yang berbeda yang digunakan, dan dua potong s / w yang dikembangkan secara independen, masing-masing untuk dijalankan. Keduanya menghitung dan mengecek satu sama lain. Ini tidak mudah dan sangat mahal.
Ketika datang ke hal-hal seperti pengujian sistem pesawat, ada serangkaian tes dilakukan - pengujian sistem terkait penerbangan membutuhkan waktu berbulan-bulan, dan jika Anda membuat perubahan sama sekali seluruh rangkaian tes ulang diperlukan untuk dijalankan. Ini biasanya dilakukan dalam simulator, yang mungkin sebenarnya penuh dengan bagian-bagian pesawat nyata (misalnya kokpit) dengan mengatakan mesin simulasi atau sejenisnya. Seperti yang Anda bayangkan, ini juga sangat mahal untuk dibangun. Perubahan dievaluasi terhadap program pengujian formal, dan kemudian dijalankan di pesawat terbang nyata dalam penerbangan uji. Sepanjang jalan hal-hal seperti tes "fungsional terganggu" dijalankan, ini adalah di mana item yang diubah diizinkan untuk melakukan hal-hal normal dan semuanya diperiksa / diuji untuk melihat bahwa tidak ada efek yang merusak. Ini juga menghabiskan banyak uang dan bisa memakan waktu berminggu-minggu.
Saya tahu satu contoh di mana perubahan yang sangat sederhana untuk sistem penerbangan diperlukan - begitu sederhana Anda akan terpana pada seberapa kecil. Namun pengujian ulang ini akan memakan waktu> 3 bulan dan biaya sekitar $ 1 juta.
Ketika Anda masuk ke dunia medis, ada serangkaian rintangan peraturan yang harus dilewati terkait tidak hanya dengan pengujian tetapi juga dengan proses pengembangan dan dokumentasi.
Semua bidang ini adalah langkah besar dari tempat yang menghapus sedikit kode PHP untuk situs web. Ini lambat, melelahkan, sulit, membosankan, membosankan, teliti, dan sangat mahal. Ambil biaya pengembangan / pengujian normal Anda dan kalikan dengan sekitar 100 dan Anda semakin mendekati sasaran.
sumber
Untuk perangkat lunak luar angkasa NASA, baca They Write the Right Stuff . Untuk FDA (Badan Pengawas Obat dan Makanan AS) baca baca ini
sumber
Karena Anda sudah mendapat jawaban yang cukup bagus dan informatif, inilah pilihan saya.
Sederhana - tes pertama selalu dilakukan pada programmer itu sendiri. Itu cenderung menjaga jumlah bug rendah, dan memastikan bahwa hanya programmer yang berkualitas yang tetap dalam daftar gaji.
sumber
Perangkat lunak yang kritis terhadap kehidupan tidak diuji ke standar apa pun selain yang "tampaknya berfungsi" , seperti yang dilakukan di semua tempat.
Semua investasi masuk ke apa yang tampaknya bekerja sebelum atau untuk proyek untuk memungkinkan non-programmer untuk menghasilkan perangkat lunak yang lebih baik .
ps Tidak ada komentar pada yang pertama
-1
, tapi saya akan dengan senang hati mengambil-1
untuk setiap referensi yang bertentangan dengan pernyataan saya.Dapatkah saya mengambil +1 untuk setiap referensi yang saya temukan untuk perangkat lunak kritis yang tidak dirancang atau diuji dengan baik? Simson Garfinkel mendokumentasikan sepuluh kasus dalam sebuah artikel di WIRED.
sumber
Tidak ada satu jawaban untuk semua kasus. Terserah produsen individu untuk memutuskan bagaimana merancang dan menguji perangkat lunak mereka. Tetapi seluruh proses pengembangan perangkat lunak harus memenuhi spesifikasi formal.
Misalnya ketika membuat perangkat lunak untuk perangkat medis Anda harus mengikuti standar IEC 62304 untuk perangkat lunak untuk perangkat medis. (Sayangnya saya hanya dapat menautkan ke wikipedia karena tidak gratis). Hampir setiap negara di dunia mensyaratkan bahwa standar ini telah diikuti.
Seberapa ketat persyaratan ini tergantung pada risiko bahaya. Misalnya perangkat pendukung kehidupan akan memiliki risiko bahaya terbesar (kematian tertentu jika sistem gagal), sedangkan sistem yang bekerja dengan diagnostik penyakit memiliki risiko lebih rendah (kemungkinan kematian jika penyakit terminal tidak didiagnosis dengan benar jika sistem gagal).
Tetapi apa yang dikatakan pada dasarnya adalah bahwa harus ada keterlacakan dari persyaratan ke perangkat lunak. Anda harus melakukan verifikasi unit perangkat lunak. Itu tidak menentukan apa verifikasi itu. Dapat berupa unit test, bisa berupa review kode. Untuk perangkat yang berisiko lebih tinggi, Anda harus meninjau secara manual antarmuka antar unit perangkat lunak (sejauh yang saya mengerti dan ingat). Dan tentu saja banyak aturan lainnya. Oh, dan Anda harus menulis banyak dokumentasi untuk mendokumentasikan pekerjaan Anda.
Standar tidak melarang pengembangan lincah, meskipun ketika membacanya sepertinya itu ditulis dengan pengembangan air terjun dalam pikiran.
Saya tidak tahu tentang bidang pengembangan perangkat lunak lain, seperti penerbangan, kereta api, mobil, dll. Tapi saya berasumsi bahwa ada pedoman formal serupa lainnya.
sumber
Banyak teknik yang digunakan, termasuk tetapi tidak terbatas pada:
Tetapi teknik nomor satu adalah:
Perangkat lunak pesawat ruang angkasa membutuhkan lebih banyak upaya untuk menguji daripada mendesain dan kode di tempat pertama.
Pesawat mengalami beberapa tahun tes penerbangan di mana pesawat dibawa ke situasi yang ekstrem. Ini menguji tidak hanya struktur fisik tetapi juga perangkat lunak.
sumber
Ada artikel "Perangkat lunak sempurna" oleh Jack Ganssle on EETimes tanggal 3/1/2009 12:00 EST. Beberapa poin dari sana:
Menariknya, mengenai perangkat lunak komersial, data yang dikumpulkan oleh Capers Jones menunjukkan bahwa "perangkat lunak pada umumnya memiliki efisiensi penghilangan cacat (persentase bug yang dihapus sebelum pengiriman) sebesar 87%. Firmware mendapat skor 94% yang jauh lebih baik." Bagi saya, tidak ada yang mendekati sempurna. Artikel yang disebutkan penjawab sebelumnya menunjukkan bahwa tim pesawat ulang-alik NASA mencapai tingkat penghilangan bug 99%, tetapi biayanya 35 juta per tahun untuk sekitar 400 ribu baris kode.
Artikel yang lebih menarik "Perangkat lunak untuk sistem yang dapat diandalkan" oleh penulis yang sama pada 11/1/2009, tampaknya lebih relevan. Dapat diringkas seperti ini:
Menurut ingatan saya, HP mempraktikkan desain-untuk-kontrak hampir satu dekade yang lalu. Dengan tim kecil, 500 ribu baris kode, hanya 2 bug yang dilaporkan setelah pengiriman. Sangat mengesankan.
Dalam pandangan saya, perangkat lunak yang dapat diandalkan atau sempurna hanya dapat dicapai jika biayanya tidak terlalu tinggi. Kerangka kerja atau otomatisasi adalah yang harus dimiliki.
sumber
Mereka biasanya memiliki interlock perangkat keras yang digunakan sebagai gagal-aman.
Misalnya desain kotak teks jahat standar untuk robot pembunuh selalu disertai dengan kill-switch: P
sumber
Setiap industri memiliki serangkaian badan pengatur yang memiliki persyaratan pengujian dan dokumentasi untuk perangkat keras dan perangkat lunak terkait keselamatan. Pertimbangkan PDF ini dari Underwriters Laboratory (UL) yang memperkenalkan standar UL 1998: http://www.ul.com/global/documents/offerings/industries/hightech/software/UL_softwareconformityassessment.pdf
Ada referensi dalam dokumen itu untuk banyak yang terkait lainnya dari UL, CSA, dan IEC.
Biasanya, perangkat lunak yang terkait dengan keselamatan akan memiliki sirkuit perangkat keras yang berlebihan atau diharuskan memiliki fitur kontrol berlebihan lainnya untuk memastikan operasi yang aman dan mode kegagalan yang aman.
sumber