Modern yazılım geliştirmede iyi kod imkansız mı? [kapalı]


19

Görünüşe göre geliştirici araçları daha sağlam ve sağlam hale geldi, iyi kod yazmak zor bir iş haline geldi. Bu araçlar daha güçlü olsa bile, kod kalitesi daha iyi olamaz. İki önemli faktörle karşılaşıyorum, daha az zaman var ve projeler daha karmaşık. Bugün kullandığımız araçlar daha güçlü olduğu için daha karmaşık kod yazmak daha kolaydır, ancak planlamak için zamana sahip olmak ve geriye bakmadan kod kalitesini düşürür, hataları ve bakımı artırır. Daha önce karmaşık kod yazmadık. Daha karmaşık bir kod yazıyoruz.

Sorum şu: Daha güçlü bir dil ve araçlara sahip olduğumuzu düşünürsek.

  • İyi kod yazmak neden daha zordur?
  • Faktörler, zaman ve karmaşıklık buna katkıda bulunur mu?
  • Metodolojiler doğru uygulanmıyor mu?

Düşündüğüm proje türü, büyük karmaşıklığa ve iş mantığına sahip kurumsal uygulama. “İyi kod” un tanımı bireyseldir, lütfen “iyi kod” un yorumuna takılmayın.

Yanıtlar:


34

İçeri DeMarco ve Lister da belirttiği gibi PEOPLEWARE bazı 20ish yıl önce başarısız yazılım projelerinin büyük çoğunluğu nedeniyle teknik zorluklar, ancak sosyolojik sorunlara değil başarısız . Son on yılda, araçlarımız ne kadar gelişmiş olursa olsun bu durum değişmedi.

Yanlış yönetim, gerçekçi olmayan beklentiler, iş için doğru insanları alamama ve / veya işlerini yapmalarına izin vermeme, sonuç olarak onları muhafaza edememe; SW geliştirme çalışmaları için uygun olmayan işyerleri ve aletler; işlenmemiş kişisel çatışmalar; siyaset ; bunlar, bir projeyi en başından beri mahvedebilecek tipik sorunlardan sadece birkaçıdır.

İyi kod yazmak neden daha zordur?

İyi kod yazmanın on yıl önce olduğundan çok daha zor olduğuna ikna olmadım. Aslında, makine kodu veya montajla karşılaştırıldığında, şu anda ana akımda sahip olduğumuz her şeyin kullanımı çok daha kolay. Sadece daha fazlasını üretmemiz gerekebilir.

Sadece söz konusu faktörler, zaman ve karmaşıklık yüzünden mi?

Evet, araçlarımızın gücü arttıkça ulaşılabilir karmaşıklık kesinlikle arttı (ve artmaya devam ediyor). Başka bir deyişle, sınırları zorlamaya devam ediyoruz. Bana öyle geliyor ki, o günün en büyük zorluklarını çözmek için 30 yıl önce olduğu gibi bugünün en büyük zorluklarını çözmek de aynı derecede zor.

