İyi Programcı Nasıl Olunur
Ben iyi bir programcı olduğumu iddia edemem. Ancak, kendi çabalarıyla programcılık hakkında bazı şeyler öğrenmiş ve hayatının belirli bir kısmında, amatör olarak da olsa, programcılıkla uğraşmış biriyim. Bu maceram boyunca, edindiğim deneyimler doğrultusunda, doğru veya yanlış, "iyi programcı nasıl olunur?", "iyi programcı olmak için neler yapmak gerekir", "yazılım konusunda kendini geliştirme nasıl mümkün olur" gibi sorulara bir cevap yazıyorum. Yazı iki kısımdan oluşuyor; önce bana göre iyi bir programcı olmak için ihtiyaç duyacağınız şeylerden bahsedeceğim, sonra kendinizi geliştirebilmeniz için bazı adımlar tavsiye edeceğim. Ancak, bunlara geçmeden önce şunu da belirtmek istiyorum ki, bunları benim gibi bu işin okulunu okumamış ve kendi çabalarıyla programlama konusunda bir yerlere gelmek isteyen kişileri düşünerek yazdım. Çünkü, burada tavsiye edeceğim adımlar, zaten bilgisayar mühendisliği bölümlerinde derslerde veriliyordur diye düşünüyorum. O yüzden, bu yazı okullulara çok hitap etmeyebilir.
Bence programcılar iki kısımdan oluşuyor. İlk grup, programcılığı programcılık için yapanlar grubu. Bu gruptaki kişiler, sırf eğlence olsun diye program yazan, farklı ve yeni şeyler denemeye yatkın kişilerdir. Diğer grup ise, programcılığı bir araç olarak kullanan ve programcılık aracılığıyla bir işini halletmesi gereken kişilerdir. Bunlara örnek olarak, bilimsel amaçlarla programcılık yapanları verebiliriz. Bu yazı ilk gruba yönelik olacak.
Sahip olmanız gerektiğini düşündüğüm şeyler, yetenek, merak, zaman ve İngilizce. Kendinizi geliştirme adına önereceğim adımlar ise, algoritma ve veri yapıları öğrenmek, assembly kullanarak ufak yazılımlar geliştirmek, küçük bir programlama dili geliştirmek, farklı paradigmalardan diller öğrenmek, başkalarının yazdığı kodları okumak ve sosyal olmak gibi adımlar olacak. Son olarak da, olmuyorsa zorlamayın diyeceğim.
Yetenek
Ne yalan söyleyeyim, bana göre yetenek bu işin önemli bir parçası. Bir programlama dili öğrenmek ve bunu kullanarak bazı programla geliştirmek için çok fazla yeteneğe ihtiyacınız yok tabi ki, ama bana sorarsanız, bu konuda yol almak için yetenek önemli bir faktör. Şöyle düşünün, neredeyse herkes şarkı söyleyebiliyor değil mi? Ancak, herkesin iyi bir şarkıcı olmasını bekleyemeyiz. Bence, programcılık konusunun da bundan bir farkı yok. Herkes program yazabilir, ama herkesin iyi bir yazılımcı olmasını bekleyemeyiz.
Bence programcılık, matematik, dil, sistemli düşünce, sembollerle ve soyut düşünebilme gibi alanlarda yetenekli olmayı gerektiriyor. Aslına bakarsanız, programcılığın teorik kısmının, matematikten pek bir farkı yok. Dolayısıyla, iyi bir programcı olabilmek için, bu alanlarda iyi bir kavrama gücü gerektirdiğini düşünüyorum.
Merak
Merak iyi bir programcı olmak için sahip olmanız gereken bir özellik, çünkü, sizi araştırmaya ve kurcalamaya itecek olan güç, bu merak unsuru olacak. Yukarıda bahsi geçen yeteneklere sahip olsanız da, eğer bu konuda bir merakınız yoksa, programcılık sizi heyecanlandırmıyor ise, bu konuda fazla bir yol katedemezsiniz.
Meraklı olmadan, saatlerce gcc belgerini kim okur ki? Ya da, oturup yeni bir programlama dili öğrenmeye kalkar. Programcılık alanında sizi iteleyebilecek tek şey meraktır. O yüzden, inancım şu ki, para karşılığı bu işle uğraşan kişiler, bu işi merak ve ilgisinden yapan kişiler kadar yol alamazlar. Yanlış anlaşılmasın, meraklı kişilerin bu alanda para kazanmasından bahsetmiyorum. Programcılık konusunda meraklı olmayıp, sırf parası için (veya hacker olmak için :/) programcılık yapanlardan bahsediyorum. Meraklı olan kişiler, iş dışı saatlerde de kendileri için kod yazarlar, farklı şeyler denerler, kendilerini sürekli bir adım ileriye götürürler. O yüzden, iyi bir yazılımcı olmak için, meraklı olmanız gerekir.
Zaman
Programcılıkta ilerlemek için zamana ihtiyacınız olacak, hem de çok zamana. Özellikle, asıl işiniz programcılık değilse, boş vakitlerinizi iyi değerlendirmeniz, ve doğru şekilde kendinizi geliştirmeniz gerekiyor. Bu alanda pratik yapılması ve öğrenilmesi gereken o kadar çok şey var ki, tüm ömrünüzü adayan biri bile, tümünü öğrenemez.
İngilizce
İngilizce öğrenmek önemli, çünkü, bu işin kaynağı İngilizce. Evet, internette Türkçe kaynaklar var ama bunlar İngilizce kaynaklarla kıyaslanamaz. Programların ve kütüphanelerin orjinal belgeri, mail grupları, kullanıcı blogları hep ingilizce. Eğer Türkçe kaynaklara bağımlı kalırsanız, ne kadar yetenekli ve meraklı olursanız olun, kısıtlanacak ve kendinizi geliştirmek için gerekli kaynaklara ulaşamayacaksınız. O yüzden, Türkçe konuşan programcılar için İngilizce iletişim kurabilme yeteneği bir zorunluluk.
Algoritma ve veri yapısı
Öncelikle, programlama dili bilmek ile proglamlama bilmek arasındaki farkı idrak etmeniz gerekiyor. Programlama dili bilmek, Türkçe bilmeye benzetilirse, programlama bilmek, konuşacak konularınızın olmasına benzetilebilir. Eğer konuşacak birşeyiniz yoksa, bir dili bilmenin ne önemi var? Programlama bilmek, bir dili öğrendiğinizde onu etkin kullanabilmenin en önemli unsurudur.
İşte bu yüzden, özellikle programcılık maceranızın başlarında, ilk öğrendiğiniz dil ile birlikte, algoritmalar ve veri yapıları konusunda bilgi ve deneyim kazanmalısınız. Yalnız, tüm algoritmaları ezbere bilmelisiniz demiyorum, ama algorimalar ve veri yapılarınız konusunda fikir sahibi olmalısınız. Yukarıdaki benzetmenin üzerinden gidersek, algoritma ve veri yapılarını öğrenmek, kompozisyon yazmayı veya düzgün cümle kurmayı öğrenmeye benzetilebilir.
Algoritma ve veri yapıları öğrenirken, bu algoritmaları koda döküp test etmek isterseniz, kullanacağınız dil olarak C öneririm. Python'u ise bu konuda özellikle önermiyorum, çünkü Python'daki veri yapıları, öğrenme aşamasında, sizin için gereğinden fazlasını yapıyor.
Assembly kullanarak küçük bir program yazın
Assembly dilinde ufak tefek şeyler yazdığım sıralarda, kendimi matrix'i çözen neo gibi hissetmiştim. Assembly dilinde
küçük bir program yazmak, programcılığın somut kısımlarına hakimiyetinizi oldukça geliştirecek, ufkunuzu açacak
bir deneyim olabilir. Kaportanın içine girecek, işlemcinin nasıl çalıştığını, makine kodlarının nasıl şeyler olduğunu,
işlemcinin 32 bit olması ile 64 bit olması arasında ne fark olduğunu çözeceksiniz. Assembly dilinde yazılabilecek proje
önerisi olarak, linux'deki cat
komutu, veya wc
komutu verilebilir.
Yalnız, program yazmak için assembly dili kullanın demiyorum, assembly dilinde birkaç ufak tefek şey yazın diyorum. Yoksa, gündelik hayatta kullanmak için assembly öğrenilmez.
Küçük bir programlama dili geliştirin
Çok matrak veya yeni birşey olmasına gerek yok ama küçük bir programlama dili geliştirmenin size çok faydası olacağına inanıyorum. Böylece, derleyicilerin nasıl çalıştığını, programlama dillerinin nasıl işlediğini iyice içinize sindirebilirsiniz. Bu size, programlama konusunda çok farklı bir deneyim kazandıracaktır. Bir nevi, işin mutfağına girmiş olacaksınız. (bkz: Derleyici Araçları)
Farklı paradigmalara sahip diller öğrenin
Farklı paradigmaların, farklı hayat görüşleri var. Eğer farklı paradigmalara ait diller öğrenirseniz, programcılığa bakış açınızı genişletebilirsiniz. Önerilerim;
- C: Prosedürel, low-level ve linux sistem programcılığı konusunda yaygın kullanılan bir dil. Ayrıca, algoritma ve veri yapıları çalışmalarınızda kullanabilirsiniz.
- Java: Kullanım alanı yaygın olan, tam anlamıyla bir nesne tabanlı programlama dili. C'ye nazaran daha üst seviye veri yapıları, garbage-collection ve exception-handling özellikleri olan bir dil. Bu dil benim çok hoşuma gitmedi, ama öğrenmenin eğitsel bir değeri var. Design Patterns öğrenirken de kullanılabilir.
- Haskell: Saf fonksiyonel, kafanızı zonklatacak bir dil. Paralel işlem özelliği dilin içine işlenmiş. Yaklaşık 4-5 gün uğraştıktan sonra, devam edemeyip bıraktım. (Ahh o monadlar yok mu!) Ama, bu uğraştan sonra Python kodlarım bir hayli güzelleşti. Bu arada, Python'un bazı özellikleriniHaskell'den arakladığını biliyor muydunuz?
- Python: Duck-Typing
Başkalarının yazdığı kodları okuyun
Bu da çok önemli bir adım. Her zaman sizden daha iyi programcılar olacaktır. Bu programcıların kodları sizinkinden daha iyi olacaktır. Bunların yazdılarını okuyarak, problemlere yaklaşmak için alternatif yollar, bazı ipuçları, kısa yollar gibi şeyler öğrenirsiniz. Hatta, bir projeye destekçi olarak katılırsanız, o proje'nin kodlarını okumanız gerekeceğinden, kendinizi bu şekilde de geliştirebilirsiniz.
Sosyal olun
Programcılık konusunda birşeyler yapmak istiyorsanız, sizin gibi düşünen insanlarla bir araya gelin. Gerek forumlarda olsun, gerek yüzyüze olsun, iletişim halinde olun. Böylece hem fikir alışverişinde bulunabilir, hem de bu camia'da olup bitenlerden haberdar olabilirsiniz. Eğer okuduğunuz okulda ilgili klüpler varsa katılabilirsiniz. Mail gruplarına katılın, bug-report yapın, bir github deponuz olsun, bir blog yazın, twitter'dan ilgili kişileri takip edin. Ne şekilde olursa olsun, programcılık camiasıyla bir şekilde iletişim halinde olun.
Olmuyorsa zorlamayın
İlk başta ta belirttiğim gibi, herkes programcı olacak diye birşey yok. Eğer, 2-3 senelik çabalarınızdan sonra, çok mesafe kat edemediğinizi veya programcılığın size göre olmadığını düşünürseniz, anlamsız yere zorlamayın. Kendi kişiliğinize ve kabiliyetlerinize daha uygun bir alanda kendinizi geliştirmeye çalışın derim.
Sonuç Olarak
Programcılık uzun bir yol, ama aynı zamanda çok keyifli ve karşılığını alacağınız bir uğraş. Ayrıca, sizlerin de programcılık konusunda kendinizi geliştirmek için ne tür yollar izlediğinizi de öğrenmek isterim.