JakartaEE ve Spring ile Hibernate, JDBC, Thymeleaf ve Security içeren başlangıç projeleri

Bu yazı "nalet gitsin" ifadesinin bir sonucudur :) Yaklaşık son 2 yıldır internet ortamında çeşitli kod örnekleri aradığımda ilgili, alakalı veya gerekli kodları bulmakta ciddi manada zorlanıyorum. Yazının son başlığında google 'da yaşadığım bu garip durumu açıklamaya çalışacağım. Bu durumdan dolayı tepemin tası attıktan sonra oturup java ekosistemindeki çeşitli kütüphanelerle yapılabilecek, nadir bulunan, güncel ve gerçekten çalışan birkaç başlangıç projesini mümkün olan en küçük konfigürasyonla hazırladım. Bu projelerdeki teknoloji karması JavaFX, OpenCV, Jakarta, JDBC, JSP, JWT, Rest, Hibernate, Spring Framework, Spring Boot, Spring JDBC, Spring JPA, Spring Security ve Thymeleaf 'i kapsıyor. Emin olun bu düşündüğünüzden daha zor oldu. Bazı teknolojileri bir araya getirilmesi zor olabiliyor. Bazı kodları bulmak ise neredeyse imkansız hale geldi. Ama bu konuya en sonda değineceğim.

Bu yazıda yazdığım kodları açıklamayacağım. Bunun yerine sadece size bu türlü projelere başlayabileceğiniz gerekli minimum konfigürasyonu sağlıyor ve birkaç önemli noktasını belirtiyor olacağım. Kodları olduğu gibi GITHUB 'dan alabilir ve çalıştırmaya çalışabilirsiniz. Bazı projelerin çalışması için bazı gereksinimleri var fakat bunu anlamak için kodları biraz incelemeniz gerekecektir. Bu gereksinimler çoğunlukla veritabanı ile ilgili. Gerekli küçük bilgiler proje kodlarının içerisinde mevcut. Bu projeler Ocak 2024 itibarı ile JDK 21 kullanan dünyanın en güncel projeleri olabilir. Buradaki bazı teknolojiler size eski yada gereksiz gelebilir. Ama bir şekilde bu yapılarla çalışacak olursanız bana teşekkür edeceksiniz :) Tabi bu konularda bilginiz yoksa kodlar size bir fayda sağlamayacaktır. Ayrıca son bir not daha. Bu projeler üzerinde çalışmak istiyorsanız SADECE 1 SATIR DEĞİŞİKLİK YAPARAK TEST EDİN !!!. Çünkü bu kısacık kodların arka planda çokça bağlantısı veya bağımlılığı mevcut.

Teknoloji çorbası listesi

Bu listenin özel bir sıralaması yok. Kendimce az popüler olandan çok popüler olana doğru sıralamaya çalıştım. İlerde github repository 'sini güncelleyebilirim. O durumda bu yazıyı da güncellerim. Veritabanına bağlanan bütün projeler postgresql kullanacak şekilde yazıldı fakat bunu kolayca repo katmanlarından değiştirebilirsiniz.

JavaFX

Eğer bir JavaFX desktop uygulaması yazmak veya eski bir projeyi yeni kütüphanelerle güncellemek isterseniz bu projeden yardım alabilirsiniz. Bu projede bazı örnek kodlar var ve javafx-maven-plugin ile module-info.java projenin önemli kısımları. Gerekli dependency 'ler paketlenmezse command line ile başlatılamayacaktır. Eclipse veya intellij ile main metod başlatılarak açılabilir.

OpenCV

Eğer görüntü işleme ile uğraşmak ve bunu javada yapmak istiyorsanız opencv kütüphanesini güncel şekilde bu projedeki gibi kullanabilirsiniz. Desktop uygulamaları JavaFX ile kolay yazıldığı için projeyi JavaFX ile yazdım, fakat Swing ile de yazılabileceğini biliyorum. Bu projenin en önemli tarafı da JavaFX için gerekenler dışında OpenCV.loadLocally() şeklindeki tek satır kod. Bu uygulama web kamerasından veya bir video dosyasından görüntü alabilir. Bilgisayarınıza ayrıca opencv kurup konfigüre etmek zorunda değilsiniz. Bağımlılıklar jar dosyası içerisinde paketlenmezse command line yerine eclipse veya intellij 'den main metodu başlatarak açabilirsiniz.

