Mengajar diri saya sendiri, sebagai fisikawan, untuk menjadi programmer yang lebih baik [ditutup]

17

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?

pengguna787267
sumber
12
Sebuah pertanyaan: Bagaimana Anda tahu kode Anda efisien?
Matsemann
Saya telah melihat banyak orang mengatakan tidak pada C ++ sebagai bahasa OO pertama. Saya belajar java dan saya menemukan tutorial video Mark Dexter di sini eclipsetutorial.sourceforge.net/totalbeginner.html , mereka cukup bagus dan akan mengajarkan Anda cara TDD. Lihat juga Head First Java, cukup bagus untuk menutupi Java dengan cara OO.
Garv
4
@DeveloperDon, perhitungan adalah bagian utama dari fisika bahkan sebelum ada komputer elektronik. Perhitungan dilakukan dengan tangan, atau dengan kalkulator mekanik. Sejak fisikawan Perang Dunia II telah sangat terlibat dalam perangkat lunak. Jika Anda menghitung kembalinya komet, mensimulasikan produksi neutron dalam reaksi berantai nuklir, atau menganalisis gigabyte data yang mencari tanda-tanda Higgs Boson, Anda harus melakukan banyak perhitungan angka. Kembali pada tahun 1974 paruh pertama lab fisika tahun pertama saya dikhususkan untuk mengajar FORTRAN.
Charles E. Grant
1
@DeveloperDon Ketika fisikawan di CERN, misalnya, mendapatkan data, mereka mendapatkan data dari jutaan tabrakan partikel. Anda memerlukan komputer untuk menangani informasi sebanyak ini. Juga pertimbangkan area seperti fisika keadaan padat di mana Anda mencoba memahami sifat makroskopis suatu material dari interaksi mikroskopis atom. Dalam sistem seperti itu satu elektron merasakan tolakan / tarikan dari miliaran inti dan elektron - dan untuk menggambarkan sistem seperti itu secara akurat, Anda memerlukan komputer yang cepat dan algoritma yang efisien (dan beberapa perkiraan yang bagus untuk persamaan fundamental).
user787267
1
Mungkin Anda harus mengubah bahasa Anda dari C / C ++ ke Python sehingga Anda dapat memiliki lebih banyak waktu? Python sering digunakan oleh para ilmuwan , ada modul seperti NumPy - paket untuk komputasi ilmiah dengan Python atau SciPy . Jika Anda membutuhkan kecepatan C / C ++ di Python kemudian menggunakan Cython , ini memungkinkan Anda untuk menggunakan tipe dan struktur C / C ++ sehingga Anda mendapatkan kecepatan yang mirip dengan C / C ++, juga mudah untuk diintegrasikan dengan pustaka C / C ++ yang ada menggunakan Cython.
Czarek Tomczak

Jawaban:

20

Perlu diingat bahwa saya tidak punya waktu untuk membaca beberapa buku tebal 1000 halaman tentang pemrograman abstrak.

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 .

Charles E. Grant
sumber
Terima kasih atas tautannya, saya akan memeriksanya. Saya tahu saya tidak akan menjadi guru coding di akhir pekan, namun saya berharap untuk secara bertahap membaik seiring waktu - terutama jika saya mencari inspirasi di luar fisika (seperti banyak fisikawan yang saya tahu tidak peduli dengan praktik pengkodean yang baik).
user787267
1
Saya akan menambahkan python dalam alat sebagai hitungan yang dapat dibaca
Xavier Combelle
2
+1 untuk menyarankan Kode Selesai. Ini benar-benar adalah hal terbaik yang dapat dibaca oleh op untuk menyelesaikan masalah tersebut.
JW01
9

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
MentorNet terlihat sangat menarik - saya akan memeriksanya. Apakah itu transisi yang sulit dari fisikawan ke insinyur perangkat lunak?
user787267
@ user787267 Karena saya tertarik pada pemrograman (dan sudah menjadi programmer hobbyist), saya termotivasi untuk membuat transisi karena kedengarannya seperti Anda, jadi saya tidak menemukan sisi teknis yang sulit. Yang perlu waktu lebih lama bagi saya untuk mengatasi adalah perangkat basah: memahami tempat saya di tim proyek yang lebih besar dan yang ahli dalam apa yang merupakan perubahan besar dari pengkodean "lone wolf" yang saya lakukan sebelumnya.
5

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:

"Aku perlu menghabiskan waktu untuk fisika yang sebenarnya"

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:

  • Aplikasi dengan perangkat keras, sistem tertanam.
  • Proyek yang ada Anda inginkan sebagai titik awal.

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?

Pengembang Don
sumber
4

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.

