Yazılımda Başlamak ve Gelişmek

Bilgem Cakir
Feb 28 · 10 min read

En çok karşılaştığım iki soru, “yazılıma nasıl başlarım” ve “yazılım konusunda nasıl gelişebilirim” soruları. Bunlara insanların duymak istediği türde bir cevap vermekte hep zorlandım. Ama on beş seneden sonra, yalnız yazılım değil herhangi bir yetiyi başarıyla edinenlerin uyguladığı ortak davranışları, derli toplu bir şekilde sunan, bütünsel, uygulanabilir ve en önemlisi beni tatmin eden bir cevaba sonunda ulaştım. Bir yetiyi edinmeye nasıl başlanır, o yetide nasıl gelişilir, şimdi naçizane fikirlerimi paylaşacağım.

Bu soruyu soran insanların çoğu iki temel varsayım yapıyor.

Birincisi şu: Umuyorlar ki, bu soruya birisi bir grup kitabı veya videoyu işaret ederek cevap verecek. Onlar da bu kitapları okuyup, o videoları seyrederlerse o yetiyi edinmiş olacaklar.

İkincisi ise şu: “Yeti” ile “bilgiyi” aynı şey zannediyorlar.

Bu iki varsayım da yanlış. Ama önemli olan ikincisi. Yeti ve Bilgi aynı şey değil.

Özellikle fiziksel bir yönü olmayan dallarda, yani atletik performans veya el becerisi gerektirmeyen, sadece düşünsel olarak uygulanan aktivitelerde, yeti ile bilgiyi birbirine karıştırmak daha da kolay.

Bu iki varsayımı şimdilik kafanızdan çıkarıp bir kenara koyun. Birazdan söyleyeceklerim başta biraz dolambaçlı gelebilir. Lütfen dayanın, gerçekten faydalı bir şekilde binayı inşa edebilmemiz için önce arsayı temizlememiz, sonra da olması gerektiği şekilde temeli atmamız gerekiyor. İşte önce bu iki yanlış varsayımı konuşarak arsayı temizledik. Şimdi gerçekten temelden başlıyoruz.

Birinci anlamamız gereken şey şu. Mesela yazılım dalında, başlamak veya gelişmekten bahsederken aslında en temel seviyede bahsettiğimiz konu yazılım değil öğrenme. Biz aslında öğrenmeden bahsediyoruz.

Odaklanmamız gereken kavramın öğrenme olduğunu anlamanın önemi var. Çünkü bunu anladığımız zaman aslında öğrenme konusunda hali hazırda bildiklerimiz ve tecrübelerimiz ışığında bazı yaklaşımları ve beklentileri daha iyi ayarlamak mümkün.

Şimdi sırasıyla bir grup soyut kavramı konuşacağız ve işimizi kolaylaştırmak için de bir metafor/benzetme inşa edeceğiz.

Olgu

Bilgi, evrendeki soyut veya somut bir olguyu beynimiz içinde anlamaktır. Yani dış dünyada olan bir gerçekliğin kafamızdaki anlamsal karşılığıdır. Bakın Türkçe’mizin çok güzel ifade edebildiği bir ilişki bu. Olgu ve bilgi kelimelerinin ortaya çıkışı ile temsil ettikleri kavramların ilişkisi ne kadar güzel yansıtılmış.

“İki artı ikinin dört etmesi” evrende var olan bir olgudur. Biz bu olguyu anladığımızda kafamızda yer tutan şey bilgidir.

Evrende olgular arasında anlamlı ilişkiler vardır. Mesela “dört eksi ikinin iki etmesi” ile “iki artı ikinin dört etmesi” arasında bir ilişki vardır. Olgular arasındaki bu ilişkiler sonsuz çeşitli anlamlar barındırabilir. “Sebep-sonuç”, “Bütün-parça”, “Önceki-sonraki”, “eşitlik”, “denklik”, “benzerlik”, “zıtlık”, “büyük-küçük” bu sonsuz anlam kümesinden birkaç örnek.