JakartaJDBCThymeleaf

Bu küçük uygulamada JakartaEE 10, JDBC ve Thymeleaf kütüphanelerini bir araya getirdim. Eğer spring framework kullanmak istemiyorsanız ve JavaEE içinde EJB 'ler ile çalışmaya alışkınsanız, güncel Jakarta kütüphanesi ile bu projeyi referans alabilirsiniz. Ayrıca frontend olarak popüler Thymeleaf arayüzünü de kullanıyor. Bu projede security yapısı bulunmuyor! web.xml dosyası ve InitializeSerletContext.java dosyasındaki kodlar çok önemli. Payara 'da çalışıyor ama Tomee üzerinde denemedim. Eğer JakartaEE 10 gerekliliklerini sağlıyorsa orada da çalışabilir.

JakartaHibernateEJBJSP

Bu proje de spring hayranı olmayanlar ve JavaEE alışkanlıkları olanlar için. Projede JakartaEE 10, Hibernate ve önyüzde JSP için (üstteki proje yardımı ile rahatlıkla Thymeleaf ile değiştirilebilir) gerekli basit konfigürasyonları bulabilirsiniz. Jakarta 'da spring data jpa 'da olan CrudRepository gibi hazır repository 'ler bulunmuyor. Bu yüzden Hibernate ile "org.hibernate.Session" ve CriteriaApi sınıflarının kullanımını gösterdim. JPA 'dan gelen entitymanager sınıfını nasıl kullanabileceğimi tam olarak bilemiyorum. Bir şekilde @PersistanceContext ile inject edilebilir belki ama öncesinde bir xml veya bean konfigürasyonu isteyecektir muhtemelen. JSP dosyalarının yerleşimi önemli idi bu projede Ayrıca JSTL ve JSP Taglib için 2 kütüphane bulunuyor. Bu projede güvenlik yapısı bulunmuyor. Payara 'da çalışıyor ama eğer JakartaEE 10 özelliklerine sahip ise tomee üzerinde de çalışabilir.

JakartaJDBCRest

Bu proje basit bir JakartaEE restful projesi. Repository olarak JDBC kullanıyor ve spring jdbc 'de olduğu gibi jdbctemplate gibi sınıflar burada bulunmuyor. Onun yerine pure java ile yazılıyor. Bu proje basit bir JAX-RS uygulamasını dependency injection ile kolayca geliştirilebileceğini gösteriyor. Yani spring framework kullanmak zorunda değiliz veya eski Jersey implementasyonuna bağımlı değiliz. Projenin yani servlet 'in başlangıç noktası olan Application.java çok önemli burada. Ayrıca beans.xml dosyasına da bir göz atmanızı tavsiye edebilirim. Bu projede security özellikleri bulunmuyor ve Payara 'da çalışıyor. Tabi ki JakartaEE10 özelliklerini sağlıyorsa tomee üzerinde de çalışabilir.

JakartaRestJWT

Bu biraz saç baş yoldurdu. Sizi düelloya davet ediyorum :) JakartaEE 10, CDI ve JWT ile rol bazlı güvenliği sağlayan bir proje yapmaya çalışabilir misiniz? Size bir ipucu da vereyim hatta. Kodlarda HttpAuthenticationMechanism ve @RolesAllowed yapılarını kullanacaksınız. Projenin amacı restful servis endpoint 'lerini roller ile erişime açabilmek. Restful servisler ise çoğunlukla JWT ile entegre olarak güvenlik katmanı sağladığı için JWT ile kullanıcıya göre token 'ları oluşturmak gerekiyor. Bu konuda bazı eksiklerim olduğu için umarım doğru şekilde kodlamışımdır diye düşünüyorum. Jakarta CDI anotasyonları biraz garip geliyor bana. Bu projenin her satır kodu önemlidir. Projeyi basit tutmak adına bu projede veritabanı bağlantısı bulunmuyor. Tabi ki siz kolayca bir repo katmanı inject ederek kullanabilirsiniz. Payara üzerinde çalışıyor ve eğer JakartaEE 10 özelliklerini sağlıyorsa tomee üzerinde de çalışır.

