Kategori arşivi: Yazılım Hakkında Genel Düşünceler

Yazılım Hakkında Genel Düşünceler

Macroservice Event Driven Domain Based Monolith Architecture

Microservice mimarileri bence yanlış anlaşıldı.

SRP’den (Single Responsibility Principle) yola çıkılarak sadece tek bir iş yapan, kendi içinde koherent minnak servisler oluşturuldu. Sonra bütün bu servisleri HTTP üzerinden birbirine bağlayıp ortaya dağıtık bir cümbüş çıkardılar.

Aklı başında kimse bir sisteme microservice mimarisi ile başlamaz.

SRP yerine domain bazlı düşünmek lazım.

Oluşturulan uygulama kendi domainine tam anlamıyla hakim olmalı. Bu da o domain içerisinde bir modüler monolit olması anlamına gelir.

Örneğin:

– Identity bir domain → kendi monoliti

– CRM bir domain → kendi monoliti

– Commerce bir domain → kendi monoliti

– Communication bir domain → kendi monoliti

Her biri kendi verisine, iş kurallarına ve iç mimarisine sahip olur.

Asıl önemli nokta ise bu domainlerin birbirlerinden mümkün olduğunca bağımsız olmasıdır.

Domainler arasında gerçekten senkron bir cevaba ihtiyaç varsa API kullanılabilir. Ama bir domain içerisinde gerçekleşen bir değişikliğin diğer domainlere aktarılması gerekiyorsa, bunu HTTP çağrıları zinciriyle yapmak yerine event bazlı bir mimari tercih ederim.

Örnegin:

-> CustomerCreated

Event yayınlanır.

İlgilenen domainler bunu kendi ihtiyaçları doğrultusunda tüketir.

Böylece bir domain diğer domainin implementasyonunu bilmez. Hatta event’i yayınlayan taraf, kimin bu event’i tükettiğini bile bilmek zorunda değildir.

Ben bu yöntemle temelde klasik anlamda microservice olmayan ama tepeden bakıldığında bağımsız domain monolitlerinden oluşan bir mimari oluşturdum.

Buna kendi adıma:

Macroservice Event Driven Domain Based Monolith Architecture ;-)

diyorum.

Microservice’in küçüklüğünü değil, domain’in bütünlüğünü esas alıyorum.

Gidişat şu şekilde:

– Önce doğru domain sınırlarını çiz.

– Her domaini kendi içinde monolit olarak bırak.

– Domainleri birbirinden decouple et.

– Gerektiği yerde API, mümkün olduğu yerde event kullan.

– Dağıtık sistemin karmaşıklığını ancak gerçekten ihtiyacın olduğunda sisteme dahil et.

Tavsiye olunur ;-)

Programcılıktan Geriye Ne Kalacak?

Yazılımda ilk döngüler goto ile yazıldı. Daha sonra while, for, do-while gibi terimlerle bu işlem tamamen derleyicilere bırakıldı. Fonksiyonel programlama ile gelen map-reduce ile döngülerin üstü tamamen örtüldü. Şimdi artık onu bile kullanmıyoruz.

goto kullanmayan ama gotoyu anlayanlar iyi programcı oldular. Yarın kod yazmayan ama kodun altında ne döndüğünü anlayanlar da iyi programcı olmaya devam edecekler.

İyi programcı, kullandığı soyutlamanın altında ne olduğunu bilen kişidir. Soyutlama yükseldikçe bilgi gereksizleşmiyor. Görünmezleşiyor. Yapay zeka programcılıktan bilgiyi çıkarmıyor. Bilgiyi syntax’tan ayırıyor.

Her yeni soyutlama, programcının yaptığı bir işi ortadan kaldırdı; ama anlaması gereken şeyleri ortadan kaldırmadı.

Yapay zekâyı iyi yönetebilmek için onun ürettiği şeyi üretebilmek zorunda değilsin; ama ne ürettiğini anlayabilecek zihinsel modele sahip olmak zorundasın. Bu sadece teknik tarafta olanlara anlam verebilenler yapabilirler.

Bu sebeple sırtını programcılığa dönenler, programlama merağını yitirenler ve programlamayı gereksiz görenler, yapay zekanın yönetilmesine dair en güçlü yetilerini kaybediyor olacaklar.

Sunucular İçin Güvenlik Önlemleri

Gitea üzerinden bir sunucuyu kaybettikten sonra, git repolari icin spring boot tabanli yeni bir uygulama olusturdum. Bu benim bir günümü bile almadi. Https üzerinden git repository islemlerini yapabiliyorum. Bunun yaninda github actions özelligini de implemente ettirdim. Her commit ile istedigim bir repo icindeki uygulamayi test sunucularina deploy ettirebiliyorum, yani bir nevi CI / CD pipeline. Yani jenkins gibi bir ara katmana ihtiyac yok.

Buraya kadar olaganüstü bir durum yok. Asil mevzu, yeni sucunuyu, yeni git sunucu uygulamasini ve repolari nasil korumaya calistigim.

Bunun icin birkac katmanli güvenlik altyapisi olusturmak gerekiyor.

