Mimari tasarım boşa harcanan zaman durdurmak nasıl [kapalı]


53

Geçenlerde üniversiteden mezun oldum ve programcı olarak çalışmaya başladım. "Teknik" sorunları çözmenin ya da 1 çözümü olduğunu söyleyeceğim şeylerle hata ayıklamanın zor olduğunu düşünmüyorum.

Ancak açık bir çözümü olmayan bir problem sınıfı varmış gibi görünüyor - yazılım mimarisi gibi şeyler. Bu şeyler beni kandırıyor ve büyük sıkıntıya neden oluyor.

Programlarımı ve sistemlerimi nasıl "geliştireceğime" karar vermek için saatlerimi harcadım. Mesela - Bu mantığı 1 veya 2 sınıfa böldüm mü, sınıfları nasıl isimlendiririm, bu özel veya herkese açık hale getirsem mi, vb.? Sadece programı oluşturmak istiyorum - mimarlık lanet olsun.

Mimarlık aşamasını daha hızlı ve zevk aldığım kodlama ve hata ayıklama aşamasına nasıl geçirebilirim?


61
Daha fazlasını yaparak. Neyin işe yarayıp yaramadığını anlayacaksınız. Buradaki soruyu sormanın, gerçek kodun bağlamı olmadan aynı tartışma eğilimini takip ettiğine dikkat edin: yaparak yaparak harcanan zaman. Bu konuyu tartışmak eğlencelidir ve bazı desenler nesnel olarak diğerlerinden daha iyidir, ancak deneyimsiz anlamlı bir görüşe sahip olmak gerçekten zor (okuma: yara izleri).
Jared Smith,

5
Mimarlık sizin planlama aşamanızdır - doğru yapın ve bu, sizin kodlama, hata ayıklama ve kullanıcı kabulü olmakla birlikte, çabalarınızın% 90'ını oluşturur. Bunu Skipping ya da aceleye değil o zaman muhtemelen sizin için yapıyor başkası ihtiyaç yapıyor beğenmezseniz yüzden, unmaintainable, uzatılamaz çözümleri ile sona erebilir önerilmez ... adlandırma zor konularda biridir bir yazılım geliştiricisi olan bir geliştirici, 5 satırlı bir yöntem adı altında günlerce agonize edebilir. Başka bir şey olması gerekene kadar her şeyi özel yapın. Birden fazla şey yaptıklarında sınıfları ayırın.
Moo,

5
OOP durumunda, SOLID ilkelerini anlayarak ve kullanarak başlayabilirsiniz . Verdiğiniz kararların ardında bir neden vererek, bazı sorularınızı (örneğin özel veya genel olması, bazı mantıkları bölmek ya da bölmemek gibi) cevaplamanıza yardımcı olacaktır.
njzk2

8
Sorunun skorunun önerdiği kadar iyi olmadığını düşünüyorum. Soru çok fazla bağlamdan yoksundur . Ayrıca, programlamanın (belki de) yanlış öğretildiği hakkında bir şeyler yazıyor. Bilgisayar Bilimleri, tezgâhtarların yasalara göre felç olacak şekilde öğretilmemelidir.
Basile Starynkevitch,

3
“Kodlama haftaları size saatlerce zaman kazandırır.”
mickeyf,

Yanıtlar:


59

Mükemmel, iyinin düşmanıdır.

Bu, köşeleri kesmemelisiniz dedi. Yazılım tasarımı daha uzun süren bir etkiye sahip olacak ve gelecekte size (ve eşlerinize) zaman ve emek kazandıracak. Doğru olması daha uzun sürecek. Programlama için harcanan zaman çoğu klavyeyi etkilemez , ancak bir problemin nasıl çözüleceğini belirleyen bir beyaz tahta tarafından dövülür.

Ama aynı zamanda mükemmellik konusunda endişelenmemelisin. İki tasarım bir çıkmazla savaşırsa, aynı olasılıkla muhtemelen aynı iyilikte oldukları anlamına gelir. Sadece bir taneyle git. Bu tasarımdaki kusurları anladıktan sonra bir şeyleri değiştiremezsiniz sanki.

(Ve umarım teknik sorunları ayıklamak / çözmek için tek bir yol olmadığını öğrendiğinizde de size yardımcı olacaktır.)


25
Analiz yoluyla felç de akla geliyor.
mike65535

7
Bazen bir tasarım kararı için mükemmel son hakem çeyrekdir.
candied_orange

11
YAGNI ve KISS ve
GTFO

10
Bu cevabı okuyan herkes için - Tanrı aşkına, cimri uygulamalarını haklı çıkarmak için "Mükemmel, iyinin düşmanıdır" deme. Bu sözün amacı, sizi zor durumda bırakmamak, gevşememek ve Windows Vista ya da Apple III gibi kötü tasarlanmış bir çeşit karışıklık yaratmamaktır.
T. Sar - Monica

@ T.Sar: Vista'nın başarısızlığı neredeyse% 0 teknik başarısızlık ve yaklaşık% 100 MBA başarısızlığıydı.
whatsisname,

39

Basit ve küçük programlar için (örneğin, on binden az kaynak kod satırı ile), kod yazarken bunları oluşturabilirsiniz. Eğer varsa bir evlat iteratif ve artımlı geliştirme yaklaşımı , çünkü kademeli yol boyunca mimari kararlar verebilirsiniz: bu yüzden birkaç kod düzine hatları (bazı tek mikro özelliğini ekleyerek) yazma, herhangi bir uyarı, derleyici gelen testini dönene kadar bunları geliştirmek o Hata ayıklayıcınızı ve tekrarlayın.

Bu mantığı 1 veya 2 sınıfa bölüp, dersleri nasıl adlandıracağım, özel ya da halka açık hale getireyim mi?

Yapmamalılar. Ve küçük bir program için çok da önemli değiller (çünkü küçük, basit programların iyileştirilmesi daha kolaydır, örneğin isimleri değiştirmek, vb.). Yalnızca tutarlı olmanız ve kaynak kodunuzun okunabilirliğini önceliklendirmeniz gerekir . Zaman zaman, programınızın bazı küçük parçalarını hafifçe kırıcı hale getirmeye ihtiyaç duyabilirsiniz (ve bu önemli bir şey değil ).

