Bir röportajda neden “C # hakkında nefret ettiğin beş şeyi ver” sorusunun yanıtlanması bu kadar zor? [kapalı]


32

In podcast 73 Joel Spolsky ve Jeff Atwood, diğer konular arasında, "Herkesin kendi favori programlama dili hakkında nefret etmelidir beş şeyi" tartışmak:

Mevcut takım zincirinizden memnunsanız, geçiş yapmanız gerekmiyor. Ancak, en sevdiğiniz programlama dili hakkında nefret ettiğiniz beş şeyi listeleyemiyorsanız, o zaman henüz yargılamak için yeterince iyi bilmediğinizi savunuyorum. Alternatiflerin farkında olmak ve ne kullanıyorsanız kullanın sağlıklı ve eleştirel bir göze sahip olmak iyidir.

Meraklı olmakla, bu soruyu röportaj yaptığım adaylara sordum. Hiçbiri C # about hakkında nefret ettikleri en az bir şeyden alıntı yapamadı.

Niye ya? Bu soruda bu kadar zor olan ne? Görüşmenin stresli bağlamı nedeniyle, bu sorunun görüşülen kişiler tarafından cevaplandırılması imkansız mı?

Bu soru hakkında görüşmeyi kötüleştiren bir şey var mı?


Açıkçası, bu C # mükemmel olduğu anlamına gelmez. Kendime C # hakkında nefret ettiğim beş şeyin bir listesini yaptım:

  • Jeneriklerde değişken sayı türlerinin eksikliği ( paramsargümanlara benzer ).
    Action<T>,
    Action<T1, T2>,
    Action<T1, T2, T3>,
          ⁞ Ciddi ?!
    Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>

  • F # 'daki gibi ölçü birimleri için destek eksikliği.

  • Salt okunur özelliklerin eksikliği. private readonlyHer zaman salt okunur bir özellik istemek için bir destek alanı yazmak çok sıkıcı.

  • Varsayılan değerlere sahip özelliklerin olmaması. Ve evet, onları parametresiz kurucuda başlatabileceğimi ve diğer tüm kuruculardan arayabileceğimi biliyorum. Ama istemiyorum.

  • Çoklu kalıtım Evet, karışıklığa neden olur ve çoğu durumda buna ihtiyaç duymazsınız. Bazı (çok nadir) durumlarda hala yararlıdır ve karışıklık aynı adı taşıyan yöntemleri içeren çeşitli arayüzleri miras alan sınıfa da uygulanır (ve C # 'da çözülmüştür).

Bu listenin tamamlanmaktan çok uzak olduğundan eminim ve vurgulamak için daha çok nokta var, özellikle de benimkinden çok daha iyi olanlar var.


People Birkaç kişi, .NET Framework'teki bazı meclisleri veya çerçeve içindeki bazı kütüphanelerin bulunmamasını eleştirdi veya CLR'yi eleştirdi. Bu soru hakkında olduğu için, sayılmaz dilin Potansiyel olarak hiçbir ortak arayüz olmadığı gerçeğini gibi örnek bir şey için .NET Framework (özünde bir şey negatif ilgili bir cevap kabul edebileceğini ederken kendisi ve TryParseeğer öyleyse, Bir dize birkaç tür ayrıştırmak istiyorsanız, her tür için kendinizi tekrarlamanız gerekir), JSON veya WCF hakkında bir cevap tamamen konu dışı.


52
Why the question “give five things you hate about C#” is so difficult to answerÇünkü bu bir liste sorusudur ve kötü bir mod, cevap verme şansını elde etmeden önce "yapıcı değil" olarak kapatır ...; P
yannis,

6
@Yannis Rizos: iyi nokta. BTW, bu soruyu bir başlıkta yazarken, Yığın Taşması "sorduğunuz soru sübjektif görünür ve muhtemelen kapanması muhtemeldir"
Arseni Mourzenko

5
Belki de beyninizin programlama dillerinden nefret edebileceğiniz şeyler için depolama alanı çoğunlukla başa çıkmak zorunda olduğunuz diğer dillerin yönleriyle doludur.
whatsisname,

9
Muhtemelen çoğu insan nefretli olmadığı için. Nefret çoğu insan için oldukça güçlü bir kelimedir. C # hakkında "nefret" ettiğin gerçekten, gerçekten önemsiz eşyaların listesine bakarsak, dostum gerçekten bir şeyden nefret etmek için bir sebep olduğunda, senin yanında hiçbir yerde olmak istemem. Kafanın patlayacağından şüpheleniyorum. Ayrıca, bir liste oluşturmaktan şüpheleniyorum, çoğu kişi için zor, çünkü listenizi geliştirmek için germek zorunda kaldınız ve düşünmek için günleriniz vardı.
Dunk

19
Listenizdeki tüm öğelerin, yanlış yapılan bir şey yerine eksik bir şeyle ilgili olduğunu fark ettiniz mi? Benim görüşüme göre görüşme sorusu başarısız oldu. Herkes dilde eksik olan özellikleri listeleyebilir ve nefret etmek için bir neden ilan edebilir ancak en çok nefret edilen dil tüm özelliklere sahip olacaktır.
Stilgar

Yanıtlar:


42

Tahmin etmek zorunda kalırsam:

  1. Bazı programcılar farklı dillere maruz kalmıyorlar. Daha iyi şeylerin olduğunu bilmediğinizde, dilde yanlış olan şeyleri görmek zordur.

  2. Bazı programcılar sadece kod maymunlarıdır. Programlama dillerinin nasıl daha iyi olabileceği gibi bir şey olsa bile, önlerindeki sorunları zar zor analiz ederler.

  3. Çok az insan özellikle kritiktir. Eksiklikleri değil faydaları ve özellikleri görürler. Eğer görüşme böyle gitmezse, bu düşünme tarzına geçmeleri zor.

  4. En azından buralarda, aşırı derecede kritik olmak ölümcül bir kişilik hatası olarak görülüyor. 'Her zaman daha iyi şeyler yapmanın yollarını arayan anlayışlı geliştirici' olmak yerine (yaşadığım bazı bölgeler gibi), onlar 'her şeyden nefret eden o aşağılık' tır. Dilde nefret ettikleri şeyleri düşünebilen insanlar bile röportajda daha az acerici görünebilir.


22
2 numara gelince , Yazılım Simians'ı tercih ediyoruz , efendim.
toniedzwiedz

@ Tom'un pan programmatoribus olduğunu sanıyordum .
Stefano Borini

9
@Telastyn , cevabınızda beş kurşun noktası olmamalı mı?
Ben Jackson,

# 4, özellikle C # kullanmaya kendini adamış çalışma ortamlarında hemen aklıma geldi. Ortak görüşme ve işyeri davranış önerileri dikkate alındığında, bunu bir iş görüşmesinde sormak, bu kişiyi işe almak istememelerine neden olabilecek “kötü tutumları” yakalamak için yem gibi görünebilir. Yasal kovuşturmanın aksine, iş görüşmelerinde tuzağa düşürmenin etkili bir savunma olma olasılığı düşüktür. ;-)
Dronz 24:14

35

Görüşme sırasında sorunun cevaplanmasının çok zor olduğunu hayal ediyorum, çünkü:

  1. Gerçekten beklenmedik,

  2. Görüşme sırasında kullanılandan çok fazla düşünme ve çok farklı bir şekilde düşünme gerektiren,

  3. Genel olarak kısa sürede cevap vermek zordur (görüşmeden önce hazırlanmadıysa).

1. Beklenmedik

Beklenmeyen sorular, özellikle stresli bir bağlamda gerçekten zor. Bir görüşme sırasında aşağıdaki diyaloğu hayal edin:

- HashSet<T>ve arasındaki fark nedir List<T>?
- Hashset, element araması çok hızlı olacak şekilde optimize edilmiştir. Örneğin set.Contains(), çok setsık bir döngü içinde kullanıyorsanız , listeden karmaşaya geçiş yapmak işleri daha hızlı yapabilir.
- Salt okunur bir özellik nasıl oluşturulur?
- readonlySadece alıcı olan bir mülk için destek alanı olarak işaretlenmiş bir alan kullanıyorum .
- Kullanımı nedir sealed?
- Miras almaması gereken sınıflar için kullanıyorsunuz.
- En son ne zaman dişçi gördün?
- Ne?!

2. Çok fazla farklı düşünce gerektirir

Genel mülakat tipi sorular sorulduğunda, hafızanızı kitaplardan veya uygulamadan dil ve çerçeve ile ilgili öğrendiklerinizi hatırlamak için kullanırsınız. Bir cevap bulmak için biraz düşünebilirsiniz ama çok fazla değil.

Öte yandan, nefret ettiğiniz beş şeyle ilgili soru daha derin düşünmeyi gerektirir. Kitaplardan öğrendiğin bir şeyi hatırlayamazsın ve analojiyle hiçbir şey bulamazsın. Pasif olmak yerine eleştirel olmak ve kullandığınız dilde neyin hoş görünmeyeceğini bulmak zorundasınız.

3. Zaman gerektirir

Açıkçası, C # hakkında nefret ettiğim beş (aslında daha fazla) şeyden oluşan bir listem var ama uzun zamandır düşündüm. .NET Framework 2 döneminden bir kaç şey var; .NET Framework 2 için listelediğim sorunların çoğu artık geçerli değil, çünkü bazıları LINQ ve tüm bu işlevsel programlama öğelerini, diğerleri dinamik programlamayı da kaldırdılar. Bu soruyu hazırlamadan bir röportaj sırasında beş öğeyi de bulabilecek miyim, emin değilim.


3
Genelde haklı olduğunuzu düşünüyorum, ancak belirli bir dilde yeteri kadar süre için programlama yapmak sizi belirli 'özelliklerinden' nefret ettirir. Bir çeşit hit listesi gibi. Ya da en azından şimdiye kadar kullandığım her dil / platform için bir tane var. Ya da belki şımarık ve seçiciyim.
K.Steff,

2
@ K.Steff: "Hit-list" bunun için mükemmel bir isimdir :). En sevdiğim platformda bile beşten fazla problem olduğunu düşünebilirim; Eğer bir dille ilgili bana sorarsanız ben yok gibi ama muhtemelen saatlerce gidebiliriz kullanım (örneğin Java veya Python) zorunda kalmıştır: P.
Tikhon Jelvis

