Di mana Anda menarik garis untuk perfeksionisme Anda? [Tutup]

37

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.

Amir Rezaei
sumber
7
Pertanyaan bagus - Saya selalu berjuang dengan ini.
Tidak ada yang

Jawaban:

40

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:

  • KISS = Keep It Simple, Stupid = berpura-pura bodoh dan harus mengerti desainnya
  • YAGNI = Anda Tidak Akan Membutuhkannya = berhentilah berpura-pura bahwa Anda dapat memprediksi masa depan dalam desain Anda
Joeri Sebrechts
sumber
5
+1 - Cukup sulit untuk memecahkan masalah yang kita tahu kita miliki, tanpa juga mencoba memecahkan masalah yang kita pikir kita miliki.
Jon Hopkins
6
Saya suka ini, tetapi definisi yang jelas dari akronim akan sangat membantu. Saya belum pernah mendengar YAGNIsampai hari ini.
Philip Regan
+1 untuk Philip yang mempelajari sesuatu hari ini! +1 untuk KISS juga.
Jawabannya bagus. Meskipun jelas setiap antarmuka (baik itu ke penyimpanan permanen (file), jaringan, atau IPC) setidaknya harus versi atau Anda tahu desain ulang Anda akan membuat back-compat tidak mungkin.
Deduplicator
7

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.

Sean McEligot
sumber
6

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.

Dan McGrath
sumber
6

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.

Pete
sumber
5

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.

Thomas Stock
sumber
1
+1 Untuk pengalaman membuat Anda lebih banyak berkompromi.
Amir Rezaei
4

Batas waktu menarik garis ini cukup jelas.

Simon
sumber
1
Poin bagus, tapi solusi buruk mungkin perlu waktu lebih lama untuk memperbaikinya di masa depan.
Amir Rezaei
Saya pikir Anda harus menilai perangkat lunak yang "cukup baik". Garis harus ditentukan oleh spesifikasi dan akal sehat Anda.
Tidak ada yang
3

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:

  • Cara yang akan meningkatkan kegunaan dan mengurangi kemungkinan masuknya bug
  • Cara yang akan mengurangi dependensi, meningkatkan waktu kompilasi

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.

Matthieu M.
sumber
Saya berbagi dengan Anda omelan. Saya percaya pemrograman seperti semacam seni di mana tidak ada kesempurnaan.
Amir Rezaei
2

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.)

BlairHippo
sumber
0

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 .

l0b0
sumber
Perfeksionisme tidak mungkin bahkan setelah pengalaman bertahun-tahun; itu adalah, jika Anda ingin benar-benar MEMBERIKAN apa pun. Hal paling berharga yang diajarkan pengalaman adalah kapan harus mengenali "cukup baik".
Jeff Knecht
0

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:

Apakah saya (atau orang lain) harus memikirkan ini lagi ?

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.

MPelletier
sumber