Bunu birçok ücretsiz yazılım projesiyle (Linux çekirdeği gibi büyük olanları bile) karşılaştırın. Geliştiriciler, erken aşamalarda önemli ölçüde "mimarlık" için çaba harcamamışlardı. UML, neredeyse hiçbir zaman özgür yazılımda kullanılmaz . Ek olarak, birkaç ücretsiz yazılım projesinin kaynak kodunu inceleyerek biraz öğreneceksiniz .

Yeni başlayanlar olarak, ya kıdemli geliştiriciye güvenebileceğiniz (mimari kararlar veren) bir takımda büyük bir yazılım projesi üzerinde çalışacaksınız ya da küçük projeler üzerinde tek başınıza çalışacaksınız (tipik olarak, birkaç düzineden az kaynak kod satırları). İkinci durumda, zaman zaman başvurunuzu yeniden yansıtan artımlı mimari kararlar alacaksınız, ardından "mimari tasarım" doğal olarak gelişecektir.

Mimarlık aşamasından ve zevk aldığım kodlama ve hata ayıklama aşamasına nasıl daha çabuk geçebilirim?

Bir yıldan az süren, çok kolay bir şekilde çalışan küçük yazılım projeleri için: mimarlığı yapmayın. Genel tasarıma beyin fırtınası yaparak yarım saat harcayın. Daha sonra tekrarlı ve artımlı bir geliştirme yaklaşımıyla kod yazmaya başlayın : birkaç düzine satır yazın, uyarma yapana kadar derleyin (tüm uyarılar ve hata ayıklama bilgileri etkinken, örneğin C ++ için GCCg++ -Wall -Wextra -g ile ) ve basit bir statik kaynakta geçirin Kod analizörü, eğer varsa, örneğin clang-analyzer ), bu kodu bir hata ayıklayıcı ile test edin , versiyon kontrolünüze (örn. ) getirin, durulayın ve tekrarlayın. Ancak, teknik borçlardan kaçındığınızdan emin olun.git: bir şey kötü kokuyorken, iyileştirmek için (yeniden düzenleyerek ve yeniden uygulayarak) çalışın.

Öte yandan, bir ekip ortamında, mimarlık çalışması her ekibin sorumluluğunu tanımlamak için ilk tartışmayı gerektirir. Bu tartışma kıdemli geliştirici tarafından yönlendirilir (kim acemi değildir). Çevik yazılım geliştirme ve Efsanevi Adam Ayı hakkında bilgi edinin .

Sadece programı yaratmak istiyorum, mimarisi mahvolmuş.

Mükemmel sezgi (en azından küçük projeler için). Bu nedenle, programınız hakkında birkaç dakika düşünün ve onu yinelemeli ve artımlı bir geliştirme yaklaşımıyla kodlamaya başlayın : birkaç düzine satırı kodlayın ve iyi çalıştıklarından emin olun, sonra tekrarlayın. Bundan önce, benzer özgür yazılım projelerinin kaynak kodunu inceleyin (ve mimariyi gözlemleyin) ve daha genel olarak bazı bibliyografik çalışmalar ve araştırmalar yapın.

Gelen bazı durumlarda, bir düşün metaprogramming yaklaşımı: Eğer istediğiniz durumlar vardır oluşturmak bazı "kaynak dosyası" (örnekler gibi ayrıştırıcı jeneratörlerini kullanan dahil bizon gibi tutkal kod jeneratörleri yudum Google Protobuf ve bazen bir yazmak isteyebilirsiniz basit komut dosyası - veya GPP gibi genel bir ön işlemciyi kullanın - tekrarlayan kodlamayı önlemek için C ++ veya Java kodunuzun bir kısmını yayınlamak için).

PS. Ben bir araştırma mühendisiyim, bilgisayar bilimi alanında doktora derecesine ve 40 yıllık deneyime sahibim ve sorunuzun önerdiği gibi "mimarlık" yapmadım, orta ve büyük ölçekli projeler üzerinde ve birkaç büyük projede başarıyla çalıştım (GCC derleyicisinin kendisi) ). Benim için "mimarlık" önümüzdeki birkaç gün veya haftanın çalışmasının sadece planlama aşamasıdır (ve bunu genellikle hayal ederken veya uyurken, kesinlikle bilgisayarsız ve genellikle kalem bile olmadan) yapıyorum. Ayrıca, araştırma hibeleri yazarken , bir şekilde ve tamamen bir mimari tasarım yapıyorum.

Not: Bazı yazılım projelerinin diğerlerinden daha fazla mimariye ihtiyacı vardır. Örneğin, yapay bir kalbin veya bir nöroşirürji robotunun kontrol sistemini yazarsanız, ortalama cep telefonu uygulamasını yazarken yaptığınız gibi çalışmazsınız. Ayrıca bakınız Norvig's On yıl içinde kendinize programlama öğretin .


1
Genelde bana böyle geliyor. Programa başlamadan önce yeterince zaman veriyorum ve başladığım zaman, onu nasıl yapılandırmak istediğime dair birkaç net fikir edeceğim ve aslında oturup oturup düşünmek için bir şey ifade etmedim. Bu tür sorunları düzenli olarak ele alan birine doğal olarak akıyor.
Neil

1
GCC'nin kaynak kodu göz önüne alındığında, tamamen organik büyüme tipik olarak gelecekten insanların şükreteceği bir şey değildir. Gördüğüm GCC katkılarının çoğu, özellikle "işimi mümkün kılmak ve buradan çıkabilmek" gibi korkunç durumlara dayanıyor çünkü gerisi zaten böyle.
Kafein

1
Benim iddiam, yeterince büyük her kod tabanının organik olarak büyüdüğüdür (bkz. Gall kanunları ...). Ayrıca, büyük bir yazılım projesinin mimarisini acemiler için ele geçirmek tamamen aptalca olurdu
Basile Starynkevitch,

