Bir uygulamanın bölümlerinin yeniden yazılmasını önleme


13

Satış departmanları için bir projede bir şirkette çalışıyorum. Bu benim ilk profesyonel programlama işim, ama kendi başıma kod yazıyorum ve yıllardır öğreniyorum. Projenin bir kısmı, bazı verileri almayı ve bunları üretmek ve grafik oluşturmak için girdi ile birleştirmeyi içerir. Sonra verileri kaydedin ... vb. Bunun için kodu bir günden kısa bir süre içinde yazdım. Ertesi gün proje süpervizörümü gösterdim ve çok hoşuma gitti, ama "eğer buna sahip olsaydık" ve grafiğe bir şeyler eklememi istedi. Bu, programın görünümü veya işlevinde büyük bir değişiklik değildi, ancak veri depolamak, işlemek vb.

Yine, veritabanı tablosunu yeniden yapılandırmak ve bu yeni isteği desteklemek için kodu temelde sıfırdan yeniden yazmak bir günümü aldı. Tekrar ona geri götürdüm ve aynı şey oldu. O verileri işlemek için nasıl gerekli önemli ölçüde değişti başka bir şey istedi. Bu yüzden tekrar yazmak zorunda kaldım. Sonunda imzaladı ve umarım, tekrar yazmam gerekmeyecek.

Sadece açık ol, müdürümü ya da onun gibi bir şeyi dayamam. O harika bir adam ve talep ettiği şeyler bu dünyanın dışında değildi, daha önce yaptığımla uyumsuzdu.

Sadece tam yeniden yazmalardan kaçınmak için gelecekte yapabileceğim bir şey olup olmadığını merak ediyorum. Esnek kod oluşturmayı anlıyorum ve bunu yapmaya çalışıyordum, ancak bunu kolaylaştırmak için farklı yapabileceğim herhangi bir uygulama veya şey bilmek istiyorum, bu nedenle, gelecekte 3 gün harcamıyorum almalıydım 1.


2
Hangi programlama paradigmasını kullanıyorsunuz? Prosedürel, nesne yönelimli, fonksiyonel, diğer?
Tulains Córdova

2
Yeniden yazılmayı önlemek için - veritabanınızı ve uygulama katmanınızı ayırın. Kod yazma yönteminize başvurmak basit bir kavram değildir. Kodunuzu basit ve uyarlanabilir hale getiren karmaşık bir kavramdır.
StackOverFowl

6
Görünüşe göre gereksinimler net değil veya yanlış anladınız. Eğer uygulama yanlış varsayımlar üzerine yapılmışsa hiçbir ilke veya en iyi uygulama sizi bütün başvuruyu yeniden yapmaktan kurtaramaz. Tek bir LOC aşağı yazmadan önce en iyi "ihtiyaçlarına sormak olursa ... Ne " ... Do yeni size şaşırtıcı yöneticisi için sabırsızlanıyorum neyi olursa ... . Fonksiyonel boşlukları araştırmak için biraz zaman harcamak da fazlalık oranını azaltacaktır .
Laiv

3
Bağımlılık Enjeksiyonu arkadaşın. Google'a ekleyin ve dilinize / çerçevenize nasıl uygulayacağınızı görün. Gereksinimler değiştiğinde yeniden yazılması gereken kod miktarını azaltması gereken çok daha modüler bir kod yazmanıza izin verecektir.
Ebedi21

2
Çok sayıda yeniden yazma gibi kötü bir şey gibi görünse de, gerçekten önemli olan şey, son kullanıcılarınızdan gelen isteklere ne kadar hızlı yanıt verebileceğinizdir. Projenin karmaşıklığına bağlı olsa da, 1 günün oldukça iyi bir teslim süresi olduğunu söyleyebilirim - doğru bir şey yapmalısınız! Aslında önemli değişiklikler gören yazılımlar iyi bir işarettir - bunun yararlı ve gelişmekte olduğu anlamına gelir. Yıllardır önemli ölçüde değiştirilmemiş olan yazılımların bakımı çok daha zordur.
Justin