Evrendeki irili ufaklı olguları ve aralarındaki bu ilişkileri düşündüğümüzde aslında evrenin soyut ve somut olgular coğrafyası olduğunu düşünebiliriz. İşte metaforu inşa etmeye başlıyoruz. Soyut ve somut olguların ve aralarındaki ilişkilerin oluşturduğu bir olgular ağını, dağlar, ovalar, dereler, göller, ormanlar, çöller, düzlükler ve kayalıklar barındıran bir coğrafyaya benzetiyoruz.

Problemler

Peki problem ne demek? Problem bu olgular coğrafyasında bize verilen bir çift noktadır. A ve B noktaları. Coğrafya üzerinde “Şuradaki A noktasından başla, B noktasına ulaş” dediğimizde bir problem tanımlamış oluruz.

Örnek olarak matematikteki ispatları veya çıkarımları hatırlayın. Mesela cos(a+b) formülünün çıkarımı. Bu örnekte A noktasında kosinüs ve sinüs olguları var. B noktasında ise cos(a+b)’nin açılımı olgusu var. Bu iki nokta, aslında başka bir takım trigonometrik, aritmetik ve geometrik olgular ile dolaylı olarak birbirine bağlı. Yani buradaki problemi çözmek demek, A noktasından yola çıkıp, A ve B noktalarını bağlayan olguları ve ilişkileri takip ederek bir patika bulmak, ve o patikadan yürüyüp B noktasına varabilmek demek.

Bu metaforda problemin zorluğunu neler etkiliyor? Coğrafya çetin bir coğrafya olabilir veya düz bir ova olabilir. A ve B birbirine yakın veya uzak olabilir. A ve B arasındaki patikada aşılması zor engeller olabilir. Belki çok zorlu bir kayalık tırmanmak, belki de bir su altı mağarasından geçmek gerekiyordur.

Olgulardan ve problemlerden bahsettik. Şimdi bilgiden bahsedip metaforumuza ekleyelim.

Bilgi

Bu coğrafyanın çok küçük bir bölgesine çalışıp, orayı ortaya çıkaran olguları ve ilişkileri kafamızda inşa edebilirsek “bilgi” sahibi olmuş oluruz. Başka bir deyişle bilgi olgular coğrafyasının küçük bir bölgesinin kafamızdaki “haritasıdır”.

Olguları coğrafyaya, bilgileri ise haritaya benzetmek, basitleştirilmiş bir metafor olmakla birlikte göreceksiniz getirdiği sadeleştirme sayesinde faydalı bir araç olacak.

Tekrar dikkat çekmek istiyorum. Bilgi, kafamızdaki bir olgu listesi değildir. Olgular arasındaki ilişkileri anlamayı da kapsar. Bir bölgenin haritasını çıkarırken yalnızca bölgedeki yer şekillerini veya binaları listelemeyiz. Onların birbirleri ile olan ilişkilerini de kullanmazsak harita ortaya çıkmaz. Dağ gölün kuzeyinde kalıyor. Dağın yamaçlarında orman var. Ormanın içinden akan dere gölü besliyor. Bunlar haritayı ortaya çıkaran ilişkilere örnektir.

Bu noktaya kadar gösterdiğiniz sabır için teşekkürler. Olgu, problem ve bilgi arasındaki ilişkileri irdeledik ve metaforumuza oturttuk. Olgular ağına coğrafya, probleme A ve B noktaları, bilgiye de harita dedik.

Şimdi yeti kavramını konuşmaya ve bilgi ile neden aynı şey olmadığını tartışmaya hazırız.

Yeti

Bilgi haritadır demiştik. Yeti ise elimizde o haritayla o coğrafyaya gerçekten gidip, verilen bir problemi çözmek için A noktasından başlayıp, B noktasını hedef alıp, yolunuzu bulabilmek ve B’ye varabilmektir. Yani yeti, bilgiyi kullanarak bizzat problem çözebilmektir.

