İyi Bir Mühendis Olmak
(0x0001.cc)- Birçok yazılım mühendisi yazılıma karşı tutku duymadan çalışıyor
- Sadece iyi maaş almak için çalışıyorlar, ancak tutku yoksa sonunda performans düşüyor
- Eski teknolojilere ve yanlış inançlara saplanıp kalıp öğrenmezseniz gelişemezsiniz
- İyi bir mühendis olmak için gereken unsurlar
- Mühendisliğin özünü anlamak ve derinlemesine bilgi birikimi oluşturmak gerekir
- Yeni teknolojileri sürekli öğrenmek ve eleştirel yaklaşmak gerekir
- Sahada öğrenilen bilgiyi uygulama ve iyileştirme alışkanlığı gerekir
# İyi bir mühendisi ne oluşturur
- Mühendisin tanımı
"Bilimsel ilkeleri uygulayarak problemleri analiz eden ve tasarım, kod yazma, üretim, yaratım gibi yollarla sorunları çözüp dünyayı daha iyi bir yer haline getiren kişi"
- Yazılım mühendisinden beklenen yetkinlikler
- Bilgisayarın nasıl çalıştığının ilkelerini anlamak gerekir
- Donanım ile yazılımın nasıl etkileştiğine dair derin bir anlayış gerekir
- Yalnızca soyutlanmış dillere veya teknolojilere güvenmeden temelden öğrenmek gerekir
Alan hakkında derin bir anlayış
- Temel ilkelere dair güçlü bir anlayış gerekir
- Makine mühendisi → malzemelerin özellikleri ve uygulamaları hakkında bilgi
- Yazılım mühendisi → bellek ve CPU'nun çalışma prensiplerini anlama
- Temel ilkelerden başlayarak öğrenmek gerekir
- HTTP, bellek yapısı, sistem davranışı gibi temel kavramların derinlemesine anlaşılması şarttır
- Üst seviyeden başlamayın, temelden inşa edin
Sürekli öğrenme
- En yeni teknolojileri ve geliştirme eğilimlerini sürekli öğrenmek gerekir
- Yeni teknolojilerin avantaj ve dezavantajlarını eleştirel biçimde analiz etmek gerekir
- Öğrenme sürecinde keşfedilen yeni konulara daha derinlemesine dalın
- Matematik öğrenirken alt başlıklara bağlanılması gibi, öğrenmenin derinliği genişletilmelidir
Teknolojinin sınırlarını ve sorunlarını anlamak
- Araçların veya dillerin artılarını ve eksilerini net biçimde anlamak gerekir
- Belirli bir dil ya da araca aşırı bağlılık geliştirme tutumuna karşı dikkatli olunmalıdır
- Projeye uygun en iyi aracı seçmek önemlidir
Bilgiyi pratikte uygulamak
- Sadece teoriyi bilmenin bir anlamı yoktur
- Öğrenilen bilgiyi gerçek projelere uygulamak gerekir
- Sorun çözmek veya bir kavramı kanıtlamak için kullanılmalıdır
- Pratik uygulama örnekleri
- Küçük ölçekli prototip oluşturma
- Günlük hayatta ortaya çıkan sorunları çözme
- Öğrenilenleri başkalarına açıklama ve öğretme
# Daha iyi bir mühendis olmanın yolları
Eleştirel düşünme becerisini geliştirmek
- Eleştirel düşünme, mühendisliğin temel unsurlarından biridir
- Kavramları ve etkilerini anlamak ve sorgulamak için gereklidir
- Eleştirel düşünmenin eksikliği veya ihmal edilmesi verimsizlik ve karmaşıklığa yol açar
- Eleştirel düşünme becerisini güçlendirmek
- Yeni bir kavramla karşılaşıldığında onu koşulsuz kabul etmek yerine etkinliğini ve geçerliliğini incelemek gerekir
- Belirli bir yaklaşımın artılarını, eksilerini ve alternatiflerini mantıksal olarak analiz etmek gerekir
- Eleştirel düşünme için öğrenme kaynağı: Critical Thinking
Daha fazla kitap okumak
- Okuma, bilgi edinmenin etkili bir yoludur
- Yazılım mühendisliğiyle ilgili çeşitli konularda kitaplar vardır
- Kitaptaki içeriği sadece kabul etmeyin, eleştirel yaklaşın
- Eleştirel okumak için örnek sorular
- "Bu yaklaşımda bir sorun var mı?"
- "Daha iyi bir yöntem var mı?"
- "Ben farklı yapacak olsam nasıl yapardım?"
- "Bu kitapta anlatılanlar gerçekten doğru mu?"
- Not alma alışkanlığı geliştirmek
- Öğrendiklerinizi ve düşüncelerinizi düzenleyip kaydedin
- Bilinmeyen bir konu geçerse ek araştırma yapın
- Not alma aracı olarak Obsidian önerilir (kişisel tercihe göre değişebilir)
- Önerilen okuma listesi
Öğrenilen bilgiyi projelere uygulamak
- Teoriden pratiğe geçmek
- Öğrenilenleri gerçek projelerde uygulamak, gerçek öğrenmenin gerçekleşmesini sağlar
- Kavramları bizzat uygulayarak daha derin bir anlayış kazanılabilir
- Küçük proje veya prototipler bile olsa doğrudan yapmak önemlidir
- Pratik uygulama sürecinde elde edilen faydalar
- Teoride görünmeyen gerçek sorunlarla karşılaşılır
- Sorun çözme sürecinde bilgi somutlaştırılabilir ve geliştirilebilir
- Sorun çözme becerisi ve mantıksal düşünme güçlenir
- Öğrenilenleri uygulama yolları
- Küçük prototipler oluşturmak
- Yeni bir framework, dil veya kavram öğrendikten sonra küçük bir proje deneyin
- Örnek: Veritabanı indekslemeyi öğrendikten sonra basit bir arama sistemi kurup performansı karşılaştırmak
- Gerçek sorunları çözmek
- Günlük yaşamda veya işte ortaya çıkan küçük sorunları çözmeyi deneyin
- Örnek: Tekrarlayan manuel işleri otomatikleştirmek, performans düşüşü sorunlarını iyileştirmek
- Öğrenilenleri öğretmek
- Öğrendiklerinizi başkalarına açıklayarak anlayışınızı güçlendirin
- Blog yazmak, Twitter flood'u yazmak veya iş arkadaşlarıyla tartışmak
- Öğretme sürecinde yeni bakış açıları keşfedilebilir
- Bilgiyi sürekli uygularsanız, teorik anlayış pratik yetkinliğe dönüşür ve daha yetkin bir mühendis olarak gelişebilirsiniz
Kendi kodunu değerlendirmek ve iyileştirmek
- Öz eleştiri, üstün mühendislerin temel alışkanlıklarından biridir
- Birçok mühendis kod çalışıyorsa bunun "yeterli" olduğunu düşünme hatasına düşer
- Ancak gerçek mühendis, her zaman iyileştirme alanı olduğunu kabul eder
- Öz değerlendirmenin hedefi
- Kendinize aşırı sert olmanız gerekmez
- Esas olan, sürekli iyileştirme fırsatları bulmaktır
- Kodun sadece çalışmasıyla yetinmeyin; performans, bakım yapılabilirlik ve okunabilirliği nasıl geliştirebileceğinizi araştırın
- Sürekli öz değerlendirmenin etkileri
- Kod kalitesi kademeli olarak artar
- Öz eleştiri yoluyla sorun çözme becerisi güçlenir
- Kendi bilgi ve yetkinlikleriniz açısından sürekli gelişebilirsiniz
# Yazılım mühendisleri için öneri listesi
Önerilen kitaplar
- Designing Data-Intensive Applications – veri yoğun uygulama tasarımı
- Introduction to Algorithms –
- Writing a C Compiler
- Essential Maths for Data Science – geliştiriciler için temel matematik
- Elements of Information Theory
Önerilen projeler
- Compiler - seçtiğiniz dil için bir compiler yazmayı deneyin, LLVM veya JVM'e bakın
- Emulator - basit bir CPU (ör. 8086) emulator'ü yazın
- Render engine / game engine - OpenGL veya Vulkan kullanarak bir grafik programı yazın
- Bellek görüntüleyici ve düzenleyici yazmak - başka programların belleğiyle etkileşime giren bir program yazın
- HTTP sunucusu yazmak - düşük seviyeli bir dille HTTP sunucusu yazın
- Web sitelerinden veya basit projelerden kaçının. Öğrenme etkisi düşük olabilir. Yukarıda belirtilen projelerden birini seçin, konuyu araştırın ve kendiniz uygulayın
Sonuç
- İyi bir mühendis olmak, çok sayıda programlama dili bilmek demek değildir
- Temel ilkelerin derinlemesine anlaşılması + eleştirel düşünme + pratik uygulama esastır
- Öğrenen, uygulayan ve durmadan iyileştiren bir tutum gerekir
- Mühendislik sonu olmayan bir yolculuktur; gelişme isteği önemlidir
Sonuç
- İyi bir mühendis olmanın özü
- En fazla programlama dilini bilmek, en yeni framework'leri ustalıkla kullanmak veya yeni teknolojilerin peşinden koşmak değildir
- Mühendisliğin temel ilkelerine dair derin bir anlayış esastır
- Öğrenilen bilgiyi gerçek projelere uygulamak, eleştirel düşünmek ve sürekli gelişmek gerekir
- En iyi mühendislerin özellikleri
- Öğrenmeyi bırakmaz ve yeni bilgiler edinirler
- Kendi varsayımlarını sürekli sorgular ve iyileştirme yolları ararlar
- Öğrendikleri bilgiyi gerçek sorunların çözümüne uygular, ekip arkadaşlarıyla iş birliği yaparak gelişirler
- Mühendislik ömür boyu süren bir yolculuktur
- Merak (curiosity), disiplin (discipline) ve gelişme iradesi gerekir
- Bu ilkeleri uygularsanız, iyi bir mühendisin ötesine geçip harika bir mühendis olabilirsiniz
9 yorum
Linux çekirdeğinin bellek yönetimi tarafına da katkıda bulundum ve düşük seviyeli çalışma biçimi hakkında belli ölçüde anlayışım olduğunu düşünüyorum; ama sonuçta istemeden de olsa geliştirmeden uzak işlerle uğraştığımı görünce, galiba bu yazının tersine davranmak başarılı bir mühendis olmanın yolu diye düşünüyorum.
Ülkeme dönünce gördüm ki Kore'de pazar çok küçük ve rekabet çok yoğun; bu yüzden geliştirmeye odaklanabileceğin şirket ya da pozisyon az, o az sayıdaki yeri de herkes kapmaya çalıştığı için sonunda gerçekten yapmak istediğin geliştirmeyi yapabilmek adına göz önünde olan şeylere odaklanmak gerekiyor gibi görünüyor.
Ben de katılıyorum! Ayrıca burada kastedilen 'iyi' mühendisin nasıl bir mühendis olduğu konusunda insanların yorumları çok farklı gibi görünüyor. Uç bir örnek olabilir ama temel bilginin önemini bilse bile piyasada değeri olmayan bir mühendisin iyi bir mühendis olup olmadığını düşündürüyor.
Gerçekten çok katılıyorum,,,
İşin özü olan şeyleri ne kadar doğru kavrayıp iyi ele aldığının oyunu değil de
belirli bir dil ve belirli teknolojilerle ilgili şeyleri trendlere uygun biçimde ne kadar iyi kullandığının oyunu olması üzücü,,
Türkiye’de de iyi mühendislerin çok olduğunu düşünüyorum, ancak pazarın büyüklüğü nedeniyle benim de hayıflandığım birçok nokta var.
FuriosaAI gibi yerlerin başarılı olmasını isterdim diye düşünüyorum.
FuriosaAI battı mı...?
Biraz katılıyorum.. haha
Sadece Kore pazarı mı böyle acaba...
Bir süre önce şirkette Kotlin dili çalışması için bir seminer vermiştim; bunu bölümde ağırlıklı olarak kullanılan C++ diliyle karşılaştırarak anlatınca iyi tepki aldığını hatırlıyorum. Aslında ben C++'ı neredeyse hiç kullanmıyordum ve ekiptekiler de Kotlin'le ilk kez karşılaşıyordu, ama her açıdan hepimizin gelişimine yardımcı olmuş gibiydi.
Hacker News görüşü
Kitap okuma hakkındaki görüş çok hoşuma gitti. Birçok mühendisin dokümanlar ve kitaplar yerine videoları ve yüzeysel gönderileri tercih ederken çok şeyi kaçırdığını sık sık görüyorum
Bu yazıda belirtilen birçok noktaya katılıyorum. Ancak CPU, bellek, HTTP gibi derin temelleri bilmenin nasıl daha iyi bir mühendis olmaya yardımcı olduğundan emin değilim
Derin temellere kadar bilmiyorum ama temel bilinmediğinde gerçekten saçma ve akıl almaz sonuçlar ortaya çıktığını gördüm.
Örneğin DB'deki tüm kayıtları belleğe alıp sonra bellekte arama yapacak şekilde implement etmek.
Kayıt az olduğunda iyi çalışıyor ama kayıt çoğalınca bellek patlıyor.
Bellek ile DB'nin nasıl farklı olduğunu hiç bilmediği için böyle yazıyorlar.
Bu sadece bir örnek; her seferinde gerçekten hayal bile edilemeyecek yönlerde implement ediyorlar.
Sıradan(?) bir programcı bunu gerçekten hayal edemez.