Bence üçünü de elde etmek zor. İki bence uygulanabilir olabilir. Örneğin, bazı durumlarda verimlilik ve okunabilirlik elde etmenin mümkün olduğunu düşünüyorum ancak mikro ayarlı kod için de bakımın zor olabileceğini düşünüyorum. Gezegendeki en verimli kod genellikle, hem inline edilmiş bir montajla yazdığı SoA-vectorized, çok iş parçacıklı SIMD kodunu, ya da en kesicili yazmayı anlatan bir tür olmadıkça, muhtemelen çoğu kişi için açık olduğu gibi hem sürdürülebilirlik hem de okunabilirlikten yoksundur. Sadece 2 ay önce yayınlanan 40 sayfalık matematiksel makaleleri ve bir inanılmaz karmaşık veri yapısı için 12 değerinde kütüphaneyi içeren sektörde kullanılan kenar algoritmaları.
Mikro Verimlilik
Popüler fikre aykırı olabileceğini öne sürdüğüm bir şey, en akıllı algoritmik kodun, çoğu mikro ayarlı basit algoritmadan daha sürdürülmesi daha zor olduğudur. Ölçeklenebilirlik geliştirmelerinin bu mikro ayarlı kodun karşılığını daha da arttırması fikri (ör: önbellek dostu erişim kalıpları, çoklu okuma, SIMD, vb.), En azından son derece karmaşık bir sektörde çalışmış olan, zorlu bir iş. özellikle ağ işleme gibi alanlarda veri yapıları ve algoritmaları (görsel FX endüstrisi), çünkü patlama büyük olabilir, ancak marka olduklarından daha önce hiç kimsenin duymadığı yeni algoritmaları ve veri yapılarını tanıttığınızda bu fiyat oldukça pahalıdır. yeni. Dahası, ben
Bu yüzden algoritmik optimizasyonların daima hafızaya giriş kalıplarıyla ilgili optimizasyonlara her zaman attığını düşünen fikir her zaman tam olarak aynı fikirdeyim. Elbette bir kabarcık türünü kullanıyorsanız, hiçbir mikro mikro optimizasyon orada size yardımcı olamaz ... ama nedense, her zaman bu kadar net olduğunu sanmıyorum. Ve tartışmalı bir şekilde algoritmik optimizasyonların bakımı mikro optimizasyonlardan daha zordur. Klasik ve basit bir BVH algoritması alan Intel'in Embree'sini korumayı çok daha kolay bulurdum, ve algoritmik olarak hızlandırıcı akışkan simülasyonunun en ileri yollarını elde etmek için Dreamwork'ün OpenVDB kodundan çok daha fazla şey ayarlamaz. Bu yüzden, en azından benim endüstrimde, Intel'in sahneye girdiğinde olduğu gibi, bilgisayar mimarisine aşina olan daha fazla insanı daha fazla mikro optimizasyona sokmak istiyorum. Binlerce ve binlerce yeni algoritma ve veri yapısını bulmak yerine. Etkili mikro optimizasyonlarla, insanlar yeni algoritmalar oluşturmak için potansiyel olarak daha az ve daha az neden bulabilirler.
Neredeyse her kullanıcı işleminin kendine özgü bir veri yapısına ve algoritmasına sahip olduğu eski bir kod tabanında çalıştım (yüzlerce egzotik veri yapısını ekleyerek). Ve birçoğu, çok dar performans gösteren, çok eğri performans özelliklerine sahipti. Sistem birkaç düzine daha uygulanabilir veri yapısının etrafında dönebilseydi daha kolay olurdu, ve eğer daha iyi bir şekilde mikro-optimize edilmişlerse durum böyle olacağını düşünüyorum. Bu durumdan bahsediyorum çünkü mikro-optimizasyon, bu durumda, önbellek kayıplarını içeren katı salt okunur amaçlar için bile güvenle kullanılamayan yüzlerce mikro karartılmış veri yapıları arasındaki fark anlamına gelirse, bu durumda büyük olasılıkla korunabilirliği potansiyel olarak artırabilir. doğru vs.
İşlevsel diller
Bu arada, şimdiye kadar karşılaştığım en korunabilir kodlardan bazıları oldukça etkiliydi ancak fonksiyonel dillerde yazılmışlardı. Genel olarak okunabilirlik ve uber sürdürülebilirlik bence çelişkili fikirler.
Bir kerede kodu okunaklı, bakımlı ve verimli hale getirmek gerçekten zor. Tipik olarak, eğer bu üçü değil, ikisi olmasa da, bakım için okunabilirliği tehlikeye atma veya verimlilik için bakımdan taviz verme gibi bir taviz vermeniz gerekir. Diğer ikisinin çoğunu ararken sıkıntı çeken sürdürülebilirliktir.
Okunabilirlik vs. Bakım Kolaylığı
Söylediğim gibi, okunabilirlik ve sürdürülebilirliğin uyumlu kavramlar olmadığına inanıyorum . Sonuçta, çoğumuz için en okunaklı kod, insan düşünce kalıplarına çok sezgisel olarak eşleşir ve insan düşünce kalıpları içsel olarak hataya açıktır: " Eğer bu olursa, bunu yapın. Bu olursa, bunu yapın. Aksi halde bunu yapın. Oops , Bir şeyi unuttum! Bu sistemler birbirleriyle etkileşime girerse, bu sistemin bunu yapabilmesi için böyle bir şey olmalı ... oh bekleyin, bu olay tetiklendiğinde o sistem ne olacak?“Kesin teklifi unuttum, ancak bir keresinde Roma yazılım gibi inşa edildiyse, duvarları yıkmak için sadece bir duvar inişini alacağını söyledi. Çoğu yazılımda durum böyle. Sıklıkla umduğumuzdan daha kırılgan. Burada görünüşte zararsız olan birkaç kod satırı var ve onu tüm tasarımı yeniden gözden geçirmemize kadar durdurabilir ve mümkün olduğunca okunaklı olmayı hedefleyen üst düzey diller bu tür insan tasarım hatalarının istisnaları değildir .
Saf işlevsel diller, fizibil bir şekilde elde edilebileceği kadar buna dayanılmaz olanlara yakındır (yenilmez olanlara bile yakın değil, ama çoğu kişiden nispeten daha yakın). Ve bu kısmen çünkü sezgisel olarak insan düşüncesiyle eşleşmiyorlar. Okunamazlar. Mümkün olan en az miktarda bilgiyi kullanarak ve herhangi bir yan etkiye neden olmadan, mümkün olan en az özel durumla ilgili sorunları çözmemizi sağlayan düşünme kalıplarını üzerimize zorlarlar. Son derece ortogonaldirler, kodların süpriz olmadan sık sık değiştirilip değiştirilmesine izin verirler, böylece epik bir destansı olur, böylece bir çizim tahtasında bile tasarımı yeniden düşünmemiz gerekir, hatta her şeyi yeniden yazmadan genel tasarım hakkındaki düşüncelerimizi değiştirmemiz gerekir. Bundan daha kolay hale gelmiyor gibi görünüyor ... ama kodun okunması hala çok zor.