İnsanlar son derece karmaşık ve okunması zor bir kod yazmayı ve korumayı nasıl başarırlar? [kapalı]


27

SQLite kaynak kodunu okumak IMO görevi imkansızdır. Yine de, diğer kodlardan indirilebilen, derlenebilen ve kullanılabilen oldukça karmaşık bir yazılımdır (sonuçta tamamen gelişmiş bir gömülü veritabanıdır) ve sürekli olarak güncellenir.

İnsanlar bu kadar karmaşık ve okunması zor bir kod yazmayı ve korumayı nasıl başarırlar?


1
Bence, onlar değil :-D
Pawka

2
@Pawka: Nerede "onlar" SQLite insanlarını içermez.
Frank Shearar

11
Kod karmaşık ve okunması zor olsa bile, çözdüğü sorunun karmaşıklığı göz önüne alındığında nispeten iyi bir kod olabilir. “En iyi uygulamaları” ne kadar yakından takip ederseniz edin, zor problemleri çözen basit ve kolay kod yazmak çoğu zaman imkansızdır. O zaman, kodu olabildiğince basit ve anlaşılır hale getirmek daha da önemlidir .
Joonas Pulakka

1
Hiç kimse okuması kolay olan büyük bir proje gördü mü?
Jeff Davis

2
Stajyerler, postdoc'lar vb. İşe alma ve yapmalarını sağlayın ...
DarenW

Yanıtlar:


19

Karmaşık ve Karmaşık arasında büyük bir fark var. Aşağıdaki bağlantı onu özetliyor. :)

http://codebetter.com/blogs/dru.sellers/archive/2009/09/25/complex-vs-complicated.aspx

Daha kişisel bir notta, 1 milyondan fazla kod satırından oluşan bir kod tabanı üzerinde çalışıyorum. 1. satırdan şimdiki durumuna kadar bulundum. Ne kadar uzaksanız (kodunuzda ne kadar uzun okursanız) o kadar kolaylaşır. Size her satırın ne yaptığını söyleyemem, ama size verilen görevi veya hatayı aramaya başladığınızı söyleyebilirim. Sadece doğal olarak geliyor.

Hikayenin ahlaki programlama dünyasında herhangi bir şey gibi zaman alır. SQLite'a bakmak ve sadece bilmek ve anlamak istiyorsanız, kendinizle dalga geçiyorsunuz. Her şeyin birlikte nasıl yürüdüğünü anlamak zaman alacak. İyi kod ile hatalı kod arasındaki fark, bu işlemin ne kadar sürdüğüdür.

Son olarak, bazı geliştiricilerin bir kod tabanına atlayıp bunları çözmeye başlaması mümkün değildir. Birçoğu, kod üssünün büyüklüğü veya mimarisinde boğulmuş hissedecektir. Başkalarının sadece içine atlamakta hiçbir problemi olmayacak. Her şey, geliştiricilerin güçlü yanlarına bağlıdır.


31

Belirli SQLite durumunda, geliştirme ve bakımda kullanmayı seçtikleri ana araç otomatik testtir. Test odalarındaki% 100 garanti (branş kapsamı, beyan kapsamı değil) ile gurur duyuyorlar. Onlara göre, dünyanın en iyi test edilmiş yazılım ürünlerinden biri. Bu yüzden, ekledikleri veya değiştirdikleri bir şeyin bir gerilemeye neden olduğunu ve bunun sonucu olarak oldukça korkusuzca gelişebileceğini hemen bilirler.

http://sqlite.org/testing.html

Oldukça şaşırtıcı numaralar - üretim kodundan yaklaşık 640 kat daha fazla test kod satırı var.

EDIT: Bu soru ölümden dirildi, öyle görünüyor! Ve bir yıldan biraz daha uzun bir süre sonra, bu aynı sayfada 1177 kat daha fazla üretim kodu kod satırı olduğunu bildirdi!


2
Benden başka kimse bunu gurur meselesinden ziyade bir sorun olarak görüyor mu?
Stephen

1
pek sanmıyorum. Her şeyden önce veritabanı güvenilir olmalıdır.
ts01

