Hızlı ve kirli programcılar doğru yaptıklarını nereden biliyorlar?


166

Programcılara neden temiz kod yazmaları gerektiğini sorarsanız, aldığınız bir numaralı cevap bakımdır. Listemde, ana nedenim daha acil ve daha az özgecil: Yeni kodumun çok kirli olup olmadığını doğru söyleyemem. Bireysel fonksiyonlara ve kod satırlarına o kadar odaklandığımı buldum ki, ilk taslağımı bitirip tekrar büyük resme bakmak için geri adım attığımda bazen çok iyi bir şekilde birbirine uymuyor. Temizlik için bir ya da iki kez yeniden yapılanmanın harcanması çoğu zaman kaba taslakta tespit edilmesi zor olan kopyalama / yapıştırma hatalarını veya sınır koşullarını ortaya çıkarır.

Bununla birlikte, bazı insanlar, "sonradan temizlemeyi" planlayan, nakliye yazılımının çıkarına yönelik kirli kodları kasten kontrol etmenin zaman zaman sorun olmadığını düşünüyor. Okunabilirlik idealin altında olduğunda kodlarının doğruluğuna güven veren bazı uygulanabilir teknikler var mı? Geliştirmeye çalışacak bir beceri mi? Yoksa, bazı insanların kabul etmeyi daha kolay bulduğu bir şeye güven eksikliği mi?


40
Benim teorim, tüm kodlayıcıların "ezberleyiciler" ve "anlayışlı kişiler" arasında bir yere düştüğü ve pek azının her ikisini de iyi yapabildiği. Aynı anda ne kadar çok şey hatırlarsanız, kodunuzu oluşturmak için o kadar dağınık olabilirsiniz. Kodun temiz olup olmadığı, çalışmasını sağlayın, test edin!
İş

35
Bununla birlikte, bazı insanlar, "sonradan temizlemeyi" planlayan, nakliye yazılımının çıkarına yönelik kirli kodları kasten kontrol etmenin zaman zaman sorun olmadığını düşünüyor. heh ... cehennem daha sonra " dondu " ...
Carlos Campderrós

28
Tüm programcılar aynı şeyi düşünmüyorlar - Bana aylarca anlam ifade etmeyen kodları verdim, bir güne kadar, genel organizasyon yapısının ne olduğunu anladığım gibi, bir ışık anahtarının çevrildiği gibiydi. neden yaptıklarını anlamışlardı. Bu şekilde mi yapardım? Hayır, ama işe yaradı.
Joe,

12
@joe - +1 - bazı programcılar kişisel "iyi kod" fikrine uymayan kodları silmek için çok hızlıdır. Her zaman bir kod gövdesinin arkasındaki düşünceyi ve kod stilini anlamaya çalışmalısınız, sıklıkla yararlı bir şeyler öğreneceksiniz.
James Anderson

10
How do quick & dirty programmers know they got it right?Çünkü işe yarıyor :)
Rachel

Yanıtlar:


100

Kod muhtemelen doğru değil.

Ancak, önemli olmayabilir.

Çabuk ve kirli, şu durumlarda gitmek için doğru yol olabilir:

  • Kodun ömrü kısa . Örneğin, geçici bir programla bir sürü veriyi standart bir formata dönüştürüyorsunuz.
  • Başarısızlığın olumsuz etkisi düşük :
    • Dönüştürmekte olduğunuz veriler kritik değildir ve içindeki hatalar kolayca düzeltilebilir
    • Son kullanıcı, hata mesajlarını düşünecek ve çevrelerinde çalışacak, girdiyle masaj yapan sempatik bir programlayıcıdır.

Bazen kodun sağlam olması ve akla gelebilecek her girişi ele alması önemli değildir. Bazen sadece elinizdeki bilinen verileri ele alması gerekir.

Bu durumda, ünite testleri kodu daha hızlı yazmanıza yardımcı oluyorsa (bu benim için geçerlidir), sonra bunları kullanın. Aksi takdirde, hızlı ve kirli kod, işini halletmek. Tetiklemeyen böceklerin önemi yok. Anında tamir ettiğiniz veya üzerinde çalıştığınız hatalar önemli değil.

Kesinlikle hayati olan bu durumları yanlış teşhis etmemeniz. Kodun yalnızca bir kez kullanılacağından hızlı ve kirli kodlarsanız, birileri daha iyi kod gerektiren bazı projelerde kodu yeniden kullanmaya karar verirse, bu kod daha fazla dikkat edilmesini hak eder.


24
"Başarısızlığın etkisi düşük" için +1. En sevdiğim matematiksel risk hesaplaması risk = başarısızlığın gerçek sonucu x başarısızlık olasılığı x başarısızlığın sonucu algılandı (Tecrübelerime göre, paydaşların sık sık takıldığı algılanan risk)
Trav

7
"Kodun kullanım ömrü kısa. Örneğin, geçici bir programla bir demet veriyi standart bir formata dönüştürüyorsunuz." Dönüşüm doğru şekilde yapılmazsa, ancak verilerdeki farklılıklar daha sonraya kadar fark edilmezse ne olur?
Joey Adams