Yanıtlar:


22

Yorum yaptığım gibi, gereksinimlerin ilk kez net olmadığına dair güçlü bir his var ya da muhtemelen bazı önemli detayları kaçırdınız.

Her şey daha iyi kod, en iyi uygulamalar, tasarım modelleri veya OOP ilkeleriyle ele alınamaz. Uygulama yanlış varsayımlara veya yanlış binalara dayanıyorsa hiçbiri tüm uygulamayı yeniden yapmanızı engellemez.

Çözümü kodlamak için acele etmeyin. Tek bir LOC yazmadan önce gereksinimleri açıklığa kavuşturmak için biraz zaman ayırın. Gereksinimleri ne kadar derinlemesine araştırırsanız, soruların ortaya çıkması o kadar fazla olur . Yöneticinin bir sonraki ne olursa olsun sizi şaşırtmasını beklemeyin . İşleri kendiniz tahmin edin. Bu küçük egzersiz sürpriz faktörü önemli ölçüde azaltabilir .

İhtiyacınız olduğu kadar çok soru sormaktan korkmayın. Bazen ağaçlar (ayrıntılar) ormanı görmemize izin vermez (genel resim). Ve önce görmemiz gereken orman.

Gereksinimler açık olduğunda, tasarım aşamasında daha iyi kararlar almak daha kolaydır.

Son olarak, genel resmin bir hedef olduğunu unutmayın. Bu hedefe giden yol ne sade ne de açıktır. Değişiklikler olmaya devam edecek, bu yüzden çevik olun.


3
Bu. Bu cevap verilebilecek en iyi yoldur. Kesinlikle herhangi bir şey yapmadan önce bu gereksinimleri karşılayın.
Rhys Johns

1
Bu iyi bir cevap, ancak bu istekleri karşılamak için uygulamayı daha kolay hale getirmek için uygulamayı yapılandırmak için daha iyi bir yol olduğunu bir nagging hissi var. Yüzen sözde "ilkelerin" hiçbirinin yardımcı olacağına inanmıyorum; çözüm probleme özgü olmalıdır. Daha fazla bilgi olmadan, cevabınız mantıklı olan tek şeydir.
Frank Hileman

Sorunun yorum yaptığım sorun olduğuna dair güçlü bir his vardı, çünkü geliştirici olarak ilk günlerimde tam olarak bana olan buydu. İfadeleri anında LOC veya modüllere çevirdim ve bir şey değiştirmek zorunda kaldığımda benim için oldukça dramatikti. Refactor her gün veya hafta refactor üzerinde. SoC, SPR, polimorfizm, ile elimden geleni yapmıyorum bile ... Değişikliklerle yaşadığım çatışmaların birçoğu genel vizyon sızıntısından kaynaklandı.
Laiv

2
Bu cevabın üstüne inşa etmek için: Gereksinim toplama konusunda da çevik olmak önemlidir. Bazen insanlar yeni fikirler edinir veya ürünü gördüklerinde unuttukları bir şeyi hatırlarlar. "Bunu inşa etmenizi istediğimi biliyorum ama demek istediğim bu değil" ya da "Bunu istediğimi biliyorum, ama şimdi gördüğüme göre başka bir şey istiyorum" diyebilirler. Hızlı ve kirli bir "Kavram Kanıtı" oluşturarak bunun hayal kırıklığına ve yeniden çalışmasına neden olmasını önleyebilirsiniz. Bu sahte bir grafik gibi bir maket bile olabilir. Müşterinizin düşünmesine yardımcı olur.
Akhil

1
Bazı "db satıcıları nadiren değişir" çünkü koddan db soyutlama bir zorunluluk olmadığını iddia edebilir. Size katılıyorum, ancak cevabımın amacı: gereksinimleri toplarken, bir geliştirici olduğunuzu unutun, gereksinim toplamaya odaklanın. Yönetici gibi düşün, yönetici gibi sor. Bir geliştirici gibi düşünmek için acele etmeyin.
Laiv

4

