Fullstack Java geliştiricinin yol haritası

Son zamanlarda java ile fullstack development çalışma yapısı çok yaygınlaştı. Bu kavram backend ağırlıklı olup üzerine temel seviyede frontend yazarak geliştirme yapmak şeklinde oluyor genelde. Ben full stack yazılım geliştirici başlıklı yazımda da yazdığım gibi bir insanın hem frontend hem backend mantalitesine sahip olmasının ve iki taraftan da uzmanlaşmasının imkansız olduğunu düşünüyorum. Bu yüzden genelde insanlar backend ağırlıklı veya frontend ağırlıklı fullstack gibi bir ayrım ile ikiye ayrılıyorlar. Bu yazıda java ile backend ağırlıklı bir fullstack geliştirici olabilmek adına sıfırdan başlayarak öğrenilmesi gerektiğini düşündüğüm başlıkları ve detayları yazdım.

Bu sayede bir rehber olarak bu yazıyı alıp başlıkları sırası ile tamamlayarak gerekli yetenekleri kazanabilirsiniz. Fakat tabi ki bu kadar çok konuyu detayları ile birlikte öğrenmek aylar veya yıllar alacaktır. Zaten bu yolculuğun kısa süreceğine inanıyorsanız, yazılımın sadece kod yazmaktan ibaret olduğunu düşünüyorsanız muhtemelen bu yazıyı da okuyor olmazdınız :) Bu yazıda belirttiğim konuları öğrenebileceğiniz kaynaklar sunmayacağım, çünkü her insan farklı şekillerde farklı tarzlarda öğrenmeye yatkın oluyor. Dünyada java 'yı veya restful servisleri en iyi anlatan eğitim şudur şeklinde bir eğitim olması mümkün değil.

Eğer bir şekilde bir bootcamp veya yazılımcı eğitimi gibi bir ortam bulursanız, konuların üst üste bindiğini ve önceki konuların sonrakilerin öncülü olduğunu fark edeceksiniz. Bu aşamada cevaplarını almış olmanız gereken sorular oluyor. Bu yazıda öğrendiğiniz konularda hangi tür sorulara cevap verebilmeniz gerektiğini de yazdım bazı yerlerde. Günün sonunda kendi seviyenizi ölçmek adına da size fikir verebilir. Zamanla kullanılan teknoloji ve diller değişiklik gösterebildiği için mümkün oldukça temel noktalara odaklanıyor olacağım. Tabi ki bu yazı ağırlıkla Java geliştiricisi olmak üzerine odaklanmış olacak. .Net veya başka bir dilde çalışıyorsanız veya frontend ağırlıklı fullstack geliştirici olmak istiyorsanız, yolunuz daha farklı olacaktır ve olmalıdır da.

Java ekosistemi - JDK - JRE - JVM

Bir zamanlar herşey karanlıkta idi. Sonra "big Java bang" oldu. İlk aşamada seviyeniz ne olursa olsun Java 'da ecosystem dediğimiz kavram nedir sorusunu sormak gerekiyor. Java öğrenmeye başlayınca kütüphaneler, araçlar ve framework 'ler işin içine giriyor. Büyük resim içerisinde küçük parçaları yapboz gibi tamamlıyoruz. Günün sonunda varmaya çalışacağımız yetkinlikler haritasında neler olacak mesela? Ben bu noktada programlamanın tarihçesinden bile başlıyorum genelde ve programlama nedir diye uzun uzun konuşuyorum. Çünkü geldiğimiz noktada yaklaşık 50 yıllık bir geçmiş var. Dünden bugüne gelmedik buraya.

Sonrasında JDK - JRE - JVM gibi javayı java yapan özellikleri tanımak gerekiyor. Java hem bir dil hem de bir programlama yapısı çünkü. Biz neden java öğreniyoruz sorusunun açıklamasının olması lazım. Bytecode nedir, platformdan bağımsız olmak nedir, java 'nın C ve C++ ile alakası nedir, native kod nedir... gibi bir çok soru var bu noktada.

Temel algoritmalar - Variable - Class

