Programcılar bazen kasıtlı olarak kodları zorlaştırıyor mu? [kapalı]


26

İstifleme akışında çoğu zaman, kişilerin (özellikle programcıların), çözümün orijinal problemden çok daha karmaşık olduğu bir problem için fazla karmaşık olma eğiliminde olduğu görülüyor mu? Ben hiçbir şekilde uzman değilim, ama çoğu zaman işe yarayan en basit çözümle gitmeye çalışıyorum (ve tabii ki bu her yerde işe yaramıyor) ama insanların göründüğü işte basit çözümler önerme konusunda oldukça başarılı oldum. daha karmaşık çözümler için gözden kaçırmak?

Bu programcılar için normal bir şey gibi mi… yoksa sadece doğru açıdan düşünmüyorum.


5
1. Evet, bazen düşünüyorum. 2. Evet, en azından bazı programcılar en azından bir kısmı kodlarını aşırı zorlaştırıyor, en azından bir kısmı kasıtlı olarak. 3. Kılıflar kapalı.
İş

3
Hiç, “Bunu düşünmeliydin!” Diye bağıran birileri oldu mu? ilk gereksinim toplantısında belirtilmeyen bazı gereklilikleri kaçırdığınızda? Bazı şeyleri gereğinden daha karmaşık hale getiren şey budur.
JB King,

Yanıtlar:


18

Açıkçası, bazı programcılar kimsenin anlayamadığı aşırı karmaşık bir kod yazarak ne kadar akıllı olduklarını göstermeye isteklidirler. Diğer programcılar bu kadar yüksek bir seviyede ateş ediyorlar ki, çözümdeki komplikasyon doğal bir evrim.

Gördüğüm en kötü kodlardan bazıları, üzerinde 2000'den fazla kod satırı bulunan bir yöntemdi. Hiç şüphe yok ki bu kod karmaşıktı, ama aynı zamanda çok zayıftı.

Bence iyi bir programcı aşırı karmaşık kodlardan kaçınır. Bu, bir tasarım desenini gerçekten gerektirmeyen bir çözüme uyması için zorlama eğiliminden kaçınmayı içerir. Ayrıca Tanrı-nesnelerinden, sihirli düğmelerden, erken optimizasyondan, erken genelleştirmeden ve diğer anti-kalıplardan uzak durmayı da içerir.

Karmaşıklık artışı organik bir şey olduğu için sürekli yenileniyor ve çözümleri basitleştirmek için fırsatlar arıyorum. Diğer pek çok organik madde gibi, kullanılabilir olmasına devam etmemizi istiyorsak kesilmesi ve budanması gerekir. Aşırı karmaşık çözümlerle etkileşime girmek zorunda kalmaktan nefret ediyorum çünkü artan karmaşıklık ile kod kırma olasılığı artar.

Okunabilirliğin kod bakımının en önemli unsuru olduğunu düşünüyorum ve aşırı karmaşık çözümler neredeyse her zaman okunabilirliği azaltır ve bakım maliyetlerini arttırır.


32

Olması gerekenden daha karmaşık ve bu üç nedenden dolayı neredeyse her zaman çok sayıda kod gördüm:

1) Erken genelleme ya da asla ortaya çıkmayan gelecekteki ihtiyaçları öngörmeye çalışmak için aşırı mühendislik çalışması yapıldı.

2) Geliştirici (ler), daha önce kullanmadıkları yeni bir tasarım modelini veya teknolojiyi öğrenmek / denemek istediler ve hatta overkill olsa bile ayakkabılarını bağladılar. Bunu yapıyorlar çünkü işlerini daha ilginç yapıyor ve yeni bir şeyler öğreniyorlar.

3) Özellikler ve hata düzeltmeleri eklendi, ancak mevcut kod onunla birlikte doğru bir şekilde düzeltilmedi. Yalnızca küçük bir çoğaltma parçası olabilir veya bir yönteme başka bir bayrak argümanını takip etmek olabilir, ancak hepsi ekler. Etkili olarak, saldırılar eklenir ve tüm kod kokuları nedeniyle her şeyin fazla karmaşıklaşması uzun sürmez. Bu en yaygın olanıdır ve genellikle sadece daha iyi tanımadığı ya da zaman baskısını bilmediği içindir.


# 2 suçluyum, korkarım. Tecrübe ile (ve olgunluk ile mi?) Artık kendimden kaçınma eğilimindeyim ... ve yerine evde deneylerim :)
Matthieu M.

İnsanların her zaman 1 yaptığını görüyorum, kendileri için 5 kat daha fazla iş yaratıyorlar
Ally,

11

