Kekokohan (ilmu komputer)

Dalam ilmu komputer, kekokohan adalah kemampuan dari sistem komputer untuk menangani eror dalam eksekusi dan masukan yang bermasalah. Kekokohan dapat meliputi berbagai area dalam ilmu komputer, seperti pemrograman kokoh, pemelajaran mesin kokoh, dan keamanan jaringan kokoh. Teknik formal seperti *fuzz testing*, sangat penting untuk menunjukkan kekokohan karena pengujian tipe ini melibatkan masukan tidak sah dan tidak tertuga. Selain itu, injeksi kesalahan juga dapat digunakan. Berbagai produk komersial melakukan pengujian analisis kekokohan perangkat lunak.

## Pengenalan
Secara umum, sulit untuk membangun sistem yang kokoh dan meliputi seluruh titik kelemahan karena jumlah kombinasi masukan dan luaran amat banyak. Pengujian terhadap semua kombinasi masukan dan luaran memakan terlalu banyak waktu dan para pengembang tidak mungkin melaksanakannya satu-persatu. Karena itu, mereka mengelompokan kasus-kasus yang serupa. Sebagai contoh, bayangkan anda memasukkan beberapa nilai integer. Beberapa masukan tersebut mungkin berupa bilangan negatif, nol, atau bilangan positif. Untuk menguji perangkat lunak, pengembang menggunakan hanya tiga bilangan tersebut untuk menguji seluruh set bilangan riil. Cara ini lebih efisien, tapi lebih riskan pula. Pengelompokan kasus uji adalah satu dari banyak cara untuk menangani kegagalan, khususnya kegagalan karena masukan tidak sah. Secara umum, sistem juga dapat gagal karena alasan-alasan lain, seperti terputus dari jaringan. 

Sistem yang kompleks harus dapat menangani semua eror dengan mulus, bagaimanapun caranya. Ada banyak contoh sistem yang sukses dan kokoh. Beberapa sistem paling kokoh dapat berevolusi dan diadaptasi pada situasi baru dengan mudah.

## Tantangan
Program dan perangkat lunak adalah alat untuk melakukan sebuah tugas yang spesifik, sehingga tidak fleksibel. Meskipun begitu, dengan mengamati sistem internet dan sistem biologis, kita dapat menemukan cara adaptasi mereka terhadap lingkungannya. Salah satu cara sistem biologis beradaptasi terhadap lingkungan adalah menggunakan redundansi. Banyak organ di tubuh kita (manusia) bersifat redundan. Ginjal salah satunya. Umumnya, manusia hanya membutuhkan satu ginjal, tetapi memiliki ginjal kedua memberikan ruang kegagalan atau *room for failure*. Prinsip ini dapat diterapkan pada perangkat lunak, tetapi ada beberapa tantangan. Ketika menerapkan prinsip redundansi pada ilmu komputer, tidak disarankan menambahkan kode dengan semena-mena. Penambahan kode secara asal akan mengenalkan lebih banyak eror kepada sistem, membuat sistem menjadi lebih kompleks , dan sulit dimengerti. Kode baru yang tidak menguatkan kode yang sudah ada tidak diinginkan. Sebaliknya, kode baru harus memiliki kegunaan yang setara. Sehingga, jika suatu fungsi tidak bekerja, fungsi lain yang melakukan hal yang sama dapat menggantikannya. Dapat dikerjakan dengan keragaman perangkat lunak manual atau otomatis. Untuk itu, kode baru harus tau kapan dan bagaimana menangani titik kegagalan. Berarti, lebih banyak logika dibutuhkan dalam sistem tersebut. Tetapi, seiring penambahan logika dalam sistem, komponen dan ukurannya bertambah dan menjadikannya lebih kompleks. Secara singkat sistem yang lebih redundan pasti lebih kompleks. Pengembang harus mempertimbangkan keseimbangan antara redundansi dan kompleksitas. 

Dewasa ini, ilmu komputer dalam praktiknya tidak terlalu mementingkan membangun sistem yang kokoh. Sebaliknya, mereka lebih terfokus pada skalabilitas dan efisiensi. Salah satu alasannya adalah sulit untuk membangun kekokohan secara umum.

## Wilayah

### Pemrograman kokoh
Pemrograman kokoh adalah satu ragam pemrograman yang terfokus pada penanganan penghentian dan aksi tak terduga. Hal ini membutuhkan kode untuk menangani aksi dan penghentian tak terduga ini secara anggun dengan menampilkan pesan eror yang akurat dan jelas. Pesan eror ini memungkinkan pengguna untuk men-*[[debug]]* program dengan lebih mudah.

#### Prinsip

; Paranoia
: Ketika membangun perangkat lunak, programmer berasumsi pengguna ada untuk menghancurkan kode mereka. Progammer juga berasumsi kode buatan mereka akan, secara salah, bekerja atau tidak.

; Kebodohan
: Programmer berasumsi pengguna akan mencoba masukan yang salah, palsu, dan cacat. Sebagai konsekuensi, programmer harus mengembalikan dengan pesan eror yang jelas dan intuitif. Pesan eror sebaiknya menampulkan informasi seakurat mungkin tanpa menyesatkan pengguna, sehingga masalah dapat diperbaiki dengan mudah.

; Penerapan berbahaya
: Pengguna tidak boleh mengakses pustaka, struktur data, atau penunjuk struktur data. Informasi ini harus disembunyikan, sehingga pengguna tidak memodifikasi dan mengenalkan bug ke kode secara tidak sengaja . Antarmuka yang dibangun dengan baik dapat digunakan oleh pengguna tanpa bisa menemukan celah yang mampu memodifikasi antarmuka. Ketika antarmuka yang baik diimplimentasikan, pengguna tidak perlu melakukan modifikasi. Sehingga, pengguna fokus hanya pada kodenya sendiri.

; Tidak akan terjadi
: Sangat sering, kode dimodifikasi dan dapat mengenalkan suatu kasus yang "tidak mungkin" terjadi, bisa saja terjadi. Pengembang harus memikirkan bagaimana menangani kasus-kasus yang jarang terjadi ini dan menerapkan penanganannya. 
:

### Pemelajaran mesin kokoh
Pemelajaran mesin kokoh biasanya merujuk pada kekokohan algortime pemelajaran mesin. Untuk sebuah algoritma pemelajaran mesin dianggap kokoh, eror pada pengujian konsiten dengan eror pada pelatihan, atau performa tetap stabil ketika kebisingan ditambah pada *dataset*. Akhir-akhir ini konsisten dengan naiknya popularitas jejaring saraf, minat terhadap kekokohannya juga meningkat. Khususnya pada kerentanannya pada serangan. 

### Desain jejaring kokoh
Desain jejaring kokoh adalah studi terhadap desain jejaring yang dihadapkan dengan permintaan tidak pasti dan beragam. Dalam artian, kekokohan dalam desain jejaring bentuknya luas seperti kekokohan pada desain perangkat lunak karena amat banyaknya kemungkinan perubahan atau masukan. 

### Algoritma kokoh
Algoritma yang mentoleransi eror dalam masukan.

## Lihat juga

* Toleransi kesalahan
* Pemrograman bertahan
* Persyaratan nonfungsional

## Referensi