Keterampilan inti apa yang harus dimiliki setiap ilmuwan komputasi? [Tutup]

52

Setiap ilmuwan perlu tahu sedikit tentang statistik: apa artinya korelasi, apa interval kepercayaan itu, dan sebagainya. Demikian pula, setiap ilmuwan harus tahu sedikit tentang komputasi: pertanyaannya adalah, apa? Apa yang masuk akal untuk mengharapkan setiap ilmuwan yang bekerja tahu tentang membangun dan menggunakan perangkat lunak? Daftar keterampilan inti kami --- hal-hal yang harus diketahui orang sebelum mereka menangani apa pun dengan "cloud" atau "peta" dalam namanya --- adalah:

  • pemrograman dasar (loop, kondisional, daftar, fungsi, dan file I / O)
  • shell / dasar shell scripting
  • kontrol versi
  • berapa banyak untuk menguji program
  • SQL dasar

Ada banyak hal yang tidak ada dalam daftar ini: pemrograman matriks (MATLAB, NumPy, dan sejenisnya), spreadsheet bila digunakan dengan baik, mereka sama kuatnya dengan kebanyakan bahasa pemrograman), alat otomatisasi tugas seperti Make, dan sebagainya.

Jadi: apa yang ada di daftar Anda ? Menurut Anda, adilkah mengharapkan setiap ilmuwan mengetahui hari ini? Dan apa yang akan Anda ambil dari daftar di atas untuk memberi ruang bagi itu? Tidak ada yang punya cukup waktu untuk mempelajari segalanya.

