Saya selalu menyukai fisika, dan saya selalu suka coding, jadi ketika saya mendapat tawaran untuk posisi PhD melakukan fisika numerik (detailnya tidak relevan, itu kebanyakan pemrograman paralel untuk sebuah cluster) di sebuah universitas, itu tidak ada - Otak untuk saya.
Namun, seperti kebanyakan fisikawan, saya belajar sendiri. Saya tidak memiliki pengetahuan latar belakang yang luas tentang cara membuat kode dengan cara yang berorientasi objek, atau nama algoritma tertentu yang mengoptimalkan pencarian di beberapa pohon kD.
Karena semua pekerjaan saya sejauh ini lebih mementingkan fisika dan hasil ilmiah, saya tidak diragukan memiliki kebiasaan buruk - lebih karena pengkodean saya adalah milik saya sendiri, dan bukan benar-benar kerja tim. Saya sebagian besar menggunakan C karena sangat mudah dan "apa yang Anda tulis adalah apa yang Anda dapatkan" - tidak perlu untuk abstraksi mewah. Namun, saya baru saja beralih ke C ++ karena saya ingin belajar lebih banyak tentang kekuatan yang datang dengan abstraksi, dan itu cukup seperti C (setidaknya sintaksis setidaknya).
Bagaimana cara saya belajar kode dengan cara abstrak yang bagus seperti lulusan ilmu komputer?
Saya tahu kode saya efisien, tetapi saya juga ingin menjadi elegan , dan mudah dibaca. Perlu diingat bahwa saya tidak punya waktu untuk membaca beberapa buku tebal 1000 halaman tentang pemrograman abstrak. Saya perlu meluangkan waktu untuk penelitian aktual yang berhubungan dengan fisika (penyelia saya akan menertawakan saya jika dia tahu saya menghabiskan waktu memikirkan bagaimana memprogram dengan elegan). Bagaimana saya menilai jika pekerjaan saya juga bagus dari sudut pandang programmer?
sumber
Jawaban:
Jadi, apakah Anda meminta seseorang untuk memberi Anda daftar periksa lima langkah yang akan membuat Anda seorang programmer yang terampil? Itu tidak akan terjadi !
Seperti halnya disiplin lainnya, jika Anda ingin menjadi ahli dalam pemrograman Anda harus menghabiskan waktu dan usaha untuk berlatih dan belajar. Anda belajar menulis kode yang jelas dan anggun dengan menulis banyak kode dan membaca kode orang lain dengan cermat. Beberapa buku tebal 1000 halaman itu benar-benar akan menghemat waktu Anda dengan merangkum pelajaran-pelajaran sulit yang dipelajari orang lain. Ini adalah delusi untuk berpikir bahwa Anda dapat menjadi programmer yang terampil sebagai efek samping tanpa rasa sakit untuk mendapatkan Ph.D fisika. Bukannya Anda tidak dapat keluar dari Ph.D. dengan keterampilan pemrograman gila, hanya saja itu akan menghabiskan waktu dan masalah Anda.
Kode Lengkap adalah pengantar yang bagus untuk mekanisme pengembangan perangkat lunak, termasuk saran tentang cara menulis dan menyusun kode yang jelas dan dapat dipelihara. Ya, ini adalah buku tebal yang sangat besar, tetapi tentu saja tidak sepadat yang dikatakan, "Prinsip-prinsip Mekanika Kuantum" Dirac, atau "Gravitasi" MTW. Kode Lengkap sedekat Anda akan mendapatkan daftar periksa lima langkah untuk menulis perangkat lunak yang lebih baik.
Matlab, VIM, C, MPI, dan Valgrind adalah alat yang sangat baik untuk diketahui. Anda tidak menyebutkan menggunakan sistem kontrol versi. Jika dengan beberapa kebetulan Anda belum menggunakan sistem kontrol versi, Anda harus segera menggunakannya. Kontrol versi juga mengirim pesan untuk menulis tesis Anda. Alat dasar lain yang harus Anda ketahui adalah debugger, profiler eksekusi, kerangka kerja logging, dan kerangka kerja pengujian unit. Anda tidak harus membaca buku 1000 halaman untuk masing-masing buku ini. Bekerja melalui tutorial online untuk mendapatkan dasar-dasarnya dan kemudian mulai bekerja dengannya. Pelajari lebih dalam dokumentasi saat kebutuhan Anda menjadi lebih canggih.
Memberi tahu Anda tentang mempelajari dasar-dasar ilmu komputer (berbeda dengan dasar-dasar konstruksi perangkat lunak) lebih sulit. Anda tidak menentukan masalah apa yang sedang Anda kerjakan, apakah Anda sedang mengembangkan algoritma baru atau menerapkan algoritma yang ada. Bergantung pada masalah penelitian Anda, survei struktur data dasar dan algoritma standar mungkin dapat membantu. Masalah lain akan mendapat manfaat lebih dari latar belakang yang kuat dalam analisis numerik. Jika Anda ingin mempelajari dasar-dasar analisis algoritma ada beberapa teks yang bagus. Manual Perancangan Algoritma dan Pengantar Algoritma bermunculan di pikiran. Ada juga beberapa kursus pengantar yang baik tersedia online sekarang: Desain dan Analisis Algoritma , dan Algoritma .
sumber
Latar belakang saya sedikit mirip dengan Anda-saya adalah seorang lulusan fisika yang belajar pemrograman sendiri. Setelah saya lulus meskipun saya mengambil beberapa pekerjaan TI dan akhirnya menjadi insinyur perangkat lunak; termasuk sedikit waktu bekerja pada OpenGDA (perangkat lunak yang digunakan untuk menjalankan eksperimen di berbagai situs synchrotron).
Hal utama yang saya pelajari tentang pertanyaan yang Anda miliki ketika saya tiba di sini adalah bahwa jauh lebih mudah untuk mendapatkan keterampilan ini dari orang lain daripada mencoba mengambilnya sendiri. Seorang mentor yang berpengalaman dapat dengan mudah membantu Anda mengidentifikasi di mana kode Anda lemah atau di mana pola dan praktik umum dapat membantu Anda. Sementara saya belajar bagaimana menulis C dan Objective-C sendiri, saya tidak tahu persis apa yang saya tidak tahu (jika Anda melihat apa yang saya maksud) sampai saya bekerja dengan orang lain pada kode yang sama. Fakta Anda meminta saran di sini berarti Anda melakukan lebih baik daripada yang sudah saya lakukan :-).
Sekarang, di mana Anda menemukan insinyur perangkat lunak profesional yang jinak? Saya baru-baru bergabung MentorNet , sebuah sistem yang mitra dialami programmer dengan anak didik.
Tetapi Anda tidak harus menggunakan sistem formal seperti itu. Menemukan grup pertemuan programmer lokal (atau di mana departemen teknik perangkat lunak universitas Anda pergi setelah bekerja pada hari Jumat) adalah tempat yang bagus untuk memulai.
sumber
Tidak Ada Royal Road to Software
Di zaman kuno, Euclid ditanya pertanyaan seperti milikmu oleh muridnya Raja Ptolemy. Responsnya: "Tidak ada jalan kerajaan ke geometri."
Anda menyebutkan bahwa penyelia Anda akan tertawa jika dia tahu berapa banyak waktu yang Anda habiskan untuk mencoba menulis kode seperti pengembang profesional. Orang lain menjawab pertanyaan Anda dengan daftar cucian untuk dipelajari mulai dari kontrol sumber hingga Desain dan Analisis Algoritma.
Mereka gagal mencapai tujuan Anda:
Konser Pianis atau Band Satu Orang?
Dunia bergerak terlalu cepat bagi orang untuk mencoba-coba. Jika Anda ingin menjadi pianis konser, jangan membagi instrumen waktu belajar Anda untuk menjadi band satu orang.
Konsep saya untuk peran PhD dalam fisika pada proyek-proyek menengah hingga besar adalah sebagai pemimpin gagasan untuk definisi sistem, ahli dalam teori, ahli materi pelajaran selama pembuatan kasus penggunaan, dan pengguna akhir / juri untuk hasil yang dihasilkan oleh artefak perangkat lunak. Bekerja sama dengan insinyur perangkat lunak terbaik yang Anda bisa.
Bagaimana saya menilai jika pekerjaan saya juga bagus dari sudut pandang programmer?
Jika Anda ingin menetapkan bilah tinggi, mulailah di sini:
Arsitektur Perangkat Lunak dalam Praktek, Len Bass, Paul Clements, Rick Kazman
Cari bab "Memahami Atribut Kualitas". Di luar kode, ini mempertimbangkan kegunaan, dapat dimodifikasi, kinerja, keamanan, ketersediaan, keandalan, kemampuan uji, pemeliharaan, dan portabilitas (tidak dapat Anda bawa, tetapi dapatkah Anda port desain dari satu platform ke platform lain). Semua membutuhkan tujuan terukur spesifik. Referensi serupa meliputi:
http://msdn.microsoft.com/en-us/library/ee658094.aspx
http://www.sei.cmu.edu/reports/95tr021.pdf
Tujuan Anda vs. C dan C ++
Seperti FORTRAN, ini adalah bahasa yang sulit dan lama. Indikator positif untuk C / C ++ termasuk:
Ada banyak orang melakukan pengembangan web, visualisasi data, dan data besar. Banyak yang termotivasi untuk menemukan atau membuat bahasa lain. Sebagai contoh, fisikawan Sir Tim Berners-Lee membuat kesuksesannya dengan HTML (tetapi sedikit tahu tentang fisika). Evaluasilah tujuan Anda vs. bahasa pemrograman Anda.
Pertimbangkan Menggunakan Matlab
Matlab memiliki basis terinstal yang besar, khusus untuk matematika dan sains. Ini memiliki alat untuk visualisasi data. Ini memungkinkan ilmuwan dan ahli matematika untuk mengekspresikan masalah dalam domain masalah daripada domain solusi. Matlab membuat Toolbox Komputasi Paralel dan produk Server Komputasi Terdistribusi.
Saya berharap keberhasilan Matlab adalah karena menggunakan tim multidisiplin dengan orang-orang yang ahli dalam fisika, matematika, elektronik dan instrumentasi, sistem operasi, bahasa pemrograman, pengembangan perangkat lunak, pengujian perangkat lunak, arsitektur dan desain perangkat lunak. Analogi ini mungkin hanya peregangan, tetapi mengapa Anda menempatkan diri di luar sana sendirian, dimulai dengan palu, pahat, dan serak untuk membuat sesuatu ketika Anda memiliki printer 3D yang tersedia? Seperti yang mungkin ditanyakan Newton, mengapa tidak berdiri di atas bahu seseorang?
sumber
Anda akan dapat melangkah jauh dalam bidang Fisika tanpa mengetahui apa pun tentang gaya "profesional" (berbicara dari pengalaman). Tetapi saya telah melihat banyak orang membuang waktu tanpa akhir karena mereka kehilangan jejak dari apa yang mereka lakukan atau setelah menumbuhkan kode mereka selama beberapa tahun baru saja tersesat dalam kompleksitasnya (bahkan di akademisi tidak ada kode "membuang", tetapi hal-hal bertahan lebih lama dari yang Anda pikirkan pada awalnya).
Saya akan menyarankan Anda memulai dengan algoritma dan struktur data, misalnya dengan kursus ini . Setelah itu Anda harus dapat memikirkan kinerja pada tingkat yang lebih produktif dan dapat menindaklanjuti dengan misalnya artikel di Wikipedia.
Setelah itu biasakan apa yang tersedia di inti bahasa Anda, misal untuk C ++ cppreference.com . Saya juga sangat menyarankan Anda untuk membaca seri C ++ Efektif oleh Scott Meyers dan Accelerated C ++ oleh Koenig & Moe. Setidaknya untuk C ++ ini akan memberi Anda dasar yang kuat di sisi bahasa.
Secara paralel Anda harus mencoba mengenal alat Anda dengan baik. Bukan tidak mungkin Anda akan mengembangkan kode Anda di Linux, jadi cobalah untuk belajar bagaimana mendapatkan lebih banyak diagnostik (peringatan) dari kompiler Anda (setidaknya gcc dan dentang). Juga pelajari tentang alat analisis statis seperti cppcheck atau build-scan dentang . Pelajari cara menjadikan alat-alat ini sebagai bagian integral dari proses pengembangan Anda, mis. Dengan mengintegrasikannya ke dalam setup build Anda (ya, Anda harus menggunakan setidaknya GNU make, atau bahkan sesuatu yang lebih baik seperti autotools / cmake / ... GNU.) Anda juga harus menambahkan alat profil ke toolset Anda. Untuk C ++ saya akan sangat menyarankan Anda untuk mempelajari semua yang Anda bisa tentang valgrind yang dapat profil pada tingkat yang sangat rendah (ini juga dapat membantu Anda menemukan kebocoran sumber daya).
Semua ini akan membantu Anda fokus pada apa yang paling Anda pedulikan (penelitian Anda) alih-alih membuang waktu untuk menemukan bug atau melakukan optimasi yang tidak berguna. Tentu saja ini hampir tidak mungkin untuk dijual kepada penasihat, tetapi mereka (dan Anda) akan terkesan tetapi kecepatannya Anda bisa mendapatkan hasil yang andal.
Anda menyebutkan C dan C ++, tetapi untuk perhitungan numerik saya tidak dapat merekomendasikan Python dengan numpy dan scipy . Hal ini memungkinkan Anda untuk menulis dalam bahasa bersih yang cukup bersih pada tingkat yang sangat tinggi (Anda bahkan dapat bekerja secara interaktif), sambil tetap memanfaatkan rutinitas yang sangat optimal diimplementasikan dalam C, C ++ dan FORTRAN. Juga, menghubungkan kode C atau C ++ Anda sendiri dengan Python hampir sepele.
sumber
Apakah itu benar? Apakah ini menghasilkan hasil yang benar dalam semua kasus?
Apakah orang lain dapat membaca dan dengan mudah memahami kode Anda?
Ketika atasan Anda berkata "Hebat, sekarang buat juga lakukan X ..." apakah Anda harus menulis ulang banyak kode?
Ketika Anda telah menulis sebuah program, apakah itu menjadi alat yang dapat Anda gunakan berulang kali, atau apakah itu digunakan sekali dan membuangnya?
Jika Anda bisa menjawab ya, ya, tidak, dan 'ya, saya mencoba membuat alat daripada perhitungan satu kali', maka Anda sudah melakukannya dengan cukup baik. Banyak hal yang kami lakukan sebagai programmer dimaksudkan untuk membantu dengan hal-hal yang tercantum di atas.
sumber
Program Anda akan sepenuhnya berbeda dari kode sumber komersial, oleh karena itu banyak praktik dan pendekatan yang baik tidak akan berlaku dalam pengembangan kode sumber Anda sehari-hari. Tetapi ada cara yang baik untuk mempelajari beberapa tips dan trik.
Biarkan beberapa pengembang perangkat lunak yang baik meninjau kode Anda dan mengoptimalkannya bersama. Itu akan memberi Anda lebih banyak pengalaman dan akan mengajarkan Anda praktik-praktik yang baik. Tinjau juga kode sumber yang ditulis oleh orang lain. Cari proyek open source di sourceforge atau github dan baca kode sumbernya.
Tetapi yang terpenting, pikirkan apakah Anda benar-benar perlu mempelajari sesuatu yang baru untuk mencapai tujuan Anda. Melakukan hal-hal yang tidak perlu hanya untuk membuat kode terlihat lebih cantik tidak akan menambah nilai pada aplikasi Anda.
sumber
Sejauh menjadi programmer yang lebih baik, tidak ada peluru ajaib. Jika Anda belajar sendiri kuncinya adalah kesadaran diri, yang sepertinya Anda miliki. Namun, belajar kode dengan baik sebagian besar berasal dari membaca dan berlatih.
Menjadi kritis terhadap kode Anda sendiri adalah salah satu cara terbaik untuk menjadi lebih baik. Selalu bertanya pada diri sendiri:
Saran saya yang lain adalah jangan mengunci diri Anda di C / C ++. Meskipun itu adalah bahasa yang baik yang digunakan karena suatu alasan, mereka mengharuskan Anda untuk melakukan banyak hal yang tidak berhubungan dengan materi pelajaran. Lihat ke Matlab, saya akan terkejut jika universitas tidak memiliki yang tersedia untuk Anda. Pertimbangkan bahasa scripting seperti Python. Sangat mempertimbangkan mengambil bahasa fungsional seperti Haskell - paradigma ini sangat matematis dan kemungkinan akan cocok dengan masalah Anda seperti sarung tangan. Singkatnya, jelajahi beberapa bahasa / paradigma lain. Bahkan jika mereka tidak menjadi alat permanen di ikat pinggang Anda, mereka akan membuat Anda menjadi programmer yang lebih baik.
Anda mungkin juga ingin melihat beberapa desain algoritma. Saya menduga telah mendapatkan pekerjaan, Anda sudah relatif siap untuk mengabaikan ini, tetapi algoritma sangat penting ketika melakukan analisis numerik. Bahkan, saya menduga, ada sumber daya yang secara khusus diarahkan pada algoritma analisis numerik.
Jangan pernah melupakan tujuan utama Anda dalam menulis kode. Anda harus menyelesaikan sesuatu. Menjadi programmer yang lebih baik adalah salah satu metode untuk melakukannya. Memilih alat yang tepat untuk pekerjaan itu adalah hal lain.
sumber
Pertama, "elegan" adalah istilah yang relatif. Abstraksi mungkin tampak elegan bagi Anda tetapi bagi penggemar C lainnya, mungkin tampak tidak perlu. Bagaimanapun, untuk menjawab pertanyaan Anda, Anda harus mencoba memposting kode Anda untuk ditinjau http://codereview.stackexchange.com .
Digressing dari titik utama, beberapa saran yang tidak diminta berdasarkan pengalaman saya sendiri. Jika Anda bisa menyelesaikan semua pekerjaan Anda hanya dengan C, lalu mengapa Anda ingin mengkodekannya secara abstrak? Dengan ini, apakah Anda ingin memungkinkan orang lain menggunakan kembali kode Anda? Jika Anda benar-benar memiliki alasan kuat untuk beralih ke C ++, pilih abstraksi dan pelajari konsep C ++ dan OO. Kalau tidak hentikan idenya. Menurut pendapat saya yang sederhana, haruskah Anda bertujuan agar kode Anda lebih mudah dibaca dan hasil ilmiah Anda dapat direproduksi daripada memberikannya dengan abstraksi OO? Saya sendiri memiliki obsesi semacam ini untuk mempelajari OOPS dan kode "elegan". Tetapi C ++ akan membutuhkan waktu untuk dikuasai. Anda harus mempelajari manajemen memori karena pengumpulan sampah tidak otomatis dalam C ++. Ikuti saran saya karena saya bekerja untuk laboratorium penelitian sendiri dan kehilangan banyak waktu untuk belajar C ++ dan OO,
sumber
Mengingat Anda kekurangan waktu untuk mempelajari teori.
Jika Anda telah melihat kembali kode lama Anda setelah beberapa bulan dan bertanya-tanya "idiot macam apa yang menulis kode itu", Anda membuat kemajuan.
Bagaimana kemajuan Anda? Dengan melihat kode yang lebih baik ditulis oleh orang lain. Seseorang tidak pernah tahu nilai kode 'keanggunan' atau 'baik' kecuali mereka melihatnya menambah nilai pada pekerjaan mereka. Daripada membaca teori, saya mendorong Anda untuk membuka mata terhadap kode yang ditulis oleh orang lain di bidang pekerjaan Anda. Buka mata Anda terhadap konsep yang sedang dibahas di stackoverflow (tag C ++). Menghabiskan hanya lima belas menit sehari untuk pencarian seperti itu dapat secara acak memaparkan Anda pada konsep yang dapat membantu Anda. Itu dapat menunjukkan kode yang lebih baik ditulis daripada kode Anda. Saat itulah Anda menindaklanjuti di Wikipedia dan mencari tahu lebih banyak tentang hal itu. Pembelajaran seperti itu yang muncul dari rasa ingin tahu, akan jauh lebih tahan lama dan bermanfaat bagi Anda daripada teori yang akan Anda lupakan ketika Anda bangun keesokan harinya.
Juga pertimbangkan untuk mencoba bahasa seperti MATLAB atau Python.
sumber
Ketika seorang fisikawan menjadi programmer, saya menemukan latar belakang fisika saya paling membantu dalam membentuk metafora yang tepat untuk memahami konsep perangkat lunak. Perspektif ini juga membuat belajar pemrograman lebih menyenangkan bagi saya dan membantu saya mengembangkan rasa "keanggunan" dalam perangkat lunak, yang tampaknya Anda perjuangkan.
Saya telah menggambarkan peran penting dan kurang dihargai dari metafora dan analogi dalam perangkat lunak dalam kolom CUJ saya "Pola Berpikir - nama, metafora, pemrograman yang lebih baik, dan politik bahasa" . Sebagai contoh, konsep OO tentang pewarisan kelas sering dibandingkan dengan mewariskan sifat dari orang tua kepada keturunan dalam keluarga. Ini analogi yang salah. Analogi yang benar untuk pewarisan kelas adalah klasifikasi biologis organisme (misalnya, kelas RedRose adalah jenis Bunga, dan Bunga adalah jenis Tanaman).
Atau ambil contoh konsep perangkat lunak mesin status hierarkis. Metafora yang baik di sini adalah konsep sistem kuantum terikat seperti atom hidrogen. Seingat Anda, keadaan sebuah atom diberi nomor oleh tiga bilangan kuantum | n, l, m>, tepatnya karena mereka "bersarang" (hierarkis). Metafora ini menunjukkan kepada Anda bagaimana memahami keadaan sarang dalam keadaan (seperti keadaan momentum sudut (l) sarang dalam keadaan energi (n)) dan juga Anda segera melihat bahwa keadaan sarang selalu merupakan cerminan dari beberapa simetri sistem.
Analogi lain yang menarik dari fisika adalah "model aktor perhitungan", yang akhir-akhir ini telah ditemukan kembali karena CPU multi-core dan komputasi terdistribusi di "cloud". Saya merasa terbantu dan asyik memikirkan peristiwa yang dipertukarkan oleh aktor kenegaraan (alias objek aktif) sebagai boson virtual, seperti foton di QED, atau gluon di QCD. Metafora ini menjelaskan sifat dasar komunikasi yang tidak sinkron, proses peristiwa run-to-completion (lompatan kuantum), dan enkapsulasi ketat dari objek aktif, yang hanya dapat berinteraksi satu sama lain melalui artefak perantara eksplisit.
Bagaimanapun, mengembangkan metafora sistem adalah praktik yang disarankan di XP (Pemrograman eXtreme), dan sebagai fisikawan Anda akan memiliki keunggulan dalam menghasilkan metafora yang baik. Anda juga akan merasakan "keanggunan", karena perangkat lunak Anda akan mewarisi integritas konseptual dari metafora baik yang Anda terapkan.
sumber
Saya dapat memberi tahu Anda bahwa keuntungan terbesar yang saya dapatkan dalam hal bagaimana saya mendekati pemecahan masalah semuanya telah dicapai melalui pembelajaran bahasa dan parser fungsional. Kedua penemuan itu terjadi secara kebetulan. Jadi saya memberi tahu Anda sekarang jika Anda benar-benar serius untuk menjadi programmer yang lebih baik maka Anda perlu belajar tentang berbagai teknik yang terlibat dalam menulis kompiler, misalnya parser dan parser generator, dan Anda perlu belajar bagaimana membuat perhitungan dengan urutan yang lebih tinggi. fungsi.
Sumber yang bagus untuk parser dan kompiler adalah PL101: Buat Bahasa Pemrograman Anda Sendiri . Saya masih belum menemukan pengantar yang bagus untuk pemrograman fungsional tetapi saya mendengar hal-hal yang sangat baik tentang SICP .
sumber
Lulusan Ilmu Komputer tidak tahu cara membuat kode dengan baik ketika mereka lulus; mereka tidak banyak diminta ketika mereka meninggalkan Universitas. Hanya jika mereka mendapatkan pengalaman itu.
Jawaban atas pertanyaan Anda adalah Anda perlu mempelajari Pola Desain. Saya diprogram di Java, .NET dan sekarang saya bekerja sebagai programmer PHP, Javascript dan MySQL. NET. Omong-omong memiliki tingkat abstraksi yang sangat besar, misalnya ASP.NET. Ini berarti Anda dapat melewati pembelajaran abstraksi. Bahasa seperti Perl, PHP, dll. Memiliki tingkat abstraksi yang rendah.
Baca Head First Design Patterns, ini buku yang bagus. Buku ini cukup komprehensif. Itu semua yang Anda butuhkan.
sumber