1
Bir dilde nefret ettiğiniz şeyleri kolayca hatırlayıp hatırlayamamanız, 'özelliklerin' başa çıkmanız gereken diğer şeylerle ne kadar sıkıntılı olduğuna bağlı olacaktır. Örneğin, çalışmamın çoğu, belirli (ve özellikle korkunç) bir yabancı sistemle ve API'si ile etkileşime girmeyi içeriyor. C # /. NET ile ilgili daha çok kaynaştırıldığında kıyaslandığında soluk kalıyor ve aklımın arkasına itiliyor.
Dan Lyons

Her dil / platform için bir "hit-list" takip edebilmeniz ve "yeterli zaman" için belirli bir dilde programladığınız zaman yanınızda taşımanız harika. Öyleyse, "yeterli zaman" için programladıktan sonra bu sorunları etrafta taşımak için zahmet etmeyenler de var. Başkalarının yaptığı, hit listesindeki problemlere bir çözüm bulmak ve sonra yine hit listedeki problem hakkında endişelenmek zorunda kalmamaktır, çünkü onu uzaklaştırdılar. Eğer bir listeyi taşıyacak kadar problem olmuşsa, onların zevkini çözmek için zaman ayırmanın yeterli olduğunu düşünmüş olmalılar.
Dunk