En alt seviyeye isletim sisteminin kendisi ve onun güvenli olmasi. Bu amacla Debian 13 minimal linux isletim sistemini kurdum. Gerekli hardening sürecinden sonra iptables ve ufw ile sistemde sadece 22 ve 443 portlari acik birakacak sekilde, her türlü erisimi engelledim. Sunuculara sadece private key. ile baglanmak mümkün. Isteyen olursa, private key dosyami gönderebilirim.

Bu en temel güvenlik katmani üzerinde diger güvenlik katmanlarinin insa edilmesi gerekiyor. Asagidaki resimde gördügünüz gibi yeni git sunucusuna saldiri baslamis durumda.

Orta katmani anlatabilmek icin önce uygulama katmanindaki güvenlik önlemlerine göz atmamiz gerekiyor.

Uygulama katmaninda degisik türde güvenlik tedbirleri mevcut. Spring boot bünyesinde izin olmadan api kaynaklarina erisimi engellemek icin gerekli konfigürasyon yapildi. Buna ek olarak belirli sayida hatali login yaptiktan sonra, uygulamaya login yapma islemi bloke edildi. En son tedbir olarak hatali giris yapmaya calisanlar icin security.log isminde bir log dosyasi olusturuldu. Uygulama hatali girisleri bu dosyaya yaziyor.

Ikinci katman da bu security.log dosyasi ile calisan bir yapi var.

Isletim sistemi üzerinde fail2ban isminde, iptables ile calisan bir uygulama var. Bu uygulama düzenli olarak security.log dosyasina bakiyor (asagidaki örnek) ve failed olan login islemlerinin ip adreslerini iptables ile bloke ediyor.

Isletim sistemi üzerinde alinabilecek güvenlik önlemleri bu kadar.

Buna ek olarak iki önlem daha alinabilir.

1. Sunucuyu ve domain adresini cloudflare arkasina saklamak: Bu sekilde sunucu ip adresini bulmak ve SSH üzerinde bruteforce yapmak imkansiz hale geliyor. Ayrica uygulama seviyesinde cloudflara tarafindan dos ve ddos ataklari engelleniyor.

2. Gercek bir firewall donanimi ile sunuculari syn, dos, ddos vb. attaklara karsi korumak. Böyle bir firewall sunucu, sunucular üzerinde yapilan tüm güvenlik ayarlarini gereksiz kilabilir yani gerekli tüm önlemleri daha sunucuya erismeden almak mümkün.

DevOps sahasinda bu tür saldirilari cok faydali buluyorum. Her defasinda size aciklarini gösteriyorlar ve siz de gerekli önlemleri aliyor ve uygulamayi ve sunuculari daha iyi korumayi ögreniyorsunuz.

Tcp İle Udp Arasındaki Farkı Bilmek

Bilgisayar mühendisi udp ile tcp farkını bilmek zorunda değil.

Neden bilmek zorunda oldugunu abstraction leak üzerinden anlatayim.

Evet, cogu zaman bilmek zorunda degil. Ama bilmesi gerektigi an geldiginde ve bu farki bilmediginde, gerekeni yapamaz ya da cözüm üretemez ya da sorunu cözemez.

OSI (Open Systems Interconnection) modeli ag iletisimi 7 katmana ayirir. En tepede uygulamanin kendisi vardir, asagiya indikce yapi somutlasir. Üst katmanlara ciktica soyutlama neticesinde alt katmanda ne oldugunu bilmeden kullanim kolaylasir.

Joel Spolsky söyle diyor abstraction leak konusunda:

> All non-trivial abstractions, to some degree, are leaky.

Bunun en güzel örnegi bir sistemin baska bir sisteme erismek icin alabilecegi Timeout hatasidir.

Programci altta ne olup bittigini bilmeden:

> socket.send(data);

islemi gerceklestirir. Bu OSI’nin en tepesindeki soyutlamadir ve ag icinde su islemler gerceklesiyor olabilir:

– Paketler kaybolabilir

– Retransmission gerekebilir

– ACKlar gecikmeli gelebilir

Yani kisaca send() metodu karsi tarafindan gönderilen verileri aldigini garantisi degildir.

Ama aniden timeout gelmeyen basladiginda programcinin muhattap olacagi konular söyledir:

– Tcp mi udp mi

– RTT (Round Trip Time)

– Retransmission timeout

– Sliding Window

– Congestion Window

Ne oldu? Artik soyutlama seviyesini terk edip, alt katmanin somut detaylari ile ugrasmak zorunda kaldik. Yani asagidan yukariya dogru soyutlik sizintisi oldu.

Soru su: hangi mühendis burada daha etkin olacaktir?

a.) Tcp ile udp arasindaki farki bilen

b.) Tcp ile udp arasindaki farki bilmeyen

Burada tcp ve udp aslinda bir metafor. Bu konulari incelemis bir yazilimci aslinda OSI’nin ne oldugunu, aglarin nasil isledigini ve karsilastigi sorunlari nasil cözebilecegini bilen birisidir.

Alan Bilgisi