OTOH, alan çok büyüdüğünden, 30 yıl öncesine göre artık çok daha "küçük" veya "bilinen" sorunlar var. Bu problemler artık teknik olarak zor olmalı (olmamalı), fakat ... burada en üst seviyeye giriyor :-(

Ayrıca o zamandan beri programcıların sayısı çok arttı. Ve en azından kişisel algılarım, ortalama tecrübe ve bilgi seviyesinin azalmasıdır, çünkü bu alana sürekli olarak gelen gençler, onları eğitebilecek yaşlılardan çok daha fazladır.

Metodolojiler doğru bir şekilde uygulanmıyor mu?

IMHO kesinlikle hayır. DeMarco ve Lister'ın big-M Metodolojileri hakkında sert sözleri var. Hiçbir Metodolojinin bir projenin başarılı olamayacağını söylüyorlar - sadece ekipteki insanlar başarabilir. OTOH, övdükleri küçük-m metodolojileri şu anda yaygın olarak yayılan "çevik" olarak bildiğimiz şeye oldukça yakın (iyi bir nedenden dolayı IMHO). Sadece 10 yıl önce yaygın olarak bilinmeyen birim testi ve yeniden düzenleme gibi iyi uygulamalardan bahsetmiyorum ve günümüzde birçok mezun bile bunu biliyor.


2
Bir dilbilgisi Nazi ya da 'gerçek dışı' olmaktan başka bir şey olmamak (ikinci paragrafta) tek kelime değildir. Bence 'gerçekçi olmayan' demek istiyorsun.

Sadece "Genç" meselesini destekleyebilirim. Ben onlardan biriyim ve kesinlikle bana yardımcı olacak bir mentorum olmasını isterdim. İnternet ... hala orada bugün, ve Amazon ve SO yardım, ama bu müteşekkir olduğunu
Matthieu M.

1
+1: Ayrıca, araçlar / teknolojiler / metodolojilerdeki hızlı değişim ve büyüme nedeniyle, bir dereceye kadar hepimiz yılda en az birkaç kez gençleriz. Deneyim sadece bazı veterinerlerin bazı saatlerden daha hızlı hızlanmasına izin verir.
Steven Evers

Güzel kodu çirkin olandan ayırmak için resmi bir kuralımız yoksa bu soruyu ciddiye almayı reddediyorum.
shabunc

17

Gerçekçi olmayan son tarihler altında kodlama ve teknik borçlarla ilgili konular Weinberg '71 ve Brooks '72'den beri bilinmektedir. Bundan önce literatürün çevrimiçi olarak yayınlanması zorlaşıyor, ancak eminim aynı şeyi söyleyen eski CDC, IBM ve NASA raporları var.


1
+ "Teknik borç" ve referanslar için.
Amir Rezaei

10

Bence hepimizin "İyi Kod" için kendi fikirleri ve eşikleri var. Bununla birlikte, hepsinin katkıda bulunduğu bir takım sorunlar vardır:

  • "Çalıştırın sonra geliştirin" yanlış uygulanması, ölü kod ve her biri kod tabanında yalnızca bir kez kullanılan aynı yöntemin 10 farklı varyantını bıraktığımız anlamına gelir. Bu ţeyler asla temizlenmiyor gibi görünüyor.
  • Zaman ve bütçe eksikliği. Müşteri 3 ay içinde 100 yeni özellik istiyor, bazıları önemsiz değil ve doğrudan göremedikleri şeylere para harcamak istemiyor.
  • Bakım eksikliği. Kabul edelim, bazı geliştiriciler kodun diğerlerinden daha fazla nasıl göründüğünü ve davrandığını önemsiyorlar. Örnek için ilk madde işaretine bakın.
  • "İyi kod" un nasıl oluşturulacağını gerçekten bilmiyoruz. İyi kod kavramım sürekli gelişiyor. On yıl önce iyi olduğunu düşündüğüm artık o kadar iyi değil.
  • "İyi kod" bir değer yargısıdır. "Çalışır" dışında ve bilinen bir hata yoktur, iyi kod için başka herhangi bir kriter aslında bir fikir meselesidir.

Sonunda, "iyi" veya "en iyi" peşinde koşmaktan daha iyi bir yol izlemenin en iyisi olduğunu düşünüyorum . En iyi kodu orada görürsek, bu şekilde tanıyabilir miyiz?


1
+1 İyi puan. "İyi kod" ile mükemmel kod referans vermedi. Mükemmel kod mevcut değil. “İyi kod” size baş ağrısı vermeyen bir koddur, örneğin iyi düşünülmüş.
Amir Rezaei

1
"İyi kod" hareketli bir hedef olmak için mükemmel bir nokta. Ancak bunun sadece bir değer yargısı olduğuna katılmıyorum. Temiz kodun dağınık koddan daha kolay test edilmesi, genişletilmesi ve sürdürülmesinin daha kolay olduğuna inanıyorum, bu nedenle uzun vadede ölçülebilir derecede daha ucuz. Tabii ki, gerçek SW projelerinde kontrol gruplarıyla tipik olarak çift kör testler yapmadığımız için ;-), bunun sadece anekdot kanıtları var, sert bilimsel kanıt yok.
Péter Török