21

Beş kelimeden dolayı zor olduğunu düşünüyorum . Ve daha az derecede, nefret kelimesinden dolayı .

Beş mi? Ya sadece dört tane bulursan? Soruya cevap vermedin mi? Ya beşten fazla varsa ? Şimdi, yerinde, hangisinin kullanılacak en iyi beş olduğunu bulmak zorundasınız.

Nefret çok olumsuz bir kelimedir. İnsanlara röportajlarda kaçınmaları söylenen bir tür olumsuzluk. Üstelik bunun o kadar çok şey onlar bütün gün programlama harcama olacak bir dil hakkında onlar "nefret" olması bir çok insan için tuhaf olacağını düşünüyorum Bazı insanlar hileli bir soru düşünmek bile olabilir. Aslında Eğer do come Beş şeyden önce, C # 'dan nefret etmek için iyi programlayamayacak kadar çok diskalifiye olurlar. Ne yazık ki, bu tür bir sapkın hile sorusu röportajlarda duyulmamış değildir.

Bunun yerine, size kalmış olsaydı C # konusunda neleri geliştirirdiniz? Bu, görüşmecinin istediği sayıda yanıt vermesini sağlar. Bu kelime öbeği aynı zamanda "nefret" kelimesinin göreceli olarak olumlu "iyileşme" için olumsuzluğunu da işlemektedir.


