Tekerleği yeniden icat etmek o kadar da kötü mü?


101

Tekerleği yeniden icat eden programlamadaki yaygın bilgisi kötü ya da kötüdür .

Ama neden bu?

Bunun iyi olduğunu önermiyorum. Yanlış olduğuna inanıyorum. Bununla birlikte, bir keresinde birisinin yanlış bir şey yaptığını söyleyen bir yazı okudum (akıllıca programlama) onlara neden yanlış olduğunu açıklayın, yapamıyorsanız, o zaman belki gerçekten yanlış olup olmadığını kendinize sormalısınız.

Bu beni bu soruya yönlendirir:

Görüyorsam, birisinin kendi dilini / çerçevesini içine alan bir şeyi kendi yöntemini oluşturarak tekerleği yeniden icat ettiğini açıkça görüyorsam. İlk olarak, argümanlar uğruna, yöntemlerinin yerleşik yöntem kadar verimli olduğunu varsayalım. Ayrıca, yerleşik yöntemin farkında olan geliştirici, kendi yöntemini tercih eder.

Neden yerleşik olanı kendi başına kullanmalı?


16
Bu harika bir soru. İnsanların tekerleği yeniden icat etmesi gerektiğini düşünmüyorum, ancak beklediklerinden emin olmak için bu fikirlere meydan okumak önemlidir.
Jon Hopkins,

4
@Demian - Bu aslında oldukça iyi bir fikir. Eğer açıklayabilirseniz, muhtemelen yapma konusunda haklısınız demektir.
Jon Hopkins,

2
Tüm kararlarda, birincil hedefinizin ne olduğunu sormanız ve ardından diğer alt öğelerin birincil hedefi desteklemesine neden olmak iyi olacaktır. Öncelikli hedefiniz zamanında kaliteli bir ürün sunmaksa, mevcut kodu kopyalamak bu hedefe zarar verebilir. Öncelikli hedefiniz daha iyi düşünülmüş bir kütüphane oluşturmaksa, o zaman belki bu amaca katkıda bulunur. Bir başkası için çalışıyorsanız, o zaman soruyu kendi bakış açınızla değil, sizinki kadar sormanız gerekir .
gahooa

5
Mevcut tekerlekler gerçekten sizin özel istekleriniz için işe yaramazsa, ya da ... tekerleklerin nasıl çalıştığını bilmek istiyorsanız, yeniden icat edin! Bu konuyla ilgili ilginç bir makale: codinghorror.com/blog/2009/02/…
lindes,

4
Douglas Crockford'a The good thing about reinventing the wheel is that you can get a round one.
atfedilen

Yanıtlar:


71

Bir zamanlar StackOverflow'ta yayınladığım gibi, tekerleği yeniden icat etmek , popüler inanışın aksine , genellikle çok iyi bir seçimdir . Asıl avantaj , genellikle gerekli olan yazılım üzerinde tam kontrol sahibi olmanızdır . Tam bir tartışma için orijinal gönderime bakın .


14
+1 En önemli nokta tamamen sizin kontrolünüz altında olması ve onu dışarıda biliyor olmanız. Diğer kütüphaneleri hata ayıklamak, mümkünse büyük baş ağrısına yol açabilir ve tüm olgun kütüphanelerin hatasız olduğunu söylemek en azının iyimser olduğunu söyler.
Orbling

6
Excel ekibi kendi derleyicisini yazmaya kadar bile gitti çünkü projeyi etkileyebilecek herhangi bir dış bağımlılık istemiyorlardı. Bu geçerli bir nokta ama bu kontrolün asıl soru ne kadar kritik olduğu.
Jon Hopkins

6
+1. Bir zamanlar MFC / VC ++ programcısı olarak eski hayatımda, çeşitli GUI bileşenleri için üçüncü bir kütüphane kullandık; Bu şeyler yazılımın derinliklerine bağlandı ve silinemedi (ki biz hiç çaba harcamayan gerçek olmayan insan aylarını harcamadan). Kendi şebekelerimizi ve düzen yöneticilerimizi yuvarlamak zorunda kalmamaktan kaynaklanan ilk zaman tasarrufunun, o canavarlığı sürdürmek zorunda kaldıkları yıllar boyunca büyüklük emriyle parçalandığından kesinlikle eminim.
Bobby Tables

4
@Guzica, talihsiz bir seçimin genelleşmesi için mutlaka yeterli değildir ve iyi korunan ve iyi bir seçim olan diğer kütüphaneler vardır. Asıl soru, orijinal kararın yeterince iyi araştırılıp araştırılmadığı?

5
Önceden, önceden var olan bir tekerleği kullanıyorsanız, hata ayıklamanıza yardımcı olmak için genellikle Google tarafından güzel bir şekilde dizine eklenen LOTS yardımına sahipsiniz.
Dan Ray,

81

Bağlı olmak..

Her şeyde olduğu gibi, bağlam hakkında:

İyi olduğunda:

  • Çerçeve veya kütüphane çok ağırdır ve yalnızca sınırlı işlevler gerektirir. İhtiyaçlarınızı karşılayan kendi son derece hafif versiyonunuzu kullanmak daha iyi bir yaklaşımdır.
  • Bir şeyi anlamak ve karmaşık bir şey öğrenmek istediğinizde, sizi yuvarlamak mantıklı olur.
  • Size önerilecek başka bir şeyiniz var, başkalarının uygulamalarında bulunmayan bir şey var. Yeni bir twist olabilir, yeni özellik vb.

Kötü olduğunda:

  • İşlevsellik zaten var ve kararlı ve iyi bilinen (popüler) olduğu bilinmektedir.
  • Sürümünüz yeni bir şey eklemiyor.
  • Sürümünüzde hata veya kısıtlamalar var (ör. Sürümünüz güvenli değil).
  • Sürümünüzde özellikler eksik.
  • Sürümünüzün daha kötü belgeleri var.
  • Sürümünüzde, değiştirilen ile karşılaştırıldığında birim testleri eksik.

2
İlk noktanızın yanında (ve dördüncünüze ters), tekerleğin üstesinden gelmek zorsa veya - daha da kötüsü - esnek değilse, gerçekten iyileştirebilirsiniz. Bu, tekerleğin bir tren tekerleği olduğu ve sadece tek bir parçada çalıştığı bazı bölgelerdeki UI bileşenleri ile sık sık olur.
Magus

