Tekerleği Yeniden İcat Edin - Reinvent the Wheel
(endler.dev)- "Tekerleği yeniden icat etmeyin" tavsiyesi, yaratıcılığı ve keşif merakını bastıran olumsuz bir etki yaratır
- Yeni bir tekerlek, yani mevcut araçları veya teknolojileri yeniden yaratma sürecinde derin anlayış ve öğrenme elde edilir
- Basit ya da tanıdık görünen temel yapı taşları bile aslında karmaşıklık ve çeşitli ödünleşmeler içerir
- Kendi tekerleğinizi icat etmeyi deneyerek gelişim, problem çözme ve deney yapma becerileri güçlenir
- Mevcut çıktıları kullanmak ile yeniden yaratmak arasında amaca göre dengeli seçim yapma gereği vurgulanır
Reinvent the Wheel
- "Tekerleği yeniden icat etmeyin" sözü iyi niyetli olsa da, iki tür insandan gelen bir tavsiyedir
- Bizzat tekerlek yapmayı deneyip zorluğunu yaşamış olanlar
- Hiç denemeden mevcut tavsiyeyi körü körüne izleyenler
- Bu tavsiye tekrarlandıkça, merakın ve araştırma ruhunun köreldiği bir ortam oluşur
- Eğer herkes bu tavsiyeye uysaydı, bugünkü pek çok modern kolaylık ve ilerleme gerçekleşemezdi
- Aslında tekerlek, ilk icadından sonra da defalarca yeniden icat edilerek gelişimini sürdürmüştür
Not: Burada 'tekerlek', herhangi bir araç, protokol, servis, teknoloji veya başka bir üretimle değiştirilebilir
Tekerleği bizzat icat etmeyi denemek öğrenmenin kendisidir
"Yapamadığım şeyi anladığımı söyleyemem"
— Richard Feynman
- Bir şeyi gerçekten derinlemesine anlamak için, küçük bir sürümü bile olsa onu bizzat hayata geçirme deneyimi gerekir
- Ortaya çıkan şey kusursuz olmasa, hatta hiç kullanılmasa bile, onu inşa etme sürecinin kendisi önemlidir
- Bilgisayar biliminin protokoller, şifreleme, web sunucuları gibi pek çok kavramı zor görünebilir, ancak aslında herkes bunları denemeye çalışabilir
- Daha fazla insanın bizzat bir şeyler üretmesi, mevcut teknolojilerin yapısını ve özünü anlama fırsatı yaratır
Her şey sonsuz bir keşif sürecidir (Rabbit Hole)
- Doğal kabul ettiğimiz temel yapı taşları — örneğin string'ler, dosya yolları — gerçekte oldukça karmaşıktır
- Kendi string veya path kütüphanenizi yazmayı denemek, büyük bir öğrenme fırsatı olabilir
- Bu süreçte şu gerçekler fark edilir
- Gündelik görünen şeylerde bile sonsuzluğa yakın bir karmaşıklık vardır
- Başkaları için faydalı bir şey üretmek, alçakgönüllülük öğrenme fırsatıdır
- Her soyutlama insanlar tarafından yapılmıştır; kusursuz değildir ve kendinize özgü (farklı) ödünleşmeler de mümkündür
- Uygulama sırasında doğruluk, sadelik, performans, ölçeklenebilirlik, taşınabilirlik gibi sayısız tercih ve problemle karşılaşılır
- Kendi çözümünüz bazı alanlarda mükemmel olabilir, ancak her kullanıcıya / duruma uymayabilir
- Mevcut çözümlerin de sınırları vardır ve benim problemime uymayabilirler
- Tek bir problemi sonuna kadar derinlemesine inceleme deneyimi, bir mühendisin büyüme sürecidir
- Eğer projeler arasında sürekli oradan oraya atlıyorsanız, anlamlı bir öğrenme elde edemezsiniz
Tekerleği yeniden icat etmeniz için nedenler
- Mevcut olandan daha iyi bir tekerlek yapmak istemek ('daha iyi'nin tanımı farklı olabilir)
- Tekerleğin nasıl yapıldığını öğrenme amacı
- Başkalarına tekerleğin prensibini öğretmeye yönelik eğitsel amaç
- Tekerleğin icat sürecini incelerken yeni farkındalıklar kazanmak
- Bozulduğunda doğrudan onarabilme veya iyileştirebilme becerisi geliştirmek
- Tekerlek yapmak için gereken çeşitli araç ve teknikleri öğrenmek
- Bileşik sistemlerde (ör. araba vb.) tekerleğin rolünü anlamak
- Belirli ihtiyaçlara uygun çok özel bir tekerlek yapma denemesi (ör. tekerlekli sandalye, kaykay, seramik çarkı vb.)
- Yaptığınız tekerlek, asıl amacından farklı olarak bambaşka bir kullanım için daha uygun olabilir
- Dünyada kalıpların dışına çıkan yeni fikirler önemli bir rol oynayabilir
Reuse vs Reinvent
- Başkalarının ortaya koyduğu işleri görmezden gelmemeli, onların çalışmalarını inceleyip uygun biçimde kullanmalısınız
- Sırf güvensizlik veya bilgisizlik nedeniyle mevcut olanı atıp yeniden yapmamaya dikkat edilmelidir
- Ancak bizzat uygulamadan veya deney yapmadan, o alandaki temel anlayış ve ilerleme zordur
- Yazılım mühendisliğinde küçük deneyler ve prototipler yapmak kolay ve hızlıdır; bu yüzden kişisel problem çözümünde etkilidir
- Küçük başlayıp basit uygulayın ve yineleyin yaklaşımı önerilir
- Bu yüzden son tavsiyem şu
- İçgörü (insight) istiyorsanız, yeniden icat etmeyi deneyin
- Etki (impact) istiyorsanız, zaten kanıtlanmış çözümleri yeniden kullanın
"Reinvent for insight. Reuse for impact."
"İçgörü için yeniden icat edin. Etki için yeniden kullanın."
8 yorum
Kare tekerleği yuvarlak yapmaya çalışınca, patronun "tekerleği yeniden icat etmeyin" sözü aklıma geliyor. Bu "tekerleği yeniden icat etme" hayaleti hâlâ etrafta çok.
"Atı alan Üsküdar'ı geçti" sözü geleceğe hazırlanmamak gerektiği anlamına gelmediği gibi,
"Tekerleği yeniden icat etme" sözünün de içgörü kazanmak için zaman harcamamak gerektiği anlamına gelmediğini düşünüyorum.
Bu tür sözlerin hangi durumda söylendiğini bağlamından koparırsanız, asıl anlamı çarpıtılmış olur.
Yakın zamanda yaşadığım bir deneyimdi; kısa süre önce kendime özgü çok özel bir tekerlek yeniden icat ettim.
Nuxt ile 1000 sayfalık bir uygulamayı build etmek 7 dakika sürüyordu,
birkaç otomasyonu bırakıp her şeyi yeniden yazınca bunu 20 saniyelik bir build süresine indirmeyi başardım.
Nereye kadar yeniden icat edeceğinize ve ne kadarını dış bağımlılıklara dayandıracağınıza karar vermek zor.
Her durumda, bunu kendiniz yapabilecek olmanıza rağmen zaman kazanmak için o bağımlılığı seçmenizle, o bağımlılık olmadan hizmeti kuramayacağınız için ona bağlı kalmanız tamamen farklı şeylerdir.
Her kod parçası için mümkün olmayabilir (örneğin işletim sistemi gibi), ama olabildiğince birincisine doğru gitmeye çalışmak sistemi anlamaya yardımcı olacaktır.
Atasözlerinin taşıdığı bir anlam vardır ama giderek daha fazla insan onları sadece kelime kelime yorumluyor.
Böyle iddialar moda olunca toplantı odası yine hiç çekinmeden darmadağın oluyor.
Evrak işleriyle uğraşan tipler coşup ortalığı karıştırıyor ve aynı başarısızlık her yıl tekrar ediliyor.
Hacker News görüşleri
Belirli bir alanda kendi başıma tekerleği yeniden icat etme deneyimim oldu. En başta niyetim bu değildi; mevcut teknolojinin yanlış olduğunu düşündüğüm için böyle yaptım. Genelde imkânsız denilen bir probleme böl ve yönet yaklaşımıyla girdim. Şanslıydım ve inatçıydım, sonunda da başardım. Benim tekerleğim o alanda ezici derecede üstün performans gösterdi. Deneyince, daha önce imkânsız sanılan şeylerin bile çok kolay yapılabildiği ortaya çıktı. Zamanla o alandaki başka insanlar da benim tekerleğimi kullanmaya başladı. Başta herkes afallıyor ama bir kez alışınca artık eskisine dönmüyor. Dünyanın dört bir yanından tuhaf kullanım senaryoları ve iş akışlarıyla ilgili bug raporları ve özellik istekleri alıyorum. Normalde asla tanışmayacağım zeki insanlarla derin teknik sohbetler yapıyorum. Yaptığım tekerlekle başkalarının hayal bile etmediği sonuçlara ulaştığını görüyorum. Uykularımı kaçıran yeni keşifler yapıyorum. İş arkadaşlarımın benim tekerleğin özelliklerini duyunca beyninin donup kaldığını izlemek de ayrı eğlenceli. Tekerleği yeniden icat etmekten korkmaya gerek yok. Hangi çılgın yollara sapacağını kimse bilemez
Mevcut tekerleği daha iyi hale getirmek dışında, gerçekten önemli bir neden daha eksik kalmış bence: bana tam uyan bir tekerlek yapabilmek ve onu o şekilde kullanmaya devam edebilmek. İnsanların “aynı tekerleği yeniden icat etme” deyip sık sık araba tekerleğini bisiklete zorla takmaya çalıştığını görüyorum. Sistemimin tüm parçalarını birbirine iyi uyacak şekilde kendim yaptığımda, beklediğimden daha büyük fayda elde edebiliyorum
Tekerleği yeniden yapmanın önemli nedenlerinden biri de, işe yaramaz bağımlılıkların gereksiz yere eklediği karmaşıklıktan kaçınmak
Buna tamamen katılıyorum. Popüler kütüphaneler çok farklı durumlarda sorun çözdüğü için, çoğu zaman aslında gereksiz yığınla kod da içeriyor. Önemli olan şu: ihtiyaç duyduğum işlevi kısa sürede yazabiliyorsam, kendim yapmak hem kullanılabilirlik açısından daha iyi oluyor hem de bağımlılıkları minimumda tutuyor. Yalnız kriptografi kütüphanelerini asla kendiniz yazmayın
Tekerleği yeniden yapmamın en büyük nedeni bu. Bağımlılıklarla birlikte istemediğim türlü türlü özellik geliyor. Benim ihtiyacım sadece mahalledeki markete gidip gelecek kadar iş görmek. Ayrıca kişisel olarak şeffaf olmayan koda güvenmiyorum. Bir bağımlılık kullanacaksam, benim bir gün ayırıp yazabileceğim ve inceleyebileceğim düzeyde olmalı. Kaynak kodunu göremediğim binary dosyaları, para verip satın almıyorsam kullanmam. Ücretsizse kaynak kodu mutlaka açık olmalı
DAG (yönlendirilmiş çevrimsiz grafik) tabanlı bir task runner kütüphanesini kendim yazdım. Task’ların kuyruklara ait olabilmesini sağladım. Demoyu web tarayıcısında çalıştırmak istediğim için bir IndexedDB backend’i, Electron uygulaması için SQLite, çok kullanıcılı sunucu ortamı için de Postgres backend’i yazdım. Bir de hız sınırlama için limiter ekledim. Bunun dışında grafik işleme, task işleme gibi başka tekerlekleri de yeniden yapmak zorunda kaldım. Hiç bağımlılık kullanmadan yapmak istersen gerçekten yapılacak çok iş var. Yine de task girdi/çıktı şemalarını TypeBox ile tanımlayıp doğruladığım ayrı bir branch tutuyorum. Sonunda çekirdeğe bir bağımlılık daha eklenebilir gibi görünüyor
Bir başka neden de, yeni bir şey icat etme ya da araştırma becerisinin pratikle geliştirilebilmesi. Zaten çözülmüş problemler bile bunun için gayet iyi alıştırma sunuyor
Bazen gereksiz soyutlama veya modülerleştirme gibi karmaşıklıklardan kaçınmak için tekerleği yeniden yapıyorum
Üzerinde düşünmeye değer güzel bir denemeydi. Ben de benzer bir deneyim yaşadım; yalnızca Python ve NumPy kullanarak PyTorch tarzı bir makine öğrenimi kütüphanesini (ml-by-hand) sıfırdan yazdım. Küçük bir autograd motoruyla başladım, sonra katmanları, optimizer’ları, dataloader’ları adım adım kendim uyguladım. Tamamen temel ilkeleri öğrenmek için başlamıştım. Bu kendi yaptığım kütüphaneyle klasik bir convolutional neural network’ten (cnn example) basit bir GPT-2’ye (gpt2 example) kadar çeşitli şeyleri yeniden kurdum. PyTorch veya TensorFlow soyutlamaları olmadan, makine öğreniminin içeride nasıl çalıştığını çok daha iyi anladım. Yani yeniden yaptığım tekerlekle bir de kendi otomobilimi yapmış oldum
“Tekerleği yeniden icat etmeyin” diyen insanların genelde iki gruba ayrıldığı söyleniyor ya, bence aslında üçüncü ve çok daha yaygın bir grup daha var: tekerleği yeniden icat etmenin zorluklarını gerçekten bilen ve o süreçten geçmenin eğitim açısından bile hiç değmeyeceğine karar verenler
Tekerleği yeniden yapmak öğrenmenin en iyi yolu. Ama bence bu sadece öğrenme bağlamında geçerli. Ben de bir şeyin içine derinlemesine dalmayı seviyorum ama iş yerinde teslim tarihleri ve başka kısıtlar yüzünden bunu çoğu zaman özgürce yapamıyorum. Eğer yaptığın tekerleği gerçekten üretimde kullanacaksan, mevcut olandan ciddi biçimde daha iyi olması gerekir
İş yerinde tekerleği yeniden yapanların %99’u, mevcut tekerleğin nasıl yapıldığını ve neden o tür tavizler içerdiğini bile doğru düzgün bilmiyor
Kendin yapmak öğrenmenin en iyi yolu olmak zorunda değil. Zamanı ve maliyeti yüksek. İyi hazırlanmış dokümantasyon ve deney ortamı varsa bunlarla da pekâlâ öğrenebilirsin. Bilgiyi açık biçimde aktarabilmek başlı başına ayrı bir mesele. Her şeyi ille de en dipten yeniden yapmak gerekmiyor
Hükümet sistemlerini küresel ölçekte yeniden uygulamaya yönelik bir deney yapıyorum. Gerçek hükümetlerle aynı şey değil. Örneğin ua.gov-ai.co, ua.ai-gov.co, ng.gov-ai.co, ng.ai-gov.co gibi siteler var. Şu ana kadar en çok ilerleme CBER ve DDP tarafında. Şu an 422 kuruma kadar geldim. Juneteenth’e kadar bitirmek istiyorum. Temelleri bu şekilde yeniden kurmak, temel ilkeleri anlamama yardımcı oluyor. Ortaya somut bir sonuç çıkmayacağını biliyorum ama öz değiştikçe düşüncelerimi yeniden çerçevelemek açısından faydalı oluyor. Tekerleği yeniden yapma deneyi bana göre her zaman anlamlı
Bir startup’ta çalışıyorsan, bence bu tavsiyeyi mümkün olduğunca görmezden gelmelisin. (Yalnız yeniden yaptığın tekerlek hizmetinin temel performans unsuruysa bu ayrı.) Yoksa zaten sınırlı olan kaynakları harcayıp iş daha başlamadan bitebilir
Yine de startup’larda, tekerleği gerçekten yapmayı bilen, yani bunu daha önce deneyimlemiş insanlarla çalışmak önemli. Bu deneyim açık kaynakta ya da kişisel projelerde de olabilir
Bu tavsiye bana daha çok profesyonel işten ziyade, kişisel öğrenme amacıyla yapılan tekerlek deneyleri için söylenmiş gibi geliyor
Bir arkadaşımın sözü aklıma geldi: “Tekerleği yeniden yapmamızın nedeni daha fazla tekerleğe ihtiyaç duymamız değil, daha fazla mucide ihtiyaç duymamızdır.” Yeni kavramları öğrenmek için bir şeyi bizzat yapma süreci bana birçok kez zihinsel ve duygusal bir denge hissi verdi. Feynman’ın “Yapamadığım şeyi anlamış sayılmam” sözünü gördükten sonra bu deneyim ve inanç bende daha da güçlendi. Tekerleği her yeniden yapışımda, ilk kavramlara dair sezgim güçleniyor ve daha önce hiç bilmediğim şeyleri öğreniyorum
Bence çağımızın sorunlarından biri, tekrar ve benzerliği aşırı biçimde dışlamamız. Herkes aynılaşıyor; aynı yemekleri yiyor, benzer işlerde çalışıyor, benzer ihtiyaçlara göre hareket ediyor. “Tekerleği yeniden icat etme” gibi mesajları en uç noktaya götürürsen, sonunda birkaç zengin insanın özel ihtiyaçlarına uyum sağlayan ama aslında hiçbir şey bilmeyen insanlara dönüşmek nihai hedef haline gelebilir. Artık ne yemek yapmayı, ne çiftçiliği, ne de sevmeyi öğrenen bir hayat
Şirket, öğrenmeye gelinen bir yer mi? Yoksa başkalarının yaptığı tekerleği alıp değeri yeniden yaratan bir yer mi?
Bir şey üretmek sadece başlangıç; yaklaşık 10 yıl boyunca bir hizmeti işletirseniz, arada her türden sorun çıkacaktır ve orada ayakta kalabilmek için sağlam bir temel gerekir... öğrenmek lazım.