Soyutlamalar (LINQ gibi) neden bu kadar tabu? [kapalı]


60

Bağımsız bir müteahhitim ve yeni işler için yılda 3-4 kez röportaj yapıyorum. Şu an bu döngünün ortasındayım ve görüşme iyi gittiğini hissetmeme rağmen bir fırsat için geri döndüm. Aynı şey bana bu yıl da birkaç kez oldu.

Şimdi, ben mükemmel bir adam değilim ve her organizasyon için uygun olmasını beklemiyorum. Bu, vuruş ortalamamın normalden düşük olduğunu ve bu yüzden son görüşmecimden bazı yapıcı geri dönüşler almamı istedi ve teslim etti!

Görüşme yapan kişiye göre asıl mesele, düşük seviyeli, organik olarak yetiştirilen algoritmalara değil, soyutlamaların kullanımına (LINQ gibi) çok fazla eğildim.

Yüzeyde, bu mantıklı - aslında, diğer reddedilmelerin de mantıklı gelmesi nedeniyle, bu görüşmelerde LINQ hakkında fikir verdim ve görüşmecilerin LINQ hakkında çok şey bildiği görülmedi (.NET olmasına rağmen. adamlar).

Öyleyse şimdi şu soruya bıraktım: "Devlerin omuzlarında durup durmamız gerekiyorsa ve bize sunulan soyutlamaları kullanıyorsak (LINQ gibi), o zaman bazı insanlar neden bu kadar tabu olarak görüyorlar? Ekstra maliyet ödemeden aynı hedefleri gerçekleştirirse "raftan" kod çıkarmak mantıklı değil mi?

LINQ, hatta eğer bana gelirdi olan bir soyutlama, basitçe tüm sanalıdır aynı biri tam olarak aynı sonuç ortaya yazardı algoritmalar. Özel performansınızın daha iyi olup olmadığını yalnızca bir performans testi size söyleyebilir, ancak LINQ gibi bir şartlar yerine getirildiyse, neden ilk önce kendi sınıflarınızı yazmaktan rahatsız olmalısınız?

Burada LINQ'a odaklanmak istemiyorum. JAVA dünyasının karşılaştırılabilir bir şeyleri olduğuna eminim, sadece bazı insanların neden yazmadıkları bir soyutlama kullanma fikrinden bu kadar rahatsız olduklarını bilmek istiyorum.

GÜNCELLEME

Euphoric'in belirttiği gibi , Java dünyasında LINQ ile karşılaştırılabilir bir şey yok. Öyleyse, .NET yığında geliştiriyorsanız, neden her zaman denemeyi denemiyorsunuz? İnsanların ne yaptığını tam olarak anlamaması mümkün mü?


8
Sanırım "soyutlamanın" ne olduğunu bilmiyorsunuz, çünkü LINQ ile ilgisi yok.
Öforik

8
"JAVA dünyasının karşılaştırılabilir bir şeyleri olduğundan eminim" Aslında LINQ, .NET'in sahip olduğu Java'nın sahip olmadığı birkaç şeyden biri.
Öforik

42
@ Euphoric - LINQ , örneğin sıralama ve filtreleme gibi görevlerin alt düzey çalışmalarını soyutlamaz mı ? objectCollection.Where(oc=>oc.price > 100)Mesela, arkasında fazladan bir kod olacağından eminim . Bu bir soyutlamanın kullanımı olmaz mıydı? Belki bana burada ne kaçırdığımı söyleyebilirsin. . .
Matt Cashatt

37
Her zaman LINQ'u anlamadıkları ve bunu öğrenmedeki değeri göremedikleri için bir şans vardır . Yazmanın işlevsel yönleri, zorunlu programlamadan çok farklıdır. Bir müteahhit olarak, 2009 yılının sonlarına kadar, gelişmiş sorguları yazacak kadar SQL'i anlamayan "kıdemli" Java geliştiricilerini gördüm ; veritabanı yapıyor. Cehalet , yazılım geliştirme endüstrisinde yaygındır.

18
LINQ’u anlıyorsanız ancak görüşme yapanlarınız anlamadıysa, siz onlardan daha iyisiniz. Bakışlarını daha yükseğe ayarla.
Jay Bazuzi

Yanıtlar:


74

Sakıncalı olan soyutlamaların kendi kullanımları olduğunu sanmıyorum. Başka iki olası açıklaması var. Birincisi, soyutlamaların bir anda veya diğerinde sızdıran olması. Doğru ya da değil izlenimini verirseniz, temelde temelini anlamadığınız, bir röportajda kötü şekilde yansıtılabilecek.

Diğer olası açıklama fanboy efektidir. LINQ hakkında heyecanlı bir şekilde konuşursanız ve bunu tekrar tekrar kullanmayan ve kullanmayan ve bunu yapmak için mevcut planları olmayan bir şirketle yapılan bir röportajda gündeme getirirseniz, bu sizin memnun olmadığınız veya hatta eski teknolojilerle çalışmaktan hoşnutsuz olduğunuz izlenimini verir. Ayrıca, bir ürün için duyduğunuz coşkunun sizi alternatiflere kör ettiği izlenimini verebilir.

