Bagaimana saya bisa benar-benar menguasai bahasa pemrograman?

103

Saya tahu bahwa belajar bahasa, Anda cukup membeli buku, mengikuti contoh-contohnya, dan sedapat mungkin mencoba latihannya. Tapi yang benar-benar saya cari adalah bagaimana menguasai bahasa setelah Anda mempelajarinya.

Sekarang saya tahu bahwa pengalaman adalah salah satu faktor utama, tetapi bagaimana dengan mempelajari internal bahasa, apa struktur yang mendasarinya, dll.

Ada artikel di luar sana yang mengatakan baca buku ini, baca buku itu, buat game ini dan game itu. Tetapi bagi saya ini tidak berarti menguasai bahasa. Saya ingin dapat membaca kode orang lain dan memahaminya, tidak peduli betapa sulitnya itu. Untuk memahami kapan harus menggunakan suatu fungsi dan kapan lainnya, dll.

Daftarnya bisa terus dan terus tapi saya yakin saya sudah membuat titik. :)

Dan akhirnya, ambil bahasa apa pun sebagai contoh jika diperlukan, meskipun yang terbaik adalah jika C diambil sebagai contoh.

cprogcr
sumber
11
Pengalaman adalah hal yang paling mendasar. Semua teori yang Anda kuasai tidak ada gunanya kecuali Anda bisa menerapkannya secara praktis.
Simon Whitehead
2
Terapkan kompiler untuk bahasa ini. Sebenarnya, itulah cara favorit saya untuk mencoba bahasa baru apa pun. Jika kedengarannya agak terlalu mudah dan membosankan, cobalah mendefinisikan semantik bahasa formal sebagai gantinya, menggunakan kerangka kerja K atau yang serupa.
SK-logic
6
"manusia, kentang adalah dinossaur, jagat raya mobil". tidak masalah seberapa banyak Anda menguasai bahasa, jika kodenya buruk dan tidak masuk akal, masih sulit untuk dipahami.
Renato Dinhani
2
Saya merasa sedikit kehilangan poin. Langauges berevolusi, jadi tidak ada penguasaan bahasa, Anda tumbuh dengannya, semakin Anda menggunakannya semakin Anda harus belajar.
nycynik
2
Kode dan baca kode. Ambil bagian acak dari kernel linux (Pemrograman C) dan cari tahu apa fungsinya.
Alex Hart

Jawaban:

166

Saya harus menjawab, "Semua yang di atas." Orang-orang berdebat tentang apakah pengkodean adalah seni, kerajinan, disiplin teknik, atau cabang matematika, dan saya pikir paling adil untuk mengatakan bahwa pengkodean itu masing-masing. Dengan demikian, semakin banyak teknik yang Anda gunakan untuk menguasai bahasa, semakin baik. Berikut ini sebagian daftar:

  • Gunakan bahasa sepanjang hari, setiap hari. Biasanya ini berarti dipekerjakan penuh waktu dalam bahasa.

  • Baca semua yang Anda bisa tentang bahasa. Terutama, "praktik terbaik" dan idiom.

  • Bergabunglah dengan grup pengguna untuk berbicara dengan orang lain tentang bahasa dan apa yang mereka lakukan dengannya.

  • Bekerja dengan kode orang lain! Tidak ada cara yang lebih cepat untuk mempelajari apa yang tidak boleh dilakukan dalam bahasa daripada harus membersihkan setelah seseorang yang melakukan sesuatu yang mengerikan.

  • Dukung kode yang Anda tulis - setiap bug menjadi tur bagi keputusan terburuk Anda!

  • Pelajari ilmu komputer dan bahasa secara umum

  • Belajar bahasa yang sangat berbeda. Pujian yang bagus untuk C akan menjadi bahasa fungsional seperti Lisp. Ini akan mengubah cara Anda berpikir tentang bahasa prosedural Anda.

  • Pelajari cara menggunakan kerangka kerja dan API yang tersedia untuk bahasa itu.

  • Luangkan waktu untuk melakukan percobaan sendiri dengan bahasa tersebut. SICP tidak berlaku untuk C, tetapi sikap belajar bahasa dengan menguji batasannya adalah sangat produktif.

  • Baca sejarah bahasa untuk mempelajari mengapa itu dibuat seperti itu.

  • Hadiri konferensi untuk mendengar penulis bahasa berbicara, atau untuk mendengar apa yang dilakukan pemimpin industri dengan bahasa tersebut.

  • Ambil kelas dalam bahasa ini.

  • Ajarkan bahasa tersebut kepada orang lain (terima kasih kepada Bryan Oakley )