Bu kesinlikle yaygın bir şey. Pek çok kitabın dediği gibi, iyi bir geliştirici basitleştirmeyi biliyor. Yeni bir teknolojiyle veya yeni bulduğunuz "harika" bir çerçeveyle bir şeyi karmaşıklaştırmak çok kolaydır, bu yüzden problemler perspektifinden düşünmek yerine onu kullanmanın yollarını aramaya başlarsınız.

Martin Fowler’ın dediği gibi, yeni bir teknoloji öğrenenlerin “teknolojisinin” çözüm bulduğu yerde kısa vadeli bir sorunu var.


4
-1: Pek çok kitabın dediği gibi, iyi bir geliştirici basitleştirmeyi biliyor. - Bu konuda kesinlikle haklısın. Ancak, yeni teknolojinin kötüye kullanımının, kodu aşırı karmaşıklaştırmanın en büyük nedeni olduğunu ima ettiniz. Bu konuda yanılıyorsun. İnan bana, yeni teknolojilerin kötüye kullanımı ile ilgisi olmayan, çok fazla karmaşık kod var.
Jim G.

Tam olarak nerede "aşırı karmaşık kodun en büyük nedeni" olduğunu ima ettim? Bu kesinlikle bir sorun, "Hey, X modelini öğrendim, nereye başvurabilirim?" - Patternitus. Gerçekten ağzımı ağıza soktun Jim.
Martin Blore,

4
“Bu mektubu her zamankinden daha uzun yaptım, çünkü daha kısa yapmak için zamanım olmadı.” - Blaise Pascal Burada da çok uygulanabilir. "Karmaşık" çoğu zaman koştu, tembel veya yetersiz kodlamanın bir işaretidir.
Bill

@Bill Bu konuda ilginç olan şey, iş açısından daha karmaşık bir kod için iyi bir argümandır - eğer bir şeyi uygulamak için sabit bir miktar ödenirse ve bunu yapıp yeniden yapmamanız veya yeniden kısaltmanız fazladan zaman alır. Doğru, ilk defa (kim yapabilir?), zaten çalışan kodunuzu daha az karmaşık hale getirmenin temel bir cezası var.
Michael

10

Tüm programcılar için normal olduğunu sanmıyorum ama kesinlikle bunu yapan birçok programcı gördüm.

Bazı insanların bazılarının gerçekten çok basit bir şeyi 'çok kolay' yaptığını gördüklerine inandığını ve yeteneklerinin iyi bir vitrin olmadığını düşünüyorum. Bu nedenle, eldeki sorun için en iyi çözüm olmasa da, 'ne yapabilirim bak!' Demenin bir yolu olan karmaşık bir çözüm yapmak zorundalar.


1
Ben böyle bakıyorum. IE çok kolay ise kullanmaya değmez mi?

@Mercfh Görünümü anlamıyorum. Bir çözümün kolaylığının etkinliği ile ne ilgisi var?
GSto

“Evet katılıyorum” diyerek yaptığı açıklamada, programcıların bazen “Çok basit, çok iyi değil” olduğunu düşündüğünü söylemiştim.

7

Programcıların çoğu zaman, dilde yerleşik olduğunu bilmedikleri bir görevi gerçekleştirmek için birkaç kod satırı yazdıklarını gördüm. Bu tam olarak kasıtlı değil ama kesinlikle önlenebilir.


Her dize kopyası için bir döngü yazan programcılar gördüm. Hiçbir zaman standart bir kütüphane işlevine çağrı kullanmadı. (Daha kötüsü, platformların kopyası bir seferde bir kelime okumak için optimize edildi.)
BillThor

7

"Basit" dediğiniz şeye bağlı. Bazı insanlar yüksek oranda yeniden kodlanmış kodu "karmaşık" olarak görüyor, çünkü daha fazla kod ve birden fazla çağrı grafiği var. Ancak, bu kod değişiklikleri yapmak için çok daha kolay olduğu için "basittir".

Genellikle, büyük bir fonksiyonun, değişiklik yapmanız gerekene kadar "basit" göründüğünü görürüm, daha sonra karmaşıklaşır.

Başka bir deyişle, birçok durumda basit, bakanın gözündedir.


2
+1: Çok fazla programcı bunu düşünmüyor
Luca

5

Sorun, ya basit çözümleri net olarak göremiyorsanız (meslektaşlarla yapılan görüşmelerin ortaya çıktığı yer) ya da fazla genelleme yapıyorsanız.

Başka bir deyişle, ileri düzey kütüphane işlevlerinde basit döngüler yaparsınız, çünkü bir sonraki projeniz için buna ihtiyacınız olacağını düşünürsünüz (tam olarak bu şekilde olmazsınız). Bunu çok uzun zamandır yapın ve çok basit bir çekirdeğe sahip son derece karmaşık bir uygulamanız olur.

Ayrıca çok sağlam bir koda sahip olmanız gerektiğini de bulabilirsiniz ve tüm sağlamlık varsayılan olarak karmaşık hale getirir. Senin sorunun olsa da, sanmıyorum.


