Saya dapat menulis kode ... tetapi tidak dapat mendesain dengan baik. Ada saran? [Tutup]

83

Saya merasa bahwa saya pandai menulis kode sedikit demi sedikit, tetapi desain saya benar-benar payah. Pertanyaannya adalah, bagaimana cara meningkatkan desain saya - dan pada gilirannya menjadi desainer yang lebih baik?

Saya pikir sekolah dan perguruan tinggi melakukan pekerjaan yang baik dalam mengajar orang bagaimana menjadi pandai memecahkan masalah matematika, tetapi mari kita akui kenyataan bahwa sebagian besar aplikasi yang dibuat di sekolah umumnya panjangnya sekitar 1000 - 2000 baris, yang berarti bahwa sebagian besar merupakan latihan akademis yang tidak mencerminkan kompleksitas perangkat lunak dunia nyata - pada urutan beberapa ratus ribu hingga jutaan baris kode.

Di sinilah saya percaya bahwa bahkan proyek-proyek seperti topcoder / project euler juga tidak akan banyak membantu, mereka mungkin mempertajam kemampuan pemecahan masalah matematika Anda - tetapi Anda mungkin menjadi programmer akademik; seseorang yang lebih tertarik pada hal-hal yang bagus dan bersih, yang sama sekali tidak tertarik pada hal-hal duniawi dan berbulu sehari-hari yang ditangani sebagian besar programmer aplikasi.

Jadi pertanyaan saya adalah bagaimana cara meningkatkan keterampilan desain saya? Artinya, kemampuan merancang aplikasi skala kecil / menengah yang akan masuk ke beberapa ribu baris kode? Bagaimana saya bisa belajar keterampilan desain yang akan membantu saya membangun kit editor html yang lebih baik, atau beberapa program grafis seperti gimp?

pengguna396089
sumber
1
"Mari kita akui kenyataan bahwa sebagian besar aplikasi yang dibuat di sekolah umumnya panjangnya sekitar 1000 - 2000 baris, yang berarti bahwa sebagian besar merupakan latihan akademis yang tidak mencerminkan kompleksitas perangkat lunak dunia nyata": Di mana saya mengajar kami memiliki dua proyek perangkat lunak semester di mana tim yang terdiri dari sepuluh siswa mengembangkan aplikasi yang cukup kompleks selama periode 6 hingga 8 bulan. Juga, banyak perusahaan (setidaknya di Jerman) menawarkan kontrak pendek untuk siswa yang ingin mendapatkan latihan sebelum mereka menyelesaikan studi mereka.
Giorgio

Jawaban:

87

Satu-satunya cara untuk menjadi benar-benar hebat dalam sesuatu adalah mencoba, gagal secara spektakuler, coba lagi, gagal sedikit kurang dari sebelumnya, dan seiring waktu kembangkan pengalaman untuk mengenali apa yang menyebabkan kegagalan Anda sehingga Anda dapat mengelola situasi kegagalan potensial di kemudian hari. Ini sama benarnya dengan belajar memainkan alat musik, mengendarai mobil, atau mendapatkan PWN-usia yang serius di penembak orang pertama favorit Anda, karena mempelajari segala aspek pengembangan perangkat lunak.

Tidak ada jalan pintas nyata, tetapi ada hal-hal yang dapat Anda lakukan untuk menghindari masalah saat Anda memperoleh pengalaman.

  • Identifikasi mentor yang baik . Tidak ada yang lebih baik daripada bisa membicarakan masalah Anda dengan seseorang yang sudah membayar iuran mereka. Bimbingan adalah cara yang bagus untuk membantu pembelajaran jalur cepat.
  • Baca , baca lebih banyak, latih apa yang sudah Anda baca, dan ulangi sepanjang karier Anda. Saya telah melakukan hal-hal ini selama lebih dari 20 tahun, dan saya masih bisa belajar sesuatu yang baru setiap hari. Belajar tidak hanya tentang desain awal, tetapi juga desain, pengujian, praktik terbaik, proses, dan metodologi yang muncul. Semua memiliki berbagai tingkat dampak pada bagaimana desain Anda akan muncul, terbentuk, dan yang lebih penting, bagaimana mereka bertahan seiring waktu.
  • Cari waktu untuk bermain - main . Baik terlibat dengan proyek skunkwork melalui tempat kerja Anda, atau berlatih di waktu Anda sendiri. Ini sejalan dengan bacaan Anda, dengan mempraktikkan pengetahuan baru Anda, dan melihat bagaimana hal-hal seperti itu akan berhasil. Ini juga hal yang membuat diskusi yang baik dengan mentor Anda.
  • Dapatkan terlibat dengan sesuatu yang teknis di luar dari tempat kerja Anda. Ini bisa berupa proyek, atau forum. Sesuatu yang akan memungkinkan Anda menguji teori dan ide Anda di luar lingkaran teman dekat Anda untuk mempertahankan perspektif baru tentang berbagai hal.
  • Bersabarlah . Ketahuilah bahwa pengalaman menghasilkan membutuhkan waktu, dan belajarlah untuk menerima bahwa Anda perlu mundur untuk sementara waktu untuk mengetahui mengapa dan di mana Anda gagal.
  • Buat buku harian atau blog tentang tugas, pikiran, kegagalan, dan kesuksesan Anda. Ini tidak sepenuhnya diperlukan, namun saya telah menemukan bahwa itu dapat bermanfaat besar bagi Anda untuk melihat bagaimana Anda telah berkembang dari waktu ke waktu, bagaimana keterampilan Anda telah tumbuh dan pikiran Anda telah berubah. Saya kembali ke jurnal saya sendiri setiap beberapa bulan dan melihat hal-hal yang saya tulis 4-5 tahun yang lalu. Ini adalah pembuka mata yang nyata menemukan betapa banyak yang telah saya pelajari pada waktu itu. Ini juga merupakan pengingat bahwa saya melakukan kesalahan dari waktu ke waktu. Ini pengingat sehat yang membantu saya meningkat.