Verdiklerinize dayanarak bunu bilmenin bir yolu yoktur. O anda ihtiyacınız olan şey daha hızlı ve kirli. Ancak, o zaman birisi onu sevdi ve karmaşıklaşıyor, bu yüzden şimdi karmaşıklığın ortaya çıkmasına kadar birçok sorunun kendilerini göstermediğini görmeye başlıyorsunuz. Yapılması gereken çok farklı şey var, sadece ezici.

Eski "Gümüş Kurşun Yok" var ve bu doğru. Yine, tam spesifikasyonlarla (veya Agile için daha iyi devam eden spesifikasyonlarla) ne yapacağını ve iyi programlama prensiplerini ve iyi tasarımları kullanma yeteneğini bilmenin bir yolu yoktur. Programcılar tekrar tekrar yazmayı severler . Bu duruma mutlaka düştüğünüzü söylemiyorum, şu anda küçük.

Bu fırsatı bazı temel ilkeleri uygulamak için kullanın. Çalıştıklarını göreceksiniz, ancak birileri "Ah hayır, bu kötü" der ya da hoşunuza giden başka bir şey yaparsınız. Her şeyi şirketin parasında yapamazsınız, ancak keşfetmeniz için size zaman tanıyorlarsa, bir fırsat olarak kullanın. Her zaman bir şeyler, bir vakıf, bir kişi, “en iyi” ya da bir şeyler yapmanın “yeni” yoluna sahiptir.


Bağlantı kurduğunuz iyi makale.
SH7890

1
Gerçekten iyi bir makale! Bence OP vakası değil ama yazarla daha fazla anlaşamadım.
Laiv

1
Bire bir olduğunu düşünmedim, ama bir gün olabilirmiş gibi okudu. Umarım bu OP'ye yardımcı olacaktır.
johnny

2

Yöneticiniz büyük olasılıkla attığınız adımların her birinde haklıydı. Bunun nedeni, yönetici olması değil, sonuçları ve kullanılabilirliği ve muhtemelen müşteri veya müşteri talepleriyle önceki anlaşma sayısını dikkate almasıdır.

Kullanıcı arayüzü zor şeylerdir, genellikle 5 kişinin 15 farklı görüşü vardır. Ve veri ve veri yapılandırması ve veri analizi bunu faktör 10 ile çarpma eğilimindedir :). UI moda gibidir, bazı kombinasyonlar serin, bazıları korkunç veya sağduyu eksiktir.

Bahsetmemek gerekirse, örneğin LEAN işlemi sırasında hiçbir şey taşa konmaz. Yinelemeli değerlendirme gibi bir şey deneyimliyorsunuz ve her adımda biraz daha iyi ya da yanlış yoldan kaçınıyor.

Öyle basit bir cevap ki, yeniden yazma diye bir şey yoktur.


2

Yinelemeli gelişim (temel olarak bir günlük yinelemeler de olsa yaptığınız şey) genellikle böyle. Çözümlere yönelik erken teşebbüsler genellikle iz dışındadır ve geri bildirim toplayarak sistem bir çözüme dönüşür. Şekil 2.2'yi UML ve Tasarım Desenlerini Uygulama kitabı için Craig Larman'ın öğretim materyallerinden ödünç alacağım .

resim açıklamasını buraya girin

Bir projenin başlangıcında, görünen kararsız sürümlerle yaşamayı öğrenirsiniz. "Daha erken şartlar almak zorundasınız" diyen cevaplara katılmayacağım çünkü bu Şelale düşüncesidir. Gereksinimler açısından olabildiğince fazla almaya çalışmanız gerektiği doğrudur, ancak birçok nedenden dolayı tam ve doğru gereksinimlere sahip olmak mümkün değildir.

Bu, geri bildirim aldıktan sonra ne kadar yeniden yazmanız gerektiğini azaltamayacağınız anlamına gelmez. Çoğu zaman doğru olan bir şey, yazılımın insan-bilgisayar etkileşiminin değişme olasılığının çok yüksek olmasıdır, çünkü bu ilk seferinde doğru yapılması zor bir parçadır.