4

Bazı durumlarda, sadece temiz / basit bir çözüm üretmenin karmaşıklığı olabilir.

Bir şeyi tek başına hatırlayamadığım veya bulamadığım bir alıntı var: "Yazmanız gereken her şeyi yazdıktan sonra kod tamamlanmadı, ancak kaldırmak için hiçbir şey kalmadıysa tamamlandı" satırları

Açıklık eksikliği, insanların tüm fazlalıkları ortadan kaldırabilmelerini engelleyecektir.


4
Diğer bir ilgili alıntı ise, "Daha kısa bir mektup yazmış olurdum ama zamanım olmadı" dır.
user16764

3
“Her ne kadar mükemmellik que la mükemmellik olmazsa olmaz artı artı rien à ajouter, mais quand artı ien rien à retrancher olmaz” (“Görünüşe göre mükemmellik artıracak başka bir şey olmadığında elde edilemez. kaldırılacak başka bir şey yok. ”) - Fransız pilot, şair ve mühendis Antoine Marie Roger Vicomte de Saint-Exupéry, 1939 ( Terre des Hommes ( Rüzgar, Kum ve Yıldızlar ) kitabından ).
Jörg W Mittag

Teşekkürler, görünen o ki asıl kaynağı hiç bilmiyordum :-) Güzel.
Stephen Bailey

3

En iyi mühendisler, gerçekten karmaşık problemleri alıp bunları kolay ve anlaşılması kolay çözümler haline getirenlerdir. Kulağa basit geliyor, ama var olanlar gibi çok fazla mühendis / geliştirici yok. Aslında, onun gibi pek çok insan yok. Gerçekte, oradaki insanların çoğunluğu tam tersini yapar. Basit problemler alırlar ve onları tanınmayacak şekilde karmaşıklaştırırlar. Politikacılarımıza basit problemler alıp onları tam bir kaosa çevirmeyi başaran bir örnek için arayın. Programcılar bu konuda farklı değillerdir.


3
Ah! Sadece + 1 vermek üzereydim, ama sonra politikaya olan benzetmenizi gördüm ve bu en iyi ihtimalle zayıf. // Doğru - Politikaya gömülü çok fazla şaşkınlık, boşa harcanan hareket, el sallama ve özel ilgi alanları var ve bunun sonucunda faturalar fazla karmaşıklaşabilir. Ancak aşırı komplikasyon, şaşırtmanın, boşa harcanan hareketin, el sallama ve özel ilgi alanlarının bir yan ürünüdür. Kök sebep değil.
Jim G.

Sebep ne olursa olsun, ülkenin sorunlarının çoğuna basit çözümler var, ancak politikacılar onları ihtiyaç duyduklarından daha zorlaştırmayı seçtiler. Bunun ya para, güç ya da oylar yüzünden olduğunu varsayıyoruz, ancak bunun büyük ölçüde yeteneklerle ilgili olduğuna da inanıyorum. Bu durumda analojim sağlamdır.
Dunk

1
@JimG. Evet, seninle aynı fikirdeyim ... bana öyle geliyor ki, siyasi çözümlerle ilgili sorunların çoğu, gerçekten kolay bir çözümü olmayan gerçekten karmaşık bir sorunun kolay bir çözümü olduğunu iddia eden politikacılar.
Michael

2

Şahsen, hiçbir zaman bilerek daha karmaşık bir yazılım yapmayı denemedim. Ancak, bir şeyi bitirdim ve "vay, bu çok karmaşık" diye düşündüm ve ona geri dönüp yeniden düzenlendi. Bazı insanlar bunu görebilir ve sadece işe yarayacağını düşünür ve yeterince iyi olup refactor değil.


1

Bir bilge adam , olabildiğince basit, ancak hiçbir basit gibi şeyleri tutmak gerektiğini söyledi iddia ediliyor. Aynı kod için geçerli olabilir. Bazen bazılarının karmaşık olduğu bir tekniği kullanmak zorunda kalırsınız (özyineleme iyi bir örnek olabilir, genellikle genç programcıları korkutur).

Ancak, genel olarak karmaşık kodun genellikle organik olarak ortaya çıktığını düşünüyorum. Basit bir problem basit kodla çözülür, sonra kapsam genişler ve fazla düşünülmeden kod değiştirilir ve zamanla yeni problemi kapsamayı deneyen fakat gerçekten farklı bir problemi çözmek için tasarlanan bir kod alırsınız. Farklı mantık parçalarından oluşan bir patchwork yorgan olur. Bu tür bir kod daha sonra sorunun gerektirdiğinden çok daha karmaşık görünebilir, ancak bu şekilde olmuştur; çünkü her küçük değişiklik, o sırada kodu çalıştırmanın en kolay yolu gibi görünüyordu.

