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.
Jawaban:
"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.
sumber
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:
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.
sumber
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.
sumber
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
sumber
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:
Ilmu Komputer:
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.
sumber
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.
sumber
Akal sehat dan firasat ... Yang terakhir datang hanya dengan waktu dan setelah "selamat" dari beberapa pengalaman memalukan di dunia buruk yang besar.
sumber