Apakah umum untuk tidak menggunakan perpustakaan untuk algoritma numerik standar, dan mengapa?


Banyak algoritma numerik (integrasi, diferensiasi, interpolasi, fungsi khusus, dll.) Tersedia di perpustakaan perhitungan ilmiah seperti GSL . Tapi saya sering melihat kode dengan implementasi "linting" dari fungsi-fungsi ini. Untuk program-program kecil yang tidak dimaksudkan untuk distribusi publik, apakah merupakan praktik yang umum di antara para ilmuwan komputasi untuk hanya mengimplementasikan algoritma numerik sendiri (maksud saya menyalin atau menyalin dari situs web, Resep Numerik, atau serupa) ketika Anda membutuhkannya? Jika demikian, apakah ada alasan khusus untuk menghindari tautan ke sesuatu seperti GSL, atau hanya "tradisi" daripada yang lainnya?

Saya bertanya karena saya penggemar penggunaan kembali kode , yang akan menyarankan saya harus mencoba menggunakan implementasi yang ada bila memungkinkan. Tapi saya ingin tahu apakah ada alasan bahwa prinsip kurang berharga dalam perhitungan ilmiah daripada dalam pemrograman umum.


Lupa menyebutkan: Saya secara khusus bertanya tentang C dan C ++, yang bertentangan dengan bahasa seperti Python di mana ada manfaat yang jelas (kecepatan eksekusi) untuk menggunakan perpustakaan.


14
Di satu sisi, Anda tidak ingin menemukan kembali roda. Di sisi lain, cara terbaik untuk memahami suatu algoritma (dan dengan ekstensi, dengan mudah mendiagnosis kasus-kasus di mana algoritma gagal secara spektakuler) adalah mencoba mengkodekan suatu implementasi sendiri.
JM

2
Apakah Anda menegur setiap teorema yang Anda temui? Mungkin Anda mencobanya dan bermain-main dengan beberapa kasing bayi, tetapi kecuali itu adalah fokus penelitian Anda, Anda mungkin menerimanya dan melanjutkan kehidupan.
dls

3
Fisikawan bukan pemrogram dan mereka tidak terbiasa berurusan dengan kode orang lain (membacanya atau memperbaikinya). Ketika mereka harus menggunakan kode orang lain, sering kali kode itu tidak ditulis dengan sangat baik atau komentar yang ditulis dengan baik oleh fisikawan lain, sekali lagi menambah gagasan bahwa lebih baik menulis ulang daripada menggunakannya kembali. Ini benar setidaknya di beberapa bidang / komunitas, tetapi sikap berubah di antara orang-orang muda. Namun tidak semuanya buruk, pikirkan sikap siswa CS yang buruk yang tidak dapat melakukan sesuatu jika dia tidak dapat menemukan perpustakaan yang cukup mudah untuk itu.
Szabolcs

Jawaban:


Saya biasa mengimplementasikan semuanya sendiri, tetapi akhir-akhir ini sudah mulai menggunakan perpustakaan lebih banyak. Saya pikir ada beberapa keuntungan yang sangat penting dari menggunakan perpustakaan, di luar masalah apakah Anda harus menulis rutin sendiri atau tidak. Jika Anda menggunakan perpustakaan, Anda dapatkan

  • Kode yang telah diuji oleh ratusan / ribuan / lebih pengguna
  • Kode yang akan terus diperbarui dan ditingkatkan di masa depan, tanpa ada pekerjaan di pihak Anda
  • Kode yang dioptimalkan lebih efisien dan mungkin lebih terukur daripada apa yang akan Anda tulis dalam upaya pertama
  • Bergantung pada pustaka, dengan membuat antarmuka ke dalamnya dalam kode Anda, Anda mungkin mendapatkan akses ke banyak algoritma yang saat ini tidak Anda gunakan tetapi mungkin ingin di masa depan