3
@Trav Öyleyse, sadece doğrulamak için, başarısızlığın gerçek sonucu çok büyükse, ancak başarısızlığın algılanan sonucu sıfırsa, hiçbir riski yoktur?
Christian Stewart,

3
@HristiyanStewart Tamamen matematiksel bir bakış açısıyla, iddianız doğru olacaktır. Bununla birlikte, pratikte, sonucun sıfır olduğu algısı olasılık x fiili sonucun ağırlığını olumsuz etkilemeyecektir. Algı, azaltma kararlarını sıklıkla etkileyen örgütsel korkuları hesaba katan formüle yerleştirilir. Böyle bir korkunun olmayışı gerçek olasılık veya sonuçları azaltmaz. Bu nedenle, kişi algılamanın her zaman en azından 1'e eşit olduğunu varsaymalıdır (çünkü gerçek anlamda herhangi bir riskini büyütebilir, ancak olumsuz etkileyemez)
Trav

1
@Trav Alternatif olarak, birini yeniden adlandırın. Yani, riskin algılanan riske takılması gerekir , çünkü başarısızlığın bir sonucu olmadığına inanırsak, muhtemelen risk olmadığına da inanıyoruz.
Delioth

237

Yapmazlar. Şu anda "daha sonra temizleyebilecek" programcılar tarafından oluşturulan "hızlı ve kirli" bir kod tabanı üzerinde çalışıyorum. Çoktan gittiler ve kod devam ediyor, unutulmaya doğru ilerliyor. Kovboy kodlayıcıları , genel olarak, yazılımlarının sahip olabileceği tüm olası arıza modlarını anlamıyor ve şirketi (ve müşterileri) maruz bıraktıkları riskleri anlamıyor.


31
Ne zaman "sonra temizle" veya "işler biraz yavaşladığında" hep söylemeye başladım "şarkı söylemeye başladığımda" yarın, yarın, seni yarın seveceğim. Yine de bu sadece ben olabilirim.
JohnFx

8
Birçoğumuz bu talihsiz durumdayız. Diğer insanların teknik borcundan feragat edilmesi oldukça üzücü .
Mark Booth,

34
Asıl sorun, diğer programcıları kovboy veya hızlı & kirli ya da diğer unvanlara sınıflandırmaktır. Her programcının bazı hata modları vardır ve birinin başka bir kodu okuması çok zordur ve kendi hatalarınızı bulmak çok zordur. Bunların hepsi birlikte, insanların kendi kodlarının mükemmel olduğunu düşünürken diğer programcıları kolayca kötü olanlar olarak etiketleyebileceği anlamına geliyor
tp1

3
@ tp1: İyi programcılar okunması kolay bir kod yazabilir. Bunu başka birinin okumasını sağlayarak ve belirsiz olan her şeyi netleştirerek yaparlar. Uygulamada, ilk okumadaki belirsiz olan kısım küçülecektir.
kevin cline

9
@JimThio, yukarıda belirtilen programcılardan herhangi birinin kasıtlı olarak kötü kod yazdığını ciddi olarak düşünüyor musunuz? Birkaç yıl önce kendiniz tarafından yazılan kodları okudunuz mu? İyi buldun mu? Muhtemelen, o zaman elinizden gelenin en iyisini yaptınız ve hala bu kodda iyileştirilmesi gereken çok şey var.
Péter Török

103

Tamam, aşırı oylama riski altında olma ihtimaline karşı, karşıt görüşümü "şeytanları savunacağım".

Geliştiricilerin uygun uygulama ve kod temizliği gibi şeyler hakkında aşırı endişe duyma eğiliminde olmalarını öneriyorum. Ben böyle şeyler önemli iken, düşündürmektedir Gönderebileceğiniz asla eğer hiçbiri önemli .

Bir süredir bu işte olan herkes muhtemelen bir parça yazılımla süresiz olarak çalışmanın mümkün olacağı konusunda hemfikirdir. Duke Nukem Forever, dostlarım. Bu güzel olması ya da çok acil yeniden yapılanma çalışmasının bir kenara bırakılması ve olayın DONE olarak adlandırılması gerektiği bir zaman gelir.

Meslektaşlarımla bunun hakkında birçok kez savaştım. HER ZAMAN bir tane daha çimdik var, “doğru” olması için “yapılması gereken” bir şey daha var. HER ZAMAN bunu bulabilirsin. Bir noktada, gerçek dünyada, yeterince iyi, sadece yeterince iyi olmak zorunda. Gerçek dünya yok, gerçek, nakliye yazılımı mükemmel. Yok. En iyi ihtimalle, yeterince iyi.


9
Belki de yıllarca zor kullanılırsa, muhtemelen dağınıklık gibi görünmesine neden olur. Eğer kullanılmazsa (hiç veya uzun süre için), herhangi bir zalim birikme şansı olmaz.
Yararsız

7
“Bir süredir bu işte çalışan herkes, muhtemelen bir yazılımla süresiz olarak çalışmanın mümkün olacağı konusunda hemfikirdi.” Bu mümkün olurdu, ama neden yapıyorsun? Kalite standardınızı belirledikten sonra, onu tasarlar, uygular, test eder, hataları giderir, tekrar test eder ve sonra bir daha dokunmayın. Sadece hacklemekten daha uzun sürer, ancak hedefinize ulaştıktan sonra (gerekli işlevler yerine getirilir ve test edilir), kodla daha fazla uğraşmamanız gerektiği çok açıktır. Sadece 2 sentim.
Giorgio,