Belli bir piyasa icin bir ürün gelistiriyorsunuz. Domain yani alan bilginiz yoksa, ürünün müsteri gereksinimlerini tatmin etme sansi neredeyse sifirdir. Alan bilgisine hakimiyet cok büyük bir önem tasimaktadir. Ne kadar iyi bir yazilimci olursaniz olun, eger alana uzaksaniz ve oradaki sürecleri anlamiyorsaniz, bunlari implemente edecek kodu yazamazsiniz.

Ben ürün gelistirken alan konusundaki eksiklerimi su sekilde tanimliyorum:

– Öncelikle ürün gelistirmeye baslamadan önce genis kapsamli piyasa ve alan analizi yapiyorum. Bu sürecin sonunda alana hakim dili (domain speciifc language) anliyor olmam lazim. Eger anlamakta zorlaniyorsam, analiz netlesmemistir. Bir örnek vereyim. Ürün recetesi dendiginde akliniza ne geliyor? Ilac mi? Ilk akliniza gelen ilac ise, sormaniz gereken soruyu sormamissinizdir. Bu soru “hangi alandayiz” sorusu olmalidir. Yeme icme sektörü dendiginde ürün recetesinin ne oldugunu ve nasil implemente edilmesi gerektigini biliyor olmaniz lazim. Bunu bilmiyorsaniz ürün ve stok yönetimini yapmak icin bir ürün gelistiremezsiniz.

– Ürün gelistirmeye basladigimda alan icinde bulunan ve alana hakim insanlarla birlikte calismaya calisirim. Mutlaka birileri sistemin nasil calistigini cok iyi biliyordur ve size dogru sorulari sordugunuzda anlatacaktir.

– Alanda faal olan diger ürünleri incelerim ve onlarin sürecleri nasil cözdügüne bakarim.

– Eger hicbir muhattap bulamazsam ya ürün gelistirmeyi sonlandiririm ya da karsilastigim konsepleri yapay zeka yardimi ile anlamaya ve implemente etmeye calisirim. Bu cok verimli olmasa da en azindan bir baslangic noktasi olusturabilir. Cogu zaman baska ürünlerde görüp, anlam veremedigim özellikleri de bu sekilde arastirarak, uygulanan konsept ve sürecleri anlamaya calisirim.

Yazilim müsteri icin yapilir. Müsteriinin bazi gereksinimleri vardir. Bu gereksinimler bir alanda vücut bulurlar. Alan piyasa ya da piyasalari kapsar ve gidisati sekillendirir. Kim alan diline hakim ise, piyasayi ve dolayli olarak müsteriyi anlamaya baslar.

Özetle: alan bilgisi candir.

Frontend First

Yapay zeka destekli calisirken uctan uca bir uygulamayi gelistiriyor olmak cok önemli. Kesinlikle frontend icin ayri, backend icin ayri analiz ve implementasyon yapilmamasi gerekiyor. Zaten klasik calisma yöntemlerinde ekipleri en cok mesgul eden durum da bu olmustur; kendi baslarina, koordine etmeden is yapmalari ya da backendin arayüzleri istedigi sekilde yönlendirmeye calismasi.

Örnegin backend tarafinda gerekli oldugunu düsündügünüz yeni bir özelligi implemente etmeye baslamayin, cünkü arayüzün ihtiyaclarini tam olarak bilemediginiz icin bu analiz / implementasyon eksik olacaktir. Bu yüzden öncelikli olarak mock vari bile olsa önce client konumunda olan arayüzün (frontend) tasarlanmasi ve ihtiyaclarinin öncelikli olarak implemente edilmesi gerekmektedir. Arkasi zaten corap sökügü gibi gelecektir.

Kendi projemdem kücük bir örnek vereyim. Tamamlanmis bir sale icin refund yapilmasi gerekiyor. Bunun icin su anki durumumuzu kiyaslayarak nelerin eksik oldugunu ve nasil implemente edilmesi gerektigini ögrenmek amacli bir analiz baslattim. Gelen cözüm önerisi makul duruyor, lakin gercekten bu kadar derin degisiklige ihtiyacimiz olup, olmadigina dair aklimda soru isaretleri olustu. Eger devam etseydim arayüzü bu degisiklikleri kullanmaya mecbur birakacaktim. Bunun yerine diger yolu yani topdown (yukaridan asagiya) yönetimi uyguladim. Arayüzü olmasi gerektigi sekilde tasarladim ve gerekli apileri ve api degisikliklerinin backend kanadinda implemente edilmesini sagladim. Bu sekilde sadece backend tarafinda gercekten ihtiyac duyulan yapilar olusmaya basladi ve ilk basta sunulan analizin overengineered oldugunu gördüm.

Yazilim gelistirme sürecinde takip edilmesi gereken bir patika var. Bu patikanin basinda müsterinin kendisi yer aliyor. Müsterinin gereksinimleri dogrultusunda arayüzler olusturulur. Akabinde bu arayüzlerin ihtiyac duydugu backend apiler implemente edilir. Backend kesinlikle bir servis katmanidir ve frontend ne istiyorsa, saglamak zorundadir. Bakmayin siz backend yazilimcilarin bu kadar havali olduklarina :) Evet zor kisim backend ama patron her daim frontenddir. Frontend ne isterse, o yapilir. Gereksinimlere hakim olanlar da frontend yazilimcilaridir.