Her iki "iyi kod" tanımımızın da hemfikir olduğu anlaşılıyor. Bununla birlikte, hayatımı daha kolay hale getiren iyi API tasarımının bazı yıldız örneklerini gördüm - ancak kütüphanede birim testleri yoktu. Bu, test edilmediği anlamına gelmez, sadece testi otomatikleştirecek bir şey yoktu. Bunun için yer bırakıyorum.
Berin Loritsch

8

İyi kod yazmak neden daha zordur?

Çünkü yazılım, soyutlama katmanlarının üstüne giderek daha fazla inşa ediliyor. Geliştirmeyi daha kolay ve daha hızlı hale getirdiğini iddia eden her yeni teknoloji, bir geliştiricinin anlaması gereken bir karmaşıklık düzeyi daha ekliyor. Şimdi, bu soyutlamanın üretkenliğe büyük faydası olabilir, ancak neyi saklamaya çalıştıklarını anlamıyorsanız, yazılımı hatalara ve düşük kaliteye daha duyarlı hale getirir.


+1 Çok iyi bir nokta, yeni araçlar daha fazla karmaşıklığa yol açabilecek üretkenliği artırır.
Amir Rezaei

1
+1. "Sızdıran Soyutlamaların Yasası" olarak da bilinir. :)
Bobby Tables

6

Modern yazılım geliştirmede iyi kod imkansız mı?

Gerçekten de mümkün değil. Ama daha önce duyduğunuz sebeplerden herhangi biri için değil.

Projelerin büyük çoğunluğunun kapsamı bir insan beyninin kapasitesinin çok ötesindedir. Bu yüzden insanlar soyutlama fikrini ortaya attılar , bu da detayları saklamaya devam ediyor ve dalların yoğunluğu (ele alınacak bilgi miktarı) kabul edilebilir bir orana düşene kadar soyutlama ağacına tırmanıyor.

Bunu yaptık, karmaşıklık sorununu çözdük, ama bu daha önce yaşadığımız daha büyük sorunu çözmedi.

Bizim için hala çok karmaşık.

Yüksek kaliteli bir çözüm oluşturmak için, her şeyi aynı anda görebilmeli ve anlayabilmeliyiz , yani tüm modüller büyük ve tüm küçük uygulama detaylarında. Aynı anda tutarsızlıkları görmek için, tüm kod parçalarını olası tüm senaryolar bağlamında görün ve tüm kod tabanını aynı anda optimize edin.

Bunu asla yapamayacağız.

Ve eğer yapamazsak asla kalite kodu üretmeyiz.

Yöneticiler modüllerin dağılmasını görecek, ancak modül başına dahili sorunları ve sınırlamaları bilmeyeceklerdir.

Modül programcıları yerel sınırlamaları bilirler, ancak daha büyük bir resim bağlamında optimize edemezler.

Yöneticiler ve programcılar arasında (ve hatta programcılar arasında) anlayışı iletmenin bir yolu yoktur. Ve olsa bile, insan beyninin kapasitesi bunu başaramadı.

Denemeye devam etmek dışında yapabileceğimiz çok az şey var (boşuna bir egzersiz). Kodu az ya da çok çalışır halde tutalım ve hayatın tadını çıkaralım.


Bu yanıtı beğendim, eğer bu kadar kötümser, kaderci bir tonda yazılmamış olsaydı ...
Timwi

1
@Timwi: Gerçekten kötümser değil. Sana yükü hafifletmesi gerekiyordu. :)

4

Sorunuzun önermesini inkar ediyorum. İyi kod yazmak her zamankinden daha kolay ve bu nedenle daha önce uğraştığımız sorunları çok daha fazla ele alıyoruz.