Pada poin terakhir di atas, saya memikirkan perpustakaan besar seperti Trilinos atau PETSc . Saya bisa memperkuat ini dengan beberapa contoh pribadi nyata dalam pengembangan PyClaw . Meskipun akan mudah untuk menyejajarkan Clawpack dengan panggilan MPI, kami memilih untuk menggunakan PETSc. Ini memungkinkan kami untuk membatasi kode paralle dalam paket menjadi kurang dari 300 baris Python, tetapi lebih baik lagi, dengan meletakkan data kami dalam format PETSc, kami memperoleh akses langsung ke pemecah implisit PETSc, memungkinkan pekerjaan saat ini pada pemecah implisit di PyClaw. Sebagai contoh kedua, PyClaw awalnya memasukkan kode tangan rekonstruksi WENO orde lima, tetapi kami akhirnya memutuskan untuk mengandalkan PyWENOpaket untuk ini. Ini adalah keuntungan besar, karena PyWENO dapat secara otomatis menghasilkan rutinitas WENO dari berbagai pesanan dalam beberapa bahasa.

Terakhir, jika Anda menggunakan pustaka, Anda dapat berkontribusi kembali dengan mengembangkan perbaikan atau menemukan bug, yang akan menguntungkan banyak orang lain, sedangkan men-debug atau meningkatkan kode Anda sendiri hanya menguntungkan Anda.


5
"Anda dapat berkontribusi kembali dengan mengembangkan perbaikan atau menemukan bug, yang akan bermanfaat bagi banyak orang." - Itu akan memuaskan keinginan "bermain-main / belajar" dan kemalasan (tidak harus melakukan hal-hal yang sudah dilakukan). :)
JM

1
Lihat juga, tepi kasus. Untuk banyak algoritma, hal ini sepele untuk mengimplementasikan sesuatu yang "berfungsi", tetapi tidak akan menangani beberapa sub-bagian kecil dari kasus dengan benar. Ini mungkin baik untuk proyek kecil 1 kali, tetapi saya tidak dapat menghitung berapa kali saya tersangkut oleh kondisi patologis pada sesuatu yang saya "optimalkan" sendiri.
meawoppl

Ada overhead programmer besar yang terlibat dalam menghubungkan ke fungsi perpustakaan, terutama jika perpustakaan itu baru bagi programmer. Seringkali lebih sederhana untuk hanya menulis ulang algoritma sederhana daripada mencari tahu spesifik dari perpustakaan tertentu. Ketika algoritme menjadi lebih kompleks perilaku ini beralih.

Python telah unggul dalam mengurangi overhead ini dengan alat-alat seperti pip / easy_install dan antarmuka struktur data yang seragam (yaitu setiap perpustakaan tampaknya mengambil dan menghasilkan array numpy).


Salah satu proyek yang saya terlibat saat ini adalah menulis paket simulasi dan analisis yang fleksibel untuk kelas detektor fisika partikel. Salah satu tujuan dari proyek ini adalah untuk memberikan yang basis kode yang akan digunakan dalam hal-hal ini selama beberapa dekade yang akan datang.

Pada titik ini, kami sudah memiliki dua lusin dependensi, membuat proses pembangunan menjadi mimpi buruk sehingga telah memutar proyek terpisah yang dikelola dari pusat komputasi Fermilab hanya untuk menyediakan rantai alat yang andal.

Sekarang bayangkan Anda menemukan kebutuhan untuk beberapa alat yang tidak ada dalam rantai-alat itu (terjadi pada saya bulan lalu). Anda punya tiga pilihan

  1. Gulung milikmu. Dengan semua risiko dan kerepotan yang melibatkan.
  2. Mengikis beberapa kode dari perpustakaan di suatu tempat dan memasukkannya ke dalam Proyek. Berarti Anda harus melakukan pemeliharaan ke depan, dan Anda harus memahami kode orang lain ketika itu terjadi.
  3. Pergi ke orang-orang yang memelihara rantai-alat, minta mereka untuk apa yang Anda butuhkan dan kemudian tunggu siklus rilis untuk mendapatkannya. Orang-orang ini cukup responsif, tetapi Anda harus membuat kasus untuk itu tanpa kode kerja atau setelah Anda selesai (1) atau (2).

Sangat mudah untuk memilih (1). Mungkin terlalu mudah.


Ya, menambahkan dependensi adalah kelemahan signifikan menggunakan perpustakaan.
David Ketcheson

Ketergantungan adalah kelemahan besar dalam pikiran saya juga
Fomite