Singkatnya, lakukan semua yang dapat Anda pikirkan. Tidak ada cara untuk mengetahui segalanya tentang sebagian besar bahasa. Setiap teknik pembelajaran yang Anda gunakan membawa perspektif tambahan untuk pemahaman Anda.

GlenPeterson
sumber
76
+5 untuk Mendukung kode yang Anda tulis - setiap bug menjadi tur bagi keputusan terburuk Anda!
Jennifer S
8
+1 hanya untuk kalimat terakhir:Every technique you use to learn brings and additional perspective to your understanding.
Izkata
1
@Izkata: OMG, apakah saya menulis itu? Saya sebenarnya penutur asli bahasa Inggris! Saya sudah memperbaikinya. Terima kasih!
GlenPeterson
2
@ GlenPeterson ... Sebenarnya, saya hanya menyalin disalin tanpa memperhatikan kalimat "off". +1 memang untuk maksud di baliknya. = P
Izkata
13
+1 untuk "Belajar bahasa yang sangat berbeda. Pujian yang bagus untuk C akan menjadi bahasa fungsional seperti Lisp. Ini akan mengubah cara Anda berpikir tentang bahasa prosedural Anda." - ini mungkin yang paling penting. Ini membantu Anda belajar cara belajar tentang pemrograman (yaitu apa yang harus dicari dalam situasi apa).
naught101
53

10.000 jam latihan adalah apa yang diperlukan.

Baca "Teach Yourself Programming Sepuluh Tahun"

Poin-poin penting dari atas:

  • Dapatkan tertarik pada pemrograman, dan lakukan beberapa karena itu menyenangkan. Pastikan itu terus menjadi cukup menyenangkan sehingga Anda akan bersedia untuk memasukkan sepuluh tahun / 10.000 jam Anda.
  • Program. Jenis pembelajaran terbaik adalah belajar sambil melakukan.
  • Bicara dengan programmer lain; baca program lain.
vartec
sumber
1
Itulah yang akan saya posting! Saya belum menghabiskan cukup waktu di P.SE, jelas.
Martijn Pieters
@MartijnPieters: :-D
vartec
8
Judul yang bagus untuk sebuah buku! Saya tidak sabar menunggu sekuelnya, "Teach Yourself to Program Well dalam 20 Tahun!"
GlenPeterson
16
Namun, Anda harus memastikan Anda tidak mengulangi 10 jam yang sama 1000 kali ...
Izkata
Tidak ada jumlah keahlian teknis yang akan membantu seseorang mengetahui untuk mengotomatisasi atau membuat program apa. Ini seperti mengatakan - pergi ke gym dan lakukan setiap latihan dasar dalam bola basket selama sepuluh tahun, selama 1 jam setiap hari. Puf! Anda seorang superstar bola basket (master) ... tidak, itu lebih dari sekedar keterampilan teknis. Karena itu, saya tidak menganggap ini sebagai jawaban untuk pertanyaan, yaitu, bagaimana menjadi seorang guru? Ini mungkin menjadi bagian dari solusi, tetapi ini bukan ramuan ajaib untuk penguasaan. Saya tahu - saya bukan master!
oemb1905
36