Bir programlama dili bilgisayara neyi nasıl yapacağını söyleyen bir algoritmayı kurgulamaktır temelde. Bu yüzden biz java yazarken bilgisayara tekrarlı bir işlem yapmayı veya koşullara göre farklı çalışması gerektiğini nasıl söyleyebiliriz, bunu bilmemiz gerekiyor. Java 'da bu kavramları gerçeklemek için ilk adımımız main metod ve class yazmak oluyor. Size komik geliyordur belki ama Main metodu gözünüz kapalı yazabiliyor olmalısınız. Yazacağımız class 'lar belli verileri tutup işliyor ve istediğimiz sonucu üretiyor. Metodlar, değişkenler, döngü ve koşul ifadelerini bilmek gerekiyor. Bu da aslında Lego parçaları gibi bir yapı.

Class kavramı java içi hayati önemde tabi ki. Referans göstermek nedir, new yapmak nedir, constructor nedir, this nedir ...vs gibi bir çok soru var burada. Burası ezbere geçilecek kısımlar değil. Java 'yı java 'ca düşünmek gerekiyor. Nasıl bir yabancı dili düşünerek konuşmadığımız zaman native oluyorsak programlama dili de öyledir. İçinize ve düşünce yapınıza yerleşmesi gerekir.

Heap - Stack - Garbage Collector

Çok zorunlu olmasa da java 'nın arka planda hafıza yönetimi konusunda bilgi sahibi olmakta fayda var. Hangi alanlar nasıl yönetilir, ne anlama gelir sorularına bakılabilir. Garbage collection, yani kullanılmayan verinin silinmesi ne demektir ve kullanılmayan veri ne anlama gelir soruları da önemli oluyor. Çünkü konunun içinde bir yerde java 'nın call by reference çalışması da geçecektir.

Buraya kadar java 'ya nasıl emir vermemiz gerektiğini keşfetmiş oluyoruz. Biz 1 satır yazıyoruz o arka planda fırtınalar koparıyor. Bu aşamada java öğrenmeye ve yazmaya isteğiniz olup olmadığını keşfedersiniz. Bu dilin sizi nasıl bir yere doğru götürdüğünü görebiliyor olmanız lazım. Artık dili tanıdığınız noktada dil ile tasarımlar yapmaya başlıyorsunuz.

Encapsulation - Abstraction - Immutability - Inheritance - Polymorphism

Bu başlıklar tabi ki object oriented programming kavramlarımız. Burada biz neden OOP yapıyoruz, yapmasak ne olurdu gibi soruları açıklayabilmek gerekiyor. Neden C gibi dümdüz kitap gibi kod yazmıyoruz da sürekli sınıflar, abstract yapılar, interface 'ler, override 'lar gibi kavramları konuşuyoruz? Sınıfların birbirleri ile ilişkisinin olması neden gerekli olabilir? Tabi bu konular artık aşırı soyuta kaçtığı için sadece teknik terimlerle anlaşılmıyor. Hatta bana sorarsanız havalı kelimelerle bu konuları anlatmak hiçbir işe yaramıyor.

Bu soyut kavramları yazıp sonuçlarına şahit olmak gerekiyor. Önce bu kavramları kullanmadan nasıl düşündüğümüzü ve nasıl sonuçlar elde ettiğimizi ve sonrasında nelere sebep olduğunu görmemiz gerekiyor. Yoksa ileride göreceğimiz abstract sınıflar veya interface 'ler veya değişik injection 'lar bize anlamlı gelmez. Dışarıdan bakılınca bazı kütüphane veya framework 'ler hatta dökümantasyonda yazılan ifadeler bile size keyfi yazılmış gibi gelecektir. Java konsensusu burada başlıyor.

Exception handling

Hata yönetimi konusu java 'nın kendisi için en öncelikli konulardan olmasa da bilinmesinde fayda görüyorum. Üzerine uzun uzun yazılacak bir konu değil belki ama projeleriniz büyüdükçe dertleriniz de büyüyor ve çeşitleniyor. Hata yakalama konusunda sadece kod hatası değil mantık hataları veya sistem hataları olması durumunda ne gibi yaklaşımlar mümkündür gibi sorular sorulabilir.

Generics - Annotations - Reflection

Benim verdiğim eğitimlere katılan kişiler bu 3 konuya ne kadar önem verdiğimi bilir :) Özellikle annotation ve reflection kavramı ilk başta havada kalsa da bir noktada mutlaka bilinmesi gerekiyor. Daha sonra kütüphanelerde veya framework 'lerde karşımıza çok çıkıyor çünkü. Burada örneğin generic yapısı olmadan collection sınıfları var olabilirdi ama sadece object tutabilirdi ve type safety 'yi sağlamak zorlaşırdı. Annotation kavramı olmasa idi reflection ile kodlara eriştiğimizde metodların veya sınıfların içerisinde neler olduğunu veya neden var oldukları bilgisini sunamazdık. Zaten reflection olmasa idi annotation ihtiyacı da duymazdık.

