Peter Norwig: Belajar Pemrograman dalam ... 10 Tahun

Catatan Penerjemah: Artikel ini diterbitkan oleh Peter Norvig pada tahun 2001. Menurut versi 2001, terjemahan ke dalam bahasa Rusia dilakukan. Pada 2014, artikel itu diperbarui, tetapi terjemahannya tidak diperbarui. Karena itu, saya menyelesaikan terjemahan artikel saya di versi modern 2014. Saya percaya bahwa artikel tersebut tidak kehilangan relevansinya, meskipun agak ketinggalan jaman. Jika Anda menemukan kesalahan terjemahan, tulis secara pribadi.

Di mana semua orang terburu-buru?


Pergi ke toko buku mana saja dan Anda akan segera melihat buku tentang cara belajar Java dalam 24 jam, serta opsi tanpa akhir tentang cara belajar C, SQL, Ruby, algoritma dan sebagainya dalam beberapa hari atau jam. Pencarian Lanjutan Amazon [ judul: ajarkan, diri sendiri, berjam-jam, sejak: 2000 ] mencantumkan 512 buku. Dari sepuluh besar, sembilan buku tentang pemrograman (hanya satu tentang akuntansi). Anda akan mendapatkan hasil yang sama dengan mengganti "belajar sendiri" dengan "belajar" dan "jam" dengan "hari".

Ini mengarah pada kesimpulan: orang-orang sedang terburu-buru untuk belajar pemrograman, atau dalam beberapa cara yang luar biasa lebih mudah untuk belajar pemrograman daripada yang lainnya. Felleisen et al. menyebutkan ini dalam buku mereka How to Design Programs , ketika mereka menulis, β€œPemrograman yang buruk itu mudah. "Idiot dapat mempelajari ini dalam 21 hari, bahkan jika mereka penuh dengan kutu buku." Situs web komik Abtruse Goose juga membahas topik ini ( ini tautannya ).

Mari kita lihat apa arti judul buku Teach Yourself C ++ dalam 24 Jam :

  • Ajarkan Diri Anda: Dalam 24 jam Anda tidak akan punya waktu untuk menulis beberapa program penting dan menarik kesimpulan dari keberhasilan dan kegagalan Anda. Anda tidak akan punya waktu untuk bekerja dengan programmer yang berpengalaman dan mengerti apa itu ideologi C ++. Singkatnya, dalam waktu singkat ini Anda tidak akan belajar banyak. Jadi, buku ini hanya memiliki kenalan yang dangkal, tetapi bukan pemahaman yang mendalam. Seperti yang dikatakan Alexander Pope: " Sedikit pengetahuan adalah hal yang berbahaya ."
  • C ++: Dalam 24 jam, Anda cukup mampu mempelajari sesuatu dari sintaks C ++ (jika Anda sudah tahu bahasa pemrograman lain), tetapi Anda tidak tahu banyak cara menggunakan bahasa ini. Singkatnya, jika Anda, katakanlah, seorang programmer Dasar, Anda belajar bagaimana menulis program gaya dasar menggunakan sintaks C ++, tetapi Anda tidak akan mengerti tugas-tugas apa C ++ benar-benar baik (atau buruk) untuk. Jadi apa katamu? Seperti yang dikatakan Alan Perlis : " Jika suatu bahasa tidak mengubah pemahaman Anda tentang pemrograman, belajar itu tidak berguna ." Yah, kecuali bahwa Anda perlu belajar sedikit C ++ untuk memahami cara menggunakan semacam perpustakaan untuk tugas tertentu. Tetapi dalam hal ini, kita tidak berbicara tentang pengajaran pemrograman dalam bahasa; Anda baru belajar menyelesaikan tugas tertentu.
  • dalam 24 Jam: Sayangnya, seperti yang saya tunjukkan di bawah, kali ini tidak cukup.

Belajar pemrograman dalam 10 tahun


