Erken Optimizasyon: Mükemmelliğin Bir Yeri ve Zamanı Vardır!
İhtiyaç Doğmadan veya Uygun Ortam Oluşmadan Ulaşmaya Çalıştığınız Mükemmellik, Zaman ve Para Kaybı Yaratabilir!
Erken optimizasyon, bir şeyi haddinden erken mükemmelleştirmeye çalışmak anlamına gelir. Örneğin bir yazılımcı, ihtiyaç duyulup duyulmayacağı kesinleşmeden kusursuz bir kod yazmaya çalışıyorsa erken optimizasyonda bulunuyordur.
Erken optimizasyon, kaynakların boşa harcanması ve hatalarda artış gibi çeşitli sorunlara neden olabilir ve bu sebeple kavranması son derece önemlidir. Bu çerçevede makalemizde bu kavramı öğrenecek ve uğraştığınız şeyleri nasıl zamanında optimize edebileceğinizi, optimizasyon için elverişli koşulları göreceksiniz.
Erken Optimizasyon Örnekleri
İnsanlar hayatlarının birçok alanında birçok şekilde erken optimizasyon yaparlar. Kayda değer örnekler arasında şunlar bulunmaktadır:
- Bir kod temelinin belirli fonksiyonlarını haddinden erken, hatta kod temelinde yapılacak gerekli bir değişiklikle harcanan zaman ve çabanın boşa gitme ihtimalini gözardı ederek optimize etmeye çalışmak.
- Bir girişimi, henüz bir kullanıcısı yokken yüz milyonlarca kullanıcıya ölçeklenebilecek şekilde yapılandırmak amacıyla çok fazla kaynak (zaman ve çaba) harcamak.
- Üretilecek ürüne dair bir pazar araştırması yapmadan ("Ürün satılır mı, satılırsa kimler alır?" gibi soruları sormadan) bolca kaynak harcayarak bir şirket kurmak.
- Bir hobiye başlamadan önce hobi ekipmanlarınının en kalitelisini satın almak ve böylelikle kaynak israfında bulunmak.
Not: Bu senaryoların bazılarında gerçekleşen belirli bir optimizasyonun erken veya zamanında olup olmadığı, yapılma sebebi gibi faktörlere bağlı olarak gerekçelendirilmektedir. Örneğin bir kimse, geçmiş deneyimleri çerçevesinde başlayacağı hobiyi bırakmayacağını biliyorsa ve en kaliteli hobi ekipmanlarını, bu hobi ekipmanlarını seçecek güvenilir bir uzman eşliğinde satın alıyorsa bu optimizasyon erken değil, yerinde bir optimizasyon olarak değerlendirilir.
"Erken Optimizasyon Bütün Kötülüklerin Anasıdır"
Erken optimizasyon kavramı, bir bilgisayar bilimci olan Donald Knuth'un yazılım dünyasında "Erken optimizasyon bütün kötülüklerin anasıdır." cümlesiyle popülerlik kazanmıştır.
Bu cümle, örneğin programcıların programlarının kritik önem taşımayan bölümleriyle uğraşmalarına sebep olarak zaman kaybı yaşatan, kod bakımı gibi alanlarda sorunlara sebep olacak değişiklikler yapmalarına ortam veren erken ve gereksiz optimizasyon sorununa ışık tutmaktadır. Knuth, bu cümlenin yanında aynı zamanda faydalı optimizasyonların tespit edilmesinin ve uygulanmasının önemini de vurgulamaktadır; ancak faydalı optimizasyona ilişkin vurguladığı şeyler erken optimizasyon alanında kendi ismiyle yürüyen tartışmalarda genellikle göz ardı edilmektedir.
Knuth'un erken optimizasyon kavramı ve "Erken optimizasyon bütün kötülüklerin anasıdır." söylemi şu alıntı çerçevesinde popülerlik kazanmıştır:[1]
Verimlilik kültünün bir zulüme döndüğü yönünde hiçbir şüphe yoktur. Yazılımcılar programlarının kritik olmayan bölümlerinin hızını düşünmeye veya bu hız hakkında endişelenmeye devasa boyutlarda zaman harcamaktadır ve bu çerçevede yaptıkları değişiklikler, debugging ve koruma alanlarında ciddi olumsuz etkiler yaratmaktadır. Verimlilik getirecek küçük şeyleri şöyle bir %97 oranında göz ardı etmeliyiz: Erken optimizasyon bütün kötülüklerin anasıdır.
Ancak o kritik %3'lük kısımda doğan fırsatları da değerlendirmemek olmaz. İyi bir yazılımcı bu rakamları gördüğü gibi işini savsaklamaz; kodunu dikkatle inceler, tabi incelemesi gereken bölümler/kodlar tespit edildikten sonra.
Knuth, 1974 senesinde verdiği bir başka derste şu makaleye atıfta bulunmaktadır:[2]
Programların kalitesini belirleyen önemli unsurlardan bir diğeri de bir programın bilgisayarın sunduğu kaynakları ne denli verimli kullanabildiğidir. üzülerek belirtiyorum ki günümüzde birçok insan program verimliliğini yerin dibine sokuyor ve gereksiz olduğunu söylüyor. Bunun sebebi ise verimliliğin tek kayda değer kriter olarak kabul edildiği zamanlardan günümüze taşınan alışkanlıklar. Eskiden yazılımcılar verimlilik ile haddinden fazla haşır neşir olup gereksiz düzeyde karmaşık kodlar yazardı; bunun sonucu olarak da debugging ve koruma zorlukları yaşandı ve yazılımların net verimliliği düştü.
Evrim Ağacı'ndan MesajAslında maddi destek istememizin nedeni çok basit: Çünkü Evrim Ağacı, bizim tek mesleğimiz, tek gelir kaynağımız. Birçoklarının aksine bizler, sosyal medyada gördüğünüz makale ve videolarımızı hobi olarak, mesleğimizden arta kalan zamanlarda yapmıyoruz. Dolayısıyla bu işi sürdürebilmek için gelir elde etmemiz gerekiyor.
Bunda elbette ki hiçbir sakınca yok; kimin, ne şartlar altında yayın yapmayı seçtiği büyük oranda bir tercih meselesi. Ne var ki biz, eğer ana mesleklerimizi icra edecek olursak (yani kendi mesleğimiz doğrultusunda bir iş sahibi olursak) Evrim Ağacı'na zaman ayıramayacağımızı, ayakta tutamayacağımızı biliyoruz. Çünkü az sonra detaylarını vereceğimiz üzere, Evrim Ağacı sosyal medyada denk geldiğiniz makale ve videolardan çok daha büyük, kapsamlı ve aşırı zaman alan bir bilim platformu projesi. Bu nedenle bizler, meslek olarak Evrim Ağacı'nı seçtik.
Eğer hem Evrim Ağacı'ndan hayatımızı idame ettirecek, mesleklerimizi bırakmayı en azından kısmen meşrulaştıracak ve mantıklı kılacak kadar bir gelir kaynağı elde edemezsek, mecburen Evrim Ağacı'nı bırakıp, kendi mesleklerimize döneceğiz. Ama bunu istemiyoruz ve bu nedenle didiniyoruz.
Gerçek sorun yazılımcıların yanlış yerlerde ve yanlış zamanlarda verimlilik üzerine çok fazla kafa yormasıydı. Erken optimizasyon, programlamada bütün (bütün değilse de çoğu) kötülüklerin anasıdır.
Yani demem o ki bir lirada bir kuruşun hesabını yapmamalı ve verimliliği toplam işleme süresi veya alanı kapsamında kazandığımız yüzdeler olarak düşünmemeliyiz. Bir araba aldığımızda fiyat etiketinde 50-100 dolarlık bir fark hiç mi hiç dikkatimizi çekmez; ama 50 sentlik bir ürünü 25 sente almak için bir başka dükkana gidebiliriz. Özetle verimliliğin yeri ve zamanı vardır; Computing Surveys dergisinin son sayısında yayınlanan makalemde de verimliliğin rolünü detaylıca inceledim.
Bu kavramı popülerleştiren isim Knuth olmasına karşın kavram Tony Hoare ve Edsger Dijkstra dahil olmak üzere birçok kişiye de atfedilmektedir ve Knuth'un kendisi de 1989 senesinde "erken optimizasyon tüm kötülüklerin anasıdır" ifadesiyle Hoare'a atıfta bulunmuştur.[3], [4], [5] Buna karşın kanıtlar cümlenin Knuth'a ait olduğunu göstermektedir.[6]
Son olarak erken optimizasyonun "Gerçekten ihtiyacınız olduğunda uygulayın, ihtiyacınız olabileceğini düşündüğünüzde değil!" anlamına gelen ihtiyacın olmayacak (YAGNI) prensibi ve görece küçük sorunlara orantısız kaynak harcanması fenomeni anlamına gelen boşa pedal çevirme kavramı dahil olmak üzere birçok kavramla yakından ilişkili olduğunu göz önünde bulundurmak önemlidir.[7]
Not: Optimizasyon, erken uygulanmak haricinde amaçsız olması (bir faydası olmaması), yatırım boyutuna karşın küçük bir geri dönüş sağlaması (uygulanmasının getireceği kârdan daha maliyetli olması), ters tepmesi (çözdüğünden daha fazla sorun çıkarması) dahil olmak üzere farklı biçimlerde de sorunlara müsaittir. Bu potansiyel sorunlar, Knuth'un erken optimizasyona değindiği kaynaklarda bir noktaya kadar ele alınmaktadır.
Erken Optimizasyonun Tehlikeleri
Erken optimizasyon, aşağıdakiler de dahil olmak üzere çeşitli sorunlara sebep olabilir:[8]
- Kaynak israfı: Örneğin zaman, emek ve para harcadığınız bir şeyin tamamen gereksiz olduğunu görebilirsiniz.[9]
- Artan hatalar: Yetersiz bilgiyle karar alıyorsanız yapacağınız hatalar artacaktır.
- Daha kötü sonuçlar: Erken optimizasyona harcadığınız kaynakları ziyan etmek istemeyebilir, bu kaynaklardan faydalanabilmek için de daha kötü bir eylem planını tercih etmek zorunda kaldığınızı hissedebilirsiniz.[10]
- Olumsuz duygular: Harcadığınız onca emeğin konuyla bir ilgisi kalmadığını görünce cesaretiniz kırılabilir veya hayal kırıklığına uğrayabilirsiniz.
Erken Optimizasyonun Sebepleri
İnsanlar, aşağıdakiler de dahil olmak üzere birçok sebeple erken optimizasyon sürecine girerler:
- Erken optimizasyon süreci, üzerinde çalışması görece kolay şeylere odaklanabilmeyi sağlar. Örneğin bir kimse zor bir hobiye başlamak istiyorsa en iyi ekipmanları araştırarak erken optimizasyon tuzağına düşebilir. Zira bu şekilde yapılan bir erken optimizasyon hobiye başlamaktan daha kolay (ve muhtemelen daha eğlenceli ve daha az korkutucu) bir yoldur.
- İlerleme hissi verir. Örneğin bir kimse bir şirket açmak istiyorsa ve bir şirketi nasıl açabileceğini bilmiyorsa, logoyu optimize etmeye çokça zaman harcamak bu kimseye ilerleme kaydettiğini hissettirir.
- Geleceğe dair hayallere dalmanın bir yoludur. Örneğin bir kimse bir mobil uygulama geliştirmek istiyor ve bunu nasıl yapacağını bilmiyorsa uygulama piyasaya sürüldüğünde rekabetçisi haline gelecek uygulamaları araştırarak bir erken optimizasyon yapabilir. Bu erken optimizasyon, bu kimsenin geliştirdiği uygulamanın başarılı olacağı hissini verir.
- Bir kimse, hayatındaki öncelikleri belirleyemiyor olabilir. Örneğin kod yazan bir kimse emeklerinin fırsat maliyetini (kod yazmak yerine yapabilecekleri başka şeylerin değeri) göz önünde bulundurmuyorsa yazdıkları kodun önemli olmayan kısımlarını gerek olmadığı halde mükemmel hale getirmeye çalışabilir.
- Geçmiş deneyimleri, şimdiki zaman davranışlarını uygunsuz şekilde dikte ediyor olabilir. Örneğin bir öğrenci, staj süresine kadar mükemmel notlarla eğitim almış olabilir. Bu öğrenci stajı sırasında da mükemmel bir kod yazmaya çalışarak boşa emek harcayabilir.
- Sosyal kaygılar. Örneğin bir kimse, diğer insanların davranış şekillerine uymak amacıyla, bir şeyleri kaçıracağı korkusuyla veya (bir patron beklentisi olarak) çalışıyor gibi görünmeleri gerektiği için erken optimizasyon sürecine girebilir.
- Başkaca altta yatan fenomenler. Örneğin bir kimse, eylem halinde bulunması gerektiğini hissettiği eylem önyargısı, erişilmesi mümkün olmayan kusursuzluğu hedeflediği mükemmelliyetçilik, doyum hissine ulaşmak amacıyla işlerini aceleye getirdiği önceleme (İng: "precrastination") veya bir şeyi ertelemek için başka bir şeyle uğraştıkları erteleme (İng: "procrastination") fenomenleri çerçevesinde erken optimizasyon davranışında bulunabilir.
Bu sebeplerin farklı kombinasyonları farklı koşullar altında insanların erken optimizasyonlarını besleyebilir ve bazıları (örneğin geleceğe dair hayal kurma), öncelikle duygusal temellere (iyi hissetmeye) dayandığı için motive olarak değerlendirilebilir. Ancak motive sebeplerin yanında bir de demotive sebepler vardır; örneğin bir kimsenin önceliklerini belirleyememesi genellikle duygusal temellere dayanmaz.
Erken Optimizasyondan Nasıl Kaçınılır?
Erken optimizasyondan kaçınmak için bir şeyleri optimize etmeye karar vermeden/nasıl optimize edeceğinizi belirlemeden önce bir durum değerlendirmesi yapmalısınız. Bu durum değerlendirmesinde kendinize şu soruları sorabilirsiniz:
- Neyi optimize etmek istiyorsunuz? Örneğin yapacağınız optimizasyonun olumlu bir etkisi olacağına inanıyor musunuz, yoksa optimizasyonu bir başka şeyi ertelemek için mi kullanıyorsunuz?
- Optimizasyonun faydaları neler olacak? Spesifik olarak bu optimizasyon size kısa ve uzun vadede neler kazandıracak?
- Optimizasyon size neye mal olacak? Bu optimizasyon için hangi kaynaklardan (zaman ve para) ne kadar harcama yapmanız gerekecek?
- Optimizasyon yerine yapabileceğiniz bir şey var mı? Mesela üzerinde çalışabileceğiniz daha faydalı bir şey?
- Optimizasyonun olası tehlikeleri neler? Yaptığınız optimizasyon elinizde yeterli bilgi olmadığı için ilerleyen vadede daha kötü bir eylem planınızı benimsemenizi gerektirecek mi?
- Bu optimizasyonun işlevini kaybetmesi ne kadar mümkün? Bir optimizasyonun işlevini kaybetme ihtimali olması bu optimizasyonu kesinlikle yapmamanız gerektiği anlamına gelmez; ancak bu ihtimali ve ilgili diğer unsurları (optimizasyon işlevini kaybetmeden önce sağlayacağı faydalar, vb.) da göz önünde bulundurmalısınız.
- Optimizasyonu bir süre bekletmenin avantajları ve dezavantajları neler? Örneğin bundan bir hafta sonra elinizde daha fazla bilgi olacaksa beklemenin zararı olur mu?
Bu soruları değerlendirirken tüm optimizasyonların erken optimizasyon olmadığını göz önünde bulundurmak önemlidir. Yani tüm optimizasyon çabalarından kaçınmak yerine bir şeyi optimize etmeden önce durum değerlendirmesi yaptığınızdan emin olmalısınız.[9] Örneğin bir optimizasyon bir projenin erken safhalarında yapılmış olsa bile optimizasyon yapma bedelinin düşüklüğü ve faydalarının yüksekliği bu optimizasyonu değerli kılabilir.
Bu durum aynı zamanda erken optimizasyon kavramını popülerleştiren orijinal alıntıda da yinelenmektedir: "Verimlilik getirecek küçük şeyleri şöyle bir %97 oranında göz ardı etmeliyiz: erken optimizasyon bütün kötülüklerin anasıdır. Ancak o kritik %3'lük kısımda doğan fırsatları da değerlendirmemek olmaz."
Özetle erken optimizasyondan kaçınmak için optimizasyon yapıp yapmayacağınıza, yapacaksanız nasıl yapacağınıza karar vermeden önce durum değerlendirmesi yapmalısınız. Bu durum değerlendirmesinde de neden optimizasyon yapmak istediğinizi, optimizasyonun bedel ve tehlikelerini ve optimizasyon yerine yapabileceğiniz şeyleri de göz önünde bulundurmalısınız.
Not: Optimizasyon yapıp yapmamaya karar verirken faydalanabileceğiniz bir kavram (Pareto Prensibi olarak da bilinen) 80/20 kuralıdır. Bu kural, bu bağlamda deneyimleyeceğiniz olumlu sonuçların %80'inin yaptığınız işin %20'sinden geleceğini öne sürer.
Özet ve Sonuçlar
- Erken optimizasyon, bir şeyi haddinden erken (özellikle mükemmelleştirme hedefiyle) geliştirme çabasına verilen isimdir. Bir yazılım kodunun belirli bir bölümünü, ihtiyaç duyulacağı kesin bile değilken epey vakit harcayarak mükemmelleştirmeye çalışmak buna örnek olarak verilebilir.
- Erken optimizasyon kaynak israfı, hata ve olumsuz duygularda artış ve beklenenden daha kötü sonuçlar gibi birçok soruna sebep olabilir.
- İnsanlar daha kolay başa çıkabileceği sorunlara odaklanmak, iyi önceliklendirme yapamamak ve çevrelerindeki insanların davranış kalıplarına uygun davranmak gibi birçok sebeple erken optimizasyon yaparlar.
- Erken optimizasyondan kaçınmak için bir şeyi optimize edip etmeyeceğinize ve edecekseniz nasıl optimize edeceğinize karar vermeden önce neden optimize etmek istediğinizi kendinize sorarak, maliyet ve tehlikelerini belirleyerek ve optimizasyon yerine daha verimli bir şey yapıp yapamayacağınızı düşünerek bir durum değerlendirmesi yapmalısınız.
- Bütün optimizasyonlar erken değildir. Bundan ötürü optimizasyondan tamamıyla kaçınmak yerine hangi optimizasyonları yapmanın yerinde olduğunu belirlemelisiniz.
İçeriklerimizin bilimsel gerçekleri doğru bir şekilde yansıtması için en üst düzey çabayı gösteriyoruz. Gözünüze doğru gelmeyen bir şey varsa, mümkünse güvenilir kaynaklarınızla birlikte bize ulaşın!
Bu içeriğimizle ilgili bir sorunuz mu var? Buraya tıklayarak sorabilirsiniz.
Soru & Cevap Platformuna Git- 12
- 2
- 2
- 1
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- ^ D. E. Knuth. (1974). Structured Programming With Go To Statements. ACM Computing Surveys (CSUR), sf: 261-301. doi: 10.1145/356635.356640. | Arşiv Bağlantısı
- ^ D. E. Knuth. (1974). Knuth: Computer Programming As An Art.
- ^ H. Randall. (2009). The Fallacy Of Premature Optimization. Ubiquity. doi: 10.1145/1569886.1513451. | Arşiv Bağlantısı
- ^ H. Gerwitz. Premature Optimization Is The Root Of All Evil. (12 Haziran 2004). Alındığı Tarih: 3 Kasım 2022. Alındığı Yer: Hans Gerwitz | Arşiv Bağlantısı
- ^ D. E. Knuth. (2006). The Errors Of Tex. Wiley, sf: 607-685. doi: 10.1002/spe.4380190702. | Arşiv Bağlantısı
- ^ S. Vatsa. Premature Optimization Is The Root Of All Evil. (1 Aralık 2009). Alındığı Tarih: 3 Kasım 2022. Alındığı Yer: Shreevatsa | Arşiv Bağlantısı
- ^ R. Jeffries. You’re Not Gonna Need It!. (4 Nisan 1998). Alındığı Tarih: 3 Kasım 2022. Alındığı Yer: Ron Jeffries | Arşiv Bağlantısı
- ^ B. Smaalders. (2006). Performance Anti-Patterns. Queue, sf: 44-50. doi: 10.1145/1117389.1117403. | Arşiv Bağlantısı
- ^ a b M. C. Brogioli. (2019). Embedded And Multicore System Architecture—Design And Optimization. Software Engineering for Embedded Systems, sf: 89-100. doi: 10.1016/B978-0-12-809448-8.00003-5. | Arşiv Bağlantısı
- ^ H. H. Hoos. (2012). Programming By Optimization. Communications of the ACM, sf: 70-80. doi: 10.1145/2076450.2076469. | Arşiv Bağlantısı
Evrim Ağacı'na her ay sadece 1 kahve ısmarlayarak destek olmak ister misiniz?
Şu iki siteden birini kullanarak şimdi destek olabilirsiniz:
kreosus.com/evrimagaci | patreon.com/evrimagaci
Çıktı Bilgisi: Bu sayfa, Evrim Ağacı yazdırma aracı kullanılarak 21/11/2024 12:15:33 tarihinde oluşturulmuştur. Evrim Ağacı'ndaki içeriklerin tamamı, birden fazla editör tarafından, durmaksızın elden geçirilmekte, güncellenmekte ve geliştirilmektedir. Dolayısıyla bu çıktının alındığı tarihten sonra yapılan güncellemeleri görmek ve bu içeriğin en güncel halini okumak için lütfen şu adrese gidiniz: https://evrimagaci.org/s/13188
İçerik Kullanım İzinleri: Evrim Ağacı'ndaki yazılı içerikler orijinallerine hiçbir şekilde dokunulmadığı müddetçe izin alınmaksızın paylaşılabilir, kopyalanabilir, yapıştırılabilir, çoğaltılabilir, basılabilir, dağıtılabilir, yayılabilir, alıntılanabilir. Ancak bu içeriklerin hiçbiri izin alınmaksızın değiştirilemez ve değiştirilmiş halleri Evrim Ağacı'na aitmiş gibi sunulamaz. Benzer şekilde, içeriklerin hiçbiri, söz konusu içeriğin açıkça belirtilmiş yazarlarından ve Evrim Ağacı'ndan başkasına aitmiş gibi sunulamaz. Bu sayfa izin alınmaksızın düzenlenemez, Evrim Ağacı logosu, yazar/editör bilgileri ve içeriğin diğer kısımları izin alınmaksızın değiştirilemez veya kaldırılamaz.