Öğrenmeyi Öğrenmek | Bölüm 1: Doğru Yöntemler

Bir yazılım veya bilgisayar mühendisi olarak mevcut seviyenizden memnun değilseniz ve kendinizi daha fazla geliştirmek veya yeni şeyler öğrenmek istiyorsanız; ister öğrenci, ister yeni mezun, isterse deneyimli olun, şunu söylemeliyim ki doğru yöntemler izleyerek ve sadece biraz çabayla yapamayacağınız neredeyse hiçbir şey yok gibi.

Kısaca bahsedecek olursam, Ekonomi bölümü mezunu, bilgisayar teknolojileri ile ilgili hiçbir sertifika / kurs vs. almadan, bir diploması bile olmadan sektörde yaklaşık 12 yıldır profesyonel olarak çalışan, öncesinde ise 9–10 yıllık sektörle ilgili bir hobi geçmişine sahip birisiyim. Öğrendiklerimin / bildiklerimin çoğunu sadece kendi çabalarımla ve ihtiyaçlar doğrultusunda edindiğimi ve bunları uygulamaya dökmede hatırı sayılır bir oranda başarılı olduğumu söyleyebilirim. Bu kısa “tıraş” bilgilerden sonra sadede gelecek olursak; çok çeşitli alanlarda, çok sayıda proje ve uygulama geliştirmiş ve geliştirilmesine öncülük etmiş, 30 yaşından sonra elektronik mühendisliğine merak sarmış ve modüler bir otomasyon cihazı ve yazılımı geliştirmiş biri olarak; özellikle elektronik / bilgisayar mühendisliği adayı / mezunu arkadaşlarımızın yeni teknolojileri / yazılım dillerini öğrenirken “nereden başlamalı, kendimizi nasıl geliştirmeliyiz” sorularına tecrübelerim kapsamında cevap vermeye çalışacağım.

Öncelikle ne yapacağınız belli olsun, bir şey yapmayı hayal edin ya da daha önce hayal ettiğiniz şeyi hedef olarak belirleyin. Bir hedef koymadan yapacağınız “yeni öğrenme girişimleri” ‘nin çoğu zaman sadece bir heves olarak başlanmış ama bitirilmemiş çalışmalardan biri olacağını bilin.

Yapmak istediğiniz şeyi belirledikten sonra ne kadar dijital bir çağda yaşıyor olsak da elinize kalem kağıt almaktan çekinmeyin ve mokaplarla uğraşın. Örneğin bir iş uygulaması veya oyun fikriniz varsa, hayalinizdeki hemen hemen tüm ekranları / sahneleri düşünebildiğiniz kadarıyla kabaca resmetmeye çalışın. Bu aşamada detaylı süreç akışı (process flow) ile uğraşmayın, sadece ana fikri ortaya çıkartacak şekilde ana hatları belirleyin, uygulamanın geneli için kritik arzetmeyen detaylara bu aşamada girmeyin.

Ana hatları çıkardıktan sonra eğer bir yazılım projesiyle uğraşacaksanız kendinize bir “tam fonksiyon listesi”, elektronikle ilgili bir projeyle uğraşacaksanız “tam özellikler listesi” çıkartın. Bu listeyi hazırlarken maddeleri “olması gerekenler” (must-to-have) ve “olursa iyi olur” (nice-to-have) şeklinde mutlaka önceliklendirin, adım adım gideceğiniz yol haritanızı belirleyin.

İster bir yazılım dili olsun isterse elektronik tasarım vs. konularda tasarım / simülasyon gibi şeylerle uğraşacak olun, öncelikle öğrenmek istediğiniz şeyle ilgili gerekli ön koşulları ve gerekli araçları araştırın, gerekli uygulamaları edinerek çalışma ortamınızın eksiksiz olduğundan emin olun. Elektronikle uğraşıyorsanız araç gereç anlamında en azından minimal imkanlara sahip olun. Ortamla ilgili tercihlerinizi yaparken amacınıza yönelik en uygun işletim sistemi (Windows, Linux, vs) ve en iyi geliştirim ortamı (IDE, Integrated Development Environment) veya araç gereç seçeneklerini eksileriyle artılarıyla iyi değerlendirin, konuyla ilgili daha önceki tecrübeleri okuyun / araştırın, kesinlikle erinmeyin.

Ortamı hazırladıktan sonra kullanacağınız araçlara başlangıçta zorlanmadan çalışmanızı ilerletmenize imkan verecek kadar kurcalamanız ve temel seviyede hakim olmanız, gereksiz zaman kayıplarının önüne geçmenizi ve odağınızın stabil kalmasını kolaylaştıracaktır. Ayrıca örneğin Python gibi bir dil öğrenmeye çalışıyorsanız, bu dille ilgili “indentation” (girinti) ve “interpreter” (yorumlayıcı) kavramları hakkında ön bilgi edinin.

Hayaliniz kafanızda, direksiyon önünüzde, şimdi yola çıkmadan önce lazım olacak temel ve hayati şeyleri öğrenin. Yeni bir yazılım dili öğreniyorsanız en temel ihtiyaçlar olan class, değişken ve fonksiyon tanımları, tip dönüşümleri, diziler gibi en temel şeylerle ilgili deneme sürüşleri yapın. Genel bir el alışkanlığından sonra projeye yönelik can alıcı noktalarla ilgili sadece PoC (proof-of-concept) anlamında test sürüşüne devam edin ve tercih ettiğiniz aracın / dilin yeterlilik anlamında gerçekten amacınıza uygun olup olmadığını görün.