Benjamin Bannier
sumber
Terima kasih atas tautannya! Saya pasti akan memeriksanya (tapi saya pikir saya tidak punya waktu untuk membaca beberapa buku - meskipun saya telah membaca C ++ dipercepat kembali di sekolah menengah di beberapa titik). Saya bekerja di lingkungan Unix (saya menggunakan Vim sebagai editor saya dan menyukainya), dan saya menggunakan make dan Valgrind secara luas. Saya juga telah memicu opsi -pedantic di gcc dan -Wall karena ini membantu sedikit. Mungkin saya seharusnya menyebutkan bahwa saya melakukan komputasi kinerja tinggi (dengan perpustakaan MPI untuk pemrograman paralel) pada superkomputer universitas.
user787267
Saya juga harus menyebutkan Python tidak benar-benar pilihan karena kode saya harus sangat cepat - walaupun saya suka untuk merencanakan misalnya. Saya banyak menggunakan Matlab.
user787267
Saya cukup sering menggunakan Python sebagai front-end untuk berbicara dengan rutin yang diimplementasikan dalam C ++ saya sendiri. Dengan Boost, ini sangat mudah dan Anda mendapatkan fleksibilitas penuh Python (misalnya untuk memproses data untuk merencanakan). Juga, Python cukup rapi untuk pembuatan prototipe. Setelah saya tahu sesuatu menjadi sangat penting, saya selalu dapat memindahkannya ke C ++. Karena Anda menyebutkan MPI, saya akan merekomendasikan Anda untuk menghabiskan malam dengan IPython dengan membuat antarmuka yang bagus untuk komputasi terdistribusi.
Benjamin Bannier
@ user787267 Tidak perlu lagi benar bahwa Python berkinerja lambat - lihat di youtube.com/watch?v=Iw9-GckD-gQ misalnya. Kuncinya adalah Anda dapat menggunakan Python untuk lebih cepat menulis kode kerja yang kemudian dapat mempercepat dengan 1) menggunakan numpy / scipy 2) menggunakan Cython atau shedskin, dan 3) menempatkan hanya algoritma inti ke dalam modul C / C ++ atau FORTRAN jika Anda benar-benar membutuhkan peningkatan 5% terakhir. Juga ingat, waktu yang Anda habiskan untuk pengkodean adalah waktu kodenya belum berjalan, jadi kadang-kadang mungkin lebih efisien untuk memiliki kode kinerja 80% yang ditulis separuh waktu
Tobias Kienzler
Saya biasanya membuat prototipe di Matlab untuk menguji hal-hal yang mudah, tetapi saya ingin mengubah ke Python untuk sementara waktu. Saya akan melihatnya. Karena sebagian besar kode saya sudah ditulis dalam C ++ saya tidak ingin mengubah bahasa setengah jalan. Meskipun benar Anda juga harus mempertimbangkan waktu pemrograman waktu aktual (dan percayalah, saya tahu), saya tidak berpikir itu harus menjadi alasan untuk tidak meningkatkan keterampilan pemrograman Anda (secara bertahap).
user787267
4

Bagaimana saya menilai jika pekerjaan saya juga bagus dari sudut pandang programmer?

  • 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.

Caleb
sumber
3

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.

Andrzej Bobak
sumber
Membaca dan berpartisipasi dalam proyek-proyek open source sebenarnya adalah ide yang sangat bagus - tetapi sesuatu yang harus saya lakukan di waktu luang saya (tetapi karena saya suka pemrograman yang seharusnya tidak terlalu menjadi masalah). Salah satu alasan saya ingin menjadi programmer yang lebih baik adalah karena saya tidak yakin apakah saya akan tetap di dunia akademis. Ketika Ph.D saya selesai saya mungkin hanya mendapatkan pekerjaan di industri - dan di sini seorang programmer yang terampil harus dalam permintaan tinggi. Alasan lain adalah kepuasan intelektual untuk menciptakan sesuatu yang elegan / indah - seperti memecahkan persamaan diferensial yang sangat sulit.
user787267
Sayangnya industri membutuhkan keterampilan yang biasanya tidak Anda peroleh dalam pengembangan akademik. Hal-hal yang akan Anda tulis selama penelitian akademis Anda biasanya kurang dari 5% dari kode sumber aplikasi komersial.
Andrzej Bobak
3

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:

  • Apakah ini mudah untuk diubah?
  • Apakah ini mudah diuji?
  • Bisakah saya menyederhanakan ini? Dapatkah saya dengan mudah memahami ini ketika saya melihatnya lagi dalam 3 bulan?

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.

Mike Cellini
sumber
2

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,

hAcKnRoCk
sumber
1
Tetapi C bahkan lebih tidak dikelola daripada C ++. Di C ++ setidaknya ada RAII.
Benjamin Bannier
Saya suka kode, jadi saya ingin menjadi programmer yang lebih baik. Saya seorang ahli fisika pertama dan seorang programmer kedua, tetapi itu tidak berarti saya tidak boleh meningkatkan keterampilan pemrograman saya - lagi pula, jika saya memutuskan untuk menerbitkan kode saya bersama dengan hasil ilmiah, akan lebih baik untuk bersenang-senang, kode yang bisa dibaca.
user787267
2

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.

Nav
sumber
Saya menghabiskan banyak waktu di Stack Exchange - ini adalah sumber yang sangat berharga bagi saya dalam pekerjaan sehari-hari. Saya sudah sering menggunakan Matlab, tetapi sangat mudah untuk mengembangkan kebiasaan buruk seperti tidak mengalokasikan array karena sangat memaafkan.
user787267
+1 untuk python @ user787267 Saya tidak begitu mengerti mengapa tidak preallocating array adalah kebiasaan buruk
Xavier Combelle
2

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.

Miro Samek
sumber
Meskipun fisika berpotensi menjadi sumber metafora yang kaya, niat di XP adalah menemukan metafora yang memfasilitasi komunikasi dengan pelanggan di tempat dan anggota tim lainnya, jadi umumnya akan cenderung memilih metafora yang lebih umum dipahami.
Pete Kirkham
2

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 .

davidk01
sumber
-5

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.

Dmitry Makovetskiyd
sumber
Saya punya ide mengapa jawaban ini diturunkan, tetapi mungkin itu akan berguna jika para downvoter mengatakan mengapa?
Pierre Arlaud