Mengapa lebih baik bagi seorang programmer untuk merancang algoritma sebelum mulai menulis kode?

12

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?

Jervis
sumber
5
Menurut definisi ada beberapa algoritma, bahkan jika itu sangat buruk itu bagus .
5
Saya tidak punya pilihan selain menumbuk kode daripada berpikir terlalu banyak. Sebagian besar waktu tidak ada algoritma yang mulia menurut standar apa pun; Saya hanya mencoba untuk memoles kotoran busuk;)
Ayub
13
Saya tidak percaya ini pertanyaan serius. Lihat en.wikipedia.org/wiki/Algorithm
Steven A. Lowe
2
Judulnya masuk akal, tetapi teks pertanyaannya kurang begitu. Saya pikir dia bertanya apakah algoritma harus dipaku sebelum seseorang dapat mulai menulis kode aktual.
Greg
9
Saya katakan tidak ... itu selalu lebih baik untuk berkeliling tanpa tujuan sampai Anda menemukan tujuan Anda secara tidak sengaja atau kehabisan bensin.
jmq

Jawaban:

29

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.

Péter Török
sumber
1
Jawaban yang sangat bagus. Merupakan kehormatan bagi saya untuk membawa Anda ke sini !!!
Jervis
5
Komputer juga jauh lebih mahal daripada programmer, jadi masuk akal untuk membuat programmer bekerja lebih keras!
2
Anda benar bahwa apa yang kami optimalkan telah berubah. Tetapi kita sekarang diharapkan untuk memanipulasi sistem yang jauh lebih kompleks daripada yang dilakukan orang pada saat itu. Kurangnya pemikiran tentang perencanaan, organisasi dan pemeliharaan masih akan membunuh Anda.
btilly
1
@ btilly, saya setuju bahwa sangat penting untuk merencanakan ke depan (sebanyak mungkin - tetapi tidak lebih) dan untuk memikirkan pemeliharaan di muka. Namun, ini tidak berarti menghabiskan banyak waktu pada desain algoritma. Misal, jika suatu fungsi dijalankan sebulan sekali dan membutuhkan waktu satu jam untuk menyelesaikannya, mungkin perlu kerja keras menghabiskan waktu berhari-hari untuk penyetelan algoritma, bahkan jika Anda berhasil menurunkan waktu eksekusi menjadi 10 menit. Manfaatnya tidak akan membenarkan biaya.
Péter Török
2
Dua hal: Pertama, algoritme dapat menentukan seberapa baik skala program, dan itu sering kali penting. Kedua, banyak perangkat lunak yang dijalankan secara paralel pada server saat ini. Itu berarti, jika program Z dimodifikasi untuk berjalan dua kali lebih cepat, siapa pun yang menjalankannya, membutuhkan setengah dari banyak server Z.
David Thornley
14

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.

Goran Jovic
sumber
Ada banyak cara penyajian algoritma seseorang, yang Anda rekomendasikan? Dan mengapa?
Jervis
@ Jervis: Lihat pembaruan saya, saya mencantumkan beberapa di antaranya.
Goran Jovic
Di mana tautannya?
Jervis
4

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.

Zachary K
sumber
Algoritma = ide ???
Jervis
Algoritma == resep !!
Tetapi koki yang berbeda memiliki cara memasak yang berbeda sesuai dengan resep yang sama.
Jervis
Tentu, ketika saya memanggang roti itu keluar berbeda dari ketika istri saya membuat roti. Tetapi bagian dasarnya sama (tepung, air, ragi, garam)
Zachary K
juga ada toko - toko di mana Anda bisa membeli roti yang dibuat oleh tukang roti profesional
jk.
3

Kode mengimplementasikan algoritma. Mencoba menulis kode tanpa mendesain algoritme seperti mencoba mengecat rumah sebelum dinding dibangun. Algoritma telah menjadi "HARUS" sejak awal pemrograman.

Jerry Coffin
sumber
BAIK. Melukis rumah semudah ABC, Anda bisa mulai merencanakan tanpa keberadaan rumah.
Jervis
2
@ Jervis: Demikian juga, Anda dapat merencanakan beberapa bagian kode tanpa menentukan algoritme untuk bagian lain (misalnya, Anda dapat memutuskan akan ada fungsi untuk mengurutkan data tanpa memutuskan bagaimana itu akan bekerja - tetapi Anda perlu memutuskan pada saat Anda tulis kode penyortiran).
Jerry Coffin
1
Saya lebih suka analogi melukis gambar daripada melukis rumah. Jika semua kode saya seperti mengecat rumah, saya akan mencari pekerjaan lain. Dan melukis gambar bisa berulang. Saya sering mulai membuat prototipe dalam kode nyata sebelum algoritme benar-benar jelas bagi saya. Paling sering, pada kenyataannya.
Greg
3

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.

Nikita Rybak
sumber
1

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.

Richard Miskin
sumber
1

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

btilly
sumber
Anda benar sekali.
Jervis
1

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.

Omega Centauri
sumber
Saya setuju dengan kamu.
Jervis
Anda berbicara di sini tentang perbedaan antara desain top-down dan bottom-up, yang merupakan masalah yang berbeda. Saat Anda "bajak", Anda masih menerapkan semacam algoritma. Anda mungkin tidak memikirkannya dalam istilah-istilah itu, mungkin karena algoritme tersebut tampak jelas bagi Anda atau karena Anda sudah sangat terbiasa dengan masalahnya, tetapi itu tidak berarti bahwa algoritme tersebut masih belum ada.
Caleb
0

Rancang algoritme dalam bagian, lalu bagi bagian itu dan beri kode masing-masing secara terpisah. Dengan begitu Anda dapat menggabungkan kedua sudut pandang:

  1. Gunakan kemampuan bahasa Anda untuk membuat algorthm berfungsi
  2. Cobalah untuk berpikir sebelum kode, jadi ide Anda jangan bergabung dengan bahasa (suatu hari Anda perlu memindahkan algoritma Anda ke bahasa lain dan Anda akan berakhir dalam spagetthi)
guiman
sumber
Menyalak! Saya tahu algoritma itu tidak tergantung bahasa. Memang benar bahwa Anda dapat menggunakan bahasa pemrograman apa pun yang ada untuk mengekspresikan algoritma yang sama.
Jervis
0

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.

kevin cline
sumber
0

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.

occulus
sumber
0

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 algoritma yang tepat benar-benar membantu meningkatkan kualitas dan pada akhirnya efisiensi suatu program?

Apakah rencana / skema bangunan yang tepat membantu membangun rumah berkualitas secara efisien?

Bisakah kita tetap menghasilkan program berkualitas baik tanpa algoritma?

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.

Apakah algoritma yang tepat WAJIB dalam pemrograman modern?

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.

luis.espinal
sumber
-2

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

Casimir Pohjanraito
sumber