SpringHibernateJSP

Spring boot 'a geçiş yapmak istemiyor ve spring framework ile hibernate ve JSP çalıştırmak istiyorsanız bu projeyi referans alabilirsiniz. Bu projenin tomcat üzerinde çalışabilmesi için glassfish 'in jakarta.servlet.jsp.jstl kütüphanesini eklemek gerekiyormuş. Normalde jsp tag 'lerinden dolayı payara 'da çalışabiliyor çünkü. Tabi ki Jakarta servlet JSTL kütüphanesi de jsp render etmek için gerekiyor. Bu projede spring ORM kullanıyoruz, data jpa değil ve muhtemelen o repository 'ler otomatik konfigüre edilmezdi burada. defaultservlet-servlet.xml dosyası ve BeanFactory.java sınıfı önemli özellikleri barındırıyor. Hibernate için ayrı xml config dosyaları oluşturmadım, onun yerine java ile bean olarak set ettim. Repository katmanında hem entitymanager hem de hibernate SessionFactory kullanılıyor. Projede güvenlik katmanı bulunmuyor.

SpringHibernateThymeleaf

Spring boot 'a geçiş yapmak istemiyor ve spring framework ile hibernate ve Thymeleaf çalıştırmak istiyorsanız bu projeyi referans alabilirsiniz. Tomcat 10 'da çalışmaktadır. Bu projede spring ORM kullanıyoruz, data jpa değil ve muhtemelen o repository 'ler otomatik konfigüre edilmezdi burada. defaultservlet-servlet.xml dosyası ve BeanFactory.java sınıfı önemli özellikleri barındırıyor. Hibernate için ayrı xml config dosyaları oluşturmadım, onun yerine java ile bean olarak set ettim. Repository katmanında hem entitymanager hem de hibernate SessionFactory kullanılıyor. Projede güvenlik katmanı bulunmuyor.

SpringJDBCRest

Genelde restful servislerinde security katmanı oluşturmak daha kolay gibi. Bu projede de spring boot kullanmadan spring framework ile JDBC ve Restful servis örneği bulunuyor. Ayrıca restful servisin güvenliğini JWT sağlıyor. SecurityConfig.java sınıfı bu projenin en önemli kısmı olabilir. Sonrasında JWTAuthenticationFilter.java ve JWTAuthorizationFilter.java sırası ile önemlidir. Gerçekten veritabanından kullanıcı bilgilerini alıp spring framework 'e bildirecek birkaç satır kod eklenirse gerçek dünyaya uygun çalışır hale gelecektir. Tomcat 10 'da çalışmaktadır.

SpringJDBCThymemelaf

Bu proje de spring boot kullanmadan spring framework ile JDBC ve Thymeleaf 'i birleştiren bir proje. İçerisindeki BeanFactory.java sınıfı önemli konfigürasyonlar barındırıyor. Onun dışında gayet sade ve basit bir proje. Tomcat 10 'da çalışabiliyor.

SpringSecurityThymeleaf

Bu proje spring boot olmadan sadece spring framework ile Thymeleaf ve Spring Security 'nin nasıl bir araya gelebileceğini gösteriyor. Neredeyse her satırı çok önemli bu projenin. Ama BeanFactory 'deki "templateEngine.addDialect(new SpringSecurityDialect());" kodu benim 3 günümü aldı diyebilirim. Bu projede spring security ve thymeleaf ikilisinin sunduğu birçok özellik örnek olarak bulunuyor ve spring boot 'a mecbur değilsiniz. Projeyi basit tutmak adına kodlarda veritabanı bağlantısı yok fakat yukarıdaki örneklerden yardım alarak repo katmanı kolayca implement edilebilir. Tomcat 10 üzerinde çalışabiliyor.

SpringbootJDBCRest

