Apakah algoritma yang tepat benar-benar membantu meningkatkan kualitas dan pada akhirnya efisiensi suatu program?
Bisakah kita tetap menghasilkan program berkualitas baik tanpa algoritma?
Apakah algoritma yang tepat WAJIB dalam pemrograman modern?
algorithms
Jervis
sumber
sumber
Jawaban:
Saya pikir pertanyaan ini memunculkan beberapa perspektif historis.
Kembali pada "masa lalu" (di mana saya bukan saksi pribadi, jadi ini hanya rekonstruksi saya pada era itu - jangan ragu untuk mengoreksi saya jika Anda mengalami hal-hal yang berbeda) ruang dan kinerja HW nihil dibandingkan dengan hari ini. Jadi semua yang ditulis orang harus sangat efisien. Oleh karena itu mereka perlu banyak memikirkan dan meneliti untuk menemukan algoritma terbaik untuk mencapai kinerja ruang / waktu yang dibutuhkan untuk menyelesaikan pekerjaan. Faktor lain dalam hal ini adalah bahwa kebanyakan pengembang mengerjakan apa yang Anda sebut infrastruktur : sistem operasi, tumpukan protokol, kompiler, driver perangkat, editor, dll. Semua ini banyak digunakan oleh banyak orang, sehingga kinerja benar-benar membuat perbedaan. .
Saat ini kita dimanjakan memiliki HW yang luar biasa dengan prosesor multicore dan memori Gigabytes bahkan di laptop dasar (heck, bahkan di ponsel). Yang secara alami berarti bahwa dalam banyak kasus, kinerja - dengan demikian algoritma - tidak lagi menjadi masalah utama, dan lebih penting untuk memberikan solusi cepat daripada memberikan solusi cepat. OTOH kami memiliki banyak kerangka kerja yang membantu kami memecahkan masalah, dan merangkum sejumlah besar algoritma pada saat yang bersamaan. Jadi bahkan ketika kita tidak memikirkan algoritma, kita mungkin menggunakan banyak dari mereka di latar belakang.
Namun, masih ada area di mana kinerja penting. Di area ini Anda masih perlu banyak berpikir tentang algoritma Anda sebelum menulis kode. Alasannya adalah bahwa algoritma adalah pusat dari desain, menentukan banyak struktur data dan hubungan dalam kode di sekitarnya. Dan jika Anda mengetahui terlambat bahwa algoritma Anda tidak scaling dengan baik (misalnya O (n 3 ) sehingga terlihat bagus dan cepat ketika Anda mengujinya pada 10 item, tetapi dalam kehidupan nyata Anda akan memiliki jutaan), itu sangat sulit, rawan kesalahan dan memakan waktu untuk menggantinya dalam kode produksi. Dan optimasi mikro tidak akan membantu Anda jika algoritma fundamental tidak tepat untuk pekerjaan itu.
sumber
Hanya untuk menunjukkan sesuatu:
Algoritme itu sendiri merupakan solusi umum langkah demi langkah untuk masalah Anda. Jadi, jika Anda memecahkan masalah, Anda memang menggunakan algoritma.
Poin terpenting di sini adalah Anda harus menggunakan algoritme untuk menyelesaikan masalah, dengan satu atau lain cara. Sebagian besar waktu lebih baik untuk memikirkan masalah Anda sebelum Anda beralih ke pengkodean - fase ini sering disebut desain. Tetapi, seberapa banyak dan bagaimana Anda akan melakukan ini tergantung pada Anda.
Juga, Anda tidak harus mencampur konsep algoritma dengan diagram alur (saya kira ini terjadi di sini). Diagram alir hanyalah satu representasi grafis yang dapat digunakan dan digunakan di masa lalu untuk menggambarkan suatu algoritma. Ini cukup banyak usang saat ini.
EDIT:
Memang ada banyak cara untuk mewakili suatu algoritma dan kode bahasa pemrograman itu sendiri adalah salah satunya. Namun, sering kali lebih baik atau lebih mudah untuk tidak menyelesaikan seluruh masalah sekaligus tetapi hanya garis besar dan kemudian mengisi kekosongan saat Anda pergi.
Favorit pribadi saya di sini adalah kode pseudo, dan hanya untuk mencakup garis besar abstrak umum dari algoritma yang bersangkutan - konyol untuk masuk ke rincian dengan pseudocode , itulah gunanya kode sebenarnya.
Tetapi kode nyata dapat digunakan untuk garis besar. Sebagai contoh, orang-orang TDD suka merancang algoritma ketika mereka kode, dan karena mereka tidak dapat menyelesaikan semuanya sekaligus, mereka merancang garis besar pelaksanaan program dalam kode nyata, dan menggunakan objek tiruan (atau fungsi, metode .. .) sebagai blanko untuk diisi nanti.
Diagram Aktivitas UML tampaknya merupakan inkarnasi modern dari diagram alur gaya lama dengan notasi tambahan untuk hal-hal baru seperti polimorfisme dan multithreading. Saya tidak bisa mengatakan betapa bergunanya ini, karena saya tidak terlalu menggunakannya - saya hanya menyebutkannya untuk kelengkapan.
Juga, jika Anda mendasarkan algoritma Anda pada peralihan antar negara, maka diagram keadaan cukup membantu.
Secara umum, apa pun artinya Anda harus membuat sketsa ide di balik algoritma tertentu adalah cara yang baik untuk melakukannya.
sumber
Analogi yang baik adalah Anda harus tahu resep sebelum mulai memasak. Oke, Anda dapat mengubahnya saat Anda mulai, tetapi Anda masih perlu tahu apa yang ingin Anda buat sebelum mulai. Jika saya ingin membuat daging domba rebus, saya akan melakukan hal-hal yang sangat berbeda daripada jika saya ingin membuat roti.
sumber
Kode mengimplementasikan algoritma. Mencoba menulis kode tanpa mendesain algoritme seperti mencoba mengecat rumah sebelum dinding dibangun. Algoritma telah menjadi "HARUS" sejak awal pemrograman.
sumber
Fasih berbahasa Anda membantu meningkatkan kualitas dan produktivitas. Dan memecahkan masalah algoritmik kecil jauh lebih berguna untuk itu daripada mengulangi hal-hal MVC yang sama 100 kali.
Meskipun, saya kira ada cara lain untuk mencapai kefasihan.
Apakah algoritma akan menjadi HARUS dalam domain pemrograman modern?
Ini sudah menjadi 'keharusan', kecuali Anda seorang 'php ninja' menulis 'cool codez'. Semua perusahaan 'terbaik' (Google, Amazon, dll) menguji pengalaman algoritmik Anda dalam wawancara, dan saya pikir mereka tidak akan melakukannya tanpa alasan.
Tetapi kembali ke titik semula, Anda harus terus-menerus menantang diri sendiri jika Anda ingin meningkat. Dan karena pekerjaan normal (alias "sekarang menulis manajer CRUD untuk 100 objek lebih") tidak selalu memberikan tantangan yang baik, algoritma mengompensasi itu.
sumber
Saya akan mengatakan Anda memerlukan setidaknya ide awal dari suatu algoritma sebelum Anda mulai coding. Anda kemungkinan akan merevisi ide Anda sambil melakukan koding berdasarkan struktur data dll.
Kemudian, Anda dapat merevisi kode lagi jika profil menunjukkan bahwa ada masalah kinerja di area itu.
sumber
Alasannya adalah bahwa lebih cepat untuk memperbaiki kesalahan sebelum Anda menulis kode yang salah.
Lebih prosaically, secara rutin diukur 10 hingga 1 perbedaan produktivitas antara programmer yang berbeda. Ketika Anda melihat programmer yang berada pada tingkat produktivitas 10 kali lipat, mereka menghabiskan terkecil sebagian kecil dari waktu mereka benar-benar coding. Waktu untuk mengetik kode tidak boleh menjadi hambatan. Sebaliknya mereka menghabiskan sebagian besar waktu mereka untuk memastikan mereka memiliki persyaratan yang lurus, perencanaan, pengujian, dll.
Sebaliknya ketika Anda melihat programmer yang menyelam ke dalam pengkodean tanpa jeda, mereka pasti harus menulis kode berulang kali karena mereka menghadapi masalah yang sama sekali dapat diprediksi, dan hasil akhirnya kurang dapat dipertahankan dan lebih bermasalah. (Kebetulan Anda memang tahu bahwa rata-rata 80% dari uang yang dihabiskan untuk pengembangan perangkat lunak berada dalam tahap pemeliharaan? Membuat hal-hal menjadi hal yang dapat dipertahankan. Banyak.)
sumber
Umumnya algoritma dan struktur data pertama, kode kemudian. Tetapi itu sangat tergantung pada domain pemrograman. Saya biasa melakukan banyak hal matematika tipe terapan, dan benar-benar melihat ke bawah pada model air terjun yang lazim itu. Itu karena algoritma level rendah ke sedang jarang bisa diterima begitu saja. Rancang struktur besar di sekitar keberadaan subsistem tidak tertulis, kemudian temukan di akhir permainan bahwa matematika untuk salah satu subsistem penting itu tidak berhasil (tidak stabil atau apa pun). Jadi saya selalu memikirkan subsistem yang paling menantang terlebih dahulu, dan jika ada alasan untuk ragu, saya menulis dan menguji unit yang pertama. Tapi, untuk beberapa domain bermasalah, Anda bisa terus maju tanpa banyak perencanaan.
sumber
Rancang algoritme dalam bagian, lalu bagi bagian itu dan beri kode masing-masing secara terpisah. Dengan begitu Anda dapat menggabungkan kedua sudut pandang:
sumber
Bagi saya, hampir semua kode. Saya pikir itu berlaku untuk kebanyakan programmer yang sangat produktif. Saya dapat menulis kode semudah saya menulis teks.
Sebisa mungkin, saya mencoba menangkap persyaratan sebagai tes yang dapat dieksekusi (kode). Desain hanyalah pengkodean tingkat tinggi. Lebih cepat dan lebih tepat untuk menangkap desain dalam bahasa target daripada menangkapnya dalam beberapa bentuk lain dan kemudian menerjemahkannya.
Saya telah menemukan bahwa sebagian besar pengguna tidak dapat meninjau persyaratan tekstual secara efektif. Mereka melakukan OK dengan kasus penggunaan berurutan, tetapi kasus penggunaan tidak dapat menangkap setiap aspek dari UI. Yang terbaik sejauh ini adalah mengambil langkah pertama pada implementasi, membiarkan pengguna mencobanya, mendapatkan komentar mereka, dan memodifikasi kodenya.
sumber
Ketika Anda duduk dan mulai coding, Anda memiliki algoritma dalam pikiran, apakah "dirancang" atau tidak.
Jika Anda duduk dan memulai pengkodean tanpa memikirkan algoritma yang lengkap, Anda akan melakukan salah satu dari yang berikut:
1) kunci tumbuk secara acak. Ini mungkin akan menghasilkan kesalahan kompiler
2) menulis kode yang dapat dikompilasi yang mungkin melakukan apa pun kecuali hal yang Anda inginkan
3) menulis kode untuk memecahkan bagian kecil dari masalah, dan membangunnya saat Anda melakukan agregasi, tetapi tidak benar-benar berpikir ke depan - sehingga akhirnya masalah terpecahkan - tetapi kode tidak dengan cara yang sangat efisien, dan dengan kemungkinan harus mundur dan membuang waktu di sepanjang jalan
Jadi orang biasanya memprogram dengan algoritma di kepala mereka. Mungkin telah disempurnakan atau beralasan di atas kertas atau media lain.
Ini bisa menjadi disiplin yang baik untuk memikirkan serangan Anda pada masalah yang jauh dari keyboard, terutama pada hari-hari awal Anda sebagai seorang programmer. Seperti yang dicatat oleh jawaban lain, saat Anda semakin berpengalaman, Anda bisa menjadi lebih baik dalam mengkodekan beberapa masalah yang lebih mudah ditangani "on the fly". Namun, untuk masalah yang sulit atau besar, berpikir dan mendesain jauh dari keyboard berguna: ketika terlibat dengan kode, Anda lebih cenderung berpikir dalam hal konstruksi bahasa, dan dalam cara mendekati tugas yang paling cepat dalam masalah. Sedangkan berpikir tentang masalah dengan, katakanlah, pena dan kertas, membebaskan Anda lebih banyak dari aspek bahasa kode dan memungkinkan Anda berpikir pada tingkat abstrak yang lebih tinggi.
sumber
Anda harus berhenti memandang konstruksi perangkat lunak sebagai sesuatu yang fundamental dari konstruksi hal lain yang bernilai. Bukan itu. Jadi, seperti hal lain, rencana atau desain yang dipikirkan dengan matang, betapapun saksama, selalu dibutuhkan.
Apakah rencana / skema bangunan yang tepat membantu membangun rumah berkualitas secara efisien?
Bisakah Anda membangun rumah berkualitas baik secara efisien tanpa rencana bangunan yang sesuai? Sesuai dengan Teorema Monyet Tak Terbatas , secara probabilistik, ya (seperti sejuta monyet yang mengetik secara acak untuk selamanya, akhirnya akan mengetik karya Shakespeare yang lengkap.
Jika Anda tidak ingin menjadi kode monyet dan Anda ingin memastikan Anda tidak memberikan perangkat lunak yang terlihat dan berfungsi seperti sampah, ya, itu adalah suatu keharusan. Setiap proyek yang harus saya selamatkan (karena kode itu terlihat seperti masalah yang dapat dipertahankan) selalu dimulai dengan jawaban negatif untuk pertanyaan itu.
Bahkan, pemrograman modern telah pindah dari insinyur perangkat lunak pemrograman koboi di mana perencanaan semacam jika harus.
Bahkan ketika Anda memiliki perpustakaan algoritma dan struktur data yang Anda inginkan (. Yaitu. Meningkatkan dalam C ++ atau perpustakaan koleksi Java), Anda harus tahu bagaimana hal itu bekerja untuk menggunakannya secara tepat, dan untuk menyusunnya menjadi masuk akal, lebih tinggi- algoritma level.
sumber
Itu tidak lebih baik. Lebih baik tidak "merancang" apa pun. Itu untuk orang yang tidak menulis program. Anda tahu, orang-orang dengan pengalaman nyata dari masalah yang dihadapi. Jika Anda seorang ahli matematika, insinyur, atau ahli logistik, Anda harus mengerjakan proses di tempat lain. Tapi itu bukan 'pemrograman'.
Letakkan beberapa jenis tes dan patokan di tempat pertama.
Kemudian tulis sesuatu, apa saja. Lakukan refactor-menulis ulang -Lalu sampai Anda kehabisan waktu atau tidak dapat lagi meningkatkan.
Sementara banyak orang berpikir bahwa seseorang dapat melakukan sesuatu dengan komputer tanpa benar-benar melakukan sesuatu pada komputer, saya pikir ini adalah salah satu mitos paling umum di luar sana. Astronotisme arsitektur.
Juga, Anda tidak dapat mengoptimalkan algo Anda sebelum ditulis.
TKI, "tetaplah dekat dengan logam".
sumber