10 kebiasaan buruk pemrograman yang diam-diam kami sukai

Kita semua pernah melakukannya: mengambil kue ketika ibu tidak melihat, minum terlalu banyak anggur untuk makan malam, membiarkan mobil duduk di tempat parkir setelah meteran kedaluwarsa. Kami bahkan telah mengitari Deadman Curve terlalu cepat. Dan ya, kita semua telah melanggar sejumlah aturan utama pemrograman, yang disetujui semua orang adalah buruk. Dan kami diam-diam menyukainya.

Kami telah mempelajari aturan pemrograman yang baik, mengetik kode yang benar-benar buruk — dan kami telah hidup. Tidak ada petir dari dewa pemrograman. Desktop kami tidak meledak. Faktanya, kode kami terkompilasi dan dikirim, dan pelanggan tampak cukup senang.

Itu karena pemrograman yang buruk tidak sama dengan, katakanlah, menjilat pagar listrik atau menarik ekor harimau. Sebagian besar waktu, itu berhasil. Aturan lebih sering merupakan pedoman atau saran gaya, bukan arahan keras dan cepat yang harus ditaati atau kode kematian akan mengikuti. Tentu, kode Anda mungkin diejek, bahkan mungkin secara publik. Tetapi fakta bahwa Anda melanggar konvensi menambah sedikit sensasi untuk menumbangkan, bahkan secara tidak sengaja, apa yang berarti (lebih sering daripada tidak) nilai-nilai sosial dari kode yang menyenangkan.

Untuk membuat masalah menjadi lebih kompleks, terkadang lebih baik melanggar aturan. (Ssst!) Kode keluar lebih bersih. Bahkan mungkin lebih cepat dan sederhana. Aturan biasanya agak terlalu luas, dan programmer yang terampil dapat meningkatkan kode dengan melanggarnya. Jangan beri tahu atasan Anda, tetapi terkadang masuk akal untuk membuat kode dengan cara Anda sendiri.

Berikut ini adalah daftar sembilan aturan yang beberapa orang anggap tidak dapat disangkal, tetapi banyak dari kita sering melanggar, baik dengan kesuksesan maupun kesenangan.

Kebiasaan pemrograman yang buruk No. 1: Menyalin 

Itu salah melakukannya di sekolah. Di tempat kerja, aturannya tidak begitu jelas. Pasti ada beberapa blok kode yang tidak boleh dicuri. Jika berasal dari kode kepemilikan, jangan lipat ke dalam tumpukan Anda, terutama jika ditandai dengan pesan hak cipta. Tulis versi Anda sendiri. Itulah yang mereka bayar untuk Anda lakukan.

Pertanyaan yang lebih rumit muncul ketika pencipta asli ingin berbagi. Mungkin itu ada di salah satu forum pemrograman online itu. Mungkin itu kode sumber terbuka dengan lisensi (BSD, MIT) yang memungkinkan mengambil satu atau tiga fungsi. Tidak ada alasan hukum untuk menghentikan Anda. Dan Anda dibayar untuk memecahkan masalah, bukan menemukan kembali kemudi.

Seringkali, keuntungan menyalin sangat menarik dan kerugiannya dapat dibatasi dengan sedikit hati-hati. Kode yang Anda dapatkan dari sumber yang memiliki reputasi baik telah diterapkan setidaknya satu putaran. Penulis asli mencari solusi dan menemukan sesuatu. Loop invarian dan aliran data telah berhasil.

Pertanyaan rumitnya adalah apakah ada beberapa bug yang tidak ditemukan atau beberapa asumsi berbeda tentang peran atau data yang mendasarinya. Mungkin kode Anda bercampur dalam penunjuk nol sementara kode asli tidak pernah memeriksanya. Jika Anda dapat memperbaiki masalah, itu seperti atasan Anda mendapatkan masukan dari dua pemrogram. Ini berpasangan pemrograman tanpa meja mewah.

Kebiasaan pemrograman yang buruk No.2: Kode non-fungsional

Selama dekade terakhir ini, paradigma fungsional telah meningkat. Para pembantunya untuk membangun program Anda dari fungsi bersarang panggilan suka mengutip studi yang menunjukkan bagaimana kode lebih aman dan lebih bebas bug daripada gaya variabel dan loop yang lebih lama, semuanya dirangkai dengan cara apa pun yang membuat programmer senang. Para penyembah berbicara dengan semangat orang-orang yang benar-benar percaya, mengecam pendekatan non-fungsional dalam tinjauan kode dan permintaan tarik. Mereka bahkan mungkin benar tentang keuntungannya.