Eğer gerçekten olmayan bir LINQ dükkanda mutlu olacağını düşünüyorsanız, ne soran deneyin do kullanabilir ve buna göre cevaplar uyarlamak. LINQ'u tercih ederken, elinizdeki araçları kullanmak konusunda yetkin olduğunuzu gösterin.


4
@MatthewPatrickCashatt Linq ifadeleri içeren yöntemlerdeki hata ayıklayıcıda düzenleme ve devam edemezsiniz. Kullanmamam gereken bir sonuç değil; fakat bir süredir bunu yapmakta tereddüt etmemdeki asıl sebep buydu.
Dan Neely

3
+1, özellikle ikinci paragraf için. LINQ kullanamadan bir C # kodu üzerinde çalışmaktan tamamen mutsuz olduğum için bu tamamen benim için geçerli.
Arseni Mourzenko

5
Ayrıca, sızdıran soyutlamaya ek olarak sık sık bir performans çarpması olduğu da bir gerçektir. Kesinlik için kullanım kolaylığı değiş tokuş ediyorsunuz ve bu hassasiyet kaybı sık sık işleri daha hızlı hale getirecek ayrıntıları içeriyor. Sizi kaynaktan ne kadar uzaklaştırırsanız, o kadar çok ayrıntı kaybedersiniz ve bu ayrıntıların performans için önemli olma olasılığı artar.
jmoreno

6
+1 ancak diğer şekilde de çalışabilir. Eğer birisi bana işe almadıklarını söylerse Yacc'ı kendim yapmak yerine ayrıştırıcı yapmak için kullanırım, o zaman yine de çalışmak istediğim bir yer değil.
Spencer Rathbun

5
@MatthewPatrickCashatt: bu cevap (ve bu konudaki yorumum) LINQ'a değil, genel ifadelere özgüdür. Ancak LINQ için, işte bir Kısaca C # 4.0 / 5.0'dan bir alıntı, LINQ ile ilgili performans problemlerinden bahsediyoruz. Genellere geri dön: çoğu durumda performans vuruşu buna değecek,% 5 +/- konu dışı. Ancak bazen daha büyük ve bazen% 0.1 bile kabul edilemez. Bir sorun olabileceğini düşünmüyorsanız ya da bu performans yalnızca google gibi şirketler için
geçerliyse

29

Bazı .NET programcıları, özellikle klasik bir VB / ASP veya C ++ arka planından gelenler, LINQ, MVC ve Entity Framework gibi yeni şeylerden hoşlanmazlar.

Gözlemlediklerime göre, bu gruptaki eski VB'ciler hala 10+ yıl önce yazılmış bir veri erişim katmanları ve orijinal kodları kullanıyor olabilirler. Ayrıca "n-katmanlı" ve benzeri gibi eski terimleri kullanacaklar ve .NET Framework 2.0 dışındaki herhangi bir şey hakkında hiçbir şey anlamıyorlar ve bunun hakkında bir şey öğrenmek istemiyorlar.

C ++ 'ları, tekerleği yeniden icat etse bile, serin algoritmaları kodlamayı seven programlayıcılar olma eğilimindedir. Kendilerini kodlamadıklarına bağlı olarak nefret ediyorlar. Bu kişilerden birkaçı, görüşmecilerin özellikle daha az geleneksel bir geçmişe sahip olanlar için aşağılık hissetmelerine de sevinmiştir.

Mülakat yaparken böyle organizasyonlarla karşılaşmanız muhtemeldir. Ancak, daha yeni yöntemler kullanan bazılarıyla da karşılaşacaksınız. Birkaç kötü röportajın seni atmasına izin verme.


2
Teşekkürler jfrankcarr. Bunun olabileceğinden şüphelenmiştim - açılış ve kapanışla ilgili sorular vardı datareaders!
Matt Cashatt

2
MVC'yi "yeni şeyler" olarak çağırmak için +1. Beni yüksek sesle güldürdüm. Bu oluyor bu yana 70 civarında olmuştur. Bağlamaları kullanan, esasen MVP (MVC değişkeni) olan MVVM'yi kastetmiş olabilirsiniz.

14
@ GlenH7 Model-View-Controller'ın temel konsepti değil, "ASP.NET MVC" ürünü anlamına geldiği bağlamından oldukça açık olduğunu düşünüyorum.
Carson63000,

4
@ GlenH7 - Tamamen .NET ve Visual Studio ürün gamı ​​ve Microsoft'un ürün kodları bağlamında konuşuyordum.
jfrankcarr

6
Tanrım, gerçekten Linq'i "yeni" olarak düşünen dükkanlar var mı? 4 yıldan beri var. Görev bekleyenleri veya dynamic/ ExpandoObject/ etc kullanımlarını yakalamamayı veya Azure ile diğer tüm bulut öğelerini önemsememeyi anlayabilirim ... eski okul WebForms görüşünü kullanmaya devam etmeyi bile anlayabilirim. MVC veya Web Formları motorunu kendisi ya da MVVM olmadan WPF / WinRT kodunu yazıyorlar ama Linq? Bunu henüz çözemediyseniz, bir .NET geliştiricisi olarak işinizden ayrılma zamanı geldi.
Aarona

