Bagaimana mengelola kompleksitas yang tidak disengaja dalam proyek perangkat lunak

74

Ketika Murray Gell-Mann ditanya bagaimana Richard Feynman berhasil menyelesaikan begitu banyak masalah sulit, Gell-Mann menjawab bahwa Feynman memiliki algoritma:

  1. Tuliskan masalahnya.
  2. Berpikir sangat keras.
  3. Tuliskan solusinya.

Gell-Mann berusaha menjelaskan bahwa Feynman adalah jenis pemecah masalah yang berbeda dan tidak ada wawasan yang dapat diperoleh dari mempelajari metodenya. Saya agak merasakan hal yang sama tentang mengelola kompleksitas dalam proyek perangkat lunak menengah / besar. Orang-orang yang baik hanya secara inheren baik dalam hal itu dan entah bagaimana berhasil melapisi dan menumpuk berbagai abstraksi untuk membuat semuanya dapat dikelola tanpa memperkenalkan penggerek asing.

Jadi, apakah algoritma Feynman satu-satunya cara untuk mengelola kompleksitas yang tidak disengaja atau adakah metode aktual yang dapat diterapkan oleh insinyur perangkat lunak secara konsisten untuk menjinakkan kompleksitas yang tidak disengaja?

davidk01
sumber
32
Saya tidak akan terkejut jika tindakan menuliskan masalah (dan menyempurnakannya sehingga Anda dapat menjelaskannya secara memadai kepada orang lain) membantu Anda mengidentifikasi solusi.
Rory Hunter
@RoryHunter - Setuju. Dan bagian dari menuliskan masalah dan berbagi dengan seseorang menunjukkan Anda mengakui bahwa Anda belum memiliki solusi.
JeffO
38
@RoryHunter: Ini. Hampir setiap minggu, saya menemukan masalah yang tidak bisa saya selesaikan, menulis email kepada seseorang untuk menjelaskannya. Kemudian sadari apa yang tidak saya pertimbangkan, pecahkan masalah dan hapus emailnya. Saya juga menulis tentang selusin pertanyaan di situs ini yang tidak pernah terkirim.
pdr
Hal paling mendasar yang saya pelajari adalah jangan meminta pengembang untuk menangani masalah yang hanya dalam jangkauan mereka. Meskipun masalah-masalah itu menarik, mereka juga melibatkan pengembang yang merambah ke tempat-tempat yang tidak dikenal, yang menyebabkan banyak pertumbuhan "on the fly". Beberapa alat, seperti pengembangan spiral, baik untuk membumikan tim pengembangan dalam masalah kecil yang bisa ditelusuri sebelum menumbuhkannya menjadi solusi akhir
Cort Ammon
2
@CortAmmon Bukan berarti tapi itu terdengar seperti wawasan yang sangat bodoh. 99% dari apa yang diketahui pengembang dipelajari di beberapa titik melalui apa yang Anda sebut 'pertumbuhan on-the-fly'. Butuh pemecah masalah yang baik untuk membuat programmer yang baik. Memecahkan masalah adalah sesuatu yang secara inheren menarik bagi kita. Jika pengembang Anda tidak berkembang, mereka mungkin melakukan banyak pekerjaan berulang yang membosankan. Jenis pekerjaan yang akan membuat pengembang yang cukup berbakat tidak bahagia dan tertekan. Dan ... 'Pengembangan Spiral' tidak lain adalah re-hashing dari konsep dasar pengembangan berulang dengan tonggak air terjun.
Evan Plaice

Jawaban:

104

Ketika Anda melihat langkah yang baik, cari yang lebih baik.
—Emanuel Lasker, juara catur dunia 27 tahun

Dalam pengalaman saya, pendorong terbesar kerumitan yang tidak disengaja adalah programmer tetap menggunakan konsep pertama, hanya karena kebetulan berhasil. Ini adalah sesuatu yang dapat kita pelajari dari kelas komposisi bahasa Inggris kita. Mereka membangun waktu untuk membaca beberapa konsep dalam tugas mereka, memasukkan umpan balik guru. Kelas pemrograman, karena alasan tertentu, jangan.

Ada buku yang penuh dengan cara konkret dan obyektif untuk mengenali, mengartikulasikan, dan memperbaiki kode suboptimal: Kode Bersih , Bekerja Efektif dengan Kode Legacy , dan banyak lainnya. Banyak programmer yang akrab dengan teknik ini, tetapi tidak selalu meluangkan waktu untuk menerapkannya. Mereka benar-benar mampu mengurangi kompleksitas yang tidak disengaja, mereka hanya belum terbiasa untuk mencoba .