7
+1 - Gerçek dünyada her zaman kod kalitesi ve toplantı son tarihleri ​​arasında bir değişim olacaktır. Aylar geçiren bir mükemmeliyetçiden ziyade hızlı bir şekilde makul kod üretebilen bir programcıya “seri hale getirme” veya “writeToFile” yöntemini çağırıp çağırmayacağı konusunda acı çekmeyi tercih ederim.
James Anderson,

3
Sen söyledin. Bir sonraki odada, son 5 yıldır yeni bir sistemin işlevsel gereklilikleri üzerine çalışan bir ekip olduğu bir organizasyonda çalıştım, bunun için bir kod satırı yazılmadı. Pek çok kodlayıcı aynıdır (özellikle gençler, üniversiteden yeni çıkmış, kodun güzel olması ve belirli "standartlara" kötü gelmesi gerektiği konusunda yüksek fikirleri vardır) ve durmadığı sürece, aylar öncesinden kusursuz bir şekilde işleyen bir şeyle bitmez bazen hala bu eğilim var, bence hepimiz varız). Ama sonunda önemli olan onu kapıdan çıkarmak.
24'te

6
@Giorgio: "Batıl inançlarınız" ile, kaliteli çalışmanın sadece hacklemekten daha uzun sürdüğü konusunda hemfikir değilim. Programlamayı yazarak eşitlediğinizde bu doğru olabilir. Tüm yazılım kullanım ömrü göz önüne alındığında, işler daha yumuşak ve dolayısıyla kaliteye önem veriyorsanız daha hızlı olur.
ThomasX

85

Bu tür programcılar neredeyse doğru anladıklarını bilmiyorlar , sadece buna inanıyorlar . Ve fark algılanması kolay olmayabilir.

Birim testini öğrenmeden önce nasıl programladığımı hatırlıyorum. Ve ilk iyi birim testlerimi yaptıktan sonra, tamamen farklı bir seviyede güven ve güven duygusunun olduğunu hatırlıyorum. Daha önce var olan kodumda böyle bir güven olduğunu bilmiyordum.

Bu deneyimden yoksun olan biri için, farkı açıklamak mümkün değildir. Bu yüzden, yaşamları boyunca kod ve dua modunda geliştirmeye devam edebilirler, iyi niyetli (ve cahilce) durumları göz önünde bulundurarak en iyisini yaptıklarına inanarak.

Bununla birlikte, gerçekten de tüm problem alanını aklında tutmayı, tam bir akış durumunda tutmayı başardığında, gerçekten büyük programcılar ve istisnai durumlar olabilir. Böyle nadir anlar yaşadım, ne yazacağımı mükemmel bir şekilde bildiğimde, kod benden kolayca çıktı, tüm özel durumları ve sınır koşullarını öngörebildim ve ortaya çıkan kod işe yaradı . Şüphesiz, orada uzun süre boyunca ve hatta zamanlarının çoğunda bu tür akış halinde kalabilen programlama dehaları var ve ürettikleri şey, görünüşte çaba göstermeden güzel kodlar. Sanırım böyle insanlar zaten bildiklerini doğrulamak için cılız birim testleri yazmaya gerek duymayabilirler.. Ve eğer gerçekten böyle bir dehaysanız, tamam olabilir (her ne kadar olsa bile, sonsuza dek bu projenin etrafında olmayacaksınız ve halefleriniz hakkında düşünmelisiniz ...). Ama eğer olmazsa...

Ve bununla yüzleşelim, şansın siz değilsiniz. Ben, kendim için olmadığımı biliyorum. Çok nadir akan anlar yaşadım - ve genellikle kendi hatalarımın neden olduğu sayısız saatlerce keder ve keder. Dürüst ve gerçekçi olsa iyi olur. Aslında, en büyük programcıların kendi hatalarını ve geçmiş hatalarını tam olarak bildiklerine inanıyorum, bu yüzden bilinçli olarak varsayımlarını iki kez kontrol etme ve bu küçük birim testlerini yazma, kendilerini güvende tutmalarını sağlama alışkanlığını geliştirdiler. ( "Ben iyi bir programcı değilim - sadece büyük alışkanlıklara sahip iyi bir programcı." - Kent Beck.)


8
"yardımsever (ve cahilce), koşulları göz önünde bulundurarak ellerinden gelenin en iyisini yaptıklarına inanmak." Sorunun mükemmel özeti. # 1 kısıtlamalar yüzünden koştu ve elinden gelenin en iyisini yaptı. # 2 geliyor ve kaos ve yeni tarihler devraldı ve elinden gelenin en iyisini yapıyor. Hasarını geri almak için yılları olsa, elinden gelenin en iyisini yapamayan 20. zavallı ruhun sonuna kadar. Bu yüzden, İzci Kuralını uyguluyorum, "bulduğunuzdan daha temiz bırakın". Bir sonraki sapa savaşma şansı verin - bu siz olabilirsiniz.
Steve Jackson,