Tapi terkadang Anda hanya perlu mengeluarkan gulungan lakban. Kode yang direkayasa dengan luar biasa dan direncanakan dengan anggun membutuhkan waktu, tidak hanya untuk membayangkan tetapi juga untuk membangun dan kemudian menavigasi. Semua lapisan itu menambah kerumitan, dan kerumitan itu mahal. Pengembang kode fungsional yang bagus perlu merencanakan ke depan dan memastikan bahwa semua data diteruskan melalui jalur yang tepat. Terkadang lebih mudah untuk menjangkau dan mengubah variabel. Mungkin berikan komentar untuk menjelaskannya. Bahkan menambahkan permintaan maaf yang panjang dan merendahkan kepada generasi mendatang dalam komentar itu lebih cepat daripada merancang ulang seluruh sistem untuk melakukannya dengan cara yang benar.

Kebiasaan pemrograman yang buruk No. 3: Spasi non-standar

Sebagian besar ruang dalam perangkat lunak tidak berpengaruh pada kinerja program. Kecuali untuk beberapa bahasa seperti Python yang menggunakan spasi untuk menunjukkan blok kode, kebanyakan spasi memiliki efek nol pada bagaimana program berperilaku. Namun, ada programmer obsesif yang menganggapnya penting dan bersikeras bahwa mereka penting. Salah satu dari mereka pernah memberi tahu atasan saya dengan nada paling serius bahwa saya sedang menulis "Kode Non Standar" dan dia dapat langsung melihatnya. Dosa saya? Melanggar aturan ESLint space-infix-ops dengan gagal memberi spasi di kedua sisi tanda yang sama.

Terkadang Anda hanya perlu memikirkan sesuatu yang lebih dalam daripada penempatan ruang. Mungkin Anda khawatir tentang database yang kelebihan beban. Mungkin Anda khawatir tentang beberapa cara penunjuk nol dapat merusak kode Anda. Hampir semua bagian dari kode lebih penting daripada spasi, bahkan jika komite standar yang kaku dan suka memerintah telah mengisi halaman aturan tentang penempatan spasi atau tab ini.

Hal yang menakjubkan adalah ada beberapa alat bagus yang secara otomatis akan memformat ulang kode Anda untuk mematuhi aturan linting yang ditentukan dengan baik. Manusia tidak perlu menghabiskan waktu memikirkan hal ini. Jika sangat penting, mereka dapat menjalankannya melalui alat untuk membersihkan masalah.

Kebiasaan pemrograman yang buruk No. 4: Menggunakan goto

Larangan penggunaan gototanggal pada jaman sebelum banyak alat pemrograman terstruktur bahkan ada. Jika pemrogram ingin membuat loop atau melompat ke rutinitas lain, mereka perlu mengetik GOTOdiikuti dengan nomor baris. Setelah beberapa tahun, tim penyusun mengizinkan pemrogram menggunakan label string, bukan nomor baris. Itu dianggap fitur baru yang panas saat itu.

Beberapa menyebut hasil tersebut sebagai “kode spaghetti”. Tidak mungkin bagi siapa pun untuk membaca kode Anda nanti dan mengikuti jalur eksekusi. Itu adalah tumpukan benang, kusut selamanya. Edsger Dijkstra melarang perintah tersebut dengan manuskrip lucu berjudul "Pernyataan Goto Dianggap Berbahaya".

Tapi percabangan mutlak bukanlah masalahnya. Ini hasil yang kusut. Seringkali berseni breakatau returnakan menawarkan pernyataan yang sangat bersih tentang apa yang dilakukan kode di lokasi itu. Terkadang menambahkan gotoke pernyataan kasus akan menghasilkan sesuatu yang lebih sederhana untuk dipahami daripada daftar terstruktur yang lebih terstruktur dari blok if-then-else.

Ada contoh yang berlawanan. Lubang keamanan "goto fail" di tumpukan SSL Apple adalah salah satu contoh terbaik. Tetapi jika kita berhati-hati untuk menghindari beberapa masalah penting dari pernyataan kasus dan loop, kita dapat memasukkan lompatan absolut yang baik yang memudahkan pembaca untuk memahami apa yang sedang terjadi. Kita bisa memasukkan breakatau returnyang lebih bersih dan lebih menyenangkan untuk semua orang — kecuali mungkin para gotopembenci.

Kebiasaan pemrograman yang buruk No. 5: Tidak mendeklarasikan tipe

