Derin programlama bilgisinin geliştirilmesi üzerine


136

Bazen ben göstererek kolayca Jon Skeet ve Eric Lippert gibilerin cevaplandırılır Yığın taşması uç örnekleri ve diğer garabeti ile ilgili sorular bkz , dil ve birçok inceliklerini derin bilgiye bunun gibi:

Bir kullanmak için olduğunu düşünebilirsiniz foreachdöngü, koleksiyonu uygulamalıdır üzerinden yineleme edilir IEnumerableveya IEnumerable<T>. Fakat ortaya çıktığı gibi, bu aslında bir gereklilik değildir. Gerekli olan, koleksiyonun türünün adlandırılan bir genel yönteme GetEnumeratorsahip olması ve çağrılan bir genel özellik alıcısı Currentve MoveNextgeri dönen bir genel yöntemi olan bir tür döndürmesi gerektiğidir bool. Derleyici tüm bu gereksinimlerin karşılandığını belirleyebilirse, bu yöntemleri kullanmak için kod üretilir. Bu gereksinimler biz nesne uygulayan olmadığını görmek için kontrol edebilirim yerine getirilmediği Sadece eğer IEnumerableya IEnumerable<T>.

Bunu bilmek harika şeyler. Eric'in bunu neden bildiğini anlayabiliyorum; Derleyici ekibinde, bu yüzden bilmek zorunda. Peki ya içerden derin olmayan bilgiyi gösterenler?

Ölümlüler (C # derleyici ekibinde olmayanlar) böyle şeyleri nasıl öğrenir?

Spesifik olarak, bu kişilerin bu tür bilgileri sistematik olarak kökten çıkarmak, araştırmak ve içselleştirmek (kendileri) yapmak için kullandıkları yöntemler var mı?


10
Bu özellikle açık kaynak kodlu yazılımların parladığını düşünüyorum. Çerçeve / sistem / kütüphanelere sonuna kadar basabilmek güzel. QT ile çalıştığımda WinForms ile çalıştığım zamandan beri iç sistemlerin çerçevesini daha iyi anlayabiliyordum.
Vitor Py

2
Özel bir kalabalığın önünde aptal görünmemek dışında, bu belirli örneği ne zaman bilmeniz gerekir? Bunu aptal kanıtladılar. Bunun dışında, Etkili C #, Java, C ++, vb. Serilerin içinde bazı harika şeyler olabilir. Eric Lippert'in blogu da iyi bir kaynak. Genel olarak, ne bilmediğimizi bilemeyiz, bu yüzden "100 yıl yaşa, 100 yıl öğren ve bir aptal öl" derler.
Meslek

26
Çabaya değer mi? Ben iki dilli ve diğer birkaç konuşulan dilleri öğrenmeye çalışıyorum. Bazı matematik dersleri aldım ancak bunlardan yeterli değil. Yarı saygın bir şekilde tenis oynamayı ve kelebek vuruşuyla yüzmeyi öğrenmek istiyorum. Daha fazla seyahat etmek istiyorum. Biraz Clojure öğrenmek istiyorum. İstemediğim şey, bir dilde uzman olmak, matematikte doktora yapmak, Michael Phelps gibi bir havuzda haftada 30 saat harcamak, vs. diğer deneyimlerinizi kaçırırken bir (veya birkaç) şey için çaba gösterin. Belki iş değiştirmek?
İş

10
“Eric'in bunu neden bildiğini anlayabiliyorum; derleyici ekibinde, bu yüzden bilmesi gerekiyor.” - Şansı o bunu biliyor çünkü ilk etapta düşündü . Bunun böyle çalıştığını 'öğrenmesi gerektiğinden şüpheliyim :)
Alex ten Brink

10
@Alex: Aslında C # üzerinde çalışmaya başladığımızdan beri sadece C # üzerinde çalıştım. "Foreach" özelliği bundan altı yıl önce yazılmıştı. Her gün dil hakkında hala çılgınca tarihsel şeyler buluyorum. Örneğin bugün delegeler için ((A + B) + C) - (A + C) = A + B + C, fakat ((A + B) + C) - (B + C) = A olduğunu öğrendim. . Tuhaf!
Eric Lippert

Yanıtlar:


167

Öncelikle, nazik sözler için teşekkürler.

C # hakkında derinlemesine bilgi edinmek istiyorsanız, kuşkusuz dil şartnamesi, on yıllık tasarım notları, kaynak kodu, hata veri tabanı ve Anders, Mads, Scott ve Peter'ı koridorun hemen aşağısına almanız bir avantajdır . Kesinlikle şanslıyım, bunun hakkında soru yok.