Studi ( Bloom (1985) , Bryan & Harter (1899) , Hayes (1989) , Simmon & Chase (1973) ) menunjukkan bahwa dibutuhkan sekitar sepuluh tahun untuk menguasai keterampilan dalam bidang tertentu, misalnya, dalam bermain catur, komposisi musik, bekerja dengan telegraf, menggambar, bermain piano, berenang, tenis, neurofisiologi dan topologi. Rahasianya terletak pada praktik yang bijaksana : tidak hanya pengulangan mekanis, tetapi pencarian tugas yang lebih tinggi dari level Anda saat ini, menyelesaikannya, menganalisis tindakan Anda selama solusi mereka dan setelah mereka dipecahkan, mengoreksi kesalahan yang dibuat. Dan lagi. Dan lagi. Tidak ada cara yang lebih singkat: bahkan Mozart, yang pada usia 4 tahun menjadi anak ajaib musik, membutuhkan waktu 13 tahun sebelum ia mulai membuat musik kelas dunia. The Beatles pada tahun 1964 meledak ke panggung dengan banyak hits dan dilakukan di acara Ed Sullivan. Namun sebelumnya mereka telah bermain di klub kecil Liverpool dan Hamburg sejak 1957. Dan meskipun mereka terkenal di seluruh dunia di kalangan penggemar, kesuksesan pertama mereka di antara kritikus musik datang dengan dirilisnya Sersan Pepper pada tahun 1967.

Gagasan ini dipopulerkan oleh Malcolm Gladwell dalam bukunya, meskipun di sana ia berbicara tentang 10.000 jam, bukan 10 tahun. Fotografer terkenal Henri Cartier-Bresson (1908-2004) menyatakan ide ini sebagai berikut: " 10.000 foto pertama akan menjadi yang terburuk " (Dia bahkan tidak curiga bahwa dengan kamera digital beberapa orang dapat mencapai angka ini dalam seminggu). Pengalaman nyata datang dengan kehidupan: Samuel Johnson (1709-1784) menulis: β€œ Pengalaman di bidang apa pun hanya dapat diperoleh melalui kerja seumur hidup; tidak ada harga yang lebih rendah ”; Chaucer (1340-1400) mengeluh: " Sangat sedikit untuk hidup, banyak belajar ." Hippocrates (400 SM) terkenal dengan pernyataannya " hidup itu singkat, sains luas ", yang sepenuhnya terdengar seperti ini: "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile", dan dalam terjemahan Rusia "Life singkatnya, sains sangat luas, kasus goncangan, pengalaman menipu, penilaian sulit. ” Tentu saja, tidak ada satu angka pun yang bisa menjadi jawaban yang tepat: tidak ada alasan untuk menganggap bahwa semua keterampilan (pemrograman, bermain catur, catur, alat musik) membutuhkan waktu yang persis sama untuk menguasainya, serta apa yang dibutuhkan oleh orang yang berbeda. waktu yang sama persis. Seperti yang Profesor K. Anders Ericsson katakan : β€œ Di sebagian besar wilayah, sungguh menakjubkan betapa banyak waktu yang dibutuhkan bahkan yang paling berbakat untuk dikuasai. Angka '10, 000 jam 'hanya membantu Anda memahami bahwa kita berbicara tentang kerja keras selama 10-20 jam seminggu untuk mencapai tingkat tertinggi bahkan untuk talenta paling berbakat sejak lahir ”

Jadi, Anda ingin menjadi seorang programmer


