Önerilen tasarımım genellikle meslektaşımınkinden daha kötü - nasıl daha iyi olabilirim? [kapalı]


69

Birkaç yıldır programlama yapıyorum ve genellikle sorunları çözmek ve küçük-orta dereceli komut dosyaları oluşturmak konusunda iyiyim, ancak genellikle büyük ölçekli programları nesne yönelimli olarak tasarlama konusunda iyi değilim. Birkaç soru

  1. Son zamanlarda, benimle aynı yıllara dayanan bir meslektaşım ve ben bir problem üzerinde çalışıyorduk. Ondan daha uzun bir problem üzerinde çalışıyordum, ancak daha iyi bir çözüm buldu ve sonunda tasarımını kullanacağız. Bu beni gerçekten etkiledi. Tasarımının daha iyi olduğunu kabul ediyorum ama onun kadar iyi bir tasarım yapmak istedim. İşi bırakmayı bile düşünüyorum. Neden olduğundan emin değilim ama aniden biraz baskı altında hissediyorum, örneğin gençler benim hakkımda ne düşünürdü? Bu normal mi? Yoksa bu konuda biraz fazla mı düşünüyorum?

  2. İşim Python'da programlama yapmak. Kaynak kodu okumayı denerim ama sence tasarım becerilerimi nasıl geliştirebilirim? Çalışmam gereken iyi bir kitap veya yazılım var mı?

Lütfen beni aydınlat. Gerçekten yardımın için minnettar olacağım.


9
@Oded: OP'nin yapmakta olduğu mesele, iş arkadaşı ile aynı sayıda yıllık deneyime sahip olmaları olduğunu düşünüyorum ama iş arkadaşı daha iyi tasarımlar üretiyor ve OP de nasıl daha iyi hale geleceğini bilmek istiyor. iş arkadaşı olarak iyi. Ben düşünüyorum ...
FrustratedWithFormsDesigner

34
@Oded: Evet, 10 yılını koymadan bir usta olmasını beklememeliydi, ancak diğer taraftan, eğer ondan bir kaynak öğrenemezse, o 10 yıl onu pek iyi yapmayacaktı. . Burada büyümek için bazı şeyler yapmaya çalışıyor; Hadi onu caydırmayalım lütfen.
Mason Wheeler

6
Diğer tasarımdan bir şey öğrendin mi? Sahip olduğunuz diğer kodlama durumlarına uygulayabilir misiniz? Em ve iş arkadaşından olabildiğince çok şey öğren. Öğle yemeği teklif et.
JeffO

17
Ben sadık kaldım. Eğer meslektaşınızdan öğrenebilirseniz, o zaman yapın. Egonun bir fırsatın önüne geçmesine izin vermeyin - eğer devam ederseniz ve size öğretecek bir şeyi olmayan erkeklerle çalışmaya başlarsanız. 25 yılı aşkın bir deneyime sahibim, ancak mutlulukla 3 ile bir programcıdan yapıcı eleştiri aldım (ve payımı veriyoruz). En kötü günde her ikisinin de sonucu olarak benden daha iyi bir adamla çalışıyorum. bu insanlar ben 2 yıl öncekinden daha iyi bir programcıyım.
mattnz

7
Hayatın bir gerçeği, her zaman senden daha iyi olan başkalarını bulacaksın. Seni korkutmasına izin verme, iyileşmek için elindeki her şeyi dene.
maple_shaft

Yanıtlar:


69

Bence bu senin yeteneklerinin çok olumlu bir işareti. Bir takımda 'daha iyi' bir tasarımla gelmekte zorluk çeken insanlar için, başka bir tasarımın neden daha iyi olduğunu anlamada tamamen yetersiz kalması çok daha yaygındır.

Sizin için iki büyük (ve şaşırtıcı derecede nadir) güçlü yanlarınız var:

  • Tasarımlarınızı başkalarına karşı objektif olarak değerlendirebilirsiniz
  • Tasarımlarınızı optimum hale getirmek için arzu ve çaba sarfedersiniz

