Java Nedir? Javaya Nereden Başlamalıyım?
Java Nedir?
Java, ülkemizde çok ciddi anlaşılabilmiş ya da yerinde, yeterince kullanılmış bir programlama dili değil. Java, bir Nesne Yönelimli Programala dili olarak tarif edilse de çok uzun zamandır bir dil olmaktan çıkarak platform haline dönüşmüştür. Yani Java ile birbirinden çok farklı özelliklere sahip apiler geliştirilmiştir. Bu apilerin kimisi framework düzeyinde iken kimisi programlama dili seviyesine kadar etkindir. (Spring, Scala)
Bu noktada Java’daki bu çeşitlilik; yukarıdaki görseldeki gibi Java ile ilgilenen bir çok arkadaşımız için kafa karışıklığına neden olabilmektedir. Bu maili atan kadar azimli olanlarımız bir yere kadar gelebilmekte, erken sıkılanlar ise yol yakınken dönmektedirler. Gelin birlikte kısa bir Java turu yapalım. Bu tur ile Java ve Java Framework’leri üzerine bir beyin fırtınası koparalım.
Java, open source yapısı ile bir community/ekosistem oluşturarak birçok framework/apinin geliştirilmesine olanak sağlamıştır, sağlamaktadır. Bunlardan en meşhurları JSF, Hibernate, Spring gibi isimlerle sık duyduğumuz framework’lerdir. Bu framework’lerden bazıları o kadar ileri seviyededir ki kendilerine ait ekosistemleri vardır. Bazı noktalarda Java ekosisteminden bile daha etkin çalıştıkları görülür. Bkz. Spring Framework. Seam…
Eldeki bu verileri toparlarsak Java, bir nesne yönelimli programlama dili ve ekosistemi olarak kendi içerisinde birden çok ekosistem çıkmasına imkan sağlamıştır. Bu durum Java’nın hem zenginliği hem de dez avantajıdır.
- Aslında Java + Framework’ler bir yap bozun olmazsa olmaz parçalarıdır. Java + Framework birleşimi yerli yerinde kullanılırsa yani yap-boz doğru birleştirilirse bir sanat eseri ortaya çıkar.
- Bu birleştirme doğru yapılmazsa yamalı bohça durumu ortaya çıkar. (Yamalı bohça durumu ülkemizdeki çoğunluk Java projeleri için geçerlidir.)
Java üzerindeki bu kafa karışıklığını ya da bilgi bulanıklığını giderebilirsek teknoloji-framework seçimi sadece yap-boz’un parçalarını seçmek kadar eğlenceli olacaktır. Buradaki doğru seçimler, tekonojik değeri yüksek sanat eserleri ortaya koymamızı sağlayacaktır. O zaman projedeki kritik nokta ya da projenin eşik değeri bu seçimlerdir. Peki doğru seçimler için ne yapabiliriz? Basitten karmaşığa doğru bir akış izleyelim.
Matematikte çarpma işlemi aslında arka arkaya toplama işlemidir. 2×3 denildiğinde 3 tane 2’nin toplanacağını bilinçaltı olarak düşünmemiz gerekirken, düşünmeyiz. Doğrudan toplama işlemi aklımıza gelmez çünkü çarpım tablosu ezberletildi, ezberledik. Yani işlemin mantığı ve asıl amacı ile hiç işimiz, hiç düşüncemiz olmaz, olmadı. Bu durum Java framework’leri için de aynen geçerlidir.
Java’da, JSP mantığı bilinmeden JSF kullanmak matematikte toplamayı bilmeden çarpmayı denemek gibidir. Aslında Java’daki tüm web teknolojilerinin atası JSP’dir denilebilir. Buradan baktığımızda JSF ile yapacağımız bir işlem aslında JSP tarafından yapılmaktadır. JSF, JSP’nin güzelleştirilmiş, süslenmiş halidir. JSF ile geliştirme yaparken çarpma-toplama ilişkisinde olduğu gibi görünürdeJSP’ye ihtiyacımız pek olmaz. Bu nedenle derine inmeyiz. Bu durum JDBC – Hibernate ilişkisi gibi bir çok Java framework’ü için geçerlidir. Tüm bu teknolojilerin anası Java ise tüm kötü seçimlerin anası kimdir?
Herhangi bir programlama dilini yarım yamalak öğrenip yamalı bohçalar geliştiriyoruz. Güzel, sanat eseri, şaheser düzeyinde projeler değil. Ben, sen, xyz şahıslarından herhangi biri Java’ya ait her framework ya da teknolojiyi bilmek zorunda değil, bilemez de. Ancak doğru bakış açısını yakalamakla yap-boz konusunda uzmanlaşabiliriz.
Örneğin Spring Framework, Dependency Injection konusunun etrafında kurulmuştur. Dependency Injection konusun ne olduğu Java ile nasıl yapıldığı hakkında bir fikir sahibi olunmadan Spring öğrenmekle sadece birkaç anotasyon kullanma ve konfigürsayon dosyalarını yönetmekten öteye gidilemez. Teşhisi koyduğumuza göre tedavi nedir?
Java’ya nereden başlamalıyım? Nasıl devam etmeliyim?
1- Java ile Nesne Yönelimli Programalama
Java dilinin kullanımı ve Nesne Yönelimli Programlama mantığı iyice öğrenilmelidir. Java’daki döngüler, sınıf hiyeraşirleri, nesne yapılandırmaları, hata yakalama gibi temel bilgiler en ince detayına kadar bilinmelidir.
2- Design Patterns & Effective Java
Java ile nesne yaratma ve yönetme işlemleri Tasarım Şablonları ve İleri Java konuları ile birlikte pekiştirilmelidir. Bu sayede Java ve Nesne Yönelimli Programlama konseptine ileri derecede hakimiyet sağlanmalıdır.
3- Java EE ve Web Bileşenleri
Standartları Java ekosistemi tarafından belirlenen JDBC, JSP, Jax-WS, Jax-RS gibi teknolojiler sadece Java standartları içerisinde öğrenilmelidir. Herhangi bir framework altında değil saf Java ile öğrenilmelidir.
4- Spring Framework ve Diğerleri
Spring, Hibernate, Seam, Guice gibi farklı ekosistem ve standartları olan Java Framework’leri arasıdan seçim yapılarak öğrenilmelidir. Bu seçim geliştirilecek, çalışılacak projeye göre yapılmalıdır. Sırf popüler diye yapılan seçimler çok can yakabilmektedir.
4- Android ile Mobil Programlama
Mobil geliştirme başlı başına farklı bir bakış gerektirse de Java bilmeden sonuca gidilemez.
Bu sıralamada 1 -> 2 -> 3 sıralaması bence asla bozulmamalıdır. 4’üncü sıradakiler proje ihtiyaçlarına göre değişiklik gösterebilir. İlk üç sıra neden bozulmamalıdır?
Temelinde Java ile geliştirilecek her projenin kaliteli olması için sıra ile
- Java diline çok iyi hakim olunmalıdır. (Madde-1)
- OOP paradigmasında yüksek performanslı yazılımlar geliştirebilmek için nesne yaratma, yönetme işlemlerine tam hakimiyet şarttır. (Madde-2)
- Java ile gerek proje geliştirme gerekse api/framework oluşturulmasında Madde-1 ve 2 kullanılmaktadır. Bu iki maddeye hakim olmadan üst seviye framework ve apilerin tam anlamıyla anlaşılması mümkün değildir. Örneğin Java ile nesne yaratma, yönetme işlemleri tam anlaşılamamışsa Spring’te dependency injection asla anlaşılamayacaktır.
- Standartı Java tarafından belirlenmiş web, veri tabanı framework’leri tam anlaşılmış olmalıdır. (Madde-3) Böylece bunların üzerine kurulan, kurgulanan ileri seviye framework’lere tam hakimiyet sağlanabilecektir. Bence en önemlisi Java’nın kendi api/framework’lerinin yeterli olduğu durumlarda bir başka framework’e ait bileşen kesinlikle kullanılmalıdır. Bu geliştirilen yazılımların mümkün olduğunca standartlar içerisinde olmasını sağlayacaktır. Standart içerisinde kalmak, geliştirilen uygulamaların kolayca genişletilebilmesi ve güncellenebilmesi demektir.
- Third Party dediğimiz başka ekosistemler tarafından geliştirilen framework’lerin amaçları net olarak anlaşılmalıdır. (Madde-4) Böylece bilinçli kullanım sağlanmış olur. Örneğin sadece ve sadece SQL yazmamak için Hibernate kullanımı kötü sonuçlar doğurabilir.
Projeye göre teknoloji seçimi yapılmalıdır dedik. Seçilecek teknolojilerin amaçları ve alt yapıları tam olarak anlaşılmamışsa asla o proje için uygun değillerdir. Gereksinimleri doğru ve yerinde olmayan projeler iş yapmayacağı gibi doğru projeler için yapılan yanlış teknoloji seçimleri de kaliteli iş yapmayacaklardır.
- Aşağıdaki görselde Java EE7 ye ait mimari diagram bulunmaktadır. Bu diagramda Java Api ‘lerinin birbirleriyle olan ilişkilerini bulabilirsiniz.
- Ayırca buraya tıklayarak tüm javaee-8-spec ‘ini inceleyebilirsiniz. Yine aşağıdaki görsel bu spec’ten alınmıştır.
Not: Maildeki tüm soruları cevapladık, geldik kitapla ilgili kısma.
ENTERPRISE JAVA kitabımızda birbiri ile bağlantılı konuları ard arda inceleyerek bu soruna bir nebze çözüm bulmaya çalıştık. Evet bu kitabı baştan sona güzelce inceleme fırsatın olursa aslında bir çok konunun birbirinin atası ya da çocuğu olarak ele alındığını görebilirsin. ENTERPRISE JAVA kitabımızda herhangi bir konunun önce Java’daki karşılığı ele alınmış ve sonra ileri seviye frameworklere geçilmiştir. Bu nedenle senin soruna cevabım evet olmakla birlikte bir çok Java başlığında seni çok daha ileriye götüreceğine emin olabilirsin.