Yapay zeka ile bu ayrim artik ortadan kaltigina göre, “frontend first” ile baslanmasi müsterinin gereksinimlerini tatmin edecek en iyi cözüme götürecektir.

Çevik Yazılımın Rönesansı

Yazilim dünyasinda tas üzerinde tas kalmiyor :) Dogru bilinenler ve uygulamalar artik kendiliginden ortadan kalkmaya yüz tutuyor. Bunlarin basinda garip toplantilar var. Digerlerine diger yazilarimda deginecegim.

Düsünsenize ortada yazilim ekibi bile kalmamis, tek bir yazilimci kocaman bir ajan ordusunu orkestre ediyor ve toplanmaya gönüllü olanlar sadece yönetici tayfasi, cünkü yapacak baska isleri yok. Gözünüzde canlandirin bi… Toplanti odasinda tek bir yazilimci var ve en az 5-6 tane yönetici, scrum master, menicır, bilmem nerenin baskani vs oturuyor. Sadece toplantilar degil, bu yönetici tayfasi da ortadan kalkacak. Ajanlarin onlarin yerine gecmesi an meselesi :)

Cevik olmak icin ne gerek miyordu?

– Yönetici tayfasi
– Programciya neyi nasil yapildigini söylemek
– Takimi programci, analizci, testci diye ayirmak.
Cevikligin özünde ne vardi?
– Yapilacak tüm yazilimla ilgili isi yazilim ekibine devredip, aradan cekilmek

– Yazilimcilarin isine karismamak
– Tüm kararlari onlarin vermesini ve sorumlulugu almalarini saglamak.

Simdi bir bakiyorum da, artik yapay zeka ile full cevik yazilim yapabilmek icin tüm imkanlar bir araya gelmeye baslamis gibi görünüyor.

Cevik yazilimin rönesansi bu.

Hangisi Daha Verimli

Hangisi daha verimli?

1. Frontend programcisi api gereksinimlerini backend programcisina delege ediyor ve IO veri yapilari üzerinde uzlasma saglamalari gerekiyor. Test, entegrasyon vs derken aradan uzun bir zaman geciyor ve api tam istenildigi sekilde calismayabiliyor. Bu beraberinde uzlasma seanslari getiriyor. Frontend programcisi backend ve api development konularinda kendisini tamamen saliyor ve UI harici bir is yapmiyor. Ayni sekilde backend programcisi asil gereksnimlerden bihaber api programlamaya devam ediyor ve gereksinimleri anlama konusunda frontend yazilimcisina bagimli hale geliyor.

2. Tek bir programci hem frontend hem de backend icin gerekli calismayi yapiyor ve ihtiyac duyulan apiyi client driven backend tarafinda olustuyor. Uzlasmak zorunda kaldigi birisi olmadigi icin client icin gerekli tüm apileri ihtiyac dogrultusunda olusturuyor.

Eskiden fullstack denen bir yazilimci tipi vardi. Full denmesine ragmen ekseriyetle frontend kismindan sorumluydu. Gereksinimleri anlama konusunda backend yazilimcisindan bir adim öndeydi, cünkü müsteriye ya da son kullaniciya daha yakindi. Lakin backend konsunda cok zayifti.

Fullstack rolü tamamen tarihe karismistir. Bunun yerine bir backend yazilimcisi her iki tarafida tek basina koordine edebilecek sekilde 2 numarali satirda bahsettigim sekilde sekilde fullstack calisabilir.

EOF (End Of Fun)

Konuyu Bilmiyorlar

Yapay zeka ile gelinen son nokta…

1. En radikal yazilimcilar yazilimi tam anlamiyla birakti ve sadece gereksinimlere ve testlere odaklaniyolar.

2. Is yerinde yapay zeka kullanmasi yasak olanlar gizli gizli kendi bilgisayarlarinda kodu yazdirip, google drive ya da baska bir storage üzerinden bu kodu alip, kopyala, yapistir yapiyorlar. Bunlar aslinda birinci grupta olan yazilimcilar.

3. Yapay zekayi kesfedenler. Onlar ya kisa zamanda 1. ya da 2. gruba terfi edecekler ya da bir ise yaramadigini düsünüp, vazgececekler. Vazgecmelerinin tek sebebi yazilim konusunda temelde yeterli olmamalari.

4. Isittileri kadar konuya vakif olan yazillimcilar. Bunlarin icinden 3. gruba dahil olma potansiyeli olanlar merakli olanlari. Merakli olmayanlar bu isi birakmak zorunda kalacak olanlar.

5. Hicbir seyden haberi olmayanlar. Onlara Cem Yilmaz’in bu skecini birakiyorum

Takım Olayı Bitmiştir

Bilyorum bunlar cok radikal söylemler, ama ben daha önceki yazilimci tecrübelerimi güncel tecrübelerimle kiyasladigim zaman ortaya ckan görüsler bunlar. Gülüp gecebilisiniz. Nasil olsa kisa bir zaman sonra kendiniz deneyimleyeceksiniz. Ben size hizlandirilmis halini anlatiyorum, yani spoiler :)