Siz sadece birkaç yıl içinde kalacaksınız ve gidecek çok yolunuz var, ama bu tavırla kesinlikle oraya varacaksınız, pes etmeyin; hepimiz böyle zihinsel engellerle uğraşıyoruz. Bir şansım olduğu sürece, Tasarım İlkelerini takmayı seviyorum (tasarım desenleriyle aynı DEĞİL) ve bunun kullanışlı oldukları yerlere mükemmel bir örnek olduğunu düşünüyorum. Onları inceleyin ve tasarımlarınıza uygulayın, bu konuda bir adım daha attığınızı bilmeden önce öğreneceksiniz.

Günün sonunda, tasarımın zor olduğunu hatırlayın. Her gün karmaşık üst düzey soyutlamalar ile uğraşıyoruz, bunları ince havadan oluşturmak, iyi çalışmalarını sağlamak ve meslektaşları tarafından kullanımı kolay, son derece zor bir iştir. Yıllarca pratik alır .

Öyleyse çeneni aç ve sadece hatırla: dışarıda iki tasarımı değerlendiremeyen ve aslında bir tanesini diğerlerinden daha iyi olarak tanıyan bir grup insan var, sence iyi tasarımlar yaratırken ne kadar başarılı olduklarını düşünüyorsunuz?

Düzenleme:
'ipucunu, kafanızı ilkeler etrafında dolaştırdıktan ve uygulamalarını biraz uyguladıktan sonra, burada farklı amaç ve kuralları olan çeşitli dilleri öğrenmenin değerine değinen başka bir sorudan başka bir cevher olduğunu düşünüyorum:

İdeal olarak, her programcının her sınıftan bir dil bilmesi gerekir. Ne öğrenebilirsin:

  1. Statik yazılmış bir OOP ana dili: Java, C # (çoğunlukla kurumsal yazılımda kullanılır) ve C ++ (sistem programlama ve karmaşık masaüstü uygulamaları)
  2. Prototip tabanlı bir OOP dili: Javascript (istemci tarafı web programlama)
  3. Bir prosedür dili: C (gömülü yazılım ve sistem programlama)
  4. İşlevsel bir dil: Haskell, ML veya Lisp (işlevsel diller yüksek derecede paralelleştirilmiş yazılımlar için iyidir).

Mantıksal bir programlama dili (Prolog) büyük olasılıkla AI araştırmalarında kullanılan, endüstride pek kullanışlı değildir.

Bu, bir çözüm tasarlamaya çalışırken akla gelen fikir çeşitliliğinin genişletilmesine yardımcı olacaktır.


2
+1 Birinin nedenini anlayabiliyorsa, harika tasarımlara doğru yol alıyorlar (özellikle de yalnızca birkaç yıllık deneyime sahiplerse).
Daniel B,

22
  1. Bu, birçok insanın farklı kalitede tasarımlar bulması için kesinlikle normaldir. Geçmişte yazılım tasarımındaki yarışmaları yargılamak için davet edildim, bu yüzden bu ilk elden tanık oldum: en basit tasarımlar bile, hepsi akıllı ve deneyimli insanlardan gelen, çok farklı kalitede çözümlerle sonuçlandı.
  2. Kaynak kodunu okumak, tasarım becerilerinizi geliştirmenize yardımcı olmak için çok düşük bir düzeydedir: kod, genel tasarımdan daha düşük düzeyde karmaşıklığı giderir.