Cevabınızın ilk yarısında tanımladığınız iki boyut arasında bir yerde bulunuyorum. Projemiz on bin çizgiden uzun, ancak üzerinde tam zamanlı çalışan yaklaşık yarım düzine geliştiriciye ihtiyaç duyacak kadar büyük değil. Mimarlığımızı dikkatlice planlamaya ihtiyaç duyacağımız kadar büyük, ancak hepimizin mimari kararları kendimiz yapabilmemiz için ihtiyaç duyduğu kadar küçük bir pozisyondayız. Ya organik olarak büyümek ya da üst düzey bir geliştiriciden yardım istemek, özel olarak ekibim için işe yaramaz (Ama benim durumum da muhtemelen biraz nadir görülür.)
Kevin -

9

Akılda tutmayı sevdiğim üç slogan var.

  • "Herşey Mümkün Kadar Basit, Ama Daha Basit Olmamalı"

    "Bir veya iki sınıf?" Örneğini almak için, "basit çözüm hangisi?"

  • "Bariz hata yok" karşı "Açıkçası hata yok"

    İkincisi tercih edilir!

    Ve işte bu yüzden basit olmasının nedeni budur, yani bunun için sebep olabilirsiniz. Büyük bir sınıf (ya da olabilir) hakkında çok fazla büyük ve karmaşık olabilir, bu durumda birkaç küçük sınıfa böldüğünüzde, “Her sınıf küçük ve yapacağı şeyi yapar - arayüzleri basittir ve doğru şekilde birleşirler. ”

    1. Kod teoride çalışmalıdır (yani kafanızda).
    2. Daha sonra pratikte işe yaramazsa, uygulama teoriyle eşleşene kadar hata ayıklayabilirsiniz.

    Bazen bir acemi bazen 1. adımla uğraşmaz, yani onu kafanızda çalıştırır (örneğin, çok karmaşık olduğu için) - ancak bu durumda sadece “teoride” değil “sadece kazayla” koşar bariz olmayan böcekleri bulmak için yeterince test etti.

  • Gall kanunu

    Bu aka "refactor" dır.

    Uygulamada bunun anlamı:

    1. Çalışan bir [ny] basit sistemle başlayın
    2. Şimdi yeni bir özellik ekleme zamanı
    3. Var olan sistemi yeniden düzenleyin, böylece yeni özelliğin eklenmesi kolay (yani) kadar
    4. Yeni özellik ekle

    5. ... ve yukarıdaki gibi tekrarlayın

    Bu, YAGNI gibi sloganlarla eşleşir, yani gerekmeden önce refaktör yapmaz (mimarlık için endişe duymazsınız) ... fakat tam zamanında doğru mimariyi, yani belirli bir amaç için ihtiyacınız olduğunda yaratın.


6

Yapabileceğiniz şey, ihtiyaç duyduğunuz en az sayıda soyutlama ile başlamaktır. Örneğin, bir dosyadaki bir Person sınıfı. Artık kod ve özellikler eklemeye devam ettikçe, farklı bir soyutlamaya taşınması gereken şeyleri görmeye başlarsınız. Örneğin, tek bir sorumluluk ilkesi (SOLID S), Person sınıfında adres ayrıştırma ile ilgili yöntemlere sahip olmadığınızı söyler. Yani artık bir Adres sınıfına ihtiyacınız olduğunu biliyorsunuz.

Ancak sisteminizde "minimal sayıda soyutlamanın" neye benzediğini düşünmek için biraz zaman ayırmak her zaman iyidir. Yeterince iyi bir mimariden başlayın ve kullandıkça geliştirin.

edit: @Basile answer, minimal mimaride nasıl yineleme ve geliştirme konusunda bir örnek verir.


4
Katılmıyorum. En az sayıda soyutlamayı kullanmaya çalışmak amaç olmamalıdır. Uzun vadede uygulanabilir bir yapı inşa etmek daha önemli olan şeydir. Sadece gerekli minimum zamanı önceden düşünmekle kalmayıp, başkalarının da çok gelecekte kullanabilmesi için kodu oluşturmayı düşünün. Soyutlamalar kodu daha okunaklı ve uygulanabilir hale getirirse, bu açık bir gelişmedir. Yeniden kullanılabilir, modüler bir kod yazmayı tercih ederim. Bu, bunu yargılamak için bir deneyim meselesi olduğunu söyledi.
Savaş

@Battle Amacınız, gelecek geçirmezliğin eşit derecede önemli olduğu, değil mi? Buna katılıyorum, ancak idealin gelecekteki kalkınmayı da göz önünde bulunduran en az sayıda soyutlamayı içeren bir program oluşturmak olacağını düşünüyorum . Şimdi ve gelecekte faydası olmayan keyfi bir soyutlamanın sadece programınızı daha da kötüleştirdiğini, daha iyi olmadığını iddia ediyorum.
Neil

2
Gerçek dünyada, yazılımın kullanımıyla ilgili çok fazla bağlamınız olacak, böylece minimal mimariniz şu anda bilinen kullanım durumlarının çoğunu kapsayacak. Bence bu sana iyi bir başlangıç ​​noktası verir. Modülerlik ve yeniden kullanılabilirlik çoğu zaman işlevsel olmayan gereksinimlerdir. Bu şekilde gelirlerse, klavyenizdeki yoksaymak ve çekiçle vurmak sorun değil. Ancak evet, asgari soyutlama nihai hedef olmamalıdır. Fakat çok iyi bir başlangıç ​​noktası olabilir.
sul4bh

@Neil - Evet, geleceğe dair provadan bahsediyordum ve kodun yapılandırılması ve bunun bir parçası olarak soyutlamalar ile ilgili olduğunu düşünüyorum. Ama keyfi soyutlamalar hakkında değil, onları en aza indirgeme amacından bahsetmiştim, sanki kendiliğinden kötü bir şeymiş gibi. Kötü yaptıkları zaman kötüdürler.
Savaş

3
@Battle: Önceden yapının eklenmesi "sadece durumunda" kolayca mühendisliğe yol açar. Tecrübelerime göre, sadece her zaman kod tabanının mevcut boyutu için gerekli olan soyutlamaların sayısına sahip olmak "gerçekten iyi bir amaçtır - daha az değil, daha fazla değil. Kod tabanı büyüdüğünde, önceden değil, soyutlamalar eklenmelidir. Bu cevabı nasıl okudum.Ama belki "minimal sayıdaki soyutlamalar" ifadesi yanlış yorumlanabilir
Doc Brown

5