2
Mungkin saja jawaban saya terlalu menekankan fakta dependensi, dan tidak cukup pada proses birokrasi untuk mendapatkan dependensi yang disetujui dan dipasang di proyek-proyek besar.
dmckee

* poin 3. Anda (maaf untuk nitpick.)
299792458

Er ... tidak. Itu mengatakan apa yang saya maksud.
dmckee

Saya pikir itu adalah sangat umum, dengan beberapa algoritma lebih mungkin kembali dilaksanakan daripada yang lain.

Ada trade-off yang rumit antara betapa menjengkelkannya sebuah perpustakaan untuk diinstal, betapa sulitnya untuk mengimplementasikan algoritma sendiri, seberapa sulit untuk mengoptimalkannya, dan seberapa baik perpustakaan sesuai dengan kebutuhan Anda. Juga, kadang-kadang menggunakan perpustakaan hanya berlebihan: Saya menggunakan algoritma pembelahan dua lambat di salah satu program saya karena saya menyebutnya hanya beberapa kali dan saya tidak ingin menambahkan perpustakaan hanya untuk itu.

Apakah mudah bagi Anda untuk menulis versi yang dioptimalkan dengan baik? Jika ya, Anda mungkin lebih baik melakukannya. Anda akan mendapatkan apa yang Anda butuhkan dan Anda tidak akan bergantung pada pekerjaan siapa pun. Tapi tentu saja Anda benar-benar perlu tahu apa yang Anda lakukan: bahkan algoritma sederhana pun bisa sulit untuk diterapkan.

Saya ingin tahu melihat studi tentang ini, tetapi dari perspektif bias saya, para ilmuwan sering menggunakan perpustakaan untuk aljabar linier dan generator angka acak, dengan sebagian besar kode yang tersisa dibuat di rumah.


12
"Tapi tentu saja Anda benar-benar perlu tahu apa yang Anda lakukan: bahkan algoritma sederhana pun bisa sulit diterapkan." - ini tidak bisa ditekankan cukup.
JM

Saya pikir menerapkan algoritma alih-alih menggunakan perpustakaan terkadang dapat memberikan pemahaman dan kontrol model yang lebih baik. Ketika saya mengkode beberapa program untuk perhitungan ilmiah, penting bagi saya untuk memahami apa yang saya lakukan. Menerapkan algoritma penting membantu saya mendapatkan pengetahuan yang lebih baik tentang masalah dan mencapai kontrol yang lebih baik.

Di sisi lain, kadang-kadang bukan tugas sepele untuk memilih perpustakaan yang diperlukan untuk mendapatkan solusi, jadi lebih baik untuk mencari algoritma yang sudah diterapkan ketika Anda yakin apa yang ingin Anda capai dan mengapa Anda menginginkannya.

Jika algoritme itu kompleks, maka mengkodekannya dengan tangan memberi Anda peluang untuk meningkatkan kinerja / kualitas solusi menggunakan fitur spesifik tugas. Dan kadang-kadang perlu untuk mengubah algoritma sedikit, yang lebih mudah jika Anda tahu kode yang Anda tulis dan Anda dapat mengeditnya dengan cara yang Anda inginkan.


1
+1 untuk meningkatkan pemahaman. Meskipun ini lebih merupakan masalah untuk algoritme Anda sendiri yang untuk rutin perpustakaan.
Faheem Mitha

Salah satu jawabannya adalah ada begitu banyak variasi kecil pada kode numerik sehingga sangat sulit untuk merangkumnya di perpustakaan. Ambil ini dibandingkan dengan perangkat lunak web, yang sering kali mudah dipasang dan memiliki serangkaian input dan output yang jelas. Saya pikir yang lebih umum adalah orang-orang mengambil kerangka kerja, atau perpustakaan besar yang bertindak seperti kerangka kerja (Trilinos / PETSc), dan menggunakan ekosistem itu untuk mendapatkan manfaat menggunakan kode komunitas.


Sebelum memutuskan apakah akan menggunakan perpustakaan atau tidak, saya pikir Anda juga ingin mengetahui seberapa banyak penggunaan perpustakaan akan membantu kode Anda. Jika Anda akan menggunakan pustaka yang dioptimalkan dengan baik untuk kernel komputasi utama, maka itu mungkin jauh lebih efisien daripada mencoba menulis sendiri.