Yazılım tasarlamada gelişmenin en iyi yolu yazılım tasarlamadır * . Bunu yapmanın bir yolu, tasarım yarışmalarına bakmaktan geçiyor: TopCoder, UML tasarım dokümantasyonu ve Java ve / veya C # uygulamalarıyla tamamlanan 100'den fazla bileşen tasarımına sahip bir arşive sahiptir. İstediğiniz bitmiş bir bileşeni seçin, gereksinim özelliklerini okuyun ve gereksinimleri yerine getirmek için orijinal bir tasarım geliştirmeye çalışın. Bir veya iki saatini sorun hakkında düşünerek ve bir sınıf diyagramı çizerek geçirin, sonra kazanan tasarımı açın ve yazarın ne yaptığını okuyun. Tasarımını kendinle karşılaştırın, farklılıkları görün ve tasarımınızın daha iyi olup olmadığını görün. Yargıçların tasarıma nasıl puan verdiklerini görmek için rekabet puan kartını kontrol edin. Bu, tasarım becerilerinizi nasıl geliştireceğinize karar vermeniz için gereken geri bildirimi verecektir.


* Bu, yazılım tasarlama dışındaki şeyler için de geçerlidir: nitelikli geri bildirimle birçok kez bir şeyler yapın, söylediklerine dikkat edin - - ve ne yaparsanız yapın, daha iyi olursunuz.


1
TopCoder'ı dikkatime sunduğunuz için teşekkür ederiz, onu öğretim aracı olarak kullanmak için ilginç bir fikir.
neontapir

Lütfen, bir arşiv için bir bağlantı sağlamak için çok nazik olabilir misiniz TopCoder archive of 100+ component designs,. Bu tür dosyalar bulunamıyor.
StepUp

1
@StepUp İşte burada . Erişmek için giriş yapmanız gerekebilir.
dasblinkenlight

ASP.NET'in güzel tasarımını görmek istersem nerede görmeliyim? Sadece verdiğiniz bağlantıda "Bileşenleri bul" u gördüm.
StepUp

1
@StepUp ASP.NET çok genel. TopCoder bileşenleri daha belirgindir: SQL ayrıştırıcı, ifade değerlendiricisi, vb.
dasblinkenlight

11

İşini bırakma. Ondan öğrenebilmeniz için sizden daha iyi becerilere sahip birisiyle çalışmak daha iyidir.

Daha iyi tasarıma bakın ve neden daha iyi olduğunu belirleyin. Kabul edilen tasarımdan ders alın ve başka durumlarda simliar tasarımını nerede uygulayabileceğinizi düşünün. Bir kere neden tasarımınızdan daha iyi olduğunu öğrendikten sonra, bir dahaki sefere bir dahaki sefere yapmamak için neyin yanlış olduğunu biliyorsunuz. Diğer geliştiriciyle konuşun ve tasarımı nasıl bulduğunu sorun.

Tasarım becerilerini geliştirmek için yapılacak en iyi şey tasarımları oluşturmak, daha sonra bunları değerlendirmede ve nasıl geliştirilebileceklerini belirlemede kendinize acımasız olmaktır. Kendinize aşağıdaki gibi sorular sorun: Çalışacak mı ve her yönüyle gereksinimi karşılayacak mı, bakımı yapılabilir mi, bunu nasıl test edebileceğim, performans sorunlarına neden olacak mı, gereksinimin ne kadar muhtemel olduğu ve tasarımın ne kadar iyi olacağı değişim ile başa çıkabilmek. Tasarım kalıplarını okuyun ve ardından bunları tasarımlarınıza uygulamaya çalışın. Refialtor, intial bir tasarımla ortaya çıktıktan sonra acımasızca. Uygulama ile birlikte bir veritabanı tasarlıyorsanız, db'yi normalleştirme ve performans ayarlama hakkında kapsamlı olarak okuyun, bir veritabanının en etkili ve verimli çalışmasını nasıl sağladığınızı öğrenirseniz, veritabanı tasarımı hakkında çok şey öğreneceksiniz. Uygulamalar için tasarımınızı yaparken DRY ve SOLID ilkelerini düşünün. Yapmaktan kaçınmak için antipatterns hakkında okuyun.


