Bilimsel kod, ortak kodlama standartlarını göz ardı etmek için yeterince farklı bir alan mıdır?


21

Son zamanlarda aklımı aşağıdaki gerçek hakkında sarmaya çalışıyorum.

Bir yandan, "sağlıklı", "temiz", "iyi yazılmış" ve benzeri kodlar olarak kabul edilenler için bir dizi kodlama kuralları ve standartları vardır. Burada da çok tartışılan görünen "Temiz Kod" bölümüne bakın. Örnek kural: 7 satır uzunluğundaki yöntemler ve 1 veya 2 girinti seviyeleri. Takip etmeyen kodun bir şekilde yetersiz bakımdan ölmesi beklenir.

Öte yandan OpenCV, OpenCascade, VTK vb. İle çalışıyorum. Bu bilimsel bir kod. 2 sayfalık metodları var (kendimden beri), OpenCascade'in 10 dosyaya bölünmüş bir metodu veya sınıfı var (burada şaka yok), VTK da zaman zaman karışıklık yaratıyor. Yine de bu projeler başarılı, sürdürüldü ve yaygın olarak kullanılıyor!

Av nerede? Bilimsel, matematik ağırlıklı bir kodu, sadece işe yarayacak şekilde yazmamıza izin veriyor mu? Varsa, bu tür projeler için ayrı bir standartlar kümesi var mı?

Naif bir soru olabilir, ama lisede çalışmamın yolunu bu şekilde yapıp, yapmamaya ve bir şeyler yapmamaya karar vermiş kurallar oluşturmaya çalışan bir programlama boşluğu gibi görünüyorum. Mezun olduğumdan beri, yapmak zorunda olduğum şeyler konusunda neredeyse hiçbir rehber desteğim yoktu, temel olarak programlama - kimse bunu öğretmek için can sıkıcı değil.


25
Hayır, öyle değil, ancak çoğu bilim insanının daha iyi bilmesi için mühendislik eğitimi yok.
Robot

4
Etrafında bir süredir devam eden herhangi bir projede, kötü yazılmış bir ton kodu bulacaksınız, ancak hiç kimsenin geri dönüp temizlemesini istemeyecek kadar iyi çalıştığı anlaşılıyor. Bazen bu, standartların ve modellerin zaman içinde geliştiği, bazen de standartların aynı şekilde uygulanmadığı, bazen bunun nedeni, yeni işlevsellik eklemek için geri dönüp işe yarayan ancak kötü çalışan bir kod parçasını yeniden düzenlemekten çok daha eğlenceli olmasıdır. belgelenmiş.
Justin Mağarası

2
@JustinCaveL Veya: "Eğer kırılmadıysa, tamir etmeyin." Özellikle sadece yazma koduna uygulanabilir . Ayrıca bakınız plaza.ufl.edu/johnaris/PDFs/ProblemSolvingFlowChart.pdf
Robert Harvey

Daha önceki sorumu kesinlikle ilgili bulacaksınız: programmers.stackexchange.com/q/266388/620
rwong

8
Adam answerers için: Bu soru atıfta kod tabanı arasında açık kaynak kütüphaneleri için yoğun hesaplama gerektiren görevlerden birinde veya birkaçında bilimsel etki . Bu soru fırlatma kodu ile ilgili değil . Cevap yazmadan önce vurgulanan her yönü kavradığınızdan emin olmak için lütfen bir süre duraklayın. Teşekkürler.
rwong

Yanıtlar:


28

Bilimsel kod, ortak kodlama standartlarını göz ardı etmek için yeterince farklı bir alan mıdır?

Hayır değil.

Araştırma kodu genellikle "atılmaktır" ve geçmişe göre geliştirici olmayan insanlar tarafından yazılmış, ancak akademik referansları güçlüdür. Yazdığım araştırma kodlarından bazıları beni ağlatıyor . Ama işe yaradı!

Dikkate alınması gereken bir şey, projelere kapı açanların dahil olanı yönlendiren projelerdir. Büyük bir proje bir akademik / araştırma kodu projesi olarak başladıysa , çalışmaya başlar ve şimdi bir karmaşa ise, birisinin onu yeniden yapılandırmak için inisiyatif alması gerekir.