Namun, jika Anda menulis rutin khusus yang hanya akan dipanggil sekali selama pelaksanaan program, mungkin tidak layak untuk mengadaptasi kode Anda agar sesuai dengan kerangka kerja yang diperlukan oleh perpustakaan.

(Satu hal lagi yang perlu dipikirkan: berapa banyak arsitek yang akan Anda perlu lakukan untuk mengambil keuntungan dari perpustakaan? Kecuali jika orang-jam yang Anda habiskan untuk memperbaiki kode dikompensasi oleh perolehan yang sesuai dalam efisiensi atau akurasi numerik, mungkin tidak sepadan dengan itu dalam jangka panjang. Idealnya, ini adalah sesuatu yang Anda rencanakan ketika awalnya merancang struktur data dan algoritma, sehingga "aliran" perpustakaan diperhitungkan dari bawah ke atas.)


2 sen saya.

Saya pikir lebih mudah untuk menulis secara umum tentang ini, daripada hanya tentang C / C ++. Pertama, perpustakaan dalam bahasa seperti Python tidak selalu digunakan untuk mendapatkan manfaat kecepatan, bahkan jika itu konsekuensinya. Saya pikir @David membahas alasannya dengan cukup baik.

Mengambilnya dari atas, implementasi bahasa sampai batas tertentu menentukan perpustakaan apa yang Anda punya akses. Bahasa yang umum digunakan dalam ilmu komputasi termasuk C, C ++, Python, Perl, Java, Fortran, dan R. Contoh yang kurang umum mungkin Ocaml dan Common Lisp. Sekarang, karena sebagian besar bahasa ini ditulis dalam C, mereka memiliki antarmuka fungsi asing alami ke C. Namun, tidak begitu mudah untuk memanggil, katakanlah, perpustakaan Perl dari Python atau sebaliknya. Jadi dalam praktiknya orang cenderung juga

  1. Gunakan perpustakaan yang ditulis dalam bahasa implementasi mereka, biasanya sesuatu yang merupakan bagian dari perpustakaan standar, atau tersedia secara luas, atau

  2. Panggil perpustakaan C / C ++ melalui bahasa FFI. Ini mengasumsikan bahwa pembungkus belum ada, karena jika tidak, itu tidak mudah dibedakan dari (1).

(2) biasanya lebih sulit, karena Anda harus membungkus sendiri fungsi C / C ++. Anda juga harus mem-bundle pustaka, atau menambahkan ketergantungan tambahan. Untuk alasan itu, orang lebih cenderung menggunakan perpustakaan bahasa builtin daripada menggunakan GSL misalnya, yang ada di C.

Untuk rutinitas yang sangat umum, katakanlah menghasilkan sampel acak dari distribusi, atau rutinitas numerik dasar seperti kuadrature integral, mudah dan umum untuk menggunakan kembali beberapa perpustakaan. Ketika fungsi yang coba diimplementasikan menjadi lebih kompleks, secara eksponensial menjadi semakin tidak mungkin bahwa seseorang akan menemukan fungsi persis yang diinginkan di pustaka lain, dan bahkan yang dilakukan, seseorang dapat menghabiskan banyak waktu mencari dan akhirnya mengadaptasi fungsi sebagai diperlukan (gaya kode / desain bisa menjadi masalah misalnya). Dan seperti yang dibahas di atas, seseorang hanya memiliki akses ke sebagian perpustakaan di luar sana. Di sisi lain, mengimplementasikan algoritma sendiri jika kompleks dan bukan fokus utama dapat menjadi sesuatu yang menakutkan, dan tentu saja kita harus berurusan dengan masalah kecepatan sial itu.

Jadi, ini menjadi masalah optimasi dalam analisis biaya / manfaat. Pengalaman saya adalah bahwa bahkan untuk teknik-teknik standar komparatif seperti MCMC, saya biasanya berakhir dengan menulis kode saya sendiri, karena lebih cocok dengan bagaimana saya merancang perangkat lunak secara keseluruhan.

