Hukum abstraksi bocor



Teks yang menetapkan "hukum abstraksi bocor" ditulis pada tahun 2002. Mengapa saya menerjemahkannya hampir 20 tahun kemudian? Itu masih belum kehilangan relevansinya dan layak dibaca. TCP belum menerima alternatif yang lebih baik, dan hukum abstraksi bocor hanya mengakar dalam kehidupan pengembang dan dalam bahaya menjadi aksioma. Saya akan menambahkan bahwa saya belum menghitung semua kerangka waktu yang ditunjukkan dalam teks, jadi pertimbangkan beberapa "pergeseran waktu".



Ini adalah elemen kunci dari keajaiban teknik internet yang kami andalkan setiap hari. Keajaiban ini ada di TCP, salah satu blok bangunan dasar Internet.



Menggunakan TCP adalah cara untuk mentransfer data dengan andal . Untuk memperjelas, menggunakan TCP saat mengirim pesan melalui jaringan memastikan bahwa pesan itu sampai dalam bentuk aslinya.



Kami menggunakan protokol ini untuk berbagai tugas, seperti memuat halaman web dan mengirim email. Karena keandalan TCP email tiba saat dikirim. Bahkan jika itu adalah spam yang tidak berguna.



Sebagai perbandingan, ada hal lain yang tidak bisa diandalkan, protokol transfer data yang disebut IP. Tidak ada yang memberi jaminan bahwa data akan terkirim. Jika Anda mengirim pesan secara berurutan menggunakan IP, maka jangan heran jika separuh pesan tidak akan terkirim, dan separuh lainnya akan datang dalam urutan acak. Selain itu, ada kemungkinan beberapa pesan akan berubah menjadi gambar monyet kecil atau, kemungkinan besar, pesan akan menjadi sampah yang tidak terbaca.



Di sinilah keajaiban sebenarnya terjadi: TCP berbasis IP. Dengan kata lain, TCP diperlukan untuk mengirimkan data dengan andal hanya menggunakan alat yang tidak dapat diandalkan .



Untuk memperjelas mengapa ini ajaib, pertimbangkan skenario kehidupan yang realistis, meskipun agak konyol.



Bayangkan kita berada dalam bisnis pengiriman aktor dari Broadway ke Hollywood, dan tanggung jawab kita termasuk mengangkut aktor ke seluruh negeri. Beberapa mobil bertabrakan dan para aktornya mati. Seorang aktor mungkin mabuk sepanjang perjalanan dan memiliki potongan rambut atau memiliki tato di hidungnya, itulah sebabnya dia tidak akan diterima lagi di Hollywood. Dan yang paling penting: kami mengirim para aktor dalam urutan yang ditentukan secara ketat, dan mereka tiba dalam urutan acak, karena masing-masing dari mereka melakukan perjalanan dengan rutenya sendiri.



Sekarang bayangkan layanan Hollywood Express yang menjamin: (a) pengiriman; (b) dalam urutan yang benar; (c) dalam kondisi sempurna. Mukjizatnya adalah bahwa Hollywood Express tidak memiliki cara lain untuk mentransfer aktor, kecuali yang tidak dapat diandalkan - dengan mobil. Hollywood Express memeriksa setiap aktor yang datang, dan jika kondisinya tidak memuaskan, pihak layanan menelepon ke tanah air aktor tersebut dan meminta untuk mengirim saudara kembar identik. Jika para aktor tiba dalam urutan acak, Hollywood Express akan memulihkan urutan aslinya. Bahkan jika sebuah kapal alien besar yang sedang menuju Area 51 jatuh dan melumpuhkan jalan tol di Nevada, para aktor hanya akan mengubah rute dan melakukan perjalanan melalui Arizona, dan Hollywood Express tidak akan memberi tahu produser di California tentang insiden tersebut. Untuk produser, semuanya akan terlihat seperti iniseolah-olah para aktor mengemudi lebih lama dari biasanya dan tidak ada kecelakaan UFO.