1
Komik, kodumu test etmeye başladığımdan beri (işte) tersini hissediyorum. Tembelleşmek gibidir; kodunuzu gerçekten anlamak için hiçbir neden yoktur , çünkü diğer kod sizin için hatalar yakalayacaktır
Izkata

8
İçeri birim testleri yazmak parçası kendi kod çalıştığını kanıtlamak için. Daha da önemlisi, diğer geliştiricilerin kodunuzu güvenle değiştirebilmeleri için birim testleri yazıyorsunuz .
Stephen Gross

4
Donald Knuth: "Yukarıdaki koddaki hatalara dikkat edin; sadece doğru olduğunu kanıtladım, denemedim." haacked.com/archive/2007/11/29/…
MarkJ

1
@ Izkata - ne yaptığınızı anlamadıysanız, ünite testleri muhtemelen bozulur ve kodun testlerle aynı hataları yaptığını onaylar. Ayrıca,% 100 karar kapsamı ve doğru birim testleri ile bile, testlerin göstermediği bir hata olması mümkündür (sıra dışı olsa da).
Steve314

33

Birim testleri . Herhangi bir koda güvenmenin tek yolu (kirli veya değil).

Bir yan notta;

kısa yollar uzun gecikmelere neden olur (Pippin)


6
İyi alıntı, ama Gandalf değildi. O, Frodo ve Sam'in neden Hobbiton'dan ilk seyahatte, ülke genelinde Buckleberry Feribotu'nu kesmemeleri gerektiğini savunarak Pippin'di.
Daniel Roseman,

22
Düzeltme: "Birim testleri. Kodda yanlış güvenlik duygusuna sahip olmanın tek yolu (kirli veya değil)". Birim testlerinin yapılması iyidir, ancak hiçbir şeyi garanti etmez.
Kodlayıcı

8
Gizli böcekleri ortaya çıkarmak istediğimde, uygulamayı patronuma gösteririm. Ben bunu patron testi olarak adlandırıyorum, birim testinden sonra yapılmalı. CPU kayıtlarına doğrudan kozmik ışınların yanı sıra her türlü tuhaf hatayı da çeken bir manyetizma havası vardır.
Bay Smith,

8
Alıntı yaparken, "Test, böceklerin yokluğunu değil, varlığını gösterir" - Edsger Dijkstra
Timothy Jones

2
-1 testler dağınık kodları ispat etmeyecek - birim testler hiçbir şeyi kanıtlamıyor, size bir güven ölçüsü veriyor ancak bundan daha değerli bir şey değil. Onlar iyi bir önlem, sadece küçük bir kod alt bölümünün tam olarak sizin yazdığınız gibi çalıştığını, doğru yazdığını veya başka bir şeyle doğru bir şekilde etkileşime gireceğini söylemediğini varsaymaktan ibaret değil. Her ne kadar genelde iyi bir önlem olsalar da, berbat kod konusunda yardımları yoktur ve her refactor ile değiştirmeniz için size daha fazla kod vererek daha da kötüleşir.
Bill K

15

Ne kadar birim test ve kod ayarlaması yapılırsa yapılsın, makul karmaşıklığa sahip hiçbir yazılım sisteminin mükemmel olmayacağını kabul etmek iyidir. Beklenmeyen durumlara karşı bir dereceye kadar kaos ve güvenlik açığı her zaman kod içinde gizlenecektir. Bu, birinin iyi kod üretmeye çalışmaması veya birim testleri yapmaması gerektiği anlamına gelmez. Bunlar elbette önemlidir. Aranması gereken bir denge var ve bu projeden projeye değişecektir.

Geliştirilmesi gereken beceri, belirli bir proje için hangi düzeydeki “mükemmelliğin” kullanılması gerektiğinin anlaşılmasıdır. Örneğin, 12 aylık bir proje zaman çizelgesine sahip bir elektronik tıbbi kayıt uygulaması yazıyorsanız, bir kereye mahsus konferans kayıt web uygulaması için yaptığınız kodun test edilip korunmadığından emin olmak için çok daha fazla zaman ayırmak istersiniz. Cuma günü konuşlandırılması gerekiyor. EMR uygulamasını yapan biri özensizlediğinde veya kayıt uygulaması zamanında devreye alınmadığında, programcı kod ayarını yapmakla meşgul olduğu için sorunlar ortaya çıkıyor.


1
Kalite önlemleriyle ilgili kararların işletme ihtiyaçları tarafından gerekçelendirilmesi gerektiğine işaret eden +1.
Stephen Gross

+1 için * "Geliştirilecek olan yetenek, belirli bir proje için hangi seviyede 'mükemmellik' kullanılması gerektiğinin bir anlayışıdır." kalite açısından risk, sonra buna sadık.
S.Robins

11

Çabuk ve kirli bir alt sistemde mükemmel şekilde iyidir . Çöp kutunuzla sistemin geri kalanı arasında iyi tanımlanmış bir arayüze sahipseniz ve çirkin hızlı ve kirli kodun doğru olanı yaptığını doğrulayan iyi bir ünite testi seti varsa, tamamen iyi olabilir.