Tentu saja, bahkan jika Anda akhirnya tidak menggunakan kode tersebut, dimungkinkan untuk belajar dari kode orang lain. Saya tidak tahu seberapa sering para ilmuwan benar-benar repot untuk melakukan ini. Kesan saya adalah bahwa membaca kode orang lain untuk dipelajari lebih merupakan masalah insinyur perangkat lunak.


Berpikir kembali ke kursus mekanik tahun kedua saya, terpikir oleh saya bahwa sebagian alasan saya telah mengimplementasikan versi saya sendiri dari algoritma yang terkenal adalah bahwa saya diajari untuk melakukannya dengan cara itu. Saya tidak dapat memikirkan satu contoh pun di mana saya diajari cara antarmuka dan tautan di perpustakaan dalam pendidikan fisika sarjana saya. Saya memiliki ingatan yang bagus untuk melihat untuk pertama kalinya daftar koordinat bola golf yang berputar, setelah menghitung solusi persamaan Newton yang digabungkan dalam FORTRAN sendiri. Ada sensasi dan kepuasan tertentu (bahkan kesombongan) yang datang dari menghitung sesuatu dari awal.


1
Ini tentu faktor. Dan fokus pada melakukannya sendiri diperlukan untuk bagian dari pendidikan ilmuwan komputasi. Programer murni membuatnya tersingkir dari mereka di beberapa titik, tetapi kita tipe sains dapat bergerak langsung dari kelas pengantar ke sebuah proyeksi yang dihuni hampir secara eksklusif oleh orang lain yang datang di rute yang sama.
dmckee

Saya pikir orang harus menggunakan perpustakaan yang diuji sebanyak mungkin. Kebanyakan orang bukan ahli dalam komputasi numerik dan mungkin tidak akan dapat mengimplementasikan solusi dengan benar dan hati-hati seperti yang tersedia di perpustakaan yang telah teruji. Yang mengatakan, bagaimanapun, kadang-kadang terjadi bahwa tidak ada perpustakaan yang tersedia yang menerapkan kombinasi kemampuan yang dibutuhkan dalam aplikasi yang diberikan. Saya telah melihat ini terjadi di bidang teknis di mana saya bekerja; kode yang ada tidak menyelesaikan semua kasus, dan seseorang akhirnya menerapkan pemecah masalah dari awal.


1
Jika perpustakaan tidak memenuhi semua kebutuhan Anda, saya sarankan Anda memperluas kode perpustakaan dan mengirimkan tambalan. Dengan begitu Anda akan menguntungkan banyak orang lain dengan pekerjaan Anda, dan orang lain juga akan menguji kode Anda untuk Anda. Tentu saja, ini mengasumsikan bahwa kode perpustakaan ditulis dengan cara yang cukup fleksibel sehingga dapat diperluas untuk memenuhi kebutuhan Anda.
David Ketcheson

Saya setuju, itu solusi yang bagus, dan sesuatu yang harus dilakukan orang jika memungkinkan.
mhucka

Masalah mendasar seringkali dengan antarmuka antara aplikasi dan perpustakaan. Pemrogram aplikasi memiliki pengetahuan tentang masalah yang sering hilang ketika melewati masalah (misalnya sebagai matriks) ke perpustakaan. Pengetahuan ini sedemikian rupa sehingga memanfaatkannya lebih dari mengimbangi manfaat menggunakan perpustakaan yang sangat dioptimalkan. Akibatnya, pemrogram aplikasi "memutar" implementasinya sendiri yang mengeksploitasi pengetahuan.

Dengan demikian, perpustakaan yang sangat bagus perlu agar pengetahuan semacam itu dapat diteruskan dari aplikasi ke perpustakaan, sehingga perpustakaan juga dapat memanfaatkannya.


Selain semua hal yang sudah dikatakan di atas, saya akan mengulangi jawaban saya dari pertanyaan "Fortran vs C ++": Aset paling berharga yang dimiliki seorang programmer adalah waktunya. Ya, ketergantungan eksternal seringkali canggung. Tetapi menghabiskan waktu untuk mengimplementasikan kembali, men-debug dan menguji algoritma yang telah dilaksanakan orang lain hampir selalu bodoh, dan hasilnya juga jarang akan sebagus kode yang ditulis oleh para ahli pada topik tertentu. Gunakan kembali apa yang telah dilakukan orang lain!