Burada spring boot örneklerine başlıyorum. Bu proje jdbctemplate ve restful servisleri spring boot 'un autoconfiguration 'ları sayesinde kolayca çalıştırıyor. Yine bu konfigürasyon kolaylığı ile spring security de kullanılıyor. Ayarların bulunduğu SecurityConfig.java en önemli sınıf bu projede. Ayrıca bir de SecurityConfigAlternative.java isimli sınıf yazdım. Bu sınıf sayesinde metodlarda anotasyonlar kullanarak yani requestmatcher kullanmadan security özellikleri kullanmak mümkün. Bir de UserService.java sınıfına göz atılabilir. Aslında config paketi altındaki her sınıf önemli görünüyor :) Doğal olarak tomcat 10 da çalışıyor ki o da spring boot tarafından otomatik konfigüre ediliyor.

SpringbootJPAThymeleaf

Bu listedeki en popüler teknoloji stack 'i bu sanırım. İçinde spring security, tabi ki JWT yerine MVC security, bulunuyor. JPA repository otomatik geliyor. Thymeleaf için gerekli bean 'ler hazırlanıyor. Güvenlik ayarlarının bulunduğu SecurityConfig.java sınıfı en önemli sınıf gibi görünüyor. SecurityConfigAlternative.java dosyasındaki ayarlar ise requestmatcher yerine anotasyonlar ile rol bazlı erişim yapabilmenizi sağlıyor. Thymeleaf ve spring security 'nin sağladığı özellikler de mevcut. Tabi ki application.properties dosyası da spring boot projesinin hayati dosyasıdır. Otomatik konfigüre edilen tomcat 10 ile çalışmaktadır.

Reactjs ile usecontext kullanımı (Bonus)

Bu da sürpriz bir bonus. Çünkü sanırım benim yazacağım örnek internetteki en basit ve anlaşılır UseContext örneği olabilir. Son zamanlarda reactjs üzerine çalışıyorum ama arayıp bulduğum bütün usecontext örnekleri garip bir şekilde karmaşık bir iş mantığı ile yada gereksiz kütüphaneler ile yada gereksiz bir customized hook mantığı ile geliyor yada bir yerden bulunan kodun aynısının kopyala yapıştır yapılmış olduğunu görüyorum. Hatta bazıları direkt olarak hatalı zaten çalışmıyor. Ben de biraz uğraştım ve dünyadaki en basit ve kullanılabilir örneği hazırlamaya çalıştım. Çünkü toplamda ihtiyacımız olan kod 20 satırdan fazla bile değil. UseContext nedir derseniz kısaca bütün component 'lerinizi sarmalayıp ilişkili olmayanlar arasında veri transferi yapabilen bir üst state yapısıdır diyebilirim.

Bu örnek basit bir login işlemi ile kullanıcı ismini saklamak ve başka bir component 'te güncellenmesini sağlamak üzerine kurulu. Bunun için UsernameContext.tsx dosyasını aşağıdaki gibi yazarak başlayabiliriz.

		
import { createContext, useState } from "react";

// context 'in data type bilgisi, ilk değeri değil !
export const UserContext = createContext({
  usernameVariable: "",
  setterforusername: (somestring: string) => {},
});

// provider context 'in getter setter mantığıdır
export const UserContextProvider = ({ children }) => {
  // state değişkenini localstorage 'dan getiriyorum, cookie gibi oluyor ama zorunlu değil
  const [username, setUsername] = useState<string>(localStorage.getItem("username") as string);
  // provider dışarıda kullanılırken içeride state güncelliyor
  return (
    <UserContext.Provider
      value={{
        usernameVariable: username,
        setterforusername: setUsername,
      }}
    >
      {/* sarmaladığın bütün component 'leri render etme komutu */}
      {children}
    </UserContext.Provider>
  );
};
		
	

Bu noktadan sonra muhtemelen bir index.tsx dosyanız olacaktır, anasayfa mahiyetinde. Aralarında bilgi iletişimi yapabilmek için bütün component 'lerinizi provider ile sarmalayın.

		
import React from "react";
import { UserContextProvider } from "./components/context/UsernameContext";

const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement);