Simdi söyle bir sürecten geciyorum. Eskiden promptlarimin cok detayli, düsük cümlesiz, net ve acik olmasina dikkat ederdim. Zaman icinde bu dogrudan cümlesel bile olmak zorunda olmayan komutlara ya da kelime gruplarina dönüsmeye basladi. Ben cerceveyi yani contexti ne kadar net ifade edersem, o oranda yapay zeka benim isteklerimi yerine getirebiliyor, yani bunun icin komple cümlelere bile gerek yok. Benim ifadesel netligim ne kadar azalmis olsa bile, context icin gerekli bilgiyi sagladigim sürece yapay zeka benim cok iyi anlayip, isini yapabiliyor.

Simdi bunu eski proje hayatimdaki calisma arkadaslarimla olan iliskilerle kiyasliyorum da… Yahu bazen derdimizi anlatmak ya da anlamak icin göbegimiz catliyordu. Bu anlasma süreci yer yer cok zaman alici bir hal alabiliyordu. Simdi ise birkac kelime bile yeterli ki altinda cok karmasik bir problem olsa bile yapay zeka ne demek istedigimi anliyor ve isini hallediyor.

Sanirim yazilimda takim iside yavas yavas son buluyor. Artik tek bir yazilimci kendi ajanlari ile bir takim olusturacak, gerekmedigi sürece baska yazilimcilarla iletisim bile kurmayacak, cünkü buna zaten gerek yok. Tek isi müsteriyi anlamak ve onun gereksinlerini tatmin eden bir ürün ortaya cikarmaz.

Diyeceksiniz ki entegrasyonlarda mutlaka karsi taraf ile konusmak gerekiyor. Hayir gerekmiyor. Entegrasyonu yazilimcinin yapmasi gerekmiyor. Verin ajana kodu, o gerekli baglantiyi zaten kurar, eger kuramiyorsa Jira’da bir ticket acip, “sunu sunu söyle yapin, yoksa kullanilamiyorum abi” der.

Baska ne kaldi geriye iletisimi gerektiren? Ha su yönetici tayfasi var, her ise burnunu sokmaya merakli. Onlara zaten hicbir zaman gerek yoktu. Ilk onlar shutlanacak.

Bitti!

Test Edenler Kazandı

Ben sahsen “ben programciyim, test yazmam” diyen cok programci gördüm. Bunlardan hala cokca var.

Simdilerde ise bu programcilarin yapay zekanin ürettigi kodu test etmekten baska ellerinde hicbir secenek kalmamis olmasi ne kadar ironik degil mi :)

Test bilgisi, yetisi ve isteklilgi yazilimda her daim iyi yazilimciyi kötüsünden ayiran bir faktör olmustur. Yapay zekanin yazilimdaki hakimiye ile test konseptlarine hakim oanlar yine birkac adim öne gecmislerdir.

Güven İyidir Ama Kontrol Daha Iyidir

Güven iyidir, ama kontrol daha iyidir der almanlar.

Ben yapay zekanin yazdigi koda bakmiyorum, dogru yaptigina güveniyorum. Lakin kontrolü de elden birakmiyorum, ama bunu kodu okuyarak yapmiyorum. Kod okuyarak zaten hatalarin cok kücük bir kismi bulunabilir.

Ben yazilan kodu dolayli olarak kontrol ediyorum. Burada her uygulama özelligi icin onay / kabul kriterleri tanimliyorum. Daha sonra bu kriteleri yansitan given/when/then lerden olusan bir test spec yaziyorum. Akabinde yapay zekaya bunu test koduna cevirmesini söylüyorum. Cikan test kodu uygulamayi bir kara kutu gibi test ediyor ve dolayli olarak kullanilan her kod parcasi test edilmis oluyor.

Bunun sagladigi bir diger avantaj artik kirilgan test kodlari ile ugrasmiyor olmam. Söyle bir örnek vereyim:

@given:
Müsteri login sayfasinda

@When:
Ismini girdiginde

@And:
Sifresini girmediginde

@Then:
Lütfen sifrenizi giriniz hata mesaji gösterilir

Bu bir test spec. Buradan test kodunu yazip, uygulamayi blackbox olarak test etmek yapay zekanin görevi. Ben cok yüksek bir seviyede bir uygulama davranisindan beklentilerimi belirliyorum. Eger uygulama bu davranisi benim beklentilerim dogrultusunda saglayabiliyorsa, ona “aferin, yazdigin, kod calisiyor” diyorum. Testler calismiyorsa, “git suna bir bak” diyorum.

Yazilimci olarak benim artik isim:

– Kod yazmak degil,
– Onay / kabul kriteleri tanimlama,
– Bunlari ihtiva eden specleri yazmak,
– Test sonuclarina bakip, kodun islevselligini degerlendirmek

Gerisi yapay zekanin isi.

Not: %95 oraninda aferini hak ediyor :)

İpek Böceğinden Güzel bir Kelebeğe

Gelen bir soru:

Hocam selam bende bir yazılım geliştiricisiyim ve yapay zekayla kod yazma alanında uzmanlaşmak istiyorum bu konuda bana yardımcı olur musunuz? Ne yapmalıyım nasıl bir yol izlemeyim.hangi aracı kullanmalıyım gibi.suanda codex cli kullaniyorum. Şimdiden teşekkürler

Cevabim:

1. Kendine cok ama cok zor bir proje sec hemen, aylarini ya da yillarini alacak bir

sey olmali, bu bir startup projesinin baslangici olacak senin icin.

2. Codex i birak, onun yerine github copilot cli kur ve claude opus 4.6 kulanmaya basla, claude code da olur.

3. Hayattaki tek önceligin o proje olmali. Geriye kalan herseyi göz arti et, gece gündüz bu isle mesgul olur.

4. Yazilimi tamamen ona birak, bunun icin cok iyi bir yazilimci olman gerekiyor. Eger iyi bir yazilimci degilsen, yazdiklarimi unut ve önce iyi bir yazilimci ol.

5. Müsteri gereksinimlerine odaklan. Müsteri ne istiyor sorusunu kendine sor. Burada müsteri sensin yani yapay zeka senin isteklerini implemente edecek

6. Gereksinimleri yapay zeka yardimi ile analiz et. Ona detayli analiz yapmasini söyle ve tüm sorularini cevapla.

7. Ortaya cikan analiz dokümanini iyice oku ve anlamaya calis. Senin isteklerinle örtüsüyor mu? Ikisini esitleyene kadar gereksinim analizine devam et.

8. Gereksinimleri kücük parcalara böl ve yapmasi icin yapay zekaya ver. Cikan kodu ilk zamanlar kontrol edebilirsin. Ama ilk kod örneklerini ve mimariyi kendin olustur. Yapay zeka bunu kopyalayacaktir. Daha sonra kodla hic ilgilenme, yapay zeka yazip, dursun, sen sadece gereksinimlere odaklan.

9. Ciktiyi kontrol etmek icin onay kabul kriterleri ihtiya eden test specleri hazirla (given/when/then). Daha sonra yapay zekaya bu speclerden test kodu olusturmasini söyle. Böylece uygulamanin davranislarini test edeceksin ve kodu test etmene ya da anlamana gerek kalmayacak.

10. 6 ay icinde eski yazilimci kimligin tamamen sönmüs olacak. Simdi aynaya baktiginda karsinda müsteriyi anlayan, onun gereksinimlerine odaklanan ve onun istedigini masanin üzerine koyan yapay zeka hükümdari birisini göreceksin. Tebrik ederim, yapay zeka cagi icin gereklli transformasyonu sagladin. Ipek böceginden güzel bir kelebege dönüstün.

11. Kendine bundan sonra hangi ünvani vermek istedigine kendin karar ver.

Bakış Perspektifimizi Temelden Değiştirme Vakti

Artik yapay zeka destegi ile yapilan yazilimlari tam anlamiyla blackbox olarak görebiliriz.

Eskinden birim testleri yazarak uygulamayi whitebox iceriden test etme egilimi vardi. Bu cok anlamli sonuclar veren bir aktivite degildi, cünkü fake entegrasyonlar yapilarak test etmeye calismak bir hayal dünyasi kurmak ve beklentileri kontrol etmek gibi birseydi.

Bunun yerine onay/kabul testleri ile blackbox olan bir uygulamayi test etmek daha verimli sonuclar vermektedir. Bunun icin onay/kabul kriterlerinin tanimlanmis olmasi gerekliligi mevcuttur.

Kod birimlerini izole bir sekilde test etmek yerine bütün uygulama davranislarini test etmek daha güvenilir sonuclar almamizi saglamaktadir. Onay/kabul testlerinde kodun nasil olusturuldugu dikkate alinmaz, sadece uygulama davranislari test edilir.

Iste bizim bunu artik fabrika ayari olarak kabul etmemiz ve bu sekilde yapay zeka ürünü uygulamalari test etmemiz gerekiyor. Kodun yapisi artik önemli olmamali. O kod zaten referans mimari ve kod örnekleri ile programcinin tayin ettigi yönde implemente ediliyor olacak. Yani kod clean ya da baska birsey, hic önemli degil. O kod zaten belli bir standartta olacak.

Koddan artik basiminizi kaldirdigimizda yani bu kod nasil olmali fetisizminden kurtuldugumuzda, daha önemli bir soru ile mesgul olma firsati bulacagiz. Bu soru: “Bu müsterinin gereksinimi tatmin ediyor mu?”

Burada mind ve focus shifti görebiliyor musunuz? Bu bizleri yazilimci olarak cok baska ve bir o kadar da gerekli bir seviyeye cekiyor. Müsteri ne ister ve yaptiklarim müsteriyi tatmin etti mi sorularinin cevabini aramak bir programcinin asli görevidir, kodun siir gibi yazilip, yazilmadigi degil.