Orang-orang yang menyukai bahasa ketikan ada benarnya. Kami menulis kode yang lebih baik dan lebih bebas bug ketika kami menambahkan deklarasi yang jelas dari tipe data setiap variabel. Berhenti sejenak untuk mengeja tipe membantu compiler menandai kesalahan bodoh sebelum kode mulai dijalankan. Ini mungkin menyakitkan, tapi itu membantu. Ini adalah pendekatan sabuk-dan-suspender untuk pemrograman yang menghentikan bug.

Waktu telah berubah. Banyak dari kompiler baru cukup pintar untuk menyimpulkan tipe dengan melihat kodenya. Mereka dapat bekerja mundur dan maju melalui kode sampai mereka dapat yakin bahwa variabel tersebut harus a stringatau an intatau sesuatu yang lain. Dan jika tipe yang disimpulkan ini tidak berbaris, maka compiler dapat memunculkan tanda kesalahan. Mereka tidak membutuhkan kita untuk mengetik variabel lagi.

Ini berarti sekarang lebih mudah untuk menyimpan beberapa bit dengan meninggalkan beberapa deklarasi yang paling sederhana. Kode menjadi sedikit lebih bersih, dan pembaca biasanya cukup dapat menebak bahwa variabel yang dinamai idalam perulangan for adalah bilangan bulat.

Kebiasaan pemrograman yang buruk No. 6: Kode Yo-yo

Pemrogram suka menyebutnya "kode yo-yo". Pertama nilai disimpan sebagai string. Kemudian mereka diurai menjadi bilangan bulat. Kemudian mereka diubah kembali menjadi string. Ini sangat tidak efisien. Anda hampir bisa merasakan CPU berjuang di bawah semua beban tambahan. Pemrogram cerdas yang menulis kode cepat merancang arsitektur mereka untuk meminimalkan konversi. Kode mereka berjalan lebih cepat karena perencanaan mereka.

Tapi percaya atau tidak, terkadang itu masuk akal. Kadang-kadang Anda memiliki perpustakaan jagoan yang melakukan banyak hal cerdas di dalam kotak hitam miliknya. Kadang-kadang bos menulis cek tujuh angka untuk melisensikan semua orang jenius di dalam kotak hitam itu. Jika pustaka menginginkan data dalam string, Anda memberikannya ke pustaka dalam string meskipun Anda baru saja mengonversinya menjadi bilangan bulat.

Tentu, Anda dapat menulis ulang semua kode Anda untuk meminimalkan konversi, tetapi itu akan memakan waktu. Terkadang tidak masalah jika kode menjalankan menit, jam, hari, atau bahkan minggu tambahan karena menulis ulang kode akan membutuhkan lebih banyak waktu. Kadang-kadang menjalankan hutang teknis lebih murah daripada membangunnya dengan benar.

Terkadang pustaka bukanlah kode berpemilik, tetapi kode yang Anda buat sendiri sejak lama. Terkadang lebih cepat untuk mengonversi data sekali lagi daripada menulis ulang semua yang ada di pustaka itu. Jadi Anda ikut saja dan menulis kode yo-yo. Tidak apa-apa — kita semua pernah ke sana.

Kebiasaan pemrograman yang buruk No. 7: Menulis struktur data Anda sendiri

Salah satu aturan standar adalah bahwa seorang programmer tidak boleh menulis kode untuk menyimpan data setelah menyelesaikan kursus struktur data di tahun kedua mereka. Orang lain telah menulis semua struktur data yang kami perlukan, dan kode mereka telah diuji dan diuji ulang selama bertahun-tahun. Itu dibundel dengan bahasa dan mungkin gratis. Kode Anda hanya mungkin memiliki bug.

Namun terkadang pustaka struktur data agak lambat. Terkadang mereka memaksa kita ke dalam struktur yang mungkin standar tetapi salah untuk kode kita. Terkadang perpustakaan mendorong kami untuk mengonfigurasi ulang data kami sebelum kami menggunakan struktur. Terkadang perpustakaan menyertakan perlindungan ikat pinggang dan tali ikat dengan fitur seperti penguncian utas, dan kode kami tidak membutuhkannya.

Jika itu terjadi, saatnya menulis struktur data kita sendiri. Terkadang jauh lebih cepat. Dan terkadang itu membuat kode kita jauh lebih bersih karena kita tidak menyertakan semua kode tambahan untuk memformat ulang data dengan tepat.

Kebiasaan pemrograman yang buruk No. 8: Perulangan gaya lama