Bakın bu noktaya çok dikkat edin.

Gerçek dünyada “etki sahibi olmak”, kalıcılığı ve anlamı olan bir değişiklik yaratmak, sadece olgu coğrafyasında bir noktadan başka bir noktaya bizzat yürüdüğümüzde gerçekleşir.

Demin bu metaforda problemin zorluğunu nelerin etkilediğini sıralamıştık. Şimdi ilgili bir soru ile devam edelim. Bizim bir problemi çözüp çözemeyeceğimizi neler etkiliyor?

Elbette önce problemin zorluğu (yani coğrafyanın çetinliği, B’nin A’ya uzaklığı, aradaki engeller vs). Ama bir o kadar etken bizimle ilgi faktörler de var. Örneğin elimizde coğrafyanın haritası olabilir veya olmayabilir. Biz harita kullanmakta iyi olabiliriz veya olmayabiliriz. Fiziksel olarak bu yolculuğu yapacak sağlığa veya araç ve ekipmanlara sahip olabiliriz veya olmayabiliriz. Yalnız olabiliriz, yanımızda başka yolu bilmeyenler olabilir, veya coğrafyaya çok hakim, buna çok benzeyen patikalardan daha önce gitmiş başka rehberler olabilir.

İşte problem çözmeyi kolay veya zor kılan şeylerin bir bölümü alandan (yani olgular coğrafyasından), bir bölümü problem tanımından (yani A ve B’nin birbirine göre konumundan), bir bölümü bilgi kaynaklarımızdan (haritamız olup olmadığı), bir bölümü yetilerimizden (harita kullanma becerimizden, sağlığımızdan, araçlarımızdan) ve bir bölümü de kimlerle birlikte yolculuk ettiğimizden gelir.

İşte yeti bilgiden bu yüzden farklı. Yol bulmak ve kat etmek, harita sahibi olmaktan farklı.

Sizi bir ormanın ortasına A noktasına bıraktığımızı düşünün. Sağınız solunuzda ağaçlar var. Kafanızı kaldırınca gökyüzünü görebiliyorsunuz. Uzaklardan bir su sesi geliyor. Ağaçlardan birinin dibinde bir mantar var. Cebinizde de harita var.

İşte bu noktada, algılarınızı ve bazı bilgilerinizi kullanarak olduğunuz noktayı anlamazsanız ve yönleri doğru tayin etmezseniz haritanın size hiçbir faydası yok. Örneğin belki geceyi bekleyip kutup yıldızını bularak yönünüzü bulacaksınız. Belki ağaç gövdelerindeki yosunlardan kuzeyi bulacaksınız. Belki önce su sesine ilerleyip bir dereyi bulacaksınız ve akış yönünde takip edeceksiniz. Belki zaman zaman yanlış yöne gideceksiniz ve bir süre sonra bunu düzeltebilmeniz ve geri doğru yola dönebilmeniz lazım. Belki karşınıza tırmanmanız gereken bir kayalık, veya kontrollü şekilde inmeniz gereken bir yamaç çıkacak, bu teknik tırmanışları uygulayacak tecrübe, araçlar veya güce sahip misiniz. İşte bütün bunları yapabilmeniz “yetiye” sahip olmak demek. Harita elbette önemli ama yeterli değil.

Şimdi en baştaki iki soruya dönelim ve bu soruları yeniden anlamlandıralım:

Yazılıma Başlamak

Bunu soran kişi aslında farkında olarak veya olmayarak şunu söylüyor. “Ben yazılım ve ilgili konuların, yer yer düzlük yer yer çetin engellerle dolu coğrafyasında, verilen her türlü farklı farklı A ve B noktaları için, A’dan başlayıp, yolu bulup, engelleri aşıp, B’ye varabilen bir izci olmak istiyorum.”

Rol modelimiz: Yolgezer