Artik yazilima bakis perspektifimizi temelden degistirme vakti gelmistir. Ironik olan bu degisimin kendiliginden gelmemis, yapay zeka tarafindan zorlanmis olmasidir. Eger yapay zeka tarafindan bu kadar zorbalanmamis olsaydik, bir bakis acisi degisimi hic bir zaman gelmeyecekti belki de. Iyi ki zorbalandik.

Ama kod yazmak önemli diyenlere son söz olarak sunlari aktarmak istiyorum. Projelerde senior olan tecrübeli programcilara bir bakin. Onlar zamanlarinin cok kücük bir kismini kod yazarak gecirirler ve cogu zaman sistem tasarimi, müsteri iliskileri, entegrasyon gibi konularla ugrasirlar. Kod yazmak yazilimin cok kücük bir kismi ve artik bu isi yapma zorunlulugumuz ortadan kalkti ve biz bosa düsen bu mental kapasitemizi yazilimi gercek anlamini teskil eden islere ayirabiliriz.

Bu bir hype, gelip, gecici diyorsaniz, sunu eklememe izin verin. Eski usül kod yazma devri gelip, gecmistir. Bu gercegi cok hizli bir sekilde icsellestirip, asil isimize odanlanmamiz gerekiyor. Asil isimiz her daim müsteriyi memnun etmekti, siir gibi kod yazmak degil!

Hiçbir Şey Artık Eskisi Gibi Olamaz!

Artik yazdigi koda bakmiyorum bile, cünkü benim stilimi ve olusturdugum mimariyi kopyaliyor. Onun yazdigi kodu benim yazdigim koddan ayirt etmek bile zor.

Iyi bir is ayrimi yaptik: ben gereksinimlere odaklaniyorum, o gerisini hallediyor.

Bu benim icin kötü mü ya da yazilimci yeteneklerimin körelmesine mi neden oluyor? Evet :) Atin ölümü arpadan olsun. Buraya kadarmis!

Bundan sonrasi nasil ilerleyecek? Ben sürekli token kontenjanimin azalmasi ile dertlenecegim, karmasik bir problemin ortasindayken sunucu baglantisi kopup, yapay zeka isi yarida biraktiginda yüregim agzima gelecek, tekrar online olmasi icin dua edecegim, yani onun varligina muhtac bir hale geldim.

Bagimlisi miyim? Hayir, ama is cikarmam gerekiyor. Onun calismasi lazim, yoksa tas devrine geriye dönerim.

Artik isik hizinda hayal bile edemeyecegim türde ürünler ortaya cikariyorum. Eskiden yillar alacak platform ve ekosistemler icin simdilerde haftalar ya da aylar yeterli. Bunun bedelini yazilimci yetilerimi kaybederek ödüyorum, ama umrumda degil. Aldiklarim kaybettiklerimden cok cok daha fazla.

Onsuz bir yazilim hayati düsünemiyorum. Eger birgün bu araci elimizden almaya kalkarlarsa, o zaman hapi yuttuk iste!

En gec iki nesil sonra hic kimse bir satir kod bile yazamayacak hale gelecek. Kullanilmayan kaslarin kaybolmasi gibi bu yetide kaybolacak. Hangi programci C++ ya da Java da yazdigi kodun bytecode ya da makina koduna dönüsmüs haline bakiyor ve bunu anliyor? Ayni sey bu dillerde kod yazmanin basina da geliyor yavas yavas. Hic kimse kod Java mi, C# mi bakmayacak bile, baksa bile anlamayacak, cünkü hic ögrenmemis olacak. Programcilik zanaati icin vahim ama yazilim ve soyutlama seviyesi olarak cag atlamak bu. Yasasin.

Bunu durdurmak artik imkansiz, cünkü cok sey cok hizli ve kisa zamanda degisti. Eskisi gibi olamam artik. Olmak da istemiyorum. Bana ne döngü, invariant, volatile ya da threadlerden. Canim cikmiyor muydu zaten deneme yanilma ile (debug yaparak) birseyleri kodlamaya calismak. Hangi kod parcasi ilk yazildigi hali ile calisti ki?

Simdi sadece ol diyorum, oluyor. Bu kadar!

Not: Programci olmak kadar güzel bir sey yok!

Yapay Yeka Neden Daha İyi Programcı Ya da Mevcut Programcılar Neden Yetersiz?

Ikisini kiyaslayarak ilerleyelim..

Yapay zeka milyarlaca parametrelik islem kapasitesi ile daha kolay bir mental model olusturabilir. Bir progracinin konuyu algilamasi ve buradan yola cikarak mental model olusturmasi cok zaman alir. Bu model cok eksiktir ve problemin her yönünü dikkat almis degildir. Bircok programci mental model olusturmak icin gerekli soyutlama yetisini tam olarak gelistirememislerdir.

Yapay zeka saniyeler icinde kod tabani icinde tarama yaparak, hem kodu anlar hem de metal modele eklentiler yaparak, zenginlestirir. Programcinin tanimadigi bir kod tabanini inceleyerek mental modele ulasmasi cok güctür, cogu zaman büyük resmin sadece bir kesitini görür ve o kesit üzerinde fikir yürütür ve mental model olusturur.