S.Robins
sumber
45
+1 untuk mencoba dan gagal. Karena ketika Anda tidak mengerti mengapa ada pola desain, Anda tidak bisa menggunakan pola itu secara efektif.
Mert Akcakaya
2
+1 jawaban yang bagus, tetapi saya merasa itu agak tidak lengkap. Saya percaya bahwa kontribusi paling penting sejauh ini adalah memiliki nafsu makan yang sangat baik untuk refactoring. Tulis, lihat apa yang dikatakan teori (artikel, buku atau mentor), refactor / tulis ulang, kembali ke teori, refactor / tulis ulang - ini akan memberi Anda waktu untuk fokus pada struktur, sambil bekerja dengan kode yang sudah dikenal. Jadilah kritikus terburuk Anda sendiri. Saya juga akan mengatakan bahwa sangat penting bahwa Anda tidak pernah kehilangan selera untuk terus-menerus meninjau kembali pekerjaan Anda sendiri.
vski
1
@vski Ada banyak konsep yang bisa saya sertakan, tetapi pertanyaannya adalah apakah konsep-konsep itu sendiri akan memberikan jalan yang masuk akal untuk mendapatkan pengalaman yang dibutuhkan oleh OP untuk menganggap dirinya sebagai desainer yang lebih baik. Dalam lingkup jawaban saya, saya melihat refactoring sebagai praktik (sesuai poin kedua saya). Demikian juga mempraktikkan Clean Code, Test First, BDD, dan banyak konsep lainnya. Saya telah mengambil pendekatan bahwa ada banyak keterampilan dan pengalaman yang diperlukan untuk berkembang ke titik di mana keterampilan desain akan muncul dan tumbuh, dengan pengalaman dan pengetahuan yang diperoleh, dari waktu ke waktu. :)
S.Robins
2
+1 untuk mendapatkan seorang mentor. Idealnya, minta mentor Anda untuk melakukan tinjauan kode dengan Anda. Memiliki orang lain membaca dan mengkritik kode Anda dapat sangat membantu Anda dalam hal desain yang lebih baik dan lebih bersih.
Leo
2
"Pernah mencoba. Pernah gagal. Tidak masalah. Coba lagi. Gagal lagi. Gagal lebih baik." --- Samuel Beckett.
Peter K.
16

Nah, tidak ada apel emas untuk pertanyaan semacam ini, dan saya merasa mungkin ini adalah untuk setiap pembuat kode sendiri untuk menemukan apa yang tepat untuknya. Inilah yang saya ambil.

Anda bisa membaca buku tentang masalah ini. Buku bagus. Buku yang fantastis. Tetapi saya menemukan bahwa buku-buku ini hanya membantu Anda setelah Anda mencoba membangun dan mendesain aplikasi - dan gagal.

Bagi saya, ini semua tentang pengalaman. Ketika saya mulai sebagai pemula saya membaca buku tentang cara mendesain. Saya tidak mengerti banyak konten saat itu. Ketika saya mulai bekerja dan harus merancang aplikasi sendiri, saya membuat aplikasi yang sangat berantakan. Mereka bekerja, tetapi mereka sulit dipertahankan. Kemudian saya membaca buku-buku itu lagi - dan kali ini saya lebih memahami mereka.

Sekarang, saya terus membuat kesalahan baru dan belajar dari kesalahan lama.