Sebagian dari masalahnya adalah kita tidak sering melihat kompleksitas menengah kode orang lain, kecuali sudah melalui peer review pada tahap awal. Kode bersih sepertinya mudah ditulis, padahal sebenarnya itu melibatkan beberapa konsep. Anda menulis cara terbaik yang muncul di kepala Anda pada awalnya, perhatikan kerumitan yang tidak perlu itu diperkenalkan, kemudian "mencari langkah yang lebih baik" dan refactor untuk menghilangkan kompleksitas tersebut. Kemudian Anda terus "mencari langkah yang lebih baik" sampai Anda tidak dapat menemukannya.

Namun, Anda tidak mengeluarkan kode untuk ditinjau sampai setelah semua churn itu, sehingga secara eksternal sepertinya itu juga merupakan proses yang mirip Feynman. Anda memiliki kecenderungan untuk berpikir bahwa Anda tidak dapat melakukan semuanya dalam satu potongan seperti itu, jadi Anda tidak perlu mencoba, tetapi kenyataannya adalah penulis kode sederhana yang baru saja Anda baca biasanya tidak dapat menulis semuanya dalam satu potongan seperti itu, atau jika mereka bisa, itu hanya karena mereka memiliki pengalaman menulis kode yang sama berkali-kali sebelumnya, dan sekarang dapat melihat polanya tanpa tahap peralihan. Either way, Anda tidak dapat menghindari konsep.

Karl Bielefeldt
sumber
1
Ahh, tapi sepertinya Anda sudah bisa menulis jawaban bersih untuk pertanyaan ini pada percobaan pertama Anda. (Dan yang sangat meyakinkan, pada saat itu.) Mungkin Anda hanya menyamar Feynman.
kmote
1
tl; dr; refactor, jangan takut.
ocodo
1
+1 untuk merangkul ketidaksempurnaan. Sobat, itu adalah sesuatu yang dibicarakan semua orang , tetapi hanya sedikit yang melakukannya. Saya mencoba untuk me-rewire otak saya untuk berpikir tentang diri saya seperti algoritma pembelajaran mesin, di mana kesalahan sebenarnya baik dan mengajar tentang cara meningkatkan. Cara yang indah untuk mengungkapkannya dengan metafora "draft" Anda.
Juan Carlos Coto
46

"Keterampilan arsitektur perangkat lunak tidak dapat diajarkan" adalah kekeliruan luas.

Sangat mudah untuk memahami mengapa banyak orang mempercayainya (mereka yang ahli dalam hal itu ingin percaya bahwa mereka istimewa secara mistis, dan mereka yang tidak ingin percaya bahwa itu bukan kesalahan mereka, bukan karena kesalahan mereka sendiri.) tetap saja salah; keterampilannya hanya sedikit lebih intensif daripada keterampilan perangkat lunak lain (misalnya memahami loop, berurusan dengan pointer dll.)

Saya sangat yakin bahwa membangun sistem yang besar rentan terhadap praktik berulang dan belajar dari pengalaman dengan cara yang sama dengan menjadi seorang musisi atau pembicara publik yang hebat adalah: jumlah bakat minimum adalah prasyarat, tetapi itu bukan minimum yang sangat besar yang keluar dari mencapai sebagian besar praktisi.

Berurusan dengan kompleksitas adalah keterampilan yang Anda peroleh sebagian besar dengan mencoba dan gagal beberapa kali. Hanya saja banyak pedoman umum yang telah ditemukan komunitas untuk pemrograman dalam jumlah besar (gunakan layer, lawan duplikasi di mana pun mereka berada, patuhi agama dengan 0/1 / tak terhingga ...) tidak secara jelas benar dan perlu untuk suatu pemula sampai mereka benar-benar melakukan program sesuatu yang besar. Sampai Anda benar-benar digigit oleh duplikasi yang menyebabkan masalah hanya beberapa bulan kemudian, Anda tidak bisa 'mendapatkan' pentingnya prinsip-prinsip tersebut.

