İlk önce neye bakarsınız: kod veya tasarım?


17

Yeni bir projeyle yeni tanıştıysanız, nasıl çalıştığı hakkında bir fikir edinmek için aradığınız ilk şey nedir?

Önce tasarımı mı arıyorsunuz? Bir tasarım varsa, içinde ne ararsınız? Sınıf diyagramları ya da dağıtım diyagramları ya da sıra diyagramları ya da başka bir şey?

Yoksa doğrudan kod için mi gidiyorsun? Öyleyse, farklı katmanların nasıl etkileştiğini nasıl anlarsınız?


kod yazıldıktan sonra tasarım hemen hemen bu noktada bir eser ...

Yanıtlar:


24

Kod ile başlıyorum. Varsa, ayrı tasarım belgelerinin yanlış ya da yanlış anlaşılma olasılığı vardır. Yani, ben kod aracılığıyla bazı basit akışı izlemeye çalışarak başlayın; bir web uygulamasıysa, örneğin bir istek veya istek dizisi olabilir. Bunu yaptıktan sonra, daha fazla anlayış asmak için bir çeşit iskeletim var. Sonra, geri dönüp tasarımları veya diğer belgeleri okuyabilirim, ancak bu noktada, onlarla ilgili ve onlarla doğrulamak için somut bir şeyim var, böylece duff bilgilerini tespit edebilirim. Veya sadece kod okuma veya test senaryoları vb.


Vaaz ver kardeşim! Bir deyiş var: yorumlar birim testi yapılamaz. Fonksiyonel test ekran görüntülerinden otomatik olarak üretilmesi nadir görülen durumlar dışında çoğu dokümantasyon için aynıdır.
DomQ

Önce bu cevabı yazdınız veya tasarladınız mı?
Mateen Ulhaq

Ben de sıkılana kadar başımı klavyeye ezdim.
Tom Anderson

9

Daha yüksek bir seviyede başlardım. Herhangi bir kullanıcı belgesi varsa - kullanım kılavuzu veya kılavuz. Bu başarısız olursa, yazılımın ne yapması gerektiği hakkında bir fikriniz olması için şartname spesifikasyonlarına bir göz atın. Ben tasarım bakmak ve kod dosyaları üzerine eşlemeye çalışın. Umarım bunlar bir şekilde klasörler halinde yapılandırılır. Daha sonra tasarımın bir parçasını seçer ve ince ayrıntıya çok fazla sapmadan kod akışını takip etmek için dosyalara giderdim.


Kabul ediyorum, koda doğru dalmak istiyorum ama en azından önce belgelere bir göz atmam gerektiğini düşünüyorum. Başınızı koda soktuğunuzda bu iyi bir astar olabilir.
Chris

6

Ben bir geliştirici sistemi kurarak başlıyorum. Belgelenmiş prosedürü kullanıyorum. Bu, kedinin belgelerin gerçekle ne kadar senkronize olduğu hakkında çantasından çıkmasını sağlar.

Ayrıca bana bağımlılıkların ne olduğunu da söyler. Bu önemli.

Şimdi bir geliştirici kurulumu var, (ve kurulum belgesini düzeltmelerle işaretlediğim gibi) bir sürüm oluşturuyorum. Sonunda tüm bu aşamada sorular soruyorum.

Şimdi inşa edildi, ben kullanım kılavuzundan tanıtım egzersiz yapmak. Bu bana kabaca sistemin gerçekte ne yaptığını anlatıyor.

Şimdi sistem hakkında kısmi bir ipucum var, şimdi belgelerin ne kadar yanlış olduğuna orantılı olduğuna inandığım tasarım belgelerini okudum.

Gerçek davranışsal belgelere ulaştığımda, koda bakıp gerçekten orada ne olduğunu görmeye başlayabilirim. Asla sıralanmadılar, ama şimdi ne kadar inanacağımı biliyorum.

Sonra "todo" ve "fixme" yorumları için IDE çıktısına bakıyorum. "Sürüm 2.0'da düzeltme" gibi şeyler de devrilme vardır.

Yani tamamen gerçekliği öğrenmekle ilgilidir ve insanların işaret ettiği gibi, ayrı tasarım belgeleri nadiren güncel veya doğrudur, ancak insanların bir noktada ne düşündüğünü anlatır. Ve elbette, bu insanlar muhtemelen sorgulamak üzere değiller.


Bunların hepsi çok akıllıca. Dokümantasyonun genellikle yanlış olduğu fikri, bu sorunun birçok cevabı etrafında yüzüyor, ancak Tim bundan bir adım atıyor ve ne kadar yanlış olduğunu ve bunun ne anlama geldiğini soruyor .
Tom Anderson

