Kod yazmadan günlerce bir tasarım problemini düşünmek normal midir? [kapalı]


52

Bazen boşluğa boş bakar veya fikirleri çizer ve kağıda bazı sahte kodlar yazar. Sonra çizip tekrar başladım, sonra problem için doğru çözüme sahip olduğumu düşündüğümde kodu yazmaya başladım.

Herhangi bir kod yazmadan günlerce düşünmek normal midir? Bu, probleme tamamen yanlış gittiğimin bir işareti mi? IDE'mde yazılmış herhangi bir somut kodun bulunmaması beni tedirgin ediyor.


9
Soruna ve bireysel düşünce sürecinize büyük ölçüde bağlıdır. Son teslim tarihlerinizle buluşursanız, ne kadar zaman harcadığınız ve ne kadar kodlama yaptığınız önemli değildir.
yannis

4
Bileşenlerinizi bir beyaz tahta üzerinde çizmeyi denediniz mi? Bazen bir tasarım ikilemi veya karmaşık bir algoritma ile karşılaştığımda, çizim yapmaya başlıyorum. Sıkışmışsanız, belki de aklınızda çok fazla sindirmeye çalışıyorsunuzdur. Her şeyi küçük ve kolayca parçalanabilen bileşenlere ayırmayı deneyin, sonra bu farklı parçaların nasıl etkileşime girdiğini çizin. Resmi standartlara gerek yok, beyaz tahtadayken bir Zavallı Adamın UML'si yapıyorum.
maple_shaft

2
kötü bir tasarımı hızlı bir şekilde uygulamaktansa, tasarımın günlerce abt olduğunu düşünün
Chani

4
Evet öyle! Ve bazen zaten yazmış olduğum koda bakarım ve yazmadan önce tasarım hakkında daha fazla düşünmek isterdim :-)
Giorgio

2
Bilgisayar Bilimi, ironik olarak, genellikle bilgisayarlardan bağımsızdır
Ryan Kinal

Yanıtlar:


60

Çözmeye çalıştığınız soruna bağlı olarak, tasarım aşaması yalnızca günler değil haftalar ve aylar alabilir (yıllar değilse).

Hemen kodları basmaya başlamaması deneyim alır. Mimariyi ve üst düzey tasarımı düşünmek, uzun sürmezse günler alacaktır - kesinlikle kodunuzu yazmaya başlamadan önce olması gereken bir şey.


1
Yıllar boyunca +1. Yan odada, 5 yıl boyunca yeni bir sistemin toplanmasına ihtiyaç duyan bir ekip vardı ve görüş alanı sona ermemişti. Daha da ileriye gidebileceklerinden şüpheliydik.
15'te jwenting

8
@jwenting ... bu da iyi değil, o çocuklar belki yazmaya başlamalıydı.
Grady Player

8
Evet, buna şelale yöntemi denir ve hepsinin kovulması gerekir. Bir yılda ne yapmaya çalıştığınızı bulamazsanız, teknolojinin kendisi eski hale gelmeden önce pazara asla getiremezsiniz.
riwalk


24

Bu genellikle "Analiz Paralizi" olarak adlandırılır.

Yaygın ama yanlış. Bir noktada sizin için neyin işe yarayacağını görmek için çeşitli fikirleri denemeniz ve ardından aşamalı olarak iyileştirmeniz gerekir.

Pragmatik programcısının özel olarak Bölüm 2'deki "Tracer Bullets" bölümünün okunması önerilir.


12
Sisteminizi tasarlamak için zaman harcamanın mutlaka yanlış olduğunu varsaymakta yanılıyorsunuz. Önemsiz bir şey için, günler uzun bir süre gibi gelebilir, on binlerce veya yüz binlerce satır kodunu kapsayacak büyük sistemler için, temel mimariyi kağıda almak için çok kısa bir zaman.
16'da jwenting

3
Düşünmeye harcanan zaman, konunun karmaşıklığı ile doğrudan ilişkilidir. Ama eğer "IDE'mde yazılmış herhangi bir somut kodu alma konusunda gerginse, yapacağım" diyerek başlaması gerektiğini düşünmenin güvenli olduğunu düşünüyorum.
Morons

7
HERHANGİ BİR YOLDA DEĞİLDİM "Sisteminizi tasarlamak için zaman harcamak yanlış"
Morons

4
@Moronlar: Ne söylediğin, insanların ne duyduğunun önemi yok ve insanlar OP’nin yaptığı şeyin yanlış olduğunu söylediğini duyduğun önemli değil.
whatsisname,