Greg Wilson
sumber
1
Pertanyaan bagus! Tapi saya tidak jelas tentang satu hal: apa yang Anda maksud dengan ilmuwan komputasi? Adakah ilmuwan yang menggunakan perhitungan? Atau sekelompok kecil orang yang akan menganggap gelar profesional mereka sebagai "ilmuwan komputasi"?
David Ketcheson
9
Buat daftar pertanyaan tidak baik dalam format Stack Exchange. Apakah kita benar-benar harus melalui ini di setiap situs?
dmckee
4
@Dan Komunitas Wiki bukan alasan untuk mengizinkan pertanyaan yang bukan milik situs. Saya juga ingin mendorong mereka yang menjawab untuk mengambil contoh dari Jed dan setidaknya mencoba dan menjelaskan mengapa Anda membutuhkan keterampilan tertentu atau tidak membutuhkan orang lain
Ivo Flipse
5
@IvoFlipse: Ini adalah pertanyaan yang ada di situs dalam beberapa bentuk. Mungkin tidak seperti yang dinyatakan saat ini; mungkin perlu diretas menjadi pertanyaan yang lebih kecil dan ditulis ulang, tetapi masalah rekayasa perangkat lunak yang buruk dalam ilmu komputasi adalah hal yang sangat penting, terutama karena ilmu komputasi sebagai suatu disiplin masih dalam tahap formatif. Artikel di Nature ini menunjukkan alasannya. Greg melakukan layanan yang bagus untuk komunitas sains komputasi melalui situs web-nya.
Geoff Oxberry
5
Saya tidak setuju dengan pertanyaan ini ditutup. Silakan lihat (dan beri
David Ketcheson

Jawaban:

46

"Ilmuwan Komputasi" agak luas karena mencakup orang yang melakukan analisis numerik dengan kertas / LaTeX dan implementasi proof-of-concept, orang yang menulis perpustakaan tujuan umum, dan orang yang mengembangkan aplikasi yang memecahkan kelas masalah tertentu, dan pengguna akhir yang memanfaatkannya aplikasi. Keterampilan yang dibutuhkan untuk kelompok-kelompok ini berbeda, tetapi ada keuntungan besar untuk memiliki keakraban dengan "tumpukan penuh". Saya akan menjelaskan apa yang saya pikir adalah bagian penting dari tumpukan ini, orang-orang yang bekerja pada level itu tentu saja harus memiliki pengetahuan yang lebih dalam.

Pengetahuan domain (misalnya latar belakang fisika dan teknik)

Setiap orang harus mengetahui dasar-dasar kelas masalah yang mereka pecahkan. Jika Anda bekerja pada PDE, ini berarti beberapa pengetahuan umum tentang beberapa kelas PDE (misalnya Poisson, elastisitas, dan Navier-Stokes yang kompresibel dan kompresibel), terutama properti apa yang penting untuk ditangkap secara "tepat" dan apa yang bisa sampai pada diskritisasi kesalahan (ini menginformasikan pemilihan metode mengenai konservasi lokal dan integrator symplectic). Anda harus tahu tentang beberapa fungsional dan jenis analisis yang menarik untuk aplikasi (optimisasi angkat dan seret, prediksi kegagalan, inversi parameter, dll).

Matematika

Setiap orang harus memiliki pengetahuan umum tentang kelas-kelas metode yang relevan dengan domain masalahnya. Ini termasuk karakteristik dasar aljabar linier yang jarang versus padat, ketersediaan "metode cepat", sifat-sifat teknik diskritisasi spasial dan temporal dan bagaimana mengevaluasi sifat-sifat masalah fisik apa yang diperlukan agar teknik diskritisasi sesuai. Jika Anda sebagian besar adalah pengguna akhir, pengetahuan ini bisa sangat tinggi.

Rekayasa perangkat lunak dan perpustakaan

Beberapa keakraban dengan teknik abstraksi dan desain perpustakaan berguna untuk hampir semua orang dalam ilmu komputasi. Jika Anda mengerjakan metode pembuktian konsep, ini akan meningkatkan pengorganisasian kode Anda (membuatnya lebih mudah bagi orang lain untuk "menerjemahkannya" ke dalam implementasi yang kuat). Jika Anda bekerja pada aplikasi ilmiah, ini akan membuat perangkat lunak Anda lebih fleksibel dan membuatnya lebih mudah untuk berinteraksi dengan perpustakaan. Bersikap defensif ketika mengembangkan kode, sehingga kesalahan terdeteksi sedini mungkin dan pesan kesalahan sedapat mungkin informatif.

Alat

Bekerja dengan perangkat lunak adalah bagian penting dari ilmu komputasi. Kemahiran dengan bahasa yang Anda pilih, dukungan editor (mis. Tag, analisis statis), dan alat debugging (debugger, valgrind) sangat meningkatkan efisiensi pengembangan Anda. Jika Anda bekerja di lingkungan batch, Anda harus tahu cara mengirim pekerjaan dan mendapatkan sesi interaktif. Jika Anda bekerja dengan kode terkompilasi, pengetahuan kompiler, tautan, dan alat bantu pembuatan seperti Make akan menghemat banyak waktu. Kontrol versi sangat penting untuk semua orang, bahkan jika Anda bekerja sendiri. Pelajari Git atau Mercurial dan gunakan untuk setiap proyek. Jika Anda mengembangkan perpustakaan, Anda harus mengetahui standar bahasa secara wajar sehingga Anda hampir selalu menulis kode portabel pertama kali, jika tidak, Anda akan dimakamkan dalam permintaan dukungan pengguna ketika kode Anda tidak dibangun di lingkungan funky mereka.

Getah

LaTeX adalah standar de-facto untuk publikasi ilmiah dan kolaborasi. Kemahiran dengan LaTeX penting untuk dapat mengkomunikasikan hasil Anda, berkolaborasi dalam proposal, dll. Pembuatan skrip angka juga penting untuk reproduktifitas dan sumber data.

Jed Brown
sumber
7
Saya setuju dengan Jed. LaTeX mutlak diperlukan! :)
Paul
1
Saya akan mengubah "Fisika dan Teknik" menjadi keahlian materi pelajaran. Bagaimanapun, kita tidak semua ahli fisika atau insinyur. Semangat bagian dari jawaban itu ada di tempat yang tepat, tetapi ada asumsi yang cukup mencolok.
Fomite
Terima kasih @EpiGrad, saya mengubahnya menjadi "pengetahuan domain" dengan mereka sebagai contoh.
Jed Brown
Daftar bagus Pemahaman dasar tentang masalah kinerja juga harus ada di sana. Saya telah bertemu terlalu banyak orang yang tidak mengerti konsep kode profil yang sederhana. NB: kinerja harus diartikan tidak hanya masalah kecepatan tetapi juga penggunaan memori.
Faheem Mitha
Kesalahan ketik: "masalah" dan "dikubur". SE tidak akan membiarkan saya memperbaikinya - suntingan terlalu kecil.
Faheem Mitha
26

Latar belakang saya sendiri di bidang Ilmu Komputer, jadi pendapat saya mungkin agak bias. Karena itu, saya akan menambahkan "algoritma dasar dan struktur data" ke daftar. Yang saya maksud dengan dasar-dasar pada dasarnya adalah pencarian linear dan penyortiran, dan struktur data seperti pohon seimbang, tumpukan dan atau tabel hash.