2
"Beş" e karşı puanınız iyi - bir çok insan muhtemelen farklı derecelerde sevmedikleri şeyleri sürdürebilir, ancak ilk beşi hangi şeyleri temsil edeceğine karar vermelerinin tek yolu yakın olabilecek her şeyi sıralamak olacaktır. Birisinin yakın zamanda genel olarak küçük bir can sıkıntısı olan bir şeyle problemi varsa, ilk beşi gerçekten yapması gerekip gerekmediğini anlamak için bir süre düşünmek zorunda kalabilir ya da çok yakın zamanda bir sorun olduğu için aklına geldi. Dahası, C # o kadar iç içe geçmiştir ki, neyi suçlayacağını söylemek zor. Örneğin ...
supercat

1
… Tüm dillerin , bir kurucu fırladığında, kısmen inşa edilen nesnenin elde edeceğini Disposed, ancak tüm dillerin uyguladığı bir zorunluluğun bulunmadığı bir şartın bulunmamasını, bunun da böyle dillerin yanlış beklentilere yol açacağını iddia edebileceğini garanti etmesini isterim . Bu nedenle, C # yapıcı arızasında kaynak sızıntısından kaçınmanın zorluğunun C # veya CLS'den sorumlu tutulması gerekip gerekmediği açık olmayabilir.
supercat

14
  • Adayların çoğu, kontrast oluşturmak için birden fazla dil veya paradigma ile yakından ilişkili değildir . 5 yıldır başka bir nesne yönelimli dille çalışmadım ve çalıştığım dilde (PowerBuilder) çok şey vardıile Üniversiteden yeni çıkmış erkeklerin çoğu bir veya belki iki dilde sıcak şeylerdir (veya öyle olduğunu düşünürler) ve üç veya dört kişiye daha fazla "maruz kalma" (yani, en az bir ev ödevini tamamladılar ancak bir yarıyıldan daha az sürede tamamladılar) ders çalışıyorum. Dilde neyin yanlış olduğunu gerçekten bilmek için bu yeterli bilgi ya da deneyim değil. Gerçek dünyada bir iş bulun ve bu odak önemli ölçüde daralır; size maaş çekini diğerlerinden daha fazla kazandıran dil hakkında çok şey öğrenirsiniz ve bu süreçte dilin ne yapmayacağını ya da garip bir şekilde ne hatırlayamadığınızı kabul edersiniz. farklı yapıyorum.

  • Java / C / C ++ ile karşılaştıran çoğu C # -savvy adayı oldukça memnun . C #, Java'dan daha iyi şeyler yapmak için sıfırdan tasarlandı (olaylar, geri çağrılar, grafik kütüphanesi, veritabanı çalışması). Java da kullanımı daha kolay olacak şekilde tasarlandı ve C ++ 'dan ziyade doğru koda odaklandı. Kabarcıklı performansın ve devreye yakın seviye kontrolün kritik öneme sahip olmadığı herhangi bir ortamda C ++ 'a geri dönmek isteyen bir C # programcısıyla henüz tanışmadım.

Başka bir deyişle, See-Sharpers, her şeyi göz önünde bulundurarak oldukça iyi bir duruma sahip.