Reflection ise java ile java 'yı görmek ve çalıştırmaktır. Buna neden gerek var sorusunun cevabı dependency inversion veya inversion of control ile ilgilidir. Bu 2 konunun neden var olduğunu da sormalıyız tabi ki. Muhtemelen framework yazarak insanlara altyapıyı sunup yukarıda bunları işleten kodlar yazabilmek için diye cevap verebiliriz. O zaman neden framework yazıyorlar diye sorabiliriz. Bu soruyu da sanırım framework 'leri yazanlara sormak gerekiyor :) Çoğunlukla kodları standartlaştırmak ve üzerinde geliştirme yapmayı kolaylaştırmak adına yazılıyorlar diyebiliriz.

Design Patterns

Tasarım desenleri konusu java 'dan tamamen bağımsızdır. Ama java geliştirciisi iseniz tasarım desenlerinin java 'da nasıl implement edildiğini görmelisiniz. Bu konu biraz da vizyon ile alakalı. Örneğin size elektrikli aletlerle ilgili bir kavram olan "adaptör" kavramını söylediğim anda aklınıza içi karmaşık ama dışarıdan bakınca basit bir elektronik parça geliyordur. Bu sayede detayları ve uygulaması değişebilen fakat ana teması ve işlevi belli olan bir mekanizmayı kolayca birbirimize ifade edebiliyoruz. Bu mantığın aynısı tasarım desenlerinde de geçiyor. Belli bir desen size herkesin anlayabileceği bir rehber sunuyor.

Threads – concurrency

Biraz ekstra bence bu konu ama genel kültür olması açısından bilmekte fayda görüyorum. Çok detaylı olmasa da java 'da thread sınıfına ve runnable ve callable mantıklarına bir göz atılabilir. Thread 2 sebepten oluşturulur. Ya işlemi parçalara bölüp performansı arttırmak için yada aynı anda birden fazla işi yürütebiliyor olmak için. İkisi günün sonunda benzer görünür ama birisi içerisinde wait notify gibi noktalara girer, diğeri sadece her biri ayrı telden çalan işlemler oluşturur. Yani konunun detayları var tabi ki ama bir sunucunun thread 'ler ile çalıştığını ve nasıl çalışabildiğini anlayacak kadar bilmek yeterlidir diye düşünüyorum.

Burada bir not: Bilgisayar mühendisliği bölümünün veri yapıları, algoritmalar, işletim sistemleri ve bilgisayar ağları dersleri de hayati öneme sahip. Bu dersleri hiç görmeden yazılım öğrenmeye başlamak, arabanın motoru konusunda bilgisi olmadan yarışçı olmaya çalışmaya benzer.

JDBC

Java ile veritabanına bağlanıyorsanız yolunuz mutlaka JDBC 'den geçecektir. Veritabanı başlığını alt kısımlarda yazdım java silsilesini bozmamak adına. Bu noktada jdbc dediğimiz yapının bir standart olduğunu, bir JSR karşılığının olduğunu ve hatta bu JSR 'lerin bizim java hayatımızda çok şey değiştirdiğini bilmek gerekiyor. Çünkü JDBC ile veritabanına bağlanmak için yapmanız gereken topu topu 3 adım var. Connection açmak, statement oluşturmak ve gerekli query veya execute 'u çalıştırmak. Varsa Resulset 'i alıp okuyup connection 'ı kapatmak. Ama konu aslında JDBC 'nin nasıl olup da farklı veritabanlarında çalışabildiği ve neden böyle bir standardizasyona gidildiğini anlamak. Kodlarda interface metodları çağırdığımız halde nasıl oluyor da gerçek class 'ların metodları harekete geçiyor mesela?

Restful services

Önce şunu belirteyim, SOAP servisleri adamdan saymıyorum :) Daha doğrusu soap servislerin çoğunlukla sizi monolitik uygulamalara doğru götüreceğini düşünüyorum. Bu yüzden java ile soap servisler tüketilebilir mi derseniz evet ama ben yapmazdım diyebilirim.