Bir sistemin mimarisini düşünerek harcanan zaman boşa harcanmaz.

Sorunuzun "mimari kararlar almak için nasıl daha verimli olabilirim?" Olarak yeniden ifade edilebileceğine inanıyorum.

Buna kısa cevabım şöyle olacaktır: Kararları güvenilir ve verimli bir şekilde almanıza izin verecek temel prensipleri keşfetmeniz gerekir ve sonrasında gerçek dünyadaki bir yazılım parçasını ortaya çıkarmanız ve şekillendirmeniz gerekir. Bu bilgi, deneme, yanılma ve kişisel gelişim için uzun bir yolculuk olacak.

-

Ve daha uzun bir cevap için ...

İlk önce kavramları açıklamalıyım: Süreçler, hizmetler, API'ler ve veritabanlarıyla çalışırken karmaşık bir yazılım sisteminin yapısını tanımlamak için mimari kelimesini kullanıyorum . Tasarım kelimesini , sınıflarla, fonksiyonlarla ve kütüphanelerle çalışırken daha karmaşık bir sistemden yalnızca bir parçanın yapısını tanımlamak için kullanırım. Bunlar benim tanımlarım, bazı insanların farklı tanımları var. Ancak bu bağlamda, tasarım hakkında konuştuğunuzu düşünüyorum .

Bu konuyu tartışırken akılda tutulması gereken 3 önemli şey olduğunu düşünüyorum:

  • mimari ve tasarım, şema veya dökümantasyonla açıkça tanımlanmadan, ayrıca bir ekip veya bir kişi ( mimar ) tarafından muhafaza edilmeden de mevcuttur . Her sistemin kendine özgü bir mimarisi ve post-olgusal olarak tanımlanabilecek özgün bir tasarımı vardır.

  • yazılım geliştirme programlama değildir, zamanla programlamadır. Bu ayrımı yapıyorum çünkü bunun sektöre gelen insanlar için en büyük kör noktalardan biri olduğunu düşünüyorum (zamanın bir noktasında dahil oldum). Bunun anlamı, üniversite projelerine veya kişisel yan projelere kıyasla, gerçek dünyadaki bir yazılım sistemi üzerinde çalışmanın katlanarak daha karmaşık olmasıdır, çünkü herhangi bir mimari kararın sistemin gelişimi üzerinde zaman içinde büyük bir etkisi olacaktır. Kararlarınız şimdi sizi rahatsız etmek için geri dönecek, garantili.

  • çünkü mimari ve tasarım içsel olarak var olduğu için ve kod temeli zamanla gelişen canlı bir şey olduğundan, mimari ve tasarımın da gelişmesi gerekir. Doğru zamanda alınan bilinçli kararlar yoluyla kontrollü bir şekilde ya da kodlama tarafından yönlendirilen düzensiz olarak gelişeceklerdir. Bunu anlamak çok önemlidir, çünkü "önce mimar ve ikinci kodu yaz" ın geleneksel yaklaşımının hatalı olduğu anlamına gelir. Tabii ki, bir projeyi sıfırdan başlatırken, bazı mimari ve tasarım çalışmalarının önceden yapılması gerekiyor. Ancak bunun dışında, sistemi geliştirirken hala vereceğiniz birçok mimari ve tasarım kararı olacaktır.

Yukarıdakileri daha da belirginleştirmek için, kod yazarken, bilinçli olsun veya olmasın, tasarım kararları alacağınızın farkında olmanız çok önemlidir . Bu kararların çoğunu bilinçli ve eleştirel bir şekilde almak için çaba göstermelisiniz, çünkü alınan kararların gelecekteki çalışmalar üzerinde büyük bir etkisi olabilir (bu etki genellikle kod tabanındaki hataları düzeltmek veya özellikleri uygulamak için çok zorlaşır hale gelir). Robert C. Martin bunu "Güzel Mimari" adlı kitabında (bu arada tavsiye ettiğim) verilerle güzel bir şekilde gösteriyor.

Öyleyse, mimarlığın ve tasarımın neden önemli olduğunu biliyoruz, iyi karar vermemiz için bize uygun bir çerçeve sağlayabilecek temel ilkeler nelerdir? Kariyerimde bu soruyu daha önce yaşadım, araç setimde eksik olan bir şey olduğunu hissettim, ancak ne olduğunu bilmiyordum, nasıl tarif edeceğini bilmiyordum, ya da aramaya gitti. Zamanla keşfettiğim bu ilkelerin bazılarını paylaşacağım ve umarım hayatınızı biraz daha kolaylaştıracaklardır:

  • Martin Fowler’in “Refactoring: Mevcut Kod Tasarımını İyileştirme” kitabını okuyarak çok basit ama güçlü bir kodlama hilesi yakalanabilir. Burada listelenecek çok fazla şey var, ancak bunlar kod yapınızı büyük ölçüde iyileştirmek ve tasarım kararlarını almanıza yardımcı olmak için verebileceğiniz çok düşük seviyeli kodlama zamanı kararları. Kitap aynı zamanda birim testlerini kişisel iş akışınıza entegre etmek ve test edilebilir kodları yazmak için iyi bir örnek teşkil eder.

  • Özellikle OOP için, SOLID ilkelerine bakmalısınız . İlk başta aklınızı sarmak biraz soyut ve zordur, ancak çok güçlüdür. En hızlı şekilde faydalanmak için ilk 2 ile başlamanızı öneririm:

Tek sorumluluk prensibi : bir sınıf sadece tek bir sorumluluğa sahip olmalıdır (yani, yazılımın spesifikasyonunun sadece bir kısmındaki değişiklikler sınıfın spesifikasyonunu etkileyebilmelidir).

Açık / kapalı prensip : "yazılım varlıkları ... uzatma için açık, ancak değişiklik için kapalı olmalıdır".

  • Kalıtım üzerine kompozisyon kavramı

    sınıfların polimorfik davranışa ulaşması ve bir temel ya da ana sınıftan miras almak yerine, kodlarının bileşimleri tarafından yeniden kullanılması (istenen işlevselliği uygulayan diğer sınıfların örneklerini içererek) kullanılması ilkesidir.

  • birleştirme ("yazılım modülleri arasındaki karşılıklı bağımlılık derecesi") ve uyum ("bir modül içindeki öğelerin bir arada olduğu") kavramları
  • KURU (Do not tekrar) kavramı
  • Komut / sorgu ayırma kavram ( "Her bir yöntem değildir, hem bir işlem gerçekleştiren bir komut veya arayan için veri döndüren sorgu olmalıdır, fakat ya da")
  • durumsuz ve durumsuz sistem kavramı (benim temel kuralım: durumdan kaçınmak; mümkün olduğunca durumsuz sistemler kurmak).