Herhangi bir satıcı seçmek istemiyorum, ancak Windows 1.0 ile Windows 7 karşılaştırın. İkincisi binlerce kat daha fazla kod içeriyor, ancak çökmeler arasındaki ortalama süre yüz kat arttı. Windows 3.1'den beri bir Excel belgesini bir Word belgesine gömebilmemiz gerekiyordu, ancak bu günlerde az çok çalışıyor.

"Bugünlerde ördek yazmanız ve VM ile çocuklarınız" duygusallığına düşmek istemiyorsanız, 80'lerde iyi kod yazmanın ne kadar zor olduğu hakkında hiçbir fikriniz olmadığını öneririm: TINY, SMALL ve HUGE bellek modelleri, kaplamalar , kiracı olmayan işletim sistemi çağrıları (titreme). Tüm bunlara iyi kurtuluş.


Konu dışı kalmaktan nefret ediyorum, ancak şahsen Windows 1.0'dan 3.11'e, muhtemelen karmaşıklık eksiklikleri nedeniyle aslında çok kararlı olduğunu iddia ediyorum. Windows'un en çirkin sürümleri 95, 98 ve ME idi. Elbette, hangi sürümlerin başka şekillerde “iyi” olduğu farklı bir konudur.
Timwi

Düşük güçlü sistemler yerine mini bilgisayarlarda veya ana bilgisayarlarda kodlamaya ne dersiniz? Başvurduğunuz sorunlar Intel 8086 modeliyle ilgilidir ...
Paul Nathan

@ Paul, 8086 sorunları en çok ilgilendiğim sorunlardı, bu yüzden aklımda büyük görünüyorlar. Bununla birlikte, ana karelerde bile yazılım yazma araçları modern standartlara göre inanılmaz derecede kaba. Editörler genel olarak edlin'e emaclardan daha yakındı. 1982'ye kadar IBM donanımında NUROS (Nebraska Üniversitesi Uzaktan İşletim Sistemi) kullanıyordum. İşler programlandı ve 'sanal' delikli kartlar kullanılarak yürütüldü. Ve çoğunlukla depolamada algılanan kısıtlamalar ile büyük demir üzerine çıkan Y2K hatalarını unutmayalım.
Charles E. Grant

2

Modern uygulamalar şunlardır çevreleri daha zengin ve çok yönlü daha çünkü onlar, 20-30 yıl öncesine göre daha karmaşık.

Bir DOS programının, kullanıcıdan sonraki tuşa basmayı bekleyen sıkı bir döngüde oturması ve karşılık gelen kodu çağırması ve bir sonraki tuşa basmayı beklemeye geri dönmesi tipikti.

Fareyi TÜMÜ'nde hiçbir şey için kullanamayacağınız herhangi bir modern uygulamada ciddi bir açıklama sorunu var. Kullanıcının yazdığı, kullanıcıya en yeni girişleri gösteren uygulamada RSS beslemeleri güncellenirken, kullanıcının yazması, fareyle tıklaması ve yazmaya devam etmesi mümkün olduğu için, herhangi bir sırada olabilir.

Tüm bu çoklu görevler, düşünmeniz gereken tek şey kullanıcının anahtarlarından çok daha karmaşık. Bu gerçekten iyi kod yazmayı zorlaştırır.

Umarım araştırmacılar, çoklu görev programlarını geliştiriciler açısından nasıl daha kullanışlı hale getirebileceğimizi anladığında, bu kolaylaşabilir, ancak şimdilik bunu iyi yapmaya çalışan herkesle sıkışıp kaldık, ancak nasıl yapılacağını bilmiyoruz o.


+1 "Modern uygulamalar 20-30 yıl önce olduğundan daha karmaşık"
Amir Rezaei

2

Bana öyle geliyor ki, yazılım mevcut işlemci hızını, belleği, diski ve programcı süresini dolduracak şekilde genişledi. Yazılım bunun çok daha fazlasını başardığı için iddia edilebilir. Eminim çok daha fazlasını başarır, ama şişmeyi haklı çıkarmak için yeterli değildir.

