Mayıs ayı başında Malatya, İnönü Üniversitesi’nin düzenlediği Robocofest‘te katıldım ve “Programlama ve Kariyer” isimli bir sunum yaptım. Bu sunumun PDF dosyasına şu yazıdan ulaşabilirsiniz. Şimdi ise bu sunumu biraz daha geniş bir şekilde burada ele almak istiyorum.
Programalama nedir?
Bazı şeyleri, onları yapan, icra edenler üzerinden tanımlamak daha kolaydır. Programlama yapan kişiye programcı (programmer) denir. Peki, programcı kimdir? Programcı tabi ki kafein ve pizzayı yazılıma dönüştüren organizmadır 🙂 Bizim ülkemizde buna sigarayı da eklemek gerekir. Çünkü bekar olan ve muhtemelen bir kaç bekar arkadaşıyla aynı evde yaşayan, kariyerinin başındaki genç programcı arkadaşımızın odasına girdiğinizde hemen göze çarpacak şeylerin başında, izmaritle dolup taşmış küllükler gelir. Aynı odaya gece 2-3 gibi girerseniz dumandan programcıyı seçememe ihtimali de vardır.
Bir işi yapanı gözlemlemek o işle ilgili size çok şey anlatır. Dolayısıyla programcıları, tabi ortamlarında gözlemlemelisiniz. Programcıların kendilerine has hal ve hareketleri, çoğunlukla başkalarına garip gelir. Çok odaklı çalışırlar mesela, işin karmaşıklığı da zaten bunu gerektirir. O yüzden çalışırken rahatsız edilmek istemezler, açık ofis ortamlarında kulaklık takarak çalışmaları tam da bu yüzdendir. Bu sebepten, onların verimli çalışmalarını isteyen yöneticileri, programcıları zaman zaman aşağıdaki gibi korumaya alabilirler. Tehlikeli kimyasallarla ya da radyoaktif maddelerle uğraşanların da özel, korumalı ortamda çalışmalarından farklı bir şey değildir bu durum. Dolayısıyla bu fotoğraf
ya da bu fotoğraf,
programcılar için hiç de anormal değildir.
Peki geyiği bırakıp biraz ciddi olalım ve “hakikatten programlama nedir” diye soralım. Programlama kısaca,
• bilimdir (science),
• sanattır (art),
• mühendisliktir (engineering)
• ve zanaattir (craftmanship).
Programlama, her ne kadar harcıalem yani hemen herkesin yapabileceği, üstesinden kolayca gelebileceği bir şeymiş gibi görünse bile, aslen o kadar da basit değildir. Hayatımıza çok girmiş işleri genel olarak basite alma eğilimindeyizdir, taa ki onun içine girinceye kadar. Aslen “programlama nedir” konusunda daha önce burda bir dizi yazı yayınladım:
- Programlama Nedir: Programlamanın Tabiatı ve Programcılık Üzerine – I
- Programlama Nedir: Programlamanın Tabiatı ve Programcılık Üzerine – II Bilim mi, Mühendislik mi, Sanat mı Yoksa Zanaat mı?
- Programlama Nedir: Programlamanın Tabiatı ve Programcılık Üzerine – II Bilim mi, Mühendislik mi, Sanat mı Yoksa Zanaat mı?
Bu yazılarda anlatmaya çalıştığım şey, programlamanın çok disiplinli (interdiciplinary) bir alan olduğu ve hiç bir şekilde harcıalem bir uğraşı olmadığıdır.
Yukarıda programlamanın neliği ile bu kadar uğraşmışken neden şimdi başka bir yazı yazdığımı sorarsanız eğer, burada daha çok programlamayı bir kariyer olarak gören gençlere yönelik bir kaç tavsiyem olacak. Ama bu tavsiyelerin anlam ifade etmesi ve bütünlük için için programlamanın neliğinden kısaca yine bahsetmek gerekecek.
Programlama Bilimdir.
Programlama, bilimdir çünkü programlama, matematiktir. Programlama, temelleri mantık ve cebir olan, aksiyomlara sahip, kendine has notasyonu olan bir uygulamalı matematik disiplinidir. Programlama ile genelde daima bir algoritma yazılır. İster çok karmaşık bir hesap yapın, mesela Newton Raphson yöntemiyle kök hesaplayın, ister bir sigorta poliçesinin fiyatını hesaplayın, isterseniz de KDV hesabı kadar basit bir şey yapın, daima bir algoritma yazarsınız. Grafik kullanıcı arayüzleriyle uğraşıyor olsanız ve bir düğme tıklanınca onun olayını (event) halletseniz de yazacağınız şey bir algoritmadır. Peki nedir algoritma?
Algoritma Nedir?
Tabi ki algoritma, programcıların ne yaptıklarını açıklamak istemediklerinde kullandıkları, mistik bir terimdir!
- Nedir problem?
- Algoritma abi!
- Neden gecikti bu iş böyle?
- Algoritmadan kaynaklanan bir problem var!
Tabi ki abartıyorum, keşke bu topraklarda iş alanı ile ilgili konuşmalarımızda algoritma vb. terimleri kullanarak formal konuşabilsek. Bizim konuşmalarımız daha çok “şu button tıklanınca falan şey gözükmüyor” tipinde, dıdının dıdısı cinsinden, hiç bir şekilde bağlamı içermeyen, detayda boğulan konuşmalardır. Bu problemin ne anlama geldiğini anlamak, başka yerlerde de olup olmayacağını ortaya çıkarmak için 2-3 soru daha sormanız gerekir! Neyse, algoritma, matematiksel bir ifadedir ve “bir işin yapılış şeklinin tarifidir öyle ki içinde iş kurallarının olduğu bir süreci barındırır” denebilir kısaca. Dolayısıyla program yazmak, algoritma yazmaktır, dolayısıyla matematiktir. Algoritmik düşünceyi daima sevmelisiniz iyi bir programcı olmak için. Bu yüzden üniversitelerde programlamayı, tipik olarak farklı türdeki algoritmalar üzerinden anlatırlar. Ama master yaparken saf algoritma dersi alırsınız, herhangi bir programlama dilinden bağımsız, sadece matematiksel, cebirsel bir faaliyet olarak öğrenirsiniz algoritmaları. Hatta güvenlik (security) vb. konularda apayrı yapıda algoritmalara odaklanırsınız.
Geyik de olsa algoritma kelimesine yüklenen “karmaşıklık” algısı aslen, her meslek gibi programcıların da kendilerine has bir dilleri olduğunu ifade etmeye yarar. İngilizce’de “sadece ehlinin bildiği” anlamına gelen “esoteric” terimi kullanılır bu gibi durumlar için. Bu topraklarda her ne kadar henüz örneğin doktorlar kadar formal ve esoterik konuşamazsak da programcılık, tamamen esoterik bir dile sahiptir. Matematiksel tabanlı olan bu esoterik dili ne kadar iyi bilirseniz o kadar iyi programcı olursunuz.
Programlama Sanattır.
Soyut oluşu ve örneğinin olmaması, yaratıcılık gerektirmesi ve yapanın kişisel özelliklerine bağlı olması, programlamayı bir sanat yapar. Programlama matematiktir dedik ama zaten matematikte de sanatsal taraf yok mudur sizce? Hemen hiç bir programlama yapısı bir diğerinin aynısı hatta benzeri bile değildir, her programlama birimi kendi başına tekildir, “unique”dir. Aynı sanat eserleri, tablolar, müzik eserleri, filmler, romanlar gibi. Dolayısıyla ciddi bir kurgu içerirler.
Programlamayı sanat görenlerin başında, bu dünyaya en çok emeği geçmiş, Stanford Üniversitesi’nden emekli, Donald Knuth gelir. Çok özel ilgi duymuyorsanız muhtemelen sadece doktora yaparken karşılaşacağınız kitaplardan olan, Knuth’un en büyük eseri The Art of Computer Programming‘in ismi de bunu yansıtmaktadır. Knuth bu kitabında programlamadaki estetik tecrübeye de vurgu yapar.
Programcılar, yaptıkları işi tanımlarken, “aşk”, “tutku”, “bağımlılık” gibi kelimeleri çok kullanırlar. Muhtemelen, zekanın çıktısını, programlama kadar açık ve hızlı görebilen fazla meslek uğraşı yoktur. Bu yüzdendir ki normal insanlar uyanmak, programcılar uyumak için saat kurarlar!
Programlama Mühendisliktir.
Programlama bir problem çözme yöntemidir, programlama amaç değil araçtır. Süreçseldir, kodun geliştirilmesi, testlerinin yazılması ve çalıştırılması, dokümantasyonu vb. çalışmalar, programlamanın parçalarıdır. Bu yönüyle programlama bir mühendislik disiplinidir.
Yazılım Geliştirme Nedir?
Yazılım geliştirme, merkezinde programlamanın olduğu bir mühendisliktir. Yazılım Mühendisliği (Software Engineering), programlama yanında, analiz, tasarım, test, yönetim vb. faaliyetlere sahiptir. Fakat programlama, esas çıktıyı üretendir, dolayısıyla koskoca projedeki tüm hata, performans, gecikme vb. şeylerden hatta faturanın kesiminden bile sorumlu olan kısımdır. (Bu sebeple, mesela ülkemizde yazılım mühendisliğini programlamaya indirgeme, ya da programcılığı, yazılım mühendisliği olarak görme eğilimi çok yaygındır.) Bu yüzden programcılık cesaret ister!
Programlama Zanaattır.
Usta-çırak ilişkisi ile öğrenilmesi, ciddi el (ve zihin) yatkınlığı gerektirmesi ve yapanın kişisel özelliklerine bağlı olması, programlamayı, bir zanaat (craftmanship) kılmaktadır. Her zanaatta olduğu gibi programlamada da kullanılan araçlar ve iş yapış şekilleri vardır.
Diğer Mühendislikler Arasında yazılım Mühendisliği
Programlama da, yazılım geliştirme de çok karmaşıktır, muhtemelen mühendislikler arasında en karmaşık olandır.
Ama herşeye rağmen yazılım geliştirme takımının görevi, basitlik illüzyonu yaratmaktır. Belki de tam da bu yüzden programcılık ve yazılım geliştirmek ülkemizde, harcıalem bir uğraşı olarak görülmektedir.
Programcı Olmak İçin
Yukarıda anlattıklarım, belli bir bilgi temelini, zihinsel işleyişi ve nihayetinde çalışma şeklini vurguluyor. Elbette çalışma ile herkes herşeyi yapabilir, başarabilir. Ama mutlu olur mu ya da fark yaratır mı? Sanırım bu sadece çalışma ile ilgili bir durum değil, belki, sevme, tutkuyla bağlanma, uygun olma gibi kavramlar giriyor işin içine.
Bence iyi bir programcı olmak için şu özellikler düşünülmeli:
- Farklı soyutlama seviyeleri arasında rahatça gezebilen, matematiksel bir zeka,
- Aynı anda pek çok faktörü yönetebilen detaycı bir zeka,
- İğne ile kuyu kazabilen bir sabır taşı ve tutkulu bir psikoloji.
Özellikle Türkiye’de, tüm bunların altından kalkabilmek için strese de dayanıklı olmalısınız. Programcılık keyiflidir ama bu ülkede keyifsiz insanlar, programcılığı eziyete dönüştürürler.
Eğer programlama konusunda, kendinizi yukarıdaki özelliklere sahip görüyorsanız, iyi bir programcı olabilirsiniz hatta olun, insanlığa katkıda bulunun. Aksi taktirde bu dünyanın sonu değildir, bilgisayar mühendisliği vb. bir bölümde okuyor olsanız bile, kariyerinizde mutlu olmak için analist, tester, ağ, veri tabanı, vb. sistem yöneticisi vb. pozisyonları tercih etmeyi düşünün.
Programlama-Yazılım Kültürümüz
Açıktır ki, ülkemizdeki programlama kültüründe zanaat tarafı ağır basmaktadır. Zanaatlarda da, ülkemizdeki programlama pratiğinde de, öğrenmede formal eğitim yerine bakıp-görerek öğrenme, problem çözmede de sistematiklik yerine deneme-yanılma ile çözme, iş yapış şekillerinde yaratıcılık yerine araçlara ve teknolojiye bağlı kalma öne çıkmaktadır. Ülkemizdeki programcıların en büyük yardımcısı copy-paste ve Google’dır. Bu anlamda programlama ve yazılım geliştirme kültürümüz, toplumsal kültürümüzün bir yansımasıdır. Bu yüzden sıradan bir programcı olmak yerine fark yaratmayı hedefliyorsanız zanaatkar olmakta ileriye gitmeye çabalamalısınız. Bu yüzden:
- Formal eğitime muhakkak önem verin. Yani üniversite 2. sınıfta iken “Java’yı ve Android’i öğrendim, şimdi ne öğreneyim” diye sormayın. Matematiğiniz 90 ve üzerinde mi? Algoritmalar ve Veri Yapıları dersinden sınıfın en iyisi misiniz? Bu sorulara hayır diye cevap veriyorsanız sorduğunuz soru zaten yanlış bir sorudur. Hele üniversitede BM’e girdiği ilk sene, binlerce lira para vererek şehrideki bir kursa yazılıp, Windows makinanın TCP/IP ayarlarının nasıl olacağını öğrenmeyi marifet sayanlardan olmayın. İşletim Sistemleri dersinden zor geçip sonra Linux öğreneceğim diye de yırtınmayın. Linux’te komut satırında ihtiyacını giderecek kadar bir şeyler yapmak ya da yasaklarla boğuştuğumuz canım ülkemizde bir kaç IP ayarını hızlıca yapabilmek, işte tüm bunlar zanaatin ta kendisidir! Dolayısıyla Linux öğrenin ama bir Linux de ben nasıl yazarım diye hedefleyin. Algoritmaları ezberlemeyin, şunu şöyle seçseydik nasıl çalışırdı diye akıl yürütmeyi alışkanlık edinin. Temel derslere, işletim sistemleri, algoritmalar, db, network, discrete matematik, vb. çok önem verin. Formal eğitiminizi çalışırken de devam ettirin, master-doktora yapın, sertifika alın örneğin.
- Sistemli çalışın. Sistemli çalışmak için muhakkak, temelden ileriye doğru gidin ve odaklanın. Kerat cetvelini bilmeden integrali öğrenmeye kalkmayın, öğrenemezsiniz çünkü, sadece ezberlersiniz ve başarısız olursunuz.
- Odaklanın. Aslında odaklanmak, sistemli çalışmanın bir alt parçası ama önemine binaen ayrı bir başlık altına aldım. Çok sıklıkla görüyorum, ilgisiz pek çok konuyu abur-cubur bir şekilde öğrenmeye çalışanları. Zaten bu şekilde öğrenme de olmuyor, bilgi sahibi olmadan fikir sahibi olunuyor. İyi tanımlanmış ve özelleştirilmiş, spesifik hedeflere sahip olun. Örneğin 3 senelik BT çalışanı, hem PM sertifikası almış şimdi de SQL eğitimi alıyor, seneye de Cisco kursuna gitmekten bahsediyor! Nedir şimdi bu? Eğer PMP, SQL ve Cisco ile bir şey başarılabiliyorsa, bunları gerekli kılan bir hedef varsa eyvallah ama aksi taktirde zaman, enerji ve zeka kaybı!
Bu türden eleştiri ve tavsiyelere, bizim sektöre katılacak gençlerden çok aslında sektörümüzün ve üniversitelerimizin ihtiyacı var, bunun çok fena şekilde farkındayım. Siz istediğiniz kadar iyi olun sektörümüz iyiyi aramıyor, iş bitiriciliğe prim veriyor. Ya da üniversiteler hatta çok daha öncesinde başlayan eğitim sistemimiz, edep-terbiye adı altında sorgulamamayı, ezberlemeyi kutsamış durumda. Dolayısıyla yurt dışına gitmeyi, gerek eğitim gerek profesyonel olarak çalışmak amacıyla oralarda bir miktar yaşamayı kesinlikle hedef edinin. Yukarıdaki tavsiyelere ne kadar uyarsanız bunu yapmak o kadar kolay olacaktır.
Programlama, keyiftir 🙂
Bu yazı toplam 459 defa görüntülenmiştir.