5
@ Stephen, neden pek çok test vakası bir problem olsun ?

1
zamanın bir bel? çok fazla test küçük testler kadar kötü (IMHO)
Dainius

9
Kod başarısız olabileceği olası bir durumu kapsarsa test nasıl zaman kaybı olabilir?
Ramhound

7
  • fonksiyonellikler zamanla gelişir.
    • yeni işlevsellikler yeni müşteri gereksinimleri tarafından yönlendirilir.
    • Eski kod, gelecekteki henüz uygulanamayan işlevselliklerin eski kodları kırmadan eklenmesine izin verecek şekilde yazılmıştır.
  • etki alanı uzmanları (bu durumda, veritabanı Bilgisayar Bilimi alanında iyi bilinen bir etki alanıdır.)
  • topluluk geri bildirimi
    • böcek
  • dik öğrenme eğrisi iyi hazırlanmış ve sebat eden bir problem değildi. Rahat olması 6 ay, 1 yıl veya daha uzun sürebilir ve bazı insanların katlanabileceği şey budur.
  • ticari motivasyonlar. Parasal destek olmadan çok az insan zaman ve enerjiyi dik öğrenme eğrisine harcayabilir.

4

Sürdürmek için tüm projeyi yakından tanımanıza gerek yok . Genellikle geniş, karmaşık bir yazılımla insanlar, kendilerine özen gösterdikleri kendi "alanlarına" sahip olacaklar ve sadece sistemin geri kalanı hakkında "başarılı" bir bilgiye sahip olacaklar.

SQLite aslında "büyük yazılım projelerinin" nin ölçekte nispeten küçük ancak Windows işletim sistemi gibi bir şey bakarsak, insanların kim olacak sadece çekirdeğinizdeipfwadm, insanlar kim çalışmalarını sadece insanlar kim kabuk üzerinde çalışmaya sadece eser Internet Explorer’da, sadece Pencere yöneticisi üzerinde çalışan kişiler , vb. vb. "Kabuk" da çalışan bir kişi, şapkasını düşürdükten sonra çekirdeği hatayı düzeltemez.

Bu projelerin zaman içinde geliştiği yararı da var: her zaman bu karmaşıklığı başlatmamışlardı. Bu, yeni bir geliştiricinin genellikle daha deneyimli geliştiriciler tarafından "eğitilebileceği" anlamına gelir.

Büyük bir geliştirici ekibine katıldığınızda, üzerinde çalışmanız gereken projenin belirli bir yönü (belki de bir hata veya yeni bir özellik) size verilecek ve ilk birkaç tekrar için "dostum" olacak bir başka geliştiriciniz olacak. Arkadaşınız çalıştığınız bölgeyi iyi anlayacak ve yolunuzu bulmanıza yardımcı olabilir.