1
Benim için doğru halkaları anlamak zor. Sadece grafik analizini yönlendirmedim, o yüzden bir tane yaptım ve şimdi biliyorum. Şimdi bir çerçeve kullanmak konusunda kendimi güvende hissediyorum
JasTonAChair

1
"İyi" sütunu için 4'ünü eklerdim (nadiren uygulanırsa da): sorunlu alanı mevcut kütüphaneden daha iyi anlarsanız. Java'nın fiili standart zaman kütüphanesi Joda, yerleşik olarak çalışmak zor olduğu için yazıldı ve Java 8'in de jür standart zaman kütüphanesi olarak yeniden yazıldı, çünkü şimdi problemi orijinal joda zamanını yazdıklarından çok daha iyi anladılar.
Morgen

55

Sanırım tekerleği bilerek yeniden icat eden bir geliştiricinin "kendi yöntemini tercih ettiği için" oldukça nadir olduğunu düşünüyorum. Çoğunlukla cehaletten, bazen de inatçılıktan yapılır.

Hepsi bu kadar kötü mü? Evet. Neden? Çünkü mevcut tekerlek büyük olasılıkla zamanla üretildi ve birçok durumda ve birçok farklı veri türüne karşı zaten test edildi. Mevcut tekerleğin geliştiricisi / geliştiricileri, yeniden canlandırıcının henüz hayal bile edemediği son durum ve zorluklarla karşılaştı.


3
Veya tembellik - gidip alternatifleri aramaya ya da kod yazması için daha az ilginç bulmaya can sıkıcı olamaz.
Jon Hopkins,

9
Tekerleği yeniden icat etmenin kibir dışında yapıldığı, kütüphane / çerçeve xyz'nin sadece "doğru yolu" yapmayı bilmeyen kötü programcılar için olduğu düşüncesiyle birçok durum gördüm. Heck, bu argümanı SO sitelerinde (bir şekilde veya başka bir şekilde) gördüm.
Bill

2
... Bu, mevcut veya sonraki geliştiricilere sürekli (en kötü tür) bakım yükünü oluşturur.
gahooa

2
Bu yıllardır yaptığım şeydi. Bir dilde kendi özelliğimi kullandım çünkü bu işlevin zaten yerleşik olduğu hakkında hiçbir fikrim yoktu.
Matchu

1
Neredeyse üç yıl önce bu yazıyı yazdığımdan beri, ilk cümlede "oldukça nadir" olarak tanımladığım bir geliştiriciyi işe aldım. Bir ay sürdü. Ona burada nasıl iş yaptığımızı söylerdim ve "Ne dediğini duyuyorum" derdi "Söylenmemiş olanı duymam bir ay sürdü" ... ama yanlış ve gizlice her şeyi yapacağım "ifadesinin sonunda.
Dan Ray

22

Kare tekerlekler yeniden icat edilmelidir. Emmek için çabalar çoğaltılmalıdır. Belki de yöntem için dokümantasyon eksikliği vardır ve diğer programcı bunu anlamaya çalışmak yerine sadece kendi yazılarını yazmanın daha kolay olduğunu düşünüyor. Belki yöntemin çağrılma şekli gariptir ve programlama dili deyimine uymuyordur.

Sadece ona eksikliğin ne olduğunu sor.


9
+1 İyi metafor "kare tekerleklerin yeniden icat edilmesi gerekiyor" .
Orbling

"Kare tekerleklerin yeniden icat edilmesi gerekiyor" için +1
Tintu C Raju

17

Genel olarak, kullandığım dilin standart kütüphanesinde arzu ettiğim işlevsellik veya buna yaklaşan bir şey varsa, tekerleği yeniden icat etmekten kaçınırım .

Bununla birlikte, eğer üçüncü taraf kütüphanelerini dahil etmek zorunda kalırsam, bu kütüphanenin ne kadar yaygın şekilde kullanıldığına ve saygı duyulduğuna bağlı olarak bir yargı çağrısıdır. Yani, Boost veya Bob'un Kick-ass String Parsing Tools 1.0'dan mı bahsediyoruz ?

Kütüphane genel olarak iyi tanınsa ve endüstri genelinde çok saygın olsa bile, yine de üçüncü taraf bir bağımlılıktır . Programcılar genellikle bağımlılığın tehlikesine dikkat çekerken, kodun tekrar kullanımının erdemlerine büyük önem verir. Çok fazla üçüncü taraf bağımlılığı olan bir projenin, uzun vadede yavaş yavaş bir bakım kabusu haline geldiği için parçalanması muhtemeldir.

Bu yüzden mevcut kodu kullanmak iyidir - ama bağımlılıklar kötüdür . Maalesef, bu iki ifade birbiriyle çelişiyor, bu yüzden numara doğru dengeyi bulmaya çalışıyor. Bu yüzden kabul edilebilir bağımlılıkları tanımlamanız gerekiyor . Dediğim gibi, dilin Standart Kütüphanesinde yer alan herhangi bir şey büyük olasılıkla kabul edilebilir bir bağımlılıktır. Oradan Devam ediyoruz, son derece endüstrisinde kabul edilmektedir kütüphaneleri de (C ++ veya JavaScript için jQuery için Boost gibi) genel olarak kabul edilebilir - ama hala az onlar çünkü Standart Kütüphanesi daha arzu do standardize kütüphaneler daha az kararlı olma eğilimindedir .