Amadeus Hein
sumber
10
Ada poin bagus di sini yang patut disebut: Terus buat kesalahan baru ; jangan terus melakukan kesalahan lama yang sama - belajarlah darinya, dan lakukan sesuatu yang baru.
Bevan
11

Berhentilah mendesain dan belajar kode refactor. Pengembangan tambahan dengan refactoring yang terus menerus dan agresif akan menghasilkan produk akhir yang jauh lebih bersih daripada desain di muka.

kevin cline
sumber
2
Desain yang muncul adalah hal yang indah IMHO, namun tanpa disiplin Anda berisiko menciptakan "spageti emergent". Masalah dengan desain depan adalah bahwa orang melihatnya sebagai proposisi semua atau tidak sama sekali, memberikannya reputasi buruk ketika semuanya memburuk. Ini mengingatkan saya tentang salah satu Joel artikel di mana ia menyebutkan bahwa desain adalah penting. Apa yang dibutuhkan adalah cukup di muka untuk desain untuk membuat perbedaan tanpa merampas waktu, sumber daya, dan kesempatan Anda untuk melihat desain pendukung yang indah muncul secara organik melalui kode bersih.
S.Robins
@ S.Robins: Saya merasa OP masih menyerang proyek yang cukup kecil untuk diselesaikan dengan sangat baik dengan TDD dan refactoring berkelanjutan. Dengan demikian, ia dapat mempelajari disiplin yang diperlukan untuk mengetahui berapa banyak desain yang dibutuhkan untuk proyek yang lebih kompleks.
kevin cline
Saya pikir itu mungkin terjadi, namun saya merasa mungkin ada baiknya menambahkan konter dengan implikasi bahwa "desain awal" akan berpotensi lebih buruk daripada sesuatu yang murni muncul. Namun saya setuju bahwa cara untuk membangun pengalaman yang diperlukan OP adalah tidak terlalu khawatir pada awalnya tentang desain dan fokus pada penulisan kode yang diperhitungkan dengan baik dan bersih. :-)
S.Robins
Saya tidak setuju bahwa refactoring selalu mengarah ke desain terbaik. Tentu saja, refactoring sering memungkinkan Anda untuk mengeksplorasi dan memahami masalahnya, tetapi desain yang baik tidak selalu muncul secara bertahap melalui refactoring. Terkadang Anda melihat solusi yang jauh lebih baik dan menyadari bahwa kode Anda saat ini sangat jauh dari itu sehingga penulisan ulang jauh lebih cepat daripada refactoring.
Giorgio
Saya memiliki pengalaman ini baru-baru ini: Saya terus melakukan refactoring dan refactoring dan pergi dalam lingkaran yang memiliki masalah yang sama berulang-ulang: Saya menggunakan iterator untuk mengkode sesuatu dan kode terus menjadi rumit. Kemudian saya memutuskan untuk melupakan iterator dan saya harus menulis ulang banyak kode, tetapi logikanya menjadi lebih jelas dan lebih ringkas daripada sebelumnya. Saya tidak tahu apakah Anda akan menyebutnya "refactoring agresif": struktur keseluruhan aplikasi tidak berubah tetapi beberapa bagian mendasar hanya dibuang dan ditulis ulang dari awal.
Giorgio
7

Baca tentang pola, tentu saja, tetapi yang pertama dan terutama baca tentang pola anti. Mengenali pola-anti penting, dan lebih mudah untuk memahami mengapa sesuatu tidak boleh dilakukan sedemikian rupa daripada mengapa harus dilakukan.

Lihat http://sourcemaking.com/antipatterns/software-development-antipatterns misalnya.

Tulis kode sehingga dapat disesuaikan dengan cepat jika persyaratan berubah (yang sangat umum di lingkungan produksi).

Jadilah super-skeptis tentang menambahkan "hanya satu hack kecil lagi." Satu lagi di sini, satu lagi di sana, dan kodenya menjadi tidak dapat dipelihara.

Nilai prinsip terbuka / tertutup .

Tulis tes (seperti dalam TDD). Mereka memaksa Anda untuk memikirkan desain Anda bahkan sebelum Anda benar-benar mengimplementasikannya.

Jelajahi kode proyek sumber terbuka (yang berukuran wajar, yaitu). Saya biasanya terkejut - biasanya - melihat begitu banyak tingkat abstraksi. Sekarang saya mengerti itu bukan seni demi seni, ada alasan mengapa itu dilakukan dengan cara ini.

Konrad Morawski
sumber
4

Salah satu prinsip yang menurut saya sangat penting untuk desain yang baik adalah dekomposisi: jika sebuah kelas terlalu besar (lebih dari, katakanlah, 300-400 baris kode) pecah menjadi kelas yang lebih kecil; jika suatu metode terlalu besar (katakanlah, lebih dari 50 baris kode) uraikan; jika suatu proyek berisi lebih dari 50 kelas, dekomposisikan.