İşte listem:

  • Lambda ifadeleri izlenemez / değerlendirilebilir değildir . Adlandırılmış yöntemlere yapılan çağrılar VS'nin QuickWatch'una takılabilir. Yani ifadeler olabilir. Fakat kuzu eti? Hayır (en azından VS2010'da değil). Hata ayıklama Linq zincirleri gerçek bir angarya yapar.

  • Dize dışındaki referans türleri için isteğe bağlı parametre değerleri yalnızca boş olabilir . bir aşırı yük yığını oluşturuyor olsaydım, diğer varsayılanları kullanmak isteyebilirdim. Bir özelliği temel alan bir değeri veya başka bir parametreyi temel alan basit ifadeyi ayarlayabilirim. Ama yapamam. Bu nedenle, isteğe bağlı parametreler için seçenekler çok kısıtlı olduğunda bir aşırı yük yığını oluşturmak zorunda kalmama değeri (kazan plakasını kullanmak için ReSharper gibi yeniden ateşleme asistanı ile küçük olan) azalır.

  • C # ciddi eski kod sorunları için yeterince yaşlanıyor . Orijinal olarak 1.1 için yazılmış olan kod, eskiden 4.0'a korku içinde tıkanmaya neden olan herhangi birisine neden olacaktır. 2.0 kodu bile çok fazla özlüyor. Aynı zamanda, ADO.NET gibi şeylerin son derece ilkel görünmesini sağlayan üçüncü parti kütüphaneleri de ortaya çıktı (ve ADO.NET'in "bağlı modeli" artık büyük bir anti-kalıptır). Yine de, geriye dönük uyumluluk için, .NET, bu eski, kötü kodun desteğini bir araya getirdi, "ArrayList bunu yapmak için berbat bir yoluydu, asla koyduğumuz için üzgünüz ve alıp götürüyoruz. Bunun yerine Liste kullanın ve kesinlikle farklı türlerden oluşan bir listeye ihtiyacınız varsa, bunu olarak bildirin List<Object>.

  • Ciddi sınırlı anahtar deyimi kuralları . Muhtemelen PowerBuilder hakkında söyleyebileceğim en iyi şeylerden biri, Select Case deyiminin (değişime eşdeğer) değişkene dayalı Boolean ifadelerine izin vermesidir. Ayrıca, kod ifadeleri olsa bile anahtar ifadelerinin düşmesine izin verdi. İkincisinin izinsiz bırakılma nedenlerini anlıyorum (istemeden kasıtlı olarak yapılması daha olasıdır) ancak zaman zaman şöyle bir ifade yazmak yine de iyi olurdu:

    switch(someInt)
    {
        case < 0: //all negative values enter here
           //...
           break;
        case 0: 
           //...
           break;
        case 1:
           //...
           //no break; continue through to the code for > 1
        case > 1 // all positive values enter here (including 1)
           //...
           break;
    }
  • Nümerik arayüz yok . Bu bir sayıysa, onunla matematik yapabilirsiniz. Çoğu durumda, gerçek yöntem tam olarak hangi tiplerin takılı olduğu ile ilgilenmek zorunda değildir; hassasiyet, arayanın sorumluluğundadır. Ancak, GTP olarak yalnızca sayı türlerini kabul edebilecek genel bir yöntem veya sınıf oluşturmak mümkün değildir.

3
"Java / C / C ++ ile karşılaştıran çoğu C # -savvy adayı oldukça memnun kalıyor". Bu benim düşüncemdi. C # konusunda nefret edeceğiniz çok şey yok, çünkü teknik sorunun çözümünden ziyade iş sorununun çözümüne odaklanmanıza izin veriyor. Dil ile sahip olduğum en büyük sıkıntı, switch case testlerinde kaynak dizeleri kullanamıyorum çünkü teknik değişkenler ve sabit değiller.
Stephen

4
Jenerikler ve konteynerler üzerindeki bit - Generics'te yaygınlığı olan süper ve belirsizlik içeren faydalı örnek? biraz açıklar. Atama Bag<Fruit> bag = Bag<Huckleberry>yapmak bag.add(new Watermelon()), yapamayacağınız anlamına gelir .

4
Sayı Yok için +1. Nadir, ama sinir bozucu.
jmoreno

Diyelim ki Thing<out T>hem bir örnek yöntemi hem de statik bir yöntem tarafından erişilen statik bir alana sahip. A Thing<Cat>, onu bekleyen bir yönteme iletilirse Thing<Animal>ve bu yöntem yukarıda belirtilen örneği ve Thing<Animal>başvurudaki statik yöntemleri çağırırsa, bu yöntemler hangi statik alanlara erişmelidir?
supercat,

11

Sorunun bir kısmının kötü bir cevap verme korkusu olduğunu öneriyorum - X'ten nefret ettiğini söylüyorsun, görüşmeci X'i seviyor ya da X'in nefret sebebinin aptalca olduğunu düşünüyor, bunun iyi olduğunu düşünmenin daha az tartışmalı bir seçenek olarak görünebileceğini düşünüyor.

Aynı zamanda muhtemelen çoğu insanın gerçekten çok fazla düşünemediği bir şeydir; şu anki problemleri var ve geçmiş problemleri var, geçmişin neden olduğu geçmiş problemler sona erdi ve bu yüzden insanlar esas olarak çözümü düşünüyor ve daha önemli olan problemi değil, çok azının dilin neden olduğu güncel bir problemi olacak.


7

Bir röportaj için sadece 1 veya 2 isteyeceğim, ancak kabul ediyorum, kullandığınız aracın sınırlarını belirleyemiyorsanız, muhtemelen çok iyi bilmiyorsunuz demektir. SSIS hakkında bu kesin soruyu soruyoruz ve buğdayı samandan ayırmaya gerçekten yardımcı oluyor; Bu soruyu iyi cevaplayan, işe aldığımız herkes iyi bir çalışan oldu. Birkaç kez bakmış biri değil, bilgiliğe sahip insanlara ihtiyacımız var. Ve iddiaya girerim istediğin de budur.

Bunun geçerli bir soru olduğunu ve bu kadar çok kişinin cevap veremeyeceği gerçeği, iş için adayların pek çoğunun gerçekte ne kadar zayıf olduğunun bir örneği. Birisi aracın bazı kısıtlamalarını anlayabilecek kadar analitik değilse, zor programlama problemlerini çözmek için nasıl analitik olarak yeterli olacaklar?


1
+1 Beş korkutucu, bu nedenle 1 veya 2 muhtemelen daha fazla cevap alırdı.
Laurent Couvidou

2
Nefret bir sınırlamadan oldukça farklıdır ......
mattnz

4

Sizin de C # ile ilgili derinlemesine bir deneyim eksikliği ve / veya diğer dillere maruz kalmama dediğiniz gibi geliyor. C # yüzeyindeki hafif çiziklerin bile ortaya çıkarması gereken bazı soruları cevaplayamayan, kendilerini kıdemli düşünen birkaç geliştiriciyle görüştüm.

Yeterince kazma olmadan, dilin sınırlarına ulaşamayacak ve onların gitmesini dilemeyeceksiniz. Kimsenin merak etmesi durumunda ilk beşim

  1. Değiştirilemeyen nesneler oluşturmak için çok sayıda tören gerektirir (nesnelerin varsayılan olarak değiştirilemez olduğu işlevsel bir dilin aksine).
  2. Metaprogramming yapmak zor. Lisp makroları ile emit türünü karşılaştırın. (Derleyici Servisleri, bu ilerlemeye çok yardımcı olacaktır).
  3. Uzatma yöntemleri harika ... uzatma özellikleri ve uzatma operatörleri (özellikle açık ve açık operatörler) daha iyi olurdu.
  4. Açık Yayınlar çalışma zamanı yerine derleme zamanında çözümlenir.
  5. Sıra yok Eşleştirme, fonksiyon aşırı yüklenmesinden çok daha temiz.

İlk iki puanınızla aynı fikirdeyim, ancak uzatma örtülü dönüştürme fikrini ürkütüyorum.
CodesInChaos 12:13

3

Ben onun turunda söylediği gibi düşünüyorum; Kırıldığını düşünüyorsanız, neden olduğunu anlamıyorsunuzdur. Bilginizde bir delik olabilir.

İronik olarak, bir mülakat sorusu olarak kullanarak "büyük Joel" ten alıntı yaptıklarını düşünen görüşmeciler muhtemelen noktayı kaçırıyorlar.


Bunun her zaman böyle olmadığını savunuyorum. Örneğin, Douglas Crockford, "JavaScript: The Good Parts" (Dil: Güzel Parçalar) bölümünde, dilin belirli özelliklerinden kaçınmanız gerektiğini ve kullanmayacak kadar sert oldukları anlamına geldiğini sanmıyorum.
K.Steff,

10
Onun tersini söylüyor düşünüyorum - Bir platformu olduğunu düşünüyorsanız değil hiç bir şekilde kırılmış, bunu yeterince tanımıyorum. Yani, onun amacı, onun eksikliklerine kör olmadığınız sürece, tek bir platforma sadık kalmanın iyi olduğudur.
Tikhon Jelvis

3

Onlar eğer izlenimi altında olabilir çünkü cevap isteksiz olabilir olabilir onlar görüşmeyi yuvarlak dönüp diyebilirsiniz dile nefret 5 şeylerin listesini ninjalar 'Ah, biz C # arıyoruz '' ve görünmüyor Dilini beğenmek için 'veya' Dili sevmiyorsanız neden işe başvurdunuz? '.

Görüşülen kişiler görüşmeler sırasında olumlu kalmaları için büyük bir baskı altındadır.


Bir dilde bir şeyden nefret ediyorsam, bu dilden nefret ettiğim anlamına gelmez. Bu soru <del> olabilir </del> de olumlu bir şekilde cevaplandırılmalıdır. HTML4'te hiçbir şeyden nefret etmiyorsak neden HTML5'e ihtiyacımız var? :)
e-MEE