Ini resep saya untuk sukses dalam pemrograman:

  • Tertarik pada pemrograman, dan buat sesuatu hanya untuk bersenang-senang. Seharusnya sangat menarik bagi Anda sehingga sayang untuk menghabiskan 10 tahun ke depan / 10.000 jam di atasnya.
  • Program . Pelatihan terbaik adalah latihan . Dalam istilah teknis, "tingkat kinerja maksimum untuk seorang individu dalam bidang tertentu tidak dicapai secara otomatis dengan pengalaman, sebaliknya, tingkat produktivitas dapat ditingkatkan bahkan pada individu yang paling berpengalaman karena keinginan sadar untuk peningkatan" ( hal. 366 ) dan "untuk pelatihan yang paling efektif, itu membutuhkan baik tugas dengan tingkat kompleksitas yang sesuai untuk individu tertentu, penilaian implementasi yang dapat dipahami dan kemungkinan untuk implementasi yang berulang dan koreksi kesalahan Ibok ”(hal. 20-21) Buku Kognisi dalam Praktek: Pikiran, Matematika, dan Budaya dalam Kehidupan Sehari-hari adalah bacaan yang sangat instruktif tentang pemikiran ini.
  • Bicaralah dengan programmer lain; baca program lain. Ini jauh lebih penting daripada buku atau kursus pelatihan apa pun.
  • Jika Anda mau, curahkan empat tahun untuk belajar di universitas (atau di sekolah pascasarjana). Ini akan memberi Anda akses ke pekerjaan yang membutuhkan judul dan judul yang terbukti. Tetapi jika Anda tidak suka belajar, Anda bisa (dengan semangat tertentu) mendapatkan semua pengetahuan yang sama sendiri atau benar di tempat kerja. Bagaimanapun, belajar dari buku saja tidak cukup. " Pendidikan ilmu komputer tidak akan membuat siapa pun menjadi ahli dalam pemrograman, seperti halnya mempelajari kuas dan pigmen warna-warni tidak dapat membuat siapa pun menjadi seniman utama, " tulis Eric Raymond , penulis The New Hacker's Dictionary. Programer terbaik yang pernah saya pekerjakan hanya memiliki kursus sekolah yang komprehensif di belakangnya, dan ia menciptakan program yang sangat baik , memoderasi daftar surat para penggemarnya , dan mendapatkan cukup uang untuk opsi membeli klub malamnya sendiri.
  • Kerjakan proyek dengan programmer lain. Menjadi programmer terbaik dalam satu proyek; jadilah yang terburuk pada orang lain. Ketika Anda yang terbaik, Anda menguji kemampuan Anda untuk memimpin proyek dan menginspirasi orang lain dengan visi Anda. Ketika Anda adalah yang terburuk, Anda belajar dari tuan apa yang mereka lakukan dan apa yang tidak mereka sukai (inilah yang mereka perintahkan untuk Anda lakukan).
  • Bekerja pada proyek setelah programmer lain. Cobalah mencari tahu program yang ditulis oleh orang lain. Lihatlah lebih dekat apa yang diperlukan untuk memahami kode dan memperbaikinya ketika tidak ada programmer di dekatnya yang menulisnya. Pikirkan tentang bagaimana merancang program Anda sehingga lebih mudah untuk mendukung mereka yang akan bekerja dengan Anda setelah Anda.
  • Pelajari setidaknya setengah lusin bahasa pemrograman . Pilih satu bahasa untuk pembelajaran yang didasarkan pada abstraksi kelas (mis. Java atau C ++), yang mendukung abstraksi fungsional (mis. Lisp atau ML atau Haskell), yang - yang mendukung abstraksi sintaksis (mis. Lisp), satu bahasa deklaratif (mis. , Prolog atau C ++ - templat), dan satu - menekankan concurrency (misalnya, Clojure atau Go).
  • Jangan lupa bahwa dalam frasa "ilmu komputer" adalah kata komputer . Ingat berapa lama waktu yang dibutuhkan komputer Anda untuk menjalankan satu instruksi, membaca kata mesin dari memori (dengan dan tanpa kehilangan cache), membaca urutan kata-kata mesin dari disk, untuk mencari catatan pada disk ( Jawaban di sini )
  • Ikut serta dalam menstandarisasi bahasa pemrograman. Ini bisa berupa komisi ANSI C ++, atau pertemuan di tim Anda di mana Anda menentukan berapa banyak ruang yang Anda tinggalkan untuk lekukan dalam kode - 2 atau 4. Dalam kasus apa pun, Anda akan mengetahui apa yang disukai orang lain dalam bahasa tersebut, seberapa dalam perasaan mereka. dan mungkin Anda akan tahu dari mana asalnya.
  • Ketahui kapan waktunya meninggalkan komisi standardisasi bahasa secepat mungkin.