Nasıl başlarım diye soranlar, sanıyor ki bu coğrafyanın komple bir haritası var. Ayrıca bu coğrafyada hareket etmeyi kolaylaştıran bir grup ayakkabı, kıyafet, alet, edevat listesi var. Umuyorlar ki cevaplayan kişi onlara diyecek ki “kardeşim bak al bu harita, bu da ekipman listesi, bunları al, yolun açık olsun”

Nasıl gelişirim diye soranlar ise biraz daha farklı. Onlar şu an zaten coğrafyadalar. Belki bir iki kere B noktasına varamamışlar, ya da yakın görünen B noktaları, yürümeye kalkınca canlarına okumuş. Ellerinde harita olmadığının veya olan küçük krokilerin yarattığı problemlerin fazlasıyla farkındalar. Tamamının olmasa bile coğrafyanın şu anda oldukları bölümlerinin daha iyi krokileri var mı merak ediyorlar. Kullandıkları ayakkabıların ayaklarını vurmayan daha iyi modelleri var mı merak ediyorlar.

İşte olgu, bilgi, yeti ilişkilerini, biraz daha detaylı şekilde, coğrafya, harita ve yol bulma benzetmesi ile irdeledikten sonra bu iki soruya verilecek cevapların kafamızda şekillenmeye başladığını fark ediyoruz.

Öncelikle bu noktada anladığınız üzere yazılımla ilgili olgular coğrafyasının komple ve güvenilir bir haritası yok. Bazı bölgeleri iyi biliyoruz, bazı yerlere uzaktan bakıp tahmin yürütebiliyoruz. Bazı bölgelere ise daha önce giden bile olmamış.

Bildiğimiz yerleri gösteren haritaların bir kısmı bir süredir değişmemiş. Onlara güvenimiz biraz daha yüksek. Bazı bölgelere az kişi ulaşmış onların bazı paylaştığı krokiler var. Ama o krokilerle yola çıkan nice başkaları haşat olmuş.

Yani bütün haritalarda farklı miktarda hata payı var. Bazı yerlerin hiç haritası yok. Kullanılan ekipmanlarda da iyi çalıştığını düşündüklerimiz, kötü çalıştığını düşündüklerimiz, iyi mi kötü mü olduğunda tam uzlaşamadıklarımız var.

İşte yazılım coğrafyasındaki durum bu. Bu coğrafyada izcilik yapacaksanız, neyle karşı karşıya olduğunuzu bilerek başlamak lazım.

Coğrafyanın, elimizdeki araçların ve haritaların hali buyken burada başarı ile izcilik yapmak için, veya başka bir deyişle bu coğrafyada hangi A noktasından başlarsanız başlayın, hangi B noktasını hedeflerseniz hedefleyin, yolunuzu bulabilmek ve o yolu kat edebilmek için sürekli bir tandem halinde yapmamız gereken üç şey var:

1. Akademik öğrenme ile “hayatta kalma” ve “hareket edebilme” yeti ve araçlarını kazanmak

2. Proje tabanlı öğrenme ile tecrübe kazanmak, bol bol değişik A ve B noktaları arasında yürümek

3. Ekosistemle sosyal olarak kaynaşmak, gruplar halinde yürümek, başkalarının yolculuklarda öğrendiklerini ve haritalarını çalışmak, kendi çıkardığın yeni haritaları, yeni ekipmanı paylaşmak, yardımlaşmak ve hatta bazen yarışmak.

Yazılım gibi bir konuda iş yapabilmemiz için oturup çeşitli kaynaklardan sistematik bir şekilde çalışmamız gereken bazı bilgiler var. Mesela bilgisayar bilimlerinin temelleri, algoritmalar, veri yapıları, kullandığımız süreçler, tasarım paradigmaları, diller, kütüphaneler veya daha temeldeki matematik veya platform bilgisi gibi kavramlar hakkında hiçbir yatırım yapmadan kendini ormana atmak bana göre verimsiz. İşte bu akademik öğrenme.