Kilian Foth
sumber
11
Saya sangat suka kalimat terakhir Anda. Saya yakin saya belajar banyak pada pekerjaan pertama saya karena saya cukup lama di sana untuk kesalahan saya untuk mengejar ketinggalan. Ini pengalaman berharga.
MetaFight
26
"Penilaian yang baik datang dari pengalaman. Pengalaman berasal dari penilaian yang buruk." --Mulla Nasrudin
Jonas Kölker
9
Saya tidak mengerti bagaimana Anda dapat menyatakan bahwa ketidakmampuan untuk mengajarkan arsitektur perangkat lunak adalah kesalahan, tetapi selanjutnya mengatakan bahwa latihan yang berulang, belajar dari pengalaman, dan membuat kesalahan (ditambah dengan beberapa bakat bawaan) adalah satu-satunya cara untuk mempelajarinya. . Definisi saya tentang sesuatu yang dapat diajarkan adalah sesuatu yang Anda tidak perlu berlatih secara intensif untuk mendapatkannya, tetapi Anda dapat belajar dengan menonton, mendengarkan, dan membaca. Saya setuju dengan semua yang ada di jawaban ini, kecuali baris pertama, karena tampaknya bertentangan dengan yang lain.
Thomas Owens
4
Intinya adalah bahwa banyak orang mengklaim bahwa banyak orang benar-benar, dalam keadaan apa pun tidak dapat belajar menjadi arsitek yang baik (baik di ruang kuliah atau di industri), karena mereka "tidak mendapatkan apa yang diperlukan". Itu yang saya anggap biasa tapi salah.
Kilian Foth
5
@ Thomas: Kembali ke analogi berbicara di depan umum. Tidak peduli berapa banyak buku yang Anda baca, berapa banyak waktu yang Anda habiskan untuk mempelajari topik tersebut atau berapa banyak guru yang mencoba mengajari Anda untuk menjadi mahir berbicara di depan umum, Anda tidak akan bisa melakukannya dengan baik kecuali Anda melakukannya melalui latihan berulang, belajar dari pengalaman dan membuat kesalahan. Anda tidak akan pernah meyakinkan saya bahwa seseorang dapat mempelajari keterampilan hanya dengan menonton, mendengarkan, dan membaca. Hal yang sama berlaku untuk sebagian besar keahlian, termasuk arsitektur perangkat lunak. Saya sebenarnya tidak bisa memikirkan keahlian apa pun yang dapat Anda pelajari hanya dengan menonton, mendengarkan, dan membaca.
Dunk
22

Pemikiran pragmatis oleh Andy Hunt membahas masalah ini. Ini mengacu pada model Dreyfus, yang menurutnya ada 5 tahap kemahiran dalam berbagai keterampilan. Para pemula (tahap 1) membutuhkan instruksi yang tepat untuk dapat melakukan sesuatu dengan benar. Para ahli (tahap 5), sebaliknya, dapat menerapkan pola umum untuk masalah yang diberikan. Mengutip buku itu,

Seringkali sulit bagi para ahli untuk menjelaskan tindakan mereka ke tingkat detail yang halus; banyak dari tanggapan mereka dipraktikkan dengan sangat baik sehingga mereka menjadi tindakan sadar. Pengalaman mereka yang luas ditambang oleh area otak nonverbal yang sadar, yang membuatnya sulit bagi kita untuk mengamati dan sulit bagi mereka untuk mengartikulasikan.

Ketika para ahli melakukan hal mereka, tampaknya hampir ajaib bagi kita semua — mantra aneh, wawasan yang tampaknya muncul entah dari mana, dan kemampuan yang tampaknya aneh untuk mengetahui jawaban yang tepat ketika kita semua bahkan tidak begitu yakin tentang pertanyaannya. Tentu saja, ini bukan sihir, tetapi cara para ahli memahami dunia, bagaimana mereka memecahkan masalah, model mental yang mereka gunakan, dan sebagainya, semuanya sangat berbeda dari para pakar yang bukan ahli.

Aturan umum untuk melihat ini (dan sebagai akibatnya menghindari) isu-isu yang berbeda dapat diterapkan secara spesifik pada masalah kompleksitas yang tidak disengaja. Memiliki seperangkat aturan tidak cukup untuk menghindari masalah ini. Akan selalu ada situasi yang tidak tercakup oleh aturan-aturan itu. Kita perlu mendapatkan pengalaman untuk dapat meramalkan masalah atau mengidentifikasi solusi. Pengalaman adalah sesuatu yang tidak bisa diajarkan, itu hanya bisa diperoleh dengan terus-menerus mencoba, gagal atau berhasil dan belajar dari kesalahan.