Saya memberikan jawaban sendiri tentang topik ini. Anda dapat belajar lebih banyak saat menulis ulang semua detail. Saya bekerja selama 5-6 tahun dengan point cloud sekarang. Tiga tahun pertama saya menulis sendiri semua fungsi. Babak kedua saya habiskan menggunakan Point Cloud Library. Saya tidak bisa membuktikannya, tapi saya menganggap diri saya ahli dalam PCL dengan menghabiskan tiga tahun pertama untuk memikirkan solusi yang sudah disediakan orang lain.
Jan Hackenberg

@ JanHackenberg - ya, tapi izinkan saya juga berterus terang: Anda baru saja menghabiskan tiga tahun hidup Anda menemukan kembali roda. Bayangkan berapa banyak hal baru yang bisa Anda lakukan jika Anda menggunakan apa yang telah dilakukan orang lain !?
Wolfgang Bangerth

Saya memutuskan untuk menulis di Jawa pada tahun phd pertama saya karena saat ini saya menganggap kemampuan pemrograman saya (bukan teori informatika) mendekati nol. Jawa masih merupakan bahasa yang paling baik saya praktikkan. Saya juga menganggap Java sebagai pilihan yang baik karena dukungan multi platform yang mudah. Saya memasuki kursi tanpa dukungan informatika di bidang phd (kehutanan tradisional). Saya melompat ke c ++ ketika saya menyadari kesalahan saya dan saya bisa (setelah menerbitkan, bukan sebelumnya).
Jan Hackenberg

BTW saya tidak setuju dalam menyuarakan 3 tahun hidup saya. Ini berarti saya hanya memiliki dua tahun yang berguna dalam pengalaman pasca-doktoral. Hari ini saya dapat memuat 10 miliar silinder di cloud point kehutanan dan membiarkan mesin memutuskan mana yang baik untuk mewakili pohon. Pengguna ~ 50 saya juga bisa melakukannya. Dalam ~ 1 jam. Semua trik saya pelajari dengan belajar dengan cara yang sulit dan memakan waktu. Saya memutuskan untuk tidak pernah belajar cara menggunakan vi, tetapi ketika orang-orang yang lulus kurva belajar yang dibutuhkan mengklaim menggunakan cara yang paling efisien untuk menghasilkan kode, saya percaya mereka.
Jan Hackenberg

Grup saya bekerja dengan menggunakan perpustakaan sebanyak mungkin. Saya salah satu dari sedikit programmer, dan yang lainnya mengambil program di tempat kerja. Mereka cukup tahu keterbatasan mereka sendiri untuk mengetahui di mana mereka seharusnya tidak mencoba-coba. IMSL adalah perpustakaan yang disukai. Hal-hal seperti GSL akan dilarang karena batasan lisensi, meskipun ini adalah agen federal dan kami tetap memberikan perangkat lunak kami.


"Penggunaan kembali pada dasarnya adalah fenomena sosial. Saya dapat menggunakan perangkat lunak orang lain asalkan

  1. berhasil
  2. itu bisa dipahami
  3. itu bisa hidup berdampingan
  4. itu didukung (atau saya bersedia mendukungnya sendiri, kebanyakan saya tidak)
  5. itu ekonomis
  6. Saya dapat menemukannya.

"- B. Stroustrup, Bahasa Pemrograman C ++ 2 ed. (1991) hlm. 383.


Beberapa alasan bagus telah diberikan oleh orang lain untuk menggunakan perpustakaan, dan juga untuk menjalankan rutinitas Anda sendiri.

Anda kadang-kadang dapat mempercepat perhitungan untuk aplikasi tertentu karena Anda tahu sebelumnya bahwa Anda tidak akan pernah membutuhkan rentang nilai yang luas yang dicakup oleh rutinitas perpustakaan, atau keakuratan yang dihasilkan oleh rutinitas tersebut.

Tentu saja, banyak tergantung pada aplikasi tertentu dan berapa kali rutin perpustakaan akan dipanggil. Mengapa Anda memanggil rutin perpustakaan untuk fungsi Bessel milyaran kali jika Anda hanya memerlukan beberapa angka penting untuk rentang kecil x, dan beberapa teknik sederhana akan cukup untuk kebutuhan Anda?