4

Benim tercihim, projeye genel bir bakış için tasarıma başlamak ve ayrıntılara girmeden önce bazı temel özelliklerini ve / veya yapısını anlamaya çalışmaktır.


4

Her zaman tasarım. Kod ile geliştirici kurulum adımlarından geçmeye değer (kaynağı kontrol etme, projeyi oluşturma, yapılandırma değişikliklerini yapma), ancak bir uygulamanın yapısını kodundan öğrenmeye çalışmanın bir anlamı yoktur. Bu sadece yapının ne olduğunu , yapının neden olduğunu ya da diğer geliştiricilerin mimarinin öne çıkan ve kötü yönlerini düşündüklerini değil. Beyaz tahta diyagramlarından ve geliştiricilerle yaptığınız sohbetlerden öğrendikleriniz.


3

Karmaşık bir yazılım parçası için kabaca yeni bir geliştirme projesi gibi yaklaşırdım. Büyük fikirler ile başlayın- vizyon, bağlam, kapsam, paydaşlar. Bazı kullanıcı belgelerini okuyun ve nasıl kullanıldığına dair bir fikir edinin. Mümkünse yazılımla ilgili kullanıcı eğitimi alın (veya uygulanabilirse). Ardından, üst düzeyde nasıl çalıştığı hakkında fikir edinmek için gereksinimleri ve tasarım belgelerini incelemeye başlayın. Hala etraftalarsa tasarımcılar ile konuşun. Sistem mimarisine farklı açılardan bakın. Oradan, temel işlevselliği araştırmaya ve bazı kodlara bakmaya, gerektiğinde gereksinimlere ve tasarıma dönmeye başlayın. Koda bakarken, kodu çalışırken görmek için yazılımı çalıştırın. Tüm bunlar için ileride başvurmak üzere bazı özet belgeleri derleyin - Cliffs Notes'a sahipsiniz. Her şeyin nasıl çalıştığı ve birbirine nasıl uyduğu hakkında oldukça iyi bir fikriniz olana kadar dallayın, ancak birlikte çalışacağınız parçalara konsantre olun. Şimdiye kadar, tüm sistemi veya en azından sizin için geçerli olan parçaları yukarıdan aşağıya anlıyorsunuz.

Tabii ki, gerçek dünyada, özellikle daha büyük projelerde, ellerinizi kirletmeye başlamadan önce tüm bunları yapmak için zamanınız olmayabilir. Ama bana kalmış olsaydım böyle yapardım.


3

Kodun kendisi ve tüm tasarım belgeleri arasında ileri geri çalışmalısınız.

  • Kod veya tasarımdan başlayabilirsiniz ve gerçekten önemli değil. İyi ve tamamen karışana kadar kodu okuyun, ardından tasarım belgelerine göz atın. Veya üst düzey bir resim elde etmek için tasarım belgelerini okuyun ve neye benzediğini görmek için koda bakın. Kodla çalıştığınız sürece neredeyse süresiz olarak tekrarlayın.

  • Tasarım belgelerinin neredeyse her zaman güncel olmadığını ve birçok yönden yanlış olduğunu unutmayın. Ancak, bu noktaları aklınızda tuttuğunuz sürece, güncel olmayan dokümanlar, geçmişte bir noktada yazarın zihnini anlamanıza yardımcı olur. Üst düzey sorunların ve endişelerin birçoğu hala geçerli olacak ve yazarın başlangıçta nereye gittiğini düşündüğü tarihli tarihli bir resim bile olsa, kodun nerede olduğunu nasıl daha hızlı anlayabileceksiniz. Git.

  • Kod ve tasarım üzerinde çalışırken, bugün kodu anladığınızı açıklayan kendi belgelerinizi oluşturun. Belki bu dokümanlar basit bir taslaktır, belki bir wikide yazı yazmaktır, belki başka bir şeydir. Onları çok karmaşık yapmayın: 30 sayfalık kelime dokümanları yok. Sadece düşüncelerinizi indirin, bu da kendi düşüncelerinizi büyük ölçüde aydınlatacaktır.


2

Uygulama türüne bağlıdır. Veri merkezli bir uygulama ise, genellikle veritabanı tasarımı ile başlar. Eğer çalıştırabileceğiniz bir kullanıcı arayüzü varsa (veya iyi ekran tasarımları) bunlar uygulamanın çok hızlı bir şekilde ne yaptığını size iyi bir fikir verebilir (burada en fazla birkaç saat konuşuyorum). Bundan sonra koda girmeye başladım ve uygulamanın ne yaptığını biliyorum çünkü daha mantıklı olacak.


2