16

Microsoft, yeni teknolojilerle tanışma ve daha sonra yollarını 5, 10 veya 20 yıl unutarak uzun bir geçmişe sahiptir. LINQ bazı insanlara bir tane daha benzeyebilir. Onlar, Microsoft dikkat edeceğiz olamaz SQL kullanımdan kaldırmak, ancak LINQ aşağıdaki olabilir Silverlight . Bu yüzden zorlu tecrübelerden ya da sadece modern teknolojiyle geride kalan ve ona küskün olan kişilerden kaynaklanan paranoya görüyorsunuz.


12
Dürüst olmak gerekirse, temel noktayı görürken Linq'in yakın zamanda bir yere gideceğini sanmıyorum. Linq2SQL, evet, çok daha güçlü EF lehine kaldırdılar. Fakat Linq, son 3 .NET'teki diğer pek çok parlak yenilik için bir temel oluşturuyor, onaylamazlarsa, Azure ve EF gibi yeni kalıcı katman teknolojilerinin yarısını, hemen hemen her ORM'de sakatlayıcı bir şey söylememek zorunda kalacaklarını söylüyor. Dışarıda ve ayrıca bir sürü hafıza içi liste-işleme.
KeithS

6
bekleyin ... "eski, modası geçmiş teknolojiden uzaklaşmaktan korkuyor, çünkü işe yarıyor" ... WTF. Denenmiş, test edilmiş, anlaşılabilir ve bakılabilir ve olgun olan çalışma malzemelerinin iyi olmadığı noktaya geldik mi?
gbjbaanb

7
@ gbjbaanb - Hayır. Ancak - bir fıkra olarak - bir doktorun göğüs ağrılarınızı göğüs röntgeni ile teşhis etmesini ister misiniz, çünkü bu yöntem 'denenmiş, test edilmiş, anlaşılabilir' ya da daha yeni, ancak daha yüksek çözünürlükte bir fMRI ister misiniz? , daha iyi prognoz ve daha fazla bilgi? Burada kimse klasik ilkelerden uzaklaşmayacağını söylüyor; tam tersi. Görüyorsunuz, LINQ (örnek olarak) bu ilkelere dayanıyor. Diğerlerinin de belirttiği gibi, LINQ'u oluşturan parçaların öğrenilmesi ve sizinki gibi 'WTF' anlarına neden olan doğru kullanımı.
Matt Cashatt

2
@MatthewPatrickCashatt: Doktor fMRI sonuçlarını okumak için eğitilmemişse, tanıyı tahmin etmekten ziyade röntgenini çekerdim. Eğer bir durgun su altında hastalanırsam, en son araçlarda en üst düzeye çıkmadan baş edememek yerine stetoskoptan başka bir şeyle teşhis koyamayan bir doktoru tercih ederim.
gbjbaanb

2
@MatthewPatrickCashatt Amacınızı anlıyorum, ancak dengeleyici bir faktör, sadece yeni olduğu için her eğilimi takip etmek istemiyor olmanızdır. İki kategoriden birine uyan yeni bir teknolojiyi mutlu bir şekilde takip edeceğim. 1. Beni heyecanlandırıyor ve boş zamanımı bunun için harcamak istiyorum. 2. Kendisinin gerçekten daha iyi olduğunu kanıtlar ve yatırıma değecek kadar uzun sürecek gibi görünür. İki kategoriden birine uymayan eğilimler en iyi ihtimalle bir kumardır.
TimothyAWiseman

15

Ekstra maliyet olmadan aynı hedeflere ulaşırsa "raftan" kod çıkarmak mantıklı değil mi?

Her zaman ekstra bir maliyet var.

Raf dışı şeyler için öğrenme eğrisi her zaman oradadır. Güncellemeler alma (ve bağımlılıklar) acısı her zaman oradadır. Bağırsaklarla takılma yeteneği her zaman oradadır.

LINQ için ilk sadece gerçekten geçerlidir. Birçok insan 'garip' görünen kodun okunmasının zor ve hata ayıklamanın zor olduğunu düşünür. Sql benzeri bir sözdizimi, ortaya çıktığından beri çalıştığım her profesyonel konsepte bir kişiden kişiye aittir. LINQ to SQL (ve diğer veri kaynakları), bir dizi kazanıma ve sınırlı optimizasyon seçeneklerine sahiptir.

Bunlar, 3. parti araçlara ve özellikle LINQ'ye karşı genel argümanlardır. Bütün bunlar, LINQ çok faydalı bir araçtır ve çoğu durumda tercih edilmelidir. Burada icat edilmemiş ağlama ve soyutlamalar, bilişsel uyumsuzluğa şiddetle karşı konulmamalıdır .

LINQ'u bilmiyorlar / öğrenemiyorlar, ancak “açıkçası” iyi geliştiriciler olduklarından LINQ buna değmemeli. Bu ortak bir tuzak.


1
Güzel nokta. Bahsettiğiniz maliyetler üzerinde anlaşın ve bu iyi bir açıklama. Bununla birlikte, daha geniş bir biçimde, yeni çalışanların aşina olamayacağı ev sınıfları geliştirmek, çünkü örgüt dışında bulunmadıkları için, birincil gelişimin maliyetine ek olarak aynı zorlukları da beraberinde getiriyorlar .
Matt Cashatt