Örneğin, belki de üçüncü taraflardan gelen bazı dosyaları ayrıştırmak için olağandışı ifadeler ve bayt ofsetleri habersizdir. Ayrıca örnek dosyaları ayrıştırmanın sonucunun beklediğiniz gibi olduğunu söyleyen bir test olduğunu varsayalım. Bunu temizleyebildiniz, böylece ... Bilemiyorum, bir üçüncü taraf bir dosya biçimini değiştirdiğinde daha hızlı tepki veriyor? Bu sadece yeterince sık olmuyor. Daha büyük olasılıkla tamamen yeni bir API'ye geçeceklerdir ve eski ayrıştırıcıyı çöpe atarsınız ve aynı API'ye uyan yeni bir tane eklersiniz, işte bitirdiniz.

Hızlı ve kirli sorun haline geldiğinde, mimariniz hızlı ve kirli olduğunda. Çekirdek etki alanı nesnenizin iyi düşünülmüş olması ve arabirimleriniz, ancak sisteminizin kenarları, pipere ödeme yapmak zorunda kalmadan genellikle dağınık olabilir.


1
Başka bir deyişle, modüller Q&D olabilir, ancak mimarinin uygun şekilde temiz olması gerekir.
Kromster

9

İşte bildiğim hızlı ve kirli bir programcının hikayesi.

Birim açısından zaman kaybını test eden birini tanıyorum. Çok tartışmadan sonra nihayet bir tane yazdı. && ve | serpilir bir uzun yöntemden oluşuyordu. ve AssertTrue'a bir boolean döndü. İfade 20 satırdır. Sonra yine, her yöntemin bir satır ve bir tanesinde beyaz boşluk olmayan 1000 satırın olduğu bir sınıf yazdı. Bir metin duvarıydı. Kodunu incelediğimde ve bazı yeni satırlar girdiğimde 'neden' diye sordu. 'Okunabilirlik yüzünden' dedim. İçini çekti ve sildi. Üstüne bir yorum yaptı "Dokunma, işe yarıyor!"

Onunla son konuştuğumda, bir şirket için bir web sitesi kodladı. Bir hata bulmaya çalışıyordu. Son 3 günü bunu günde 8 saat boyunca geçirmişti. Bir süre sonra onunla tekrar konuştum ve takım arkadaşının edebi değeri değiştirdiği ve başka yerde güncellemediği ortaya çıktı. Sabit değildi. Böylece diğer edebi harfleri de değiştirdi, böylelikle böceği düzeldi. Takım arkadaşının spagetti kodundan şikayet etti. Bana 'Haha, hepimiz bütün gece hata ayıklayıcınızla kalacağınızın ne olduğunu bilmiyor muyuz, tek bir pis böcek üzerinde uyumayan "Bunun gerçekten iyi bir programcı olduğunu düşünüyor ve gerçekten de iyi hissediyor.

Ayrıca, programlama kitaplarını okuduğunu ve blogların faydasız olduğunu düşünüyor. 'Sadece programlamaya başla' diyor. Bunu 12 yıl boyunca yaptı ve mükemmel bir programcı olduğunu düşünüyor. / facepalm


İşte biraz daha.

Başka bir zaman web uygulamamız için bir DatabaseManager sınıfı yazıyorduk. Tüm veritabanı aramalarını içine koydu. Akla gelebilecek her şey için 50'den fazla yöntemi olan bir Tanrı sınıfıydı. Her bir denetleyicinin her veritabanı yöntemi hakkında bilgi sahibi olması gerekmediğinden, alt sınıflara bölmemizi önerdim. Kabul etmedi, çünkü tüm veritabanı için sadece bir sınıfa sahip olmak kolaydı ve gerektiğinde yeni bir yöntem eklemek hızlıdı. Sonunda DatabaseManager, kullanıcının kimliğini doğrulamaktan arkeolojik sit alanlarını sıralamaya kadar 100'den fazla ortak metoda sahipti.


1
+1. Nedense bu hikayeleri okumayı seviyorum. Artık beni üzgün ya da kızdırmıyorlar bile.
sam hocevar,

Her türlü _______ Yönetici sınıfını yazmak için -1.
Brian Driscoll

@SamHocevar Koş, thedailywtf.com 'a gitme
Mawg

7

Çabuk ve kirli olmaktan kaçınmak için gereken dersim, altı yıllık bir çalışmanın değeri olduğu tahmin edilen (düşük tahmin edilen) şeyleri teslim etmek için altı ayım olduğu zamandı. Çalışmaya başlamadan önce metodolojileri araştırmaya karar verdim. Sonunda üç aylık bir araştırmaya yatırım yaptım ve geri kalan üç ayda da sunabildim.

Ortak işlevleri belirleyerek ve bu gereksinimleri karşılamak için gerekli kütüphaneleri oluşturarak büyük kazançlar elde ettik. Kodlayıcıların mevcut kitaplık rutinleri olduğunda kendi kodlarını yazdığını hala görüyorum. Bu kodlayıcılar çoğu zaman aynı problemi daha sonra çözmeleri gerektiğinde, aynı kodu tekrar yazar veya en iyi ihtimalle kesip yapıştırır. Hata düzeltmeleri kaçınılmaz olarak yalnızca kod kopyalarının bazılarını yakalar.

Bir geliştirici kütüphane kodunu kullanmasını istediğimde bir cevap verdi: "Bu hile yapmıyor mu? Okuldaki tüm kodlarımı yazmak zorunda kaldım."