Nispeten bilinmeyen kütüphanelere gelince, (örneğin SourceForge'deki en son yükleme) bunlar oldukça riskli bağımlılıklardır ve kaynak kodunu kendiniz tutacak kadar aşina olmadığınız sürece, genel olarak üretim kodunda bunlardan kaçınmanızı öneririm.

Yani gerçekten hepsi dengeleyici bir hareket. Fakat mesele şu ki, sadece kör bir şekilde "Kod tekrar kullanmak iyi! Tekerleği yeniden icat etmek!" tehlikeli bir tutumdur. Üçüncü taraf kodunu yararlanarak faydaları gerekir bağımlılıkları tanıtan dezavantajları karşı tartılır.


3
+1. Ben de aynı şekilde hissediyorum. Mevcut bir tekerleği kullanmak, mevcut tekerleğin zaten orada olduğundan daha fazla bir bağımlılık yaratacaktır, küçük bir tekerleği yeniden icat etmeye meyilliyim, ihtiyaç duyduğum herhangi bir ortamda kullanılmak üzere kurulmasını ve kullanılmasını bekliyor.
dsimcha

14

İnsanlar tekerlekleri yeniden icat etmeselerdi, dünya bunlarla dolu olurdu .. görüntü tanımını buraya girin

İşte iş yerimden bir diyalog:

- I would like to add some colors to the output of this program.
- Oh, there is this library called Colorama ..

İki seçenek var: ya tekerleği yeniden icat VEYA Colorama'yı kullanın. İşte her bir seçenek ne sonuçlanır:

Colorama'yı Kullanma

  • Belki koşmak için biraz daha hızlı
  • Önemsiz bir şeye üçüncü taraf bağımlılığı ekleme
  • Colorama'yı kullanmadan önceki kadar aptal olmaya devam ediyorsun

Tekerleği yeniden icat etmek

  • Bazı programların nasıl renk gösterebileceğini anlıyorsunuz
  • Herhangi bir terminalde özel karakterlerin renklendirilebileceğini öğrenirsiniz.
  • Gelecekte kullanabileceğiniz herhangi bir programlama dilinde renklendirebilirsiniz
  • Projenizin kırılması daha az olası

Gördüğünüz gibi, her şey içeriğe bağlı. Tekerleği yeniden icat etmek çok sık yaptığım bir şey çünkü kendim için düşünmek ve kendim için düşünmek istiyorum ve beni düşünen diğer insanlara güvenmek istemiyorum. Ancak, bir son tarihte çalışıyorsanız veya uygulamaya çalıştığınız şey çok büyükse ve zaten varsa, orada olanı kullanmaktan daha iyi olursunuz.


2
+1 sizinle% 100 aynı fikirde değil, fikri iletmek için kullanılan resmi beğendi.
Tulains Córdova

Bu cevap, işvereninizin, bu tekerleği kendi eğitim yararınız için yeniden icat etme lüksünüz için para ödeyeceğini biraz sarsmaktadır. Belki de bunu kendi zamanınızda yapmalısınız; eğer istenirse, işvereniniz muhtemelen kendisinin mümkün olan en kısa sürede işi yapmasını istediğini ve Colorama bunu yaparsa, onunla uğraştığını söyleyecektir.
Neil Haughton,

2
@NeilHaughton Gördüğüm gibi "benim" eğitimsel yararım aynı zamanda işverenimin de yararı.
Pithikos

Hmmm ... işvereniniz elbette bu şekilde görmeyebilir ve ekmeği masanın üzerine koyuyor.
Neil Haughton,

Colorama kütüphanesi, bir tekerleğin yeniden icat edilmesiydi. Renkleri terminalde (özel karakterler aracılığıyla) göstermek için bir arayüz vardı ve ortaya çıkmadan önce insanlar zaten yapıyordu. Colorama kütüphanesi, bu arayüze nasıl ulaşılacağına dair arayüzü yeniden icat eder. Öyleyse buradaki soru, sözde gelişmiş bir tekerlek kullanacak mısınız, yoksa projenizde eski bir tekerlek kullanıyor musunuz? Bu durumda tekerleği yeniden icat etmek, Colorama'nın sunduklarının üstüne daha da “iyileşen” Colorama2 inşa ediyor olacaktı.
Ski

13

Tekerleği yeniden icat etmenin kullanışlı bir nedeni öğrenme amaçlıdır - ancak bunu kendi zamanında yapmanızı tavsiye ederim. Önceden korunmuş çözümler sunuldukça ve daha fazla soyutlama düzeyi sağlandığında, çok daha üretken oluruz. Zaman zaman tekrar ayarlanan genel şeyler yerine iş sorununa odaklanabiliriz. AMA, bu nedenle, kendi başınıza bir çözümü tekrar uygulamaya çalışarak becerilerinizi geliştirebilir ve çok şey öğrenebilirsiniz. Sadece üretim kullanımı için mutlaka değil.

Başka bir şey - bir kaygı, kaybolabilecek bir şirketin üçüncü taraf kütüphanesine olan bağımlılık ise, kaynak kodunu almak için bir seçenek olduğundan veya en azından bir kaç başka seçeneğin geri çekildiğinden emin olun.

Bu arada, kendinize ait bir uygulamayı seçerseniz, bunu kriptografi veya güvenlikle ilgili diğer işlevler için kullanmaktan kaçının. Bunun için kurulmuş (ve tamamen test edilmiş) araçlar mevcuttur ve bu gün ve çağda, kendi yuvarlamanız çok risklidir. Bu asla buna değmez ve hala bunu yapan takımları duymam korkutucu.


+1 Öğrenme perspektifinde çok iyi bir nokta, bir kütüphaneyi etkili kullanmak için, nasıl yürüdüğünü gerçekten bilmelisin. Kara kutuların araç kullanımını sevmiyorum. Ayrıca kriptografi kütüphanelerinde mükemmel olan nokta, kendi puanınızı almak için çok riskli.
Orbling

Bir üçüncü taraf kütüphanesinin kaybolabileceği endişesi varsa, bir kütüphanenin diğerine kolayca değiştirilmesine izin veren programlı bir arayüz yazmanın oldukça iyi bir gerekçesi olduğunu da eklerim.
user8865

İyi nokta - adaptör modelini sadece bu amaç için kullanıyoruz ve son zamanlarda üçüncü taraf bir FTP kütüphanesini değiştirmek zorunda kaldığımızda bizi kurtardı.
Mark Freedman

9

İki çeşit verimlilik vardır - işleme / hız (ne kadar çabuk bir şekilde çalıştığı) eşleşebilir ve neredeyse kesinlikle olmayacağı hızda gelişme. İlk sebep budur - mevcut çözümlerin mevcut olduğu herhangi bir makul karmaşıklık problemi için, mevcut bir kütüphaneyi araştırmak ve uygulamak neredeyse kendi kodunuzu oluşturmaktan daha hızlı olacaktır .

İkinci sebep, mevcut kütüphanenin (olgun olduğu varsayılarak) test edilmiş ve işe yaradığı kanıtlanmıştır - muhtemelen bir geliştiriciden daha geniş bir senaryo aralığında ve bir test ekibi yeni yazılmış bir rutini başarabilir ve bu sıfır çaba.

Üçüncüsü, desteklemesi çok daha kolay. Sadece does başkasının destekleri ve onu iyileştirir (kütüphane / bileşen kim yazdıysa), ancak diğer geliştiricilerin aşina olmak ve anlaşılması mümkün ve ileriye kodu koruyacağını çok daha olasıdır devam eden minimize bunların hepsi, maliyetler.

Ve tüm bunlar normalde olmayan fonksiyonel denkliği varsayıyor. Sıklıkla kütüphaneler, faydalı bulabileceğiniz ancak aniden ücretsiz olarak erişilebilecek yapıyı asla haklı çıkaramayacağınız bir işlevsellik sunacaktır.

Kendinizinkini yuvarlamak için sebepler var - büyük ölçüde, yerleşik işlevin yapamayacağı bir şeyi yapmak istediğinizde ve bunu yaparak kazanılabilecek gerçek bir avantajın olduğu yerlerde veya hazır seçeneklerin olgunlaşmadığı yerlerde - ancak bunlar Birçok geliştiriciden daha az yaygın olduğuna inanıyorsunuz.

Ayrıca, neden vaktini zaten çözülmüş olan problemleri çözmek için harcamak istiyorsun? Evet, öğrenmenin harika bir yoludur ama bunu yaptığımız varsayım olan üretim kodu için doğru çözümün bedeli karşılığında yapmamalısınız.


2
Son satırınızda: onların nasıl çözüldüğünü bilmek için. Programlama, sonuçta deneyime bağlıdır.
Orbling

@Orbling - yeterince adil ancak üretim kodunda bunu yapmamalısın ve sanırım sorunun ne anlama geldiğini varsayıyorum. Değişecek.
Jon Hopkins

@Jon Hopkins: Kuyu üretim kodu genellikle kendi zamanınızda yapılmadıkça öğrenmeden sonra gelir.
Orbling 16

@Orbling - Öğrenme uğruna asla bir şeyler öğrenmemeniz ve sonra onu üretime sokmanız gerektiğini savunuyorum. Ya bir şey üretim kodudur, bu durumda en iyi çözüm bu olmalıdır ya da öğrenme içindir. Üst üste bindikleri zamanlar vardır, ancak gerçekten de en iyi çözüm olmadıkça, bu onlardan biri olmazdı.
Jon Hopkins,

@Jon Hopkins: İdeal olarak evet, ancak sık sık ekipte ne yaparsa yapılacağını bilen hiç kimse yok, mevcut kütüphanelerin güvenilir bir şekilde hizmet edilemeyebileceği noktaya kadar. Çoğu insanın dediği gibi öğrenmek veya “araştırma” yapmak bir zorunluluktur. Evet, bu tam olarak öğrenme uğruna öğrenme değil, gelecekteki risklerden kaçınmayı öğrenmektir.
Orbling 16

9

Elbette tekerleği bir hevesle yeniden icat etmek, cehalet ve kibir dışında olmak kötü bir şey olabilir, ancak IMHO sarkaç çok fazla sallandı. Tam olarak ne istediğinizi yapan ve daha fazlasını yapmayan bir tekerleğe sahip olmanın muazzam bir avantajı var .

Genellikle mevcut bir tekerleğe baktığımda, ya gerekenden çok daha fazlasını yapıyor, iç platform etkisinden muzdarip oluyor ve bu yüzden gereksiz yere karmaşık oluyor, ya da ihtiyacım olan ve bunu yapmak zor olacak bazı önemli özellikleri eksik zaten var olanın üstüne uygulayın.

Ayrıca, mevcut tekerleklerin kullanılması sık sık benim projeme istemediğim kısıtlamalar getiriyor. Örneğin:

  • Mevcut tekerlek, kullanmayı tercih ettiğimden farklı bir dil ve / veya programlama stili gerektiriyor.
  • Mevcut tekerlek sadece bir dilin eski versiyonuyla çalışır (örneğin, Python 3 yerine Python 2).
  • Verimlilik, esneklik ve basitlik arasında değişimlerin olduğu yerlerde mevcut tekerlek benim kullanım durumum için düşük olan seçimler yapar. (Aslında bu durumlarda kendim yazdığım kitaplıklardan bile işlevselliği yeniden icat ettiğim biliniyordu. Genellikle, şu anda kendi özelliğimde çok hızlı olan bir şeye ihtiyacım olduğunda, fonksiyonun kütüphane sürümünü genel ve makul olarak verimli olması için yazdım çünkü) durum.)
  • Mevcut tekerleğin yeni kod durumunda tamamen işe yaramaz tonlarca eski hamlesi var, ancak yine de hayatı zorlaştırıyor (örneğin, beni jeneriklerden önce yazılmış olduğu için boktan kap sınıflarını kullanmaya zorlayan kullandığım bir Java kütüphanesi vs.) .
  • Mevcut tekerleğin problemi modelleme şekli, kullanım durumum için uygun olandan tamamen farklı. (Örneğin, düğüm nesneler ve referanslarla temsil edilen yönlendirilmiş bir grafiğe sahip olmak benim için uygun olabilir, ancak mevcut teker bir bitişik matris ya da tam tersi kullanır. mevcut tekerlek, büyük veya tam tersi satırda ısrar eder.)
  • Kütüphane, ihtiyacım olan tek şey özelliklerinin küçük bir alt kümesi olduğunda, kodumu dağıtmak istediğim her yerde çalışmaya başlayıp çalıştırmak için büyük bir güçlük olacak büyük, kırılgan bir bağımlılık ekler. Öte yandan, bu durumda bazen istediğim özelliği yeni, daha küçük bir kütüphaneye ekliyorum veya kütüphane açık kaynak kodluysa ve kod temeli bunu yeterince basit hale getiriyorsa kopyalayıp yapıştırın. (Bunu sadece diğer insanların değil kendim yazdığım nispeten büyük kütüphanelerle yaptım.)
  • Mevcut tekerlek, kullanım durumum için hem uygunsuz hem de ilgisiz olan bazı standartlarla bilerek uyumlu olmaya çalışıyor.

