- Kural 1: Bir programın zamanını nerede harcayacağını öngöremezsiniz. Darboğazlar beklenmedik yerlerde ortaya çıkar; bu yüzden gerçekten darboğaz olduğu kanıtlanana kadar hızı artırmaya çalışmayın
- Kural 2: Ölçüm önce gelir. Performans ayarı yalnızca ölçümden sonra yapılmalı; optimizasyon ancak kodun bir bölümü bütüne baskın geldiğinde düşünülmelidir
- Kural 3: Karmaşık algoritmalar küçük n için yavaştır. Karmaşık algoritmalar büyük sabitler taşır; n sık sık büyümüyor ise basit yöntemi kullanın. n büyüse bile önce Kural 2 uygulanmalıdır
- Kural 4: Karmaşık algoritmalar daha fazla hataya sahiptir ve uygulanmaları zordur. Basit algoritmalar ve basit veri yapıları kullanmak tercih edilmelidir
- Kural 5: Veri esastır. Doğru veri yapısını seçip iyi organize ederseniz, algoritma neredeyse kendiliğinden ortaya çıkar. Programlamanın merkezi algoritmalar değil, veri yapılarıdır
İlgili felsefe ve alıntılar
- Kural 1 ve 2, Tony Hoare'un "erken optimizasyon bütün kötülüklerin kaynağıdır" özdeyişiyle aynı anlama gelir
- Ken Thompson, Kural 3 ve 4'ü "Şüphe duyduğunda basit yöntemi (Brute Force) kullan" diye yeniden yorumladı
- Kural 3 ve 4, KISS (Keep It Simple, Stupid) tasarım felsefesinin bir örneğidir
- Kural 5, Fred Brooks'un 『The Mythical Man-Month』 kitabında zaten değinilmiş bir noktadır ve
çoğu zaman "akıllı nesneler kullanan basit kod yazmak" diye özetlenir
1 yorum
Hacker News görüşleri
Jonathan Blow’un konuşmasını hatırlatıyor
O, konuya üretkenlik açısından yaklaşıyordu. Braid’in geliştirilmesinin ilk dönemlerinde neredeyse her şeyi basit dizilerle uygulamış, yalnızca darboğaz oluştuğunda değiştirmişti
“Hızdan ya da bellekten daha önemli olan şey, tek bir programı hayata geçirmek için harcanan ömür zamanıdır” sözü özellikle etkileyiciydi
Rule 1’i gerçekten ciddiye alırsanız, Rule 3~5 doğal olarak gelir
Darboğazların öngörülemeyeceği öncülünü kabul ederseniz, basit kod yazmak ve ölçmek tek makul strateji haline gelir
Pratikte en sık başarısız olunan şey erken optimizasyon değil, erken soyutlamadır. Gerekli olmayan esneklik uğruna karmaşık katmanlar kurulur ve bu da bakım maliyetini artırır
90’larda gece 2’de bir veri kümesi arama özelliği yazmak zorunda kaldığım bir deneyimim var
Yorgunluktan önce bunu doğrusal arama ile yazıp sonra düzeltmeye karar vermiştim, ama gerçekte 4 saatlik testte yalnızca 6 saniye fark çıktı
Sonunda düzelttim ama anlamlı bir fark yoktu
Rule 5’e tamamen katılıyorum
Zor problemler ne kadar büyükse, çözüm de o kadar çok veri yapıları ve API’nin yinelemeli olarak iyileştirilmesiyle bulunuyor. Yapı iyi kurulduğunda kontrol akışı doğal hale geliyor
LLM’ler bu tür yapısal düşünmede zayıf. Karmaşık kontrol akışlarını iyi önerseler de, birleştirilebilir veri yapıları tasarımı konusunda başarılı değiller
Ben elektrik-elektronik (E.E.) kökenliyim ve Rule 3 sayesinde kariyerimin başlarında büyük bir sorun yaşamadım
Ama daha sonra büyük ölçekli sistemlere geçince n büyüdü ve karmaşıklık gerçekten önemli hale geldi
Rob Pike’ın söz ettiği dönemin ‘big iron’ sistemleri, bugünün gömülü ortamlarına benziyordu
İki algoritmanın uygulama zorluğu benzerse, büyük girdilerde hızlı olanı seçerim
İlgili yazı: Less Than Quadratic
İnsanlar sık sık aşırı basit O(n²) yaklaşımı seçip prod’da patlama yaşar
Pike’ın kurallarının mevcut özdeyişlerden daha iyi olduğunu düşünüyorum
“Erken optimizasyon bütün kötülüklerin köküdür” gibi cümleler bağlamından kopunca yanlış anlaşılmaya çok açıktır
Pike’ın versiyonu açık ve kötüye kullanılması zor
Eskiden “Rule 5, aptal kodun akıllı nesneler kullanmasına izin ver” diye özetlenirdi,
ama nesne yönelimli çağda bu, tersine karmaşıklığı gizleyen yanlış bir inança dönüştü
10 yıldan uzun süredir aynı kod tabanını işletirken Pike’ın kurallarını tamamen içselleştirdim
KISS/DRY ilkelerine bağlı kalmak ve moda teknolojiler yerine kendini kanıtlamış teknolojileri sürdürmek, uzun vadede daha istikrarlı oldu
Nitekim ekibimizin geliştirme ilkeleri belgesi, Pike’ın kurallarıyla neredeyse aynı içerikte
1990’ların başındaki C++ döneminde, çift bağlı liste yerine basit dizi yeniden tahsisine geçince
hatalar yalnızca kaybolmakla kalmadı, sistem ayrıca daha da hızlandı.
Pahalı işlemleri daha seyrek yapmak iyi bir stratejiymiş, bunu öğrendim
“Ölçmeden tuning yapma” kuralını Jeff Dean’in Latency Numbers Every Programmer Should Know metniyle karşılaştırmak ilginç
Dean, ön bilgiyle performansın tahmin edilebileceğini söylüyor
Sonuçta bu iki yaklaşım uzlaştırılabilir — tasarım aşamasında sezgisel olarak hızlı yapıları seçmeli, uygulamadan sonra ise ölçüm temelli ince ayar yapmalısınız
Rule 1 ve 2 yalnızca yeni problemlerle uğraşırken mutlak kurallardır
Aynı alanda tekrar tekrar sistem kurdukça, darboğaz noktaları önceden tahmin edilebilir hale gelir
Deneyimli geliştiriciler tasarımdan önce bile kabaca bir performans hissine sahip olabilir