Tasarım dokümantasyonuyla başlıyorum. Özellikle, şartname - bakılan şeyin amacını anlatır.

Mümkünse, nasıl yapıldığı, düşünce süreci, ilgili kişilerin stili ve doğası hakkında genel bir lezzet elde etmek için tasarım notlarına ve belgelere bakarım.

Mümkünse, daha sonra üzerinde çalışan insanlarla konuşurum - ne yapar? Nasıl? Neden? Cesetler nereye gömüldü?

Geliştiriciler arasında koda geçme eğilimi var: "Size bu kodu göstereyim". Bu onlar için iyi ama ihtiyaçlarımı ele geçirme eğiliminde - bu düşük seviye şeyler bağlam veren yüksek seviyeyi anlamak için.

Tam bağlamdan küçük kod parçalarına bakmak ve anlamlı her şeyi anlamak için büyük miktarda beyin gücü kullanır. Bu yüzden mümkünse, geliştiricilerin PRINCIPLE, yapı, birimler, modüller hakkında konuşmasını sağlamak, her şey görevin takdir edilmesine yol açar.

Ancak o zaman koda girmeye değer.

Şeylerin büyük şemasında, koda bakmak 0 ve 1'lerle dolu bir sayfaya bakmak gibidir. Bir anlam var ama anlaması uzun zaman alıyor. Nereye bakılacağına ve hangi bölümlerin anlamlı olduğuna dair bir lezzet almak, arama alanını daraltmanıza yardımcı olur.

Bütün bunlar - hiçbir doco, hiçbir insan ve sadece kod olmadığında - koda bakmaktan başka bir şey yoktur.

Bu durumda, normalde yavaş, derin bir okuma ile anlamaya çalışmıyorum, hızlı bir geçiş yapıyorum, her şeyi gözden geçiriyorum. Bazen bu sadece dosyaları açmak ve sayfa aşağı tuşuna basarak oturmak. Sadece bunu yaparak büyük bir resmin harika bir takdirini elde edebilirsiniz. (Ve hatta bazı durumlarda, çalıştırılabilir dosyaları dizgi dökümü ve bunlara imza atmak, imzalar ve kalıplar aramak. Bu son 20 tek yıl boyunca inanılmaz derecede verimli oldu.)


1

Testlerle başlıyorum. Birim testleri ve entegrasyon testleri iyi yazılmışsa, kullanım durumlarını açıklarlar. Eğer iyi yazılmamışlarsa veya hiç yazılmamışlarsa (ne yazık ki, bu büyük ölçüde durumdur), koddaki giriş noktalarıyla başlıyorum ve tasarımla olanlarla eşleştiriyorum.

Daha sonra giriş noktalarını araştırdıktan sonra bulacağınız ağaç tarafından keşfedilen kodu incelemek ve neyi kaçırdığımı görmek için kod kapsamı yardımcı programlarını kullanmak için her kullanım durumu için testler yazacağım. Bu testler bana tam olarak kodun nasıl çalıştığını söylüyor.

Her zaman baktığım bir şeye değer katmaya çalışırım; yazma testleri, kod temizleme, büyük (20+ satır) fonksiyonların yeniden düzenlenmesi.

Ben sadece belgeleri oluşturma kodu asla etkileşimde bulunmadığı için koda herhangi bir gerçek değer katmıyor buluyorum.


1

Peki, "tasarım" nedir? README? uml diyagramı? bir tasarım belgesini yarıya yapabilirsiniz (ve çoğu yaparsınız), yarıya kadar kod yazamazsınız

herhangi bir tasarım sadece bir fikir olacak , oysa kod gerçek

kodun nedenini anlayamadığımda sadece ikincil belgelere başvuracağım

kodu okumak bir geliştirici için önemli bir beceridir. şimdi öğrenebilirsiniz, yine de kariyeriniz boyunca çok yararlı belgeler göremezsiniz.


1

Sonra geliştiricinin README, TODO ve Changelog'larına bakıyorum. Yazılımın neden yazıldığını, nasıl yazıldığını ve nereye gittiğini anlamıyorsam ... Kullanmıyorum.


1

Önce tasarım, sonra kod, yukarıdan aşağıya isterseniz, çalışmam gereken her seviyede bağlamı anlıyorum.

Ancak, bir raporu veya bir hesaplamayı düzeltmek gibi çok özel bir değişiklik yapmak zorunda kalırsam, sadece gidip koda bakarım.

Daha spesifik olarak, benim "önce tasarım" yaklaşımım şudur:

Biri varsa de etki alanı modeli ile başlar, hiçbiri yoksa ben en azından temel bir tane inşa (iyi bir başlangıç ​​noktası veri modeli). Uygulamanın "terimini" ve nesneler (sınıflar) arasındaki ilişkiyi tanımlar.