Dahulu kala, seseorang yang membuat bahasa C ingin merangkum semua kemungkinan abstrak dalam satu konstruksi sederhana. Ada beberapa hal yang harus dilakukan di awal, beberapa hal yang harus dilakukan setiap kali melalui loop, dan beberapa cara untuk mengetahui kapan semuanya selesai. Pada saat itu, tampaknya sintaks yang sangat bersih untuk menangkap kemungkinan yang tak terbatas.

Itu dulu. Sekarang beberapa teguran modern hanya melihat masalah. Ada terlalu banyak hal yang terjadi. Semua kemungkinan kebaikan itu juga sama mampu untuk kejahatan. Itu membuat membaca dan membaca lebih sulit. Mereka menyukai paradigma yang lebih fungsional di mana tidak ada loop, hanya fungsi yang diterapkan ke daftar, template komputasi yang dipetakan ke beberapa data.

Ada kalanya cara loopless lebih bersih, terutama ketika hanya ada satu fungsi dan array yang rapi. Tetapi ada kalanya loop kuno jauh lebih sederhana karena dapat melakukan lebih banyak lagi. Mencari kecocokan pertama, misalnya, lebih mudah bila Anda dapat menghentikannya segera setelah ditemukan.

Selain itu, fungsi pemetaan mendorong pengkodean yang lebih ceroboh ketika ada banyak hal yang harus dilakukan pada data. Bayangkan Anda ingin mengambil nilai absolut dan akar kuadrat dari setiap angka. Solusi tercepat adalah memetakan fungsi pertama dan kemudian yang kedua, mengulang data dua kali. 

Kebiasaan pemrograman yang buruk No. 9: Memutus loop di tengah

Di suatu tempat di sepanjang garis, grup pembuat aturan menyatakan bahwa setiap loop harus memiliki "invariant", yang berarti pernyataan logis yang benar di seluruh loop. Ketika invarian tidak lagi benar, loop berakhir. Ini adalah cara yang baik untuk memikirkan loop yang rumit, tetapi mengarah ke larangan gila — seperti melarang kita menggunakan a returnatau a breakdi tengah loop. Ini adalah bagian dari aturan yang melarang gotopernyataan.

Teori ini bagus, tetapi biasanya mengarah ke kode yang lebih kompleks. Pertimbangkan kasus sederhana ini yang memindai array untuk satu entri yang lulus tes:

ketika saya
   
    

   ...

   if (test (a [i]) lalu kembalikan a [i];

   ...

}

Pecinta loop invariant lebih suka kita menambahkan variabel boolean lain, menyebutnya notFound, dan menggunakannya seperti ini:

sementara ((notFound) && (i
   
    

...

if (test (a [i])) maka notFound = false;

...

}

Jika boolean ini dinamai dengan baik, itu adalah bagian kode dokumentasi mandiri yang bagus. Ini mungkin memudahkan semua orang untuk mengerti. Tapi itu juga menambah kerumitan. Dan itu berarti mengalokasikan variabel lokal lain dan menyumbat register yang mungkin atau mungkin tidak cukup pintar untuk diperbaiki oleh kompilator.

Terkadang a gotoatau lompatan lebih bersih.

Kebiasaan pemrograman yang buruk No. 10: Mendefinisikan ulang operator dan fungsi

Beberapa bahasa yang paling menyenangkan memungkinkan Anda melakukan hal-hal yang benar-benar licik seperti mendefinisikan kembali nilai elemen yang sepertinya harus konstan. Python, misalnya, memungkinkan Anda mengetik TRUE=FALSE, setidaknya dalam Versi 2.7 dan sebelumnya. Ini tidak menciptakan semacam logika runtuh dan akhir alam semesta; itu hanya menukar arti dari TRUEdan FALSE. Anda juga dapat memainkan game berbahaya seperti ini dengan praprosesor C dan beberapa bahasa lainnya. Masih bahasa lain memungkinkan Anda mendefinisikan ulang operator seperti tanda tambah.

Ini adalah peregangan, tetapi akan ada poin dalam blok kode yang besar ketika lebih cepat untuk mendefinisikan ulang satu atau lebih dari yang disebut konstanta ini. Terkadang bos menginginkan kode untuk melakukan sesuatu yang sama sekali berbeda. Tentu, Anda dapat mengerjakan kode dan mengubah setiap kejadian, atau Anda dapat mendefinisikan kembali kenyataan. Itu bisa membuat Anda terlihat seperti jenius. Alih-alih menulis ulang perpustakaan besar, Anda cukup membalik sedikit dan itu sebaliknya.

Mungkin bagus untuk menarik garis di sini. Anda tidak boleh mencobanya di rumah, tidak peduli seberapa pintar dan menyenangkannya itu. Ini terlalu berbahaya — sungguh ... jujur.