JANGAN PERNAH menganggap diri Anda penguasa seluruh bahasa sampai Anda menerapkan bahasa yang lebih baik dari itu. Yang berarti, untuk mempelajari cara kerja bahasa tertentu dari bawah, dapatkan buku yang mengajarkan Anda konsep penyusun / juru bahasa. Sebagai contoh:

  • C: Buku LCC Compiler

  • C ++: Desain dan Evolusi C ++ (Dan kemudian lanjutkan membangun kompiler C ++ Anda sendiri atau setidaknya pahami implementasi yang menggunakan kode Kompilator GNU C ++)

  • Java: Dapatkan "Inside JVM" dan dapatkan kode sumber javac. Kode .C "java" juga membantu

  • Python: implementasi CPython.

  • ObjectiveC: Hampir semua materi dari Apple tentang internal ObjC runtime env dan kode sumber kompiler akan membantu Anda.

  • Lisp: SICP Book (mengajarkan Skema dan kompiler penafsir dasar untuk bahasa mirip pelat): Lisp dalam Small Piece (buku bagus lainnya).

Aniket Inge
sumber
1
Sekarang inilah yang saya sebut jawaban. Saya sudah menerima satu tapi ini akan pantas "jawaban terbaik" jika itu sedikit lebih awal
cprogcr
2
Anda tidak tahu seberapa banyak jawaban Anda membantu. Saya membaca tentang buku-buku yang Anda sebutkan dan itu jenis barang yang saya butuhkan.
cprogcr
hehe saya belajar dari mereka. Senang membantu :-)
Aniket Inge
karena Anda menyebut C sebagai contoh, izinkan saya memberi Anda nama dua buku lagi, sebagai hadiah, yang dulu saya kuasai C seperti bagian belakang tangan saya): 1. OOC.PDF (tersedia online gratis) dan 2. Minix Book (walaupun buku pelaksana OS, inilah yang dibaca Linus Torvalds sebelum mengimplementasikan Linux)
Aniket Inge
1
ya oleh Andrew Tenenbaum, itu bukunya. Edisi apa pun baik untuk dibaca. Itu tidak memberi tahu Anda bagaimana "C" bekerja, tetapi ketika Anda melihat bagaimana perpustakaan C diimplementasikan untuk bekerja dengan sistem operasi yang Anda buat, Anda mulai memahami C lebih baik! Mungkin cukup untuk membiarkan Anda memodifikasinya. (Dan di situlah OOC masuk)
Aniket Inge
12

Coba gunakan bahasa untuk sesuatu yang tidak dimaksudkan untuk digunakan. Tulis driver perangkat dengan Python, atau pustaka manipulasi matriks di COBOL. Saya pikir salah satu cara terbaik untuk menguasai bahasa adalah dengan benar-benar mendorongnya, mencoba membuat kekuatannya mengatasi kelemahannya.

TMN
sumber
1
Ketika saya masih kuliah saya akan memutuskan bahwa saya akan "menguasai" bahasa begitu saya menulis Pong di dalamnya. Ini bekerja dengan sangat baik sampai saya belajar MIPS. Saya masih memiliki mimpi buruk.
Roddy of the Frozen Peas
Situs web di C dapat dilakukan?
BigSack
10

Saya akan memudahkan Anda. Anda tidak akan pernah menguasai bahasa. Titik. Jika Anda pikir sudah, maka jelas sekali belum. Tidak ada puncak gunung yang tiba-tiba Anda jangkau dan berkata, "Nah, sekarang, saya sudah sepenuhnya menguasai bahasa itu. Bagaimana sekarang?" Bahkan programmer berpengalaman yang telah bekerja dengan bahasa yang sama selama beberapa dekade akan memberitahu Anda bahwa kadang-kadang mereka masih menemukan ide-ide baru, proses, praktik, dll. Tujuan sebenarnya adalah untuk menguasai pemahaman konseptual Anda tentang bahasa atau bahasa. Kemampuan untuk mempelajari konsep-konsep baru dan kecepatan di mana Anda dapat mengadopsi fitur-fitur baru atau yang diubah dalam bahasa jauh lebih penting daripada menghafal pengetahuan tentang setiap kata kunci dan sintaksis. Berhentilah khawatir tentang "menguasai" suatu bahasa, dan hanya khawatir tentang terus meningkatkan dan memperbaiki kualitas dan efisiensi kode Anda.