Sorun yaratmayan mevcut kodu yeniden düzenlemek çok fazla zaman alıyor. Özellikle de belirli bir alanda ise veya testler yoksa. OpenCV'nin mükemmel olmasa bile çok kapsamlı bir stil rehberine sahip olduğunu göreceksiniz . Geriye dönük olarak mevcut tüm koda uygulamak? Bu .. kalbin zayıflığı için değil.

Tüm bu kod çalışırsa bu daha da zor. Çünkü kırılmadı. Neden tamir ettin?

Yine de bu projeler başarılı, sürdürüldü ve yaygın olarak kullanılıyor!

Bir anlamda cevap budur. Çalışma kodu hala kullanışlıdır ve bu nedenle de sürdürülmesi daha olasıdır.

Özellikle başlangıçta bir karışıklık olabilir. Bu projelerden bazıları muhtemelen “hiç yeniden ele geçirilmesine gerek kalmayacak ve atılabilecek” bir ilk proje olarak başladı.

Ayrıca, karmaşık bir algoritma uyguluyorsanız, daha büyük yöntemlere sahip olmanın daha mantıklı olabileceğini göz önünde bulundurun, çünkü siz (ve bilimsel tarafa aşina olanlar) algoritmayı kavramsal olarak daha iyi anlayabilirsiniz. Tez çalışmamın optimizasyonla ilgisi vardı. Ana algoritma mantığını bir yöntem olarak kullanmak, onu parçalamaya çalışmaktan çok daha kolay anlaşılıyordu. Kesinlikle "yöntem başına 7 satır" kuralını ihlal etti, ancak aynı zamanda başka bir araştırmacının koduma bakabileceği ve algoritmadaki değişiklikleri daha hızlı anlayabileceği anlamına geliyordu.

Bu uygulama soyutlanmış ve iyi tasarlanmışsa, bu şeffaflık programcı olmayanlar için kaybedilir .

Cevaplayıcılar için: Bu soru, bir veya daha fazla bilimsel alandaki hesaplama yoğun görevler için açık kaynaklı kütüphanelerin kod tabanını ifade eder. Bu soru fırlatma kodu ile ilgili değil. Bir cevap yazmadan önce vurgulanan her yönü kavradığınızdan emin olmak için lütfen bir süre duraklayın.

İnsanların sık sık tüm açık kaynaklı projelerin “hey, çılgınca popüler olacak ve binlerce / milyon insan tarafından kullanılacak bir kütüphane için harika bir fikrim var” diye başladığını düşündüklerini düşünüyorum.

Gerçek şu ki, birçok proje başlatıldı ve öldü. Gülünç derecede küçük projelerin yüzdesi OpenCV veya VTK vb. Seviyelere "yapar".

OpenCV, Intel'den bir araştırma projesi olarak başladı. Wikipedia bunu "bir dizi projenin" parçası olarak nitelendirdi. İlk beta olmayan sürümü 2006 ya da ilk başlatılmasından yedi yıl sonraydı. Amaç başlangıçta mükemmel beta değil anlamlı beta sürümleri olduğundan şüpheleniyorum.

Ek olarak, OpenCV'nin "mülkiyeti" önemli ölçüde değişmiştir. Bu, tüm sorumlu taraflar aynı standartları kabul etmedikçe ve bunları proje süresince tutmadıkça standartların değişmesini sağlar.

Ayrıca OpenCV'nin Temiz Kod'dan ilham alan Çevik Manifesto'dan yayınlanmasından önce birkaç yıl civarında olduğunu da belirtmeliyim (ve VTK neredeyse 10). VTK, Temiz Kod'un yayınlanmasından 17 yıl önce başlatıldı (OpenCV, 9 yıl önce "sadece" idi).


2
2004 yılında OpenCV kullanıyorum ve çok kötüydü. Willow Garage (yeni sahipler ) hemen hemen her şeyi C ++ 'a dönüştürerek harika bir iş çıkardılar. Aslında, iyi kodlardan oluşan birkaç bilimsel kütüphaneden biridir.
nimcap

15

Bilim adamları geliştirici değildir. Görevleri kendi başına kod yazmak değil. Görevleri problemleri çözmek ve programlama kullanabilecekleri araçlardan sadece biri.

Profesyonel geliştiriciler tarafından yazılan çoğu şirket kodu - kendileri dedikleri gibi - bir karışıklıktır. Bu kodun çoğu tasarım desenlerini kullanmaz veya yanlış kullanır. Yorumların çoğu TheDailyWTF adayları . Öyleyse kendi endüstrimizde, çalışmaları kod yazmak olan insanlardan böyle sonuçlar görüyoruz, işi program yazmayan insanlardan ne beklersiniz?