root.render(
  <React.StrictMode>
    <UserContextProvider>
	  {/* bütün component 'ler buraya */ }
    </UserContextProvider>
  </React.StrictMode>
);
		
	

Sonrasında muhtemelen bir yerde login işleminiz vardır. Bu dosyada biraz gereksiz kod var ama button 'a tıklandığında logini simule ettim. Sonrasında ana ekrana dönüş için bir kod var. Bu işlem sayfayı refresh etmiyor.

		
import { Button } from "react-bootstrap";
import { useNavigate } from "react-router-dom";
import { UserContext } from "../context/UsernameContext";
import { useContext } from "react";

export default function LoginComponent() {

  const mynavigate = useNavigate();

  const ourUserContext = useContext(UserContext);
  
  // çok büyük ihtimalle axios ve react router kullanıyorsunuzdur
  // username değerini context 'e set ediyoruz burada

  function handleSubmitAdmin() {
    axios.post("someurl/login", { username: "admin", password: "password" }).then((response) => {
      // localstorage 'da kullanıcı adı tutuyoruz, zorunlu değil ama cookie mantığı gibi
	  localStorage.setItem("username", username);
	  // context 'in setter metodu tanımlanmıştı
	  // önemli olan tek satır kod budur !!!
      ourUserContext.setterforusername(username);
	  // react router ile sayfayı refresh etmeden yönlendirmek
      mynavigate("/");
    });
  }

  // ben bootstrap button 'ı kullandım ama bildiğimiz react button 'ı da olurdu
  return (
      <Button variant="outline-success" onClick={handleSubmitAdmin}>
        Admin Login
      </Button>
  );
}
		
	

Buradaki ana amaç sayfayı refresh 'lemeden diğer bir component 'in kendiliğinden güncellenmesini sağlamaktı. Bunun için herşeyi provider içerisinde koyduk. Muhtemelen solda yada yukarıda bir yerde bir menünüz vardır. Orada kullanıcı adı yazmak isteyebilirsiniz. O component içerisinde 2 satır kod ile diğer taraftan atanan context 'e erişebilirsiniz.

		
import { useContext } from "react";
import { UserContext } from "../context/UsernameContext";

export default function MenuComponent() {
  
  const ourUserContext = useContext(UserContext);

  return (
      <h4>{ourUserContext.usernameVariable}</h4>
  );
}
		
	

İşte usecontext bu kadar. Gidip google 'da aramayın kafayı yersiniz. Konunun resmi dökümantasyonu bile yetersiz burada. Bu noktada google 'da birşeyler aramanın bugünlerde çok zorlaştığını anlatmaya başlayabilirim sanırım. Bardağı taşıran son damla usecontext olmuştu benim için.

Ben sizin yazacağınız kodun... :D

Yaklaşık 15 yıldır durmadan kod yazıyorum. Hayatımda hiç bu kadar fazla zorlandığım olmamıştı internette birşey ararken. Bu sadece google 'ın hatası değil, aynı zamanda kopyacıların, hırsızların, fırsatçıların da hep birlikte suçu. Size neden bu blog yazısındaki projelerin neredeyse bir hazine değerinde olduğunu ve benim neden bu kadar bıktığımı anlatayım.

Google zamanında kelime arama motoru idi. Yaklaşık son 2 yıldır, sanırım AI konusunun da gelişimi ile, context (bağlam) arama motoruna dönüşmeye çalışıyor. Yazılımcılar genelde anahtar kelime arama özelliğine ihtiyaç duyuyor. Çünkü genelde spesifik bir koda ihtiyacımız oluyor denemek için. Bu tabi ki yazılım öğrenme aşamasında iyi birşey değil ama o başka konu şimdilik. Google ise kendini bir yapay zeka araması gibi lanse etmeye çalışıyor ve aradığın şeyi veya yaşadığın problemi tanımlamanı bekliyor. Yani eskiden bizler kelimeler ararken şimdi google 'a sorular soruyoruz. Mesela "şu kütüphaneyi çalıştırırken şu özelliği nasıl set edebilirim" veya "bu kodu kullandığımda neden bunlar oluyor" gibi sorular. Bunun daha faydalı olacağını mı düşünüyorsunuz?