1
Oldukça etik bir geliştirici var!
Stephen Gross

6

Bazı durumlarda, "tüm" hataları bulan ve davranışı doğrulayan, böylece hızlı ve kirli bir kodlama tekniğine izin veren geniş bir regresyon testi grubu olabileceğini tahmin ediyorum. Fakat çoğunlukla sadece kötü bir proje planlama meselesi ve doğru bir şekilde yapmaktan daha önemli olduğunu düşünen bir yönetici.

Ve "sonra temizle" yi unut, bu asla olmaz. Nadir durumlarda, programcı işin bir çok işi ilk seferinde yapmasından daha pahalı hale getiren kodun çoğunu unutmuş olacak.


6

Ürün gönderilir.

Kod bir boşlukta mevcut değil. Çabuk ve kirli ve kovboy kodlamasının sonuçlarıyla açıklanamayan keder yangını yaşadım. Ancak bazen ürünü bitirmek önceliklidir, en iyi kodu nasıl yazacağınızı bulmak değil. Sonuçta, eğer ürün yeterince gönderilirse ve iyi çalışırsa, kullanıcılar ve müşteriler içindeki kodun ne kadar "kötü" olduğunu bilmez veya umursamazlar ve kabul etmeyi hiç umursamadığım zamanlar olduğunu kabul edeceğim doğru "kapıdan çıkardığım sürece.

Evet, örgütsel bir konuda bu ve "asla olmamalı". Ancak, kötü yönetilen ve son teslim tarihine dayanan bir kuruluşta kod yazıyorsanız, bireysel programcı düzeyinde birinin seçenekleri sınırlıdır.


5

Kolayca bakımı yapılmazsa dürüstçe doğru düştüğünü söyleyebileceklerini sanmıyorum. Eğer "daha sonra temizlemek" zorunda olduklarını kabul ediyorlarsa, o zaman yeterince düşünmedikleri bir şey vardır. İyice test etmek, yalnızca kirli kodlarla ilgili sorunları gerçekten çözecektir.

Şahsen ben "kirli kod yazma" becerisini geliştirmek ve doğruluğu konusunda kendinden emin olmak istemem. İlk seferinde uygun kodu yazmayı tercih ederim.


5

Doğru yaptıklarını nereden biliyorlar? Test etmek basit cevaptır.

Eğer onların kodları iyi bir QA ekibi tarafından ayrıntılı bir şekilde test edilmiş ve başarılı olmuşsa, doğru anladığını söylerdim.

Hızlı ve kirli kod yazmak, alışkanlık olarak yapılması gereken bir şey değildir, aynı zamanda 20 dakika boyunca kirli olarak sınıflandırılabilecek kod yazarken ya da 4 saat içinde doğru kodu yapmak için 4 saat harcayabileceğiniz durumlar olabilir. İş dünyasında bazen 20mins işi yapmak için elverişli olan her şeydir ve son teslim tarihleriyle karşılaştığınızda hızlı ve kirli olması tek seçenek olabilir.

Kendimi bunun iki ucunda bulundum, kirli kodu düzeltmek zorunda kaldım ve geliştirmekte olduğum bir sistemin sınırlamaları etrafında çalışmak için kendi yazdıklarım vardı. Kodda kendime güvendiğimi söyleyebilirim. yazdı çünkü kirli ve biraz kesilmiş olmasına rağmen bazen tamamen test edildiğinden ve hata işlemede bir sürü hata olduğundan emin oldum, bu yüzden eğer bir şeyler ters giderse sistemin geri kalanını yok etmezdi.

Bu hızlı ve kirli programcılara baktığımızda, bir şeyi hatırlamamız gerekiyor, bir müşteri genellikle ürüne sahip olana kadar ödeme yapmaz, eğer gönderilirse ve UAT testine girerse ve hızlı ve kirli koddaki hataları buluyorsa, bu bir Çok daha az olasılıkla, önlerinde neredeyse çalışan bir ürün olduklarında ortaya çıkacaklardı, ancak hiçbir şeyleri yoksa ve "yakında tamir edeceğiz" ya da "x tamir ediyoruz" ya da "ertelendi çünkü" Sadece mükemmel çalışıyorsanız "vazgeçmeleri ve rakiplerle gitmeleri daha muhtemeldir.

Elbette bu görüntünün gösterdiği gibi hiç kimse hızlı ve kirli kod tehlikesini küçümsememelidir! görüntü tanımını buraya girin


4

Bence o yola girmeye başlamalısın bile. Çabuk ve kirli, terbiye işleminin daha hızlı bitmesine geçici bir fayda sağlayabilir, ancak sonunda bunu yapmak için her zaman on kat ödeme yaparsınız.


5
Eğer şimdi gemi olmazsa bazen para kazanamazsın ... ama şimdi gönderim, temizlemek için "on kat" ödeme yapmana izin veriyor, ve sonra bazıları da rakiplerini çarşıya attığın ve kazandığın için önce marka bilinirliği.
CaffGeek