3

Daha iyi bir tasarım tanımak önemli bir yetenek. Tasarımlara bakmakla ilgili önceki önerilerden bazılarını takip ederken bunu teşvik etmelisiniz.

Diğer tasarımı hangi kriterlere göre daha iyi değerlendirdiniz? Daha kolay ve anlaşılması kolay mıydı? Performans avantajı sağladı mı? Daha fazla genişletilebilir miydi? Tasarımları yargılamak için kullanabileceğiniz ve zaten tanıyabileceğiniz ayrıştırma, soyutlama, bilgi gizleme ve bileşen modülerliği gibi birçok tasarım ilkesi vardır.

  • Kriterlerinizi adlandırmaya çalışın, onları anlayın, genişletin ve diğer tasarımlara bakarken tekrar kullanın. Bir şeyleri kendiniz tasarladığınızda, bu kriterleri kullanmak ve tasarımlarınızı bilinçli bir şekilde onlara karşı ölçmek için sürecinizin bir parçası haline getirin. Ardından, ölçütlerinizi karşılamıyorsa tasarımınızı tamamen değiştirmeye veya atmaya hazır olun.

Aşağıdaki kaynaklardan bazılarının tasarımları için farklı ilkeler hakkında fikir edinebilirsiniz: http://www.cs.wustl.edu/~schmidt/PDF/design-principles4.pdf Google'da "Google Tasarım Yazılımı"

  • Yazılım tasarımı için, Nesne Yönelimli Tasarım veya İşlevsel Tasarım veya Yapısal Analiz Tasarımı gibi farklı modelleri anlayın. Bunlar, bir tasarım görevine yaklaşmak için tamamen farklı zihniyet olabilir ve her birinin üstünlük gösterdiği alanlar vardır. Bunları araç kutunuz için araçlar olarak öğrenin. http://userpages.umbc.edu/~khoo/survey2.html

  • Tasarımı uygulamadan ayırdığınızdan emin olun, iyi tasarım olarak gördüğünüz şeyleri çizmeye çalışın, dili ve uygulama özelliklerini üst düzey tasarım ilkelerinden ayırın. Ve "tasarım gözünüzü" ve iletişim yeteneklerinizi geliştirmek.

  • Son olarak, belki de en önemlisi, yaygın olarak okumak çok iyi bir araçtır - Fraktallardan Bayesian analizlerine, Bulanık Mantığa, Doğal Dil İşlemeye, daha sonra ve beklenmedik bir şekilde ortaya çıkacak fikirler için yem sağlayabilecek birçok ilginç şey vardır. Web ile eğlence ve kurgu için sadece geniş ve geniş kapsamlı konularla başa çıkabilirsiniz. Uzman olmanıza gerek yok, sadece şartlara ve fikirlere aşinasınız.

Biraz eğlenin - en azından biraz eğlenmiyorsanız, yapma!


2

Zaten ilk adımı aldın. Öğrenecek bir şeyin olduğunu, meslektaşının çalışmalarının seninkinden daha iyi olduğunu ve öğrenmek ve geliştirmek istediğini kabul ediyorsun.

İkinci adım analiz etmektir. İşine bak ve sadece daha iyi olduğunu söyleme; anlamaya neden daha iyi olur. Daha iyi olduğu belirli detayları ve noktaları arayın.

Bunu anladığınızda, arkasındaki prensipleri çıkarın. Bunun gibi sorular sorun:

  • Peki ya bu tasarım benim tasarımımdan daha iyi?
  • Bu nokta, bu tasarıma özgü bir şey midir, yoksa gelecekte diğer tasarıma uygulanabilecek genel bir ilke midir?
  • Genel bir prensipse sınırları nedir? Ne zaman böyle şeyler yapmamak iyi bir fikirdir ? (Bu çok önemlidir. Uygun olmayan durumlarda bile, bazı faydalı fikirleri altın çekici olarak görmenizi engeller .)

