Saya telah memperhatikan banyak pertanyaan belakangan ini berkaitan dengan teknik abstraksi yang berbeda, dan jawaban yang pada dasarnya mengatakan bahwa teknik yang dimaksud "terlalu pintar." Saya akan berpikir bahwa bagian dari pekerjaan kita sebagai programmer adalah menentukan solusi terbaik untuk masalah yang kita berikan untuk dipecahkan, dan kepintaran sangat membantu dalam melakukan itu.
Adalah orang-orang yang berpikir teknik abstraksi tertentu terlalu pintar menentang kepandaian: Jadi pertanyaan saya adalah per se ada, atau beberapa alasan lain untuk keberatan?
EDIT: Combinator parser ini adalah contoh dari apa yang saya anggap kode pintar. Saya mengunduh ini dan memeriksanya sekitar setengah jam. Kemudian saya melangkah melalui ekspansi makro di atas kertas dan melihat cahaya. Sekarang setelah saya memahaminya, tampaknya jauh lebih elegan dari pada penggabung parser Haskell.
sumber
Jawaban:
Solusi sederhana lebih baik untuk pemeliharaan jangka panjang. Dan itu tidak selalu hanya tentang keakraban bahasa. Garis yang kompleks (atau garis) membutuhkan waktu untuk mencari tahu bahkan jika Anda seorang ahli dalam bahasa yang diberikan. Anda membuka file dan mulai membaca: "ok, sederhana, sederhana, mengerti, ya, WTF ?!" Otak Anda berhenti dan Anda sekarang harus berhenti dan menguraikan garis yang rumit. Kecuali ada alasan konkrit yang terukur untuk implementasi itu, itu "terlalu pintar".
Mencari tahu apa yang terjadi semakin sulit saat kompleksitas tumbuh dari metode pintar menjadi kelas pintar menjadi pola pintar. Selain dari pendekatan terkenal, Anda harus mencari tahu proses pemikiran yang masuk ke menciptakan solusi "pintar", yang bisa sangat sulit.
Yang mengatakan, saya benci menghindari pola (ketika penggunaannya dibenarkan) hanya karena seseorang mungkin tidak memahaminya. Terserah kita sebagai pengembang untuk terus belajar dan jika kita tidak memahami sesuatu, itu adalah alasan untuk mempelajarinya, bukan untuk menghindarinya.
sumber
if FuncX() then return true, else return false
, dan tidak akan pernah ingin Anda hanya menulisreturn FuncX()
. Saya tidak bercanda, saya benar-benar sudah bicara. Karena orang ingin tempat untuk menggantung breakpoints mereka, atau sesuatu. :-)Prinsip CIUMAN
Tetap sederhana, bodoh. Solusi cerdas sangat bagus, tetapi sering kali solusi langsung paling sederhana adalah yang terbaik.
Brian Kernighan
sumber
Orang bodoh mengabaikan kompleksitas; kaum pragmatis menderita; para ahli menghindarinya; para genius menghapusnya. - Alan Perlis
sumber
Solusi terbaik tidak selalu merupakan solusi yang paling pintar. Terkadang solusi sederhana sama baiknya.
Dalam Perangkat Lunak Anda selalu perlu berpikir dalam hal pemeliharaan. Jika sepotong kode terlalu pintar untuk seseorang yang akan memeliharanya, saya akan mengatakan bahwa kepintaran tidak sepadan.
sumber
Mengutip Brian Kernighan:
“Debugging dua kali lebih sulit daripada menulis kode di tempat pertama. Karena itu, jika Anda menulis kode sepintar mungkin, Anda, menurut definisi, tidak cukup pintar untuk men-debug itu. "
sumber
kepintaran adalah alat; dengan sendirinya itu tidak berbahaya. Itu hanya menjadi berbahaya dalam konteks di mana itu tidak perlu.
sumber
"Pintar", ketika diterapkan pada kode, hampir selalu hanya eufemisme untuk "rumit".
Membaca kode yang bagus, jelas, dan sederhana sudah cukup sulit. Membaca kode "pintar" seperti mempelajari puisi latin lagi.
Kebingungan muncul karena "pintar" sebagai atribut seseorang memiliki arti yang sama sekali berbeda. Kasus ini juga dapat dilihat sebagai contoh mengapa mendesain perangkat lunak untuk orang sungguhan itu sulit: Karena mereka ambigu.
Dan karena beberapa programmer menderita untuk memahami protokol sosial yang diikuti kebanyakan orang, yang melarang mereka untuk secara langsung mencela kode sebagai "rumit yang tidak perlu", mereka mungkin merasa sulit untuk membedakan antara dua makna kata pintar . Bertentangan dengan apa yang mungkin dipikirkan beberapa orang, saya pikir pada akhirnya "orang-orang" yang lebih baik (artinya: orang yang memiliki empati dan introspeksi serta kesabaran) menjadi pengembang yang lebih baik. Karena mereka tahu untuk siapa menulis.
sumber
Kebanyakan orang berfokus pada kepintaran dari aspek "Kode ini membutuhkan terlalu banyak penguraian untuk mencari tahu apa yang dilakukannya" dan semua hal buruk yang sejalan dengan itu seperti
Semua poin bagus, tapi ada aspek negatif lain dari kepintaran dan itu adalah masalah ego lama. Ini menyebabkan masalah di sepanjang baris
Kita semua kadang-kadang bersalah karena terlalu banyak ego, tetapi ketika hal itu menghalangi tim, itu menjadi masalah.
sumber
Good Clever - rasio tinggi antara baris kode yang pintar vs baris yang ada di dalam pilihan yang tidak pintar. 20 baris kode yang menyelamatkan Anda dari penulisan 20000 adalah Extremely Good Clever. Good Clever adalah tentang menyelamatkan diri Anda dari pekerjaan.
Bad Clever - rasio rendah antara baris kode tertulis ditulis vs baris kode disimpan. Satu baris kode pintar yang menyelamatkan Anda dari penulisan lima baris kode adalah Bad Clever. Pintar pintar adalah tentang "masturbasi sintaksis".
Sebagai catatan: Bad Clever hampir tidak pernah disebut "Bad Clever"; sering bepergian dengan alias "cantik", "anggun", "ringkas", atau "singkat".
sumber
Saya harus bertanya-tanya tentang definisi pintar setiap orang.
Secara pribadi, saya merasa seperti saya pintar ketika mengambil masalah yang sulit dan rumit, dan mengimplementasikannya dengan cara yang sangat sederhana dan lurus ke depan, sambil mempertahankan tingkat efisiensi yang dapat diterima.
tl; dr saya merasa pintar ketika, selama ulasan kode, pengulas saya mengatakan "wow, itu lebih mudah daripada yang saya pikir akan menjadi", sebagai lawan dari "wtf semua ini .."
sumber
Selain dari jawaban teori yang terdaftar, sering kali ini digunakan dalam konteks terlalu pintar untuk orang lain.
Bergerak antara tim intensif kinerja tingkat atas dan tim pemeliharaan tingkat menengah kadang-kadang untuk melihat perbedaan kehidupan nyata dalam apa yang "terlalu pintar".
Mengesampingkan argumen teori, terlalu pintar seringkali didasarkan pada apa yang dapat dilakukan oleh anggota tim yang paling tidak terampil, sehingga sangat relatif terhadap lingkungan.
sumber
Terkadang saya sangat pintar sehingga saya salah.
sumber
Performan, perawatan, tepat waktu, dan murah adalah cara saya mengukur solusi. Saya kira pintar juga bisa menjadi bagian dari solusi selama tidak berdampak negatif pada kualitas tersebut.
sumber
Jika kode pintar + jumlah komentar yang diperlukan untuk membuatnya dimengerti kode <= kode sederhana, maka saya katakan pergi untuk kode pintar. Setiap saat.
Saya pikir masalah muncul ketika orang yang menulis "kode pintar" sengaja gagal mengomentari dengan benar, karena hanya dengan itu pada awalnya tidak dapat dipahami generasi masa depan yang menemukan itu harus menghabiskan waktu "menghargai" seberapa pintar itu.
sumber
Saya teringat akan sebuah kutipan yang saya lihat dikaitkan dengan banyak orang yang berbeda, seperti kutipan yang baik sering.
Mengutip:
Mengambil ide yang kompleks dan menyederhanakannya sehingga bisa dimengerti menunjukkan kepintaran konstruktor tetapi mengambil ide sederhana dan membuatnya kompleks menunjukkan konstruktor ingin dilihat sebagai pintar.
sumber
Jika solusi 'pintar' sulit untuk dipecahkan, maka itu tidak boleh digunakan. Misalnya, jika melalui efek samping Anda dapat mengontrak perhitungan yang rumit untuk satu baris, itu pintar. Tetapi jika dibutuhkan satu jam bagi orang lain untuk mencari tahu apa yang Anda lakukan di dunia, itu terlalu pintar.
sumber
Menurut pendapat saya, kepintaran bukan masalah. Biasanya kita dapat membuat kebingungan tentang kode "pintar" (tanpa sarkasme) dan "wawasan". Apa yang saya lihat sebagai masalah, adalah kenyataan bahwa biasanya kode "pintar" (dengan sarkasme) berisi persyaratan tidak terlihat yang tersirat, membuatnya lebih sulit untuk di-debug dan dipertahankan sepanjang waktu.
Ada beberapa algoritma yang dikenal pintar. Quicksort adalah satu, IMO.
Kode "Pintar" (dengan sarkasme) biasanya membuat asumsi tentang variabel yang ditetapkan dan keadaan sistem yang hampir terputus dari kode "pintar" (seperti file yang dibuka sebelumnya, koneksi jaringan, database, dll ...).
Jumlah data yang harus Anda muat di otak Anda untuk mempertahankan kode "pintar" dengan benar biasanya besar untuk memiliki rasio biaya-manfaat yang baik.
sumber
"Kode pintar" adalah kode apa pun yang harus dipikirkan oleh programmer dengan sangat keras atau menggunakan keterampilan tingkat lanjut untuk menulisnya. Masalah dengan itu mengabaikan perlunya "kepintaran margin" tertentu, paling baik diungkapkan oleh Brian W. Kernighan:
"Debugging adalah dua kali lebih keras daripada menulis kode di tempat pertama. Karena itu, jika kamu menulis kode secerdas mungkin, kamu, menurut definisi, tidak cukup pintar untuk debug itu."
sumber
Karena apa yang tampak seperti kepintaran untuk pengembang dalam ledakan kreativitas hanya dapat lulus sebagai kekacauan dan hanya menjadi terbaca , unmaintainable blok teka-teki jelas bagi orang lain.
Tetap saja, blok teka-teki yang bagus, pintar, berkinerja baik, tetapi jika Anda memiliki pengalaman, Anda akan sering menyadari bahwa itu akan merugikan bisnis Anda (bukan Anda, pengembang) lebih banyak untuk mempertahankan hal itu pada medium- atau jangka panjang. Jadi, Anda lebih suka menenangkan semangat sesama pengembang saat mereka dibawa.
Kecuali, tentu saja, jika ada alasan untuk kepintarannya. Dan jika ada dokumentasi yang bagus yang disertai dengan hal-hal membingungkan yang baru saja Anda tulis. Anda memang berkomentar sepotong kode pintar, kan? Jelaskan niatnya, mengapa harus seperti, dan bagaimana perilakunya?
Jika tidak ada justifikasi, maka itu mungkin hanya masalah optimasi prematur, rekayasa berlebihan, atau masalah YAGNI. Jika dibutuhkan 15 level tipuan untuk melakukan sesuatu yang sederhana, maka ada kemungkinan Anda juga termasuk dalam kategori sebelumnya. Dan jika itu tidak didokumentasikan, maka itu hanya masalah.
Kode hebat seharusnya tidak mengharuskan pengelola berada di 100% sepanjang waktu untuk memahaminya. Kode yang baik itu pintar. Kode yang bagus bisa hampir sama efisien, tetapi lebih baik di banyak aspek lainnya. Kode yang hebat seharusnya tidak memerlukan IDE dengan 15 tampilan untuk mengikuti desain aplikasi Anda.
Catatan: hei, saya sudah menulis beberapa hal yang saya pikir pintar tapi itu menarik perhatian WTF? dari - jika bukan co-developer saya - mulut manajer saya. Harus melihatnya dari sudut pandang mereka.
sumber
Saya cenderung pintar , tetapi saya berusaha untuk menjadi elegan .
Kembangkan kode sekarang sehingga orang lain tidak akan mencoba dan menghindari nanti .
sumber
Ini adalah pemahaman saya tentang masalah ini, berdasarkan pengalaman saya dan jawaban lainnya:
sumber
Saya kenal seorang pria; dia mungkin orang paling cerdas yang pernah saya temui. Dia pastinya adalah seorang pembuat kode yang tidak bisa dipercaya, mungkin lebih baik daripada yang pernah saya alami seumur hidup dalam hal pemrograman pemrograman. Dia menulis kode seperti sedang mengetik dokumen kata dan dapat membalik daftar yang tertaut seperti yang tidak akan Anda percayai. Jika Anda ingin berbicara tentang menulis beberapa kode rumit yang serius, dia laki-laki Anda dan jika saya mengalami masalah yang sangat sulit, saya selalu menoleh kepadanya. Namun, mengerjakan proyek bersamanya dalam pengaturan tim sangat menyiksa. Dia tidak dapat langsung menargetkan masalah bisnis dan memberikan solusi yang logis, efisien, dan ringkas untuk itu. Baginya, daftar kode 1000 baris akan lebih baik daripada 100. Alih-alih menggunakan alat yang diberikan kepadanya melalui IDE atau kerangka kerja, ia akan menggulung alat super-optimalnya sendiri.
Sementara saya mengagumi kemampuannya untuk melakukan hal-hal rumit ini, yang saya butuhkan adalah seseorang yang dapat menyelesaikan masalah dan melanjutkan. Tidak bagus untuk mengatakan, atau mengakui, tetapi kadang-kadang dalam sebuah bisnis, waktu adalah segalanya dan Anda harus menyelesaikan masalah dan melanjutkan hidup Anda, Anda selalu dapat kembali lagi nanti dan menolaknya untuk memperbaiki kode Anda. Ada garis tipis antara menjadi pintar dan juga menjadi sakit di pantat. Moto saya untuk tim saya selalu, apa hal paling sederhana yang akan berhasil dalam situasi ini dan kemudian pergi dari sana. Kadang-kadang sederhana tidak selalu jawabannya tetapi tempat yang bagus untuk memulai.
sumber
"Pintar" dalam konteks ini berarti "terlalu pintar untuk kebaikannya sendiri", yaitu sesuatu yang berfungsi sekarang tetapi akan menjadi mimpi buruk untuk dipahami dan diubah di kemudian hari.
Terutama jika itu adalah trik yang mengeksploitasi fitur yang tidak jelas dari bahasa pemrograman, atau memanfaatkan efek samping yang aneh, atau merupakan cara yang sangat aneh untuk memecahkan masalah dalam bahasa target.
sumber
Saya lebih suka solusi sederhana, saya sangat suka cara ruby. Ketika Anda ingin, misalnya, menjumlahkan 2 elemen pertama dalam daftar. pertama Anda memotong daftar untuk membuatnya memiliki ukuran = 2 dan kemudian Anda menjumlahkannya.
Saya ingat bahwa setelah saya menggunakan 1 daftar, bukan 3 dan membuat satu fungsi besar yang sangat sulit untuk dipertahankan / diubah.
di dunia todays kita tidak harus mengorbankan kejelasan kode untuk kinerja (kecuali c ++, mereka tidak harus melakukannya, tetapi mereka akan melakukannya).
sumber
Biasanya ketika Anda harus 'pintar' untuk menyelesaikan masalah dalam kode. Jika solusi dan tidak terlalu mudah maka Anda akan mendapatkan banyak wajah bingung atau efek samping aneh ketika mengasumsikan kondisi tertentu (yang mungkin 100% benar pada saat menulis kode)
Jadi pintar == membingungkan == buruk :( Tapi itu juga luar biasa karena saya menggunakan mereka untuk solusi praktis untuk masalah terbatas.
sumber
Mengutip kembali untuk konteks dan dan pemahaman yang lebih mudah:
Apa yang ditulis Brian Kernighan di sini jelas merujuk pada konvolusi, dan dia keliru menggunakan kata pintar.
Lilitan:
Pintar:
Programmer yang berpendidikan tahu bahwa kode sederhana itu cerdik. Kode yang sepintar mungkin harus sederhana menurut definisi. Programmer yang berpendidikan juga akan menghindari bekerja dengan dan menulis kode berbelit-belit seperti wabah. Mereka juga akan mengubah kode berbelit-belit menjadi kode pintar setiap kali mereka memiliki kesempatan. Kode biasanya mulai berbelit-belit dan mendekati kepintaran sebagai pengetahuan tentang domain dan pemahaman kemampuan kognitif manusia dalam pemrograman lebih baik dipahami melalui pengalaman dan berbagi pengetahuan.
Karena popularitas kutipan ini dan Brian Kernighan menjadi cukup populer di industri penyalahgunaan kata ini memiliki dampak sosial yang negatif dan saya jujur ingin melihat yang ditangani oleh pria itu sendiri. Sebelum menulis artikel ini saya mencoba untuk melihat apakah saya dapat mengirim email kepadanya, tetapi, saya tidak dapat menemukan informasi kontak email yang saya mengerti :(.
Dampak sosial negatif yang saya lihat adalah programmer lain mengucilkan rekan-rekan mereka yang lebih pintar, karena mereka sekarang melihat kepintaran sebagai masalah. Masalah sebenarnya adalah teman sebaya bodoh yang berpikir bahwa mereka pintar dengan melakukan hal-hal dengan cara baru yang tidak otomatis, dan terus-menerus menciptakan hal-hal baru ketika tidak ada keuntungan daripada mendapatkan dan memahami komunitas yang lebih besar dan menggunakan kembali ide-ide pintar sebanyak mungkin.
Saya perlu mengklarifikasi meskipun yang sering mendapatkan pemahaman lebih sulit daripada menciptakan Anda sendiri. Karena masalah umum dalam industri untuk tenggat waktu yang tidak realistis, menciptakan tenggat waktu Anda sendiri untuk masalah ceruk yang lebih kecil akan digunakan untuk menghemat waktu. Ini didasarkan pada pengamatan bahwa hal-hal yang berguna dan dapat digunakan kembali biasanya menargetkan ceruk yang lebih besar, atau memberikan abstraksi yang berguna untuk penemuan. Hal ini juga didasarkan pada kenyataan bahwa orang-orang menargetkan ceruk besar untuk menghasilkan lebih banyak uang, ketika seringkali ini membuat alat ini sangat sulit digunakan karena kerumitan yang terlibat dalam membuat sesuatu yang dapat digunakan untuk area aplikasi yang luas.
Dampak sosial negatif lainnya adalah ini mencegah kemajuan dan keinginan untuk memahami karena dalam dunia egosentris kita, kita akan segera menyangkal kurangnya pemahaman kita sendiri dan menghapus kode sebagai berbelit-belit meskipun, setelah dipahami, idenya sebenarnya cukup pintar.
TODO Saya ingin mengutip beberapa referensi tetapi saya juga ingin kurangnya referensi untuk tidak menghalangi kemampuan saya untuk berbagi informasi sehingga saya akan dengan cepat mengutip apa yang saya ingat sebagai sumber informasi saya dan mungkin saya akan menemukan info aktual beberapa hari (atau Anda dapat menemukannya untuk saya! :)
Jangan ragu untuk menambahkan kutipan Anda sendiri! Juga, jangan ragu untuk menambahkan koma ke teks saya. Saya belum menyegarkan pengetahuan saya tentang penggunaan koma dalam bahasa Inggris dalam beberapa waktu ...
sumber
Karena seringkali orang tidak tahu bahasa, idiom, dan pola. Mereka bisa mengambil buku dan mempelajarinya, tetapi mereka tidak. Dan karena orang-orang itu Anda harus menulis kode sederhana.
Itu bukan kepintaran. Itu pengetahuan.
sumber
Aku tidak bisa menemukan kata disiplin disebutkan di mana saja di sekitar sini, jadi saya akan chip. Saya tidak ingin memposting yang jawaban, tetapi untuk berbagi wawasan yang berbeda tentang masalah ini, mungkin salah satu yang pertanyaan awal tidak ada dalam pikiran .
Pengembang yang cerdas adalah hal yang baik.
Namun, sebelum kepintaran muncul sifat-sifat lain. Seperti yang mungkin Anda sadari, saya akan berbicara tentang disiplin . Pengembang yang cerdas dan tidak disiplin bisa sangat buruk untuk pemeliharaan sistem jangka panjang.
Misalkan ada bug atau persyaratan baru masuk. Pengembang yang cerdik mungkin segera menyadari bahwa beberapa perbaikan lokal akan menyelesaikan pekerjaan dalam 2 menit. Jika pengembang itu didisiplinkan, ia akan menahan diri untuk tidak menerapkan perbaikan tersebut ke kode sumber dan, sebaliknya, akan menemukan cara yang berarti untuk menyusun perilaku yang diinginkan ke sistem. Dengan cara ini, pada saat diperlukan untuk memodifikasi potongan kode tertentu pengelola akan memiliki waktu yang mudah untuk memahami kode dan menerapkan perubahan baru tanpa merusak apa pun. Jika tidak, Anda bisa mendapatkan gambarnya.
sumber