Pertanyaan dari Workplace ini relevan dan IMHO akan menarik untuk dibaca dalam konteks ini.

superM
sumber
3
Sungguh deskripsi yang luar biasa tentang bagaimana para ahli berpikir. Ini benar-benar bukan sihir, hanya sulit untuk mengartikulasikan semua langkah yang diskrit dan logis.
MetaFight
+1 Sangat mirip dengan model Four Stages Of Competence
Robbie Dee
Itu seperti mengatakan bahwa itu bukan keajaiban bagaimana atlet "elit" dapat melakukan apa yang mereka lakukan, itu hanya masalah mereka mampu secara alami melakukan langkah-langkah diskrit dan logis yang diperlukan untuk tampil di level tertinggi. Jadi, jika hanya para atlet itu yang bisa mengartikulasikan langkah-langkah diskrit dan logis itu kepada kita, maka kita semua bisa menjadi atlet elit. Konsep bahwa kita semua bisa menjadi atlet elit, tidak peduli tingkat pengetahuan apa yang kita peroleh, sama konyolnya dengan kita semua bisa menjadi ahli dalam keterampilan apa pun yang kita coba pelajari, terlepas dari bakat di bidang keterampilan itu.
Dunk
1
@Dunk, Magic akan menjadi ketika atlet "elit" bisa melakukan hal yang sama tanpa pelatihan sama sekali. Gagasan utamanya adalah tidak ada peluru perak. Betapapun berbakatnya, pengalaman tidak dapat diperoleh hanya dengan mempelajari beberapa "langkah diskrit dan logis". Ngomong-ngomong, menurut buku yang sama, hanya 1-5% orang yang ahli.
superM
@Super: Saya akan mempertanyakan buku / studi apa pun yang membuat klaim konyol karena hanya 1-5% orang yang ahli. Bicara tentang menarik nomor dari # & # & $ # mereka. Pakar apa? Saya yakin ada persentase yang jauh lebih tinggi dari orang yang ahli dalam bernafas, berjalan, makan. Siapa yang memutuskan apa itu level ahli? Klaim seperti 1-5% mendiskreditkan klaim dan analisis lebih lanjut dari penulis tersebut.
Dunk
4

Anda tidak menguraikannya, tetapi "kompleksitas tak disengaja" didefinisikan sebagai kompleksitas yang tidak melekat pada masalah, dibandingkan dengan kompleksitas "esensial". Teknik-teknik yang diperlukan untuk "Menjinakkan" akan tergantung dari mana Anda memulai. Berikut ini sebagian besar mengacu pada sistem yang telah memperoleh kompleksitas yang tidak perlu.

Saya memiliki pengalaman dalam sejumlah proyek multi-tahun besar adalah komponen "tidak disengaja" secara signifikan lebih besar daripada aspek "penting", dan juga proyek-proyek di mana tidak.

Sebenarnya, algoritma Feynman berlaku sampai batas tertentu, tetapi itu tidak berarti bahwa "berpikir sangat keras" berarti hanya sihir yang tidak dapat dikodifikasikan.

Saya menemukan ada dua pendekatan yang perlu diambil. Bawa mereka berdua - mereka bukan alternatif. Satu untuk mengatasinya sedikit demi sedikit dan yang lain adalah melakukan pengerjaan ulang besar. Jadi yang pasti, "tuliskan masalahnya". Ini mungkin mengambil bentuk audit sistem - modul kode, statusnya (bau, tingkat pengujian otomatis, berapa banyak staf yang mengaku memahaminya), arsitektur keseluruhan (ada satu, bahkan jika "memiliki masalah" ), persyaratan, dll. dll.

Sifat kerumitan "kebetulan" tidak ada satu masalah yang perlu ditangani. Jadi, Anda perlu triase. Di mana itu sakit - dalam hal kemampuan untuk mempertahankan sistem dan kemajuan pengembangannya? Mungkin beberapa kode benar-benar bau, tetapi bukan prioritas utama dan perbaikan dapat dilakukan untuk menunggu. Di sisi lain, mungkin ada beberapa kode yang akan dengan cepat mengembalikan waktu yang dihabiskan untuk refactoring.

Tetapkan rencana untuk apa arsitektur yang lebih baik dan cobalah untuk memastikan pekerjaan baru sesuai dengan rencana itu - ini adalah pendekatan tambahan.