Ancak, bu avantajlar olmadan bile konuyla ilgili derinlemesine bilgi sahibi olmak hala mümkün.

Microsoft’a başladığımda, Internet Explorer 3’le birlikte gönderilen JScript tercümanı üzerinde çalışıyordum. JScript dilinin sözdizimi ve anlambilimi konusunda Microsoft'ta tanınmış bir uzman olmamı istediğini ve JScript'in bu yönleri hakkında sorular arayarak ve bunları yanıtlayarak bu konuda devam etmem gerektiğini söyledi. Özellikle soruları yanıtlarken cevaplarını bilmediğim için, çünkü onlardan öğreneceğim sorular.

Açıkçası StackOverflow ve diğer genel soru ve cevap forumları bu tür bir şey için bir ateş hortumundan içmeye benziyor. O zaman, comp.lang.javascript ve iç Microsoft "JS Kullanıcımız" forumlarını dinsel olarak okudum ve yöneticimin tavsiyelerine uydum: cevabı bilmediğim dil anlambilimiyle ilgili bir soru gördüğümde yaptım benim işim bulmak.

Böyle bir "derin dalış" yapmak istiyorsanız, dikkatli bir şekilde seçim yapmalısınız. Ben bu güne kadar tarayıcı nesne modelinin nasıl çalıştığını dikkate değer biçimde habersizim. Son yıllarda C # dili uzmanı olmaya yoğunlaştığım için, temel sınıf kütüphanelerindeki çeşitli sınıfların nasıl çalıştığı konusunda son derece cahilim. Özel derin bilgiyi ödüllendiren bir işim olduğu için şanslıyım; eğer işin ya da yeteneklerin bir general olmakla daha fazla aynı çizgide ise, derinleşmek senin için işe yaramayabilir.

Blog yazmak da çok yararlıdır; karmaşık konuları diğer insanlara açıklamamı istemekle, her zaman çeşitli konularda kendi yetersiz anlayışımla yüzleşmek zorunda kalıyorum.


14
Bu konuyu sürüklememek değil, ancak bu cevabı okuduktan sonra neden burada veya Stack Overflow hakkında hiç soru sormadığınızı merak ediyorum. Meslektaşlarınız, blogunuz vb. Bu noktada sizin için yeterli mi? Bilmemiz gereken SO'dan daha iyi kaynaklar var mı?
Matthew

6
Belki de söylediklerini yanlış anladın. Sezgisel olarak, bir şeyler öğrenmek için sorular sormuyordu, soruları cevaplıyordu .
13:

65

Bir ya da iki kez konuşmanın "gurusu" tarafında olmuştum, bir programlama dilinin veya sisteminin "derin bilgisi" olarak algıladığınız şeyin çoğu zaman yakın zamanda mücadele eden "gurunun" sonucu olduğunu söyleyebilirim. aynı sorunu çözmek için bir ay. Bu, özellikle insanların hangi soruları cevaplayacaklarını seçebilecekleri bir forumda geçerlidir. Jon Skeet ve Eric Lippert gibi bile olsalar, merhaba dünyayı bir noktada öğrenmek zorunda kaldılar. Bilgilerini bir seferde bir konsept, başkalarıyla aynı şekilde toplarlar.


1
Çok iyi bir nokta. Uzun zamandır araştırmaya başlarken, günün erken saatlerinde öğrendiğim şeyler yüzünden şimdi cevaplayabileceğim soruları bulabiliyorum.
Matthew 22

47

Paraphrasing Yogi Bhajan:

“Bir şey öğrenmek istiyorsan, onu oku; eğer bir şeyi anlamak istiyorsan, hakkında yaz; bir şeyde ustalaşmak istiyorsan, programla .”

Programlama, nihai öğretim zorluğu gibidir. Bilgisayara öğretmek, bir şeyleri gerçekten iyi bilmenizi gerektiren bir şey yapmayı gerektirir - yoksa ustalaşmayı öğrenirsiniz.

Örneğin, fizik öğrenmek istiyorsanız, bir fizik motoru yazın. Eğer satranç öğrenmek istiyorsan, bir satranç oyunu programla. Derin C # bilgisi öğrenmek istiyorsanız, bir C # derleyicisi (veya başka bir araç) yazın.