Sedikit untuk ditambahkan, kita harus menggunakan kembali kode, ini tentang keberlanjutan kode dan kontribusi kepada masyarakat, tetapi itu semua di atas.

Alasan mengapa kami tidak menggunakan kembali kode adalah bahwa jika Anda memulai programmer sulit untuk memahami kode orang lain. Ini sangat sulit dengan C ++ lanjutan, dan Anda dapat melakukan beberapa trik dalam C murni juga.

Sangat sering pada awalnya, orang mengerti metode ini, tetapi tidak seperti yang diterapkan di perpustakaan, atau hanya bagaimana menggunakan perpustakaan dengan antarmuka generik, kontrol kesalahan dan konvensi, sangat sering didokumentasikan untuk programmer berpengalaman jika sama sekali. Ini memberikan ilusi yang lebih baik untuk menerapkan metode standar, seperti faktorisasi LU sendiri. Selain itu, programmer baru meremehkan nilai pengujian kode, validasi dan portabilitas untuk sistem operasi yang berbeda. Jadi pada akhirnya alasannya adalah kemalasan, menulis kode sendiri sepertinya sebagai solusi yang lebih cepat dan mudah.

Kenyataannya adalah kita bisa belajar lebih banyak dengan menggunakan dan membaca kode daripada memprogram sendiri dari awal.

Kemalasan mendorong saya untuk sebagian besar waktu, saya pikir juga mayoritas orang. Untuk alasan yang sama, beberapa menulis kode dari awal dan lainnya menggunakan pustaka yang ada.


Algoritma perpustakaan memberikan kontras dengan implementasi sendiri:

  • Mereka generik dan templated. Anda nanti dapat mengulangi implementasi Anda tanpa khawatir mengubah kode Anda sendiri yang seharusnya memiliki banyak kendala.
  • Ada beberapa kasus input data yang cerdas dan menurun. Banyak algoritma geometri komputasi, misalnya convex hull, perlu ditangani misalnya colinearity dari tiga titik. Anda mungkin dapat mengabaikan kasus-kasus tersebut jika Anda tidak pernah berencana untuk mendistribusikan kode Anda dan juga tidak ingin sering menggunakan kembali kode Anda di masa mendatang.
  • Mereka memberikan kompleksitas runtime minimal untuk konfigurasi input case yang diharapkan atau terburuk. Algoritme tingkat yang lebih tinggi sebagai batu bata bangunan seringkali merupakan algoritma tingkat yang lebih rendah, misalnya algoritma pengurutan, atau tipe data khusus. Pengurutan cepat mungkin merupakan pilihan paling umum untuk mengurutkan data, tetapi jika implementasi algoritma Anda harus dijamin (log (n)) Anda tidak dapat menggunakannya.
  • Mereka adalah penggunaan memori yang efisien
  • Mereka lebih lanjut runtime optmized
  • Jika didukung, jauh lebih tertutup untuk menjadi "bug" gratis secara umum, terutama jika Anda bekerja dengan cabang utama. Tidak ada yang lebih diuji daripada perpustakaan yang didistribusikan dengan baik. Tidak setiap bug mogok, tidak setiap bug menghasilkan hasil yang tidak masuk akal. Implementasi algoritma Anda mungkin masih menghasilkan hasil yang dapat diterima, hanya saja tidak sebagus yang dirancang untuknya. Semakin sedikit bug yang terlihat, semakin kecil kemungkinan bahwa Anda sebagai orang tunggal bahkan dapat mendeteksinya.

Saya masih menganggap itu baik ketika memasuki bidang baru untuk mengimplementasikan satu versi dari algoritma yang dapat dipahami dengan baik pada Anda sendiri. Saya membutuhkan banyak waktu secara total. Saya membeli dan membaca buku, yang bernama Press et al. Saya selalu membaca banyak teori sebelum dan selama implementasi tersebut. Dan setelah memahami konsep umum bidang dan mengalami jebakan dalam praktiknya bagi saya, inilah saatnya untuk beralih ke semua aspek implementasi perpustakaan yang lebih baik. Saya pikir Anda akan menjadi pengguna perpustakaan yang lebih baik jika Anda menulis algoritme "halo dunia" di bidang perpustakaan sendiri.