Kuncinya adalah memperkirakan ukuran sistem Anda dan membangun beberapa lapisan abstraksi (mis. Subsistem, aplikasi, proyek, modul, kelas, metode) yang memungkinkan Anda untuk menguraikan kode Anda menjadi unit yang dapat dipahami dengan hubungan yang jelas antara mereka dan beberapa dependensi.

Giorgio
sumber
1
Meskipun ada beberapa manfaat dalam saran Anda, baris kode tidak terlalu penting, perilaku tetap berlaku. Jika metode Anda melakukan lebih dari satu hal, mungkin ini saatnya untuk refactor. Jika satu hal itu hanya memanggil metode yang melakukan satu hal sendiri, dan menjahitnya bersama, itu bagus.
jer
1
@ jer: Ini adalah aturan praktis, tentu saja. Sebuah metode yang memanggil 100 metode lainnya, seperti yang Anda katakan, hanya menyatukan semuanya (ia memanggil daftar sub-fungsi). Saya lebih memikirkan metode yang mengandung beberapa logika nyata: itu biasanya pertanda buruk jika Anda harus menggulir banyak bolak-balik untuk memahami apa yang dilakukan metode. Hal yang sama jika Anda melihat definisi kelas dengan banyak anggota (dan kelas bukan hanya kumpulan properti besar yang datar).
Giorgio
"proyek berisi lebih dari 50 kelas, dekomposisi itu" tidak serius
dinamis
@ yes123: Itu dimaksudkan untuk memberikan ide. Itu benar-benar tergantung pada apa yang Anda kembangkan, dalam bahasa apa, dll.
Giorgio
Saya pikir akan masuk akal untuk dicatat bahwa ini tidak akan membantu untuk desain di muka (karena Anda sedang refactoring) tetapi akan membantu untuk mempelajari pola dan praktik terbaik yang akan meningkatkan desain masa depan Anda.
Craig Bovis
0

Sulit, yang sebenarnya kita bicarakan adalah kemampuan untuk abstrak daripada membuat kode yang lebih baik, tetapi dua hal akan membuat Anda lebih baik dan satu hal akan membuat Anda lebih bahagia:

"Lebih baik"

A) Temukan desainer terbaik yang Anda bisa dan pasangkan program / lakukan desain bersama. Minta mereka untuk menjelaskan apa yang mereka pikirkan saat mereka mengatasi masalah, jangan puas dengan "rasanya benar" dan terus menggali. Proses itu akan membantu pesta "mentoring" juga

B) Bayangkan semuanya sebagai aktor individu dan percakapan di antara mereka. Masing-masing aktor harus memiliki peran / tanggung jawab tunggal dan kelompok mereka menangani sistem yang berbeda. Jika percakapan itu berhasil dan masing-masing aktor merasa koheren dan kohesif maka Anda berada di jalan Anda.

Dan "Lebih Bahagia"

C) Jika Anda sudah mencoba yang terbaik dan itu masih belum terjadi maka tidak ada salahnya menerima bahwa beberapa orang tidak dapat melakukan beberapa hal. Anda bisa menulis kode yang ketat dan cemerlang, tetapi tidak pernah bisa mendesain atau arsitek. Terus? Saya tidak bisa bermain olahraga fisik untuk minum kopi, saya tidak tampan dan mengendarai mobil saya tidak akan pernah lebih baik dari rata-rata. Nikmati dan manfaatkan keahlian Anda.

Stuart Muckley
sumber
-1

Dalam pengalaman pribadi saya membaca kode orang lain adalah sumber yang baik untuk "inspirasi". Maksud saya, mencoba memahami desain orang lain dan bertanya pada diri sendiri mengapa ia melakukan hal-hal seperti itu?

Anda dapat menemukan banyak proyek sumber terbuka untuk penelitian.

Lagi pula Anda perlu latihan.

PCJ
sumber
-1

Jangan hidup dalam ketakutan

Berjuang untuk kesederhanaan

Dengarkan pengguna Anda

Coba banyak ide

Buat sesuatu, lalu buat lebih baik

Kerjakan hal-hal yang menambah nilai, tinggalkan hal-hal yang tidak

erturne
sumber
-1

Belajarlah untuk mengajukan pertanyaan yang tepat. Lebih sering daripada tidak, Anda akan meningkatkan desain Anda dengan melihat masalah dari sudut yang berbeda. Secara khusus ini akan membantu Anda menjauh dari fokus pada penyelesaian masalah yang dihadapi dan mencari lebih ke solusi yang memecahkan berbagai masalah terkait.

Craig Bovis
sumber