Juga, jelaskan biaya masalah dan gunakan itu untuk membangun kasus bisnis untuk membenarkan sebuah refactor. Kuncinya di sini adalah bahwa sistem yang dirancang dengan baik mungkin jauh lebih kuat dan dapat diuji sehingga menghasilkan waktu yang lebih singkat (biaya dan jadwal) untuk mengimplementasikan perubahan - ini memiliki nilai nyata.

Sebuah pengerjaan ulang besar tidak termasuk dalam kategori "berpikir sangat keras" - Anda harus melakukannya dengan benar. Di sinilah memiliki "Feynman" (yah, sebagian kecil dari satu akan baik-baik saja) benar-benar terbayar. Pengerjaan ulang besar yang tidak menghasilkan arsitektur yang lebih baik dapat menjadi bencana. Penulisan ulang sistem penuh terkenal untuk ini.

Tersirat dalam pendekatan apa pun adalah mengetahui cara membedakan "kebetulan" dari "esensial" - artinya Anda perlu memiliki arsitek (atau tim arsitek) yang hebat yang benar-benar memahami sistem dan tujuannya.

Setelah mengatakan semua itu, kuncinya bagi saya adalah pengujian otomatis . Jika Anda sudah cukup, sistem Anda terkendali. Jika tidak. . .

Keith
sumber
Bisakah Anda menjelaskan bagaimana pengujian otomatis berfungsi untuk membedakan kompleksitas yang tidak disengaja dan esensial?
ryscl
1
@RyanSmith. Singkatnya, Tidak. Faktanya, saya tidak berpikir ada cara tertentu (selain "berpikir keras") untuk membedakannya . Tetapi pertanyaannya adalah tentang "mengelola" itu. Jika Anda melihat persyaratan, desain, uji kasus sebagai bagian dari arsitektur sistem, maka kurangnya tes otomatis itu sendiri merupakan kompleksitas yang tidak disengaja, sehingga menambahkan pengujian otomatis di tempat yang kurang membantu menanganinya dan membuat apa yang lebih mudah dikelola . Tapi yang paling pasti itu tidak menyelesaikan semua itu.
Keith
3

" Segala sesuatu harus dibuat sesederhana mungkin, tetapi tidak lebih sederhana. "
- dikaitkan dengan Albert Einstein

Biarkan saya membuat sketsa algoritma pribadi saya untuk menangani kompleksitas yang tidak disengaja.

  1. Tulis kisah pengguna atau use case. Tinjau dengan pemilik produk.
  2. Tulis tes integrasi yang gagal karena fitur itu tidak ada. Tinjau dengan QA, atau pemimpin insinyur, jika ada hal seperti itu di tim Anda.
  3. Tulis tes unit untuk beberapa kelas yang dapat lulus tes integrasi.
  4. Tulis implementasi minimal untuk kelas-kelas yang lulus tes unit.
  5. Tinjau pengujian dan implementasi unit dengan sesama pengembang. Lanjutkan ke Langkah 3.

Seluruh keajaiban desain ada pada Langkah 3: bagaimana Anda mengatur kelas-kelas itu? Ini ternyata menjadi pertanyaan yang sama seperti: bagaimana Anda membayangkan bahwa Anda memiliki solusi untuk masalah Anda sebelum Anda memiliki solusi untuk masalah Anda?