Chris Pratt
sumber
2
The true goal is to master your conceptual understanding of a language or languages.Persis. Itu yang saya maksud.
cprogcr
Bahasa pemrograman apa pun terbatas. Itu dibangun dari sejumlah konsep yang terbatas, membutuhkan sejumlah trik idiomatis. Karena itu, mudah untuk menguasai bahasa apa pun. Tentu saja, seseorang tidak dapat menguasai pemrograman secara umum, selalu ada potensi untuk perbaikan lebih lanjut, tetapi pertanyaannya adalah secara khusus tentang bahasa yang diberikan .
SK-logic
SK-logic: bahasa pemrograman berubah, demikian juga perpustakaan dan lingkungannya. Akibatnya cara Anda bekerja dengan perubahan bahasa juga. Misalnya, jQuery mengubah cara kami bekerja dengan Javascript.
orlp
Mungkin benar bahwa tidak ada yang dapat benar-benar menguasai bahasa seperti C ++, tetapi untuk yang agak minimalis seperti Skema seharusnya sangat mungkin - seperti kata @ SK-logic, itu benar-benar pemrograman , dalam bahasa apa pun, yang tidak dapat dikuasai, karena bidang aplikasi tidak terbatas.
leftaroundabout
1
@ nightcracker, bahasa tidak "berevolusi". C99 akan selalu menjadi C99 dan tidak akan pernah berubah. C ++ 11 akan selalu tetap C ++ 11, bahkan setelah itu digantikan oleh bahasa generasi berikutnya. Lingkungan memang "berevolusi", ya, tapi jQuery tidak memperkenalkan teknik baru yang tidak dikenal sebelumnya ke komunitas bahasa lain . Mereka baru mengenal komunitas Javascript yang sempit saja.
SK-logic
5

Anda sudah tahu jawabannya

  • Anda harus menggunakan bahasa. Banyak. Untuk memecahkan beragam masalah sebanyak mungkin
  • Anda harus membaca (dan, idealnya, bekerja dengan) kode orang lain, lebih disukai orang yang memiliki tingkat penguasaan (yaitu pemahaman yang mendalam tentang setidaknya beberapa aspek bahasa). Dengan ekstensi, jika Anda dapat berbicara dengan orang-orang tentang memecahkan masalah dengan bahasa maka jauh lebih baik.

Itu datang ke kerja keras dan tekad dan untuk semua yang Anda mungkin tidak pernah sampai di sana.

Pikirkan dari mana kita mendapatkan istilah dari - untuk menjadi Master Craftsman Anda harus menjadi magang dan kemudian seorang pekerja harian dan hanya mereka yang mungkin Anda memiliki kesempatan untuk menjadi master. Sepanjang jalan Anda akan diajarkan dan Anda akan berlatih dan Anda akan mengamati dan menanyai orang lain di keahlian mereka dan (mudah-mudahan) belajar dari mereka.

Tidak ada peluru ajaib ...

Murph
sumber
2

Mulailah dengan membaca dan memahami apa itu SDLC (alias, siklus hidup pengembangan Perangkat Lunak). Ini adalah proses berulang yang melibatkan peningkatan diri, belajar,**practicing, practicing...**

masukkan deskripsi gambar di sini

Itu akan membuka cakrawala Anda pada bidang apa yang perlu Anda pelajari atau tingkatkan. Ada beberapa buku rekayasa perangkat lunak inti yang menurut Anda sangat berguna untuk dibaca begitu Anda membangun beberapa aplikasi sendiri.

Selain itu, begitu Anda akan merasa percaya diri dengan bahasa OOP , Anda dapat mulai mempelajari pola desain , dan pola Desain Kepala Pertama adalah buku yang sangat bagus untuk dipertimbangkan. Saya suka buku ini.