Gerçek bir profesyonel geliştiricinin kariyeri boyunca öğrendiği tüm uygulamalar bir bilim insanına fayda sağlar mı? Kesinlikle. Her bilim insanının yaşamının beş ila on yılını yazılım geliştirme öğrenmesi için harcaması mümkün mü? Muhtemelen değil. Bu nedenle, kod kalitesi olduğu gibi.

Diğer bir faktör ise kültürdür. Çiftleriniz temiz kod yazmıyorsa, neden istiyorsunuz? Kimsenin umrunda olmadığı için fazladan çaba sarf etme eğiliminde değilsin.

Son olarak, çoğu bilimsel kod nispeten kısa bir ömre sahiptir. Belirli bir araştırma için kod yazıyorsunuz ve araştırma yapıldığında, kodu tekrar kullanmıyorsunuz. Bu alışkanlığa sahip olduğunuzda, tekrar alıntı yaptığınız gibi, yeniden kullanılabilir kitaplıklar ve kod atma gibi farklılıklar oluşturmak zorlaşır.


“İşleri kendi başına kod yazmak değil. İşleri sorunları çözmek için” - teknik olarak bir geliştiricinin işinin de kod yazmamak olduğunu unutmayın. İşi, bilim insanının yaptığı gibi, sorunları çözmektir. Sandalyeleri sıcak tutmak için para ödeyen yazılım fabrikalarını ve kod maymunlarını hariç tutuyorum, ancak tanım gereği temiz kodu da umursamıyorlar, bu yüzden bu soruya uygun değiller :)
Andres F.

8

Aldırmamak? Hayır. Yeniden düşünün ve ayarlayın? Emin. Birçok bilimsel kod matematik yoğun ve performans açısından kritiktir. İşlev çağrıları yükü gibi şeyler aslında bir sorun haline gelebilir, bu nedenle tipik bir ticari uygulamada gördüğünüzde daha derinlemesine yuvalanmış yapılara sahip olabilirsiniz. Bu, önce başınızı bin mikro optimizasyona dalmanız gerektiği anlamına gelmez. Hala doğru algoritmayı seçmeye odaklanmalı ve sadece etkisini ölçebileceğiniz optimizasyonlar yapmalısınız.

Farklılıkların bazıları açık ve önemsizdir. Kodlama kuralları tipik olarak anlamlı değişken isimleri seçmek için arayacak ve tek harfli isimler derhal şüphelenilecektir. Bir bilimsel uygulama hala anlamlı değişken isimleri isteyecektir, ancak bazen en anlamlı isim, iyi bilinen bir denklemde bir değişkene atıfta bulunan tek bir harf olacaktır.


4
Değişken adlandırma yorumu için +1. Okuldayken zaman çeşitli departmanları için kodlama bazı freelance yaptı ve istatistik ve matematik bölümlerinde ben gibi değişken adlarını kullanmak için "güçlü teşvik" olduğunu Ajve T0bu değişkenler ben koduna tercüme edilmiştir işlevlerde seçildiler yolu olduğu. Gibi bir şey kullanarak correlationIndexya startTimeda homurdanan olur.
TMN

4

Mevcut cevapların tümü bu soruyu kapsamlı bir şekilde ele almıştı. Bununla birlikte, OpenCV'nin beğenileri, vb. Arasında iyi iş uygulamalarına göre geliştirilen kodun (Kod Tamamlandı, Temiz Kod, SOLID vb.) Arasındaki gerçek antipodun ne olduğunu belirtmek isterim .

Genel olarak, kaynak kodunun KISS olması için çok fazla iş avantajı vardır - "basit tutun, aptal". Bir de YAGNI var - “İhtiyacınız olmayacak”.

Ne yazık ki, bilimsel alanlardaki hesaplama yoğun yazılımı için kaynak kodu nadiren basittir veya yalındır .


Geleneksel olarak, OpenCV genelleme eksikliğinden (farklı seçenekleri desteklemek için birçok kod çoğaltması) muzdaripken, VTK aşırı genellemelerden (şablonlar) muzdaripti.