Sanırım bunların hepsi şurada toplanıyor: Eğer tekerlek amacınıza uygunsa, kullanmayın, yoksa yeni bir tekerlek oluşturun. Sadece bir şekilde ya da diğer konuda dogmatik olmayın.
Neil Haughton,

5

Genellikle kendimi kullanırım çünkü önceden var olanı keşfetmeden önce yaptım ve her vakayı bulmak ve değiştirmek için çok tembelim. Ayrıca, önceden var olanı anlamadığım halde kendi yöntemimi tam olarak anladım. Ve son olarak, önceden var olanı tam olarak anlamadığım için, şu anki olanımın yaptığı her şeyi kesinlikle yaptığını doğrulayamıyorum.

Kodlanacak çok şey var ve geri dönüp bir şeyi yeniden kodlamak için üretimi etkilemediği sürece fazla zamanım olmuyor.

Aslında, günümüzde hala kullanılan bir asp web uygulamasında, verileri tablo biçiminde görüntüleyen ve sıralama / düzenlemeye izin veren tamamen işlevsel bir çizelge vardır, ancak bu bir datagrid değildir. Birkaç yıl önce asp.net'i öğrendiğimde ve datagrids'i bilmiyordum. O zaman ne yaptığım hakkında hiçbir fikrim olmadığı için koddan biraz korkuyorum, ama işe yarıyor, doğru, değiştirilmesi kolay, çarpışmayan ve kullanıcılar onu seviyor