Elbette bunlar sadece kurallar değil kavramlardır. İlk adım, onları anlamak ve onların farkında olmaktır. Daha sonra bunları pratikte kullanmak ve bunları ne zaman izlemeniz gerektiği ve ne zaman yapmamanız gerektiği üzerine deneyimler edinerek gelebilirsiniz. Ve sonra, bu kavramları, olumsuz yanlarını ve birbirleriyle olan karmaşık etkileşimlerini anlamanızı sürekli hale getiren bir süreç var.

Sanırım size verebileceğim en değerli tavsiye şudur: Kendinize sabır gösterin. Daha uzun ama doyurucu bir yoldan başladın. Çalışmaya ve deney yapmaya devam edin, neyin işe yarayıp neyin işe yaramadığını not edin, ancak zamanla daha iyi olacaksınız.


Bu, birinin deneyimle öğrenmesi gereken bir şeydir. İşinizin yarısı ve bunu kötü bir şekilde yapmak çok pahalı ama okulda öğretilmedi çünkü Bilgisayar Bilimi ve yazılım geliştirme neredeyse tamamen farklı şeyler.
No U

1

Tanımladığınız şeylerin çoğu gerçekten (önemli) mimari değil - iyi adlandırma ve iyi sınıf tasarımı sizin için ikinci nitelikte olması gereken bir şeydir. Bu sadece kodunuz arttıkça daha iyi olacaktır. Bu tür endişeler için en faydalı olanı genellikle çift programlamadır - bu tür problemlerin netleşmesine yardımcı olur ve bunun verimli bir şekilde nasıl yapıldığını öğrenmenize yardımcı olur.

Projenin ÖNCE mimarlığın gerekli olduğu yerler:

  1. Kesin gereklilikleri ve işlevsel olmayan gereklilikleri toplayın (kaç isteği / saniye desteklemem gerekiyor?). Bu aşamadaki herhangi bir uyumsuzluk kodlama cehenneme yol açacaktır - gerçek zaman kaybettikten, can sıkıcı ve bazen imkansız olduktan sonra kaçırılan fikirleri entegre etmek. Bunun kodlama kadar eğlenceli olmadığını biliyorum ama kod için tasarlanmadığı bir şeyi yapmayı denemek daha az eğlenceli.

  2. Uygunsa, sisteminizin sınırlı bağlamlarını tanımlayın ve kelime dağarcığınızın doğru olduğundan emin olun; örneğin, işletme "Frobbels" hakkında konuşursa, sınıfları / arayüzleri vb. "*** Frobbels" olarak adlandırdığınızdan emin olun. Kulağa önemsiz geliyor, ancak iş akışları hakkında konuşursanız, işletme işlemler hakkında konuşulurken çeviri çok can sıkıcı hale gelir.

  3. Birden fazla kişiyle / ekiple çalışıyorsanız arayüzlerinizi erken tanımlıyor ve tüm varsayımların ve sorunların herkes tarafından anlaşıldığından emin olun - paylaşılan bir bağlamınız yoksa entegrasyon "eğlenceli" olacaktır. Örneğin, bir muz resim üreticisi oluşturuyorsunuz, ancak ön uç ekibinizin bir elma resim üreticisine ihtiyacı var. Veya 100 istek / saniye cevap verebilecek bir şey yaparsınız, ancak 10000 r / sn gereklidir.

Not: Bu, bir mikro servis mimarisindeki çalışmalarımdan büyük ölçüde etkilenir. Servislerin dahili olarak nasıl inşa edildiğine de dikkat çekiliyor - ama çoğu zaman büyük resmi doğru yapmaktan çok daha az önemli.


1

Size bir sürü terim ve kısaltma atmayacağım (çoğu kodlayıcıların / yazılım mühendislerinin çoğunluğu tarafından çok az anlaşılıyor). Bunun yerine, aşağıdakileri göz önünde bulundurun:

  1. Öğreniyorsunuz - zaman kaybetmiyorsunuz, farklı yaklaşımlar deniyorsunuz ve neyin işe yaradığını öğreniyorsunuz. Bunu, çok önceden planlamadan, akla gelen ilk çözümle ilgili bir soruna dalarak ve işe yaramadığı ya da çalışmadığı zamanlarda değiştirerek yapabilirsiniz. İyi çalışıyorsa, harika! Bir soruna basit bir çözüm buldunuz. Basit çözümler iyi çalışırlarsa iyidir, bazen de yeterince iyidirler .

  2. Her şey bir değişmedir - aynı sistemi birçok farklı şekilde tasarlayabilir, zaman ve mekanda işlem yaparak, karmaşıklık ve esneklik, soyutlama ve okunabilirlik veya mümkün olan birçok travmadan biriyle işlem yapabilirsiniz. Hiçbir çözüm, her yönden mükemmel değildir ve hiçbir kural, yazılım mühendisliğinde istisnasız değildir. Kim sana aksini söylerse, saf ya da bir şey satar.

  3. Yeni bir mezun olarak, kodlama ve hata ayıklama çok heyecan verici olabilir, ancak bu zamanla tükenir ve şimdi öğrendiğiniz beceriler size geldiğinde size iyi hizmet eder.

  4. Bina yazılımının mühendislikten ziyade sanat / zanaat olduğunu iddia ediyorum. Büyük sanat sadece bireysel darbeler hakkında değil, sanatçı / zanaatkarın verdiği yüksek düzeydeki kararlar ve tradeofilerle ilgilidir.


1

Bir web geliştirme açısından gelen bu soruyu cevaplamaya çalışacağım (yani: insanların mimarlık üzerinde çok fazla acı çektiği bir alandan geliyorlar). İnsanların neden mimariye önem verdiklerini açıklamakla başlayacağım ve daha sonra mimarlık bölümünü daha hızlı geçmenin yollarını belirleyeceğim.