5
"Analiz felci" terimi, bir kararın analizinde fazla zaman harcandığını gösterir. Bu gerçekten gerçek bir sorundur, ancak eğer mevcut durum böyle ise, asıl görevden net değildir. Bir dizeyi tersine çevirecek bir fonksiyon yazmayı düşünmek için birkaç gün harcıyorsanız, bu analiz felcidir. Birkaç gün önce yeni bir c ++ derleyicisini yazmadan önce nasıl yazacağınızı düşünerek harcıyorsanız, en azından bunu yapabilirsiniz.
PeterAllenWebb 10:11

10

Bu tamamen yaygındır. Ancak, "Önce Test" veya TDD yaklaşımını kullanırsanız, daha az yaygındır ve fikirlerinizi daha iyi formüle etmenize yardımcı olabilir.


5

Alışkanlıklar, genellikle olaylara deneme yanılma yaklaşımlarının ve bize istenen sonuçları veren ve olmayanlardan kaçınmanın bir sonucudur. İstediklerimizi yapmak ve sevmediklerimizden kaçınmak da oyuna dahil olur. Bu bir noktaya kadar gider çünkü sonunda, kiranın ödenmesini sağlamak için sevmediğimiz bir şey yapacağız.

Bu sizi nedenlere ve nedenlerinize yönlendirir. Burda biraz var:

  • Çok sık, tasarım değişiklikleri nedeniyle kodu değiştirmek zorunda kaldınız
  • Zayıf bir tasarımı değiştirmezsiniz, çünkü daha az çözüm zaten kodlanmıştır
  • Kod erteleme yazmak yerine çizmeyi ve tasarlamayı tercih edersiniz
  • Kodlamanın sözdizimi ve detayları konusunda endişelenmek zorunda olmanız, sizi daha iyi tasarımlar hakkında düşünmekten alıkoyuyor.

Umarım, daha uzun tasarlarsanız, kodunuzun daha iyi olduğunu keşfettiniz. Geriye bakıp, tasarım için ne kadar zaman harcadığınızın bir önemi olmadığını görüyorsanız, değiştirmek isteyebilirsiniz. Diğer bir husus, kodlarınızı yazdıktan sonra tasarımlarınızla çalışmaya kıyasla sorunları ne sıklıkta keşfettiğiniz. Bazı kodları yazana kadar sorun bulamazsanız, bir dengeyi göz önünde bulundurmalı ve bir an önce bir şeyi kodlamaya başlamalısınız. Belki bu yaklaşım daha yeni teknolojilerin kullanımına veya çok karmaşık bir özelliğe uygulanabilir.

Birinin diğerinden daha iyi çalıştığını fark etmeme rağmen, bir yaklaşıma ya da diğerine bağlı kalma disipline sahip olup olmadığımı bilmiyorum. Bazen beyaz tahtaya gitmeye ihtiyaç duyduğumu hissediyorum; diğerleri klavye.


4

Çok yaygındır ve işleri halletmek ve anlamak için daha iyi bir yol olduğunu düşünüyorum. Bir proje üzerinde çalışırken, birçok kez takılıyorum ve daha iyi nasıl yaklaşabileceğimi anlamak bir iki günümü alıyor. Sorun çözüldükten sonra bile bir gün geçmesini bekliyorum. Bu beni daha çok tazeledi ve devam ettirdi.

Bu doğal bir fenomendir ve bir geliştiricinin zihni arasındaki zamanı arayla kesmesi iyidir.


4

Proje yönetimi dersi alırken, eğitmenin bize ilişkin planlama ile ilgili, kafamın içinde sıkışıp kaldığı şeylerden biri, orduda öğrettikleri baş kuralının planlama için zamanın 1 / 3'ünü belirlemekti. . Bu nedenle, bundan 3 ay sonra tamamlamanızı gerektiren bir ameliyat geçirdiyseniz, yürütmeye başlamadan önce planlamak için bir ay geçirmeyi düşünün.


4