EL Yusubov
sumber
1
Terima kasih. Saya sudah memilih jawaban pada saat saya membaca ini tetapi pasti akan menerima saran Anda.
cprogcr
tidak yakin mengapa memilih, harap beri tahu saya apa yang perlu diperbaiki.
EL Yusubov
2

Tidak ada yang dapat menggantikan pengalaman. Untuk menguasai sesuatu, Anda harus melakukan / menggunakannya, pada banyak hal, untuk banyak hal yang berbeda.

Jadi lanjutkan dan gunakan bahasa itu untuk latihan (seperti Project Euler ) dan proyek pribadi, hal-hal yang sebenarnya Anda butuhkan, atau hal-hal yang menurut Anda menarik. Tulis game, tulis aplikasi web, tulis parser, apa pun yang Anda suka. Dan pada setiap langkah, berusahalah untuk memahami apa yang Anda lakukan daripada hanya menempelkan kode bersama atau mengikuti instruksi.

Saya ingin dapat membaca kode orang lain dan memahaminya, tidak peduli betapa sulitnya itu.

Itu adalah sesuatu yang dapat Anda lakukan segera setelah Anda memahami sintaks dasar. Ambil saja beberapa kode dan luangkan waktu untuk mencari tahu secara detail. Cari hal-hal yang tidak Anda pahami, atau ajukan pertanyaan spesifik tentang tempat-tempat seperti Stack Overflow .

Michael Borgwardt
sumber
2

Di sisi masalah tingkat tinggi, pelajari tentang arsitektur: bagaimana mengatur proyek Anda, apa strukturnya. Jangan biarkan mereka tumbuh secara acak.

Di tingkat menengah, pelajari berbagai teknik dan paradigma. Semakin beragam alat yang Anda miliki dalam daftar lagu Anda, semakin banyak kekuatan untuk Anda. Jika Anda hanya mempelajari java, python dan ruby, Anda telah terpapar hanya pada sebagian kecil ruang pemrograman. Belajar pemrograman imperatif dan fungsional, pelajari prolog dan J. Idenya bukan untuk "menguasai" ratusan bahasa, tetapi untuk belajar tentang berbagai cara menyelesaikan masalah yang sama.

Di sisi masalah yang rendah, satu hal yang dapat membantu Anda menjadi programmer yang lebih baik (bahkan lebih baik dalam apa pun yang Anda lakukan) adalah memiliki model mental platform yang baik. Misalnya, Anda dapat mempelajari cara struktur kontrol C bekerja dan mengetahui perpustakaan paling umum, tetapi jika Anda tidak memiliki model mental tentang cara kerja pointer dan memori, maka Anda akan mengalami masalah dengan ekspresi yang cukup kompleks.

José Dinuncio
sumber
1

Bolehkah saya membuat beberapa saran?

Pertama jika Anda dapat menemukan seorang mentor untuk mendiskusikan penggunaan bahasa Anda dengan, dan untuk mendapatkan tips dan trik terbaik, dan untuk menjawab ketika satu teknik lebih baik dari yang lain.

Kedua, berlatihlah sebanyak mungkin dan cobalah bahasanya secara maksimal! Saya dulu bekerja dalam sebuah tim, yang (sebagai hal yang menyenangkan) akan memilih kata kerja atau bagian lain dari bahasa pemrograman dari manual setiap hari. Itu adalah tanda kehormatan jika Anda bisa mengerjakannya ke dalam kode Anda hari itu. Ini berarti seluruh tim pemrograman perlu melihat dan memahami istilah (kadang-kadang) yang tidak jelas untuk memahami dan menggunakannya secara efektif. Beberapa hari kami gagal, tetapi tim itu menyenangkan untuk bekerja dan secara teknis diaktifkan !!

Nicholas Sibson
sumber
0

Bahasa pemrograman mencerminkan ide-ide di balik paradigma pemrograman yang dikembangkan dengan menargetkan pengembangan perangkat lunak tujuan umum atau untuk mengembangkan perangkat lunak tujuan khusus. Misalnya, bahasa program seperti Jawa mewakili paradigma program berorientasi objek, tetapi AspectJ (ekstensi Jawa) digunakan untuk memprogram sesuai dengan pemrograman berorientasi aspek.

