Kadang-kadang saya melihat pertanyaan tentang kasus tepi dan keanehan lain di Stack Overflow yang mudah dijawab oleh orang-orang seperti Jon Skeet dan Eric Lippert, menunjukkan pengetahuan mendalam tentang bahasa dan banyak seluk beluknya, seperti ini:
Anda mungkin berpikir bahwa untuk menggunakan
foreach
loop, koleksi yang Anda iterasi harus diimplementasikanIEnumerable
atauIEnumerable<T>
. Tetapi ternyata, itu sebenarnya bukan keharusan. Yang diperlukan adalah bahwa jenis koleksi harus memiliki metode publik yang disebutGetEnumerator
, dan yang harus mengembalikan beberapa jenis yang memiliki pengambil properti publik yang disebutCurrent
dan metode publikMoveNext
yang mengembalikan abool
. Jika kompiler dapat menentukan bahwa semua persyaratan tersebut terpenuhi maka kode dihasilkan untuk menggunakan metode tersebut. Hanya jika persyaratan tersebut tidak terpenuhi kami memeriksa untuk melihat apakah objek mengimplementasikanIEnumerable
atauIEnumerable<T>
.
Itu hal yang keren untuk diketahui. Saya bisa mengerti mengapa Eric tahu ini; dia ada di tim penyusun, jadi dia harus tahu. Tetapi bagaimana dengan mereka yang menunjukkan pengetahuan yang begitu dalam yang bukan orang dalam?
Bagaimana orang biasa (yang bukan anggota tim C #) mengetahui tentang hal-hal seperti ini?
Secara khusus, adakah metode yang digunakan orang-orang ini untuk secara sistematis membasmi pengetahuan seperti itu, menjelajahinya, dan menginternalisasikannya (menjadikannya milik mereka)?
sumber
Jawaban:
Pertama, terima kasih atas kata-kata baiknya.
Jika Anda ingin mendapatkan pengetahuan mendalam tentang C # itu tidak diragukan lagi merupakan keuntungan memiliki spesifikasi bahasa, sepuluh tahun catatan desain, kode sumber, basis data bug, dan Anders, Mads, Scott dan Peter di ujung lorong. Saya tentu beruntung, tidak ada pertanyaan tentang itu.
Namun, bahkan tanpa kelebihan itu masih mungkin untuk mendapatkan pengetahuan yang mendalam tentang subjek.
Kembali ketika saya mulai di Microsoft saya bekerja pada juru bahasa JScript yang dikirimkan dengan Internet Explorer 3. Manajer saya saat itu mengatakan kepada saya sesuatu yang merupakan beberapa saran terbaik yang pernah saya dapatkan. Dia mengatakan bahwa dia ingin saya menjadi ahli yang dikenal di Microsoft pada sintaks dan semantik bahasa JScript, dan saya harus membahas ini dengan mencari pertanyaan tentang aspek-aspek JScript dan menjawabnya. Terutama menjawab pertanyaan yang saya tidak tahu jawabannya, karena mereka adalah orang-orang yang akan saya pelajari.
Jelas StackOverflow dan forum Q&A publik lainnya seperti minum dari firehose untuk hal semacam itu. Saat itu, saya membaca comp.lang.javascript dan forum internal Microsoft "Pengguna JS" kami dengan religius dan mengikuti saran manajer saya: ketika saya melihat pertanyaan tentang semantik bahasa yang saya tidak tahu jawabannya, saya membuatnya bisnis saya untuk mencari tahu.
Jika Anda ingin melakukan "menyelam dalam" seperti itu, Anda harus memilih dengan hati-hati. Saya sampai hari ini sangat tidak tahu bagaimana model objek browser bekerja. Karena saya telah berkonsentrasi menjadi ahli bahasa C # beberapa tahun terakhir ini, saya sangat tidak tahu bagaimana berbagai kelas di perpustakaan kelas dasar bekerja. Saya beruntung karena saya memiliki pekerjaan yang menghargai pengetahuan mendalam yang spesifik; jika pekerjaan Anda atau bakat Anda lebih sejalan dengan menjadi seorang generalis, pergi jauh mungkin tidak bekerja untuk Anda.
Menulis blog juga sangat membantu; dengan meminta saya untuk menjelaskan topik yang kompleks kepada orang lain, saya dipaksa untuk menghadapi pemahaman saya sendiri yang tidak memadai tentang berbagai topik sepanjang waktu.
sumber
Setelah berada di sisi "guru" dari percakapan sekali atau dua kali, saya dapat memberi tahu Anda bahwa sering kali apa yang Anda anggap sebagai "pengetahuan yang mendalam" dari bahasa atau sistem pemrograman sering kali merupakan hasil dari "guru" yang baru-baru ini berjuang untuk sebulan untuk memecahkan masalah yang sama persis. Itu terutama berlaku di forum di mana orang dapat memilih pertanyaan mana yang akan mereka jawab. Bahkan orang-orang seperti Jon Skeet dan Eric Lippert harus belajar halo dunia pada satu titik. Mereka mengambil pengetahuan mereka satu konsep pada satu waktu, sama seperti orang lain.
sumber
Mengutip Yogi Bhajan:
Pemrograman seperti tantangan pengajaran utama. Mengajar komputer membutuhkan sesuatu, agar Anda tahu barang-barang Anda dengan sangat baik - atau Anda akan belajar menguasainya.
Misalnya, jika Anda ingin belajar fisika, tulis mesin fisika. Jika Anda ingin belajar catur, program permainan catur. Jika Anda ingin mempelajari pengetahuan C # dalam, tulislah kompiler C # (atau alat lain).
sumber
Sejauh yang saya tahu, cara untuk mempelajari ini adalah:
Cara kedua mungkin memakan waktu lebih lama tetapi mungkin akan menghasilkan pemahaman yang lebih dalam (tetapi tidak selalu).
sumber
Saya akan mengatakan melakukan hal berikut:
Setelah mempelajari setumpuk bahasa yang relatif berguna (yang Anda butuhkan untuk pekerjaan nyata) di tingkat di mana Anda dapat melakukan tugas-tugas yang paling umum, berhentilah belajar lebih banyak bahasa sampai Anda telah mempelajari setidaknya satu bahasa secara mendalam. Bagian dari masalah di industri kami saat ini, menurut pendapat saya, adalah bahwa orang hanya mempelajari 5-10% pertama dari bahasa sebelum pindah ke bahasa lain. Setelah Anda memiliki kemampuan untuk melakukan tugas-tugas paling umum dalam suatu pekerjaan, maka mulailah melihat satu hal secara mendalam. (Anda dapat kembali untuk mendapatkan luas setelah Anda mendapatkan kedalaman, lalu bolak-balik di antara keduanya.)
Sukarelawan untuk tugas-tugas yang lebih kompleks, lebih sulit, tugas-tugas yang membuat Anda harus mendalam untuk menyelesaikan masalah. Jika tidak ada tempat Anda bekerja, cari tugas sumber terbuka untuk dilakukan atau mulai mengerjakan proyek pribadi yang akan membuat Anda harus lebih mendalam. Jika pekerjaan Anda tidak memiliki masalah yang menarik, pertimbangkan untuk mencari pekerjaan yang lebih menantang.
Baca buku-buku lanjutan dalam satu bahasa (untuk SQl Server misalnya ini termasuk membaca tentang penyempurnaan kinerja dan internal basis data) alih-alih buku X belajar dalam 30 hari jenis buku.
Baca pertanyaan-pertanyaan menarik di sini dan tempat-tempat lain di mana mereka ditanya dan cobalah untuk menyelesaikannya sendiri. Jika Anda ingin belajar, cobalah untuk menyelesaikannya tanpa membaca jawaban yang lain terlebih dahulu. Bahkan jika pertanyaan sudah dijawab, Anda akan belajar lebih banyak jika Anda menemukan jawabannya sendiri. Anda bahkan mungkin menemukan jawaban yang lebih baik daripada jawaban pertanyaan itu.
Ajukan beberapa pertanyaan sulit. Evaluasilah jawaban yang Anda berikan, jangan hanya menggunakannya. Pastikan Anda memahami mengapa jawabannya akan atau tidak berhasil. Gunakan jawaban-jawaban itu sebagai tempat awal untuk meneliti.
Temukan beberapa blog teknis yang bagus dari para ahli yang dikenal di bidang ini dan baca mereka.
Berhentilah membuang pengetahuan Anda setelah Anda selesai dengan itu. Belajarlah untuk mempertahankan. Kebanyakan ahli tidak perlu mencari sintaksis yang umum. Mereka tidak harus menemukan kembali roda setiap kali mereka menghadapi masalah karena mereka ingat bagaimana mereka mendekati masalah serupa sebelumnya. Mereka dapat menghubungkan titik-titik dan melihat bagaimana masalah X yang mereka lakukan dua tahun lalu mirip dengan masalah Y yang mereka miliki saat ini (itu mengherankan saya betapa sedikit orang yang dapat membuat koneksi seperti itu). Akibatnya, mereka memiliki lebih banyak waktu yang tersedia untuk menghabiskan meneliti mata pelajaran yang lebih menarik.
sumber
Anda dapat memulainya dengan mempelajari secara mendalam spesifikasi bahasa yang Anda cari sebagai ahli. Sebagai contoh:
sumber
foreach
, dan menjabarkan perilaku yang dijelaskan dalam posting blog yang dikutip dari Eric Lippert. Jika ada yang mendapati diri mereka berpikir sesuatu seperti "Aku ingin tahu bagaimana cara kerjanya benar-benar .." ini akan menjadi tempat yang baik untuk mulai mencari.Dapatkan Reflector atau decompiler lainnya (karena membayar sekarang), dan mulailah membuka beberapa perpustakaan .NET yang paling banyak digunakan untuk mempelajari cara kerja internal. Dikombinasikan dengan buku seperti CLR via C # Anda akan mendapatkan cukup dalam (lebih dalam dari kebanyakan dari kita akan pergi pada pekerjaan reguler mereka).
sumber
BitConverter
kelas - kelas, dan menemukanIsLittleEndian
flag khusus sistem.Saya mengembangkan pengetahuan semacam itu di C ++ dengan nongkrong
comp.lang.c++.moderated
selama beberapa tahun, meskipun saya tidak benar-benar bekerja keras untuk kode di dalamnya pada saat itu. Saya tidak yakin bagaimana guru saya bisa mengatakan saya.Saya pikir ada dua jenis pengetahuan yang bisa diambil tentang bahasa pemrograman:
Nomor 2 hanya dapat dicapai dengan pemrograman dalam bahasa dan melihat kode orang lain, tetapi nomor 1 dapat dicapai dengan mengambil banyak waktu untuk membaca tentang bahasa di forum diskusi, melihat jenis pertanyaan yang diajukan orang, dan apa jawabannya adalah. StackOverflow juga merupakan tempat yang bagus untuk itu.
sumber
Pengetahuan yang mendalam dan keahlian pemrograman berarti merasa nyaman di semua level abstraksi. Yaitu
Semua yang saya lihat dalam 15 tahun terakhir menunjukkan bahwa hanya jika Anda benar-benar dapat masuk ke kompiler dan runtime, Anda memiliki peluang untuk menjadi sangat mahir. Anda mungkin harus memaksakan diri untuk mengambil langkah dan mulai menalar (dan membangun) perangkat lunak pada tingkat abstraksi berikutnya yang lebih rendah di tumpukan , tetapi itu satu-satunya cara untuk keahlian.
Yang kami miliki hanyalah bahasa untuk abstraksi. Anda harus memahami bagaimana bahasa pemrograman dirancang dan dibangun untuk benar-benar tahu apa yang dilakukan mesin.
sumber
Baca Manual Baik Ini bukan pengetahuan yang mendalam. Ini diterbitkan di bagian spesifikasi bahasa C # 8.6.4. Anda harus membiasakan setidaknya membaca spesifikasi untuk bahasa yang Anda gunakan, serta membaca sekilas dokumentasi untuk semua perpustakaan bawaan.
Bagaimanapun, ini bukan ide saya tentang pengetahuan yang mendalam; itu hanya detail implementasi yang tidak menarik. Ini bisa lebih menarik jika desainer menjelaskan mengapa itu dilakukan dengan cara yang lebih dinamis ini, daripada hanya memeriksa bahwa objek mengimplementasikan Iterable.
sumber