Bana göre, her biri belirli bir kodlama durumuna uygun üç yaklaşım var

  1. Daha önce benzer bir problem gördüm, bu yüzden uygulanacak modeller ve çözümün nasıl davranması ve yanıt vermesi gerektiği konusunda net bir fikrim var.

    => İstenilen çözümlerden başlayarak ve kodda çalışan BDD / TDD'yi kullanın. (Tamam, bazen hile yapıyorum ve biraz kod yazıp sonra da test - iç içe bir tür 2. -> 1. yaklaşımı).

  2. Uygulamak için iyi bir desen fikrim var, ama çözümün nasıl görünmesi gerektiğinden emin değilim.

    => Prototip ne tür ilginç şeylerin ortaya çıktığını görmek için. Hangi ilginç şeylerin istendiğini çözdüğümde 1. konumuna gidin.

  3. Hangi kalıpların uygulanacağından emin değilim.

    => Sorunu ve soruna yaklaşmanın çeşitli yollarının kodu nasıl etkilediğini düşünün. Bu alıştırmanın sonucuna bağlı olarak 2) veya 1) 'e gidin.

Başka bir deyişle, cevap mühendisin favorisidir: Bağlıdır.


3

Düşünmek ve tasarlamak için bir ay geçirmek, daha sonra şekillendirmeniz gereken standart altı tasarıma dayanan hızlı bir prototip hazırlamaktan daha iyidir. Özellikle de bir takımdaysanız; diğerleri kodunuza bağlı olarak başladığında, farklı bir API ile daha iyi bir tasarım uygulamak çok daha zordur.


2

Diğer sorunlara katılıyorum, prensipte, bir problemi / çözümü düşünmeye zaman ayırmanın iyi bir fikir olduğunu düşünüyorum. Ancak, sıkışıp kaldığınızı düşünüyorsanız, planlama sürecini biraz daha tutarlı hale getirmenin yolları için birkaç önerim var:

  • Tasarım eserleri oluşturun. Peki ya kod yazmazsan? Belki de düşüncelerin hakkında bir günlük yazarsın. Veya genel bir çözüm taslağı. Ya da zaman içinde düzelteceğiniz sorunun gerçekten iyi bir özeti. Fikirleri düşündüğünüzde ve kabul ettiğiniz / reddettiğinizde, konuyla ilgili düşüncelerinizin kaydını tutun. Bu şekilde, günün sonunda, emeğinizin kanıtı olarak gerçek dünyadaki teslimatlara hala işaret edebilirsiniz.

  • İnsanlarla konuş! Fikirleri tartışmak için yaşayan, nefes alan bir insana sahip olmak gibisi yoktur. Sıkışmış olduğunuzu düşünüyorsanız, birisiyle konuşun. Birini tut - herkes! - ve problemi onlara açıkla. Sorunun nasıl çözüleceği konusundaki düşüncelerinizi çizin. Yaptıkları tek şey nefes almak, nefes vermek ve uyurken on dakika boyunca göz kırpmak olsa bile, ihtimal sadece sorunu açıklamak için yeni bir fikir keşfedeceksiniz .


1

Satchel Paige'in dediği gibi, "Bazen oturur ve düşünürüm, bazen de otururum."

Sanırım onun başından geçen, fikrinizi farklı bir şekilde düşünmenize yol açabileceğinden, zihninizi temizlemenin bazen iyi olduğudur. Bu yüzden, eğer koddan kopmazsanız, sizi tersine çevirmiş olabilecek bir çözüm veya fikir edinebilirsiniz. Bu yüzden, evet, normaldir ve doğrudan kodlamaya atlamamak iyi bir uygulamadır.

Bu işlemi kendim yapmanın iki yolu var. Metin dosyası ve projeyle ilgili çizimleri olan bir klasör oluşturuyorum. Fikirlerimi orada not ediyorum ve tüm düşünce sürecini elimden geldiğince kurtarmaya çalışıyorum. Ayrıca algoritmalardan CSS mizanpajlarına kadar basit fikirleri hızla test edebileceğim bir karalama defteri projesi de oluşturacağım.


1

Program = Algoritma + Veri Yapısı

IMHO, tasarım (problem çözme) sürecini tamamen yönetiyor. Uygulama (teknik sayı) detayları doğal olarak takip edilir ve çözülür.


Bu basitleştirilmiş denklemden gerçekten hoşlanıyorum. +1
Kim Jong Woo

1

