Tingkat Dasar:
Mari kita lihat hal-hal di tingkat paling sederhana, dan paling dasar.
Untuk matematika, kami memiliki:
2 + 3 = 5
Saya belajar tentang itu ketika saya masih sangat muda. Saya dapat melihat elemen yang paling mendasar: dua objek, dan tiga objek. Bagus.
Untuk pemrograman komputer, kebanyakan orang cenderung menggunakan bahasa tingkat tinggi. Beberapa bahasa tingkat tinggi bahkan dapat "mengkompilasi" menjadi salah satu bahasa tingkat tinggi yang lebih rendah, seperti C. C kemudian dapat diterjemahkan ke dalam bahasa Assembly. Bahasa assembly kemudian dikonversi menjadi kode mesin. Banyak orang berpikir kompleksitas berakhir di sana, tetapi tidak: CPU modern mengambil kode mesin sebagai instruksi, tetapi kemudian jalankan "kode mikro" untuk benar-benar menjalankan instruksi tersebut.
Ini berarti bahwa, pada tingkat paling dasar (berurusan dengan struktur yang paling sederhana), kita sekarang berurusan dengan kode-mikro, yang tertanam dalam perangkat keras dan yang kebanyakan programmer bahkan tidak menggunakan secara langsung, atau memperbarui. Faktanya, tidak hanya sebagian besar programmer tidak menyentuh kode mikro (0 level lebih tinggi dari kode mikro), kebanyakan programmer tidak menyentuh kode mesin (1 level lebih tinggi dari kode mikro), atau bahkan Majelis (2 level lebih tinggi dari kode mikro) ( kecuali, mungkin, untuk sedikit pelatihan formal selama kuliah). Sebagian besar programmer akan menghabiskan waktu hanya 3 level atau lebih tinggi.
Lebih jauh, jika kita melihat Majelis (yang serendah orang biasanya dapatkan), setiap langkah individu biasanya dapat dimengerti oleh orang-orang yang telah dilatih dan memiliki sumber daya untuk menafsirkan langkah itu. Dalam hal ini, Assembly jauh lebih sederhana daripada bahasa tingkat yang lebih tinggi. Namun, Majelis sangat sederhana sehingga melakukan tugas-tugas kompleks, atau bahkan tugas-tugas biasa-biasa saja, sangat membosankan. Bahasa tingkat atas membebaskan kita dari hal itu.
Dalam undang-undang tentang "rekayasa terbalik", hakim menyatakan bahwa meskipun kode secara teoritis dapat ditangani satu byte pada satu waktu, program modern melibatkan jutaan byte, sehingga beberapa jenis catatan (seperti salinan kode) harus dibuat hanya untuk upaya untuk menjadi layak. (Oleh karena itu pengembangan internal tidak dianggap sebagai pelanggaran terhadap aturan umum tentang hukum hak cipta "tidak ada salinan).) (Saya mungkin berpikir untuk membuat kartrid Sega Genesis yang tidak sah, tetapi mungkin memikirkan sesuatu yang dikatakan selama kasus Game Genie. )
Modernisasi:
Apakah Anda menjalankan kode yang dimaksudkan untuk 286s? Atau apakah Anda menjalankan kode 64-bit?
Matematika menggunakan dasar-dasar yang membentang selama ribuan tahun. Dengan komputer, orang biasanya menganggap investasi pada sesuatu yang berusia dua dekade sebagai pemborosan sumber daya yang sia-sia. Itu berarti Matematika dapat diuji jauh lebih menyeluruh.
Standar Alat Bekas:
Saya diajari (oleh seorang teman yang memiliki lebih banyak pelatihan pemrograman komputer formal daripada saya sendiri) bahwa tidak ada yang namanya kompiler C bebas bug yang memenuhi spesifikasi C. Ini karena bahasa C pada dasarnya mengasumsikan kemungkinan menggunakan memori tak terbatas untuk tujuan stack. Jelas, persyaratan yang tidak mungkin seperti itu harus disimpang dari ketika orang mencoba untuk membuat kompiler yang dapat digunakan yang bekerja dengan mesin yang sebenarnya yang sedikit lebih terbatas di alam.
Dalam prakteknya, saya telah menemukan bahwa dengan JScript di Windows Script Host, saya sudah dapat mencapai banyak objek menggunakan baik. (Saya suka lingkungan karena set alat yang diperlukan untuk mencoba kode baru dibangun ke dalam versi modern dari Microsoft Windows.) Ketika menggunakan lingkungan ini, saya menemukan bahwa kadang-kadang tidak ada dokumentasi yang mudah ditemukan tentang bagaimana objek bekerja. Namun, menggunakan objek itu sangat bermanfaat, toh saya tetap melakukannya. Jadi yang akan saya lakukan adalah menulis kode, yang mungkin buggy sebagai sarang lebah, dan melakukannya di lingkungan berpasir yang bagus di mana saya bisa melihat efeknya, dan belajar tentang perilaku objek saat berinteraksi dengannya.
Dalam kasus lain, kadang-kadang hanya setelah saya mengetahui bagaimana suatu objek berperilaku, saya telah menemukan bahwa objek (yang dibundel dengan sistem operasi) adalah buggy, dan itu adalah masalah yang diketahui yang sengaja diputuskan oleh Microsoft tidak akan diperbaiki .
Dalam skenario seperti itu, apakah saya mengandalkan OpenBSD, yang dibuat oleh programmer ahli yang membuat rilis baru sesuai jadwal, secara teratur (dua kali setahun), dengan catatan keamanan terkenal "hanya dua lubang jarak jauh" dalam 10+ tahun? (Bahkan mereka memiliki patch errata untuk masalah yang kurang parah.) Tidak, tidak berarti. Saya tidak bergantung pada produk seperti itu dengan kualitas yang lebih tinggi, karena saya bekerja untuk bisnis yang mendukung bisnis yang memasok orang dengan mesin yang menggunakan Microsoft Windows, jadi itulah yang perlu dikerjakan oleh kode saya.
Kepraktisan / kegunaan mengharuskan saya bekerja pada platform yang bermanfaat bagi orang, dan itu adalah platform yang terkenal buruk untuk keamanan (meskipun perbaikan luar biasa telah dilakukan sejak awal milenium di mana produk perusahaan yang sama jauh lebih buruk) .
Ringkasan
Ada banyak alasan mengapa pemrograman komputer lebih rentan kesalahan, dan itu diterima oleh komunitas pengguna komputer. Bahkan, sebagian besar kode ditulis dalam lingkungan yang tidak akan mentolerir upaya bebas kesalahan. (Beberapa pengecualian, seperti mengembangkan protokol keamanan, mungkin menerima upaya sedikit lebih dalam hal ini.) Selain pemikiran umum tentang alasan bisnis tidak ingin menginvestasikan lebih banyak uang, dan kehilangan tenggat waktu buatan untuk membuat pelanggan bahagia, ada dampak dari pawai teknologi yang hanya menyatakan bahwa jika Anda menghabiskan terlalu banyak waktu, Anda akan bekerja pada platform yang usang karena banyak hal berubah secara signifikan dalam satu dekade.
Begitu saja, saya ingat betapa terkejutnya betapa singkatnya beberapa fungsi yang sangat berguna dan populer, ketika saya melihat beberapa kode sumber untuk strlen dan strcpy. Sebagai contoh, strlen mungkin sesuatu seperti "int strlen (char * x) {char y = x; while ( (y ++)); return (yx) -1;}"
Namun, program komputer pada umumnya jauh lebih panjang dari itu. Juga, banyak pemrograman modern akan menggunakan kode lain yang mungkin kurang diuji secara menyeluruh, atau bahkan diketahui buggy. Sistem saat ini jauh lebih rumit daripada apa yang dapat dengan mudah dipikirkan, kecuali dengan tangan melambaikan banyak hal kecil sebagai "perincian yang ditangani oleh tingkat yang lebih rendah".
Kompleksitas wajib ini, dan kepastian bekerja dengan sistem yang kompleks dan bahkan salah, membuat pemrograman komputer banyak perangkat keras untuk diverifikasi daripada banyak matematika di mana hal-hal cenderung mendidih ke tingkat yang jauh lebih sederhana.
Ketika Anda memecah hal-hal dalam matematika, Anda mendapatkan potongan-potongan individual yang anak-anak dapat mengerti. Kebanyakan orang mempercayai matematika; setidaknya aritmatika dasar (atau, setidaknya, penghitungan).
Ketika Anda benar-benar memecah pemrograman komputer untuk melihat apa yang terjadi di bawah tenda, Anda berakhir dengan implementasi yang rusak dari standar dan kode yang rusak yang pada akhirnya dieksekusi secara elektronik, dan bahwa implementasi fisik hanya satu langkah di bawah mikrokode yang kebanyakan ilmuwan komputer yang dilatih universitas tidak tidak berani menyentuh (jika mereka menyadarinya).
Saya sudah bicara dengan beberapa programmer yang masih kuliah atau lulusan baru yang langsung keberatan dengan anggapan bahwa kode bebas bug dapat ditulis. Mereka telah menghapus kemungkinan itu, dan meskipun mereka mengakui bahwa beberapa contoh yang mengesankan (yang saya dapat tunjukkan) adalah beberapa argumen yang meyakinkan, mereka menganggap sampel seperti itu sebagai cacing langka yang tidak representatif, dan masih menolak kemungkinan untuk dapat menghitung memiliki standar yang lebih tinggi. (Sikap yang jauh, jauh berbeda dari fondasi yang jauh lebih dapat dipercaya yang kita lihat dalam matematika.)