3

Çünkü diller düşündüğümüz şekli veriyor . Her gün C # kullanarak kodunuzu, dilin sorunları etrafında doğal olarak çalışacak şekilde düşünme ve tasarlama alışkanlığını edindiniz.

Şimdi düşünmeden, hatta yaptığını bile bilmeden yapıyorsun. Bu yüzden kötü şeylerin ne olduğunu belirtmek çok zor. Hiç şüphe yok ki, C # öğrenmeye başladığınız gün, çok fazla sorun buldunuz, ancak şimdi onları artık göremiyorsunuz. Alışkanlıklar güçlü şeylerdir. Düşünce alışkanlıkları, daha da fazlası .

Bunun olumlu yanı, C # 'daki kusurları listelemeyi zor buluyorsanız, iyi bir C # programcısı olduğunuzdan, dili sevdiğinizden ve diğer dillerden daha fazla kullandığınızdan kaynaklanıyor olmalı.

Fakat C # 'daki kusurları daha iyi görebilmek istiyorsanız, düşünme şeklinizi değiştirmek zorundasınız. Daha fazla programlama dili öğrenin ve bunlara alışın. Mümkün olan en farklı dilleri hedefleyin. Statik yazmaya alışkın mısınız? Python veya Ruby'i deneyin. Nesne yönelimli ve zorunlu olanlara alışkın mısınız? Haskell tamamen başka bir dünya.

