Yazılıma yeni başlıyorum, hangi konuları öğrenmem gerekiyor? Yazılımda kendimi geliştirmek için neler yapmalıyım? Bir yazılımcının neleri bilmesi gerekiyor?
Bunun gibi sorular bana o kadar çok geliyor ki, bu konu hakkında bir yazı kaleme almaya karar verdim.
Sizlere kendi tecrübelerimden yola çıkarak bir yazılımcının bilmesi ve öğrenmesi gereken teknik konular hakkında bilgi vereceğim. Anlatacağım birçok şeyi temel bilgi seviyesinde bilmeniz gerekiyor. Eğer uzmanlık gerektiren bir konu olursa bunu belirtirim.
Sakın bu anlatacağım listedeki konuları gözünüzde büyütmeyin. İnanın istikrarlı bir şekilde çalışarak, zamanla birçok şeyi öğrenirsiniz.
Bilgisayar
Yazılımcılar, bilgisayarlarını nasıl kullanacaklarını çok iyi bilmeliler. İşletim sisteminin ve programların nasıl çalıştığı hakkında bilgi sahibi olmalıdırlar. Windows olsun, Mac olsun fark etmez, şu konulara hakim olmalısınız.
- Bilgisayarın donanımı nedir ve bunlar nasıl çalışır?
- Yeni laptop alırken nelere dikkat etmelisin?
- İşletim sistemi nedir, ne işe yarar?
- Bilgisayarınızda programları arama, indirme, yükleme, kurma ve kaldırmayı öğrenin
- Dosya yönetimi. Dosya ve klasör arama, yaratma, değiştirme ve silme. Bu dosya yönetimi komutlarını özellikle konsoldan nasıl yapıldığını öğrenin. Yazılımda en çok kullanılan konsoldur. cmd, powershell, bash bunlara birkaç örnek.
- Bilgisayarda dosya güvenliği, dosyaların bilgisayarda saklanırken ve paylaşılırken güvenli bir şekilde korunmasını sağlar. Dosya güvenliği, dosyaların yanlış kullanımından, silinmesinden, değiştirilmesinden veya çalınmasından korunması anlamına gelir.
- Herhangi bir metin düzenleyiciyi çok iyi seviyede kullanma. Mesela Visual Studio Code, Notepad++, Ultraedit, Atom gibi.
Yazılımcı türü
Bir sonraki aşama ise hangi tür yazılımcı olmak istediğinizle alakalı olarak düşünün.Birkaç örnek vermek gerekirse:
- Front-end Engineer
- Back-end Engineer
- Full stack Engineer
- Test Engineer
- DevOps Engineer
- Data Scientist
- Mobile Engineer
- Web Engineer
Bunların hepsi farklı farklı yönleriyle yazılıma etki etmekte. Bazıları daha çok arayüzünde, bazıları arka planda, bazıları sistem yönetimi tarafında, bazıları test, bazıları da veri tabanı tarafında. Seçeceğiniz yazılımcı türü sizin hangi programlama dilini kullanacağınızı çok etkiler.
Mesela Data Engineer olmak isterseniz JavaScript asla seçmezsiniz. Arayüzle alakalı bir yön seçerseniz Javascript kesinlikle öğrenmeniz gerekir. Arayüzü olmayan bir yön seçerseniz karşınıza Java, Python ve C# gibi diller çıkıyor. Daha çok sistem mühendisliğini seçerseniz bu sefer de Python, Bash, PowerShell gibi scripting dilleri karşınıza çıkar.
Kafanızda bir yön belirlediyseniz, başlamak için bir programlama dili seçin, çünkü ileride bu dilde uzmanlaşacaksınız. Yazılımcılar, bir veya daha fazla programlama dilini iyi bir şekilde kullanmalıdırlar. Bu dillerin sözdizimini, yapısını ve diğer özelliklerini anlamalıdırlar. Başlangıçta bir dilde uzmanlaşın, ama ileride en az 2 dili daha temel seviyede öğrenmenizi tavsiye ederim. Her dilin kendine has özellikleri var ve bunlar sizin düşünce yapınızı değiştirir.
Programlama mantığı
Temel programlama mantığını öğrenin. Yani programlama nedir, bilgisayar ile etkileşimi nedir, ne gibi olanaklar var gibi konuları öğrenin. Bu konuyu en temelden anlattığım Yazılım nasıl öğrenilir video serime bakabilirsiniz.
Veri yapıları ve Algoritmalar
Veri yapıları ve Algoritma konularını öğrenin. Programlamanın temeli veri yapıları ve algoritmalardır. Ne zaman hangi tür veri yapısını seçeceğinizi bilmeniz gerekir. Bu konu hakkında da kanalımda video serisi var, bakabilirsiniz.
SOLID prensipleri
SOLID prensipleri, yazılım geliştirme sürecinde kullanılır ve bu prensipler sayesinde yazılım sistemleri daha iyi tasarlanabilir ve daha kolay değiştirilebilir hale gelir. Aşağıda SOLID prensiplerinin yararlarının birkaçını belirtiyorum:
- SOLID prensipleri sayesinde yazılım sistemleri daha az karmaşık ve daha kolay anlaşılabilir hale gelir.
- SOLID prensipleri sayesinde yazılım sistemlerinde sınıflar arasında daha kolay geçiş yapılabilir ve sınıflar daha kolay değiştirilebilir hale gelir.
- SOLID prensipleri sayesinde yazılım sistemlerinde arayüzler daha az karmaşık ve daha kolay uygulanabilir hale gelir.
- SOLID prensipleri sayesinde yazılım sistemleri daha esnek ve daha kolay değiştirilebilir hale gelir.
Bu yararlar sayesinde, SOLID prensipleri yazılım geliştirme sürecinde kullanılarak yazılım sistemlerinin daha iyi tasarlanabilmesine yardımcı olur.
Temiz kod
Temiz kod, yazılım geliştirme sürecinde önemli bir konudur. Temiz kod sayesinde yazılım sistemleri daha kolay anlaşılabilir, daha kolay değiştirilebilir ve daha az hata içerir. Aşağıda temiz kodun yararlarının birkaçını belirtiyorum:
- Temiz kod sayesinde yazılım sistemleri daha kolay anlaşılabilir ve daha kolay değiştirilebilir hale gelir. Bu, yazılım sistemlerinin güncellenmesi ve geliştirilmesi sırasında zaman ve emek tasarrufu sağlar.
- Temiz kod sayesinde yazılım sistemleri daha az hata içerir. Bu, yazılım sistemlerinin daha güvenilir ve daha kaliteli hale gelmesini sağlar.
- Temiz kod sayesinde yazılım sistemleri daha kolay okunabilir ve anlaşılabilir hale gelir. Bu, yazılım sistemlerinin farklı geliştiriciler tarafından da kolaylıkla anlaşılabilmesini sağlar.
Bu yararlar sayesinde, temiz kod yazılım geliştirme sürecinde önemli bir konudur ve yazılım sistemlerinin iyi tasarlanabilmesi için gereklidir.
Networking (Ağ sistemleri)
Artık yaşadığımız dijital çağda birçok cihaz ve araç birbirine bağlı ve gelecekte bu daha da artacak. Peki, bunlar birbirleriyle nasıl haberleşiyorlar ve güvenliği nasıl sağlıyorlar? Bilgisayarlar birbirleriyle nasıl iletişim kuruyor? İşte bunlarla alakalı olarak şu konuları kesinlikle öğrenmenizi tavsiye ederim:
- İnternet nasıl çalışıyor?
- OSI modelinin 7 katmanı nedir?
- TCP ve UDP nedir?
- HTTP ve HTTPS nedir?
- SSL nasıl çalışıyor?
- Web sunucu çalışma prensibi nedir?
Cloud
Cloud öğrenin. Artık çoğu sistem cloud’a geçecek. Hatta kısa zamanda iş görüşmelerinde cloud bilgisi en temel gereksinimler arasında olacağını düşünüyorum. Size tavsiyem, Azure veya AWS ikilisinden birine odaklanmanız ve temel bilgi sahibi olmanız. Hem Azure hem de AWS şirketleri internette oldukça çok ücretsiz eğitimler ve sertifikalar sunuyor. Bunları takip etmenizi tavsiye ederim.
Linux
Linux öğrenin. Yazılım dünyasında en çok kullanacağınız işletim sistemi muhtemelen Linux olacaktır. Bu yüzden de Linux’te temel dosya ve klasör işlemlerini yapmayı öğrenin. Temel sistem komutlarını öğrenin. Dosyaları düzenleme komutlarını öğrenin.
Veritabanı
Veritabanı temellerini öğrenin. Yazılım projelerinde kullanılan verinin bir yerde depolanması gerekiyor. Mesela, müşteri ve kullanıcı bilgileri gibi. İşte bunlar hakkında ve özellikle SQL hakkında temel bilgi sahibi olun. Yani veritabanı nedir, ne işe yarar, ne tür veritabanları vardır gibi bilgiler. Bu konuyu etraflıca açıkladığım veritabanı nedir videosuna bakabilirsiniz.
Güvenlik
Temel güvenlik konseptlerini öğrenin. Yazılımda neden güvenliğe ihtiyaç olduğunu anlayın.
Test etmek
Test etmek, her yazılım projesinin olmazsa olmaz bir bölümüdür. Test etmenin farklı safhaları hakkında temel bilginiz olsun, ama kod test etmeyi kesinlikle öğrenin. Test etme konusu hakkında baştan sona ücretsiz bir eğitimim var. Tüm videolarını kanalımda bulabilirsiniz.
API ve Mikroservis
API ve Mikroservis mimarisi hakkında bilgi edinin. Günümüz dünyasında birçok yazılım mikro servis mimarisi kullanmaktadır. Bunların neden gerekli olduğunu anlayın.
Versiyon kontrol
Versiyon kontrol sistemleri, kodlama aşamasında yapılan değişiklikleri takip etme ve eski sürümlere geri dönebilme gibi işlemleri yapabilmek için kullanılan araçlardır. En popüler olan sistem ise Git sistemidir. Bunun hakkında temel bilgi sahibi olun.
Geliştirme ortamları
Geliştirme ortamları, kodlama aşamasında kullanılan araçlardır. Örneğin, Visual Studio, IntelliJ ve Eclipse gibi araçlar bu kategoriye girer. Bunlardan birini veya herhangi başka bir geliştirme ortamını kullandığınız dile göre seçin ve devamlı bunu kullanın.
İngilizce
İngilizcenizi geliştirin. Yazılım dünyasında her şey İngilizce’dir. İnternette bir şey aradığınızda bulacağınız neredeyse tüm kaynaklar İngilizce olacaktır. Ne yapın edin İngilizcenizi geliştirin.
BONUS
Şimdiye kadar anlattıklarımı yeni başlayanlar için kesinlikle tavsiye ediyorum. Şimdi bu bölümde anlatacaklarım kendinizi daha da geliştirmek istediğiniz zaman ihtiyacınız olan şeylerdir.
- Debug yapmayı öğrenin. Çoğu zaman yazdığınız kod tek seferde çalışmayacaktır. Düzeltmeler sonrasında çalışır hale getirseniz de bazen sorunu bulmak o kadar da kolay olmuyor. Bu yüzden de debug ederek safha safha kodunuzu canlı olarak nasıl çalıştığını ve hangi değişkenlerin hangi değerleri olduğunu takip ederek sorunun nerede olduğunu bulabilirsiniz.
- Shell scripting öğrenmenizi tavsiye ediyorum. Shell scripting, bir işletim sistemi tarafından desteklenen ve komut satırı (konsol) üzerinden çalıştırılan bir script dilidir. Shell scripting, komut satırından girdi alarak veya dosyalardan okuyarak işletim sistemine komutlar gönderebilen ve bu komutların sonuçlarını işleyebilen programlar olarak tanımlanabilir. Hareket alanınızı oldukça geliştirecek ve düşünme yeteneğinizi arttıracak deneyimler kazanırsınız.
- Docker ve Kubernetes öğrenin. Konteynerleştirme günümüzde çok popüler bir hale geldi ve gelecekte de herkes tarafından kullanılmaya devam edilecek. Kanalımda Docker eğitim serisi ve Kubernetes nedir videolarıma bakabilirsiniz.
- Yazılım geliştirme süreçleri: Yazılım geliştirme süreci, bir yazılım projesinin başarısının anahtarıdır. Yazılımcıların bu süreçler hakkında bilgi sahibi olmaları, projelerini daha verimli ve etkili bir şekilde yönetmelerini sağlar. CI/CD ve DevOps kavramları hakkında bilgi sahibi olun. Yazılımınızın en başından canlıya çıkana kadar geçirdiği serüven hakkında temel bilgi sahibi olmanızda yarar var.
- Agile yönetim metodolojileri: Agile yönetim metodolojileri, yazılım geliştirme sürecini daha esnek ve adaptif hale getirir. Bu metodolojiler sayesinde yazılım projeleri daha hızlı ve kaliteli bir şekilde tamamlanabilir.
- Tasarım kalıpları (design patterns), yazılım geliştirme sürecinde sık karşılaşılan ve çözümü belirli bir yapı üzerine kurulu olan problemler için kullanılan yaklaşımlardır. Tasarım kalıpları, yazılım sistemlerinin daha iyi tasarlanabilmesini ve daha kolay değiştirilebilmesini sağlar. Tasarım kalıpları genel olarak aşağıdaki 3 kategoride sınıflandırılır:
- Yapısal tasarım kalıpları
- Davranışsal tasarım kalıpları
- Yaratıcı tasarım kalıpları
Kişisel öneriler
Bunların yanında size özel tavsiyelerde bulunmak istiyorum.
- GitHub hesabınız olsun ve hobiniz olarak yaptığınız projeleri buraya ekleyin. Başkalarının yaptığı projeleri okuyun ve öğrenin.
- Blog yazmaya başlayın. Medium gibi mecralarda ücretsiz blog yazın. Öğrenme sürecinizi paylaşın. Emin olun bu süreçte kendiniz de pek çok şey öğreneceksiniz.
- Sosyal medyada aktif olun. Twitter ve LinkedIn hesaplarınız olsun. Uzmanlığınız ile ilgili tanınmış yazılımcıları takip edin. Sosyal medyada yazılım hakkında yapılan seviyeli yazışmalara katılın ve fikirlerinizi paylaşın. Bu sayede hem network ağınızı genişletirsiniz hem de kişisel gelişiminize pozitif etki sağlarsınız.
- Bol bol pratik yapın. Ekran arkasında sürekli kurs takip etmeyin. Öğrendiklerinizi kendiniz veya arkadaşlarınızla proje yaparak uygulayın. İnternette Leetcode gibi mecralarda sorun çözün.
- Onbinlerce lira tutan pahalı kurslara para vermeyin. İnternette istediğiniz her konuyu ücretsiz veya çok az bir ücretle öğrenebileceğiniz birçok imkan var.
- Fırsat buldukça gezin, tatile gidin veya farklı, size enerji verecek şeyler yapın, rahatlayın. Sonuçta her şey yazılım değil 🙂
Daha sonra bu konuları detaylı bir şekilde anlattığım yazılar ve videolar eklemek niyetindeyim.
Yazılımcıların yaptığı 7 kişisel gelişim hataları yazıma buradan ulaşabilirsiniz.