Hayır olmuyor !! Çünkü google veya başka herhangi bir yapay zeka günümüzde programlama konusunda vizyona sahip değil. Bizim işimiz algoritmalar ve tasarımlarla çok ilgili. Biz hikaye anlatmıyoruz veya önceden belirlenmiş kuralları işletmiyor. Google sorunuzu bir şekilde anlıyor (sanırım) ve kendince en anlamlı gördüğü sonucu getiriyor. Siz özellikle belli detayları aramaya çalışsanız bile sonuçlar kendi bildiği gibi geliyor. Farazi bir senaryoda mesela "jakarta ile bir filter yazıp içinde messagecontext oluşturduktan sonra bir restful endpoint 'i içerisinde inject edebilir miyim" gibi bir soruyu düşünün. Bu benim elimden geldiğinde detaylı hazırladığım bir soru. Ama google bu soruyu parça parça anlayıp size en popüler sonuçlarını getiriyor, ki bu popüler kavramına birazdan geleceğim.

Bu sorudan sonra google, messagecontext ve jakarta get request örneği bulup getiriyor. Ama hiç birisi gerçekten bu ikisini birleştirmiyor, ki benim istediğim de bu aslında. Burada vizyon dediğimiz şey eksik işte. Siz de mecburen gidip github 'da yada stackoverflow 'da aramaya başlıyorsunuz. Ama github 'da kod arama özelliği yok, ki bence mutlaka olmalı :D Stackoverflow 'da ise binlerce cevapsız soru var ama ilgili bir soru ve çözüm bulsanız bile çok değişik bir mantıkla yazılmış kodlar veya iş mantığının sonucunda oluşan hataları göreceksiniz. O yüzden google 'a dönüp çift tırnaklar ile arama yaparak direkt sonuç arayacaksınız. Ama bir göreceksiniz ki google sizin exact match isteğinizi de görmezden geliyor :D Ben ciddi ciddi gördüm sonuçlarda aradığım kelime olmamasına rağmen bana getirdiğini. Hatta altında da yazıyor, bu kelime bu sonucun içerisinde geçmiyor diye. O zaman neden getirdin yahu ???

Hadi bunların hepsini geç, google internetteki en popüler şeylerin doğru şeyler olduğunu ve senin de muhtemelen onları aradığını düşünmeye başladı. Bu insanlık için bile büyük bir tehdit emin olun. Şaka yapmıyorum, eğer popülerlik gerçeklik için bir kıstas olursa, aklını yitirmiş, cüretkar ve ölümcül hatalarla yerin dibine batacağız. Google 'da genelde stackoverflow en çok oy alan sorular veya yorumlar çıkabiliyor, reddit 'te en çok takip edilenler yada en çok tıklanan bloglar çıkıyor. Eskiden internette birşeyi saklamak için en iyi yer google 'ın 2. sayfasıdır derdik. Kimse oraya bakmaz çünkü derdik. Şimdi benim bir sürü örneğim var 50 'den fazla sonucun üzerinden geçip bir ipucu bulduğum. Google 'a gerçekten garip birşeyler oldu ama bundan daha kötüsü bize oluyor. Sıra biz insanların yaptıklarına geldi. (Burada ben hariç demek istiyorum :)

Önce kopyala yapıştırcılara bakalım. Buradaki mesele Dezenformasyon değil, o başka bir konu. Günümüzde internette sadece bulduğu şeyleri kopyala yapıştır yapan çok fazla insan türedi. Sadece yazılım alanında da değil her konuda buna rastlayabiliyorsunuz. Bu yüzden yanlış bilgi yayabiliyorlar veya en iyi ihtimalle hırsızlık yapıyorlar. Kendi bloglarında bir dökümantasyonu kopyala yapıştır ile paylaşanları veya wikipedia 'dan aldığı şeyleri yazanları gördüm. Stackoverflow 'da da bu şekilde cevaplar gördüm. Bugünlerde bir de crawler 'larımız var. Bir web sitesini tarayıp bütün verileri olduğu gibi kopyalayan araçlar var, bildiğiniz web sitesi kopyalıyor. Bu işin kötü tarafı da şu, yanlış bilgiyi de yayabiliyorlar. Google da aynı bilgiyi heryerde görünce popüler olduğunu ve aradığın şeyin o olduğunu düşünmeye başlıyor.