Uygulama tarafından "hangi nesnelerin işlendiğini" gösterir.

Daha sonra uygulama tarafından "hangi işlemlerin yapıldığını" bulmak için kullanım örneği modelini arıyorum, ancak işlem sırasını gösteren bir işlem haritasını tercih etsem de.

Bundan sonra uygulamanın güzel bir resmine sahip olmalı ve daha sonra değişikliği tasarlamaya devam edebilirim.

Bu arada, yukarıdaki cevap iş uygulamaları bağlamındadır.


1

Kod yalan söylemez. Kesinlikle iyi bir fikir ilk önce projenin ne yaptığını anlamak için. Ancak, göreviniz projenin nasıl çalıştığına dair ayrıntılı bir anlayış elde etmekse, en azından benim için kodlara bakmak, baktığınız her sınıfla bir parça bilmeceye parça parça bakmak gibi bir şeydir. parçalı bulmaca parçası. Kod iyi yapılandırılmışsa, sınıfın ne yaptığını soruşturmadan bile sınıfların adlarından oluşan bir desen görebilirsiniz. Birçok durumda, size daha fazla yardımcı olacak koddan ipuçları ve ipuçları alabilirsiniz.

Son olarak, programın ne yaptığına dair değiştirilemez bir fikir, tamamlanmış bir bilmecenin elde edersiniz. Belgeler eksik veya yanlış olabilir, ancak kod asla yalan söylemez. Tüm bunları, her bir yöntemin ne yaptığını anlamadan yapabilirsiniz. Herkes bir projeyi bu şekilde öğrenemez, ancak sık sık yaparsanız, birkaç saat çalışarak orta boyutlu bir uygulamanın özünü elde edebileceğinizi belirtmek sizin için daha kolay gelir. Herhalde her şey tercih edilir.


1
  1. Uygulamanın fonksiyonel amacı
  2. Uygulamanın fonksiyonel kapsamı ve akışı müşterinin diğer sistemi ile bağlantılıdır.

En kritik modülün / uygulama noktasının kodunu gördükten sonra: kodu gördükten sonra, tasarımın iyiliğini doğrulayabilirim.

Misal:

Finansal raporlama hakkında bir web uygulamasının uygulama yönetiminde çalışmak zorundasınız.

  1. Amaçla ilgili belgeleri soruyorum ve okuyorum: hangi veriler rapor edilmelidir? Bu uygulamayı kimler kullanıyor?
  2. Bağlantılı sistemler nelerdir? Herhangi birine veri almak veya göndermek için herhangi bir süre var mı? Bu sistem çalışmıyorsa başka hangi uygulama zarar görür veya durdurulur, başka hangi bölüm zarar görür?

Mesajla ilgili kodu okuduktan sonra, başlangıç ​​ve bitiş uygulaması (db'de olası kilit için), raporlanması gereken verilerin vb. Oluşturma ana işlemi (örneğin, gazın depolanmasında ana işlem yaklaşık tedarik ve enjeksiyon ile müşterilerin depolama alanında gaz stokunun hesaplanması; ikincil işlem, daha önce hesaplanan bu verilerle ilgili faturalandırmadır)


1

Ne kod ne de tasarım. Paydaşlarla ve son kullanıcılarla konuşmayı ve onların bakış açısından nasıl çalıştığını öğrenmeyi seviyorum. Aklımda onlardan bir resim oluşturabildiğimde, teknik tasarıma ve sonra koda hızlıca bakıyorum.


0

Önce tasarımla, sonra eşzamanlı olarak kodlayacağım. Bu çok önemli çünkü her proje farklı. Eşzamanlı olarak kodlar üzerinde çalışmaya başlayabilmeniz için önce A'dan Z'ye bir plan ve yüksek düzeyde iş akışı sağlamanız gerekir. Alınan her karar belgelenmelidir, böylece kodları geliştiren / geliştiren diğer ekipler (ya da kendiniz) en son güncellemeyi ve neyin teyit edildiğini bilir.


0

İyi bir üst düzey tasarım belgesi varsa onu kullanacağım. Kısa ve güncel olmak zorundadır. Çok ayrıntılı veya güncel değilse, koda gideceğim.

Tabii ki, projeye bağlı, değil mi? Son derece karmaşık veya çok yönlü bir projeye belki de dokümantasyon yoluyla daha iyi yaklaşılır (dokümantasyon yeterince sağlamsa).

Tek bir basit modül veya basit bir uygulama, bence, neredeyse her zaman en iyi kod düzeyinde yaklaşılır.

Her durum için doğru cevap yok!

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.