2
@MatthewPatrickCashatt - Ah, kesinlikle. Bu nedenle, kendi kendine yeten kodun , aynı galibiyet için hemen hemen her zaman daha fazla çaba göstermesi gerekir, ancak mutlaka olması gerekmez. Diğer birçok şey gibi, maliyet / ödül de tahmin edilmeli ve en iyi uygulama tercih edilmeli , kör olarak izlenmemelidir.
Telastyn

@Telastyn Evde yetişen kod da güzel çünkü ne yaptığını biliyor ve kısa bir süre sonra bunu düzeltebilirsin. Ayrıca, herkesin ortalamasını değil, kendi kullanımınızı temel alarak belirli durumlar için optimizasyon yapabilirsiniz.
Hawken

13

Dikkate almanız gereken bir başka şey de yeni ve hoş bir teknolojiye duyulan coşkunuzun insanların kendilerini rahatsız hissetmelerine ve sizi istememelerine neden olabilir. Onları “güçlendirmiyorsunuz”, çünkü bu teknolojiyi bilen, siz değilsiniz. Kendileri farkında olmasalar bile, zaten çok fazla zaman harcadıklarını pekiştiren adayları arıyor olabilirler.

"Ne yaparsan yap, başarmana yardım etmek istiyorum" diyen bir tutum sunmak istiyorsun, "İşleri kötü bir şekilde yapıyor olabilirsin ve etrafta olman kanıtlayacak" o."


+1 - onlara bildiklerini anlatmanın yanı sıra, onlara ne yaptıklarını ve uzmanlık alanlarını sor.
Kirk Broadhurst

12

