Saya sering mendengar bahwa programmer sejati dapat dengan mudah mempelajari bahasa apa pun dalam waktu seminggu. Bahasa hanyalah alat untuk menyelesaikan sesuatu, saya diberitahu. Pemrograman adalah keterampilan utama yang harus dipelajari dan dikuasai.
Bagaimana saya bisa memastikan bahwa saya benar-benar belajar cara memprogram daripada sekadar mempelajari detail suatu bahasa? Dan bagaimana saya bisa mengembangkan keterampilan pemrograman yang dapat diterapkan ke semua bahasa, bukan hanya satu?
"What do you mean you're not an expert in LanguageX?!? I can learn a language in a Week!"
. 1 minggu kemudian:"See, I've learnt the language, and here's a Hello World example I copied from Wikipedia to prove it!"
Jawaban:
Jangan khawatir tentang memenuhi konsep "keterampilan" konyol yang biasa terdengar dalam pernyataan seperti:
Semua pernyataan ini didasarkan pada premis yang cacat dan mengkhianati kurangnya pengalaman dalam spektrum bahasa pemrograman yang lebih luas. Itu adalah pernyataan yang sangat umum dan sangat dipercaya oleh banyak programmer, saya tidak akan membantahnya, tetapi saya akan membantah keakuratan mereka.
Ini terbukti sederhana: Habiskan satu minggu (atau benar-benar jumlah waktu lebih dari beberapa hari) untuk mempelajari dasar-dasar Haskell , Prolog , atau Agda . Anda akan segera setelah mulai mendengar lagu lama Sesame Street diputar di kepala Anda "Salah satu hal ini tidak seperti yang lain ...".
Ternyata, ada banyak bidang bahasa pemrograman, teknik, dan pendekatan yang sangat asing dari apa yang 95% dari kita lakukan atau pernah dilakukan. Banyak yang sama sekali tidak menyadari bahwa konsep-konsep lain ini bahkan ada, yang baik-baik saja dan konsep-konsep ini tidak diperlukan untuk menjadi programmer yang dipekerjakan dan bahkan efektif.
Tetapi faktanya tetap ada: Teknik dan pendekatan ini memang ada, mereka baik untuk banyak hal yang berbeda dan bisa sangat berguna, tetapi mereka tidak seperti yang biasa Anda lakukan dan orang tidak bisa begitu saja mengambilnya dengan sore bermain-main.
Lebih jauh, saya akan mengatakan sebagian besar kasus di mana orang mengklaim mereka memiliki atau dapat mempelajari hal-hal rumit seperti bahasa pemrograman begitu cepat selama seminggu, mereka menderita sedikit Efek Dunning Kruger , Wikipedia (penekanan pada saya):
Saya akan merujuk orang ke wawancara yang lebih berpengalaman tentang konsep belajar ke program oleh Peter Norvig: Belajar untuk memprogram dalam sepuluh tahun .
Tentunya, ada seperangkat prinsip menyeluruh yang akan membuat semua bahasa mudah dipelajari!
Mungkin, tapi saya berpendapat serangkaian prinsip ini begitu besar sehingga hampir selalu ada bahasa di luar jangkauan satu minggu Anda. Ketika Anda menambahkan konsep-konsep baru ke daftar yang Anda kenal dan nyaman, daftar bahasa di luar jangkauan langsung Anda mungkin menyusut, tetapi saya sulit percaya bahwa itu akan hilang. Daftar pendekatan komputasi konseptual untuk hal-hal begitu luas itu membingungkan, dari bahasa concatenative ke bahasa berbasis vektor ke bahasa yang mengkhususkan diri dalam AI atau metaprogramming ( atau bahasa yang ada sepenuhnya untuk mendukung ekspresi reguler ).
Setelah sepuluh tahun, Anda umumnya dapat memprogram. Ini berarti Anda dapat menulis kode yang agak layak dalam beberapa bahasa atau gaya bahasa. Jadi setelah 10 tahun Anda siap untuk mulai menangani konsep lintas sektor luas yang tak terhitung ini selama sisa hidup Anda, dan singkat menjadi Edsger W. Dijkstra , Donald Knuth atau John D. Carmack , Anda tidak akan mendapatkan semua dari mereka.
sumber
Kunci dari pertanyaan ini adalah untuk melampaui bahasa dan berpikir bukan bahasa yang Anda kodekan.
WAT?
Pemrogram poliglot berpengalaman berpikir dalam pohon sintaksis abstrak (AST) dari model mental bahasa mereka sendiri. Orang tidak berpikir "Saya perlu loop untuk di sini", melainkan "Saya perlu mengulang sesuatu" dan menerjemahkannya ke yang sesuai untuk, atau sementara, atau iterator atau rekursi untuk bahasa itu.
Ini mirip dengan apa yang dilihat seseorang dalam mempelajari bahasa lisan. Orang-orang yang berbicara banyak bahasa dengan lancar memikirkan artinya , dan itu muncul dalam bahasa yang diberikan.
Seseorang dapat melihat beberapa petunjuk AST ini dalam sepasang video eyecracking Pemahaman Kode dengan Eye Tracking dan Eye-Tracking Code Experiment (Novice) di mana gerakan mata seorang pemula dan programmer berpengalaman ditonton. Orang dapat melihat programer yang berpengalaman 'mengkompilasi' kode ke dalam model mental mereka dan 'menjalankannya' di kepala mereka, sedangkan pemula harus beralih pada kata kunci kode dengan kata kunci.
Dengan demikian, kunci dari pertanyaan untuk mengembangkan keterampilan pemrograman untuk diterapkan ke semua bahasa adalah untuk belajar beberapa bahasa sehingga seseorang dapat menjauhkan diri dari memiliki model mental dari satu bahasa dan mengembangkan kemampuan untuk menghasilkan AST untuk masalah mereka sendiri di bahasa kepala yang kemudian diterjemahkan ke bahasa tertentu.
Setelah seseorang memiliki kemampuan untuk menggunakan AST di kepala, belajar bahasa lain dalam aliran pemikiran yang sama (pergi ke Befunge adalah sedikit lompatan dari Jawa, tetapi tidak sebanyak dari Forth ) menjadi lebih mudah - itu 'hanya' menerjemahkan AST ke bahasa baru yang jauh lebih mudah pada waktu ke 3, 4 dan 5 (dll ...) selesai.
Ada artikel klasik, Programmer Nyata Jangan Gunakan Pascal . Bagian dari ini berbunyi:
Ada juga bit yang Anda tidak bisa hanya menggunakan AST mental - Anda perlu berpikir dalam bahasa itu juga. Ini membutuhkan sedikit waktu untuk menyelesaikannya (saya masih dituduh menulis kode Perl dengan Python dan kode Lisp pertama saya ditinjau mengatakan "Ini adalah program C yang sangat bagus.").
Untuk ini, saya harus menunjukkan artikel yang diterbitkan oleh ACM, Bagaimana Tidak Menulis Fortran dalam Bahasa Apa Pun . Paragraf ketiga artikel (yang tidak memimpin kutipan) langsung menjawab pertanyaan:
Tidak hanya cukup untuk memiliki AST - perlu memiliki AST yang dapat diterjemahkan ke dalam bahasa lain. Memiliki Fortran AST di kepala Anda dan menulis kode Fortran di Jawa bukanlah hal yang baik. Seseorang juga harus cukup akrab dengan bahasa dan idiom-idiomnya untuk dapat berpikir dalam bahasa tersebut (terlepas dari apa yang saya katakan di bagian paling atas).
Saya telah melihat kode Java yang ditulis oleh seseorang yang tidak berhenti menulis kode C. Ada satu objek dengan metode utama. Dalam objek ini ada banyak metode statis yang dipanggil oleh
main
, dan kelas dalam pribadi yang memiliki bidang publik (dan dengan demikian tampak sangat mirip struts). Itu kode C yang ditulis dalam Java. Semua yang dilakukan adalah menerjemahkan sintaks dari satu bahasa ke bahasa lain.Untuk melewati titik ini, seseorang harus terus menulis kode dalam berbagai bahasa, tidak berpikir dalam bahasa tersebut ketika mendesain kode, tetapi berpikir di dalamnya ketika menerjemahkan desain ke dalam kode untuk bekerja dengan idiom bahasa dengan benar.
Satu-satunya cara untuk sampai ke sana - bisa mengembangkan keterampilan pemrograman yang dapat diterapkan ke semua bahasa - adalah untuk terus belajar bahasa dan menjaga bahasa pemrograman mental fleksibel daripada dihubungkan ke satu bahasa.
(Aku minta maaf pada ChaosPandion karena meminjam banyak dari ide yang disajikannya .)
sumber
Pilih bahasa, dan mulai koding. Python adalah pilihan yang baik untuk pemula, dan ada tutorial yang tersedia secara online , sehingga Anda dapat belajar bagaimana melakukannya dengan benar.
Segalanya mengikuti dari itu. Minat Anda akan mengarahkan Anda ke kerangka kerja dan konsep desain yang akan menambah kecanggihan program Anda. Anda akan menemukan bahwa ada kursus online yang dapat Anda ambil yang akan memberi Anda landasan dan teori, dan bahwa ada berbagai paradigma pemrograman yang dapat Anda jelajahi, dan seterusnya.
Dan ya, Anda akan menemukan bahasa seperti Haskell yang akan mengajarkan Anda sesuatu yang baru, setelah Anda memiliki dasar yang kuat dalam fundamental.
Beberapa programmer mungkin berpikir bahwa semua bahasa adalah sama karena mereka tidak terpapar dengan bahasa yang membuat mereka berpikir secara berbeda. Semua bahasa yang paling umum digunakan berasal dari Algol (mereka pada dasarnya adalah bahasa prosedural), dan dari mereka, sebagian besar adalah bahasa penjepit keriting mirip dengan C. Semua dari mereka melakukan hal-hal yang pada dasarnya sama, meskipun beberapa dengan kecanggihan lebih dari yang lain.
sumber
Pemrograman adalah tentang pemecahan masalah sedemikian rupa sehingga solusinya dapat diekspresikan dalam tata bahasa yang terbatas sehingga dapat diimplementasikan dengan bahasa pemrograman. Karena itu seni pemrograman adalah seni memecahkan masalah.
Bahasa tertentu mengundang paradigma pemrograman lain seperti orientasi objek, event-driven, multi-threaded dan kerangka kerja MVC. Ini semua hanyalah model dan pola dan tidak ada hubungannya dengan implementasi.
Jika Anda dapat duduk dan menyelesaikan masalah di atas kertas sedemikian rupa sehingga dapat dengan mudah diterjemahkan ke dalam kode dan dikaitkan dengan model yang sesuai untuk platform Anda, maka Anda adalah seorang programmer. Jika semua yang Anda bisa lakukan, ambil solusi itu dan terapkan dalam bahasa pilihan kami, maka itu masalah lain.
Saya telah pemrograman selama 30 tahun (OMFG!) Dan masih digunakan
php.net
untuk mencari perintah di PHP karena itu bukan bahasa pertama saya.Saya akan mengatakan bahwa keahlian dalam bahasa berbanding terbalik dengan seberapa sering Anda melihat manual atau stackoverflow. Keahlian dalam pemrograman adalah seberapa mudah Anda memecahkan masalah dengan cara yang kompatibel dengan bahasa pemrograman komputer.
Dalam berita terkait, saya belajar Ruby minggu lalu. Meskipun saya bukan "ahli", saya dapat memecahkan masalah yang bisa saya tulis dalam Perl, katakan, dan kemudian menghabiskan waktu menerjemahkannya ke Ruby sementara saya mempelajarinya lebih lanjut.
sumber
Saya pikir, seperti apa pun, latihan menjadi sempurna. Hanya saja, jangan mengacaukan diri sendiri untuk selalu melakukan hal yang sama atau selalu menggunakan bahasa yang sama dan terus belajar hal-hal di setiap proyek.
Saya pikir Anda dapat dengan mudah menggambar sejajar dengan sesuatu seperti belajar bermain gitar. Musisi yang baik dapat belajar memainkan lagu baru dalam waktu yang sangat singkat, karena mereka sudah tahu semua akord dan semua teori di balik mengapa akord dimainkan seperti apa adanya. Bagaimana mereka bisa mendapatkan itu? Mereka baru saja memainkan begitu banyak lagu sehingga semua pola baru saja dicampur bersama, sementara pada saat yang sama menambah pengetahuan mereka dengan teori terdokumentasi yang sebenarnya sehingga pola-pola itu berlangganan juga.
Jadi mungkin Anda bisa memainkan beberapa lagu dengan sangat baik, tetapi Anda tidak bisa menyimpang atau mengambil lagu baru dengan cepat. Ini mungkin setara dengan .NET programmer yang terus membuat aplikasi CRUD yang sama berulang-ulang, pada titik tertentu mencoba sesuatu yang baru, menambahkan beberapa panggilan layanan web atau UI canggih, atau menulisnya dalam bahasa yang sama sekali baru. Ketika Anda menemukan halangan mengapa hal-hal terjadi seperti yang mereka lakukan, mengajukan pertanyaan di Stack Exchange, dll. Akhirnya, Anda akan melihat semua pola yang terus muncul dan mengetahui beberapa teori yang mendasarinya dan mempelajari bahasa baru tidak akan tampak hampir sama menakutkannya.
sumber
Saya tidak akan memberi tahu berapa lama waktu yang dibutuhkan untuk belajar bahasa atau apa artinya belajar bahasa, sebaliknya saya akan membahas masalah Anda yang sebenarnya: bagaimana menentukan apakah Anda telah belajar memprogram atau telah mempelajari bahasa pemrograman .
Anda telah belajar memprogram jika Anda telah belajar untuk memecah masalah menjadi proses diskrit dan kemudian menggunakan proses tersebut untuk menyelesaikan masalah Anda. Anda telah mempelajari bahasa pemrograman jika Anda telah mempelajari sintaks suatu bahasa dan tahu bagaimana menyesuaikan cara suatu proses bekerja, ketika diimplementasikan dalam bahasa itu.
Ini bukan untuk mengatakan Anda harus memprogram dalam Fortan saat menggunakan Lisp atau menjumlahkan nilai-nilai kolom dalam tabel dalam db menggunakan kursor. Hanya saja bahasanya adalah detail implementasi. Satu yang dapat mengubah proses apa yang dibutuhkan, tetapi bukan kebutuhan untuk mengidentifikasi dan menciptakan proses - pada akhirnya ada implementasi dunia nyata, dengan input / output dan hasil yang diinginkan.
sumber
Strategi saya selalu berfokus pada keterampilan murni daripada keterampilan khusus.
Alih-alih mempelajari sintaksis khusus Python (atau bahasa apa pun) untuk apa pun yang ingin Anda lakukan, habiskan siklus otak Anda untuk menyelesaikan masalah abstrak, seperti cara terbaik untuk menyelesaikan setiap masalah dalam kategori itu.
Dengan begitu, Anda akan tahu apa yang harus dilakukan apa pun bahasanya, dan sebagian besar akan memiliki keterampilan abadi yang dapat digunakan untuk pemrograman dalam bahasa apa pun.
Khususnya menghindari alat yang penuh dengan gotcha, seperti MySQL, atau bahasa yang disarankan, seperti Java, karena apa pun yang Anda pelajari dengan menggunakan alat ini akan memiliki sebagian besar pengetahuan khusus alat yang pasti akan menjadi tidak berguna cukup cepat.
Bertentangan dengan apa yang telah dikatakan dalam banyak jawaban, JANGAN dengarkan programmer lain, Anda seorang noob dan tidak ada cara Anda bisa mengatakan yang palsu dari real deal, jadi Anda lebih baik mengambil semuanya dengan sendok garam.
Anda ingin selalu mempertanyakan dan menerima hanya ketika solusinya cepat, elegan, dan dapat diandalkan.
sumber
Ada pendekatan teoretis. Belajar tentang bagaimana sebenarnya komputer bekerja di bawah penutup. Bagaimana instruksi prosesor dasar dirangkai bersama untuk membuat operasi dan struktur yang lebih kompleks yang kita terima begitu saja di tanah pemrograman tingkat tinggi.
Lalu ada pendekatan pemrograman yang lebih praktis. Poin utama yang sering dialami orang-orang yang dilabeli sebagai "programmer tidak baik" adalah bahwa mereka hanya benar - benar tahu satu bahasa. Dan bahkan jika mereka mengenal orang lain, mereka memprogram di dalamnya dengan cara yang sama mereka lakukan dengan bahasa ibu mereka . Itu adalah siklus yang harus diputus jika mereka benar-benar ingin belajar cara memprogram. Jawaban default untuk itu adalah belajar setidaknya satu bahasa dari setiap paradigma pemrograman. Jadi pelajari bahasa OOP, bahasa fungsional, bahasa scripting ... dll. Dan dengan belajar saya tidak bermaksud mempelajari sintaksis . Anda belajar bahasa dengan benar-benar menggunakannya untuk membuat sesuatu.
Secara pribadi, ketika saya ingin belajar bahasa baru saya menggunakan puzzler Project Euler . Saya membuka teka-teki yang sudah saya pecahkan dalam bahasa OOP (sebagai contoh) dan mencoba menyelesaikannya dengan menggunakan fungsional saat mencoba mengikuti praktik terbaik dari bahasa baru. Ketika Anda memecahkan masalah yang sama menggunakan dua pendekatan yang berbeda secara mendasar, Anda tidak hanya melihat apa perbedaan nyata, tetapi mereka juga menunjukkan di mana area umum berada. Area umum ini yang dimiliki oleh semua bahasa adalah pemrograman yang sebenarnya , perbedaannya hanyalah berbagai cara untuk mencapainya.
sumber
Yah, sebagian besar hal yang ingin saya katakan sudah dikatakan. Yang ingin saya tambahkan adalah analogi yang sangat sederhana.
Jika bahasa pemrograman dianggap sebagai alat belaka, itupun sama sekali tidak ada logika untuk menjadi baik pada satu membuat menjadi baik pada yang lain cakewalk.
Bahasa seringkali tidak sulit untuk dipelajari tetapi butuh kesabaran dan olahraga untuk menjadi ahli. Selain itu, tidak ada cara yang tepat untuk belajar pemrograman.
Berikut adalah beberapa hal yang mungkin ingin Anda lakukan ketika belajar bahasa.
Rasakan bahasa baru, jelajahi perpustakaan baru, pelajari trik baru di waktu luang Anda. Sebelum Anda menyadarinya, Anda akan mengejutkan diri sendiri dengan keterampilan Anda sendiri.
sumber
Dalam kasus saya, saya belajar bagaimana sebenarnya memprogram melalui yang berikut:
Juga, seperti yang komentator Anda sebutkan, jangan lupa untuk menguasai alat Anda juga. Mempelajari semua praktik terbaik dan teori terhebat semuanya sia-sia atau akan diimplementasikan dengan buruk jika Anda tidak cukup tahu tentang alat Anda, dalam hal ini, bahasa pemrograman.
sumber
Saya pikir, jika Anda dapat berpikir secara analitis, Anda memiliki awal yang baik.
Pelajari bahasa apa pun yang Anda inginkan dan kerjakan sendiri melalui serangkaian contoh mis. Seperti disajikan dalam buku yang hampir selalu mengajarkan pemrograman.
Selanjutnya coba selesaikan masalah Anda sendiri. Cobalah untuk menemukan solusi yang berbeda dan bandingkan. Kecepatan dan penggunaan memori adalah faktor yang biasa digunakan. Diskusikan solusi Anda dengan programmer lain.
Baca kode programmer lain dan coba pahami mengapa mereka memecahkan masalah dengan cara ini.
Anda juga harus membaca beberapa buku tentang algoritma untuk mendapatkan gambaran umum tentang pendekatan standar. Masalah baru seringkali merupakan modifikasi dari masalah lama.
Banyak latihan dan bekerja dengan kode juga dalam tim akan membantu Anda meningkatkan keterampilan Anda langkah demi langkah.
Saya harap pendapat saya menjawab pertanyaan Anda setidaknya sebagian.
sumber