Bu noktada artık web uygulaması nedir, tomcat veya jboss veya glassfish nedir gibi sorular giriyor hayatımıza. Çünkü desktop uygulamaları yapmadığımız için uygulamalarımıza web üzerinden erişiyoruz. Bu yüzden java ile bir web uygulaması nasıl sunulur ve erişilir konusuna bakmak gerekiyor. Her ne kadar restful servis konusu anlaşılması kolay olsa da java 'daki altyapısı yeterince karmaşık. Maalesef genelde java karmaşık bir dil. Ben bu konuda şu soruyu sorarak başlıyorum: Benim bilgisayarımdaki bir java metodunu kendi bilgisayarınızdan nasıl çalıştırabilirsiniz?

Bu sistemi oturtmak için network nedir, OSI katmanları nedir, ip port nedir, server servlet nedir, request ve response nedir sorularının cevabını verebiliyor olmak zorundasınız. Sonra konunun reflection ve annotation 'lar ile ne alakası var diye düşüneceksiniz. Zaten bu kavramları oturttuktan sonra restful servisler konsept olarak çok kolay gelecektir. Hatta belki de bu yazıyı okuduğunuza göre restful servisin ne olduğunu bile biliyorsunuzdur. Java 'da restful servisi ayağa kaldırabilecek jersey veya resteasy gibi kütüphaneler veya jakartaee gibi yada spring framework gibi devasa framework 'ler var.

Yol ayırımı 1

Bu noktada java ile framework 'ler konusuna girmek istiyor musunuz sorusunu kendinize sorabilirsiniz. Örneğin sadece jersey ile restful servisler yazıp bunu glassfish veya payara üzerinde çalıştırabilirsiniz. Bu şekilde backend 'iniz hazır olur ve ön tarafa bir reactjs web uygulaması veya bir mobil uygulama koyabilirsiniz. Eğer devam edecekseniz JakartaEE veya Spring framework seçenekleri mevcut. Bu durumda muhtemelen Spring framework 'ü tercih edeceksinizdir. Ben yine de 2 yolu da yazayım. Spring framework 'ü daha çok kullandım ama Jakarta 'yı da kurcaladım ve bir blog yazısı yazdım, dilerseniz bakabilirsiniz.

JavaEE – JakartaEE

Java ile framework kullanmak istiyorsanız ama spring framework size fazla karmaşık geliyorsa JakartaEE ve EJB konularına girebilirsiniz. Eskiden yazılan enterprise java uygulamaları günümüzde daha anlaşılır bir şekilde geliştirilebiliyor. Tabi ki spring cloud 'da olduğu gibi service registery veya resillience gibi kavramlar jakarta 'da bulunmadığı için bir mikroservis uygulaması geliştirmek henüz çok anlamlı görünmüyor. Ama Bir load balancing sistemi arkasında jakarta restful servislerini koyarak da güzel bir sistem tasarlanabiliyor.

JakartaEE yani eski adı ile JavaEE kullanmak istiyorsanız jakarta 'nın içindeki spesifikasyonları incelemek gerekir. Örneğin security ile ilgili yada bean injection ile ilgili yada JPA ile ilgili ne özellikleri var diye aramak gerekiyor. Günün sonunda bean nedir, nasıl var olur, nasıl inject edilir ve bütün bu sistem neden var (IOC) sorularını da cevaplandırabiliyor olmak gerekiyor.

Spring framework

Eskiden spring yoktu buralar hep xml dosyaları ile dolu idi. Şimdi spring framework çıktı ve hem dependency injection hem inversion of control konularında bize yardımcı oluyor. Bu noktada artık spring framework 'ü nasıl kullanabilirim, bana neler sağlıyor sorularına odaklanmak gerekiyor. Arka plandaki yönetimini ve mantığını bilmek zorunda değilsiniz ama yerine göre doğru kullanmak için spring 'i tanımak da gerekebiliyor. Unsatisfieddependencyinjection nedir ve neden oluşabilir diye sormak gerekiyor. Tabi ki Spring framework aslında javaee üzerine kurulmuş bir framework. Bir stack trace örneğine baktığınızda jakarta servlet 'inden geçtiğini görüyorsunuz. Bu stack trace 'leri okuyabilmek gerekiyor.