Seçtiğiniz dilin / aracın amacınıza uygun olduğundan eminseniz yol haritanızı önünüze alıp bir zaman ve iş planı yapın. Bu zaman planını yaparken gerekirse uzun sürecek bazı işleri alt işlere bölün, aşama aşama ilerleyin. Eğer kapsamlı bir projeniz yoksa ve sadece örnek bir çalışma üzerinde uğraşıyorsanız her hedefi gerçekleştirdikten sonra bir sonraki seviye için daha zor bir hedef seçin.

Hayalinizdeki asıl amaca yönelik olarak koyacağınız sıradaki her yeni hedefin, günün sonunda daha önce gerçekleştirdiğiniz hedeflerle örtüşen hedefler olmasına dikkat edin. Birer birer gerçekleştirdiğiniz hedeflerin sonuçlarını bir araya getirdiğinizde büyük resim konusunda ne kadar ilerlediğinizi görme şansınız olacak.

Bir şey yapmaya çalışırken bazen amacınızın çok dışına istemsiz olarak çıkıyor olabilirsiniz. Örneğin; bir web sitesi yapmaya çalışırken TCP protokolünün nasıl çalıştığı konusuna derinlemesine inmeniz, sizi konudan ve amacınızdan epeyce uzaklaştıracaktır. Benzer şekilde 7/24 uyanık kalacak bir cihaz üzerinde çalışırken “uyku modu” konusunda denemeler yapıp önlemler almanız o çalışma için sadece zaman kaybı olacaktır.

Elbette öğreneceğiniz her bir bilgi sizin için bir artı, ancak önceliklerinizi unutmayın, ilginizi çeken diğer konuları bir kenara not edip ayrıca bir zamanda detaylı olarak öğrenin.

Temelleri iyi atmazsanız projeniz bir noktada mutlaka yıkılmaya yüz tutacaktır, o yüzden her zaman resmin büyüğünü görmeye çalışarak hareket edin, öngörülü ve proaktif olmaya çalışın. Temeli iyi atın, sonra taşıyıcı kolonları inşa edin, sonra duvarları.. İnce işleri en sona bırakın, işin makyaj kısmı genelde en karar verilemez ve en oyalayıcı aşamalardan biridir.

Yürümeye çalıştığımız zamanları neredeyse hiçbirimiz hatırlamıyoruz ama dengeli bir yürüme öncesi defalarca düşmeden yürümeyi öğrenmek neredeyse imkansız. Yeni öğrenilen şeylerde ilk birkaç başarısız deneme sonrası vazgeçme eğiliminin oldukça yüksek olduğunu, vazgeçmediğiniz taktirde kritik eşiği atlattıktan sonra gerisinin çorap söküğü gibi geleceğini unutmayın.

Bildiğiniz bir konu olsa dahi öğrenmeye çalıştığınız şey hakkındaki en iyi tecrübeler (best practices) ‘den faydalanmaya çalışın. Teknik bir öğrenme sürecinden bahsettiğimiz için Google ve öğrendiğiniz şeyin dokümantasyonu en iyi arkadaşınız olacak.

Şu anki imkanlar çerçevesinde dokümantasyon, topluluk ve Google varken, aradığınız bilgi askeri düzeyde önem arz eden bilimsel bir bilgi olmadığı sürece bulamamanız çok zor. Hatta artık öyle bir noktaya geldik ki, karşılaştığınız hatayı Google ‘a yazdığınızda StackOverflow gibi yerlerde birileri mutlaka sormuş oluyor.

Her ne yapıyorsanız, ne yaptığınız şeye çok fazla özenerek gereksiz zaman kaybedin, ne de işi sevginizi katmadığınız tatsız bir yemeğe dönüştürün. Günlük hayatın koşuşturması içerisinde öğrenmeyi amaçladığınız şey için ayırdığınız vakti en iyi şekilde kullanmaya çalışın: Mükemmel olmasa da bir gün lazım olduğunda referans olarak gösterebileceğiniz bir iş çıkartın. Aksi halde hedeflediğiniz şeyin aşamalarının çoğunun hala yapılmayı bekliyor olması zaman içerisinde çabucak sıkılmanıza neden olacak ve bilin bakalım ne olacak..

Burada 1 ve 0 ‘lardan bahsediyorsak; 1, 0 ‘dan iyidir.

Göstermelik değil, işe yarar bir şeyler yapın ve düzgün çalıştığından emin olun.

Ben bu işi biliyorum dediğiniz vakit, genelde artık o konuda yeni şeyler öğrenmeyi bıraktığınız, diğer bir deyişle düşüşe geçeceğiniz vakittir. Bildiklerinize her zaman yenisini katmayıp ara sıra eski tecrübelerinizi tekrar tekrar pratiğe dökmediğinizde kısa sürede köreleceğinizi unutmayın.

Yazılım dillerinin geçmişini ve zaman içerisindeki popülerliğini merak edenler için bir de güzel video var:

Meraklısı olanlar yazıyla ilgili gerçek bir hikayeye buradan ulaşabilirler.

Hoşçakalın.

İstanbul‘da bir Yazılım ve Teknoloji Ar-Ge Mühendisi. Ürün, yazılım, sistem analisti ve tasarımcısı. http://www.zaferaltun.com/

İstanbul‘da bir Yazılım ve Teknoloji Ar-Ge Mühendisi. Ürün, yazılım, sistem analisti ve tasarımcısı. http://www.zaferaltun.com/