Ketika Murray Gell-Mann ditanya bagaimana Richard Feynman berhasil menyelesaikan begitu banyak masalah sulit, Gell-Mann menjawab bahwa Feynman memiliki algoritma:
- Tuliskan masalahnya.
- Berpikir sangat keras.
- 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?
sumber
Jawaban:
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.
sumber
"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.
sumber
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,
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.
sumber
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. . .
sumber
Biarkan saya membuat sketsa algoritma pribadi saya untuk menangani kompleksitas yang tidak disengaja.
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.
sumber
Kompleksitas Terkadang
Pertanyaan aslinya (diparafrasekan) adalah:
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:
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.
sumber
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.
sumber