Mimari, kodunuz için iki şey yapar:

  1. Sizin ve başkaları için kodunuzu anlamayı kolaylaştırır.
  2. Kodunuzu genişletmeyi ve entegre etmeyi kolaylaştıracak şekilde yapılandırmanıza yardımcı olur.

Kod stili, size kod boyunca gezinmek için tanıyabileceğiniz ve kullanabileceğiniz kurallar sağlayarak kodun belirli bir bölümünü okumayı kolaylaştırır. Aynı şekilde iyi bir mimari, belirli bir özelliği işleyen kodu gerçekte nerede bulacağınızı belirlemenize yardımcı olur. Örneğin, çoğu web projesinde mimari, klasörlerin ve dosyaların nasıl sıralandığına yakından bakmaktadır. Diğer tarafta, iyi bir mimari, kod hakkında daha az düşünmenize yardım etmelidir, çünkü zaten tüm kodların ait olduğu sezgisel bir yere sahip olmalıdır.

Ek olarak, iyi bir mimari, kodunuzun kolayca kullanılmasını engelleyebilecek tuzakların çoğundan kaçınmak için bir kısa yol sağlar. Yine, eğer bir mimari karar verirseniz, kod yazma konusunda daha az düşünmenize yardımcı olacak bir kongre düzenlemelidir.

Şimdi aslında sizin için burada olduğunuz kısım:

Mimari kısmı daha hızlı nasıl başarabilirsin?

  1. Yapma

Pek çok cevabın hepsinin işaret ettiği gibi. Öncelikle gerçekten mimariye ihtiyacınız olup olmadığını sorun. Çok fazla kodunuz olmayacaksa (ve projenin yakın gelecekte büyümesi konusunda makul bir eminiz yoksa), mimarlık kısmını atlayıp basitçe işe yarayan bir şeyi bir araya getirebilirsiniz. Ancak, kariyerinizde erken yaşta olursanız, ne zaman yapabilirseniz pratik yapma fırsatını kullanırım. Bir noktada daha büyük projeler yapacaksınız ve bu noktada muhtemelen öğrenmek için geç kaldı.

Bununla beraber, mimariyi daha az zahmetli hale getirmek için ne yapabilirsiniz?

  1. Erken yap
  2. Çalmak
  3. Öğren / Yap
  4. Abartma

Bir mimariye karar vermek, planlama sürecinin erken bir parçası olmalıdır. Ne tür bir uygulama / program / web sitesi yapacağınız hakkında bir fikriniz olduğu sürece, bunun nasıl bir mimariyi destekleyeceğini düşünmelisiniz.

Bu noktada utanmadan çalma zamanı geldi. Bir program mimarisinin nasıl düzgün bir şekilde kurulacağına dair birçok literatür var ve bu mevcut mimari prototipleri şaşırtıcı miktarda kullanım senaryosunu kapsıyor. Bunları nasıl uygulayacağınızı bilmiyor olsanız bile, orada ne tür mimarilerin olduğuna dair kabaca bir genel bakış öğrenmelisiniz.

Bir tür mimariye yerleşmişseniz, buna bağlı kalın. Çoğunlukla, mimari karar sezgisel olmalı ve yalnızca ilk kurulumdan birkaç saniye sonra alınmalıdır. Bunların çoğu deneyimlemek için geliyor.

Son olarak, şeyleri gözden geçirmeyin. Bir şeyin kamuya açık veya özel olması gerektiğine dair bir örnek verdiniz ve gerçek şu ki, her şeyi kamuya açık hale getirmenizin bir önemi yoktur. Evet, bu şekilde yapmamalısınız ve bu küçük hataların çoğu bir süre sonra birikecek, ancak günün sonunda muhtemelen projenizi de öldürmeyecek. Birincisi ve her şeyden önce çalışan bir yazılım oluşturun!

(Not: Bu son cümle tembel olmak için mazeret değildir. Çalışan yazılımlara öncelik vermek bir gün iyi kodlamayı öğrenmek zorunda kalmayacağınız anlamına gelmez.)


1

Cevap çok basit

  • Bir prototip oluşturma (Zaman kutulu)
  • Refactor (istediğiniz kadar çok zaman geçirin veya çeşitli faktörlere bağlı olarak geçirin)

Prototip oluştururken odak noktası Minimal Viable Product'da olmalı ve yeniden yapılanma yaparken, projenizi veya çözümünüzü ölçeklenebilir hale getirmeye odaklanmalısınız.


1

Mimarlık aşamasından ve zevk aldığım kodlama ve hata ayıklama aşamasına nasıl daha çabuk geçebilirim?

Bu görevi daha deneyimli iş arkadaşlarınıza atayarak (veya onlardan yardım isteyerek) vererek.

Bu tür kararları hızlıca almak için gerekli deneyimden yoksun kalırsınız. Uni sana güzel bir teorik geçmiş kazandırdı, ama bu seni sadece bir başlangıç ​​çizgisine götürecek. Belirli bir mimariyi belirli bir durumda yargılamanın, benzer mimarilerin geçmişte benzer durumlarda nasıl davrandığını bilmekten başka bir yolu yoktur.

İş yerinde sizden daha iyi olan insanlarla çalışmak, bir şeyler öğrenmenin en hızlı yoludur. Gidecek kıdemli biri yoksa, daha iyi bir işe ihtiyacın var. "İhtiyaçlarınıza daha iyi cevap vermede" olduğu gibi "daha iyi". Bilgi ve tecrübe ihtiyacı, şu anda, ikileminizin kanıtladığı gibi, en korkunç ihtiyaçtır. Kodlama ve hata ayıklama aşamasından hoşlanıyor musunuz? Mükemmel bir genç gibi görünüyor. Fakat bir gencin kıdemli rehberliğe ihtiyacı var. İş tanımlarının amacı budur. İnternetteki yabancılar yalnızca size yardımcı olabilir, bir akıl hocasına ihtiyacınız var.