2
Bu, onu değiştirmemek, ilk etapta yapmamak için bir neden. Alternatifin var olduğunu bilerek şimdi aynı şeyi yapmayacağını sanıyorum.
Jon Hopkins,

@Jon lol kesinlikle değil! Ve asıl olarak soruyu, bir geliştiricinin kendi yöntemini önceden varolan bir yöntemle neden tercih edeceği olarak okudum. Şimdi soruyu tekrar okumak, sorulanın tersini sorduğumun farkına varmamı sağladı, ancak cevap göründüğü için cevabı burada bırakıyorum - ve biraz oy aldı
Rachel

4

Tekerleği yeniden icat etmek, tekerleğin nasıl çalıştığını öğrenmek için harika bir yoldur, ancak bir araba yapmanın iyi bir yolu değildir.


4

Şu anda bir avuç cheapskate için çalışıyorum.

Karar “inşa etmek veya satın almak” arasında yapıldığında, ekonomiye dayalı rasyonel bir karar vermek yerine, yöneticiler “inşa etmeyi” seçtiler. Bu, bir bileşen veya araç için birkaç bin dolar ödemek yerine, kendi ayımızı inşa etmek için erkek aylarını harcadığımız anlamına gelir. Başka bir şirketten bir tekerlek satın almak bütçeden çıkan paraya mal olur - bu da yanlış yönetim yıl sonu bonuslarına karşılık gelir. Programcıların zamanı ücretsizdir ve bu nedenle yıl sonu bonuslarına sayılmaz (programcıları "zamanında" her şeyi yapmamak için kullanmanın ek yararı ile), bu nedenle yeniden keşfedilen bir tekerlek serbest bir tekerlektir .

Rasyonel bir şirkette, başkalarının kendi tekerleklerini yeniden icat etmekten başkalarının ürettiği tekerlek satın almanın maliyetine karşı kazandığı avantajlar kısa vadeli ve uzun vadeli maliyetlerin yanı sıra kaybedilen fırsat maliyetlerinden kaynaklanacaktı; tekerlekleri yeniden icat. Tekerleği yeniden icat etmek için harcadığınız her gün yeni bir şey yazamazsınız.

Satınalma vs yapı üzerine sunum .
Satın alma vs derleme makalesi .

Görüyorsam, birisinin kendi dilini / çerçevesini içine alan bir şeyi kendi yöntemini oluşturarak tekerleği yeniden icat ettiğini açıkça görüyorsam. İlk olarak, argümanlar uğruna, yöntemlerinin yerleşik yöntem kadar verimli olduğunu varsayalım. Ayrıca, yerleşik yöntemin farkında olan geliştirici, kendi yöntemini tercih eder.

Neden yerleşik olanı kendi başına kullanmalı?

Yerleşik sürümün üzerinde çok fazla insan vuracaktı - böylece homebrew kodunuzun sahip olabileceğinden daha fazla hata bulmak ve düzeltmek.

Sonunda, yerel geliştiriciniz çıktığında ve bir başkası yazdığı kodu sürdürmek zorunda kaldığında, tamamen yenilenecek ve çerçevenin içindekilerle değiştirilecektir. Bunun olacağını biliyorum, çünkü şu andaki işverenim yıllar içinde VB'nin daha yeni sürümlerine geçirilmiş (en eski ürün yaklaşık 20 yıldır piyasada bulunuyor) koduna sahipti ve bu da oldu. Ofisimde en uzun süredir çalışan geliştirici 17 yıldır burada.


Adil olmak gerekirse, bazen "standart" sürüm, standart sürüm geliştirilmeden önce çoğu insanın yaptıklarının yeniden keşfi olarak ortaya kondu. IOW, standart olan "büyük final yeniden keşif" olmak içindir. Ancak, standart, iyi test edilmiş, çok daha sağlam ve hataya açık bir sürüme geçmeniz hatalara yol açabilir, çünkü uygulama kodunuz eski standart olmayan sürümünüz için doğru olan, ancak yeni standart için yanlış olan varsayımlar yapar.
Steve314

1
Rasyonel bir şirkette, satıcıya kilitlenmenin kabul edilebilir olduğuna karar verilirse, şirketin (alıcı olmak ve tedarikçinin teklifine bağlı olmak), tedarikçiyle iyi bir iş ilişkisi kurmasının yanı sıra çeşitli işlere karşı ihtiyati önlemeye ihtiyacı var. Örnekler: destek / sorunu gidermeyi reddetme, fiyat zammı, sözleşme şartlarını değiştirme, anlamsız davalar veya işi tamamen terk etme. Bu riskten korunma aynı zamanda maliyetin bir parçasıdır ve genellikle göz ardı edilir. (Kurum içi geliştirme maliyetinin göz ardı edilmesi gibi.) Not: Bu maliyet yerleşik tekliflerde yoktur.
rwong

