Kod yazabilirim… ama iyi tasarlayamıyorum. Baska öneri? [kapalı]


83

Bit ve parça kod yazmakta iyi olduğumu hissediyorum, ancak tasarımlarım gerçekten berbat. Sorun şu ki, tasarımlarımı nasıl geliştiririm - ve daha iyi bir tasarımcı olurum?

Okulların ve kolejlerin insanlara matematiksel problem çözmede nasıl iyi olunacağını öğretmek için iyi bir iş çıkardıklarını düşünüyorum, ancak okulda oluşturulan çoğu uygulamanın genellikle 1000 - 2000 satır uzunluğunda olduğunu kabul edelim, bu çoğunlukla akademik bir egzersiz olduğu anlamına gelir. gerçek dünyadaki yazılımların karmaşıklığını yansıtmaz - birkaç yüz bin ile milyonlarca kod satırı arasında.

Topcoder / project euler gibi projelerin bile fazla yardımcı olmayacağına inandığım yer burasıdır, matematiksel problem çözme yeteneğinizi keskinleştirebilirler - ama akademik bir programcı olabilirsiniz; Güzel, temiz şeylerle daha fazla ilgilenen, çoğu uygulama programcısının uğraştığı günlük ve günlük saçmalıklarla tamamen ilgilenmeyen biri.

Öyleyse sorum şu, tasarım becerilerimi nasıl geliştirebilirim? Yani, birkaç bin kod koduna girecek küçük / orta ölçekli uygulamalar tasarlama becerisi? Daha iyi bir html editör seti veya gimp gibi bir grafik programı geliştirmeme yardımcı olacak tasarım becerilerini nasıl öğrenebilirim?