İşte benim düşünce davası.

  1. Sıfırdan başlamak İlk önce ne istediğinizi kaba bir fikir gereklidir. Bazı gereksinimlerin bir listesini almaya çalışın veya bunları oluşturun. Burada bir şeyler bulmak biraz zaman alabilir. En azından istediğiniz parçaya sahip olduğunuzda, o parçanın ara yüzünün çoğunu bilerek kodlamaya başlayın.

  2. Mevcut kodla ilgili bir sorunu çözme Her şeyden önce sorunu izleyin. Bu, gerçek kodun yazılmaması için biraz zaman gerektirebilir (Bazı hata ayıklama kodları yazılabilir, ancak bu genellikle saklanmayacaktır). Sorunu bulduğunuzda, karmaşıklığa bağlı olarak, denemek ve düzeltmek için kod yazmaya başlayın. Hata bilindikten sonra çok az düşünce yapılması gerekir. Sorun büyük bir tasarım hatası olarak ortaya çıkıyorsa, bir sonraki bölüme bakın.

  3. Tasarım değişiklikleri / ana özellikler Bu, en çok düşünmeyi gerektiren olandır. Yapıyı koruduğu düşünüldüğünde, geriye dönük uyumluluk vb. Dahil edilmelidir. En iyi değişiklik için düşünmek önemli bir zaman kazandırabilir, ancak genellikle benim için birkaç günden fazla değildir.

  4. Basit bir özellik ekleme Önemli bir tasarım değişikliği gerekmiyorsa, sadece bir deneme / hata kullanarak, özellik kodunuzu girmeniz yeterlidir. Bu, genel olarak bir ton zaman gerektirmemelidir.


0

Bu konuda fikir birliğine katılıyorum. Sistemimin nasıl çalışmasını istediğime dair en belirsiz yazılı peçete fikrine sahip olduğumda, prototip yapmaya başlamayı tercih ederim. Bir şeyi çok kesin bir şekilde belirtmediğim sürece, sorun yaratabilecek tüm küçük ayrıntıları düşünmek neredeyse imkansız. Tasarımı sadece insanlarla tartışıyorsam, daha karmaşık sorunların bazılarına el sallamak çok kolaydır. Bunun gibi şeyleri belirttiğimde, kesin ve resmi olan ancak derlenip yürütülemeyen diğer ifade araçlarından ziyade doğrudan kaynak kodunda olabilir.


3
Ayrıntıları anlamak ve temelleri bulmak arasında bir fark var. Örneğin, bir dil tasarlayacak olsaydınız, bir klavyeye yaklaşmadan önce, dilin prosedürel mi yoksa işlevsel mi olduğuna karar vermek isterdiniz. Hiç kimse planlama sırasında detayları çözmeniz gerektiğini söylemez, ancak nereye gittiğinizi bilmeniz gerekir.
riwalk,

@ Stargazer712: Tamamen katılıyorum. Bu yüzden en azından ne yapacaksın diye bir peçete fikrine ihtiyacın olduğunu söyledim. Bununla birlikte, bu soruyu sorma biçimim, en riskli / yeni / ilginç özelliklerin bile prototipini çıkarmaya çalışmadan önce resmi, bürokratik toplantıların günlerini veya haftalarını hayal ediyordum.
dsimcha

0

"Normal" için ne demek istediğine bağlı . Kendimden bahsetmişken, kodun harika bir öğrenme aracı olduğunu düşünüyorum. Bu yüzden karmaşık bir sorunla karşılaştığımda, kağıt üzerine eskizler çizerim, ancak bazı Test kaynaklı kodlamalar da yaparım. Code, bir beyaz tahtanın söyleyemediğini ve tam tersi olduğunu ve belki de sonuçların içgörü veya alan uzmanına birkaç soru sormanın gerekli olduğunu düşündüğünü söylüyor.

Bu yüzden asıl tavsiye: “Problem tanımına yaklaşmak için gereken her öğrenme aracını kullanın” , fakat aynı zamanda “bunların öğrenme araçları olduğunu unutmayın, bu yüzden onlara aşık olmayın” hem kod hem de eskizler atılmalıdır. .


0

RAD ve çevik programlamanın bu döneminde, sistemin ana bölümlerini tanımlayabildiğiniz anda gelişmeye başlamalısınız, detaylar ortaya çıkacaktır. Yazılımlar büyüdükçe, önceden her bir ayrıntıya odaklanmak sizi hiçbir yere götürmez.


2
Ve yeterli ayrıntıya odaklanmamak sizi hiçbir yerin daha iyi olamayacağı bir yere götürebilir.
Dunk

@ Dunk Üç kelime kullandım: Erken, her biri, ayrıntılara odaklanmayı. Klavyeyi hemen vurma demiştim, drift adamı al.
Syed Aqeel Ashiq 10:11
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.