Öte yandan hakikaten sadece proje yaparken öğreneceğiniz şeyler var. A ve B arasındaki patikanın karşınıza çıkaracağı şeylerden bazılarını hiçbir kitapta bulamayacaksınız. Ve daha önemlisi oradaki bazı hisleri deneyimlemek. Karanlık bir ormanın karşısında dururken yaşadığınız korkunun normal olduğunu bilmek, önlemleri alıp yine de ilerlemek, veya zor bir kayalığa tırmanmanın nasıl bir odak ve disiplin gerektirdiğini yaşamışlık. Bu benzetmelerin, yazılım projenizde bir Perşembe akşamı, 12 saat uğraşıdan sonra bir bug’ı hala çözememiş olarak başından kalkarken hissedeceklerinizden ve bir uyuyup uyanıp ertesi sabah çözebilecek temellere sahip olduğunuza inanmışlık halinden farkı yok.

Bu yolculuklar kariyerimizde hangi noktada olursak olalım karşımıza engeller ve tehlikeler çıkarıyor ve hep çıkaracak. Bu tehlikelerle karşılaşmamanın tek yolu coğrafyada bilmediğiniz yerlere hiç gitmemek olurdu. Ama o stratejinin de kazanımı çok çok az. O yüzden, kaygı, stres, ve yer yer başarısızlık aslında coğrafyada değeri olan, hazineler barındıran B noktalarına gitmeye çalışıyorsunuz demek. Bunun normal olduğunu bilip o anlarda pes etmeyecek psikolojiye ve teknik alt yapıya sahip olabilmenin tek yolu bu yollardan defalarca geçmek.

Üçüncü olarak da sosyalleşmek ve bir ağın parçası olmak. Yardımlaşmak, yarışmak, öğrenmek ve öğretmek. Bu sosyalleşme günümüzde meetuplarla veya çeşitli daha büyük yazılım etkinlikleri ile bu kadar kolaylaşmışken, bu sosyalleşmenin getirilerinden faydalanmamak büyük hata.

Hatırlayın en başta aslında bahsettiğimiz şeyin yazılım olmadığını öğrenme olduğunu söylemiştim. Ve bunu fark etmenin avantajları olduğuna dikkat çekmiştim. Nedir bu avantaj.

İnsanlık olarak bir bireye bir şeyler öğretme konusunda yeni değiliz. Öğrenme konusunda yüzyıllardır bildiğimiz ve tandem olarak uyguladığımız teknikler var zaten. Bunlar akademik bir şekilde bazı konuları anlatmak ve çalışmak. Örnekler çözmek, sınavlardan geçmek, yani uygulamak. Veya bir ustanın yanında çırak olmak, onun yaptıklarını izlemek ve uygulamak. Ve yeri geldiğinde başkaları ile çalışmak, meslektaş olmak mesleki topluluklara ve etkinliklere katılmak. Bakın temelde aynı üç parça: akademik öğrenme, proje bazlı öğrenme ve sosyalleşme.

İşte avantaj bu, konu öğrenme olduğunda hayatın başka dallarından çalıştığını bildiğimiz bazı anlayış ve yaklaşımları uygulama şansımız oluyor.

Şimdi bütün bunlar ışığında bu iki soruya kısa birer örnek cevap vereceğim. Çünkü aslında bu noktada bu soruların cevaplarını kendiniz nasıl bulacağınıza dair ipuçlarına sahip olduğunuzu düşünüyorum. Ve bu cevapların arkasındaki mantığı bilerek kendinize adapte edebilirsiniz

Yazılıma nasıl başlarım:

1- Okuyup çalışılacak kitap veya videolar (Akademik):

a) Bir dil kitabı seçin: Javascript(web), Python/Java (web services), C/C++/C# (oyun/embedded) veya ne dilerseniz

b) Bir veri yapıları ve algoritma kitabı: Seçtiğiniz dilde örnekler içeren, nesne yönelimli programlamaya giriş yapan

c) Bir mühendislik/kod kitabı: Clean Code, Design Patterns, Refactoring, vs gibi

2- Yapılacak projeler