Mengapa? Nah, dalam sebagian besar algoritma komputasi, Anda pada akhirnya menghabiskan waktu dan upaya yang luar biasa untuk memindahkan data dan tidak benar-benar menghitung apa pun. Pernah menerapkan kode Elemen Hingga? Itu sekitar 90% organisasi data. Perbedaan antara menyelesaikan ini dan menyelesaikannya dengan baik bisa menjadi urutan besarnya dalam efisiensi komputasi.

Satu poin kecil yang berhubungan dengan Ilmu Komputer yang juga akan saya tambahkan adalah pengantar singkat tentang bagaimana prosesor sebenarnya bekerja dan apa yang baik dan apa yang tidak. Sebagai contoh:

  • Penambahan dan perkalian cepat, fungsi pembagian atau transendental tidak. Saya telah melihat orang dewasa mengganti operasi root kuadrat dengan sesuatu yang membutuhkan tiga divisi dan berpikir mereka telah melakukan sesuatu yang hebat (divisi dan root kuadrat sama mahal).
  • Tembolok Level 3 semakin besar setiap tahun, ya, tetapi cache Level 0, yaitu yang sangat cepat, masih hanya beberapa kilobyte.
  • Kompiler bukanlah sihir. Mereka dapat membuka gulungan kecil atau membuat vektor operasi yang sangat mudah, tetapi mereka tidak akan mengubah gelembung itu menjadi quicksort.
  • Memanggil metode pada objek polimorfik dengan pewarisan berganda di loop terdalam Anda mungkin secara konsep manis, tetapi itu akan membuat CPU Anda ingin bunuh diri.

Ini adalah hal yang sangat membosankan, tetapi hanya perlu beberapa menit untuk menjelaskan, dan mengingatnya akan membuat Anda menulis kode yang baik dari awal, atau merancang algoritma yang tidak bergantung pada fitur perangkat keras yang tidak ada.

Seperti apa yang harus dihapus dari daftar, saya pikir SQL sedikit banyak untuk Ilmuwan Komputasi. Juga, pengujian perangkat lunak itu penting, tetapi itu sendiri adalah ilmu. Unit testing dan tipe data abstrak yang benar adalah sesuatu yang harus diajarkan dengan pemrograman dasar, dan tidak memerlukan program master dua tahun.

Pedro
sumber
2
Tidak membosankan sama sekali. Saya akan mengambil kursus seperti itu, jika ditawarkan. :-)
Faheem Mitha
18

Saya mungkin menambahkan ini nanti, tetapi sebagai permulaan, saya akan mengambil "shell scripting" dan menggantinya secara khusus dengan "Python scripting". Python jauh lebih portabel daripada skrip shell, dan lebih mudah dibaca daripada bahasa skrip dan shell yang sebanding. Pustaka standarnya yang besar dan popularitasnya dalam sains (dengan kemungkinan biologi, yang juga menggunakan Perl) menjadikannya lingua franca komputasi yang hebat , belum lagi bahasa pertama yang baik untuk mempelajari pemrograman. Ini sekarang bahasa pertama yang diajarkan untuk jurusan EECS di MIT, dan populer di pasar kerja, khususnya dalam komputasi ilmiah. Dokumentasinya online sangat luas, dan ada juga sejumlah teks pemrograman berdasarkan Python yang tersedia online.

Menggunakan Python, Anda bisa mengajarkan konstruksi pemrograman dasar, serta scripting. Selain itu, Python memiliki dukungan yang sangat baik untuk pengujian unit, sehingga Python dapat digunakan untuk mengajar pengujian unit juga. Python juga memiliki API basis data yang luas (yang bisa menggantikan atau menambah harus belajar SQL), dan beberapa membangun utilitas yang menawarkan fungsionalitas Make-like. Saya pribadi lebih suka SCons daripada Make, karena saya menemukan Python lebih mudah untuk didokumentasikan dan diuji daripada skrip shell.