Ve C # 'ya geri döndüğünde, "Haskell'de sadece bir satır olan bu basit şeyi yapmak için neden yüz satır C #' a ihtiyacım var?" Gibi olacaksın. C # hakkında bir çok şeyden nefret edeceksin.

  • C #, geri çevrilemez referans türlerine sahip değil.
  • Cebirsel veri türü yok.
  • Dize enterpolasyonu yok.
  • Sözdizimi her yerde aşırı ayrıntılı.
  • Makro sistemi yok.
  • Tür çıkarımı sınırlıdır.
  • Regexp değişmezleri yok.
  • Yapısal yazım yok.
  • Değişmezlik için zayıf destek.
  • C # yapıları hataya açık.
  • Standart koleksiyon kütüphanesi çok sınırlıdır.
  • Yapıcıların parametreleri üzerindeki kısıtlamaları tanımlayamaz.
  • Matematik operatörleri üzerindeki kısıtlamalar ile genel olarak programlanamaz.
  • 'Yeni tip' yok.
  • Dizi dilimleme yok, değişmez aralık yok.
  • İşlevler, türlerinin bir parçası olarak yapabilecekleri yan etkileri listelemez. :)

(Elbette hiçbir dil her şeye sahip olamaz. Dil tasarımı son derece zordur ve her bir özelliği aynı dile eklemek işe yaramaz. Farklı amaçlar için farklı araçlar.)

Evet, özellikle röportajda soruyu iyi cevaplamak zor. Ancak cevap verebilecek insanlar, bunun hakkında düşündüklerini, bazı bakış açılarına sahip olduklarını kanıtladılar.


+1. Mükemmel nokta Aslında, C # 'dan gerçekte nefret ettiğim birçok şey, diğer dillerin aynı dezavantajlara sahip olmaması gerçeğinden geliyor. Aklıma gelen ilk şey , gerçek tletonların olmaması (yani (a, b) = this.something();Python'daki gibi yapmanın imkansızlığı ).
Arseni Mourzenko
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.