Bunu benim almam (ve TBH'yi tahmin ediyorum, çünkü hiçbirimiz görüşmecilerin ne düşündüğünü söyleyemiyoruz), sık sık sizi neden takımlarına, çalışma tarzlarına uymaları için işe almaları gerektiğini açıklamak için bir röportaja gitmenizdir .

Mükemmel bir geliştirici, bir rock başlangıç ​​kodu tanrısı olabilirsiniz, ancak bu yapmak istedikleriniz (eğer biraz fazla ve coşkulu bir şekilde bazı teknoloji gubbinleri hakkında coşkuyla konuşmanızla vurgulanırsa) vurguladığınız anlamına gelmez. istediklerini yerine getir. Eski tip bir veri erişim sistemine sahiplerse, hangi nedenle olursa olsun yükseltilemezler, nasıl sürdürüleceğini unutmuş birine ihtiyaç duymazlar. Yeni şeyler geliştiriyorlarsa ve gerçekten bu yeni teknolojiyi her yere koymak istiyorsan, o zaman gelecekteki kod bakımı ve / veya personel eğitimi ile ilgili büyük bir sorun yaşayacakları açıktır.

Bir serbest meslek sahibi olarak, bu çok daha fazla bir problemdir, eğer bir izin alıyorlarsa. Bir izinle, yeni çalışma yöntemlerinin eğitimi ve geliştirilmesi kötü şeyler değildir, mevcut kod ve uygulamalar kapsamında - işleri daha iyi hale getirmek için uzun süre kalacaksınız. Bir freelancer ile, gerçekten ne istediğinizi bir ipucu vermiyorlar, sadece işlerini onların istediği şekilde yapmak için oradasınız, ve bu sizin işinizi başka bir şey yapmak için yapmıyorsunuz. (katılmıyorum - kalıcı bir işçi olmak)

Muhtemelen LINQ ile hiçbir ilgisi yoktur, ortaya çıkan ve Haskell'de her şeyin ne kadar iyi yazıldığını açıklayan bir adayı reddettim. Haskell yapmıyoruz. Aynı şey, şirket tarafından kullanılmayan herhangi bir teknoloji için de geçerlidir, eğer iyi bir şey olarak bahsederseniz genellikle sorun olmaz. Sorun çok istekli ve istekli olduğunuzda ortaya çıkar.


2
Buna katılıyorum, ancak bu tutumu kullanan ve sadece anlamadıkları iyi fikirleri reddetmek için kullanan çok daha fazla insan fark ettim (örneğin test etme, tasarım kalıpları, ORM'ler). Bu yüzden, takıma uygun olmanın iyi bir şey olduğu konusunda hemfikir olsam da, ekibin geri kalanından daha iyi olabileceğinizi ve iyi bilmenin kötü bir şey olmadığını düşünen bireyleri bulmanız gerektiğini anlamanız önemlidir. soyutlamalar.
Wayne Molina

1
@WayneM emin, ancak OP bir freelancer, bu yüzden kodlama yapmak için sürekli olarak işe almaya hazır olmadıkça kodlayan bir tanrı olup olmadığı önemli değil. ne isterse yapmalı, istediğini yapmalı.
gbjbaanb

1
@WayneM, aynı şekilde, birçok insan, başkalarının fikirlerinin, (kiminle konuştuklarının basitçe elde edemeyeceğinden emin olmak), sadece az önce söylediklerine benzer bir şey kullanırdı. Sonunda her iki taraf da önyargılı, ancak OP işe alınmakla ilgili, büyük DIY / soyutlama savaşını kazanmaktan değil. Herkesin kendi düşüncesi olacak, ancak birinin üstesinden gelmesi gerekiyor; Bu durumda işveren olmayacağını tahmin ediyorum. :(
Hawken

10

Linq kullanmayanlardan duyduğum tek geçerli bir endişe var ve benim yürekten aldığım tek şey: "Uygulamayı görmemeniz pahalı olmadığı anlamına gelmez".

Aşağıdaki pasajı alın:

var resultList = inputList.Where(i=>otherInputList.Count(o=>o.Property == i.OtherProperty) > 0);

Burada başlatılan LINQ tıkanıyor. Neden? Çünkü bu kodun güzel ve zarif görünmesi, onun korkunç derecede verimli olmadığı anlamına gelmez. Count (), bir yüklem ile, üst öğesinin her öğesinin numaralandırılabilir değerini değerlendirir ve yüklemin doğru döndürüldüğü süreleri toplar. Bu nedenle, sadece bu N ^ 2 değil (inputList ve otherInputList kabaca eşit kardinalliğe sahip olduğunda N), en kötü durum N ^ 2; OtherInputList öğesinin HER öğesi, girdilerin HER öğesi için geçilir. Bunun yerine, ilk adım Count yerine Any () kullanmaktır, çünkü gerçekten bilmek istediğiniz şey budur ve cevap "evet" olduğu bilinen en kısa sürede bırakacaktır. Farklı değerlerini saklayan bir HashSet'i ayarlamak otherInputListObject.OtherPropertysize yardımcı olabilir; erişim O (N) yerine O (1) olur,ikinci dereceden en iyi durum karmaşıklığı yerine en kötü durum karmaşıklığı.

Böylece, bu hoş ve zarif yöntemlerin ardında ciddi maliyetlerin olduğunu görüyoruz ve bu maliyetlerin ne olduğunu bilmiyorsanız, O (GD) uyumluluk algoritmasını kolayca işvereninizin yüksek performanslı merkezi dosya servis sağlayıcısına kodlayabilirsiniz. veya ana iniş portalı sayfasında bir dahaki sefere gerekebilir. Seni yaptıktan sonra kovmak, yaptıklarını geri almaz, ama bunu yapabileceğini düşünüyorlarsa seni işe almamak. Bu nedenle, bundan kaçınmak için yanlış olduklarını kanıtlamanız gerekir; Bu yöntemlerin ne olduğunu (kendinizi tanımanız gerektiği anlamına gelir) ve bunların karmaşıklığını ve cevaba nasıl verimli (NlogN veya daha iyi) bir zamanda ulaşacağınızı tartışın.

Diğer bir kaygı ise eski olan "Tek aletiniz çekiç olduğunda" argümanıdır. Bu Linq hayranı ile görüşme yapan görüşmeci yerine kendinizi koyun. Aday Linq'ten hoşlanıyor, kullanmak istiyor, bunun en iyi şey olduğunu düşünüyor. Her programlama problemi Linq ile çözüldüğü için adayın onsuz kodlayamayacağı bile görülüyor. Peki, kullanılamadığında ne olur? Çok sayıda .NET 2.0 kodu hala var, eğer yükseltilirse, sunuculara, kullanıcı iş istasyonlarına, vb. İçin acı verici yükseltmeler gerektirecek, böylece fantezi uzatma yöntemlerinizi kullanabilirsiniz. Görüşme yapan kişi olarak, Linq kütüphanelerinin ve benzer uzantı yöntemlerinin ne kadar güzel olduğu konusunda sizinle ne kadar hemfikir olursanız olun, etkili bir tür kodlayabileceğinizi veya 2.0 sıralama yöntemlerini kullanabileceğinizi göstermeye çalışırım. tatlı. Noktayı görmeyen bir görüşmeci, başka bir şey için yetenek göstermenizi sağlamaya bile zahmet etmeyebilir; sizde olmadığını ve devam edeceğini varsayıyorlar.


Neden sorgunuzu sadece olarak yazmıyorsunuz var resultList = inputList.Select(i=>i.Property).Intersect(otherInputList.Select(o=>o.Property));? Bunu çarpıtmış olabilirim, ama benim açımdan LINQ yukarıda bahsettiğiniz sorguyu yürütmek için daha iyi yollar olduğu (.Join () başka bir yoldur). LINQ kullanmanın başka yollar kadar yetkin olmayabilir, ancak bu kötü uygulamalara güvenmek zorunda olduğunuz anlamına gelmediğini fark ediyorum.
Matt Cashatt

4
@MatthewPatrickCashatt Meselesinin LINQ’nin her zaman yetersiz kaldığını iddia etmek için çok fazla olduğunu sanmıyorum - her zaman belirli bir LINQ sorgusunu yenebilirken, bazı kullanımlar geliştirici-saat başına LINQ dışı yaklaşımlardan daha iyi performans verir. Daha ziyade, bir LINQ sorgusu yazmak için nispeten kolay olabilir olduğu verimsizlikler olarak bariz değildir çünkü, bunun farkında verimsiz değil.
Jon Hanna

3
@JonHanna: Bir noktaya değinmek gerekirse, nadir görülen ancak makul olmayan senaryoların performansın beklenenden daha fazla büyüklükte olmasına neden olabileceğini belirlemek için hangi kodun "gerçekten yapıldığını" incelemesi gerekiyorsa, soyutlamanın değeri büyük ölçüde azalır. Bir veri yapısından diğerine geçmek, kodun 10.000 kat daha yavaş çalışmasına neden olacaksa, başka bir kodu değiştirmeden böyle bir değişiklik yapma yeteneği her zaman iyi bir şey olmayabilir.
supercat

1
@supercat: evet ve hayır. Üçüncü taraf bir uygulamada bir şeyin nasıl yapıldığına ilişkin bilginin performans sonuçlarını anlamak ve verimsizliklerden kaçınmak için kritik olması, bu araçları içine alan kütüphanelerin daha az değerli olduğu anlamına gelmez. Aynı madalyonun iki yüzü; Uygulamanın doğasını bilir ve kendi saatinizi çevirmek yerine bir saat yerine birkaç tuşa basarak kullanabilirsiniz. Ancak, her iki tarafı da bilmek zorundasınız ve mükemmel olduğunu düşünen klişeleşmiş Linq fanboy, yanlış bir şey değil, muhtemelen olmayan her şey için kullanın.
KeithS

@KeithS: Hem Java hem de .net'te çok eksik olduğunu düşündüğüm bir şey, nesnelere ya da koleksiyonlara kendileri hakkında çeşitli şeyler sormak için standart bir yoldur. Örneğin, numaralandırılabilir bir koleksiyon alan kod, eşya sayısının ve / veya mevcut eşyaların sırasının hiç değişip değişmediğini, madde sayısının sonlu mu yoksa sınırsız mı olduğu bilinen (veya her iki şekilde de bilinmediği) biliniyor olabilir. ve koleksiyonun içinde kaç tane eşya olduğunu doğal olarak biliyor mu. LINQ gibi teknolojiler çoğu zaman doğru olabilecek veya olmayabilecek şeyler hakkında varsayımlarda
bulunurlar

10

Bu biraz uzadı, ama birileri için yardımcı olabilir bu yüzden izin vereceğim.

Aslında benzer bir şeyle karşılaştım, geçen ay 20'nin üzerinde görüşme yaptım (telefon ve yüz yüze). Kesinlikle beklenmedik bir şey oluyordu ki parmağımı tam kullanamadım.

Yine de fark ettiğim şeylerden biri, son beş veya altı yıldaki görüşme döngülerinin merkezi noktası olan şeylerin kesinlikle tartışılmadığı ya da kısa sürtünme verildiği idi. OOP analizinin / tasarımının temelleri, desenleri (her ikisi de tasarım ve mimari), bazı daha gelişmiş / soyutlama odaklı .net özelliklerinden bazıları (özellikle lambdalar veya LINQ dahil, jenerikler, seri hale getirme / veri bağlama ve benzeri) ve hatta genellikle tercih edilen metodolojinin sıcak konusu (hiç kimse çevik şelaleye karşı ne kadar çevik bir aroma olduğu konusunda endişeli görünmüyordu) ve ORM araçlarını ya da seçimini ya da tercih edilen işbirliği ya da kaynak kontrol yönetimi araçlarını seçti. Bazı durumlarda hiç bahsedilmedi, neredeyse tüm durumlarda görünüşte kaygı verici değil.

Çok sayıda görüşmede ve ilgisiz endüstrilerdeki çeşitli ilgisiz firmalarda odaklanılan nokta şu sıralardaydı:

  • Eski modası geçmiş / modası geçmiş sözleşmeler ve "taş yaşına dönüş" sınırlamaları üzerinde garip bir tespit. VS2003'te saçma kısıtlamaların bir listesi ile ilkel bir web uygulaması geliştirmek gibi, .net'in bu dönemi içinde açık özelliklerin kullanılmasını yasaklayan ... modern bir geliştiricinin gerçek bir göstergesi ... hatırlama yeteneği gibi 9 yıl önceki paradigması ve sınırlamaları, gerçekçi olmayan / keyfi kısıtlamalarla daha da sakatlandı. Önceden tahsilatsız tahsilatlar, özel tahsilatlar konusunda çok etkilendi. Başka bir yer, kasıtlı kurucuları kullanmadığım için karalama yaptığım sınıf modelinin bir kod örneğini attı (ihtiyaç için yeterli olan bildirimde mülk başlatma desteğinin farkında değillerdi).

  • Platform veya protokol agnostik olmaya odaklanan teknolojilerde bile, bir mikro kozm ve / veya konfigürasyon ayarlarında özel uygulama detaylarına aşırı odaklanma (yani… bütün mesele belirli bir uygulamaya veya belirli bir kullanıma sabitlenmemelidir, bunun yerine yeniden kullanım / yeniden kullanım / genişletilebilirlik / gerektiği şekilde entegrasyon).

  • Kıyıdan uzak bir ekibin çalışma ve işini durdurma / denetleme / kod inceleme isteği ve / veya yapma konusundaki kodlama dışı beceriler.

  • Ürünlerin / platformların / modüllerin / vb. Spesifik sürümlerin kullanımı Bazen saçma bir dereceye kadar; “Yani ... 1, 2 ve 4 sürümlerini kullandınız mı? Ama 3 değil, eh? Hmmm ... {özgeçmişinizi" no v3 !!!} "ile ekler. Kullanım derecesi önemli değildi; sadece sahip falan kullanılmadığını hiç ve onlar da talep ediyorlar bu özel şey ... ne olursa olsun, hatta daha yaygın olarak kullanılan ve tam özellikli rakip ürünün, saymak gibiydi.

  • "Ekibimize ne kadar iyi uyacaksınız" konusuna çok daha fazla odaklanmanız, aslında bir yazılım geliştiricisi olarak iyi misiniz? " ürün "veya hatta" siz gelip dükkanları mahvedecek tehlikeli bir aptalsınız ". Bazı durumlarda, özgeçmişim sadece bir değerlendirme olarak alındı ​​ve hatta "teknik ekran" veya teknik görüşme denilen bir kişilik değerlendirmesi bile bir yetenek değerlendirmesinden çok daha fazlasıydı. İki mevsim değişmeden önce orada olacağınız ve tekrar gideceğiniz nispeten kısa vadeli sözleşme pozisyonları için bile.

  • Bu süre zarfında şirketler, belirli teknik sorunların çözülmesine, yeni yeşil alan veya büyük 2.0 geliştirme projelerinin başlatılmasına veya ortaya çıkan bir eğilim veya fırsattan ya da olağan büyük başlangıçlardan yararlanmak için piyasaya belirli bir ürün elde edilmesine daha az odaklanmış gibi görünüyordu. . Yerlerin en az 15inde dikkatimi çeken yinelenen bir tema, çoğunlukla 08'de pazar çöküşünden kurtulan 3-5 kişilik küçük bir grup geliştiricinin son 3 yıl boyunca bir ürünü ezebilmesiydi. ve bazı başarılar elde ettiler ya da bir bütün olarak şirketleri yükseliyor ve artan özellik taleplerine ayak uydurmak ya da bu sistemlerde oluşturdukları tasarım hatalarını aşmak / üstesinden gelmek ya da söz konusu platformları ücretsiz olarak ele geçirmek için yeni insanlarla çalışıyorlar. “başka projeler” yapmak üzere inşa edilen çekirdek ekibi kurdu.

Ama ... bu iş hakkında bildiğim bir şey varsa, bu konjonktüreldir. Bir dahaki sefere yeni bir konser aradığımda, oyun bir daha değiştiyse şaşırmayacağım. Sadece zihinsel olarak esnek kalmanız, biraz aktif dinleme yapmanız, gereksiz olması durumunda mutlak ifadeler yapmaktan kaçınmanız, fakat aynı zamanda bir gelincik olmamanız ve tek boyutlu olarak çıkmamanız (bir aptal veya arzu edilmeyen bir ) ya da çok iyi olmak (bir tehdit edici olabilir ve bir konsere mal olabilir).

Sadece yaklaşımınızı düzenleyin ve bir dahaki sefere daha ölçülü bir yanıt vermeye çalışın ... bir soruna yaklaşmanızın birkaç farklı yolundan bahsedin ... ama sizin için hakikaten bilgi olsa bile, gerçekten düşünüyormuş gibi davranın ve yerinde düşünerek. Bu şekilde daha mütevazı ve daha az korkutucu veya mahrum görünüyor.

Tabii ki, ne olduğunu varlık Murphy Yasası, senden sonra hemen ertesi mülakat "benim şimdiki favori teknoloji adam hakkında tutkulu" olmaktan çıkıp bir daha dengeli / sakal-okşayarak tutum benimsemeye Eğer konser olduğunu ediyorum size çılgın olmuştu aldık Zealot adam. ;)


6

Bence sahte bir sonuç çıkarıyorsunuz, çünkü örnek setiniz çok sınırlı. Hiçbir şey güçlü kaçınma ile BT dükkan adil bir pay gördük rağmen "Orada icat değil" 1 , hiçbirinin teknolojisi yığınında tercihlerine göre adayları diskalifiye olacaktır: onlar haklı kullanmayı doğru aday öğretebilir ikna edildi evde yetiştirilen kütüphaneleri.

Şirketin LINQ kullanımını doğrudan yasakladığından şüpheliyim. Daha büyük olasılıkla, onlara becerilerinizi daha derin bir seviyede göstermenizi istediler.

Örneğin, karma tablolarınızı bilip bilmediğinizi anlamanın bir yolu, ilkel bir tane beyaz tahtaya uygulamanızı istemektir. Bu basit alıştırma, gözden geçiren hakkındaki bilgileriniz hakkında şaşırtıcı miktarda veri ortaya çıkarır: karma kod / eşittir ve karma çarpışmalar hakkında bildiklerinizi anında öğrenir. Aynı zamanda, Microsoft'un çok iyi bir iş çıkardığı için, bir hash tablosunu yeniden aklı başında tutan birisinin hayalini kurması zor. Aynısı, sıralama ve arama gibi birçok algoritma için de geçerlidir: görüşmeci, arka planınızın .NET kütüphaneleriyle ilgili çalışma bilgisine sahip olduğunuzu kontrol etmek yerine, düşük seviyeli etkileşimleri anlamak için yeterli olup olmadığını bilmek ister.

Şirketleri için çalışmak üzere işe alındıktan sonra kendiniz yerine kütüphane uygulamalarını kullanmak konusunda ısrar edecekleri kesindir . Ancak röportaj sırasında gerçek yeteneklerinizi daha iyi anlayabilmeniz için sizi düşük seviye koduna doğru zorlayacaklar.


1 dükkan, ilkel bir yapım aracı oluşturmuş!


2
Tüm puanlarınız iyi bir şekilde tamamlandı, ancak son görüşmede size biraz renk vermeliyim: görüşmeci LINQ'un “onaylanmadığı” konusunda ısrar etti. "MS’in artık Linq’den SQL’e yatırım yapmayacağını değil, Linq’den Girişler’e yatırım yapacağını mı kastediyorsun" diye sordum ve cevabı, söylediği şeyi yapmasıydı: LINQ’nun "onaylanmadığını" söyledi. yani hayır, LINQ hakkında çok fazla şey bildiğini ya da kullanımı konusunda ısrar edeceğini sanmıyorum.
Matt Cashatt

1
@MatthewPatrickCashatt Birisi, LINQ2SQL için kullanımdan kaldırılmakta olan teknoloji konusunda LINQ'u karıştırdıysa, görüşmeyi erken bırakmak için aptalca bir bahane buldum ve asla o şirketi geri aramadım. Eğer durum gerçekten buysa, sizi işe
almadıkları

1
Durumun% 100 kesin olduğundan. Aslında, kendisine konuyu almadığımdan beri bir pab olarak değil, konuyla ilgili doğru yolda ayarlamak için bazı bağlantılar göndermekte direnemedim, çünkü aslında kendisinden utandığımı ve yapabileceğimi umduğum için aynı hatayı iki kez yapmamasına yardım et;).
Matt Cashatt

4
O zaman bunun teknoloji yığınıyla daha az ilgisi var ve onu düzeltmiş olmanızla daha çok ilgisi var. İnsanlar düzeltilmekten hoşlanmaz. Bu sadece insan doğası. İnsanlar, insanları işe alma gibi kararlar verdiklerinde,% 99'u sezgileriyle gidecektir. Olumlu ya da olumsuz duygular hissetmelerine neden olup olmadığınızı bilirler. Onu düzeltmek, olumsuz duygular hissetmesine neden olmuş olabilir. Ve sonra bu olumsuzluğu durumla ilişkilendirir.
kodlayıcı

1
Hashtable'ların şirket içinde nasıl çalıştığını bilmiyorum. Bunun gibi derin teknik testler, yine de iyi aday olan pratik fikirli eğitime sahip insanları atar. İnsanların asla kullanmayacakları düşük seviyeli bilgiye sahip olmalarını istemek bana gereksiz geliyor. Tasarım ilkeleri çok daha önemli hale geldi!
Tjaart

4

"İskoçya'da siyah bir inek gördüm, bu yüzden tüm İskoç inekler siyah" tipinde bazı genellemeler yapıyorsunuz.

Seninle röportaj yaparsam linq sorularıma cevap veremezsen hayal kırıklığına uğrarım.

Linq aldatıcı bir durum olsa da, birçok insan bunu gerçekten çok basit ve bunun için daha zekice olduğu kadar haksız olan bir vudu çiçeği olarak görüyor.


3

Şeytanın savunuculuğunu oynamak için sebep, birçok geliştiricinin yeni şeylere aldırış etmemesi ve her şeyin ev yapımı (genellikle daha düşük) araçlarla çözülmesi gerektiğini düşünmesidir. Soyutlamaları kullanmanın yanlış bir tarafı yok. Cehennem, genellikle iyi bir neden yoktur değil bu soyutlamalar kullanmak.

Görünüşe göre az önce, fakir bir geliştirici ile röportaj yaptınız ve her şey için çekici ve çivi yaklaşımını benimseyen. Bunlar, NUnit veya NHibernate gibi çeşitli açık kaynak kodlu araçlar veya çeşitli IoC kapları hakkında hiçbir şey bilmeyen geliştiricilerdir; her problemi veritabanında büyük bir depolanmış proc ile çözmeye çalışanlar; Birkaç yıldır çıkmasına rağmen MVC hakkında hiçbir şey bilmeyenler.


LINQ’u Nhibernate etc içeren bir buzzword havuzuna atabilirsiniz. Aslında buzzwords'lerin soyutlamaları doğru ifadelere açıklayamamamızı örneklediğini düşünüyorum.
AndreasScheinert

Siz 'güncel kalmaktan' bahsediyorsunuz, bence tersi çok daha uygun olur. DSL gibi birçok faydalı kavram geçmişte keşfedildi ve kullanıldı. İletişimimizi geliştirmek ve eski kavramlar için yeni vızıltı kelimeleri icat etmemize gerek kalmaması gibi kavramları kavramamız bize bağlıdır.
AndreasScheinert
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.