a) Amaç küçük ama tamamen cilalı ve bitmiş projeler olması

b) Birbirine çok yakın A ve B noktaları seçmek: Basit web uygulamaları, veya mikro oyunlar

c) Yardım alabileceğiniz, takılırsanız soru sorabileceğiniz kaynaklar olan alanlardan proje seçmek

3- Sosyalleşmek

a) Yaptığınız projenin alanında ilgili başka insanları bulmak, sosyal medyada takip etmek

b) Meetuplara ve etkinliklere gitmek. Bu etkinliklerde sizin gibi başka pek çok yeni başlayan olacak. Onlarla tanışmak ve irtibatta kalmak.

Yazılımda nasıl gelişirim. Hangi alanlarda gelişmeliyim

1- Okuyup çalışılacak kitap ve videolar

a) Haritası olmayan alanlarda gelişmek. Yol bulmak ve hayatta kalmanın yolu olarak matematik ve platform hakimiyetini geliştirmek

b) Alanınızdaki kritik araçları avucunuzun içi gibi bilmek

c) Ama hiçbir araca, dile ve hatta paradigmaya dinmiş gibi bağlanmamak

2- Yapılacak projeler

a) Durmaksızın proje yapmak. Projeler bilgi ve yetilerinizdeki zaafları yüzünüze vurur. Bu zaaflarla karşılaşınca gurur yapmamak. Paşa paşa gidip o zaafları giderecek konulara çalışmak

b) Sürekli daha önce gitmediğiniz B noktalarına gitmek. Her projenin size yeni şeyler öğretmesini gözetmek.

c) Risk ve ödül ilişkilerini anlamak ve yönetmeyi öğrenmek

d) Amaca yönelik, pragmatik şekilde önceliklendirme yapmayı öğrenmek

3- Sosyalleşmek:

a) Takımları, müşterileri, yan grupları, yöneticileri, rakipleri, müttefikleri iyi izlemek, anlamaya çalışmak. İnsani ve sosyal etkileri göz ardı etmemek. Empati kazanmak

b) Sektörle bağlantı halinde olmak. Etkinliklere gitmek, etkinliklere katkı sağlamak.

c) Yardım istemek, yardım etmek

d) Liderlik ile yöneticilik kavramlarının farkını anlamak.

e) İçerik üretmek bilgi paylaşmak,

Hepsi bu. Bu örneklerle, bahsettiğim üç parçalı şablonun bir adım detaylandırıldığında bu sorulara cevap vermekte nasıl başlangıç noktası olarak kullanılabileceğini sergilemek istedim.

Ve son olarak daha önce defalarca belirttiğim bir şeyi belirterek bitirmek istiyorum. Yazılımda veya başka pek çok teknik, sanatsal veya kreatif dalda, maalesef çok az sorunun net cevabı var. İçinde yaşadığımız ve sürekli değişen bir dünyada bu belirsizliklerle dans edebilmeyi öğrenmemiz gerekiyor. Bu da çok uzun yıllar içinde kazanılıyor. Yani bu oyunu uzun vadeli oynamamız gerektiğini aklımızdan çıkarmamalıyız.

Bu gerçek, pek çok insan için moral bozucu ve şevk kırıcı olabilir. Ama unutmayalım ki bu kolay bir şey olsa herkes yapabilirdi. Zaten insanların büyük bölümü bu davranışları sergileyemiyor. Bu mücadeleyi uzun süre gösterebilen az sayıdaki mühendis de bu yüzden bu kadar yüksek değer kazanıyorlar. Ve bu yüzden dünyada çok azlar.

Harita yok, kısa yol yok. Sadece evreni ve içindeki olguları anlamamızı sağlayan düşünsel modeller, çok ve sabırla çalışarak kazanılacak kritik yetiler, yılmadan, mücadele edilip aşılacak engeller ve tamamlanıp dünyaya değer katacak projeler var.

Bu dünyada bizim davranışlarımızı belirleyecek seçimler var önümüzde. Biz neyi seçeceğiz.