Bunun iyi bir cevap olduğunu düşünüyorum ama "Senden daha iyi insanlarla çalışmak" ı "Senden daha deneyimli insanlarla çalışmak" olarak değiştirmenizi öneririm . 'Daha iyi', bir sonraki cümlede gösterdiğiniz gibi birçok farklı şekilde yorumlanabilir.
JimmyJames

@JimmyJames "İşyerinde daha iyi" olarak değiştirdim. Çünkü deneyim bunun sadece bir parçası.
Ajan_L

Genel olarak buna katılmıyorum ve bu tam olarak 'daha iyi' olduğumun burada mutlaka doğru kelime olmadığını düşünüyorum. OP için düşünüyorum, dönüyorlar çünkü tasarım sürecinin hiçbir bağlamı yok. Kötü bir tasarımcı / mimar bile bu konuda yardımcı olabilir ve teknik olarak OP'den daha iyidir. Ancak OP işi bir kez anladığında, mentordan daha iyi olabilirler. Bu yüzden cevabınız yanlış değil, “daha ​​iyi” teriminin kullanımından açıkça anlaşılmayan çok fazla nüans var.
JimmyJames

1

Bu soruyla ilgili ciddi sorunlar görüyorum. Hadi başlayalım.

Mimari tasarım boşa zaman kaybetmeyi nasıl durdurabilirim

Bu soru oldukça dolu. Ayrıca, mimari tasarlamıyorsunuz . Sen mimar . Mimari ve tasarım tamamlayıcı ve ilgili faaliyetlerdir, ancak birbirleriyle çakışsalar bile aynı değildir.

Benzer şekilde, aynı zamanda mimarlık yaparak zaman kaybetmek de mümkündür (fazla mimarlık yaparak), fazla tasarlama ve fazla kodlama (atıkları gereğinden çok daha karmaşık bir şekilde kodlayarak) gerekli olan şeyleri kodlayın.)

Uygun mimarlık bu israfın kodlanmasını önlemeyi amaçlar. Bunu, karmaşık bir sistemin 1) tasarlanması, 2) kodlanması ve test edilmesi, 3) teslim edilmesi, 4) bakımı, 5) başarısızlıktan kurtarılması ve 6) sonuçta hizmetten kaldırılması muhtemel yollarını sınırlandırmak, daraltmak ve belgelemek suretiyle yapar.

Tecrübelerime göre, sadece kodlamadan hoşlanan insanlar, bir sistemin uzun vadede nasıl işletileceği ve sürdürüleceği, çirkin bir golem için bazı zayıf ruhlar bırakacak bir sonraki sıcak patatese geçeceklerini düşünmeden kodlarlar .

Ama dalıyorum ...

Mesele şudur: Yeterince basit sistemler için mimarlık açıktır ve sağlam tasarım ve uygulama uygulamalarından kaynaklanır.

Bu, yalnızca açık mimari gerektiren çok karmaşık işleri yapan çok sayıda insanı veya sistem düzeyinde yazılımı içeren büyük sistemler içindir.

Geçenlerde üniversiteden mezun oldum ve programcı olarak çalışmaya başladım. Teknik sorunları çözmeyi ya da hata ayıklamayı zor bulmuyorum, söyleyeceğim şeylerin 1 çözümü var.

Bu meslek için gereken asgari miktar budur ve onları yaparken sorun yaşamadığınız için mutluyum (Yaparsanız endişelenirim.)

Ancak tek bir çözümü olmayan bir problemler sınıfı var gibi görünüyor

Bunlar, mesleğimizin ekmeği ve tereyağı, işverenlerin (genellikle) ortalamanın üzerinde maaşlarının üzerinde ödemeye razı olduğu sorunlardır.

Nitekim, çözülmeye değer problemler birden fazla çözüme sahip olanlardır. Gerçek dünyadaki problemler böyle. Ve dünya, yazılım geliştiriciler olarak kabul edilebilir takaslar için uzmanlığımıza ihtiyaç duyuyor.

- yazılım mimarisi gibi şeyler.

Şeylerin mimarisi, sanal / yazılım ya da somut dünyada olsun, karmaşık sistemin kaçınılmaz bir özelliğidir. Çalışan, girdi alan ve çıktı üreten her sistem karmaşık olacak ve bir mimariye sahip olacak.

Bu tür sistemler için yazılım geliştirdiğimizde (bir bankacılık sistemi, bir güç izleme sistemi, bir bilet satış sistemi vb.), Böyle bir sistemin işlevlerini ve gereksinimlerini taklit eden bir yazılım parçası üretmeyi hedefliyoruz .

Biz sadece olamaz sadece kanat onu ve kod kovboy tarzı. Bir çeşit mimariye ihtiyacımız var. Bu özellikle eğer proje değilse, onlarca mühendis gerektiriyorsa geçerlidir.

Bu şeyler beni kandırıyor ve büyük sıkıntıya neden oluyor.

Sorun değil. Çok fazla pratik yapmadan, öğrenmesi veya öğretmesi kolay bir konu değil.

Programlarımı ve sistemlerimi nasıl "geliştireceğime" karar vermek için saatlerimi harcadım. Örneğin, bu mantığı 1 veya 2 sınıfa böldüm, sınıfları nasıl adlandıracağım, bu özel veya herkese açık hale getirebilir miyim, vb. Sadece programı oluşturmak istiyorum, mimarlık lanet olsun.

Ne yazık ki, bu yazılım mimarisi değil.

Bu tasarım bile değil, sadece kodlama. Bu yazının altında bazı önerilerde bulunacağım.

Mimarlık aşamasından ve zevk aldığım kodlama ve hata ayıklama aşamasına nasıl daha çabuk geçebilirim ?

Buna cevap vermenin bir yolunu bulmakta zorlanıyorum, çünkü oldukça duygusal.

Bir işi halletmeye mi çalışıyoruz, yoksa sadece uygulamadan zevk almaya mı çalışıyoruz? İkisi de aynı olduğunda harikadır, ancak gerçek hayatta çoğu zaman değildir.

Sevdiğimiz şeyleri yapmak harika, ama bizim gibi karmaşık bir meslekte, sadece zevk aldığımız şeye odaklanmak, verimli bir kariyere sahip olmak için elverişli değil.

İlerlemeyeceksin, olgunlaşmayacak veya yeni bilgi edinmeyeceksin.