Spring framework dediğimizde xml konfigürasyonu veya bean ile java konfigürasyonu mevcut. Kendi içinde modüller şekilde projeleri var. MVC, JDBC, Security ..vs gibi. Spring framework kendisini belli teknolojilere entegre ediyor veya teknolojiler kendini spring 'e entegre ediyor. Bu akışı ve dünyayı anlamak gerekiyor. Yoksa yazdığınız kodlar sadece ezbere copy paste oluyor. Zaten bu aşamada spring framework 'ü kullanmak için algoritma bilgisi gerekmiyor, ezbere de olsa spring kullanabilirsiniz. Fakat bir sorun çıktığında veya bir yanlış yaptığınızda hatayı nerede yaptığınızı bulmak çok kolay olmayabiliyor.

Bu noktada, yani spring veya jakarta ile çalıştıktan sonra, Tomcat 'in web sitesine girip oradaki tanımına bakmanızı şiddetle öneriyorum. Orada kabaca servlet implementasyonudur anlamına gelen bir ifade var. O tanımın ne demeye çalıştığını anlayabilmek gerekiyor. Bu ancak spring framework veya jakarta ile uzun süre çalıştıktan sonra mümkün :)

Spring boot

Spring boot dediğimizde cevaplamanız gereken ilk soru spring boot neden var? Çünkü eğer spring boot 'un gerekliliğini göremiyorsanız yeterince spring framework ile uğraşmamışsınızdır. Aslında spring 'in sürekli konfigürasyon yaptırmasından ve birbirinden kopuk bağlantılarından bıktığınız yerde spring boot 'un otokonfigürasyon cenneti olduğunu görüyorsunuz. Bu gerekliliği gördükten sonra 70 satır stack trace üzerine kurulu olan bu sistemi bir sihirbazlık numarası gibi görmek yerine MR 'ını çekebilirsiniz. Bu noktada abstraction seviyesi çok yükseliyor.

Spring boot özelinde en çok neleri otomatik yaptığını anlamak gerekir diye düşünüyorum. Çünkü bir şekilde internette çokça kod örneği bulabiliyorsunuz zaten. Data JPA güzel çalışıyor, tabi ki JDBC de çalışıyor, actuator ve internationalization güzel çalışıyor, swagger ile kolay entegre olabiliyor. Bunları kullanmış olmayı tercih ederim. Sonrasında daha da ilerisi spring cloud ile mikroservis nasıl yapılır sorusuna bakılabilir.

Yol ayırımı 2

Backend bence bitti. Tabi ben bitti diyorum ama sizin için aylar geçmiş olabilir :) Bu noktada frontend tarafını nasıl yapacağınıza karar vermeniz gerekiyor. Tamamen bağımsız bir javascript framework 'ü mü kullanacaksınız, react angular vue gibi, yoksa MVC ile projeyi yapıp backend 'de arayüzü render edip gönderecek misiniz? Karar tabi ki sizin projenize ve teknik yeterliliğinize ve yeteneğinize göre değişecektir. Frontend kısmından benim bahsetmek çok mantıklı değil esasında backend developer olduğum için ama bildiğim kadarı ile yazayım.

Thymeleaf - JSP

Thymeleaf veya JSP (belki de JSF de katılabilir) MVC projelerinde server tarafında java ile desteklenerek render edilip frontend 'e yani browser 'a gönderilen yapılardır. Restful servis yerine MVC projesi oluşturursunuz. Thymeleaf çoğunlukla Spring Framework 'e entegre olmuş görünüyor ama Jakarta ile de çalışıyor. JSP 'de çoğunlukla eski teknoloji olduğu için Jakarta tarafına entegre olmuş gibi görünüyor ama sanırım Spring ile beraber de çalışıyor. Bu ikisi de birbirine çok benziyor temelde ve alternatifleri de mevcut ama en popüler olanlar bunlar.

Bu teknolojiler servlet tarafından java ile işlenen dinamik ekranlardır. Mesela ekranda güvenlik kriterlerine göre görünmemesi gereken şeyleri gizleyebilirler, döngüler ile dinamik bir şekilde listeler görüntülenebilir, ekrandan formlar alınıp servlet tarafına iletilebilir ...vs. Hatta dilerseniz üzerine javascript bile ekleyebilirsiniz kendinizce ama pure javascript veya jquery olacaktır. Ama genelde bu sayfalar görünüşü itibarı ile statik, hazırlanışı itibarı ile dinamiktir. Arka planda security ile çalışabilmeleri sayesinde her türlü büyük sistemde production ortamında kullanılabilir.