SQLite gibi açık kaynaklı projeler için, aslında biraz daha zor, çünkü mevcut geliştiricilerin yeni geliştiricileri "eğitmeleri" için bir motivasyon yok. Yani biraz daha kendi başınasın. Ancak geliştirici forumlarında veya posta listelerinde hala yardım bulabilirsiniz (örneğin, "Böyle ve böyle bir özelliği uygulamak isterdim" veya "XYZ hata buldum, nereden bakmaya başlarım?" Gibi bir soru yayınlayabilirsiniz. bir çeşit yardım.


Özellikleri değiştir, ve bu benim şu anki işimdeki gibi görünüyor! Bu cevabın en iyi kısmı uzmanlaşma ve zamanla gelişme ihtiyacıdır. Ayrıca her şey hakkında bir tutam mizah ekleyin.
DarenW

4

Okunması zor ve karmaşık proje arasında bir fark var. Bir kişi, projenin yazıldığı dili veya projenin etki alanını derinden anlamıyorsa, kodun yanlış yazılmış olduğu anlamına gelmez.

Benim tavsiyem:

  • Projenin dilini anladığınızdan emin olun. Dili bilmek yeterli değil.
  • Kod vermeden önce etki alanıyla ilgili her ayrıntıyı öğrenin.

Benim için SQLite karmaşık olmaktan uzak ve karmaşık bir şey değil. Bu projenin alanı geniş kavramlar hakkında derinlemesine anlayış gerektirir.


3

Diğer cevaplarda bahsedilmeyen şeylerden biri "Doğal olarak onlara gelir" dir. Çoğu kişi iyi kod yazmak ister ancak hatalı kod yazmaya ayarlanmıştır. Karşılaştığım programcıların bazıları doğal olarak DOĞRUSAL düşünürler + bazı zamanlar çok zekice karmaşık çözümler buluyorlar. Bu tür insanların çoğu, iş istediği zaman ve öğrendikleri kitaptan okuyarak veya öğrenerek zaman harcamaz.


1
LOL, ben böyle bir şeyle çalıştım, eğer bir şeyler yapmanın birkaç yolu olsaydı (ve her zaman vardır), her zaman en karmaşık ve karmaşık çözümü seçerdi. Bunun farkında bile olduğunu sanmıyorum.
HLGEM

3

İnsanlar bu kadar karmaşık ve okunması zor bir kod yazmayı ve korumayı nasıl başarırlar?

Eğer orijinal kodlayıcılarsa ve bunu sürdürmeye devam ederse, “karmaşık ve okunması zor” olarak görmezler. Muhtemelen “basit ve okunması kolay” olarak görüyorlar, çünkü kendileri yazdılar.

Herhangi bir kod anlamak için zaman alır. Sadece bazıları diğerlerinden daha uzun sürüyor :)


2

Başınız varsa - sebat, sabır ve yöntemsel bir yaklaşım varsa - ama esas olarak sebat varsa:


1

Her zaman aynı şekilde yapılan işler varsa, yönetim çok daha kolay hale gelir. SQLite kodunu bilmiyorum, ancak birden fazla projenin olduğu bir ortamda çalışıyorum. İş vakasını (eq mantığı) anlamanın yanı sıra, her şey temelde her yerde aynı şekilde yapıldığından (veritabanı erişimi vb.) Başka bir projede çalışmaya başlamak nispeten kolaydır. Uzun metin kısa: Kodlama yönergeleri - uygun şekilde - yaşamı ve bu kodu çok daha kolay hale getirir. Bu, SQLite kodlayıcılarının yardımcılarından biri olabilir.


1
  • Yazılımın orijinal yazarıysanız ve onunla> 10 yıl boyunca çalıştıysanız ve bir dahiyseniz, o zaman her şeyi anlamak mümkün olabilir. Büyük karmaşık yazılım parçaları (SQLite veya Linux çekirdeği gibi) aslında, başkalarının da katkısı olsa bile, tam ve derin bir anlayışı olan tam bir orijinal yazara sahiptir.
  • Yazılım mimarisi aklı başındaysa (yüksek uyum, düşük bağlanma), her şeyi anlamak, ona yararlı eklemeler ve modifikasyonlar yapmak için ön şart değildir.
  • Bir RDBMS veya İşletim Sistemini anlamak, temelde yer alan CS ilkelerinin derinlemesine anlaşılmasını gerektiren biraz özel durumlardır. "Sıradan" yazılım uygulamaları ile öyle değil.

1

Basit bir şekilde yazmaya çalışırlar ama basit bir şekilde değil.

Biraz zaman alabilir olsa da, işleri olabildiğince basit hale getirmek, anlamak / okumak için daha hızlı hale getirir.


1

Uygulanan algoritma, bir uygulamanın kodunun ne kadar basit olabileceği konusunda daha düşük bir sınır belirler. Uygulanacak algoritmanın soyut bir açıklaması son derece karmaşıksa ve birbiriyle birleştirilmiş farklı veri parçaları tonu gerektiriyorsa, söz konusu algoritmayı uygulayan kod, kimin yazdığı önemli değildir.

Başka bir deyişle, bazen anlaşılmaz kod yazmamın bir nedeni, uygulamak istediğim algoritma göz önüne alındığında, başka seçeneğim yok.

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.