2
Naçizane size katılmıyorum. Zaten para sıkışıksa, geliri bir sonraki ürüne harcıyorsunuz ve şirketiniz ölene ya da yeteri kadar büyüyene kadar devam edersiniz. İkinci durumda ve büyük olasılıkla, orijinal geliştiriciler eski kodu düzeltmek için artık orada olmayacaklar.
Raku,

Başkalarını pazara sokmak, halkın ürününüzü kabul edeceği garantisi değildir. Bir üründe çok fazla kusur varsa, iyi bir duman ve ayna pazarlaması uygulamak için ekstra paraya sahip olmanız ve müşteri tabanınızla mükemmel ve bağışlayıcı bir ilişki kurmanız daha iyi olur. Bu bir / veya pozisyon değil. Önemli olan risk ile ödül arasında dengeyi sağlamak ve zamanında sağlayabileceğiniz en yüksek kalitede ürünü serbest bırakmaktır. Yetenekleriniz, piyasaya sürdüğünüz ürünün kalitesi ile değerlendirilecek ve hatalı yazılımın resminize yapabileceği hasar tamir edilemez olabilir.
S.Robins

1
İstediğiniz gibi farklılık göstermeye başlayın, ancak tarih, doğru zamanda orada olmanın, isteyenler için mevcut olanın, mümkün olan en iyi ürün olmaktan daha önemli olduğu örneklerle doludur. Her zaman her zaman bir fırsat maliyeti vardır.
Warren P

1
Warren, temelde söylediğim şey buydu. Gözlerime göre, kodun korunabilir hale getirilmesi için geri dönüşün maliyeti artıyor, üstel olarak geciktiriyorsunuz. Eğer şirketiniz satışların iyi gittiği ve kod çok kirli olmadığı için iyi olmadığı için sürdürülemez durumdaki felaketten kurtulabilecek bir pozisyondaysa, peki ya değilse?
Raku

4

Bence doğruluk için Q&D kodunu yargılamayı öğrenmek gelişmeye değer bir beceri değil çünkü bu sadece kötü bir uygulama. İşte nedeni:

"Hızlı ve kirli" ve "en iyi uygulama" nın bir araya geldiğini sanmıyorum. Çoğu kodlayıcı (kendim dahil), üçlü kısıtlamalarda çarpıklık nedeniyle hızlı ve kirli kodları temizledi . Bunu yapmak zorunda kaldığımda, bu genellikle sürekli yaklaşan bir son tarihle birleştirilmiş kapsam süngüşünün bir sonucuydu. Kontrol ettiğim kodun emildiğini biliyordum, ancak bir takım girdiler verilen doğru çıktıları tüketti. Çok önemli olarak paydaşlarımız için zamanında sevk ettik.

Orijinal CHAOS Raporuna bir bakış, soru ve cevapların iyi bir fikir olmadığı ve bütçeyi daha sonra (bakım veya genişletme sırasında) ortadan kaldıracağını açıkça göstermektedir. Q&D kodunun doğru olup olmadığına karar vermeyi öğrenmek zaman kaybıdır. Peter Drucker'in dediği gibi, "Yapılmaması gereken şeyi verimli bir şekilde yapmak kadar işe yaramaz bir şey yok."


3

Yeni kodumun çok kirli olup olmadığını doğru söyleyemem.

"Kirli" farklı insanlar için farklı şeyler ifade eder. Bana göre, çoğunlukla güvenmeniz gerektiğini bildiğiniz şeylere güvenmek, ancak yakın vadede çalışmayı beklediğinizi de bildiğiniz anlamına gelir. Örnekler: bir düğmenin yüksekliği hesaplamak yerine 20 piksel yüksekliğinde olduğu varsayılır; bir ad çözümlemek yerine bir IP adresini zor kodlamak; Diziyi sağlayan yöntem onu ​​garanti etmese bile, olduğunu bildiğiniz için dizilebilecek bir dizi üzerinde sayma.

Kirli kod kırılgandır - test edebilir ve şimdi çalıştığını bilebilirsiniz , ancak gelecekte bir noktada kırılacağı oldukça iyi bir bahis (ya da başkalarını kırmaktan korkan yumurta kabuğu üzerinde yürümeye zorlar).


3

Biraz tartışmalı görünme riski altında, kimsenin gerçekten kodlarının% 100 doğru ve hatasız% 100 olduğunu bilmediğini iddia ediyorum . Gerçekten iyi bir test kapsamına sahipseniz ve iyi BDD / TDD uygulamalarını titizlikle uyguladığınızda bile, hala hata içeren kodlar geliştirebilirsiniz ve evet, yan etkileri de içerebilir!

Sadece kod yazmak ve bunun işe yaradığını varsaymak, geliştiricinin geliştiricinin kendi yeteneklerini anlama konusundaki güvenine ve problemler ortaya çıktığında (kaçınılmaz olarak isterlerse), kodun hata ayıklama ve sürdürme çabalarının, özellikle de başka bir geliştiricinin ihtiyaç duyması halinde, pahalıya mal olacağını gösterir. Daha sonra kodu korumak için. Gerçek fark, kodunuzun çoğu zaman işe yarayacağına ve bir hatayla karşılaşırsanız, hata ayıklamanın daha kolay olacağına dair gerçek güvende olmanızı sağlayan iyi yazılım mühendisliği uygulamaları ile yapılır. ve daha sonra bu kod üzerinde çalışan kişiden bağımsız olarak değişiklik ve bakım yapmak çok daha az maliyetlidir.