TCP bekerja dengan cara yang hampir sama. Inilah yang oleh para ahli dalam Ilmu Komputer disebut abstraksi - penyederhanaan dari sesuatu yang jauh lebih rumit yang terjadi di bawah tenda. Sebagian besar pemrograman adalah tentang membangun abstraksi. Apa itu perpustakaan string? Ini adalah cara untuk membuat bekerja dengan string semudah dan senyaman bekerja dengan angka. Apa itu sistem file? Ini adalah cara untuk menganggap hard drive bukan sebagai seperangkat piringan magnetik berputar yang menyimpan bit di lokasi tertentu, tetapi sebagai struktur hierarki direktori dengan file yang berisi data.



Tapi kembali ke TCP. Saya telah membumbui sedikit agar lebih mudah memahami cara kerja TCP. Dan saya menyadari bahwa penyederhanaan seperti itu dapat membawa beberapa orang ke masalah kesehatan. Saya mengatakan bahwa TCP menjamin pengiriman pesan. Tidak. Jika hewan peliharaan Anda menggerogoti kabel jaringan komputer Anda, paket IP akan berhenti mencapainya. Terlepas dari upaya TCP, pesan tidak akan terkirim. Jika Anda tidak sopan dengan administrator sistem di perusahaan Anda dan memutuskan untuk menghukum Anda dengan menghubungkan ke hub yang kelebihan beban, maka hanya sebagian dari paket IP Anda yang akan mencapai, dalam hal ini TCP akan bekerja, tetapi sangat lambat.



Inilah yang saya sebut abstraksi bocor.... TCP mencoba untuk mengabstraksi kita dari jaringan yang tidak dapat dipercaya, tetapi terkadang jaringan masih "mengalir" melalui abstraksi dan Anda menemukan hal-hal yang tidak dapat menyelamatkan Anda dari abstraksi. Ini hanyalah satu contoh dari apa yang saya sebut Hukum Abstraksi Leaky:

Abstraksi non-sepele apa pun agak bocor.
Abstraksi rusak. Terkadang sedikit, terkadang banyak. Ini disebut lubang, kebocoran. Sesuatu tidak berjalan sesuai rencana. Ini terjadi di semua tempat di mana abstraksi digunakan. Berikut beberapa contohnya:



  • : . « », — . , . , , , , .
  • SQL , . , , , . SQL- , . , «where a=b and b=c and a=c» , «where a=b and b=c» . , , . , . , , .
  • NFS SMB , . , . « , ”. . ( ), .forward ( ), .forward . , .
  • , ++ . , , , . ++ +, s + “bar” . ? , , , “foo” + “bar”, ++ char*. , . (, ++ . — .)
  • , , , , , . . , , . .


Mengikuti hukum abstraksi bocor bahwa abstraksi tidak menyederhanakan hidup kita sebanyak yang kita inginkan. Ketika saya mengajar C ++, saya ingin menghindari pembicaraan tentang tipe data * char dan aritmatika pointer. Akan sangat bagus untuk berbicara tentang STL segera, tetapi suatu hari siswa akan menulis "foo" + "bar" dan menjadi takut, dan saya harus memberi tahu Anda tentang char *. Atau suatu hari mereka mencoba memanggil fungsi Windows API dengan argumen OUT LPTSTR, dan mereka masih harus belajar tentang char *, pointer, unicode dan wchar_t, serta TCHAR dan segala sesuatu yang bocor melalui abstraksi.



Saat memprogram dengan COM (Component Object Model - kira-kira Transl.), Alangkah baiknya untuk langsung mempelajari pembantu Visual Studio dan semua keajaiban pembuatan kode. Tetapi jika setidaknya terjadi kesalahan, programmer tidak akan tahu sedikit pun apa yang terjadi, di mana mencari kesalahan tersebut dan bagaimana cara memperbaikinya. Dan saya harus berbicara tentang IUnknown, CLSID dan ProgIDS dan ... Oh, kemanusiaan!