Microsoft Word ve veri formatının (.doc) yıllar içinde nasıl gerçekten gelişmediğini düşünün. Bunun nedeni, sorunlu bir alan olarak bir metin belgesinin çok fazla gelişmemiş olmasıdır (bir sayfa hala bir sayfa, bir paragraf hala bir paragraf vb.). Ancak, Word'ün kullanıcı arayüzü çok gelişti (ve devam ediyor). Sunum veya giriş kodu sürümler arasında kararsız olma eğilimindedir, bu nedenle sistemin diğer bölümlerinin kendileriyle doğrudan birleştirilmemesi en iyisidir (yeniden yazmaya karşı izole etmek için).

Sunumun altında yatan mantık ve problem hakkındaki verileri ayırabilen yazılım mimarileri, daha az yeniden yazma olanağı sağlar. Model-View ayrımı gibi birçok yazılım modeli , sizin gibi birçok yeniden yazma yüzünden acı çekti ve daha iyi bir yol istedi.

Bu kulağa çok Budist gelebilir, ama bu yeniden yazmalara maruz kaldığınız için şanslısınız! Pek çok insan, kalıplardan kaçınması gereken yeniden yazma kabuslarını "acı çekmeden" MVC kalıplarını veya diğer tasarım kalıplarını öğrenir.


Bu cevabın kabul edilen cevap olmasını tercih ederim. Bir çözüme yönelik yineleme, tüm gereksinimleri önceden belirlemeye çalışmaktan daha iyidir. Özellikle tüm başvuru bir gün içinde yeniden yazılabilirse.
Euphoric

Eminim patron birincisi tamamlanana kadar ikinci iterasyonda ne istediklerini bilmiyordu. “Daha fazla gereksinimin önceden toplanması imkansız olurdu.
gnasher729

1

Bir cevabım yok, bir alıştırma kadar - muhtemelen kendi zamanınızda yapmanız gerekecek, ancak kuruluşunuza bağlı olarak, çalışma saatleri içinde bunu yapmak için izin alabilirsiniz.

İlk çözümünüzü tam olarak ne yaptığını yeniden tasarlayın, ancak 2. veya 2. ve 3. adımları eklemeyi kolaylaştırın. Bu adımları eklemeyin, saplamayın. Tüm orijinal gereksinimleri karşılayan ancak yeni özelliği içerecek şekilde kolayca yükseltilebilen bir çözüm oluşturmanız yeterlidir. İkinci çözümünüz için de aynısını yapın.


1

Gereksinimler değişir, bu hayatın bir gerçeğidir. Geriye dönüp bakıldığında: Toplam çözüm süresi daha az olacak şekilde ilk çözüm farklı olabilir mi? Deneyimle nasıl yapılacağını öğrenirsiniz.

Bu ilk dik öğrenme eğrisidir. Bunu yönettiğinizde, ikinci zorluk olacaktır: Kullanıcılar atmak istemedikleri bir yıllık veri depoladığında değişen gereksinimleri nasıl ele alırsınız?


-1

Hikayenizden, gereksinimlerin ve tercih edilen mimari kararların yeterince iyi iletilmediği açıktır. Dolayısıyla sizden biri, ya da belki ikisi de kötü iletişimcilerdir.

Aynı zamanda mimar da olabilir, çünkü bazı mimarlar sadece programlama yaparken iyi başarılar için yüksek statü kazanırlar veya büyük eğitim (aynı zamanda çoğunlukla yalnız çalışmakla ilgilidir) veya şirketteki ilk geliştirici (açıkçası yalnız) ve ekiple iletişimde gerekli değildir. Tasarımları belgelemekten ve takımı desteklemekten çok programlamaya odaklanmaya devam etmeleri nadir değildir.

Ancak bu durumda da daha uzun konuşarak, soru sorarak ve not alarak telafi etmeye çalışabilirsiniz. Hatta küçük bir şartname bile yazabilir ve mimardan onaylamasını isteyebilirsiniz.

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.