Pada akhirnya, prinsip motivasi di balik shilling terang-terangan saya untuk Python adalah efisiensi. Jauh lebih mudah untuk merampingkan alur kerja Anda jika Anda dapat melakukan sebagian besar pekerjaan Anda dalam satu bahasa atau satu alat, terutama ketika alat itu adalah bahasa scripting ekspresif. Tentu, saya bisa melakukan semuanya dalam C, tetapi program saya akan menjadi 5 kali lebih lama, dan kemungkinan besar, saya tidak perlu kecepatan. Sebagai gantinya, saya dapat menggunakan Python untuk mengimpor data dari file teks, memplotnya, memanggil rutinisasi optimasi, membuat variasi acak, memplot hasil saya, menulis hasil ke file teks, dan unit menguji kode saya. Jika Python terlalu lambat, mungkin untuk membungkus Python di sekitar kode C, C ++, atau Fortran yang menangani tugas-tugas yang intensif secara komputasi. Bagi saya, Python adalah toko serba ada untuk sebagian besar kebutuhan komputasi ilmiah saya.

Python belum benar-benar MATLAB; SciPy dan NumPy masih memiliki cara untuk pergi dalam hal fungsi, tetapi dalam hal utilitas umum, saya menggunakan Python untuk berbagai tugas yang lebih luas daripada MATLAB.

Geoff Oxberry
sumber
7
Saya tidak bisa membantu tetapi sama sekali tidak setuju dengan ini. Python adalah sakit kepala untuk pengelola sistem karena ini sedikit target yang bergerak. Ilmuwan komputasi harus memiliki pemahaman dasar tentang bash atau csh untuk menempelkan hal-hal yang paling mendasar bersama-sama dan menjalankan pekerjaan pada sistem yang cenderung mereka gunakan. Python hebat, dan saya mendukung Anda mengadvokasi orang-orang komputasi untuk mempelajarinya, tetapi tidak dengan mengorbankan beberapa shell yang belum sempurna.
Bill Barth
7
@BillBarth: Saya pikir setiap ilmuwan komputasi harus belajar bash atau csh dasar untuk skrip yang sangat, sangat mendasar. Alasan saya menganjurkan menggunakan Python untuk skrip shell di luar tugas-tugas dasar adalah karena saya mewarisi script bash garis seribu-ish yang pada dasarnya menjalankan program . Melewati file bolak-balik sebagai semafor, berulang kali memanggil PBS, dan tidak ada cara untuk mengujinya sama sekali. Shell scripting bagus untuk tugas-tugas kecil, tetapi tidak untuk tugas-tugas besar, dan mimpi buruk duct-tape-and-bubblegum ini telah membuat saya kehilangan beberapa tahun dalam tesis saya, itulah sebabnya saya ngotot.
Geoff Oxberry
2
Seperti yang saya katakan, saya tidak setuju bahwa "belajar python" mungkin sesuai untuk daftar. Saya hanya tidak ingin melakukannya dengan mengorbankan "scripting shell". Keduanya penting, dan tidak ada yang akan membiarkan Anda menjalankan ipython sebagai shell Anda, jadi shell scripting sangat penting.
Bill Barth
3
@ BillBarth: Tidak ada tempat saya menyarankan bahwa Python mengganti shell. Saya hanya menyarankan agar Python mengganti bash untuk skrip; Saya percaya bahwa jika Anda mempelajari bash dasar, Anda cukup tahu untuk menulis skrip tanpa struktur kontrol, jadi tidak perlu masuk lebih jauh ke dalam "bash scripting". Segera setelah Anda ingin memasukkan struktur kontrol, Anda harus beralih ke bahasa yang berbeda, karena pemrograman dalam bash adalah sakit kepala untuk peranti lunak dan pengelola perpustakaan.
Geoff Oxberry
1
+1. Python telah menjadi bahasa pemrograman utama saya selama beberapa waktu. Itu tidak sempurna, tetapi itu akan dilakukan sampai seseorang menemukan bahasa pemrograman yang sempurna.
Faheem Mitha
14

Matematika titik mengambang. Kebanyakan sains berkaitan dengan nilai-nilai dunia nyata, dan nilai-nilai dunia nyata sering direpresentasikan sebagai titik mengambang di dunia komputer. Ada banyak Gotcha potensial dengan pelampung yang dapat mendatangkan malapetaka pada kebermaknaan hasil.

Referensi favorit untuk topik ini tampaknya adalah "Apa Yang Harus Diketahui Setiap Ilmuwan Mengenai Aritmatika Floating Point (1991)" oleh David Goldberg http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.6768

Peter Recore
sumber
1
Dokumen ini telah disebutkan berkali-kali di forum online. Tetapi ini adalah artikel yang sangat panjang dan padat, dan saya tidak yakin berapa banyak orang yang benar-benar dapat mengambil sesuatu yang bermanfaat dari ini.
johngreen
12