JQuery - React - Angular - Vue ama önce Javascript

Frontend konusunda ayrı bir uygulama yazıp restful servis ile backend 'inize bağlanacaksanız öncelikle javascript üzerine çalışmak gerekecektir. Çünkü eskisi gibi statik HTML sayfaları yazmıyoruz. Dinamik sayfalar ise javascript ile çalışıyor. Backend ağırlıklı fullstack geliştirici olacaksanız detaylı javascript bilmek gerekmeyecektir. Ama react angular gibi javascript kütüphanelerini tam manası ile anlayabilmek için bazı kavramları oturtmakta fayda var. Fonksiyon nedir, javascript object oriented çalışır mı, verileri ve event 'leri nasıl yönetir veya dönüştürür gibi sorularımız mevcut.

Bunların üstüne çok fazla kurgulanmış JS framework 'leri var ama onlara dalmak istemezseniz JQuery zaten güzel bir javascript kütüphanesi olarak bir seçenek. İçinde animasyonlardan css değiştirmeye, dinamik component oluşturmaktan ajax request 'lerine kadar gerekli herşey var. Ama yazdığınız kodlar framework kodları kadar derli toplu olmayabiliyor. Zaten bu noktada da küçük bir karar vermek gerekiyor, tamam mı devam mı? Devam ise JS framework 'leri geliyor.

Reactjs, angular ve vuejs çok sık duyduğum framework 'ler ama benim frontend konusunda uzmanlığım olmadığı için detaylı ve geniş bilgim yok. Son zamanlarda NextJS de biraz popüler olmaya başladı. Benim gördüğüm kadarıyla Angular gelişmiş ama fazla karmaşık görünüyor. VueJS basit ama desteği kısıtlı ve örnek bulmak zor görünüyor. Reactjs sanki tam ortada duruyor gibi. Nispeten component tasarımı üzerine eğilebileceğiniz, çok karmaşık olmayan ve büyük bir kullanıcı grubu olan bir framework gibi görünüyor. Tabi ki bu dilleri mümkünse Typescript ile yazmanızı tavsiye ederim. Java ile object oriented programming mantığına alışkın oluktan sonra bu düşünce yapısını değiştirmek zor oluyor. Typescript ise OOP 'e en çok benzeyen yapıyı sunuyor.

Hibernate, Unit Test, Security, JWT, Docker ??

Bu başlıklara sıra gelecek mi acaba diye düşünüyorsanız aslında hayır :) Bu başlıklar olmazsa olmaz değil ama sizin fullstack geliştiricilik skalanızı büyütecektir. Hibernate ORM ben her ne kadar sevmesem de JDBC yerine kullanılabilecek bir veri modelleme ve veritabanına erişme kütüphanesidir. Spring ve Jakarta ile rahatlıkla kullanılabilmektedir. Burada persistence context kavramını çok iyi anlamak gerekiyor. Fakat sonrasında da modeller arası ilişkileri doğru şekilde annotation 'lar ile yazabilmek de hiç kolay değil.

Unit test yazmak java uygulamalarında Junit ile mümkün ve kolaylıkla yapılabiliyor. AssertJ ile beraber testlerinizi yazıp doğrulamalar yapabiliyorsunuz. Tabi ki Maven 'ı da yol üstünde bir yerde öğrendiğinizi varsayıyorum. Maven ile test klasöründeki testler otomatik çalıştırılıyor. Tabi ki günün sonunda en kolay testler Spring boot ile yazılıyor. Sistemin entegrasyonu çok güçlü çünkü. DB katmanını veya MVC controller 'larınızı veya bütün uygulamayı ayağa kaldırarak testler yazmanız mümkün.

Security ise çok geniş bir konu. Sistemde güvenliği nasıl sağlayacaksınız önce buna karar vermek gerekiyor. Eğer kullanıcı adı ve şifre ile giriş yapıp ekranları dinamik getirmek istiyorsanız hem jakarta 'da hem de spring 'de endpoint 'lerinizde veya MVC sayfalarınızda altyapılar mevcut. Restful servis yazarsanız çoğunlukla JWT yapısı kullanılıyor ve istediğiniz JWT kütüphanesini yine hem jakarta 'ya hem spring 'e entegre edebiliyorsunuz.