Belirgin nokta, iyi faktörlenmiş ve iyi test edilmiş kodun izin vermesidir DİĞERLER'in kodunuza güvenmesine vermesidir ; bu, çoğu durumda kendi güveninizden daha önemlidir.


2

Kirli kod iyi test edilirse, güvenilir olabilir. Sorun şu ki, kirli kodu test eden ünite genellikle çok zor ve zahmetlidir. TDD'nin bu kadar iyi olmasının nedeni budur; kir ve kokuları açığa çıkarır ve temizler. Ayrıca, birim testi genellikle zaman hazinesinden muzdarip olan ilk şeydir. Bu yüzden, en temiz adam şimdiye kadar yaptığı en temiz kodu koyarsa, zaman aşımından dolayı ünite testlerini atlarsa, yine de biraz güvenmezdim.


2

İyi programcılar (Çabuk ve Kirli ve başka türlü) doğru yaptıklarını varsaymak için kocalara sahip değillerdir. Tüm büyük sistemlerin hata ve kusurlara sahip olduğunu varsayıyorlar, ancak bir noktada kodun gönderebileceği yeterince düşük bir risk veya yeterince düşük başarısızlık maliyetine sahip olmak için yeterince iyi test edilip gözden geçirilebileceğini varsayıyorlar.

Öyleyse neden Quick & Dirty denilen programcılar var? Hipotezim Darwinist seçim. Uygulanabilir kodu hızlı bir şekilde gönderen, zaman zaman rekabet gemilerinden önce gönderilen veya bütçe tükenir veya şirket iflas eder. Bu nedenle, şirketleri hala temizlenmesi gereken karmaşadan şikayet etmek için yeni programcılar kullanıyor. Temiz kod da denir ancak Quick & Dirty kodlayıcıları neslinin tükenmesine neden olacak kadar iyi değil.


Bu doğru. Quick & Dirty kodu, siğiller ve benzeri nedenlerle gönderilebilecek en az bir ürün gördüm. Öyle oldu ki, bir ay öncesine karşı bir kaç gün, rekabete iki ay atlamak anlamına geliyordu. Ürün başarılı olmaya devam etti ve Hızlı ve Kirli kod sonunda daha iyi bir kodla değiştirildi. Kod kalitemi yalnızca mühendislik açısından değil aynı zamanda ticari / rekabetçi bir bakış açısıyla görüntülemek için daha iyi bir iş yapmaya çalıştığımı görmeye başladığımdan beri. Not: Söz konusu kodun arayüzü iyiydi, kabataslak uygulama yapıldı.
J Trana,

0

Muhtemelen, bir kodun optimal olmayan bir kısmının, kısa kullanım ömrü, iş dünyasında çok az etkisi veya bunu yapmak için çok az zamandan dolayı hiçbir fark yaratmayacağını düşünebilir. Doğru cevap, gerçekten bilmediğin. Ne zaman birisini "bu küçük bir özellik" diyen veya "yapabileceğimiz en hızlı ve basit yapalım" diyerek dinledim ve doğru tasarım hakkında düşünmeye yetersiz zaman harcadım, gerçekte ve ortaya çıkan iki şey şunlardır:

1-) Proje büyür ve takım motivasyonu azalır, "dikiş" koduyla çalışır. Bu durumda, proje kaosa doğru hızlı bir şekilde ilerleyecektir.

2-) Projenin optimal olmayan bir çözüm olduğu bilinir ve kullanımı yeni bir çözüm lehine veya yeni bir çözüm kadar pahalı olan bir yeniden düzenleme için teşvik edilmeye başlar.

Her zaman elinden gelenin en iyisini yapmayı dene. Yeterli zamanınız yoksa neden daha fazlasına ihtiyacınız olduğunu açıklayın. Kötü yapılan işlerle kendinizi riske atmayın. Her zaman daha iyi bir profesyonel ol. Mantıklıysanız kimse sizi bunun için cezalandıramaz. Eğer yaparlarsa, çalışmanız gereken yer orası değildir.


0

Kıdemli ile görüşün ve varsa başarısızlıkların etkisini değerlendirin. Örneğin, pisliği giderebileceğiniz bir durum 1 gün sürer ve sağlam bir kod, tasarım değişikliğinden etkilenen tüm iş akışlarını tam olarak doğrulamak için 4-6 ay + ek doğrulama süresi alabilen tasarım ve mimari değişiklik gerektirir.

Listedeki Zaman + Kapasite + Öncelikleri baz alarak karar vermeliyiz. Takımda yaşlılar veya daha yüksek deneyime sahip kişilerle yapılan iyi bir tartışma, takıma ve teslim edilebilirliğe en iyi uyan bir karara varmaya yardımcı olabilir.

Temiz kod, eskalasyonları kurtarmak için kirli kod, müşterilerin karar vermemesi / karar vermemesi, stoper göstermesi, söz konusu organizasyonun itibarını göstermesi ve kirli kodun temiz koda girdiği durumlarda daha pek çok şey olduğu ilk yaklaşımdır.


4
Bu, önceki 23
cevapta
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.