Sanırım hatırlamaya değer eski bir bilim yasası var:

Doğa bir boşluktan nefret eder.

Francois Rabelas (Fransız keşiş ve hiciv 1494-1553)


1

Aslında, iyi kod yazmanın daha kolay hale geldiğini düşünüyorum, yani son on yılda beklendiği gibi çalışan ve sürdürülebilen programlar. Mevcut araçlar şimdi daha iyi, kütüphaneler daha olgun ve kapsamlı, donanım çok daha hızlı hale geldi, bu yüzden optimizasyon numaralarını kullanmak zorunda değiliz.

Öyleyse neden yapmıyoruz?

IMO'nun ana nedeni, sürekli olarak şeyleri kötüye kullanmanın yollarını ve mazeretlerini aramamızdır. Bir Windows yürütülebilir dosyası oluşturmak gibi eski moda, kolay, muhtemelen sıkıcı bir şekilde gitmek yerine, mümkün olanın sınırlarını zorluyoruz ve örneğin bir web uygulaması olarak PhotoShop gibi bir şeyi yeniden yaratmanın yollarını arıyoruz. Neden? Çünkü yapabiliriz. Ya da en azından öyle düşünüyoruz.


1
İnovasyondan kaçınılması ve eski moda teknolojilerin veya yöntemlerin hiçbir zaman kullanılmaması gerektiği sonucuna katılmıyorum. O zaman herhangi bir program yazmayı bırakabilir ve sadece sahip
olduklarımızı

Timwi: Yeniliğe karşı tartışmıyorum. İyi kod yazmanın çok zor görünmesinin nedeni budur.
user281377

1

En son ne zaman ANYONE ne zaman bir istismar yazmadı ya da meclisle dolaştırıldı (çekirdek bilgisayar korsanlarını ve ASIC adamlarını saymıyor)? C çekirdek kütüphanelerinde kaç hata bulundu? Neredeyse hiçbiri ve birkaç. Söylediğim tek şey insanların mükemmel kod alabilmeleri. Daha iyi araçlar ve diller, onu daha az 'gerekli' ve daha 'isteğe bağlı' yapar. Hepimizin gerçekten korkunç bir kod yazmamız gerektiğini düşünmüyorum, ama karmaşık mantıksal yapıları düşündüğümde ... hiç kimse montajda karma dizilerle bir şeyler yazmayı hayal etmezdi. Karmaşık bir yapı kullanmak yerine mantığı işlemek için “daha ​​iyi” bir yol olmalıydı. Kod güzel olsa bile, bazen yaklaşım o kadar zarif değildir. Sanırım bahsettiğiniz problemi çözüyor. İyi kod her zaman organize değildir,


Gömülü sistem adamları iyi bir montaj yazın.
Paul Nathan

Paul Nathan True
RobotHumans

0

Bence bunun nedeni, daha iyi araçlar ve daha hızlı yanıt veren bilgisayarlar, birkaç yıl (veya birkaç on yıl) öncesine göre çok daha fazla nihai ürün karmaşıklığı perunit süresi elde etmeyi umduğumuz anlamına geliyor. Bu yüzden uygulamaların karmaşıklığı artmaya devam ediyor ve makul bir verimlilik düzeyinin ne olduğuna dair varsayımlarımız büyümeye devam ediyor.

Çalıştığım yerde, geliştiriciler her zaman acele ediyorlar (çünkü müşterilerin istedikleri her zaman daha fazla şey var, o zaman için zaman var). Bu yüzden çok sayıda kod bloğu, minimum düzenleme ile ve onları gerçekten anlamak için çaba sarf etmeden kopyalanır. Ve elbette hatalar yapılır. Bir geliştiricinin optimizasyonu geçerli kılan varsayımların onu nereye koyduğu doğru olmadığını fark etmeden optimize ettiğim bazı kodları kopyaladığı bir hatayı düzelttim.