Yapay zeka paralel ajanlar yardimi ile cok karmasik bir problemi basite indirmek zorunda kalmadan islem yapabilir, cünkü genis tabanli parametrik islem kapasitesi bu karmasayi her yönü ile yönetebilir. Programci karmasik oldugununu düsündügü bir problemi böl ve yönet yöntemi ile cözmeye calisir. Nesneye yönelik programlamada oldugu gibi mevcut bir problemi en kücük parcalarina bölerek, duruma hakimiyet saglamak yeterli degildir. Bu lineer düsünce tarzi sadece bütünün parcaarina odaklanirken, aralarindaki iliski, durum ve interaksiyonu tamamen göz ardi eder ki asil karmasa buradan kaynaklanir.

Yapay zeka cok hizli ögrenirken, programcinin bilgi, yetenek ve becerilerini gelistirmesi zaman alir, cünkü cok uzun bir zaman ayni seyleri yapma egilimi gösterir.

Not: programcilar kötüdür demiyorum, sadece beseri olduklarindan yetersizlerdir. Bunu dengelemek icin daha fazla zeka fayda etmez. Dogal olarak lineer düsünmeye megil ettiginden, karmasik problemleri cözmekte cok zorlanir. Sabana kosulmus bir atin ya da öküzün tarlayi sürmekteki yetersizligi ne ise, programcinin da kod yazarak, karmasaya hükmetmeye calismasi odur.

Yapay zeka ile artik saban devri kapanmistir. Yapay zeka traktördür, direksiyonunda oturan da programci. Hangisi olmayi tercih edersiniz?

Neden Okumalıyız!

Günümüz yazilimcisinin hayatta kalma mücadelesini destekleyecek tek aktivite, soft skillerini gelistirmesidir. Bunun basinda iletisim geliyor. Iletisim icin de genis bir kelime hazinesi ve ifade gücü gerekli.

Kelime hazinesi nasil genisletilir ve iletisim becerisi nasil kazanilir?

Öncelikle sunu bilmek gerekiyor; düsünce ve hayal dünyasi kelime hazinesinin büyüklügü ile dogrudan orantili.

Sadece yeni kelime ögrenerek, iletisimi güclendirmek mümkün degil. Kelime hazinesinin ve dolayli olarak ifade gücünün artmasi icin hayata dair anlam cikarici iceriklerin tüketilmesi gerekiyor. Bunlarin basinda dogal olarak edebiyat ve felsefe geliyor.

Felsefeye yönelebilmek icin öncelikle edebiyat duragina ugramak lazim. Siir, roman ve benzeri icerikler anlam olusturma, hakikatleri kavrama ve anlam arama cabalarini sekillendirir nitelikdedirler.

Burada özellilkle Tolstoi, Dostoyevski, Gogol gibi yazarlar öne cikiyor. Yazdiklari hikayeler insanlarin zor sartlar altinda yasadiklari dönemlerde geciyor. Örnegin Gogol’un Paltosunu okuyan birisi, aslinda ne kadar büyük bir zenginlik icinde yasadiginin hemen farkina variyor. Ya da Tolstoi’un “Insan neyle yasar” hikayesi zor durumda olanlara yardim etmenin ve gercekleri yasayarak görmenin ne kadar önemli olduguna vurgu yapiyor. Bu tür icerikler hem insanin sükretmesini, hem kendisine ceki düzen vermesini hem de zihninde yeni anlamlarin olusmasini sagliyor ve bu dogrudan ifade gücüne yansiyor.

Anlam ve hakikat arayisi insani dogrudan felsefeye yönlendiriyor. Mevcudiyeti sorgulamak, hakikatleri anlamaya calismak, ölüm gercegi daha cok okumaya yönlendiriyor ve bu dolayli olarak kelime hazinesine ve ifade gücüne olumlu olarak yansiyor.

Okuyun arkadaslar. Okumak iyidir!

Kod Yazmak Hamalllıkmış

Yillarca kod yazarak hamallik yapmisiz. Bu yüzden yazilim teknikleri, metotlari vs gelisememis, ayni seyleri tekrar tekrar pisirip, önümüze koymuslar, biz yazilimcilar da hype dan hype a kosup, durmusuz, buna da yazilim demisiz.

Ben teknik nedenlerle problem yasamayan bir yazilim projesi görmedim. Her zaman sorun yazilimcinin kendisi olmustur. Verdigi yanlis kararlar, bilgi yetersizligi, over-engineering yapmasi vs gibi konular teknik borcu her daim artirmis ve projeleri isin icinden cikilamaz bir hale sokmustur.

Ucak kazalarinin %70 inden fazlasinin nedeni pilotaj hatalaridir. Yazilim projelerinde bu durum %90 ve üzeri ile yazilimcilarin kendilerine aittir.

Simdi yapay zeka destegi ile full insansiz yazilim yapilabildigi icin bu hata oranlari büyük oranda düsecek ve yazilim projeleri daha basarili sonuclar vermeye baslayacak.

Yazlimcilar isimiz bitte diye üzülmesinler. Hamalliktan sistemin olusumunu ve gidisatini belirleyen ve takip eden sahislara terfi ettiler.