Her şeyi kendi başınıza anlamaya çalışın, çünkü sizi kendiniz sonlandırmaya yönlendiren bir akıl yürütme zincirini yakaladıysanız fikirleri daha iyi içselleştirirsiniz, ancak aynı zamanda bir şeyler elde ettiğinizden emin olmak için iş arkadaşınızla konuşun sağ. (Gerekçenizde hata yapmaya ve kötü bir prensibi içselleştirmeye gitmek istemezsiniz, sonradan.) Ve bir şeyleri çözemezseniz iş arkadaşınızdan yardım istemekten çekinmeyin. Programlama, alçakgönüllülüğün saygı duyulduğu bir disiplindir ve birçok kodlayıcı birisine yeni bir şey öğretme şansına atlayacaktır, bu muhtemelen StackOverflow'un neden bu kadar hızlı büyüdüğünün büyük bir parçasıdır.


2

Ayrıca (büyük cevaplara ek olarak) "Benden daha iyi bir tasarım yaratabilir" den daha fazlası olduğunu da eklemek isterim. Diğer cevaplar, her şey ve iyi olan Tasarım'da nasıl daha iyi olabileceğinize odaklanıyor ... ama ...

Sizi, iş arkadaşınızdan daha iyi bir şeyler yapabileceğinize bahse girerim. Sinir bozucu bir eşleşme ya da başka bir şey yaratmak için değil (Y'yi daha iyi yapabilir misin? Seni boşver, X'i daha iyi yapabilirim!), Ama herkesin güçlü ve zayıf yönlerinin olduğunu doğrulamak için.

İşimde 4 geliştirici var. İki ana "programcının" beni sadece tozda bırakacak şeyler yaratabildiği zamanlar oluyor. Kafamın başını yarattıkları etrafına sarmaya çalışırken başım dönüyor.

Ancak SQL ve komut satırı komut dosyalarında olduklarından daha iyiyim ve THEM'i toz içinde bırakan şeyleri otomatikleştirebiliyorum.

Onlar benden daha mı iyi? Bazı bölgelerde kesinlikle. Cehennem, birçok alanda onlar - Ben dükkanımdaki genç geliştiriciyim ve bireysel olarak onlarca yıllık tecrübem var. Bu yıllar süren deneyime rağmen, bazı bölgelerde olduğundan daha iyiyim.

X'te birisinin senden daha iyi olduğuna odaklanmayı bırak. Bu kişi, denemeden ve hatta düşünmeden, önümüzdeki 10 yıl boyunca pratik yaptıktan sonra bile sizi tasarlayabilir. Zayıf yönlerinizi hiç düzeltmek için çalışmamanız gerektiği, ama bir zayıflığın olduğu her güçten daha fazla olduğunu unutmayın.

Her ikisine de odaklanın - Siz ve iş arkadaşlarınızla güçlü ve zayıf yönler.


1

Yaşamın her alanında, sizin kadar iyi olmayan insanları, hem de sizden daha iyi olanları, özellikle de yalnızca "birkaç yıllık" bir deneyimden sonra bulacaksınız.

Herkesten öğrenmelisin.

Kötü hissetme. Belki meslektaşınız doğaldır. Onu içtenlikle tebrik etmeli ve ondan elinizden geldiğince öğrenmelisiniz.

Profesyonelliğin kıskançlıkla, öğrenmeye yönelik bir fırsat arasında kalmasına izin vermeyin.