2
Programlama aynı zamanda en belirsiz bir şekilde (elbette insanlar tarafından okunmak üzere) yazma konusunda mütevazı bir girişimdir.
vpit3833

4
Satranç örneğini okuyana kadar bu alıntı çok derin geldi. Ne yazık ki bir satranç programlamak AI sizi daha iyi bir satranç oyuncusu yapmaz. Yine de +1
bughi

1
@bughi Belki kurallara hakim olabilirsin: D
Julio Rodrigues

@bughi, 'program o' her zaman kod yazma ile ilgili değil çok geniş bir terimdir !! Sadece kutudan biraz düşün.
Nitesh Verma,

25

Bildiğim kadarıyla, bunu öğrenmenin yolları şunlardır:

  • Eric Lippert gibi birinden okuyun
  • Deneyimi ve sonra ilk elden sorunları çözmek.

İkinci yol daha uzun sürebilir, ancak daha derin bir anlayışla sonuçlanacaktır (ancak her zaman değil).


17
Ya da her ikisi de. [15 karakter]
Michael K

23

Aşağıdakileri yapın derim:

En yaygın görevleri yapabileceğiniz düzeyde nispeten faydalı bir dil yığınını (gerçek bir iş için ihtiyacınız olanları) öğrendikten sonra, en az bir derinlemesine çalışana kadar daha fazla dil öğrenmeyi bırakın. Şu an endüstrimizdeki problemin bir kısmı, bence, başka bir dile geçmeden önce insanların dilin sadece% 5-10'unu öğrenmesi. Bir işte en yaygın görevleri gerçekleştirme yeteneğine sahip olduğunuzda, derinlemesine bir şeye bakmaya başlayın. (Biraz derinliğe girdikten sonra genişlemeye geri dönebilir, daha sonra ikisi arasında ileri geri gidebilirsiniz.)

Daha karmaşık, daha zor görevler için gönüllü olun, sorunları çözmek için derinlemesine gitmeniz gerekenler. Çalıştığınız yerde bir şey yoksa, yapılacak derin bir işlem yapmanıza yarayacak kişisel bir projede yapılacak açık kaynak işlerine bakın. İşinizde ilginç sorunlar yoksa, daha zorlu bir iş aramayı düşünün.

Gelişmiş kitapları bir dilde okuyun (örneğin, SQl Server için bu, 30 günlük kitap türündeki X öğrenmek yerine performans ayarlaması ve veritabanı dahili değerleri hakkında okumayı içerir).

Buradaki ilginç soruları ve onların sorulduğu diğer yerleri okuyun ve kendiniz çözmeye çalışın. Öğrenmek istiyorsanız, önce diğer cevapları okumadan bazılarını çözmeye çalışın. Soru çoktan cevaplanmış olsa bile, cevabı kendiniz bulursanız daha fazlasını öğreneceksiniz. Hatta sorunun cevabından daha iyi bir cevap bulabilirsiniz.

Birkaç zor soruyu sorun. Verdiğiniz cevapları değerlendirin, sadece kullanmayın. Cevabın neden işe yarayıp yaramadığını anladığınızdan emin olun. Bu cevapları araştırma yapmak için başlangıç ​​yeri olarak kullanın.

Alanında bilinen uzmanlardan iyi teknik bloglar bulun ve bunları okuyun.

İşini bitirdikten sonra bilgini atmayı bırak. Tutmayı öğren. Uzmanların çoğu, ortak sözdizimini aramak zorunda değildir. Her problemle karşılaştıklarında tekerleği yeniden icat etmek zorunda kalmazlar, çünkü daha önce bir simliar problemine nasıl yaklaştıklarını hatırlıyorlar. Noktaları birbirine bağlayabilir ve iki yıl önce yaptıkları X probleminin şu anda sahip oldukları Y problemine ne kadar benzeyeceğini görebilirler (bu, çok az insanın nasıl böyle bağlantılar kurabildiğini görünce şaşırtıyor). Sonuç olarak, daha ilginç konuları araştırmak için daha fazla zamana sahipler.


Güzel bir cevap. Ama merak ettim, bilgiyi korumada ve noktaları birleştirmede daha iyi nasıl olurum?

Ne öğrenirsen not almanı öneririm. Bunu Evernote'umda yapmaya başladım ve birkaç yıl içinde notlarımdan kurtulabileceğimi öğrendim. Yavaşça, notlarımın bir anda bildirilmeye hazır olduğum sunumlara hazırlanabileceği noktaya da geldim.
Shivasubramanian