Saat mengajar ASP.NET, akan sangat bagus untuk melatih klik dua kali pada objek dan menulis kode yang akan dieksekusi di server saat pengguna mengklik objek. Pada intinya, ASP.NET menghilangkan perbedaan antara penanganan klik pada hyperlink (yang a) dan menangani klik tombol. Tapi inilah masalahnya: di HTML, Anda tidak dapat mengirimkan formulir dengan mengklik hyperlink dan pengembang ASP.NET harus menyembunyikan masalah ini. Mereka memecahkan masalah dengan membuat beberapa baris kode JavaScript di penangan hyperlink onclick. Tapi tetap saja, ini adalah lubang dalam abstraksi. Jika JavaScript dinonaktifkan untuk pengguna akhir, ASP.NET tidak akan berfungsi dengan benar, dan pemrogram aplikasi tanpa menyadari apa yang abstrak ASP.NET tidak akan dapat memahami apa yang terjadi.



The Law of Leaky Abstractions mengatakan bahwa ketika seseorang menghasilkan potongan baru dari pembuatan kode yang seharusnya secara dramatis meningkatkan efisiensi kita, Anda akan mendengar, "pertama-tama pelajari cara melakukannya sendiri dan baru kemudian gunakan alat ini untuk menghemat waktu." Alat pembuat kode menggunakan abstraksi dengan satu atau lain cara, yang, tentu saja, penuh dengan lubang. Dan satu-satunya cara untuk mengatasi semua lubang adalah dengan mengetahui bagaimana abstraksi diterapkan dan apa sebenarnya yang mereka sembunyikan. Jadi abstraksi menghemat waktu kita dalam bekerja, tetapi tidak menghemat waktu untuk belajar.



Ini paradoks, tetapi setiap kali kita menemukan alat tingkat yang lebih tinggi dengan abstraksi yang lebih baik, menjadi lebih sulit untuk menjadi programmer profesional.



Selama magang pertama saya di Microsoft, saya mengembangkan perpustakaan untuk bekerja dengan string di Macintosh. Berikut adalah contoh pekerjaan biasa: tulis versi strcat yang mengembalikan pointer ke akhir baris baru. Hanya beberapa baris kode C. Semua yang saya lakukan adalah langsung dari K&R, satu buku tipis tentang bahasa pemrograman C,



dan kemudian saya mendapatkan pekerjaan di CityDesk (perusahaan tutup pada 2016 - kira-kira. Terjemahan ). Sekarang saya perlu tahu Visual Basic, COM, ATL, C ++, InnoSetup, internal Internet Explorer, regular expression, DOM, HTML, CSS, dan XML. Ini semua adalah instrumen tingkat tinggi dibandingkan dengan hal-hal K&R, namun saya masih perlu mengetahui semua hal K&R.



Sepuluh tahun yang lalu, kita dapat membayangkan bahwa paradigma pemrograman baru akan memudahkan kita untuk mengembangkannya sekarang. Faktanya, abstraksi yang telah kami buat selama beberapa dekade memungkinkan kami dengan mudah menyesuaikan diri dengan tingkat kerumitan baru yang tidak pernah kami tinggalkan 10-15 tahun yang lalu, seperti dalam kasus pengembangan atau jaringan GUI. Dan sekarang kami memiliki banyak alat hebat, seperti bahasa berorientasi bentuk berorientasi objek, yang memungkinkan kami menyelesaikan pekerjaan dengan sangat cepat. Hingga suatu saat kita dihadapkan pada masalah dimana abstraksinya “bocor”, dan kita membutuhkan waktu dua minggu untuk menyelesaikannya. Ketika Anda perlu menyewa programmer Visual Basic untuk melakukan hanya kode VB, ini bukan ide terbaik. Karena programmer seperti itu akan terjebak setiap kali dia menemukan lubang dalam abstraksi Visual Basic.



Hukum abstraksi bocor menarik kita ke bawah.



All Articles