Hebatnya, hanya membayangkan Anda memiliki solusinya tampaknya menjadi salah satu rekomendasi utama dari orang-orang yang menulis tentang pemecahan masalah (disebut "angan-angan" oleh Abelson dan Sussman dalam Struktur dan Interpretasi Program Komputer dan "bekerja mundur" di Polya's How to Selesaikan )

Di sisi lain, tidak semua orang memiliki " selera untuk solusi imajinasi " yang sama: ada solusi yang hanya Anda anggap elegan, dan ada yang lain lebih mudah dimengerti oleh khalayak yang lebih luas. Itulah sebabnya Anda perlu meninjau kode Anda dengan sesama pengembang: tidak hanya untuk menyempurnakan kinerja, tetapi untuk menyetujui solusi yang dipahami. Biasanya ini mengarah pada desain ulang dan, setelah beberapa iterasi, ke kode yang jauh lebih baik.

Jika Anda tetap dengan menulis implementasi minimal untuk lulus tes Anda, dan menulis tes yang dipahami oleh banyak orang, Anda harus mengakhiri dengan basis kode di mana hanya kompleksitas tak tereduksi yang tersisa.

logc
sumber
2

Kompleksitas Terkadang

Pertanyaan aslinya (diparafrasekan) adalah:

Bagaimana arsitek mengelola kompleksitas yang tidak disengaja dalam proyek perangkat lunak?

Kompleksitas yang tidak disengaja muncul ketika mereka yang memiliki arah atas suatu proyek memilih untuk menambahkan teknologi yang satu teknologi, dan bahwa strategi keseluruhan arsitek asli proyek tidak bermaksud untuk memasukkannya ke dalam proyek. Untuk alasan ini, penting untuk mencatat alasan di balik pilihan dalam strategi.

Kompleksitas yang tidak disengaja dapat dihalangi oleh kepemimpinan yang berpegang teguh pada strategi awal mereka sampai suatu saat keberangkatan yang disengaja dari strategi itu menjadi perlu.

Menghindari Kerumitan yang Tidak Perlu

Berdasarkan isi pertanyaan, saya akan ulangi seperti ini:

Bagaimana arsitek mengelola kompleksitas dalam proyek perangkat lunak?

Frasa ulang ini lebih sesuai dengan inti pertanyaan, di mana algoritma Feynman kemudian dibawa, memberikan konteks yang mengusulkan bahwa untuk arsitek terbaik, ketika dihadapkan dengan masalah, memiliki gestalt yang kemudian mereka dengan terampil membangun solusi, dan bahwa kita semua tidak dapat berharap untuk mempelajari ini. Memiliki gestal pemahaman tergantung pada kecerdasan subjek, dan kesediaan mereka untuk mempelajari fitur-fitur opsi arsitektur yang bisa berada dalam ruang lingkup mereka.

Proses perencanaan untuk proyek akan menggunakan pembelajaran organisasi untuk membuat daftar persyaratan proyek, dan kemudian berusaha untuk membangun daftar semua opsi yang mungkin, dan kemudian merekonsiliasi opsi dengan persyaratan. Gestalt ahli memungkinkan dia untuk melakukan ini dengan cepat, dan mungkin dengan sedikit kerja nyata, membuatnya tampak mudah baginya.

Saya serahkan kepada Anda bahwa itu datang kepadanya karena persiapannya. Untuk memiliki gestalt ahli diperlukan keakraban dengan semua pilihan Anda, dan pandangan ke depan untuk memberikan solusi langsung yang memungkinkan untuk kebutuhan masa depan yang ditentukan bahwa proyek harus menyediakan, serta fleksibilitas untuk beradaptasi dengan perubahan kebutuhan proyek. Persiapan Feynman adalah bahwa ia memiliki pemahaman yang mendalam tentang berbagai pendekatan dalam matematika dan fisika teoretis dan terapan. Dia sangat ingin tahu, dan cukup cerdas untuk memahami hal-hal yang dia temukan tentang dunia alami di sekitarnya.

Arsitek teknologi pakar akan memiliki rasa ingin tahu yang sama, menggambar pada pemahaman yang mendalam tentang fundamental serta paparan yang luas terhadap beragam teknologi. Dia akan memiliki kebijaksanaan untuk memanfaatkan strategi yang telah berhasil di seluruh domain (seperti Prinsip Pemrograman Unix ) dan yang berlaku untuk domain tertentu (seperti pola desain dan panduan gaya ). Dia mungkin tidak memiliki pengetahuan yang mendalam tentang setiap sumber daya, tetapi dia akan tahu di mana menemukan sumber daya itu.

Membangun Solusi

Tingkat pengetahuan, pemahaman, dan kebijaksanaan ini, dapat diambil dari pengalaman dan pendidikan, tetapi membutuhkan kecerdasan dan aktivitas mental untuk menyatukan solusi strategis gestalt yang bekerja bersama dengan cara yang menghindari kompleksitas yang tidak disengaja dan tidak perlu. Dibutuhkan ahli untuk menyatukan dasar-dasar ini; ini adalah pekerja pengetahuan yang diramalkan Drucker ketika pertama kali menciptakan istilah itu.

Kembali ke pertanyaan terakhir yang spesifik:

Metode khusus untuk menjinakkan kompleksitas yang tidak disengaja dapat ditemukan dalam berbagai sumber berikut.

Mengikuti Prinsip-prinsip Pemrograman Unix akan membuat Anda membuat program modular sederhana yang bekerja dengan baik dan kuat dengan antarmuka umum. Pola Desain berikut ini akan membantu Anda membangun algoritma kompleks yang tidak lebih kompleks dari yang diperlukan. Panduan Gaya Mengikuti akan memastikan kode Anda dapat dibaca, dipelihara, dan optimal untuk bahasa di mana kode Anda ditulis. Para ahli akan telah menginternalisasi banyak prinsip yang ditemukan dalam sumber daya ini, dan akan dapat menyatukannya dalam cara yang kohesif dan mulus.

Aaron Hall
sumber
Apa yang Anda maksud dengan "gestalt"? Saya telah menemukan bahwa itu seperti "paradigma" - umumnya disalahgunakan, atau digunakan untuk memberi kesan akademis.
@JonofAllTrades Dari wikipedia: `Die Gestalt adalah kata dalam bahasa Jerman untuk bentuk atau bentuk. Ini digunakan dalam bahasa Inggris untuk merujuk pada konsep 'keutuhan'. Saya menggunakannya di sini untuk merujuk pada pemahaman ahli tentang keseluruhan gambar, bagaimana mata manusia melihat benda secara keseluruhan
Aaron Hall
0

Ini mungkin pertanyaan yang sulit beberapa tahun yang lalu, tetapi IMO tidak lagi sulit untuk menghilangkan kerumitan yang tidak disengaja saat ini.

Apa yang Kent Becksaid tentang dirinya, pada titik tertentu: "Saya bukan programmer yang hebat; Saya hanya programmer yang baik dengan kebiasaan yang hebat."

Dua hal yang patut disorot, IMO: ia menganggap dirinya seorang programmer , bukan arsitek, dan fokusnya adalah pada kebiasaan, bukan pengetahuan.

Cara Feynman dalam memecahkan masalah sulit adalah satu-satunya cara untuk melakukannya. Deskripsi itu tidak selalu sangat mudah dimengerti, jadi saya akan membedahnya. Kepala Feynman tidak hanya penuh dengan pengetahuan, tetapi juga penuh dengan keterampilan untuk menerapkan pengetahuan itu. Ketika Anda memiliki pengetahuan dan keterampilan untuk menggunakannya, menyelesaikan masalah yang sulit tidaklah sulit dan juga tidak mudah. Itu satu-satunya hasil yang mungkin.

Ada cara yang sepenuhnya non-magis dalam menulis kode bersih, yang tidak mengandung kerumitan yang tidak disengaja, dan sebagian besar mirip dengan apa yang dilakukan Feynman: dapatkan semua pengetahuan yang diperlukan, latihlah untuk membiasakannya bekerja, daripada hanya menyimpannya di beberapa sudut otak Anda, lalu tulis kode bersih.

Sekarang, banyak programmer bahkan tidak menyadari semua pengetahuan yang diperlukan untuk menulis kode bersih. Pemrogram yang lebih muda cenderung membuang pengetahuan tentang algoritma dan struktur data, dan kebanyakan pemrogram yang lebih tua cenderung melupakannya. Atau notasi O besar dan analisis kompleksitas. Pemrogram yang lebih tua cenderung mengabaikan pola atau bau kode - atau bahkan tidak tahu bahwa mereka ada. Sebagian besar programmer dari generasi mana pun, bahkan jika mereka tahu tentang pola, tidak pernah ingat kapan tepatnya menggunakan dan driver bagian. Beberapa programmer dari generasi mana pun secara konstan menilai kode mereka terhadap prinsip-prinsip SOLID. Banyak programmer mencampur semua level abstraksi di semua tempat. Saya tidak mengetahui adanya satu programmer sesama, untuk saat ini, untuk secara konstan menilai kodenya terhadap bau busuk yang dijelaskan oleh Fowler dalam buku refactoring-nya. Meskipun beberapa proyek menggunakan beberapa alat metrik, metrik yang paling sering digunakan adalah kompleksitas, dari satu jenis atau lainnya, sementara dua metrik lainnya - kopel dan kohesi - sebagian besar diabaikan, bahkan jika mereka sangat penting untuk kode bersih. Aspek lain yang hampir semua orang abaikan adalah beban kognitif. Beberapa programmer menganggap tes unit sebagai dokumentasi, dan bahkan lebih sedikit yang menyadari bahwa sulit untuk menulis atau menyebutkan tes unit adalah bau kode lain, yang biasanya menunjukkan anjak piutang yang buruk. Minoritas kecil menyadari mantra desain yang didorong oleh domain untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah di kemudian hari. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang. metrik yang paling banyak digunakan adalah kompleksitas, dari satu jenis atau lainnya, sementara dua metrik lainnya - kopel dan kohesi - sebagian besar diabaikan, bahkan jika mereka sangat penting untuk kode bersih. Aspek lain yang hampir semua orang abaikan adalah beban kognitif. Beberapa programmer menganggap tes unit sebagai dokumentasi, dan bahkan lebih sedikit yang menyadari bahwa sulit untuk menulis atau menyebutkan tes unit adalah bau kode lain, yang biasanya menunjukkan anjak piutang yang buruk. Minoritas kecil menyadari mantra desain yang didorong oleh domain untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah di kemudian hari. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang. metrik yang paling banyak digunakan adalah kompleksitas, dari satu jenis atau lainnya, sementara dua metrik lainnya - kopel dan kohesi - sebagian besar diabaikan, bahkan jika mereka sangat penting untuk kode bersih. Aspek lain yang hampir semua orang abaikan adalah beban kognitif. Beberapa programmer menganggap tes unit sebagai dokumentasi, dan bahkan lebih sedikit yang menyadari bahwa sulit untuk menulis atau menyebutkan tes unit adalah bau kode lain, yang biasanya menunjukkan anjak piutang yang buruk. Minoritas kecil menyadari mantra desain yang didorong oleh domain untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah di kemudian hari. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang. sementara dua metrik lainnya - kopel dan kohesi - sebagian besar diabaikan, bahkan jika mereka sangat penting untuk kode bersih. Aspek lain yang hampir semua orang abaikan adalah beban kognitif. Beberapa programmer menganggap tes unit sebagai dokumentasi, dan bahkan lebih sedikit yang menyadari bahwa sulit untuk menulis atau menyebutkan tes unit adalah bau kode lain, yang biasanya menunjukkan anjak piutang yang buruk. Minoritas kecil menyadari mantra desain yang didorong oleh domain untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah di kemudian hari. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang. sementara dua metrik lainnya - kopel dan kohesi - sebagian besar diabaikan, bahkan jika mereka sangat penting untuk kode bersih. Aspek lain yang hampir semua orang abaikan adalah beban kognitif. Beberapa programmer menganggap tes unit sebagai dokumentasi, dan bahkan lebih sedikit yang menyadari bahwa sulit untuk menulis atau menyebutkan tes unit adalah bau kode lain, yang biasanya menunjukkan anjak piutang yang buruk. Minoritas kecil menyadari mantra desain yang didorong oleh domain untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah di kemudian hari. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang. Aspek lain yang hampir semua orang abaikan adalah beban kognitif. Beberapa programmer menganggap tes unit sebagai dokumentasi, dan bahkan lebih sedikit yang menyadari bahwa sulit untuk menulis atau menyebutkan tes unit adalah bau kode lain, yang biasanya menunjukkan anjak piutang yang buruk. Minoritas kecil menyadari mantra desain yang digerakkan oleh domain untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang. Aspek lain yang hampir semua orang abaikan adalah beban kognitif. Beberapa programmer menganggap tes unit sebagai dokumentasi, dan bahkan lebih sedikit yang menyadari bahwa sulit untuk menulis atau menyebutkan tes unit adalah bau kode lain, yang biasanya menunjukkan anjak piutang yang buruk. Minoritas kecil menyadari mantra desain yang digerakkan oleh domain untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang. Mantra untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang. Mantra untuk menjaga model kode dan model domain bisnis sedekat mungkin satu sama lain, karena perbedaan pasti akan menimbulkan masalah. Semua ini perlu dipertimbangkan, setiap saat, jika Anda ingin kode Anda bersih. Dan masih banyak lagi yang tidak dapat saya ingat sekarang.

Anda ingin menulis kode bersih? Tidak perlu sihir. Cukup pelajari semua yang diperlukan, lalu gunakan untuk menilai kebersihan kode Anda, dan lakukan refactor hingga Anda senang. Dan teruslah belajar - perangkat lunak masih merupakan bidang yang masih muda, dan wawasan serta pengetahuan baru diperoleh dengan cepat.

pengguna625488
sumber