Zaman zaman, Jon Skeet ve Eric Lippert'in beğenileri tarafından kolayca cevaplanan Edge vakaları ve Stack Overflow'daki diğer tuhaflıklar hakkında soruları görüyorum, dilin ve onun karmaşıklıklarının derin bir bilgisini gösteriyor, bunun gibi:
Bir
foreachdöngüsü kullanmak için, yinelediğiniz koleksiyonun
IEnumerableveya
IEnumerable<T>. Ama ortaya çıktığı gibi, bu aslında bir gereklilik değil. Gerekli olan, koleksiyonun türünün
GetEnumeratoradında bir genel yöntemi olması ve
Currentadında bir genel özellik alıcısı ve bir genel yöntemi
MoveNext_
booldöndürür. Derleyici, tüm bu gereksinimlerin karşılandığını belirleyebilirse, bu yöntemleri kullanmak için kod oluşturulur. Yalnızca bu gereksinimler karşılanmadığında, nesnenin
IEnumerableveya
IEnumerable<T>.
Bunu bilmek harika şeyler. Eric'in bunu neden bildiğini anlayabiliyorum; derleyici ekibinde, bu yüzden bilmek zorunda. Peki, içeride olmayan bu kadar derin bir bilgiyi sergileyenlere ne olacak?
Sadece (C # derleyici ekibinde olmayan) faniler böyle şeyleri nasıl öğrenir?
Özellikle, bu kişilerin bu tür bilgileri sistematik olarak köklendirmek, araştırmak ve içselleştirmek (kendi yapmak) için kullandıkları yöntemler var mı?
Öncelikle, nazik sözler için teşekkürler.
C # hakkında derin bir bilgi edinmek istiyorsanız, dil spesifikasyonu, on yıllık tasarım notları, kaynak kodu, hata veritabanı ve Anders, Mads, Scott ve Peter'ın olması şüphesiz bir avantaj koridorun hemen aşağısında. Kesinlikle şanslıyım, bu konuda soru yok.
Bununla birlikte, bu avantajlar olmasa bile, konuyla ilgili derin bir bilgi sahibi olmak hala mümkündür.
Microsoft'a başladığımda, Internet Explorer 3 ile birlikte gelen JScript yorumlayıcısı üzerinde çalışıyordum. O zamanki yöneticim bana şimdiye kadar aldığım en iyi tavsiyelerin bir kısmı olduğunu söyledi. Microsoft'ta, JScript dilinin sözdizimi ve anlambilimi konusunda tanınmış uzman olmamı istediğini ve JScript'in bu yönleri hakkında sorular arayarak ve cevaplayarak bu konuda devam etmem gerektiğini söyledi. Özellikle cevapları bilmediğim soruları cevaplıyorum, çünkü bunlar öğreneceğim şeyler.
Açıkçası StackOverflow ve diğer halka açık Soru-Cevap forumları, bu tür şeyler için bir itfaiyeden içmek gibidir. O zamanlar comp.lang.javascript ve dahili Microsoft "JS Kullanıcı" forumlarımızı dindar bir şekilde okudum ve yöneticimin tavsiyelerini takip ettim: dil anlambilimi hakkında bilmediğim bir soru gördüğümde cevabını bulmak benim işim oldu.
Böyle bir "derin dalış" yapmak istiyorsanız, dikkatli bir şekilde seçim yapmanız gerekir. Ben bugüne kadar dikkat çekici tarayıcı nesne modelinin nasıl çalıştığını bilmiyorum. Son yıllarda C # dili uzmanı olmaya odaklandığım için, temel sınıf kütüphanelerindeki çeşitli sınıfların nasıl çalıştığı konusunda oldukça cahil davranıyorum. Belirli derin bilgiyi ödüllendiren bir işim olduğu için şanslıyım; eğer işiniz ya da yetenekleriniz genelci olmakla daha uyumluysa, derine inmek sizin için işe yaramayabilir.
Blog yazmak da son derece faydalıdır; Karmaşık konuları diğer insanlara açıklamamı isteyerek, çeşitli konular hakkında kendi yetersiz anlayışımla her zaman yüzleşmek zorunda kalıyorum.
Bir veya iki kez konuşmanın "guru" tarafında bulunduğunuzu söyleyebilirim, bir programlama dilinin veya sisteminin "derin bilgisi" olarak algıladığınız şeyin çoğu zaman son zamanlarda mücadele eden "guru" nun sonucu olduğunu söyleyebilirim. aynı sorunu çözmek için bir ay. Bu özellikle insanların hangi soruları cevaplayacaklarını seçebilecekleri bir forum için geçerlidir. Jon Skeet ve Eric Lippert'in beğenileri bile bir noktada merhaba dünyayı öğrenmek zorunda kaldı. Bilgilerini her seferinde aynı şekilde, herkesle aynı şekilde alıyorlar.
Açıklamaları Yogi Bhajan:
"Bir şey öğrenmek istiyorsanız, okuyun; bir şeyi anlamak istiyorsanız, onun hakkında yazın; bir şeye hakim olmak istiyorsanız program it."
Programlama, en büyük öğretim zorluğu gibidir. Bilgisayar öğretmek bir şey yapmayı gerektirir, eşyalarınızı gerçekten iyi biliyorsunuz - ya da ustalaşmayı öğreneceksiniz.
Örneğin, fiziği öğrenmek istiyorsanız, bir fizik motoru yazın. Satranç öğrenmek istiyorsanız, bir satranç oyunu programlayın. Derin C # bilgisini öğrenmek istiyorsanız, bir C # derleyicisi (veya başka bir araç) yazın.
Bildiğim kadarıyla, bunu öğrenmenin yolları:
İkinci yol çok daha uzun sürebilir, ancak muhtemelen daha derin bir anlayışla sonuçlanacaktır (ancak her zaman değil).
Şunu söyleyebilirim:
En yaygın görevleri yapabileceğiniz düzeyde nispeten yararlı bir dil yığını (gerçek bir iş için ihtiyacınız olanlar) öğrendikten sonra, en az bir tane derinlemesine çalışana kadar daha fazla dil öğrenmeyi bırakın. Sektörümüzde şu anda problemin bir parçası, bence, insanlar başka bir dile geçmeden önce dilin sadece ilk% 5-10'unu öğreniyorlar. Bir işte en yaygın görevleri yapma olanağına sahip olduğunuzda, bir şeye derinlemesine bakmaya başlayın. (Biraz derinlik kazandıktan sonra genişlemeye geri dönebilir, sonra ikisi arasında gidip gelebilirsiniz.)
Daha karmaşık, daha zor görevler için gönüllü olun, sorunları çözmek için derinlemesine gitmeniz gerekir. Çalıştığınız yerde hiçbir şey yoksa, yapılacak açık kaynak görevlerini arayın veya derinlemesine gitmenizi sağlayacak kişisel bir proje üzerinde çalışmaya başlayın. İşinizin ilginç bir sorunu yoksa, daha zorlu bir iş aramayı düşünün.
30 günlük kitap türünde X öğrenmek yerine, bir dilde gelişmiş kitapları okuyun (örneğin, SQl Server için bu performans ayarlama ve veritabanı dahili bilgileri hakkında okuma içerir).
Buradaki ilginç soruları ve sorulan diğer yerleri okuyun ve kendiniz çözmeye çalışın. Öğrenmek istiyorsanız, önce diğer cevapları okumadan bazılarını çözmeye çalışın. Soru zaten cevaplanmış olsa bile, cevabı kendiniz bulursanız daha fazla bilgi edineceksiniz. Hatta sorunun cevabından daha iyi bir cevap bile bulabilirsiniz.
Birkaç zor soruyu sorun. Verilen cevapları değerlendirin, sadece kullanmayın. Cevabın neden işe yarayıp yaramayacağını anladığınızdan emin olun. Bu cevapları araştırmaya başlangıç noktası olarak kullanın.
Alanında bilinen uzmanlardan bazı iyi teknik bloglar bulun ve okuyun.
İşiniz bittiğinde bilginizi atmayı bırakın. Saklamayı öğrenin. Çoğu uzman ortak sözdizimini aramak zorunda değildir. Her problemle karşılaştıklarında tekerleği yeniden icat etmek zorunda değiller, çünkü daha önce bir simliar problemine nasıl yaklaştıklarını hatırlıyorlar. Noktaları birleştirebilir ve iki yıl önce yaptıkları X probleminin şu anda sahip oldukları Y problemine ne kadar benzediğini görebilirler (çok az insanın böyle bağlantılar kurabildiğini şaşırtıyor). Sonuç olarak, daha ilginç konuları araştırmak için daha fazla zamanları olur.
Reflector veya başka bir decompiler alın (şimdi ödediği için) ve dahili araçların nasıl çalıştığını öğrenmek için en çok kullanılan .NET kitaplıklarından bazılarını açmaya başlayın. CLR üzerinden C # gibi bir kitapla birleşince oldukça derinleşeceksiniz (çoğumuzun normal işlerine gideceğinden daha derine ineceksiniz).
Gerçekten bu noktada kodlamak için çok çalışmama rağmen, birkaç yıl boyunca
comp.lang.c++.moderated Yine de nasıl guru olduğumu söyleyebileceğimden emin değilim.
Bence birinin programlama dili hakkında alabileceği iki tür bilgi vardır:
2 numara sadece dilde programlama ve diğer insanların kodlarına bakarak elde edilebilir, ancak 1 numara tartışma forumlarında dil hakkında okumak için çok zaman harcayarak, insanların ne tür sorular sorduğunu ve cevaplar. StackOverflow da bunun için iyi bir yerdir.
Derin bilgi ve programlama uzmanlığı, tüm soyutlama seviyelerinde rahat olmak anlamına gelir. Yani.
Son 15 yılda gördüğüm her şey, sadece derleyiciye ve çalışma zamanına girebiliyorsanız, derinlemesine yetkin olma şansınız olduğunu gösterdi. Kendinizi adım atmaya ve bir sonraki soyutlama düzeyinde mantık yürütmeye (ve inşa etmeye) zorlamak zorunda kalabilirsiniz yığının altında, ancak bu uzmanlık için tek yoldur.
Sahip olduğumuz tek şey soyutlama dilidir. Makinenin ne yaptığını gerçekten bilmek için programlama dillerinin nasıl tasarlandığını ve geliştirildiğini anlamalısınız.
İyi Kılavuzu okuyun Bu çok derin bir bilgi değildir. C # dil belirtimi bölüm 8.6.4'te yayınlanmıştır. En azından kullandığınız diller için teknik özellikleri gözden geçirmenin yanı sıra tüm yerleşik kütüphanelerin belgelerini gözden geçirme alışkanlığı edinmelisiniz.
Her neyse, bu benim derin bilgi fikrim değil; sadece ilginç bir uygulama detayı. Tasarımcı, nesnenin tekrarlanabilir olduğunu uyguladığını kontrol etmek yerine, neden bu daha dinamik bir şekilde yapıldığını açıklarsa daha ilginç olabilir.