Orduda, "emişi kucakla" diyen bir söz var.

Diğer ifadelerin benzer önerileri vardır. "Emmezse, buna değmez" ve favorim, "Emerse (ve önemliyse), emmeyi bırakana kadar yapın."

Önerilerim:

Bana göre hala arasındaki farkları anlamakta zorlanıyorsunuz.

  1. kodlama (sınıflarınızı, modüllerinizi nasıl kodlayacağınız ya da olmayanları, adlandırma kuralları, erişim görünürlüğü, kapsam vb.),

  2. tasarım (kaç katman, ön uç / arka uç / db, her birinin nasıl iletişim kurduğu, neyin nereye gittiği) ve basit sistemlerin tasarımından gelen örtülü mimarlık kararları,

  3. mimarlık (yüz binlerce insan-saati olmasa da binlerce gerektiren karmaşık sistemlerde bulunur.)

Bu yüzden, onu bir sonraki seviyeye çıkarmak için ilk konuya derinden dalmanızı (kodlama) öneririm.

Temiz kod

Robert "Bob Amca" Martin "Temiz Kod" başlamak için iyi bir yer.

Yazılım Uyum

Ek olarak, LCOM veya LCOM4 adı verilen belirli bir Nesne Yönelimli yazılım metriğini tanımanızı öneririm.

Oldukça matematiksel olabilir ve kurşun geçirmez değildir, ancak amacınız bir sınıfın uyuşup uyuşmadığını veya uyuşmadığı durumlarda ampirik olarak anlamak ve tespit etmek (ya da isterseniz top-göz) olmalıdır.

http://www.aivosto.com/project/help/pm-oo-cohesion.html#LCOM4 https://www.computing.dcu.ie/~renaat/ca421/LCOM.html

Yazılım İlkeleri

Bu , hepimizin bilmesi gereken "Tek Sorumluluk İlkesi" veya SRY ile yakından ilgilidir . SRY, kodlama konusunda uzman olmamız durumunda aşina olmamız gereken 5 "KATI" dan biridir .

SOLID ilkeleri arasında ilerlerken, kendimizi de sınıfları nasıl kodladığımızı yöneten veya daha doğrusu yönlendiren "GRASP" ilkeleriyle tanıştırmamız gerekir .

Ek Kitaplar

Son olarak, aşağıdakileri de öneriyorum:

  • Martin Fowler ve Ken Beck tarafından "Refactoring" bu listede okuduğum bir sonraki kitap olacak.

  • Richard Mitchell, Jim McKim ve Bertrand Meyer (Eiffel'in şöhretinin ardından) tarafından "Sözleşmeye Göre Tasarım" . Bu kitap basılmamış, ancak Amazon'da ucuz, kullanılmış kopyalar bulabilirsiniz.

Bununla, kodlama ve tasarımın nasıl başlatılacağına ve uygulama ile yazılım mimarisinin nasıl taşınacağına (veya en azından kavradığına) pratik uygulama konusunda iyi bir anlayışa sahip olmalısınız.

Bu önerilere ekleyen, çıkartan veya itiraz eden başka profesyoneller olacağından eminim. Kendi önerileriyle doğrulanmış başka önerilerde bulunacaklar.

Söyleyebileceğim tek şey bu - kısayol yok.

Herşey gönlünce olsun.


1

Burada çok fazla bilgi var ve açıkçası TL; DR. Bir sistemin nasıl tasarlanacağını öğrenmeye çalışırken insanların yanıldığını düşündüğüm bir ana şey var: işin yapılacağı sırayla düşünmeye çalışıyorlar. Bunun yerine geriye doğru çalışmanız gerekir. Yani, tasarım / mimarlığın asıl amacı nihai sonucun ne olacağını belirlemek.

Bir benzetme olarak, bir evin mimarisini düşünün. Bir mimar kendilerine "bu evin kaç tane penceresi olmalı?", "İlk tuğla nereye yerleştirilmeli?" Gibi sorular sormaya başlamıyor. Bu uygulama detayları tasarım değildir, tasarımdan kaynaklanmaktadır. Mimari bir vizyon ile başlar, belki de bitmiş ev nasıl göründüğünün bir eskiz. Müstakil bir ev mi, dubleks mi? Lüks bir ev mi yoksa kolayca uygun fiyatlı bir ev mi? Aynı şekilde, değişkenlerin özel olup olmadığı ve bir sınıfı ayırıp ayırmamanın mimarlıkla ilgisi yoktur.

İlk önce tasarımınızın hedeflerinin ne olduğunu bulmakla başlayın. Örneğin, bu bir defalık bir çözüm mü? On yıllarca genişletilip gözden geçirilip bakımı yapılacak mı? Bunun cevabı çok farklı tasarımları gösterecektir ve bu mimarlık noktasıdır. Ne yapmanız gerektiğine karar verdikten sonra, tasarımın ayrıntıları doğal olarak takip edilir. Bu ayrıntıların açık ya da kolay olmadığı, ancak bu seçeneklerin dayandığı üst düzey plandır.


0

Bir tür yazma-derleme testi döngüsünü almadan önce herhangi bir yazılım parçasını ne kadar zamana ayırmanız gerektiğine nasıl karar vereceksiniz: kafanıza sığacak kadar bilgi ve bundan daha fazlası değil. Üzerinde çalıştığınız proje olmadığı sürece, daha katı bir metodoloji gerektirir. Bu durumda acemi olarak büyük olasılıkla bir mimarlık belgesini okuyup yazmıyor olmalısınız.

Bir şeyleri adlandırmaya gelince, bu bana "yazmanın" bir parçası ama kuşkusuz programlamanın çok önemli bir parçası: şeyleri nasıl adlandırdığınız hakkında çok fazla düşünmekten çekinmeyin ve adın kapsamı daha büyük olduğunu düşünmekten çekinmeyin.

Doğru isimleri, doğru mimariyi, doğru modülerliği ve doğru soyutlamaları bulmak, hata yaparak kazanacağınız deneyimin bir parçasıdır. Yıllar boyunca yaklaşık beş kez aynı şeyi yapan bir program yazdım ve kod her seferinde çok farklıydı, çünkü her yineleme daha iyi bir tasarımla ilgili ipuçları verdi.

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.