Docker ise ekstradan öğrenebileceğiniz bir konu. Sanal makine ve sanallaştırma kavramları konusunda bilginiz varsa ve linux ile az yada çok çalıştıysanız docker 'ı öğrenmek çok zor olmayacaktır. Zorunluluk değil ama size katkısı mutlaka olacaktır.

Bir de CI/CD kavramlarına göz atabilirsiniz bu aşamada. Bu kavramlar sistemin test, build ve deploy gibi süreçlerinin otomatize edilmesini sağlıyor. Genelde ekstra araçlardan yardım alınıyor, jenkins veya sonarcube gibi. Kendinize bir sistem kurup kodu yazıp kaydettiğiniz anda production 'a çıkmasını sağlayabilirsiniz.

Database

Veritabanları ister istemez girmek zorunda kalacağınız bir konudur. Günümüzde temelde 2 'ye ayrılıyorlar, relational ve nosql şeklinde. Relational olanlarda Oracle, MSSQL, MySql, PostgreSql en çok bilinenleri oluyor. Nosql olarak da MongoDB, Couchbase, Redis benim aklıma gelenler. Relational veritabanı kullanıyorsanız tablo nedir, view nedir, constraint 'ler (primary key, foreign key, unique, check) ne işe yarar, view nedir sorularını cevaplandırabiliyor olmak gerekiyor. Sonrasında kendi kendinize bazı join 'ler yapan veya group by içeren sorgular yazacak kadar SQL dili öğrenmeniz gerekecektir. Sisteminiz veritabanında çok kompleks işler yapıyorsa veya çok büyük veritabanları ile çalışıyorsanız, SQL konusunu detaylı öğrenmek zorunda kalabilirsiniz.

Hayırlı olsun, artık kod yazabilirsiniz

Tabi biraz da şaka ile karışık, kendi kendine yeten bir developer olmanız için bilmeniz gerekenler veya gerekebilecekler listesi kadar. Uzun bir yol ve çok kalabalık bir liste ama emin olun bundan sonrası da var. Muhtemelen daha büyük sistemlerde bu başlıkların hepsini daha detaylı bilmek zorunda kalırsınız. Mikroservislere bakmak isterseniz Spring Cloud dediğimiz devasa dünya sizi bekliyor. Sonrasında da SAGA, CQRS konularına bakabilirsiniz. Bu sistemlerde RabbitMQ, Kafka veya Redis çok kullanılabiliyor. Bundan sonra bu araçları tanımaya ve kullanmaya başlıyorsunuz zaten.

Bu konuları sıradan ve temiz bir şekilde geçmek gerektiğini düşünüyorum. Çünkü yeri geliyor spring boot ile ilgili dökümantasyonda okuduğunuz 1 cümle, ilk konularda geçirdiğiniz 4-5 günlük bilgiyi kapsıyor. Bu süreçten sonra başarılı olduğunuzu test etmek istereseniz kendinizi 2 şekilde test edebilirsiniz. Kodların içinde, uygulamada veya framework 'te kaybolmadan yolunuzu bulabiliyor musunuz? Gerektiği yerde detaya inip büyük resmi gözden kaçırmadan geliştirme yapabiliyor musunuz? Bu sorular bu aşamada size birşeyler ifade etmeli. Uzmanlık tam bu noktada başlıyor. Ayrıca bu teknolojilerin veya kütüphanelerin bazılarını bir araya getirebiliyor musunuz? Bunu da kontrol edebilirsiniz. Sadece size gösterilen veya öğretilen şekilde mi kod yazabiliyorsunuz, yoksa kendiniz farklı bir kod deneyebiliyor musunuz?

Bu konularda mentörlük arayabilirsiniz veya eğitim arayabilirsiniz. Bu sürecin eğitim karşılığı haftada 5 gün olacak şekilde yaklaşık 3 ay oluyor. Yani minimum 10 hafta diyeyim size ama siz 15 hafta gibi düşünebilirsiniz. Kendi kendinize veya arkadaşlarınızla kod yazarak, internetten örneklerle çalışacaksanız 9 - 12 ay kadar uğraşmanız gerekebilir. Bu süreler size abartılı geliyorsa bu yazı size pek birşey ifade etmemiş olabilir :) Umarım rehber olması açısından faydalı olur. Bir sonraki yazıda görüşmek üzere :)


Bir yorum yazabilirsiniz