Dengan semua hal di atas, hanya membaca buku tidak akan memberi Anda begitu banyak. Sebelum kelahiran anak pertama saya, saya membaca semua buku tentang merawat bayi, dan masih tidak mengerti apa yang harus dilakukan. 30 bulan kemudian, ketika anak kedua saya bersiap untuk dilahirkan, apakah Anda pikir saya mencari di buku untuk menyegarkan ingatan saya? Tidak. Saya mengandalkan pengalaman saya sendiri, yang ternyata jauh lebih bermanfaat dan lebih baik daripada ribuan halaman yang ditulis oleh para ahli.

Fred Brooks, dalam artikelnya β€œ Peluru Perak Tidak Ada, ” menguraikan tiga langkah dalam menemukan programmer hebat:

  1. Secara sistematis mengidentifikasi programmer terbaik sedini mungkin
  2. Tetapkan mentor untuk programmer yang akan terlibat dalam pengembangan bakat dan hati-hati memantau karirnya
  3. Dorong komunikasi talenta yang tumbuh satu sama lain dalam setiap cara, sehingga mereka bertukar ide

Ternyata beberapa orang sudah memiliki kualitas yang memungkinkan mereka untuk menjadi programmer yang hebat; mereka hanya perlu diarahkan di jalan yang benar. Alan Perlis mengatakannya dengan lebih ringkas: β€œ Setiap orang dapat diajari membuat patung; Michelangelo harus belajar bagaimana untuk tidak memahat mereka. Demikian pula dengan programmer yang hebat . " Perlis ingin mengatakan bahwa para hebat memiliki beberapa kualitas batin yang tidak diperoleh melalui pelatihan. Tetapi dari mana sifat-sifat ini berasal? Apakah ini bawaan? Atau apakah itu diproduksi dengan semangat? Seperti yang dikatakan Aguste Gusto (karakter dalam kartun Ratatouille ), " siapa pun bisa memasak, tetapi hanya orang yang berani yang bisa menjadi hebat ." Saya percaya bahwa dalam kasus kami, kami berbicara tentang keinginan yang membara untuk mencurahkan sebagian besar hidup saya untuk belajar mandiri dalam pemrograman. Tapi mungkin ada kata yang lebih tepat dan tak kenal takut . Atau, seperti yang dikatakan Anton Yego (kritikus Aguste Gusto): " tidak semua orang bisa menjadi seniman yang hebat, tetapi seorang seniman hebat bisa muncul dari mana-mana ."

Jadi, silakan, beli buku tentang Java / Ruby / JavaScript / PHP; mungkin Anda akan mendapat manfaat darinya. Tetapi Anda tidak akan dapat mengubah hidup Anda dan tidak akan menjadi ahli dalam pemrograman dalam 24 jam atau dalam 21 hari. Bagaimana kalau menghabiskan 24 bulan kerja keras terus-menerus menguasai subjek? Sekarang kami sudah melakukan pembicaraan serius ...

Sastra


  • Bloom, Benjamin (ed.) Mengembangkan Bakat dalam Kaum Muda, Ballantine, 1985.
  • Brooks, Fred, Tanpa Peluru Perak, Komputer IEEE, vol. 20, tidak. 4, 1987, hlm. 10-19.
  • Bryan, WL & Harter, N. "Studi tentang bahasa telegraf: Pengadaan hierarki kebiasaan. Ulasan Psikologi, 1899, 8, 345-375
  • Hayes, John R., Pemecah Masalah Lengkap Lawrence Erlbaum, 1989.
  • Chase, William G. & Simon, Herbert A. "Persepsi dalam Catur" Psikologi Kognitif, 1973, 4, 55-81.
  • Lave, Jean, Kognisi dalam Praktek: Pikiran, Matematika, dan Budaya dalam Kehidupan Sehari-hari, Cambridge University Press, 1988.