1
  1. Birkaç yıl aslında pek değil. Ve daha iyi ya da en kötü üst düzey tasarım manzarasına sahip insanlar var. Mesela bir göz açıp kapayıncaya kadar düşük seviyeli programlar için karmaşık algoritma yazabilen, ancak daha üst seviye tasarım ve uyum ve bağımlılık gibi kavramları anlama yeteneğine sahip olmayan insanları tanıyorum. Ancak bu fiili bir durum değildir. Her ikisi de daha yüksek seviyede tasarımda daha iyi olabilir (birkaç kitap okuyabilir, evde birkaç numara deneyebilirsiniz, vb.) Ve ayrıca programlamanın diğer alanlarında uzman arkadaşınızın daha az iyi olduğunu keşfedebilirsiniz. Ayrıca, hem deneyim hem de teknik bilgi konusunda aynı düzeyde olduğunuzu düşünüyorsanız, bu durum rastgele bir durum olabilir. Bir dahaki sefere belki daha iyi tasarım fikirlerine sahipsin. Ayrıca, işten ayrılmak yerine, bu fırsatı yakalayın ve meslektaşınızdan öğrenin. Bir dahaki sefere birlikte bir tasarım yapmak, sırlarını, düşüncelerini yakalamaya çalışın. Programlama bir zanaat gibidir, bunu yaparak ve başkalarının yaptıklarını izleyerek öğrenilir.

  2. Tasarım becerileri çoğunlukla tecrübe ile gelir ve birkaç önemli kitabı okuduktan sonra. Size aşağıdakileri tavsiye ederim:

    • Robert C. Marting - Çevik İlke, Örüntü ve Uygulamalar (biri Java'da diğeri C #'da 2 versiyon var. Hangisini seçtiğiniz önemli değil, fikir ve ilkeler odaklı bir nesneye uygulanabilir - ve yalnızca - kaynak kodu)
    • Bundan başka, Robert C. Marting'in başka ilginç 2 kitabı var: Temiz Kod ve Temiz Kodlayıcı
    • Martin tüm modern tasarım desenlerini ilk kitabında ele alsa bile, orijinal tasarım desenleri kitabını Dört Çete'ye bakmak istersiniz.
    • Son olarak, bugün çok ödüllü başka kitaplar da var: Testlerle Rehberlik Yapan Nesneye Yönelik Yazılımları Artırmak, M. Tüylerle Yeniden Bakmak (Sanırım) veya A. Cockburn'ün Etkili Kullanım Durumlarını Yazmak ve yolda birkaç tane daha keşfedeceksiniz.

Bu kitapların hiçbiri sihirli bir mermi değil, ancak ilk 2 tavsiyeyi okumak muhtemelen sonsuza dek programlama hakkındaki görüşünüzü ve algınızı değiştirecektir.


0

Sana ulaşmasına izin verme. Eğer hataları düzeltmek ve küçük programlar yapmak konusunda uzun yıllara dayanan deneyime sahipseniz, bu konuda çok iyi olursunuz. İş arkadaşınız muhtemelen daha büyük projeler tasarlamada yılların deneyimine sahiptir.

Altta yatan bitlere aşina olmak inanılmaz derecede kullanışlı, ancak tasarımda daha iyi olmak istiyorsanız, birkaç proje tasarlamak zorunda kalacaksınız. Beceri batana kadar tekrarlayın.

Kısacası, “yıllık deneyim” her zaman eşdeğer değildir. Git, yıllarını değerli kıl.


0

"İyileşmek" çoğu zaman tasarımlarınızı veya kodunuzu bir şeye / kişiye karşı daha iyi ölçmek, neyin farklı olduğunu dikkatlice karşılaştırmak, bu farklılıklar hakkında bilgi edinmek ve sürekli olarak buna dayalı tasarımlarınızı geliştirmeye çalışmak anlamına gelir. Daha fazla bilgi edinmek zorunda olduğunuzu öğrenmek konusunda çok kötü hissetmek, bu faydalı süreci yavaşlatır. Size bazen veya her zaman daha iyi bir karşılaştırma sağlayabilecek insanların (veya diğer kaynakların) olmadığı bir yere taşınırsanız, bahis işleminizi daha iyi öğrenmek ve yavaşlatmak için bu fırsatı kaybedebilirsiniz.

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.