Jika Anda bekerja di tim yang lebih besar itu mungkin bukan pilihan Anda sendiri apakah tim Anda menggunakan perpustakaan tertentu atau tidak. Tim inti mungkin melakukan keputusan. Dan mungkin ada orang yang bertanggung jawab atas perpustakaan yang mengikat proyek Anda dengan rencana waktunya sendiri. Menulis ulang satu algoritma yang dapat Anda lakukan dengan perencanaan waktu Anda sendiri, tidak bergantung pada keputusan orang lain.

Jika Anda sendirian dan suka mendistribusikan ada masalah lain. Saya menganggap serta banyak kode sumber lainnya sebagai sumber daya paling berguna. Banyak untuk semua informatika mungkin setuju di sini. Dalam bidang yang diterapkan di luar informatika, mungkin diperlukan untuk menyediakan exectuable yang telah dikompilasi pada windows. Di Linux Anda dapat mengatur sendiri hal-hal yang relatif mudah jika menggunakan pustaka penggunaan sumber terbuka.

Menulis ulang algoritma sendiri memberi kebebasan lisensi. Proyek Anda mungkin tidak mendukung lisensi GPL dari GSL misalnya.

Lisensi mungkin merupakan satu-satunya kendala yang tidak tergantung dari sudut pandang para peneliti.


1
Tidak masuk akal untuk berpikir bahwa "menerapkan algoritma sendiri" dan "mempelajari sintaksis perpustakaan" akan "menghabiskan waktu yang sama". Itu bahkan tidak berlaku untuk fungsi sederhana seperti "strcat". Ini jelas bukan untuk apa pun yang ada di LAPACK, misalnya, atau di perpustakaan tingkat yang lebih tinggi.
Wolfgang Bangerth

@WolfgangBangerth Terima kasih atas umpan baliknya. Saya membaca ulang apa yang saya tulis dan saya tidak ingin mentransfer pesan bahwa implementasi sendiri dapat dikompilasi. Tetapi saya belajar banyak. "Keduanya mungkin berharga dua minggu" bukan contoh yang baik. Sebagai soal fakta itu memang menghabiskan waktu terakhir "belajar sintaksis" 2 minggu ketika saya beralih dari bentuk Java ke C ++ dan saya juga belajar sintaks dasar C ++ saat ini. Saya lebih banyak berjuang dengan Pointer kemudian dengan perpustakaan baru saya. Dua minggu pada salah satu algoritma yang saya terapkan mungkin telah mengkode waktu yang merupakan investasi kecil saya (membaca buku sebelumnya membutuhkan lebih banyak waktu).
Jan Hackenberg

Investasi itu bukan dalam bentuk algoritma kecil itu sendiri. Itu cepat, dan memang kadang-kadang bisa memakan waktu selama belajar perpustakaan lain. Apa yang menghabiskan banyak waktu adalah untuk men-debug sesuatu, dan untuk memperbaiki semua kasus sudut. Jika Anda menggunakan pustaka yang dikembangkan dengan baik, Anda tahu bahwa jika produk vektor-matriks bekerja untuk matriks persegi, itu akan bekerja untuk matriks persegi panjang juga. Untuk perangkat lunak Anda sendiri, Anda dapat menerapkan dan men-debug ini, meskipun Anda merasa telah selesai dengan fungsinya. Anda akan kembali ke fungsi yang sama beberapa kali. Itulah yang menghabiskan waktu.
Wolfgang Bangerth

@ WolfgangBangerth Saya setuju dengan semua Argumen Anda. Satu-satunya Poin saya adalah bahwa Anda belajar lebih banyak teori ketika Anda Perlu menangani sendiri kasus Corner itu. Versi pertamaku dari jawabanku memang terdengar seperti tidak ada bedanya. Aku sangat lelah. Saya menulis dalam jawaban yang ditingkatkan lebih banyak tentang manfaat stabilitas perpustakaan. Bagi saya itu merupakan trade off antara waktu yang dihabiskan dan Pengetahuan yang diperoleh.
Jan Hackenberg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.