Yanlış yönlendirilmiş alçak gönüllü işverenlerinin size, aksi takdirde sahip olabileceğinizden daha fazla ücretli iş sağladığını unutmuyorsunuz? Onlardan şikayet etmek yerine onları cesaretlendirmelisin!
Neil Haughton,

4

Tekerleği yeniden icat etme ile ilgili olan şey, bazen ihtiyacınız olanı yapacak standart, kullanıma hazır bir tekerleğin bulunmamasıdır. Dışarıda, birçok ebatta, renkte, malzemede ve yapım tarzında birçok iyi tekerlek var. Fakat bazı günler sadece yeşil eloksallı alüminyumdan yapılmış hafif bir tekerleğe sahip olmak zorundasınız ve kimse bunu yapmıyor. Bu durumda, kendin yapmalısın.

Şimdi her proje için kendi tekerleklerinizi kendiniz yapmalısınız - çoğu şey standart parçaları kullanabilir ve bunun için daha iyi olabilir. Ama her zaman ve sonra, standart parçaların işe yaramadığını görüyorsunuz, bu yüzden kendiniz kalıyorsunuz.

En önemli şey, kendinizin ne yapması gerektiğini bilmek. Kendi parçalarınızı tasarlamaya başlamadan önce standart parçaların neler yapabilecekleri ve yapamayacakları hakkında iyi bir fikre sahip olmalısınız.


4

Tekerleği yeniden icat edip etmemek bir maliyet / faydadır. Maliyetler oldukça açık.

  • Yeniden icat etmek çok zaman alıyor.
  • Ne icat ettiğinizi belgelemek daha da zaman alır.
  • Ne icat ettiğinizi anlayan insanları işe alamazsınız.
  • Kötü bir şeyi yeniden icat etmek çok kolaydır, kötü tasarımın yol açtığı sorunların devam eden maliyetlerine neden olur.
  • Yeni kod yeni hatalar anlamına gelir. Eski kod genellikle çoğu hatayı daha önce temizlemiştir ve farkında olmadığınız ve bu nedenle yeni tasarımda çalışamayacağınız sorunlara geçici çözümler getirebilir.

Sonuncusu önemlidir - bilmediğiniz bir çok eski gerçekte temel hata düzeltmeleri olduğu temelinde "eski kodu atma ve sıfırdan başlama eğilimi" konusunda uyarı yapan bir blog yazısı vardır. Netscape, IIRC hakkında bir uyarıcı hikaye var.

Avantajları olabilir ...

  • Mevcut kütüphanelerin sahip olmadığı özellikleri ekleme yeteneği. Örneğin, yineleyici / imleç örneklerini "koruyan" kaplarım var. Eklemeler ve silmeler yineleyicileri geçersiz kılmaz. Bir vektöre işaret eden bir yineleyici, vektörün önceki bölümlerindeki eklerden ve silmelerden bağımsız olarak aynı öğeye (aynı dizinde değil) işaret etmeye devam edecektir. Bunu standart C ++ kapları ile yapamazsınız.
  • Özel gereksinimlerinizi hedefleyen ve önceliklerinize saygı duyan daha özel bir tasarım (ancak iç platform etkisine olan eğilime dikkat edin).
  • Tam kontrol - bazı üçüncü taraflar, başvurunuzun yarısını yeniden yazmak zorunda kalacak şekilde API'yi yeniden tasarlamaya karar veremezler.
  • Tam anlayış - bu şekilde tasarladınız, bu yüzden neden ve nasıl yaptığınızı tam olarak anlıyorsunuz.
  • EDIT Diğer kütüphanelerden aldığınız dersleri, aynı tuzaklara yakalanmadan nasıl taklit ettiğiniz konusunda seçici davranarak öğrenebilirsiniz.

Bir şey - üçüncü parti bir kütüphane kullanmak tekerleği yeniden icat olarak sayılabilir. Zaten eski, iyi kullanılmış, iyi test edilmiş bir kütüphaneniz varsa, bunun yerine üçüncü parti bir kütüphaneyi kullanmak için atmadan önce dikkatlice düşünün. Uzun vadede iyi bir fikir olabilir - ancak oraya gitmeden önce çok büyük miktarda çalışma ve çok sayıda kötü sürpriz (kütüphaneler arasındaki ince anlamsal farklılıklardan) olabilir. Örneğin, kendi konteynırlarımdan standart kütüphane konteynırlarına geçmemin etkisini düşünün. Çağıran kodun saf çevirisi, standart kütüphane konteynırlarının yineleyicileri sürdürmemesine izin vermez. Bir yineleyiciyi daha sonra bir "yer imi" olarak kaydettiğim durumlar, basit bir çeviri kullanılarak gerçekleştirilemez - I '


3

İhtiyacınız olanı yapan çalışan bir bileşen varsa, neden zamanınızı kendi sürümünüzü yazmaya ve hata ayıklamaya harcayacaksınız? Benzer şekilde, daha önce benzer bir işlevi yerine getirmek için kod yazdıysanız neden yeniden yazmalısınız?

Joel, icat edilmedi-burada, kodun ve yazılımın yeniden yazılmasının ve kullanışlı olmama durumuyla ilgili konuştuğu bir makale yazdı .


3

Tekerleği yeniden icat etmek, bir şeyin nasıl çalıştığını öğrenmek için harika bir yol olabilir - ve sadece bu amaç için kendi zamanınız için yeniden icat etmenizi tavsiye ederim - ama bir uygulama yazarken, aynı şeyi yapan iyi kurulmuş çözümler varsa neden yeniden icat ettin?

Örneğin, hiçbir zaman sıfırdan JavaScript kodu yazmam; Bunun yerine, jQuery ile başlar ve uygulamalarımı bu çerçevenin üzerine kurardım.


3

Benim kişisel kurallarım:

Sadece öğrenirken çarkı yeniden icat etmek iyidir. Son teslim tarihiniz varsa, mevcut jantları kullanmak isteyebilirsiniz.


3

"Kötü" olmak, hatta "kötülük" olmak, oldukça güçlü kelimelerdir.

Her zaman olduğu gibi, yerleşik bir uygulama üzerinden kişisel bir uygulama seçmenin nedenleri var. Eskiden bir C programı çalışma zamanı kütüphanesinde hataları karşılaşmak ve bu nedenle sadece olabilir zorunda kendi uygulamasını sağlamak.

