Saya menderita krisis kepercayaan pada kemampuan saya sebagai programmer komputer.
Kemarin saya mencoba untuk membuat algoritma jalur terpendek saya sendiri untuk grafik dan setelah beberapa jam saya hanya menyerah dan mempelajari algoritma Dijkstra.
Apakah ini jenis hal yang harus dapat "diciptakan kembali" oleh programmer yang baik dalam beberapa jam atau apakah saya tidak realistis?
Oh well, setidaknya saya bisa menemukan kembali jenis gelembung: D
algorithms
Pemula Pemula
sumber
sumber
Jawaban:
Seorang programmer yang baik harus menyadari bahwa algoritma yang hebat telah ditulis untuk memecahkan masalah dan tidak membuang waktu untuk menemukan kembali roda.
Saya ragu Dijkstra menghasilkan algoritma jalur terpendek dalam beberapa jam, jadi sepertinya standar yang sangat tinggi untuk digunakan untuk menentukan apakah seseorang adalah 'programmer yang baik'
sumber
Pertama, Anda mungkin membingungkan pemrograman dengan ilmu komputer teoretis. Seorang programmer yang hebat membutuhkan dasar yang bagus dalam ilmu komputer tetapi dia tidak perlu menjadi fantastis. Dijkstra luar biasa dalam ilmu komputer.
Kedua, saya mengharapkan siapa pun dengan pemahaman grafik yang baik untuk mengembangkan grafik traversal mereka sendiri setelah berpikir sebentar. Tapi bukan algoritma jalur terpendek. Algoritma Dijkstra khususnya sangat canggih. Setelah Anda memahaminya, itu sangat jelas. Tetapi kebanyakan hal seperti itu.
Anda mungkin dapat memperoleh beberapa jenis algoritma jalur terpendek setelah mencoba beberapa hal dan memberikan ide beberapa saat. Tetapi jangan kecewa jika itu membutuhkan waktu berjam-jam, atau bahkan beberapa hari. Ini sepenuhnya OK dan normal.
(Peringatan: well, Anda harus bisa memaksa masalah dalam beberapa jam puncak, tetapi ini tidak akan menghasilkan algoritma yang bekerja bahkan pada grafik yang cukup kecil.)
sumber
Jelas tidak realistis. Orang tidak hanya "muncul" dengan algoritma dalam beberapa jam. Dibutuhkan banyak usaha dan kerja keras. Mengutip blog ini :
dan versi Bentley juga bermasalah ketika diimplementasikan untuk set besar.
Selain itu, seorang programmer yang baik tahu alat apa yang tersedia dan kapan harus menggunakan alat tersebut. Anda tidak mendapatkan poin ekstra untuk orisinalitas atau melakukan hal-hal berbeda - Anda ingin itu berfungsi dan bekerja dengan baik.
sumber
Sangat tidak mungkin Anda dapat menemukan solusi yang lebih baik daripada yang bisa Anda pilih.
Keluar dengan algoritma yang lebih baik daripada yang dianggap "yang terbaik" (dalam kasus Anda, yang terpendek) bukanlah sesuatu yang dapat dilakukan semua orang. Mungkin itu bahkan tidak mungkin.
Seorang programmer yang baik harus dapat memahami logika di balik algoritma, dan mengapa itu lebih baik atau lebih buruk (atau hanya tidak cukup untuk masalah khusus itu) daripada algoritma lain yang mencoba untuk memecahkan masalah yang sama.
(s) Ia harus juga dapat mengetahui apakah itu benar-benar cara terbaik untuk menyelesaikan masalah khusus itu.
Pokoknya jika Anda ingin berlatih, Anda masih bisa mencoba menulis implementasi algoritma pribadi Anda, mencoba menyelesaikan masalah menggunakan pikiran Anda. Ini mungkin bukan yang terbaik, tetapi ini adalah praktik yang baik untuk pemecahan masalah.
sumber
Ini mengingatkan saya pada sesuatu yang saya baca tentang perbedaan antara "rekayasa perangkat lunak" (apa yang saya sebut pemrograman) dan disiplin ilmu teknik lainnya. Kalau dipikir-pikir, saya pikir itu adalah buku Pola Desain asli. Saya yakin seseorang di sini dapat mengutipnya dari atas kepalanya.
Pokoknya, intinya (meskipun tidak sepenuhnya diarahkan pada desain algoritma) adalah bahwa disiplin ilmu teknik dikodifikasi; tidak ada insinyur sipil yang cenderung menghabiskan waktu untuk mencoba menemukan kembali berkas-I, tetapi pemrogram selalu melakukannya. Masalahnya (dan saya menyadari bahwa saya hanya menggemakan sentimen banyak orang) adalah bahwa perilaku ini boros dan rentan kesalahan, dan melayani ego lebih dari solusi.
Ilmu komputer membimbing saya ke pemrograman, dan saya suka keduanya. Namun, saya seorang programmer yang jauh lebih baik daripada ilmuwan komputer. Saya tidak akan pernah menuduh Anda tidak kompeten karena Anda tidak dapat menemukan kembali algoritma Dijkstra dalam satu sore. Saya akan mempertanyakan kompetensi Anda sebagai programmer jika Anda tidak dapat mengenali masalah yang dapat diselesaikan melalui algoritma grafik jalur terpendek.
Yang mengatakan, saya percaya bahwa berpikir tentang algoritma dan mencoba untuk merancang dan mengimplementasikan yang baru (berpotensi) menyenangkan dan (hampir) selalu instruktif. Saya hanya mencoba untuk memisahkan waktu CS saya dari waktu pemrograman saya. Untuk programmer, waktu kita (terutama yang dibayar) lebih baik dihabiskan untuk menyelesaikan masalah-masalah praktis daripada yang asbtract. Selain itu, waktu CS hampir selalu menghancurkan kepercayaan diri saya.
sumber
Anda tidak akan memperhatikan hal-hal yang sama seperti yang dilakukan orang lain. Saya pikir itu hanya fakta kehidupan yang harus kita jalani. Sebagian besar berasal dari pembelajaran pasif Anda dan model mental yang telah Anda kembangkan sebagai akibatnya.
Saya kenal beberapa programmer yang sangat cerdas dan kompeten yang harus diajarkan hukum DeMorgan di sekolah sebelum mereka bisa melakukannya secara konsisten. Saya kebetulan mengetahui Algoritma Dijkstra sendiri (dan saya harus mengakui bahwa saya sedikit bangga akan hal itu), tetapi butuh waktu yang sangat lama sampai saya bahkan bisa memahami semacam gelembung.
Lebih terkenal, Einstein, yang Anda pikir akan menjadi ahli dalam teori simpul, tidak bisa mengikat tali sepatu sendiri sampai dia berusia sekitar sepuluh tahun.
Kemungkinannya bagus bahwa Anda secara tidak sadar telah menemukan kembali banyak hal yang tidak akan pernah dipikirkan oleh banyak orang lain seandainya mereka tidak diajarkan secara eksplisit.
sumber
Saya mohon berbeda untuk apa yang sebagian besar jawaban katakan. Sementara saya tidak akan mengharapkan seorang programmer dari level mana pun untuk dapat muncul sendiri pada algoritma Dijkstra, saya pasti akan mengharapkan dia untuk datang dengan cara apa pun (efisien atau tidak) untuk menyelesaikan masalah.
Misalnya, Anda mengatakan sebagai komentar sampingan bahwa Anda dapat membuat semacam gelembung sendiri. Saya tahu ini adalah algoritma penyortiran yang paling sulit, tetapi Anda menemukan cara untuk memecahkan masalah, dan itulah yang saya harapkan para programmer dapat: menemukan cara untuk memecahkan masalah.
Tentu saja, menyelidiki dan menemukan solusi yang dilakukan oleh orang lain juga berhasil, tetapi hal yang paling ekstrem adalah seorang pria yang tidak memikirkan dirinya sendiri dan program-programnya merupakan ringkasan pencarian Google.
Saya pikir saya terdengar lebih keras daripada yang sebenarnya saya inginkan, tetapi poin saya adalah: Saya berharap seorang programmer cukup kreatif untuk menghasilkan solusi untuk suatu masalah, bahkan jika solusinya buggy atau berantakan.
Jadi, kembali ke kasus Anda, saya tidak berpikir Anda harus datang dengan algoritma Dijkstra, tetapi jika Anda memiliki kemampuan untuk menulis algoritma untuk mencoba beberapa kemungkinan dan menemukan jalur terpendek tanpa berakhir pada loop tak terbatas, maka Anda sudah mendapat persetujuan saya.
(BTW persetujuan saya diperhitungkan dalam urutan yang sama pentingnya dengan kupon cuci mobil gratis.)
sumber
Ya, dia harus.
Mungkin ini setara dengan moral bubble sort, tapi saya pikir seorang programmer yang baik harus bisa menghasilkan setidaknya sesuatu yang berfungsi, betapapun tidak efisiennya.
Tak perlu dikatakan, jika masalah tertentu akan muncul programmer yang baik pertama-tama akan melihat apakah ada perpustakaan untuk melakukannya untuknya, atau algoritma yang diterbitkan melakukan itu dan mudah diimplementasikan.
Tentu saja, banyak tugas pemrograman tidak terlalu sulit dan tidak semua orang harus mampu mengatasi masalah sulit seperti itu. Tetapi Anda ingin memiliki seseorang dengan pikiran seperti itu di tim Anda, karena Anda mungkin memiliki beberapa masalah spesifik proyek yang rumit di mana Anda tidak dapat mengandalkan banyak penelitian ilmiah sebelumnya.
sumber
Jangan khawatir
Sebagai seorang Programer Perl, saya hampir tidak pernah menemukan kembali roda. Itu adalah pekerjaan CPAN. Jika ada algoritma atau modul yang sederhana dan didukung dengan baik, kami menggunakannya. Jika tidak ada modul yang baik, maka kami menciptakan roda. Itu adalah salah satu hal terbesar tentang Perl.
Jadi yang saya katakan adalah ini:
sumber
Teori grafik, dan algoritma yang berlaku untuk itu, terlihat sederhana di permukaan tetapi umumnya jauh dari itu. Anda akan berpikir pembentukan grafik non-persimpangan (planar) sederhana, misalnya, pada pandangan pertama. Tahun lalu saya melihat secara luas masalah ini (planaritas melalui penghapusan subgraph Kuratowski). Saya dapat memberi tahu Anda, dari pengalaman itu, bahwa orang-orang yang menulis algoritma ini biasanya menghabiskan durasi studi PhD mereka, dan kadang-kadang penelitian itu dilakukan dalam tim. Dan sebagai peneliti , itulah satu-satunya fokus kerja mereka selama periode waktu itu. Tidak masuk akal untuk berpikir bahwa para insinyur di lapangan dapat mengharapkan hal yang sama. Seperti orang lain di sini katakan dengan benar, itu sangat jelas setelah solusinya ada di depan Anda. Sepertinya selalu begitu!
sumber
Saya akan mengatakan bahwa jika Anda dapat menemukan algoritma untuk masalah terkenal seperti Shortest Path sendiri, Anda menjadi programmer yang buruk .
Itu berarti Anda mengabaikan sejarah pada masalah Shortest Path , pergi dari algoritma O (| V | ^ 4) yang diterbitkan pada tahun 1955 ke algoritma O (E + V log V) yang diterbitkan pada tahun 1984 (yang merupakan Dijkstra's algoritma dengan pohon Fibonacci). Anda hampir dijamin melakukan lebih buruk daripada algoritma yang telah dirancang. Lebih buruk lagi, ada kemungkinan besar algoritma Anda memiliki kesenjangan atau kesalahan sehingga membuatnya salah. Selain itu, Anda hampir pasti akan menghabiskan lebih banyak waktu memikirkan algoritma Anda, mengimplementasikannya dan mengujinya daripada waktu yang diperlukan untuk menggunakan kembali algoritma yang ada.
Serahkan desain algoritme kepada desainer algoritme. Programmer adalah konsumen dari hasil mereka. Pemrogram menggabungkan algoritma dan membuatnya bekerja pada tugas-tugas dunia nyata. Seorang perwira polisi tidak perlu dapat menemukan kembali hukum untuk dapat bekerja, atau menjadi petugas yang baik.
Saya bahkan mendorong Anda untuk menggunakan implementasi yang dibuat oleh para ahli daripada mengimplementasikan sendiri algoritma untuk algoritma yang cukup rumit. Ini lebih cenderung benar, kemungkinan mereka membuatnya lebih cepat daripada yang pernah Anda lakukan dan itu menghemat banyak waktu. Ini terutama berlaku untuk algoritma kriptografi, karena Anda mendapatkan permintaan keamanan tambahan, yang biasanya hanya disediakan oleh para ahli.
sumber