Perfeksionisme mungkin baik dan buruk saat pemrograman.
- Kapan dan di mana Anda menggambar garis saat Anda sedang memecahkan masalah?
- Kapan Anda memutuskan kapan solusinya berlebihan, terlalu umum atau terlalu futuristik?
Berikan komentar jika pertanyaannya tidak jelas.
methodology
time-management
problem-solving
decisions
Amir Rezaei
sumber
sumber
Jawaban:
KISS dan YAGNI , terutama YAGNI.
Hanya merekayasa solusi untuk hal-hal yang Anda tahu akan segera Anda butuhkan. Jangan merekayasa hal-hal yang mungkin diperlukan dalam dua tahun, karena kemungkinan besar Anda akan membutuhkan hal-hal yang sangat berbeda dan akan tetap harus merekayasa ulang hal itu.
Saat Anda mulai berbicara tentang "dengan desain ini di beberapa titik di masa depan kita bisa melakukan X, atau bahkan Y", alih-alih "desain ini memungkinkan kita untuk melakukan kebutuhan pelanggan Z dalam rilis berikutnya", saat itulah Anda mendapatkan dalam astronomi arsitektur.
Menanggapi komentar:
sumber
YAGNI
sampai hari ini.Gunakan pendekatan berulang dan masalah ini sebagian besar hilang. Kode Anda harus dijalankan pada hari pertama dan hampir setiap hari setelah itu. Memenuhi persyaratan minimal terlebih dahulu dan tambahkan lebih banyak karena Anda punya waktu. Jangan pernah menyimpang dari perubahan besar di mana Anda tidak dapat menjalankan kode Anda untuk waktu yang lama.
sumber
Suatu solusi berlebihan ketika waktu tambahan yang dibutuhkan untuk menyelesaikannya bernilai lebih dari dampak negatif potensial dari ketika solusi yang lebih mudah selesai sampai pada saat itu akan secara alami ditingkatkan / diamandemen.
Pada dasarnya Anda memperdagangkan waktu sekarang dengan waktu kemudian. Jika Anda menghabiskan lebih banyak waktu sekarang maka Anda akan menghemat nanti, Anda salah melakukannya. Jika Anda benar-benar over engineering, Anda menghabiskan waktu sekarang yang tidak mempengaruhi berapa banyak waktu (atau bahkan membuatnya lebih) yang Anda habiskan nanti.
Anda menjadi lebih baik dalam mengerjakan ini dengan lebih banyak pengalaman yang Anda miliki. Cara terbaik untuk melakukan hal-hal (dari pengalaman saya) adalah melakukan apa yang Anda butuhkan sekarang, tetapi dengan cara yang paling mudah ditambah jika nanti persyaratan menuntutnya. Mengetahui cara melakukannya adalah bagian yang sulit.
sumber
Saya dulu sangat perfeksionis (menghabiskan waktu membuat kerangka kerja, bukan solusi).
Tetapi hal yang benar-benar membantu saya mempercepat produksi saya adalah belajar dan mengikuti prinsip-prinsip BDD / TDD, termasuk prinsip luar (yang menurut saya sangat sulit untuk dipelajari).
Ini benar-benar mengajari saya untuk tidak menulis satu baris kode sebelum ada tes untuk itu. Tetapi tes unit tidak ada sebelum tes penerimaan ada untuk itu. Dan tes penerimaan berasal dari kebutuhan pengguna nyata.
Jadi karena itu, semua baris kode berasal dari kebutuhan pengguna yang sebenarnya.
Jika Anda tidak terbiasa dengan prinsip luar, itu menentukan bahwa Anda mulai menulis tes untuk lapisan terluar dalam aplikasi Anda (yaitu GUI dalam hampir semua kasus) menggunakan uji ganda untuk mensimulasikan perilaku lapisan bawah. Kemudian Anda menerapkan cukup untuk lulus tes. Implementasi lapisan atas ini kemudian menentukan tes yang perlu Anda tulis untuk lapisan berikutnya, dll, hingga Anda menekan lapisan bawah aplikasi Anda.
sumber
Saya perhatikan saya menjadi lebih baik dalam hal ini dengan pengalaman.
Ketika saya masih sangat muda, saya selalu mencari solusi yang paling sempurna, tanpa kompromi. Sekarang saya lebih baik dalam menjaga hal-hal seperti anggaran dan waktu dalam pikiran.
sumber
Batas waktu menarik garis ini cukup jelas.
sumber
Bos saya sebenarnya :)
Saya harus mengakui bahwa saya menjadi lebih baik, tetapi saya masih belum banyak kompromi. Untungnya saya punya bos saya untuk mengendalikan saya;)
Saya ingin mengangkat masalah lain daripada overengineering, karena overengineering cukup mudah dideteksi.
Masalah utama saya adalah dengan refactoring. Masalahnya adalah bahwa sebagian besar waktu, meskipun saya mencoba untuk menulis kode sebaik yang saya bisa, saya tidak tahu saat itu apa yang saya tahu sekarang (melihat lebih banyak kode, lebih banyak pola, idiom baru, masalah baru, baru solusi). Jadi, meskipun berfungsi, saya sekarang tahu cara yang lebih baik untuk melakukannya:
Namun, itu berfungsi sebagaimana mestinya, dan karenanya refactoring itu bukan prioritas, dan kebenarannya adalah itu mengganggu saya; Saya mengerti alasan ekonomi, dan saya mengerti harapan klien (mereka tidak melihat kode dan lebih suka fitur baru dan perbaikan bug), tapi saya berharap masih punya waktu untuk mengerjakannya.
Untuk saat ini, saya hanya mengikuti perintah bos saya, tetapi saya harus mengakui bahwa saya merasa tidak nyaman mengetahui bahwa kode yang dikirimkan ke produksi bukan yang terbaik yang bisa saya dapatkan sekarang. Perfeksionisme, kurasa.
sumber
Baik secara profesional maupun pribadi, standar yang saya coba terapkan pada diri saya adalah:
Puas dengan kemenangan.
Jika kode saya menyelesaikan masalah yang dimaksudkan untuk dipecahkan dan tidak membuat masalah baru *, kemungkinan besar saatnya untuk melanjutkan. Ketika Anda belajar mengatur bar setinggi yang perlu diatur, "Cukup baik" menjadi, well, cukup bagus.
Kesempurnaan seperti kecepatan cahaya: Anda tidak akan pernah sampai di sana, tetapi tidak ada batasan untuk energi yang bisa Anda keluarkan untuk mencoba.
(* - Perhatikan bahwa "Buggy" dan "Sulit untuk mempertahankan" keduanya dengan kuat berada di bawah judul "Masalah baru." Jadi saya tidak menyebutnya lengkap sampai kode telah diuji, memiliki bit berlebihan dipangkas, dan memiliki dokumentasi komentar / API dimutakhirkan.)
sumber
Dengan pengalaman, saya menyadari bahwa perfeksionisme bahkan tidak mungkin sampai saya punya setidaknya beberapa tahun di bawah ikat pinggang dalam konteks tertentu (bahasa, kerangka kerja, platform, standar). Sebagai seorang pemula, akan ada segala macam keanehan yang tidak akan Anda sadari (melarikan diri, diutamakan, kata-kata yang dilindungi, gula sintaksis, batas waktu, panggilan asinkron, fitur & bug tidak terdokumentasi), jadi saya hanya mencoba untuk solusi yang baik, semua sambil belajar sebanyak mungkin. Yang penting, saya selalu berusaha membuatnya mudah untuk memperbaiki hasilnya - Arsitektur modular, komentar di mana diperlukan, dan tidak ada trik pintar .
sumber
Saya, seperti banyak programmer lain, memiliki banyak kode warisan untuk dipelihara. Godaan untuk mengulang semuanya akan selalu ada, tetapi pada dasarnya saya telah merebusnya menjadi satu prinsip:
Itu biasanya menangani banyak kode spageti menjadi kode spageti-chunk yang agak lebih mudah dikelola. Abaikan beberapa bongkahan, lakukan tes Anda, dan sekarang tidak terlihat terlalu membutuhkan kesempurnaan.
sumber