1
“Okulda oluşturulan uygulamaların çoğunun genellikle 1000 - 2000 satır uzunluğunda olduğunu kabul edelim; bu, çoğunlukla gerçek dünyadaki yazılımların karmaşıklığını yansıtmayan akademik bir alıştırma olduğu anlamına gelir”: On kişilik bir ekibin 6 ila 8 ay arasında oldukça karmaşık bir uygulama geliştirdiği yarıyıl yazılım projesi. Ayrıca, çoğu şirket (en azından Almanya'da), çalışmalarını tamamlamadan önce pratik yapmak isteyen öğrencilere kısa sözleşmeler sunar.
Giorgio

Yanıtlar:


87

Bir şeyde gerçekten iyi olmanın tek yolu, denemek, olağanüstü başarısız olmak, tekrar denemek, bir öncekinden biraz daha az başarısız olmak ve zamanla, başarısızlık durumlarınızı daha sonra yönetebilmeniz için neyin başarısız olduğunu belirleyen bir deneyim geliştirmek. Bu, yazılım geliştirmenin herhangi bir yönünü öğrendiği gibi, bir müzik aleti çalmayı, araba kullanmayı veya en sevdiğiniz birinci kişi nişancı oyununda ciddi bir PWN yaşı kazanmayı öğrenmek kadar doğrudur.

Gerçek bir kısayol yoktur, ancak deneyim kazanırken sorunların elinden alınmasını önlemek için yapabileceğiniz şeyler vardır.

  • İyi bir akıl hocası tanımlayın . Sorunlarını zaten ödemiş biriyle konuşabilmekten daha iyi bir şey olamaz. Rehberlik, öğrenmeyi hızlı bir şekilde izlemeye yardımcı olmak için harika bir yoldur.
  • Oku , biraz oku , ne okuduğunu uygula ve kariyerinin ömrü boyunca tekrar et. Bu işi 20 yıldan fazla bir süredir yapıyorum ve hala her gün yeni bir şeyler öğrenmeye başladım. Sadece ön tasarım hakkında değil, aynı zamanda ortaya çıkan tasarım, test, en iyi uygulamalar, süreçler ve metodolojileri de öğrenin. Hepsinin, tasarımlarınızın nasıl ortaya çıkacağı, şekilleneceği ve daha da önemlisi, zaman içinde nasıl devam edecekleri üzerinde çeşitli derecelerde etkisi vardır.
  • Tamirciye zaman bul . İşyerinizde bir skunkwork projesine katılın ya da kendi zamanınızı uygulayın. Bu, yeni bilginizi uygulamaya geçirerek ve böyle şeylerin nasıl çalışacağını görerek, okumanızla el ele gider. Bu aynı zamanda akıl hocanızla iyi bir tartışma yapmanızı sağlayan şeydir.
  • İş yerinizin dışındaki teknik bir konuya katılın. Bu bir proje veya forum olabilir. Şeylere dair taze bir bakış açısı sağlamak için yakın arkadaş çevreniz dışında teorilerinizi ve fikirlerinizi test etmenizi sağlayacak bir şey.
  • Sabırlı olun . Kazanma deneyiminin zaman aldığını kabul edin ve neden ve nerede başarısız olduğunuzu öğrenmek için bir süre geri çekilmeniz gerektiğini kabul etmeyi öğrenin.
  • Görevlerinizin, düşüncelerinizin, başarısızlıklarınızın ve başarılarınızın bir günlük veya blogunu tutun . Bu kesinlikle gerekli değil, ancak zaman içinde nasıl geliştiğinizi, becerilerinizin nasıl geliştiğini ve düşüncelerinizin değiştiğini görmenin sizin için çok faydalı olabileceğini öğrendim. Birkaç ayda bir kendi dergilerime geri dönüyorum ve 4-5 yıl önce yazdığım şeylere bakıyorum. O zaman ne kadar öğrendiğimi keşfetmek gerçek bir göz açıcı. Ayrıca zaman zaman bazı şeyleri yanlış yaptığımı hatırlatıyor. Gelişmeme yardımcı olan sağlıklı bir hatırlatma.

45
Deneme ve başarısızlık için +1. Çünkü neden bir tasarım deseni olduğunu anlamadığınızda, bu modeli etkili bir şekilde kullanamazsınız.
Mert Akcakaya

2
+1 harika cevap, ama bunun biraz eksik olduğunu buldum. Şimdiye kadarki en önemli katkının yeniden yapılanma için çok iyi bir iştahı olacağına inanıyorum. Yaz, teorinin söylediklerine bak (makaleler, kitaplar veya akıl hocaları), refactor / yeniden yazma, teoriye geri dön, refactor / yeniden yazma - bu, bildiğiniz kodlarla çalışırken yapıya odaklanmak için zaman verecektir. Kendi en kötü eleştirmeni ol. Ayrıca, kendi işinizi sürekli tekrar ziyaret etmek için bu iştahınızı asla kaybetmemenizin çok önemli olduğunu da söyleyebilirim.
vski

1
@vski İçine ekleyebileceğim birçok kavram var, ancak soru, bu kavramların, OP'nin kendisini gelişmiş bir tasarımcı olarak görmesi için gereken deneyimi kazanmada makul bir yol sağlayıp sağlamadığı. Cevabım kapsamında yeniden yapılanmayı uygulama olarak görüyorum (ikinci noktama göre). Öyleyse, Temiz Kod, İlk Test, BDD ve diğer pek çok konsept de uygulanmaktadır. Tasarım becerilerinin zaman içinde kazanılan tecrübe ve bilgiyle birlikte ortaya çıkacak ve büyüyecek bir noktaya gelmek için gereken birçok beceri ve deneyimin olduğu yaklaşımını benimsedim. :)
S.Robins

2
Mentor olmak için +1. İdeal olarak, mentorunuzun sizinle kod incelemeleri yapmasını sağlayın. Başka birinin kodunuzu okumasını ve eleştirmesini sağlamak, daha iyi ve daha temiz bir tasarım söz konusu olduğunda size gerçekten yardımcı olabilir.
Leo,

2
"Hiç denedi. Hiç başarısız oldu. Önemli değil. Tekrar dene. Tekrar başarısız. Başarısız." --- Samuel Beckett.
Peter K.

16

Eh, bu tür bir soru için altın elma yok ve belki de bunun her kodlayıcının kendisi için neyin doğru olduğunu bulmak için olduğunu hissediyorum. İşte benim almam, yine de.

Sen olabilir Konuyla ilgili kitaplar okuyun. Harika kitaplar Harika kitaplar Ancak bu kitapların yalnızca bir uygulama oluşturmayı ve tasarlamayı denedikten ve başarısız olduktan sonra size yardımcı olduğunu buldum.

Benim için her şey tecrübe ile ilgili. Çaylak olarak başladığımda nasıl dizayn edileceğine dair kitaplar okurum. O zamanlar içeriğin çoğunu anlamadım. Çalışmaya başladığımda uygulamaları kendim tasarlamak zorunda kaldığımda dağınık uygulamalar yaptım. Çalıştılar, ama sürdürmeleri acı çekti. Sonra o kitapları tekrar okudum - ve bu sefer onları daha iyi anladım.

Şimdi yeni hatalar yapmaya ve eskilerden öğrenmeye devam ediyorum.


10
Burada söylenmeye değer harika bir nokta var: Yeni hatalar yapmaya devam edin ; aynı eski hataları yapmaya devam etmeyin - onlardan öğrenin ve yeni şeyler yapın.
Bevan

11

Tasarlamayı bırak ve refactor kodunu öğren. Sürekli ve agresif yeniden yapılandırma ile artan gelişim, ön tasarımdan çok daha temiz bir son ürüne yol açacaktır.


2
Yeni ortaya çıkan tasarım güzel bir şey IMHO, ancak disiplin olmadan “yeni ortaya çıkan spagetti” yaratma riskini göze alıyorsunuz. Ön tasarımıyla ilgili sorun, insanların bir şeyi ya hep ya da hiç önerisi olarak görmeleri ve işler kötüye gittiğinde kötü bir temsilci olarak görmeleridir. Bu bana Joel'in tasarımın önemli olduğunu söylediği yazılarından birini hatırlatıyor . Gerektiğinde, bir tasarımın sizi, zamanınızı, kaynaklarınızı ve güzel destekleyici tasarımları temiz kodla organik olarak ortaya çıktığını görme şansını soymadan fark yaratması için önünüzde yeterli.
S.Robins

@ S.Robins: OP'nin hala TDD ve sürekli refactoring ile çok iyi bir şekilde tamamlanması için küçük projelere saldırdığını hissettim. Böylece daha karmaşık projeler için ne kadar tasarımın gerektiğini bilmek için gereken disiplini öğrenebilir.
kevin cline

Bunun olabileceğini düşündüm, ancak “herhangi bir ön tasarımın” tamamen ortaya çıkan bir şey için potansiyel olarak daha kötü olacağı fikrine bir sayaç eklemeye değeceğini düşündüm. Bununla birlikte, OP'nin aradığı gerekli deneyimi oluşturmanın yolunun tasarım konusunda daha az endişe duymak ve iyi faktörlü ve temiz kod yazmak yerine odaklanmak olduğunu kabul ediyorum. :-)
S.Robins

Yeniden yapılanmanın her zaman en iyi tasarıma yol açtığını kabul etmiyorum. Elbette, yeniden yapılandırma genellikle sorunu keşfetmenize ve anlamanıza izin verir, ancak iyi tasarım yeniden yapılandırma yoluyla her zaman artımlı olarak ortaya çıkmaz. Bazen çok daha iyi bir çözüm görüyorsunuz ve mevcut kodunuzun bundan çok uzak olduğunu farkedersiniz ki, yeniden yazma yeniden yapılanmadan daha hızlıdır.
Giorgio

Son zamanlarda bu deneyimi yaşadım: Tekrar tekrar, tekrar tekrar aynı sıkıntıları olan bir daireye girmeye devam ettim: Bir şeyi kodlamak için yineleyiciler kullanıyordum ve kod karmaşık hale gelmeye devam ediyordu. Sonra yineleyicileri unutmaya karar verdim ve kodun çoğunu yeniden yazmak zorunda kaldım, ancak mantık eskisinden çok daha net ve özlü hale geldi. Buna "agresif yeniden ateşleme" denir mi bilmiyorum: uygulamanın genel yapısı değişmedi, ancak bazı temel kısımlar atıldı ve sıfırdan yeniden yazıldı.
Giorgio

7

Kalıpları okuyun, elbette, ama her şeyden önce anti kalıpları okuyun. Anti-kalıpları tanımak önemlidir ve bir şeyin neden olması gerekenden daha fazla yapılması gerektiğini anlamak kolaydır.

Örneğin http://sourcemaking.com/antipatterns/software-development-antipatterns adresine bakın .

Gereksinimler değiştiğinde hızlı bir şekilde ayarlanabilmesi için kodu yazın (üretim ortamında çok yaygındır).

"Sadece bir tane daha küçük kesmek" eklemek konusunda şüpheci olun. Burada bir tane daha var, bir tane daha var ve kod anlaşılamıyor.

Değer Veren açık / kapalı prensibi .

Testleri yaz (TDD'deki gibi). Tasarımınızı, gerçekte uygulamadan önce bile düşünmeye zorlarlar.

Açık kaynak kodlu projelerin koduna göz atın (makul boyutta olanlar, yani). Eskiden bu kadar çok soyutlama seviyesini görünce şaşırırdım. Şimdi anlıyorum, sanat uğruna sanat değil, bu şekilde yapılmasının bir nedeni var.


4

İyi tasarım için çok önemli bulduğum bir prensip ayrıştırmadır: eğer bir sınıf çok büyükse (yani 300-400 kod satırından daha büyükse) daha küçük sınıflara ayırır; eğer bir yöntem çok büyükse (örneğin, 50'den fazla kod satırı) onu ayrıştırın; Eğer bir proje 50'den fazla sınıf içeriyorsa, onu çözün.

Kilit nokta, sisteminizin boyutunu tahmin etmek ve kodunuzu, aralarındaki net ilişkiler ve birkaç bağımlılık ile anlaşılabilir birimler halinde ayrıştırabilmenizi sağlayan birkaç soyutlama katmanı (örn. Alt sistem, uygulama, proje, modül, sınıf, yöntem) oluşturmaktır.


1
Önerinizde bazı haklar olsa da, kod satırları gerçekten önemli değil, davranışlar. Eğer yönteminiz birden fazla şey yapıyorsa, muhtemelen onu yeniden düzenleme zamanı gelmiştir. Eğer bu bir şey sadece kendi başına bir şeyler yapan ve onları bir araya dikilen yöntemleri çağırıyorsa, sorun değil.
jer,

1
@ jer: Elbette bu bir kuraldır. Diğer 100 yöntemi çağıran bir yöntem, söylediğiniz gibi, sadece bir şeyleri dikiyor (alt işlevlerin bir listesini çağırıyor). Bazı gerçek mantık içeren yöntemler hakkında daha fazla düşünüyorum: bir yöntemin ne yaptığını anlamak için ileri geri kaydırmanız gerekiyorsa normalde kötü bir işarettir. Aynı şey, birçok üyeli bir sınıf tanımına bakarsanız (ve sınıf sadece büyük düz bir mülk topluluğu değildir).
Giorgio

"Proje 50'den fazla sınıf içeriyor, ayrıştırmak" ciddi değil
dinamik

@ yes123: Bir fikir vermesi gerekiyordu. Bu gerçekten ne geliştirdiğinize, hangi dilde, vb. Bağlıdır
Giorgio

Bunun, önceden tasarlanmaya yardımcı olmayacağına (yeniden canlandığınızdan beri), ancak gelecek tasarımlarınızı geliştirecek kalıpları ve en iyi uygulamaları öğrenmeye yardımcı olacağını not etmenin mantıklı olacağını düşünüyorum.
Craig Bovis

0

Bu zor, gerçekten bahsettiğimiz şey daha iyi kod oluşturmak yerine soyutlama yeteneğidir, ancak iki şey sizi daha iyi hale getirir ve bir şey sizi daha mutlu eder:

"Daha iyi"

A) Yapabileceğiniz en iyi tasarımcısını bulun ve birlikte bir program çizin / bir tasarım yapın. Sorunu ele aldıklarında ne düşündüklerini açıklamalarını, “sadece doğru hissettirdiğini” söyleme ve kazmaya devam etmelerini isteyin. Bu süreç “mentorluk” partisine de yardımcı olacak

B) Her şeyi bireysel aktörler ve aralarındaki konuşmalar olarak hayal edin. Oyuncuların her birinin tek bir rolü / sorumluluğu olmalı ve grupları farklı sistemleri ele almalıdır. Bu konuşma işe yarıyorsa ve her oyuncu tutarlı ve uyumlu hissediyorsa, o zaman yoldasın demektir.

Ve "Mutlu"

C) Elinden gelenin en iyisini yaptıysanız ve hala gerçekleşmiyorsa, o zaman bazı insanların bazı şeyleri yapamayacağını kabul etmekte yanlış bir şey yoktur. Sıkı, mükemmel bir kod yazabilir, ancak asla tasarım veya mimar yapamazsınız. Ne olmuş yani? Şekerleme için fiziksel sporlar oynayamıyorum, iyi görünmüyorum ve araba sürmem ortalamadan daha iyi olamaz. İyi olduğun şeyleri ortaya koy ve kullan.


-1

Benim kişisel deneyimime göre, başkalarını oku kod "ilham" için iyi bir kaynaktır. Yani, diğer insanların tasarımlarını anlamaya çalışın ve kendinize neden böyle şeyler yaptığını kendinize sorun.

Araştırma için bir çok açık kaynaklı proje bulabilirsiniz.

Neyse, pratik yapman gerekiyor.


-1

Korku içinde yaşama

Sadelik için gayret

Kullanıcılarını dinle

Birçok fikir deneyin

Bir şey yarat, sonra daha iyi yap

Değer katan şeyler üzerinde çalışın, olmayan şeyleri bırakın


-1

Doğru soruları sormayı öğrenin. Çoğu zaman, soruna farklı bir açıdan bakarak tasarımınızı geliştirmeyeceksiniz. Özellikle bu, eldeki problemi çözmeye odaklanmaktan uzaklaşmanıza ve çoklu problemleri çözen çözümlere daha fazla bakmanıza yardımcı olacaktır.

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.