İlk günlerde, OpenCV'nin bazı bölümleri başlangıçta C'de geliştirildi. Daha sonra OpenCV bugün tanıdığımız C ++ API'sini benimsedi. Bazı algoritmalar, C ++ arayüzlerinden (soyut temel sınıflar) ve C ++ şablonlarından yararlanmak için yeniden yazılmıştır. Diğer algoritmalar, orijinal C kodu için basitçe sarıcılardı. Bu kodun kalıntıları "imgproc" modülünde dağılmış olarak bulunabilir.

OpenCV çok sayıda SIMD programlaması içerir (vektörleştirme). Bu tarihe kadar, C ++ 'da SIMD programlama hala gerçeklerin kullanılmasını gerektirir (intel.com) , (arm.com) .

SIMD temelleri, derleyici değişkenlerinin atanmasıyla ilgilenmesi dışında derleyici gibi bir derleme dili okur ve derleyiciye performans kazancı için talimatların sırasını değiştirmesine izin verilir. SIMD intrinics kullanmak için yazılmış algoritmalar yüksek bakım maliyeti vardı. Daha önce sorduğum bir sorudan bahsetmemin nedeni budur - SIMD programlama kod tabanının bakım maliyeti .

SIMD programlama yapmayan bir kişi, SIMD'nin zarif bir şekilde kapsüllenebileceğine ve düşük seviyeli SIMD programlamasının artık gerekmemesi gerektiğine inanmaya kolaylıkla yönlendirilebilir. Bu aslında gerçeklerden oldukça uzak. Ben kimseye SIMD'de (fraktallar değil) yararlı bir algoritma uygulamaya ve bu önerilen enkapsülasyonlarda kullanım zorluğunu görmeye çalışacaktım.


Hesaplama yazılımının neden KISS veya YAGNI olamayacağını analiz etmeye çalıştığımda, fikirlerin uzun bir listesi aşağıdadır. Bununla birlikte, bu fikirlerin tümü aşırı genellemelerdir ve yukarıdaki gözlemi desteklemiyor gibi görünmektedir.

Katkıda bulunan ana faktörler:

  • Yazılım performansı
  • Pek çok algoritma seçeneğini ve değişimini destekleme ihtiyacı
  • Birçok farklı donanım platformunu ve derleyiciyi destekleme ihtiyacı
    • Bu yazılım performans sorunu ile birleştirir - performans bir çok donanım platformu ve derleyiciler için iyi olması gerekir.
  • Devam eden kod temelinin modernizasyonu , kaynak yetersizliği, kod kalitesini diğer faktörlerden ödün vermeden artırabilecek bilgili insan eksikliği vb.
    • Açık kaynaklı projeler müştereklerin trajedisinden muzdariptir .
    • Hibe alan açık kaynaklı projeler, belirli çıktıları karşılamak zorunda kaldı - kod kalitesi genellikle bunun bir parçası değil.
    • Özellikle, artan kod kalitesi iyileştirmeleri yapabilecek veya önerebilecek bilgili kişiler bile yoktur . Bu "eksik gözbebekleri" sorunudur - birçok kişi koddan yararlanır, ancak çok azı kodu okumak için zaman aldı.
  • Tarihsel eksikliği kod kalite kapıları vb kod inceleme, birim testler, statik analizi gibi
    • Büyük ölçekli bir proje için, bu kod kalite kapıları yalnızca manuel adımlar değildir - her biri bir altyapı (web tabanlı bir sistem, bir birim test sistemi, bir yapı otomasyon sistemi vb.) Gerektirir.

Yukarıdaki katkıda bulunan faktörlerin birçoğu , iş yazılımı geliştirme antipodlarıdır :

  • Tipik olarak, işletme yazılımı, hesaplamalı yazılımda görülen aynı yüksek veri işlemleriyle uğraşmaya ihtiyaç duymaz.
  • İş yazılımı, tek bir işletim sistemine ve bilgisayar mimarisine bağlanabilir.
  • Hangi yazılımların dahil edileceğine karar vermede iş yazılımı verimli olabilir. Aslında, iş yazılımı geliştirme, iyi bir iş vakası olmadığı sürece yöneticileri yeni özelliklere hayır demeye teşvik eder.
    • Dahili iş yazılımı kullanıcıları, kod değişiklikleri yapma gereğini ortadan kaldırarak işleri farklı bir şekilde yapmak için eğitilebilirler.
    • Bir ticari işletme yazılımı, bir eksik özelliği nedeniyle bir müşteriyi kaybederse, ancak gelişmiş sadelik ve kullanım kolaylığı nedeniyle iki yeni müşteri kazandıysa (bkz. "Seçim Paradoksu" na bakın ), genel olarak net bir kazançtır - bu iyi bir şeydir. Bu özellik eksik olan şey.
  • İş yazılımı sürekli bir gelir akışı tarafından desteklenir, böylece bir kısmını sürekli kod tabanlı modernizasyona harcayabilir.