Seorang ilmuwan komputasi harus memiliki pengetahuan yang cukup dalam ilmu komputer, matematika, dan bidang aplikasi dalam ilmu / teknik. Saya akan memasukkan keterampilan dalam masing-masing bidang berikut:

Matematika:

  1. Analisis numerik
  2. Aljabar linier
  3. Persamaan Diferensial Biasa, Sebagian, dan / atau Stokastik
  4. Optimasi
  5. Statistik dan / atau Probabilitas
  6. Teori Terbalik

Ilmu Komputer:

  1. Algoritma
  2. Struktur data
  3. Pemrograman Paralel (MPI, OpenMP, CUDA, dll.)
  4. Visualisasi Ilmiah
  5. Arsitektur komputer
  6. Menggunakan Lingkungan Linux

Sains / Teknik - tergantung pada aplikasi yang ingin Anda spesialisasi. Dalam kasus khusus saya (teknik), saya akan menambahkan hal-hal seperti mekanika kontinum, perpindahan panas, dinamika fluida, metode elemen hingga, dll. Saya akan mengatakan bahwa semakin akrab Anda miliki dengan berbagai bidang sains, semakin serbaguna Anda sebagai ilmuwan komputasi.

Paul
sumber
Bisakah Anda menguraikan "Inverse Theory"?
Faheem Mitha
1
@FaheemMitha: Secara tradisional, kami menetapkan parameter model terlebih dahulu (misalnya persamaan diferensial parsial), kemudian mengamati perilaku sistem. "Masalah terbalik" melakukan kebalikannya. Kami mulai dengan pengamatan output sistem, dan mencoba menentukan parameter model yang menghasilkan pengamatan ini. Teori invers menggambarkan metode untuk menyelesaikan tugas ini.
Paul
Terima kasih untuk penjelasannya. Apakah Anda memiliki tautan / referensi yang bagus untuk topik ini?
Faheem Mitha
2
en.wikipedia.org/wiki/Inverse_problem adalah tempat yang baik untuk memulai. space.fmi.fi/graduateschool/Lectures07/HK_inversion.pdf memiliki ikhtisar yang bagus juga. Tetapi untuk pemahaman yang lebih mendalam, saya akan merekomendasikan buku seperti amazon.com/Parameter-Estimation-Inverse-Problems-Second/dp/…
Paul
4

Pertanyaan yang bagus diikuti oleh jawaban yang menarik! Saya ingin bergabung hanya dengan satu tambahan kecil. Sejauh yang saya alami (saya sendiri dan perwakilan), alat All-in-One biasanya sangat baik untuk diketahui. Alat seperti itu bisa MATLAB, oktaf atau bahkan Python (dengan perpustakaan). Setiap kali Anda memiliki masalah di "zona nyaman" Anda, ide yang bagus (sejauh yang saya tahu dan pikirkan) adalah mencoba tangan Anda menggunakan alat All-in-One. Anda dapat mencoba menulis kode Anda sendiri nanti. Keindahan paket-paket tersebut adalah bahwa pemrograman tidak mengganggu pemahaman tentang apa yang Anda lakukan.

Ambil contoh Komputer Grafik. Menulis kode untuk terjemahan, rotasi atau penskalaan suatu gambar adalah 10 baris kode dalam MATLAB (puncak) tetapi dapat berjalan untuk halaman dalam C. Saya tidak mengatakan C tidak baik. Yang saya katakan adalah bahwa jika Anda tidak memiliki alasan yang baik untuk menulis kode dalam C, MATLAB akan menjadi jalan keluar yang lebih sederhana, lebih baik, dan lebih intuitif.

Beberapa orang mungkin tidak setuju dan menyatakan bahwa pemrograman mirip-C adalah cara yang bagus untuk membangun intuisi. Mungkin ini. Tetapi ketika Anda tidak harus berurusan dengan masalah lebih dari beberapa kali, sulit dijamin untuk duduk dan menulis kode Anda sendiri dalam bahasa seperti C.

Pemeriksaan resmi
sumber
-1

Akal sehat dan firasat ... Yang terakhir datang hanya dengan waktu dan setelah "selamat" dari beberapa pengalaman memalukan di dunia buruk yang besar.

GertVdE
sumber
3
Saya tidak tahu apakah "firasat" benar-benar sebuah keterampilan. Ini lebih merupakan reaksi naluriah terhadap pengalaman sebelumnya.
nucky101