Sanırım çoğu geliştirici, kodunu karmaşık hale getirmeye kararlı bir şekilde karar verdiğini sanmıyorum (kendi tekniğini ispatlamak için bazı teknikler kullanacak garip bir gösteriye sahip olsan da) .


Neredeyse gereksinimi karşılayan ancak birçok farklı yoldan yetersiz kalan gerçekten basit bir çekirdekli birçok sistemin nasıl başladığı ve daha sonra biraz daha karmaşık bir tasarımla önlenebilecek çok fazla boşlukla başa çıkabilmek için çok fazla komplikasyon eklemesi şaşırtıcı. C'nin tamsayı tiplerinin basit tasarımını ve bunlarla birlikte gelen tuhaf karmaşık kuralların bazılarını düşünün. Eğer her bir tip için "bu uygulanabilir bir şey olmalı mı" seçeneği olsaydı, bu tip sayısını nominal olarak iki katına çıkardı (gerçekte bir niteleyiciden volatilevb. Farklı bir şekilde olmasa da ) ama ...
supercat

... promosyon / dengeleme kurallarını büyük ölçüde kolaylaştıracaktı. Bir promotable int'ye eklenen, promotable olmayan bir imzasız kısa, promotable olmayan bir imzasız kısa olarak, ister shortbüyük olsun, ister olmasın int. Bir probata unsigned shorteklenen bir promobilite int, bir verim verir int. Aynı boyutta imzalı ve imzasız şeyler eklemek veya farklı boyutlarda promobil olmayan şeyler eklemek bir hata olur. Ön tarafa çok küçük bir karmaşıklık ekleyin ve aşağı akıştaki garip köşe kasaları kayboluyor.
Supercat,

1

Henüz ortaya çıkmamış bir diğer neden, insanların daha sonra bu çözümleri desteklemek için hizmetlerine ihtiyaç duymanızı sağlamak için sunulan çözümleri aşırı karmaşık hale getirmeleridir. Başka bir deyişle: iş güvenliği için.


Bunun neden aşağıya indirildiğinden emin değilim, kendi çerçevesini yaratan ve yalnızca bu proje üzerinde çalışarak saatlik olarak ödenen tek bir adam tarafından kodlanan son derece büyük projelerle karşılaştım. İşveren onu kızdırırsa, tüm ürün hattı berbat olur. Başka bir geliştiricinin kodu iyice anlaması aylar alacak, “her şeyi bilen” kodlayıcının spagetti karmaşasını güncellemesi birkaç dakika alacaktı.
SSH Bu,

0

Belki klasik bir hata problemi?

30. Geliştirici altın kaplama.

Geliştiriciler yeni teknolojilerden etkilenir ve bazen dillerinde veya ortamlarında yeni özellikler denemek veya kendi ürünlerinde gerekse de olmasa da başka bir üründe gördükleri kaygan bir özelliği kendi uygulamalarını oluşturmak için endişe duyarlar. Gerekli olmayan özellikleri tasarlama, uygulama, test etme, belgeleme ve destekleme çabası programı uzatır.

  • Steve McConnell, Hızlı Gelişim.

0

Evet, bazen kendimizi eğlendirmek için kodun fazla karmaşık olmasını sağlıyoruz. Çoğunlukla, bu kodun aşırı karmaşık olduğu algısı projede cahil veya Junior bir katılımcıdan gelse de.


1
-1 Genç geliştiriciler için kategorik olarak sorunlu olan üst düzey geliştiriciler muhtemelen kendi çalışmaları veya başkalarının çalışmaları için motivasyonlarını anlamıyor. Küçük geliştiriciler kodunuzu takip etmekte zorlanıyorlarsa, BT çok karmaşıktır.
Brandon

Bir Jr geliştiricisi kodun anlaşılmasının imkansız olduğunu tespit ederse, bunun bir kod kokusu olduğunu ve kodun çok karmaşık olabileceğini söyleyeceğim, ancak burada bir fırçayı genişletmek için çok fazla kullanıyorsunuz. Bu kod kokusu aslında var olabilir çünkü Jr geliştiricisinin ileri bir tekniği anlamak için yardıma ihtiyacı vardır, tekniğin kendisinin suçlamak olduğu anlamına gelmez.
P. Roe

-1

EVET ... ve fiyatı çok fazla ödedim.

Beyaz tahtamın şu anda en üstte yıldızlarla yazılmış bir ifadesi var.

"Basit değilse, doğru değil"

... ve her zaman beyaz tahtada bir şey prototip yapıyorum, her zaman dikkatimi çekiyor.

Gerçekten benim için işe yarıyor, çünkü karmaşık tasarımlarım daha temiz kodlara dönüşen daha basit hale geliyor.

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.