Halo, Habr! Saya hadir untuk Anda terjemahan artikel "
Nasihat untuk siswa pemrograman ".
Ada banyak hal yang ingin saya ketahui ketika saya memulai perjalanan saya sebagai mahasiswa perangkat lunak. Hampir 10 tahun telah berlalu sejak itu, dan, sayangnya, saya tidak bisa berbagi pengalaman dan pengetahuan saya dengan "saya" masa lalu saya, hanya dengan rekan muda saya. Posting ini terdiri dari beberapa tips berguna yang ingin saya dengar ketika saya berusia 18 tahun.
Putuskan apa yang Anda butuhkan
Tentu saja, Anda tidak perlu terbiasa dengan logika atau
kategori formal jika Anda hanya ingin belajar cara membuat sesuatu yang praktis (katakanlah, antarmuka) dan lakukan hal itu. Ada dua jalur utama yang berbeda dalam upaya, durasi, dan hasil.
- Anda dapat dengan cepat menguasai satu area - katakan dalam satu atau dua tahun. Anda tidak akan sia-sia, Anda akan melakukan sesuatu dan mencari nafkah. Ada cukup banyak peluang kerja (setidaknya untuk saat ini) yang tidak memerlukan banyak fleksibilitas.
- Anda bisa menjadi spesialis yang telah menghabiskan banyak waktu dan upaya untuk hal-hal mendasar. Maka Anda bisa beradaptasi, beralih jalur karier menjadi relatif mudah. Anda dapat melakukan pembelajaran mesin, kemudian verifikasi formal, lalu beberapa pemrograman tingkat rendah untuk berdagang, atau mengunjungi pengembang game. Butuh waktu dan dedikasi - saya akan mengevaluasi proses ini setidaknya selama 6-8 tahun.
Saya sangat menganjurkan jalan kedua, karena lebih universal, menarik dan membawa lebih banyak dalam jangka panjang. Teknologi terus berubah, sehingga Anda ingin cepat beralih ke teknologi baru.
Matematika
Belajar matematika karena matematika bermanfaat. Saya tidak bisa menekankan ini. Ketika Anda mulai, Anda mungkin berpikir bahwa Anda tidak memerlukan aljabar linier karena Anda tidak tahu tentang aplikasi. Namun, untuk pembelajaran mesin non-sepele, Anda akan membutuhkannya. Anda membutuhkan statistik dan kredibilitas. Anda akan memerlukan logika, kombinatorik, teori himpunan, semua jenis matematika diskrit, teori graf, teori komputabilitas, tata bahasa formal, kalkulus lambda, semantik formal, topologi, teori jenis, teori bilangan, kelompok teori, kelompok, cincin, bidang, kategori.
Teknologi baru terus muncul. Banyak dari mereka didasarkan pada model matematika yang ada. Jika Anda tahu matematika dasar dengan baik, Anda mendapatkan manfaat yang sangat bagus:
- Pilihan di antara teknologi bermodel baru akan dibuat lebih mudah.
- Anda akan memahami di mana metode baru harus diterapkan dan di mana tidak.
- Anda akan mengerti mengapa solusi adalah apa adanya. Anda kemudian dapat memodifikasinya agar lebih sesuai dengan konteksnya.
Sebagai contoh, saya mendapat kesan bahwa beberapa orang mengerti mengapa Anda tidak selalu harus menggunakan metode kuadrat terkecil untuk mengevaluasi seberapa baik regresi linier Anda cocok dengan data. Ini diperlukan ketika kesalahan didistribusikan secara normal dengan nilai rata-rata yang sesuai. Jika bukan ini masalahnya, Anda akan secara buta menerapkan solusi yang tidak memadai bahkan tanpa berpikir bahwa bagian dari model perlu disetel.
Belajar matematika untuk belajar berpikir matematika. Menulis bukti membuat Anda bersikap tegas dalam bertindak. Anda akan selalu memikirkan semua jalur eksekusi yang mungkin dijalankan oleh program Anda agar tidak menimbulkan kesalahan dan masalah keamanan. Kejernihan berpikir yang didapat dari membangun bukti sangat berharga. Ini juga akan membantu Anda menulis kode singkat dan ringkas.
Pelajari yang terbaik, gunakan alat terbaik
Pilih bahasa pertama Anda. Itu harus dirancang dengan baik, yaitu, memiliki:
- Koherensi
- Inti kecil.
- Kurangnya kompleksitas yang tidak perlu (misalnya, ketika belajar bahasa "kompleks", ada hal-hal yang hanya perlu Anda ketahui atau ingat terus-menerus, mereka tidak membawa sesuatu yang berguna untuk belajar).
- Peluang rendah untuk "tembak dirimu sendiri."
- Tingkat tinggi, karena pemrograman adalah solusi dari masalah dan masalah , dan tidak penguasaan dalam bahasa apa pun. Untuk mengetahui semua fitur kecil dari bahasa favorit Anda tidak berarti menjadi sempurna dalam pemrograman.
Saya sarankan memilih salah satu dari bahasa berikut:
- Skema (ada kursus pengantar klasik yang sangat baik "Struktur dan Interpretasi Program Komputer").
- Smalltalk
- Eiffel
- ML
Jangan takut tertipu oleh ketidakpopuleran bahasa-bahasa ini, di dunia pemrograman, popularitas tidak berarti kualitas.
Jangan mulai dengan Python, saya mohon! Ini dirancang dengan buruk, tidak konsisten, dan tidak mengajarkan Anda pemikiran yang ketat. Tidak perlu terbiasa dengan mentalitas "baik, biasanya bekerja". Python memiliki kegunaannya, tetapi bukan sebagai bahasa pertama.
Jika Anda terbiasa dengan bahasa
berkualitas rendah dan alat berkualitas rendah, dan perangkat lunak berkualitas rendah, dan solusi berkualitas rendah,
Anda pasti akan mengulanginya dalam pekerjaan Anda sendiri . Jadilah kritis, ajukan pertanyaan, kritik segalanya, cari ketidakkonsistenan dan kekurangan.
Misalnya, bayangkan Anda sedang belajar bahasa Go yang baru. Google โGo language sucksโ dan baca mengapa orang mengkritiknya. Beberapa komentar kecil, tetapi yang lain benar-benar masuk akal. Anda mungkin akan mendapatkan pengetahuan baru dari membaca komentar kritis, mengevaluasinya, kemudian untuk menentukan apakah itu penting, atau hanya kata-kata kosong.
Pikirkan sendiri
Saya telah mengajar pemrograman (C dan assembler) sejak 2009 kepada mahasiswa Universitas ITMO di St. Petersburg. Banyak orang memiliki masalah pemrograman dan mereka tidak pernah berhasil mempelajari ini karena mereka tidak membuat kode. Ketika mereka mendapatkan pekerjaan, mereka mencoba untuk mensimulasikan solusi yang ada, mungkin dengan mengambil beberapa fragmen dari Stack Overflow, menyesuaikannya dengan keinginan mereka. Ok, ada solusinya, apa lagi yang dibutuhkan?
Anda harus belajar menulis kode dari awal. Jenis keterampilan yang diperlukan untuk melakukan ini sangat berbeda dari keterampilan yang diperoleh dengan mengganggu kode yang ada!
Memprogram berarti membuat pilihan sadar. Anda berada di negara A (Anda memiliki akses ke sejumlah fungsi bahasa / perpustakaan, dan Anda tahu cara menggabungkannya); Anda ingin mendapatkan status B (konstruksi bahasa digabungkan untuk menyelesaikan masalah). Bagaimana Anda membangun rute dari A ke B? Sekarang ini adalah pemrograman nyata,
pemecahan masalah .
Ketika Anda mulai menulis program dari awal, ini akan menjadi sedikit sulit, tetapi sangat penting untuk belajar bagaimana membangun sesuatu dari awal. Untuk meningkatkan keterampilan pemecahan masalah, penting untuk mempelajari algoritma dan struktur data. Ambil buku bagus dan selesaikan masalah olimpiade online. Saya merekomendasikan Algoritma Dasgupta sebagai permulaan, kemudian buku klasik Cormen. Semua ini akan membuka dunia baru bagi Anda, saya janji.
Bagian tambahan dari proses pembuatan perangkat lunak adalah pengembangan arsitektur perangkat lunak; tidak mungkin mempelajari cara menyusun program dengan benar tanpa membuatnya dari 0 hingga 100.
Perluas wawasan Anda
Program setiap hari, lakukan proyek pihak ketiga sepanjang waktu. Ini adalah cara yang sangat sederhana (dan sebagian besar akurat) bagi saya sebagai guru untuk memahami bahwa siswa saya sangat mungkin berhasil. Satu pertanyaan: apa yang Anda programkan di waktu luang Anda?
Guru Anda tidak punya cukup waktu bagi mereka untuk membicarakan segalanya. Pada akhirnya, setelah Anda meninggalkan universitas, Anda harus terus belajar sendiri sampai Anda pensiun. Jika Anda bersemangat tentang apa yang Anda lakukan, Anda akan belajar berbagai jenis perangkat lunak untuk bersenang-senang, dan ini akan memberi Anda lebih banyak pengalaman dan keterampilan daripada rekan-rekan Anda yang kurang termotivasi.
Idealnya, Anda harus mencoba segalanya: menulis kompiler Anda sendiri, mungkin OS mainan, server http, mesin basis data, game, rakecasting, membuat beberapa jenis jaringan saraf, menulis aplikasi seluler sederhana, menulis program untuk built-in ..., Anda bisa melanjutkan diri. Letakkan semua proyek Anda di GitHub dan bangga akan mereka: perusahaan Anda di masa depan dapat melihatnya. Gunakan portofolio ini untuk tujuan Anda sendiri.
Sudah diketahui bahwa merekrut programmer yang baik sangat sulit. Banyak programmer yang melamar pekerjaan kesulitan menulis hal-hal sepele seperti FizzBuzz. Jika Anda memiliki proyek yang ada di GitHub, majikan akan lebih yakin bahwa Anda cocok untuknya.
Uji diri Anda dengan berbagai alat dan bahasa. Jika seseorang memberi tahu Anda bahwa semua bahasa serupa, itu adalah penyederhanaan atau kurangnya pengalaman. Biarkan saya jelaskan sedikit.
Model komputasi adalah himpunan yang terdiri dari operasi dasar dan cara untuk menyatukannya dalam urutan yang diperlukan untuk membuat algoritma yang kompleks. Beberapa bahasa memiliki model komputasi yang sangat mirip, dan beberapa bahasa sangat bervariasi.
Pemrograman lebih dari sekadar C / Python / Java / C ++ / C # / Go / Javascript yang terkenal, dibangun dengan prinsip yang sama: imperatif, struktural, sedikit dengan OOP dan gula sintaksis untuk mensimulasikan gaya pemrograman lain. Dunia pemrograman adalah BESAR. Bagaimana dengan:
- Bahasa pemrograman fungsional industri dengan sistem khas yang rumit dan dipikirkan dengan baik (Haskell, Ocaml).
- Bahasa fungsional dengan tipe dependen yang memungkinkan tidak hanya pemrograman, tetapi juga merekam bukti (Coq, Agda, LEAN).
- Bahasa Concatenative (Keempat).
- Pemrograman logis (Prolog, Refal).
- Mesin keadaan terbatas (ekspresi reguler, Promela).
- Bahasa yang sangat extensible yang memungkinkan Anda untuk mengimplementasikan hampir semua sintaks konstruksi, seperti Lisp, Forth, Camlp4 / 5, Rebol.
- Bahasa khusus domain (JetBrains MPS, XText).
Setiap model komputasi yang baru sulit untuk dipahami, karena ini adalah cara berpikir yang baru. Tetapi usaha dan waktu itu sepadan.
Bersosialisasi
Saya sangat beruntung bertemu dengan beberapa orang luar biasa. Asisten saya membantu saya meningkatkan keterampilan, belajar sesuatu yang baru, melihat dunia dari sudut pandang yang berbeda. Mengisolasi diri sendiri tidak akan ada gunanya bagi Anda dalam jangka panjang: Anda perlu orang lain untuk berdiskusi untuk memahami apa yang mereka lakukan, apa yang mereka pikirkan.
Jika teman Anda membaca artikel yang menarik dan memberi tahu Anda tentang hal itu, Anda hanya menghemat banyak waktu karena dia memberi Anda pengetahuan yang diproses dan terkristalisasi.
Tetap berpegang pada orang-orang yang bersemangat dan cerdas, dan cobalah belajar dari mereka. Anda akan terkejut betapa banyak yang dapat Anda pelajari selama makan siang dengan rekan-rekan Anda yang ingin berbagi rincian pekerjaan atau penelitian mereka. Keragaman ide ini adalah salah satu alasan utama korporasi seperti Google memberi Anda makanan gratis.
Tanyakan orang yang lebih baik dalam meninjau kode dan membaca kode mereka. Dengan mempelajari pekerjaan orang lain, Anda dapat belajar banyak. Ulasan kode akan membantu Anda mempelajari cara menulis kode dengan lebih baik. Ini mungkin salah satu cara paling efektif untuk menjadi programmer yang lebih baik dengan sangat, sangat cepat.
Tulis tes
Sangat penting bahwa Anda memerlukan artikel terpisah untuk ini. Pengujian adalah bagian integral dari pembuatan perangkat lunak, dan bahkan orang-orang seperti saya yang bekerja pada perangkat lunak yang diuji secara formal (yang berarti harus secara matematis terformalkan dengan keras) menulis tes, meskipun Anda mungkin berpikir bahwa jaminan yang diberikan oleh bukti jauh lebih kuat.
Saya harap ini dapat membantu seseorang mendapatkan gambar yang lebih baik, belajar lebih cepat dan menjadi programmer yang lebih baik; Jika Anda memiliki pertanyaan, saya akan dengan senang hati membantu. Semoga beruntung