Jawaban DW itu bagus , tapi saya ingin memperluas pada satu titik. Spesifikasi bukan hanya referensi yang dengannya kode diverifikasi. Salah satu alasan untuk memiliki spesifikasi formal adalah untuk memvalidasinya dengan membuktikan beberapa properti mendasar. Tentu saja, spesifikasi tidak dapat sepenuhnya divalidasi - validasi akan serumit spesifikasi itu sendiri, sehingga itu akan menjadi proses tanpa akhir. Tetapi validasi memungkinkan kami mendapatkan jaminan yang lebih kuat pada beberapa properti penting.
Misalnya, Anda mendesain autopilot mobil. Ini adalah hal yang cukup rumit yang melibatkan banyak parameter. Sifat kebenaran autopilot meliputi hal-hal seperti "mobil tidak akan menabrak tembok" dan "mobil akan mengemudi ke tempat yang disuruh". Properti seperti "mobil tidak akan menabrak tembok" benar-benar sangat penting, jadi kami ingin membuktikannya. Karena sistem beroperasi di dunia fisik, Anda perlu menambahkan beberapa kendala fisik; properti sebenarnya dari sistem komputasi akan menjadi sesuatu seperti "di bawah asumsi ini mengenai ilmu material, dan asumsi ini mengenai persepsi hambatan oleh sensor mobil, mobil tidak akan menabrak dinding". Namun demikian, hasilnya adalah properti yang relatif sederhana yang jelas diinginkan.
Bisakah Anda membuktikan properti ini dari kode? Pada akhirnya, itulah yang terjadi, jika Anda mengikuti pendekatan yang sepenuhnya formal¹. Tetapi kodenya memiliki banyak bagian yang berbeda; rem, kamera, mesin, dll. semuanya dikendalikan secara otonom. Properti kebenaran dari rem akan menjadi sesuatu seperti "jika sinyal 'terapkan rem' diaktifkan maka rem diterapkan". Properti kebenaran mesin adalah "jika sinyal kopling mati maka mesin tidak menggerakkan roda". Dibutuhkan pandangan tingkat tinggi untuk menggabungkan semuanya. Spesifikasi menciptakan lapisan perantara di mana komponen yang berbeda dari sistem dapat diartikulasikan bersama.
Bahkan, sistem yang rumit seperti autopilot mobil akan memiliki beberapa tingkat spesifikasi dengan jumlah penyempurnaan yang berbeda-beda. Pendekatan penyempurnaan sering digunakan dalam desain: mulai dengan beberapa properti tingkat tinggi seperti "mobil tidak akan menabrak dinding", kemudian mencari tahu bahwa ini memerlukan sensor dan rem dan bekerja beberapa persyaratan dasar untuk sensor, rem dan perangkat lunak perintis, kemudian menyempurnakan kembali persyaratan dasar tersebut menjadi desain komponen (untuk sensor, saya akan memerlukan radar, DSP, perpustakaan pemrosesan gambar, ...), dll. Dalam proses pengembangan formal, setiap tingkat spesifikasi terbukti memenuhi persyaratan yang ditetapkan oleh tingkat di atasnya, mulai dari properti tingkat tertinggi hingga kode.
Tidak mungkin untuk memastikan bahwa spesifikasinya benar. Misalnya, jika Anda salah memahami fisika, rem mungkin tidak efektif meskipun matematika yang menghubungkan kode rem dengan persyaratan formal benar. Tidak ada gunanya membuktikan bahwa jeda itu efektif dengan beban 500kg jika Anda benar-benar memiliki 5000kg. Tetapi lebih mudah untuk melihat bahwa 500kg salah daripada melihat di dalam kode rem bahwa mereka tidak akan cukup baik untuk parameter fisik mobil.
¹ Kebalikan dari pendekatan formal sepenuhnya adalah "Saya kira ini berhasil, tetapi saya tidak bisa memastikan". Ketika Anda mempertaruhkan hidup Anda untuk itu, itu tidak tampak hebat.