Hadi diyelim bütün bu sorunları da aştık. İnsanlar da maalesef popüler kavramlara yönelme eğilimindeler. Yada karmaşık bir konuyu basit bir şekilde anlatamıyorlar. Yada konunun esasını ve detaylarını kaçırıp yüzeysel geçiyorlar. Mesela internette JakartaEE ile ilgili örnek bulmak zor çünkü herkes popüler olan ve community 'si büyük olan spring framework 'e yoğunlaşmış durumda. Ama bu demek değil ki herkes her durumda her proje için spring framework ile geliştirme yapmalı. Yine de bir yerlerde kodlar bulsanız bile insanların düzgün dökümantasyon alışkanlıkları olmuyor genelde, hatta resmi dökümantasyonda bile eksikler oluyor. Kodu alıp yazayım ben çalıştırıp debug yapayım anlayayım deseniz bile insanlar genelde yazıkları kodun arka planını veya iç işleyişini umursamıyor yada bilmiyor. Benim bir sözüm var bu konuda "az kod yoktur, görünmeyen kod vardır" şeklinde. Bu yüzden yazılım konusunda bir örnek verirken (karmaşık olan bütün konular için de geçerlidir bu) görünmeyen altyapısını da anlatmak gerekiyor bir zahmet. Aksi takdirde sadece vakit kaybına sebep olursunuz çünkü sizin vereceğiniz cevabı ChatGPT bile verir zaten.

Bahsedeceğim son sorun da, yukarıda kısaca söylediğim gibi, insanların hem de bilinen blog yazarlarının veya eğitmenlerin herhangi bir konuyu anlatırken veya yazarken büyük resmi çizip detayları basit ve ilişkilendirilebilir şekilde açıklayamıyor olması. Çünkü gerçekten oturup react usecontext ile ilgili çok örnek bulabilirsiniz ama yazan okuyanın da kodu bildiğini düşünüyor sanki. Zaten kodu yazabilsem sana ihtiyaç duymazdım değil mi :) Kimse sizin blogunuzdaki örneği okurken sizin karmaşık iş mantığınızı, e-ticaret sitesi mantığı mesela, veya 3. parti kütüphane kullanımınızı veya sizin component veya ekran tasarım mantığınızı veya typescript ile array işlemlerini anlayabilmek zorunda değil. Zaten bu konseptlere bu kadar hakim olan kişi usecontext konusunu muhtemelen aşmıştır. Benim karşıma hepsi 15-20 satır olan gerekli kodun yanında 100 satır falan kod yazan felaket örnekler çıktı bu konuda. Bir de bir yandan kopyala yapıştırcılarımız var bunları çoğaltan. Bir de google popüler olunca bunun doğru olduğunu düşünüyor. Böyle böyle geliyoruz "nalet gitsin ben oturur yazardım bu kadar uğraşsam" diyorsunuz ve hakikaten oturup yazıyorsunuz :D

Yazılımcılara Allah kolaylık versin

İnternet neredeyse heryerde, bilgi neredeyse heryerde. Ama garip bir şekilde kullanışlı veya anlamlı hatta gerçek bilgiye erişmek giderek zor hale geliyor. Birkaç farklı sebepten dolayı bu noktadayız. Benim yazılım alanında tecrübem var ama yeni başlayanları çok fazla etkileyecek bu durum. Tahminim bu yüzden eğitmenliğin giderek önemi artıyor. Böyle söyleyince Brilliant.org sponsor mesajına geçiyormuş gibi oldu :D Yazılım eğitimi konusunda daha sonra yazacağım, sırada yazılmayı bekliyor. O iş sadece kod göstermek değildir, sadece olanı biteni anlatmak değildir. Bütün yazılımcılara bug 'sız günler diliyorum. Bir sonraki yazıda görüşmek üzere :)


Bir yorum yazabilirsiniz