JVM çok katı bir şekilde tanımlandığı için bu Java programları için geçerli değildir, ancak bazı algoritmaların hala doğru olması çok zordur. Örneğin, Joshua Bloch, Java çalışma zamanı kitaplığındaki aldatıcı basit ikili arama algoritmasının nasıl dokuz yıl sürdüğü bir böcek içerdiğini açıklıyor:

http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html

Gelecekteki Java dağıtımlarında bulundu, düzeltildi ve dağıtıldı.

Eğer yerleşik ikili aramayı kullanırsanız, Sun'ın bu işi düzeltmesini, düzeltmesini ve dağıtmasını zorlaştırarak zamandan ve paradan tasarruf etmiş olursunuz. Çalışmalarını yalnızca "en azından Java 6 güncelleme 10'a ihtiyacınız var" diyerek kaldırabilirsiniz.

Kendi uygulamanızı kullanıyorsanız - bu da muhtemelen bu hatayı içerecektir - önce kendini göstermek için böceğe ihtiyacınız var. Bu özel olanın yalnızca BÜYÜK veri kümelerinde gösterildiğine göre, bir yerde üretim yapılması zorunludur, yani siz müşterilerinizden en az birinin etkileneceği ve siz bu hatayı bulduğunuzda, düzelten ve dağıtan gerçek para kaybedeceğiniz anlamına gelir.

Bu nedenle, kendi uygulamanızı tercih etmek tamamen geçerlidir, ancak bunun nedeni, başkalarının çalışmalarından yararlanmaktan daha pahalı olması gerektiğinden, gerçekten de iyi olmaktır.


Düzeltmeleri uygulamak için platforma güvenmek için +1. Öte yandan, bugfix'in dağıtılıp dağıtılmayacağına karar vermek platform satıcılarına kalmıştır. Farklı bir satıcı seçebilir: (1) bugfix'i ücretsiz olarak dağıtmak; (2) büyük sürüm yükseltme yapılıncaya kadar bu hatayı kaldırır; (3) bu düzeltmeyi en son sürümün kullanıcılarına dağıtmak, ancak önceki sürümleri reddetmek (4), "yaygın uyumsuzluğa neden olabileceğini" ve "yalnızca sınırlı kullanıcıları etkileyebileceğini" iddia ederek tamamen düzeltmeyi reddetti.
rwong

eğer @rwong, sen rutin yerleşik bir hata buldum, senin Best bahis kendi sabit versiyonunu temin etmek olacaktır. Bu, "bunu yapmak için çok iyi bir neden" altında gerçekleşiyor.

ørn: Demek istediğim, bahsettiğiniz hayırsever satıcı (lar) ın yanı sıra, başka tür satıcılar da olduğu.
rwong

@ rwong, bu durumda "kişisel bir uygulama seçmek için çok iyi bir sebep" olarak nitelendirilebiliyor.

3