Dengan pengantar singkat ini, untuk benar-benar menguasai bahasa, membeli dan membaca buku dengan sendirinya tidak akan banyak membantu. Anda perlu memahami lingkungan di mana Anda dapat memprogram menggunakan bahasa yang diinginkan, belajar tentang paradigma, dan yang lebih penting membangun aplikasi yang bermakna menggunakan bahasa tersebut. Membangun aplikasi kecil yang dapat memberi Anda rasa berbagai alat yang disediakan oleh bahasa adalah pendekatan pembelajaran yang sangat membantu.

Saya telah melihat orang-orang yang datang dari komunitas C murni tanpa belajar apapun tentang orientasi objek dan perjuangan dalam belajar Java atau objektif-c. Saya juga telah melihat orang-orang bergumul dengan pemrograman antarmuka pengguna ketika mereka belum benar-benar memahami elemen-elemen antarmuka pengguna, pemrograman berbasis peristiwa, dll ...

Saya harap ini membantu!

hsnm
sumber
0

Saya akan menambahkan dua item ke daftar Glen

  • Cobalah untuk memecahkan masalah sulit yang orang lain miliki misalnya memberikan jawaban pada SO
  • Baca blog / buku desainer bahasa. Itulah sumber pengetahuan terbaik yang mendalam. Anda akan tahu apa keputusan desain di balik alasan X.
Lukasz Madon
sumber
0

Untuk membangun apa yang dikatakan @TMN. Saya sudah sangat sukses dalam belajar bahasa dengan menulis program yang sama dalam bahasa yang berbeda.

Misalnya menulis program yang membaca dalam file CSV, mem-parsing teks dan kemudian menulisnya kembali ke CSV kedua dengan kolom dalam urutan terbalik.

Seperti ini,

Kolom1, Kolom2, Kolom3

untuk

Kolom3, Kolom2, Kolom1

Ini akan memberi Anda pemahaman dasar atau bahasa. Lalu lihat apa lagi yang bisa Anda lakukan. Mungkin memungkinkan untuk penggantian nilai atau pemesanan ulang atau membaca dari baris perintah. Jadikan serumit yang Anda inginkan.

Saya juga memikirkan apa yang dikatakan @GlenPeterson tentang,

Belajar bahasa yang sangat berbeda. Pujian yang bagus untuk C akan menjadi bahasa fungsional seperti Lisp. Ini akan mengubah cara Anda berpikir tentang bahasa prosedural Anda.

Adalah Ide yang bagus. Saya menyarankan bahasa seperti Haskell karena dalam versi terbaru Anda dapat memprogram menggunakan keempat paradigma pemrograman OO, prosedural, logis atau fungsional. Meskipun sebenarnya ini adalah bahasa fungsional, Anda dapat dengan upaya mengimplementasikan paradigma lain yang akan menjadi pengalaman belajar yang baik.

Bahasa yang bagus untuk dimainkan.

Dan
sumber
0

Anda tidak dapat belajar bahasa dari buku. Yang Anda butuhkan adalah latihan dan latihan. Jangan berpikir Anda dapat belajar bahasa dari buku tertentu atau sumber tertentu. Hanya berpikir bahasa pemrograman sama dengan bahasa manusia. Anda tidak bisa hanya belajar bahasa Inggris atau Prancis dengan membaca buku tertentu. Semua yang Anda perlukan menggunakannya dalam sehari untuk kehidupan sehari-hari. Kode dari awal, perluas fungsinya coba untuk membangun sesuatu yang akan membuat Anda sedikit puas. Dan jika Anda berpikir menguasai bahasa karena mengetahui seluruh bahasa dan menggunakan setiap elemen bahasa pemrograman dalam pengkodean praktis .. ANDA TIDAK BISA. Atau bahkan jika Anda bisa, mungkin butuh 10-15 tahun.

sumit
sumber