9

Uzmanlık etmek istediklerinizin dil özelliklerini derinden inceleyerek başlayabilirsiniz . Örneğin:


3
İyi cevap - örneğin, bağlantılı C # şartnamesinin 15.8.4 bölümü, Eric Lippert'in foreachalıntılanan blog yazısı içerisinde açıklanan davranışı kapsar ve açıklar. Eğer birileri kendilerini "Nasıl gerçekten işe yarayacaklarını merak ediyorum .."
Carson63000

6

Get yansıtıcı ya da başka bir Decompiler (şimdi ödüyor beri), ve nasıl internals işi öğrenmek için en çok kullanılan .NET kütüphanelerinin bazı açılması başlar. C # ile CLR gibi bir kitapla birleştiğinde oldukça derinleşeceksiniz (çoğumuzun normal işlerine gideceğinden daha derin).


5
Aslında bunu BitConvertersınıflarla yaptım ve IsLittleEndiansisteme özgü bayrağı keşfettim .
Robert Harvey,

LOL. İsLittleEndian için +1
Rudy

4

Bu tür bilgileri C ++ ile comp.lang.c++.moderatedbirkaç yıl boyunca takılarak geliştirdim , bu noktada kodlamak için çok çalışmamıştım. Yine de ne kadar guru olduğumu söyleyebileceğimden emin değilim.

Bir programlama diliyle ilgili öğrenilebilecek iki tür bilgi olduğunu düşünüyorum:

  1. Dil hakkında önemsiz şeyler bilmek ve tuzaklardan nasıl kaçınılacağını bilmek.
  2. Problemleri etkili bir şekilde çözmeyi bilmek.

2 numaraya sadece dilde programlama yaparak ve başkalarının kodlarına bakarak ulaşılabilir, ancak 1 numara, tartışma forumlarında dil hakkında okumak, insanların ne tür soruları sorduğunu ve ne gibi soruları görmek için çok zaman harcayarak elde edilebilir. cevaplar StackOverflow da bunun için iyi bir yer.


4

Derin bilgi ve programlama uzmanlığı tüm soyutlama seviyelerinde rahat olmak demektir. yani

  • kütüphaneler ve API'ler
  • dil anlambilimi
  • derleyici optimizasyonları
  • derleyici dahili ve kod oluşturma
  • çalışma zamanı ve çöp toplayıcı davranışı
  • mimari ve komut seti sorunları

Son 15 yılda gördüğüm her şey, yalnızca derleyiciye ve çalışma zamanına gerçekten girebiliyorsanız, derinden uzman olma şansınız olduğunu göstermiştir. Bir sonraki adımda istifleme seviyesini düşürmek ve akıl yürütme (ve inşa etme) yazılımını yığında daha düşük bir soyutlama seviyesinde başlatmak için kendinizi zorlamanız gerekebilir , ancak bu, uzmanlık kazanmanın tek yoludur.

Elimizdeki tek şey soyutlama dili. Makinenin ne yaptığını gerçekten bilmek için programlama dillerinin nasıl tasarlandığını ve oluşturulduğunu anlamalısınız.


3

İnce Kitabı Okuyun Bu özellikle derin bir bilgi değildir. C # dil özellikleri bölümünde 8.6.4'de yayımlanmıştır . En azından kullandığınız dillerin özelliklerini ve aynı zamanda tüm yerleşik kütüphanelerin belgelerini gözden geçirme alışkanlığı edinmelisiniz.

Neyse, bu benim derin bilgi fikrim değil; bu sadece ilginç olmayan bir uygulama detayı. Tasarımcı, yalnızca nesnenin yinelemeli olduğunu kontrol etmek yerine neden bu kadar dinamik bir şekilde yapıldığını açıklarsa daha ilginç olabilir.


1
C # dili belirtimini "gözden geçirme" gibi bir şey olduğunu sanmıyorum.
Robert Harvey,

@RobertHarvey: Operatör önceliği ve bildirim sözdizimi gibi, bildiğiniz şeyleri kapsayan resmi dilin çoğunu gözden geçirebilir ve C # foreach veya Java enum yapıcılarının tam davranışı gibi beklenmedik ancak yararlı ayrıntılara odaklanabilirsiniz.
kevin cline

Standardın açıklamalı bir sürümünü satın alabilirsiniz. Şimdi biraz tarih var ama yorumlar, dilin kapsanan bölümleri için hala çok ilginç.
Jørgen Fogh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.