Geçenlerde bu konuyla ilgili düşüncelerimi blogda yayınladım. Özetlemek:

  1. Bu var hemen hemen her zaman onun bir fonksiyonu şu dile inşa edilirse özellikle doğrudur, kendi inşa etmek kötülük. Ancak, İnternette bulduğunuz olgunlaşmamış / şüpheli tutulan / kötü belgelenmiş bir çerçeveyi kendi yazı yazma olasılığına karşı değerlendiriyorsanız, bu hiç akıllıca olmaz.

  2. Bence tekerleği yeniden icat etmek , bir yazılım anti-paterni için oldukça berbat bir benzetme. Orijinal çözümün hiçbir zaman geliştirilemeyeceği anlamına gelir. Bu saçmalık. Sözde tekerlek bir gecede kullanılmaz hale gelebilir veya sahipleri bunu sürdürmeyi durdurabilir. Tekerlek, kullanıldığı her sistemde farklı bir değere sahiptir. Yani, daha iyi bir tekerlek icat etmek genellikle tamamen mümkün.

  3. Kendi çerçevenizi yapmanın en büyük yararlarından biri, başkasının hataları için sorumluluk almak zorunda kalmamanızdır. (Bu Amazon'un felsefesidir .) Bu şekilde düşünün: bunlardan hangisi bir müşteriye söylemek daha iyidir? -

    "Web sitemiz bozuldu. Başkasının hatasıydı ve yaratıcısıyla bir hata kaydettik. Beklemekten başka yapabileceğimiz bir şey yok. Beklemekten başka bir şey yapmayız. Sizi güncel tutacağız."

    "Web sitemiz bozuldu ve derhal düzeltmeyi başardık."


0

Belki de bu kadar verimli, ama sağlam mı? Kendi kütüphanenizi kullanmak için bir kütüphane kullanmanın en zorlayıcı nedeni, çerçevenin, hataları hızlı bir şekilde bulabilecekleri ve düzeltebilecekleri kullanan pek çok kişinin bulunmasıdır. Kurum içi geliştirilen kütüphane, her ne kadar (veya daha fazla) işlevsellik sunsalar da, neredeyse her kullanımda test sağlamak için milyonlarca kullanıcılı bir kütüphane ile rekabet edemezler. Sadece bu tür testleri kurum içinde geçemezsiniz.


0

Eh, kendi yönteminin çerçeve kadar verimli olması oldukça nadirdir, çünkü çoğu çerçeve hala hatalara sahiptir ve hiçbir çerçeve size kutudan bir çözüm getiremez. Düşünemeyen çoğu programcı çerçeve düzeyinde hiçbir şey yazmaya çalışmaz; hazır bir çözüm için sadece Google’ı arayacaklar. Herhangi bir bilge programcı ilk önce ihtiyaç duyduğu işlevselliğe sahip ücretsiz bir çerçeve olup olmadığını görecek ve daha sonra yoksa çözümü kendi üzerine yazacaktır. Bazen mevcut proje durumunu açıklamak çok zor ve geliştirici en iyi yargıç.

Tekerleği yeniden icat etmek fena değil, tembel insanlar tarafından çok çalışmaktan kaçınmak için yapılan bir ifade. Çerçeve yazarları bile yeniden icat eder; .net çerçevesi, COM'un sunduğu şeyleri yapmak için yeniden icat edildi.


0

Bazılarına göre rahatsız edici olduğu için, her zaman bir mühendis tarafından kullanıldığında ya da bir şeyler yaratma ya da tasarlama konusuna atıfta bulunarak bu terimin daima belirsiz olduğunu buldum. Aslında, bugünün hızlı tempolu dünyasında yenilik yapmak için baskılar düşünülürken, yardım edemem ama onu utandırıcı olarak görmem. Kendini tekrar etmek (ya da yeterli, önceden var olan çözümleri görmezden gelmek) asla akıllıca olmaz, ancak gerçekten, hepimizin hala yeşil harflerle dolu siyah ekranlara bakmamamızın bir nedeni vardır.

Anladığım kadarıyla "Bozulmadıysa düzeltmeyin", sanırım böyle bir cümle bazılarına cahil gelebilir. Yine de, uzay yolculuğu, yarış, nakliye vb. İhtiyaçlar için tekerleği yeniden icat etme çabasıyla, "tekerleği yeniden icat etme" de oldukça cahildir ve göründüğü kadar zeki değildir.

Geçmişim birçok projeden oluşuyor ve birçok stajyer ve diğer yeşil geliştirici biçimleriyle çalışmak zorunda kaldım ve bazılarının 'aptal' dediği pek çok nahoş soru ile uğraşmak zorunda kaldım ve insanları tavşan kovalamaya yönlendirmek zorunda kaldım. görevlerinin kapsamı dışında kalanlar. Ancak, inovasyon veya yaratıcılıktan asla vazgeçmeyecektim ve 'tekerleği yeniden icat etmekten' büyük şeyler gördüm.

Bu soruya gerçek cevabım: Tekerleği yeniden icat etmenin kötü bir şey olduğu sadece iki durum var:

  1. Gerçekten gerekli değilse
  2. Eğer yapabildiğin zaman diğer adam yapıyorsa

Düzenleme: Aşağı yukarı oy kullanıp, bazılarını kırmış olmam gerektiğini görebiliyorum. Eklemek istediğim şey, bu cümlenin her zaman benim ana evcil hayvanım olmasıydı. Anladığım kadarıyla iki kuruşun trol sesi gibi geldiğini, fakat trol yapma, yangına neden olma veya kırılma niyetim yok.


0

"Tekerleği yeniden icat etme" konusundaki argümanlar sıklıkla bir kütüphane kullanmayı seçmenin yanlış bağlamında kullanılır, ancak bu pek benzer bir şey değildir.

Diyelim ki yakın zamanda popüler olan ve formlarla uğraşmaya yardımcı olan 'form-plus' kütüphanesini değerlendiriyorum. Güzel bir açılış sayfası, modern güzel grafikler ve çevresinde yeniden formları nasıl harika hale getireceğine yemin eden bir -kült- (topluluk demek istediğim) var. Ancak "formlar-artı", "formlar" ın üstüne bir soyutlamadır. "formlar" mümkündü ama başa çıkma zor oldu, bu yüzden onu kolaylaştıran soyutlama popüler hale geliyor.

Yeni soyutlamalar her zaman oluyor. Onları tekerleklerle karşılaştırmak zor. Çalıştırmak için ihtiyacınız olan çok karmaşık bir cihaza yeni bir kontrol cihazı ve yeni bir el kitabı gibi.

Bu yeni cihazın "form-plus" değerlemesi kişisel deneyime bağlı olarak farklı görünecektir. Daha önce hiç form oluşturmadıysam, "formlar artı" çok zorlayıcı olacak çünkü başlaması daha kolay. Dezavantajı, "formlar-artı" sızdıran soyutlama olduğu ortaya çıkarsa, yine de "formları" öğrenmem gerekecek. "Formlar artı" olmadan formlar oluşturuyor olsaydım, yeni bir araç öğrenmem gereken zamanı hesaba katmam gerekecek. Upside, zaten "formları" bildiğimden ötürü soyutlamalar yapmaktan korkmuyorum. Kısa vadeli faydalar genellikle yeni başlayanlar için daha büyük olacaktır, çünkü eğer bir şeyde iyileşmemiş olsaydı, muhtemelen yeni kütüphane olmazdı. Uzun vadeli faydalar, soyutlama kalitesine, evlat edinme oranına göre büyük ölçüde değişecektir,

Dikkatlice değerlendirdikten sonra yeni bir soyutlama kullanmanın yararlarını ve olumsuzlarını "form-artı" vs "çıplak kemik" formlarını kullanarak karar verdim. Karar, benim kişisel deneyimlerime dayanıyor ve farklı kişiler farklı kararlar alacak. Çıplak kemik "formları" kullanmayı seçmiş olabilirim. Belki daha sonra zaman formlarında artı ardında daha fazla harekete geçip standart dışı hale geldi. Ve belki de zamanla kendi uygulamam kıllı hale geldi ve şu anda ne yaptığını yapan çok şey yapmaya başladı. Bu sırada gelen insanlar, tekerleği yeniden icat etmeye istekli olduğumu ve onun yerine mevcut kütüphaneyi kullanmam gerektiğini eleştirmek için çekilecekler. Ama aynı zamanda "form-artı" hakkında karar vermem gerektiğinde "form-artı" için başka alternatifler de mevcut olabilirdi.

Sonunda doğru araçları seçmek karmaşık bir karardır ve "tekerleğin yeniden icat edilmesi" çok yararlı bir bakış açısı değildir.


-1

Bununla ilgili küçük bir yazı yazdım - http://samueldelesque.tumblr.com/post/77811984752/what-re-inventing-the-wheel-can-teach-you

Tecrübelerime göre, icat etmek çok uzun ve sıkıcı olmasına rağmen gerçekten de harikaydı. Kullanacağınız programlama modellerini tam olarak bilmiyorsanız, kendiniz yazın (zaman ve enerjiniz varsa). Bu size programlama modellerinin tam olarak ne anlama geldiğini öğretecek ve sonuçta daha iyi bir programcı olacaksınız. Elbette, bir müşteri için çalışıyorsanız ve hızlı bir şekilde bir şeyler bulmanız gerekiyorsa, muhtemelen sadece biraz araştırma yapmak ve sizin için doğru yazılımı bulmak isteyeceksiniz.

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.