1
Masaya, herkesin soru ile oldukça alakasız göründüğü bir çok puan getiriyorsunuz.
Martin Maat

@MartinMaat Bu soruya ekleyeceğiniz olumlu şeyler varsa, lütfen kendi cevabınızı yazınız.
rwong

3

Bilimsel kod, ortak kodlama standartlarını göz ardı etmek için yeterince farklı bir alan mıdır?

"Genel kodlama standartları" dediğiniz şeye bağlıdır. Çevik "ortak" uçlarını demezdim. Özellikle, sekiz satır uzunluğunda olan veya çok karmaşık olan ikiden fazla girinti seviyesine sahip olan bir işlevi kabul etmek, sayısal / bilimsel programlama alanındaki saçma standartlardır.

Çok basit bir matris kez matris işlevi yedi satırdan fazladır ve üç girinti düzeyi vardır. İşlev, verimlilikten endişe edilmesi gerektiğinden çok daha karmaşık olacak şekilde büyüyecektir. Bu, verimliliğin önemli olduğu ortak bir işlemdir. Parçalara ayırmak tam olarak yapmak istemediğiniz şeydir. Bir matris ayrışması daha da karmaşık olacak.


2
"Çevik" kodlama standartları ile ilgisi yoktur.
Robot,

@StevenBurnap - Tabii öyle. "Temiz Kod" a bakın. İçinde kodlama standartları var.
David Hammen

1
Çok sayıda kodlama standardına sahip olan temiz kod, hatalı bir argümandır. Çevik manifesto kodlama standartları ile ilgisi olmayabilir, ancak Agile esnekliği teşvik eder ve kodlama standartlarında değişiklik yapma ve buna yanıt verme veya en iyi uygulamaları destekler. Yani - çok dolaylı ve dolaysız bir şekilde çevik kodlama standartları ile ilgisi olmayabilir, ancak kodlama standardı çevik ile ilgisi olabilir.
Marjan Venema

1

Bunu yeni bir cevap olarak göndermeye karar verdim çünkü bu tamamen farklı bir bakış açısı.

Bilgisayarla görü ve imge anlayışı açısından "temiz kod" olduğunu düşündüğüm bir kod örneğine bakalım:

https://github.com/opencv/opencv/blob/05b15943d6a42c99e5f921b7dbaa8323f3c042c6/modules/photo/src/seamless_cloning_impl.cpp

MATLAB ve bilimsel hesaplamaya aşina olanlar için, C ++ kodları neredeyse mümkün olan en temiz MATLAB kodları kadar özlüdür.


Şimdi sormamız gerekiyor, neden tüm kütüphane kod tabanı (bu örnekte OpenCV) bu kod örneğiyle aynı standarda yazılmıyor?


Biz gereken tabakalandırmak içine büyük bir bilimsel kütüphanenin kod tabanını soyutlama düzeylerine .

At düşük seviyede , sen yeniden hayata eklemeler ve çıkarmalar anlamıyla vardır. Veya, her bir işlemi kelimenin tam anlamıyla her platformdaki en hızlı uygulamalarla yeniden eşlemek.

https://github.com/opencv/opencv/blob/master/modules/core/src/hal_replacement.hpp

Orta düzey işlemci yürütme zaman% 90 harcanmaktadır - belki% 80, içinde "kirli" kodunu bulmak yerdir. (Benzer şekilde, bilimsel araştırmadan yazılım geliştirme çabalarını ayrı ayrı sayarsak, geliştirme çabalarının% 80-% 90'ı orta düzeyde harcanmıştır.)

At yüksek düzeyde , biz araştırmacılar tarafından yazılmış en temiz kod var.


Bu seviyelerin karışmamasını sağlamak için kaynak kodu organizasyonunda güçlü bir mükemmellik gereklidir. Bu, kodlama standartlarının ötesinde , daha çok açık kaynak yönetimiyle ilgili .

Örneğin, bazen bir açık kaynaklı projeyi ikiye bölme kararı verilir. Bunları kod taahhütleri ile gerçekleştiremezsiniz.

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.