Bütün bunlar hem içsel (kendi beklentilerimiz) hem de organizasyonlarımızdan beklentilerle ilgilidir. Mümkün olduğunca kısa sürede mümkün olduğunca çok yapmaya çalışıyoruz. Ve hatalar kaçınılmaz olarak sonuçlanır.

Ayrıca bilgisayar duyarlılığı hızlı bir hızlı düzenleme, daha sonra bir derleme ve test çalıştırmasını teşvik eder. Eski eski günlerde (35 yıl önce olduğu gibi), geri dönüş o kadar yavaştı ki, kodu yazdıracağım (daha sonra kaynak kartlardı) ve destemi göndermeden önce kodun manuel bir adımını atıyorum. Şimdi, derleme ve yürütme işlemlerini düzenliyoruz. Bu nedenle, yöntemsel kod geçişi yoluyla fark edeceğimiz birçok hata, şimdi derleyiciye ve / veya bunun yerine yakalamak için birim test paketine güveniyoruz.


Henüz en ucuz ilk kez doğru yaptığını öğrenmemiş genç bir şirket gibi geliyor ...

Thorbjorn: Şaşırtıcı neredeyse otuz yıldır var. Ve aslında oldukça iyi. Tabii ki müşteri taleplerine (bize) çok duyarlı iş modelleri ve bazıları da kalite odaklı. Her ikisi de olmak gerçekten zor.
Omega Centauri

0

İnsanlar iyi kod üretmede nasıl kötüleşti?

Eğer alırsan .NET ve C # gibi bir dil, örneğin, ben kodlama iddia ediyorum (ve bunu tek platform / dil olmadığını fark) de bağlı Visual Studio içinde birçok şeyin otomasyona çok, çok daha kolay hale geldi ortamı.

Eğer bir şey varsa, şimdi kodlama ve geliştirme sürecinde bize rehberlik edebilecek çok sofistike IDE'lere sahip olmamız, "iyi kod" u elde etmeyi kolaylaştırıyor.

Programcılar artık parantez ve parantez ve yeni satırlar yazmak ve yöntem çağrılarını ve sınıf adlarını hatırlamak için çok fazla zaman harcamak yerine aslında iyi bir yapı üretmeye odaklanabilirler.

Benim görüşüm.



-2

kod kalitesi daha iyi değil

lütfen “iyi kod” un yorumuna saplanmayın

Harika mantıklı totoloji.

Kod daha iyi olamaz çünkü insanlar "iyi" tanımını değiştirmeye devam eder.

Eğer "iyi kodu" tartışabiliyorsanız, kıyaslayamazsınız ve bunun "bir meydan okuma" olup olmadığına gerçekten karar veremezsiniz.


Benim için "iyi kod" böcek sayısını azaltır öyle. Şimdi bu pek çok şekilde gerçekleştirilebilir.
Amir Rezaei

@Amir Rezaei: "“ İyi kod ”un tanımı bireyseldir”. "'iyi kod', hata sayısını azaltacak şekildedir" Lütfen yalnızca bir tanım seçin ve sorunuzu yalnızca bir tanım içerecek şekilde güncelleyin .
S.Lott

Peki "iyi kod" böcek sayısını azaltır " benim kişisel" iyi kod "fikrimdir. Bence herkes projenin ne zaman temizlenmesi gerektiğini biliyor .
Amir Rezaei

@Amir Rezaei: Bu benim açımdan. Soruda "iyi" yi tanımlayamıyorsanız (veya yapmayacaksanız) karşılaştıramayız. Hata sayısının aynı olduğunu iddia edebilirsiniz. Bazıları, hataların maliyetinin düştüğünü iddia edebilir. Bir diğeri, hataların planlanması nedeniyle iş riskinin arttığını iddia edebilir. "İyi" nin tek bir tanımı olmadan hepimiz farklı şeyler hakkında konuşabiliriz. Lütfen soruyu güncelleyin .
S.Lott

İyi Kod: derlendi, testleri geçti, kullanıcı onayı aldı ve üretime alındı. Umarım kimse değiştirmek istemez.
JeffO
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.