Jawabannya


Perkiraan waktu untuk melakukan berbagai operasi di PC biasa:
pelaksanaan instruksi khas1 / 1.000.000.000 dtk = 1 nanosec
baca dari L1 cache0,5 nanosec
kesalahan dalam memprediksi transisi5 nanosec
baca dari L2 cache7 nanosec
menangkap / melepaskan mutex25 nanosec
membaca dari memori utama100 nanosec
kirim 2K melalui jaringan 1Gbps20.000 nanosec
membaca 1MB secara berurutan dari memori250.000 nanosec
baca dari disk dengan pencarian (seek)8.000.000 nanosec
membaca 1MB secara berurutan dari disk20.000.000 nanosec
mengirim paket data dari AS ke Eropa dan kembali150 milidetik = 150.000.000 nanosec


Aplikasi: pemilihan bahasa


Beberapa pembaca bertanya kepada saya bahasa pemrograman mana yang harus mereka pelajari terlebih dahulu. Tidak ada jawaban tunggal untuk pertanyaan ini, tetapi pertimbangkan hal-hal berikut:

  • Hubungi teman Anda . Ketika mereka bertanya kepada saya, "sistem operasi mana yang harus saya pilih - Windows, UNIX atau Mac?", Saya menjawab: "gunakan yang digunakan teman Anda." Apa yang Anda pelajari dari teman Anda akan lebih dari mencakup perbedaan internal antara sistem operasi atau bahasa pemrograman. Juga pertimbangkan teman masa depan Anda: komunitas programmer, di mana Anda akan menjadi bagian jika Anda melanjutkan pelatihan Anda. Apakah bahasa pilihan Anda memiliki komunitas yang tumbuh besar atau itu kecil dan secara bertahap sekarat? Apakah ada banyak buku, situs web, dan forum di mana Anda bisa mendapatkan jawaban? Apakah Anda suka orang nongkrong di forum ini?
  • Mulai dari yang sederhana . Bahasa pemrograman C ++ dan Java dirancang untuk pekerjaan profesional tim besar pemrogram berpengalaman yang paling peduli tentang efisiensi pelaksanaan kode mereka. Akibatnya, bahasa pemrograman ini memiliki struktur yang kompleks untuk menyelesaikan masalah seperti itu. Penting bagi Anda untuk mempelajari cara memprogram. Anda tidak perlu kompleksitas ekstra. Anda memerlukan bahasa yang dibuat khusus agar mudah dipelajari dan diingat.
  • Main Bagaimana Anda ingin belajar bermain piano: dengan cara interaktif yang biasa, ketika Anda mendengar setiap nada segera setelah Anda menekan tombol, atau dalam "mode batch" - ketika Anda mendengar seluruh melodi hanya setelah Anda menekan semua nada dari sebuah lagu pada tombol? Tentu saja, cara interaktifnya jauh lebih mudah, seperti halnya pemrograman. Pilih bahasa yang memiliki mode operasi interaktif dan mainkan.

Mengingat semua kriteria ini, saya merekomendasikan Python atau Skema sebagai bahasa pemrograman pertama. Atau JavaScript, tetapi bukan karena ini dirancang secara ideal untuk pemula, tetapi karena ada banyak buku teks dalam bahasa ini, misalnya, di Kahn Academy . Tetapi kasus khusus Anda mungkin istimewa, jadi ada banyak bahasa lain untuk dipilih. Jika Anda berusia di bawah sepuluh tahun, Anda mungkin menyukai bahasa Alice atau mencicit atau Blockly (siswa yang lebih tua mungkin juga menyukainya). Hal utama adalah membuat pilihan dan mulai belajar.

Lampiran: Buku dan Sumber Daya Lain


Saya ditanya buku dan situs web mana yang terbaik untuk dipelajari. Saya akan ulangi lagi: "membaca buku saja tidak cukup," tetapi saya merekomendasikan yang berikut:

Source: https://habr.com/ru/post/id416167/


All Articles