`<br>` Etiketi Üzerinden Web’in 30 Yılı
(artmann.co)- 1990’ların statik web’inden 2010’ların JavaScript merkezli web’ine, 2020’lerin yapay zeka çağı web’ine kadar uzanan değişimi takip ederek, web geliştirmenin nasıl evrimleştiğini özetleyen bir yazı
<br>etiketi ve FTP ile başlayan web, PHP·MySQL’den geçerek hızla herkesin bir şeyler inşa edebileceği bir platforma dönüştü- 2000’lerde Rails, Git ve Heroku ile birlikte web geliştirme, yapılandırma·otomasyon·iş birliği odaklı bir sektör olarak yeniden şekillendi ve bulut ile mobil çağının temelini attı
- 2010’larda React, build chain, Docker ve Node ekosisteminin ortaya çıkışı, web’i bir belge değil tam anlamıyla bir uygulama platformu haline getirdi
- 2020’lerde ise ChatGPT ve Copilot, kod yazma biçimini değiştirerek yapay zekanın geliştirme verimliliğini artırdığı yeni bir dönüm noktası oldu
- Tüm bu değişim, karmaşıklığı bir bedel olarak kabul ederek daha fazla insanın daha büyük şeyler inşa etmesini mümkün kılan web’in kitleselleşme sürecine dönüştü
The Static Web - Statik Web Dönemi
> "View Source was how you learned"
- 1990’ların sonlarında (late 90s) web, kimsenin neye dönüşeceğini bilmediği bir sınır bölgesiydi ve bu belirsizliğin kendisi başlı başına çekiciydi
- Kişisel web siteleri, şirket ya da kurumlarla değil, kişisel sunucu ve klasör düzeyinde başlıyordu
- Unix sunucusundaki kişisel bir dizin, HTML dosyaları ve bir FTP istemcisi varsa internette kendinize ait bir alanınız olabiliyordu
- Notepad gibi basit bir metin düzenleyiciyle yazı yazıp anında yayımlamak mümkündü
- Bu dönemin web’i, sansürcüsü ya da onay süreci olmayan bir üretim alanıydı
- Yemek, dinozorlar, şarkılar gibi ilgi alanları etrafında özgürce paylaşım yapılabiliyordu
- “Bu hafta ilgimi çeken şeyler”i hemen yayımlamaya uygun bir yapı vardı
- Öğrenme biçimi tamamen doğrudan bakıp taklit etme yöntemine dayanıyordu
- YouTube eğitimleri ya da Stack Overflow diye bir şey yoktu
- Başka bir siteyi merak ettiğinizde sağ tık → View Source temel öğrenme aracıydı
- Daha derin bilgiler ise gerçek basılı kitaplardan öğreniliyordu
- Core Java gibi yüzlerce sayfalık teknik kitapları yanında tutup kod ile kitap arasında gidip gelerek öğrenmek yaygın bir yöntemdi
- Yavaştı ama bilgiyi daha kalıcı hale getiren bir öğrenme deneyimiydi
- HTML’de yapı ile stil birbirine karışmış durumdaydı
<table>,<font>,<center>etiketleri hem yerleşimi hem stili aynı anda üstleniyordu- Boşluk ayarlamak için 1x1 şeffaf GIF’ler (spacer GIF) kullanılıyordu
- Kaba ve verimsizdi ama çalışıyordu
- CSS vardı ama fiilen ana akım değildi
- Stilin büyük kısmı inline özelliklerle ya da doğrudan HTML etiketleriyle veriliyordu
- Yerleşim, iç içe geçmiş tablolarla çözülüyordu
- Dinamik işlevlerin giriş bariyeri son derece yüksekti
- Ziyaretçi defteri ya da ziyaretçi sayacı gibi temel işlevler için bile CGI scriptleri gerekiyordu
- Bunları Perl ya da C ile yazmak gerekiyordu ve tek bir URL parametresini işlemek için bile çok fazla kod lazımdı
- Bu karmaşıklık, dinamik web’in yaygınlaşmasını ciddi biçimde sınırlıyordu
- Ortak yerleşim sorununa neredeyse hiç çözüm yoktu
- Header·navigasyon·footer her HTML dosyasına kopyala/yapıştır yapılıyordu
- Bir değişiklik olduğunda tüm dosyaları tek tek düzenlemek gerekiyordu
- Ortak öğeleri
<iframe>ile ekleme yöntemi de vardı ama ciddi yan etkiler doğuruyordu
- Tarayıcı uyumluluğu şimdiden ciddi bir sorundu
- Netscape Navigator (1994) ile Internet Explorer (1995) farklı render sonuçları veriyordu
- Belirli bir tarayıcı ve çözünürlüğü açıkça belirten uyarı metinleri gerçekten gerekliydi
- Buna rağmen bu dönemin web’i güçlü bir çekim etkisine sahipti
- Baskı ya da yayın ekipmanına ihtiyaç duymadan tüm dünyaya içerik açmak mümkündü
- Web, ifade aracının kitleselleşmesini ilk kez hayata geçirdi
- GeoCities (1994) ve Angelfire (1996) gibi ücretsiz hosting servisleri milyonlarca kişiye üretim alanı sundu
- Web ring’ler aracılığıyla fan siteleri ve topluluklar birbirine bağlanıyordu
- Kaotik ama canlı bir ekosistem oluşmuştu
- Şirketlerde henüz “web ekibi” diye bir kavram neredeyse yoktu
- Bir web sitesi varsa, çoğu zaman onu “bilgisayardan anlayan biri” yapmış oluyordu
- Web geliştiriciliğin bir meslek olarak yerleşmesinden hemen önceki dönemdi
- Araçlar ilkeldi, siteler kabaydı ama
- herkesin bir şeyler yapıp paylaşabileceği bir alan fikri bu dönemde kök saldı
<br>etiketi ve tutkuyla ayakta kalan bu dönem, sonrasında gelen tüm web evriminin başlangıç noktası oldu
LAMP yığını ve Web 2.0
"Her şey PHP ve MySQL'di"
- 2000 dot-com balonunun patlamasından sonra da web büyümeye devam etti ve bu dönem, bir şeyler üretmek isteyen insanlar için giriş bariyerinin keskin biçimde düştüğü bir dönüm noktası oldu
- Statik web çağındaki en büyük atılım PHP(1995) idi
- CGI için C ya da Perl ile yüzlerce satır yazılan dönemden, URL parametrelerini
$_GET['name']gibi tek satırla okuyabilmek belirleyici bir değişimdi - Derleme, bellek yönetimi ve anlaşılması güç hata mesajları olmadan, kaydedip sayfayı yenilemek yeterliydi
- XAMPP(2002), Apache·MySQL·PHP'yi tek seferde kurmayı mümkün kılarak yerel geliştirme ortamı kurulumunu çarpıcı biçimde basitleştirdi
- PHP, statik web çağının yerleşim düzeni yeniden kullanımı sorununu ilk kez gerçekten çözdü
include 'header.php'gibi tek satırla ortak header·footer yönetilebiliyordu- Tek bir değişiklikle tüm sayfaların değişmesi büyük bir heyecan yaratıyordu
- Dilsel kusurlarına rağmen PHP'nin gücü erişilebilirliği idi
- HTML ile mantık iç içe geçiyor, fonksiyon adlandırmaları tutarsız oluyor ve güvenlik API'leri kaba saba kalıyordu ama
- Bir hafta sonunda öğrenilip gerçek bir servis oluşturulabiliyordu
- Paylaşımlı hosting($5/ay) ile cPanel(1996) ve phpMyAdmin(1998)'in standart olarak sunulması, internete giriş bariyerini tarihin en düşük seviyesine indirdi
- CGI için C ya da Perl ile yüzlerce satır yazılan dönemden, URL parametrelerini
- PHP ile fiilen tek paket gibi anılan veritabanı ise MySQL(1995) idi
- Neredeyse tüm eğitimler·hosting hizmetleri·CMS'ler MySQL varsayımıyla kurgulanıyordu
- İşlevsel olarak yeterliydi ama uluslararası metin işlemede bitmeyen bir acıya dönüşüyordu
- Varsayılan kodlama latin1 idi ve UTF-8'i düzgün kullanmak için
- veritabanı ayarları, bağlantı kodlaması ve HTML charset tanımının hepsini uyumlu hale getirmek gerekiyordu
- “ä yerine ä” sorunu, bu dönemi simgeleyen bir travma olarak kaldı
- WordPress(2003), webin doğasını bizzat değiştirdi
- Kod bilmiyor olsanız bile 5 dakikalık kurulumdan sonra hemen yayın yapabiliyordunuz
- Sadece tema seçip yazı yazarak site işletmek mümkündü
- Web sitesi üretiminin kitleselleşmesini fiilen hayata geçirdi
- Teknik olmayan kullanıcılar için WordPress bir özgürleşmeydi
- Blog yazarlarından küçük işletmelere, sanatçılardan restoranlara kadar herkes bir web sitesine sahip olabildi
- "blogger" diye yeni bir kimlik ortaya çıktı
- WordPress yönetim paneli, neredeyse doğrudan “web sitesi editörü” olarak algılanacak kadar yayıldı
- Geliştiriciler için WordPress neredeyse her işe yarayan bir araç haline geldi
- Blog, portföy, kurumsal site, topluluk, e-ticaret; her şey WordPress'ti
- WooCommerce(2011) ile e-ticareti de içine aldı
- Hızlı geliştirme uğruna eklenti kalabalığı ve tema özelleştirmesine dayalı teknik borç birikti
- Webin imkânlarını kökten yeniden tanımlayan olay Gmail(2004)'in çıkışıydı
- Eski Hotmail ve Yahoo Mail'in birkaç MB depolama alanı sunduğu dönemde
- 1GB ücretsiz depolama alanı şok edici bir rakamdı
- “Silmeyin, arayın” mesajı yeni bir kullanım biçimi öneriyordu
- Gmail'in gerçek yeniliği depolama alanı değil, deneyimdi
- Sayfa yenilemeden e-posta okuma·yazma·geçiş yapmayı mümkün kılan arayüz
- AJAX(XMLHttpRequest) tabanlı asenkron iletişimi tam ölçekli kullandı
- Webin bir belge değil, bir uygulama olabileceğini kanıtladı
- Google Maps(2005) bu olasılığı bir adım daha ileri taşıdı
- Tıklayıp sürükleyerek haritayı hareket ettirme
- Karoları arka planda yükleyen doğal etkileşim
- Bu noktada Web 2.0 terimi ciddi biçimde yerleşti
- Yenilemesiz arayüz, yuvarlatılmış köşeler, gradyanlar ve gölgeler webin temel dili haline geldi
- Medya ve sosyal alanda da belirleyici değişimler sürdü
- Video tarafında YouTube(2005) dengeleri değiştirdi
- RealPlayer·QuickTime·Windows Media Player gibi eklenti cehenneminin sonunu getirdi
- Flash tabanlıydı ama “tıklayınca hemen oynat” deneyimi sunuyordu
- Video, artık teknik bir sorun değil ifade aracı oldu
- Twitter(2006), 140 karakterlik mikroblog ile yeni bir iletişim biçimi sundu
- Facebook(2006) genel kullanıcılara açılınca sosyal ağlar ana akıma taşındı
- Web, tüketim odaklı bir mecradan katılımcı bir platforma dönüştü
- Herkesin yayıncı ve üretici olabildiği bir yapı oluştu
- Video tarafında YouTube(2005) dengeleri değiştirdi
- Tüm bu değişimlere rağmen JavaScript hâlâ acı vericiydi
- Tarayıcılar arası DOM·event·AJAX uygulama farkları ve IE6 uyumluluk sorunları yüzünden bitmeyen debug süreci yaşanıyordu
- jQuery(2006) bu karmaşayı fiilen sona erdirdi
$('#el').hide()tüm tarayıcılarda aynı şekilde çalışıyordu$.ajax()ile asenkron iletişim basitleşti- Birçok geliştirici için jQuery, neredeyse JavaScript'in kendisiydi
- Aynı zamanda tarayıcının çalışma mantığını doğrudan anlamayı geciktiren bir tampon görevi de gördü
- Bu dönemin sorunları ancak sonradan sorun olarak fark edildi
- SQL Injection ve XSS, eğitim düzeyindeki örneklerde bile yaygındı
- Kullanıcı girdisini olduğu gibi sorguya bağlayan kodlar sıradandı
- Sürüm kontrolünde ana akım Subversion(2000) idi
- Commit'ler ağırdı ve branch'lerden kaçınılırdı
final_final_REALgibi klasör adları günlük hayatın parçasıydı
- Çalışma ortamı standardizasyonu yoktu
- Yerelde Windows + XAMPP
- Sunucuda Linux + farklı bir PHP sürümü
- “works on my machine” sözü tekrar tekrar yaşanıyordu
- Paket yöneticisi kavramı da yoktu
- JS, ZIP indirildikten sonra
/jsklasöründe elle yönetiliyordu - PHP kütüphaneleri dosya kopyalama temelliydi
- JS, ZIP indirildikten sonra
- Ekip yapısı ve geliştirme süreci çok gayriresmiydi
- PM·EM rolleri neredeyse yoktu
- Kod incelemesi yoktu
- FTP ile yükleyip doğrudan canlıya alınıyordu
- Sorun çıktığında prodüksiyon sunucusunda anlık düzeltme yapılıyordu
- Buna rağmen bu dönemin enerjisi çok güçlüydü
- PHP ve ucuz hosting ile herkes yayın yapabiliyordu
- AJAX ile “gerçek bir uygulama” yapılabileceği duygusu yayıldı
- Sosyal platformlar sayesinde herkes bir kitleye ulaşabilir hale geldi
- Web geliştirmenin meslekleşmesi ve yapı kazanması daha yeni başlıyordu
- Ruby on Rails(2004), “Convention over Configuration” ile daha yapılandırılmış sonraki dönemin habercisi oldu
- Bu dönemin geliştiricileri, LAMP yığını ve jQuery eklentileriyle birlikte,
- “Bir sonraki büyük servisi yapacağız” beklentisi içinde webi inşa ediyordu
Framework savaşları
"Rails changed everything, then everyone copied it"
-
2000’lerin sonlarında (late 2000s) web uygulamalarının ölçeği büyüdükçe, mevcut PHP betikleri ve el emeğine dayalı yapılar sınırlarına ulaştı
-
Bu dönemin çözümü olarak framework merkezli geliştirme yaklaşımı öne çıktı ve bu akışa yön veren unsur Ruby on Rails(2004) oldu
- RoR’un gerçek etkisi 2007–2008 civarında ciddi biçimde hissedilmeye başladı
- “Convention over Configuration” felsefesiyle dosya yapısını, adlandırmayı ve bağlantı biçimlerini framework belirliyordu
- Geliştiricinin tek yapması kurallara uymaktı; bu da bir kısıt değil, hız kazandıran bir özgürleşme olarak görüldü
-
Rails daha sonra web geliştirmenin temel sözdizimi haline gelecek kavramları tek seferde paketleyip sundu
- Veritabanı değişikliklerini kodla yöneten migration
- SQL bağımlılığını büyük ölçüde azaltan ORM
- Testlerin varsayılan olarak dahil edildiği geliştirme akışı
- MVC(Model–View–Controller) yapısının fiilî olarak standartlaşması
- MVC, kökeni 1970’lerin Smalltalk dünyasına dayanan bir kavramdı, ancak Rails sayesinde web geliştirmenin temel biçimi olarak yerleşti
- Rails’in başarısından sonra neredeyse tüm dil ekosistemleri bu formülü benimsedi
- Django(2005) Python’da, Laravel(2011) ise PHP’de Rails tarzı yapıyı kalıcı hale getirdi
- CakePHP(2005) ve CodeIgniter(2006) da aynı akım üzerinde gelişti
- Verimlilik artışı abartı değildi
- Tek bir geliştiricinin hafta sonunda yapabildiği şeyler, geçmişte bir ekibin işi sayılıyordu
- Startup ortamında hızlı deney ve yineleme için ideal araç olarak işledi
- Nitekim birçok simge hizmet Rails üzerinde büyüdü
- Basecamp(2004), Twitter(2006), GitHub(2008), Shopify(2006), Airbnb(2008)
- Rails kısa sürede startup hızının sembolü gibi algılanmaya başladı
-
Framework’ler üretkenliği artırdı, ancak deploy hâlâ darboğazdı
- PHP döneminde deploy çoğunlukla FTP ile dosya yüklemekti ve tek bir hata hizmeti bozabilecek bir yapıdaydı
- Daha iyi ihtimalde bile SSH + SVN pull + Apache yeniden başlatma gibi işler elle yapılıyordu
- Release dizinlerini ayırmak ve symbolic link değiştirmek gibi yöntemler dahil, tüm süreçler özel yapım ve kırılgandı
-
Bu sorunu kökten değiştiren şey Heroku(2007) oldu ve özellikle 2009–2010 civarında yaygınlaştı
git push heroku maintek satırıyla deploy’un tamamlandığı bir deneyim sundu- Sunucu ayarlarını, web sunucusu yeniden başlatmayı ve ölçeklemeyi platform üstlendi
- Heroku, daha sonra PaaS(Platform as a Service) olarak anılacak kavramı fiilen yerleştirdi
- Geliştiriciler altyapıya değil koda odaklanan bir role kaydı
- Twelve-Factor App(2011) ilkelerini yaygınlaştırarak stateless process, environment variable tabanlı yapılandırma ve log stream gibi bulut dostu düşünme biçimlerini yaydı
-
Aynı dönemde iş birliği biçiminde büyük bir dönüşüm de yaşandı
- Git(2005) dağıtık sürüm kontrol modelini getirerek yerelde özgürce commit·branch·merge yapmayı mümkün kıldı; branch maliyeti neredeyse sıfıra indiği için deney yapmak ve geri dönmek günlük iş haline geldi
- Mevcut Subversion(2000) merkezi yapısı nedeniyle branch işlemlerini ağırlaştırıyor, merge’i korkulan bir şeye dönüştürüyor ve birçok ekip trunk merkezli geliştirmeye bağımlı kalıyordu
- Git araç düzeyinde bir yenilikti, ama GitHub(2008) herkese açık depo keşfini, fork tabanlı geliştirmeyi ve Pull Request merkezli iş birliğini birleştirerek bunu kültüre dönüştürdü
- GitHub, kod inceleme kültürünü standartlaştırdı
- PR merge edilmeden önce birinin mutlaka kodu görmesi gereken bir yapı oluştu
- Bu akış şirket içi geliştirmeye de yayıldı
- Kodun doğrudan production’a gittiği dönemin sonu geldi
- Açık kaynak katkı modeli, mailing list’e patch göndermekten bir düğmeye basarak PR göndermeye evrildi ve katılım eşiği ciddi biçimde düştü
-
Bu dönemin sonlarına doğru web’in kimliğini sarsan değişimler de ortaya çıktı
- iPhone(2007) ve App Store(2008) ile native uygulamalar hızla yükseldi
- Mobil web o sırada oldukça kötüydü. Masaüstü sitesinin küçültülmüş halini zorla görmek, yatay kaydırmak ve sürekli yakınlaştırıp uzaklaştırmak gerekiyordu
- Bazıları m.example.com gibi ayrı mobil siteler kurdu, ancak sınırlar açıktı
- Native uygulamalar hızlıydı, offline destek sunuyordu, push notification sağlıyordu ve “There’s an app for that” sloganıyla geleceğin kendisi gibi görünüyordu
- Web geliştiricileri kimlik krizi yaşamaya başladı: web’e devam mı edilmeli? Objective-C mi öğrenilmeli? Web yok mu olacak?
-
Bu karmaşaya cevap olarak Responsive Web Design(2010) ortaya çıktı
- Ethan Marcotte(2010) CSS media query’lerini kullanarak ekran boyutuna göre düzenin uyarlanması yaklaşımını sundu ve mobil ile masaüstünü tek bir codebase’te birleştiren bir yön çizdi
- Başlangıçta araçların olgunlaşmamış olması ve ek iş yükü nedeniyle yayılım yavaştı, ancak web’in gitmesi gereken yön netleşti
-
Bootstrap(2011), responsive web’in sahada gerçekten kullanılmasını sağlayan dönüm noktası oldu
- Twitter iç aracı olarak başlayıp grid system, temel tipografi ve form stillerini bir arada sunarak, tasarımcısı olmayan geliştiricilere bile hemen kullanılabilir bir UI verdi
- Sonuç olarak web giderek birbirine benzemeye başladı, ancak birçok geliştirici için Bootstrap ilk component library ve design system deneyimiydi
- Bu akış daha sonra Material Design(2014) gibi sistematik tasarım sistemlerinin yayılmasına uzandı
-
Altyapı da aynı dönemde hızla değişti
- Fiziksel sunucuyu önceden satın alma veya kiralama modelinden sanal sunucu(VPS) merkezli yapıya geçildi ve sunucu kaynağını ihtiyaç olduğunda oluşturmak mümkün hale geldi
- AWS(2006) ilk çıkan oyuncuydu, ancak karmaşık ve enterprise odaklı yapısı nedeniyle bireysel geliştiriciler için yüksekti
- DigitalOcean(2011) ise 5 dolarlık droplet’ler, sezgisel UI ve hızlı sunucu oluşturma deneyimiyle altyapıya erişim eşiğini ciddi biçimde düşürdü; bireysel geliştiricilere de büyük şirketlere benzer bir esneklik sağladı
-
Dosya depolama sorununu fiilen çözen şey Amazon S3(2006) oldu
- Sunucu sayısından bağımsız ölçeklenebilen depolama ve yükleme sonrası URL’yi hemen döndüren basit bir model sundu
- Kullanıcı yüklemeleri, yedekleme ve çoklu sunucu ortamlarında dosya yönetimi sorunları tek seferde toparlandı
-
Node.js(2009) web geliştiricilerine bir şok daha yaşattı
- Chrome V8 motoru sayesinde sunucuda JavaScript çalıştırmak mümkün hale geldi; bu frontend geliştiricilerine çekici görünürken backend geliştiricilerinde şüphe uyandırdı
- Non-blocking I/O modeli gerçek zamanlı uygulamalarda güçlüydü ve eğitimlerin çoğu sonunda bir chat app örneğine varıyordu
- Bu dönemde Node henüz production ana akımı olmaktan çok bir merak konusuydu; gerçek servisler hâlâ Rails·Django·PHP ağırlıklıydı ve npm ekosistemi de erken aşamadaydı
- Yine de Node’un asıl etkisi daha sonra sunucudan çok build araçları ve geliştirme ortamının çalışma zemini tarafında görülecekti
-
Veritabanı tarafında NoSQL akımı yükseldi
- MongoDB(2009) doküman tabanlı veri modeli, şema esnekliği ve JSON dostu yapısıyla dikkat çekti
- Hızlı prototipleme, ölçeklenebilirlik ve JavaScript stack’iyle uyum açısından avantajlıydı, ancak her hizmet için uygun değildi
- “Belki bir gün scale ederiz” diye seçilip, birkaç bin kullanıcı seviyesinde transaction sınırlarına çarpılan örnekler de yaygındı
-
Startup ekosistemi bu dönemde gerçek anlamda büyüme evresine girdi
- Marc Andreessen(2011) tarafından dile getirilen “Software is eating the world” sözü ve Lean Startup(2011) metodolojisinin yayılmasıyla MVP → ölçüm → yineleme döngüsü yerleşti
-
Araçların olgunlaşmasıyla küçük ekiplerin rekabet gücü gerçekten işlemeye başladı
-
Geliştirme süreçleri de değişti
- Agile Manifesto (2001) ve Scrum yaygınlaşınca stand-up, sprint ve retrospektifler neredeyse standart hâline geldi
- Ancak birçok ekipte ilkelerden çok yalnızca biçim kaldı
- Kod incelemesi ve otomatik testler öneriden temel beklentiye dönüştü; CI sistemleri her commit’te test çalıştırırken yazılım geliştirmenin profesyonelleşmesi ve uzmanlaşması hızlandı
-
Ancak bugün doğal kabul edilen roller henüz yerleşmiş değildi
- 2012 itibarıyla mühendislik yöneticisi, ürün yöneticisi, sistematik backlog veya ticket yönetimi olmayan ekipler yaygındı
- Küçük ekipler ve düz organizasyon yapıları genel durumdu; “kıdemli geliştirici”nin 3 yıllık deneyime sahip olması da pek nadir değildi
-
2013 civarında web bambaşka bir görünüme kavuştu
- Güçlü framework’ler, kolay deployment, sosyal kod iş birliği, mobil uyumluluk, ucuz altyapı ve JavaScript’in her yere yayılması aynı anda gerçekleşti
- Mobil krizini atlatan web daha da güçlendi ve bir sonraki aşama olan JavaScript’in her şeyi ele geçirdiği çağ için hazırlığını tamamladı
JavaScript Rönesansı
"Everything is a SPA now"
- 2013 civarında, web; Gmail ve Google Maps gibi örnekler üzerinden zaten “gerçek uygulamaları” kaldırabildiğini kanıtlamıştı, ancak mevcut jQuery + sunucu tarafı render yaklaşımı giderek sınırlarına dayanıyordu :contentReference[oaicite:0]{index=0}
- Temel sorun durum (state) yönetimiydi
- Sunucunun HTML ürettiği ve jQuery ile etkileşim eklenen yapıda, veriyi ve UI'ı birden fazla yerde tutarlı biçimde korumak hızla zorlaşıyordu
- Yorumlar, sayaçlar, bildirim rozetleri gibi aynı durum birden fazla UI'a yansıdıkça kod birbirine dolanıyor ve spagetti yapıya dönüşüyordu
- Buna verilen ortak sonuç, render işlemini tamamen istemciye taşıyalım fikriydi
- Sunucu, JSON döndüren bir API rolüne indirgeniyordu
- Tarayıcıda JavaScript'in tüm UI'ı yönettiği SPA (Single Page Application) yapısı yükselişe geçti
- İlk SPA framework'leri bu dönemde ortaya çıktı
- Backbone.js (2010), model ve view kavramlarıyla asgari bir yapı sundu
- Angular (2010), çift yönlü veri bağlama ve dependency injection getirerek kurumsal tarzda bir yaklaşım denedi
- Ember.js (2011), routing, data ve template'in tamamını içeren “JavaScript'in Rails'i” olmayı hedefleyerek güçlü kurallar sundu
- Bu framework'ler ileri bir adımdı, ancak ortak olarak DOM ile veri senkronizasyonunun karmaşıklığı sorununu tamamen çözemediler
- Özellikle çift yönlü bağlama, güncelleme akışını takip etmeyi zorlaştırıyor ve debug maliyetini artırıyordu
- Dönüm noktası React'in (2013) ortaya çıkışı oldu
- Facebook bunu açık kaynak olarak yayımladığında, JSX sözdizimi ilgi alanlarının ayrımını tersine çeviriyormuş gibi görünerek tepki topladı
- Ancak React, DOM'u doğrudan manipüle etmek yerine, duruma göre UI sonucunu deklaratif biçimde tanımlayan yeni bir düşünme biçimi sundu
- React'in özü deklaratif model ve Virtual DOM'du
- Durum değiştiğinde React, yalnızca gerekli en az DOM değişikliğini hesaplayıp uygular
- Geliştiriciler DOM manipülasyonuna odaklanmak yerine durum yönetimine yoğunlaşabilir
- Component kavramı da belirleyiciydi
- Button, UserAvatar, CommentList gibi küçük birimler birleştirilerek UI oluşturuluyordu
- Her component bağımsız düşünülebiliyor ve yeniden kullanılabiliyordu
- React yavaş yavaş yayılıp 2015 civarında ana akım haline geldi
- Vue.js (2014), benzer kavramları daha tanıdık bir sözdizimiyle sunarak alternatif olarak yükseldi
- Framework savaşları yeni bir aşamaya girdi
- SPA'lerin yayılması, JavaScript miktarında patlayıcı bir artış anlamına geliyordu
- Sorun, geliştiricinin yazmak istediği JavaScript ile tarayıcının anladığı JavaScript'in farklı olmasıydı
- ES6 / ES2015 (2015), arrow function, class, module, promise gibi büyük dil iyileştirmeleri getirdi
- Callback cehennemi ve
var self = thiskalıbı kaybolurken, JavaScript nihayet modern bir dil gibi hissettirmeye başladı
- Callback cehennemi ve
- Ancak tarayıcı desteği geriden geliyordu ve bunu olduğu gibi dağıtmak mümkün değildi
- Babel (2014), modern JavaScript'i ES5'e dönüştüren bir transpiler olarak bu sorunu çözdü
- Bunun bedeli olarak, JavaScript geliştirmede build aşaması vazgeçilmez bir unsur haline geldi
- Dosyayı değiştirip yenilemeyle işin bittiği dönemin sonu geldi
- Bu süreçte Node.js (2009), sunucu değil geliştirme araçlarının çalışma ortamı olarak tüm geliştirici makinelerini ele geçirdi
- Backend'i Node ile yazmasanız bile, build araçları yüzünden Node kurulumu zorunlu hale geldi
- Build araç zinciri de hızla evrildi
- Grunt (2012), karmaşık build adımlarını yapılandırma dosyalarıyla yöneten bir task runner'dı
- Gulp (2013), bunu kod tabanlı pipeline ile basitleştirmeye çalıştı ama yine de karmaşıktı
- Belirleyici değişim Webpack (2014) oldu
- Basit bir task runner değil, module bundler olarak bağımlılık grafiğini anlayabiliyordu
- JavaScript, CSS, görseller ve font'ların hepsini modül olarak ele alıyordu
- Code splitting ve hot module replacement gibi kavramları getirdi
- Gücünün bedeli olarak yapılandırması kötü bir şöhrete kavuştu
- Webpack yapılandırması bir meme haline geldi ve her ekipte “bunu anlayan tek kişi” bulunuyordu
- O kişi ayrıldığında yapılandırma, dokunmaya korkulan bir kalıntı olarak kalıyordu
- Aynı anda npm ekosistemi patlayıcı biçimde büyüdü
- Kütüphaneleri elle indirme yaklaşımından
npm installmerkezli yapıya geçildi - moment, lodash, hatta left-pad gibi aşırı küçük yardımcı araçlar bile paketlendi
- left-pad olayı (2016), ekosistemin kırılganlığını ortaya koydu
- Sadece 11 satırlık bir paket silinince binlerce projenin build'i aynı anda başarısız oldu
- React ve Babel bile kurulamaz hale geldi
- npm, eşi görülmemiş şekilde paketi zorla geri yükleyerek krizi yatıştırdı
- Kolaylık korunmuş olsa da, herkes dependency hell'in gerçekliğini fark etti
- Kütüphaneleri elle indirme yaklaşımından
- 2016'da karmaşıklık zirveye ulaştı
- “How it feels to learn JavaScript in 2016” adlı hiciv yazısı yayıldı
- Basit bir web sayfası yapmak için React, Webpack, Babel, Redux gibi sayısız araç gerektiği yönündeki yorgunluk büyüdü
- Ekosistemdeki değişim hızı o kadar yüksekti ki öğrenilen bilgi hızla demode oluyordu
- Buna rağmen ortaya çıkan sonuçlar açıktı
- Daha önce mümkün olmayan düzeyde etkileşimli web uygulamaları yapılabiliyordu
- Karmaşıklık, hırsın bedeli olarak kabul edildi
- Bu sırada Docker (2013), bambaşka bir sorunu çözmeye başladı
- “works on my machine” sorununu container'larla ele aldı
- Dockerfile ile çalışma ortamı tanımlanıyor ve her yerde aynı şekilde çalıştırılabiliyordu
- İlk dönemde Mac ortamındaki performans sorunları ve ağ karmaşası nedeniyle benimsenmesi kolay olmadı
- Docker Compose, Docker Swarm ve ardından Kubernetes (2014) gelince orkestrasyon savaşları başladı
- 2017 civarında, container'ların gelecek olduğu artık açıktı
- Bununla birlikte microservices trendi de yayıldı
- Servisleri ayırma ve bağımsız dağıtım gibi avantajlar sundu
- Bunun yerine service discovery, load balancing, distributed tracing gibi yeni karmaşıklıklar ortaya çıktı
- Birçok ekip, monolitin karmaşıklığını dağıtık sistemlerin karmaşıklığıyla değiştirdiğini sonradan fark etti
- Bu dönemde web uygulamalarının olgunluğu gözle görülür biçimde arttı
- Slack (2013), hızlı ve aranabilir bir işbirliği aracı olarak e-postanın yerini aldı
- Figma (2016), tarayıcı tabanlı işbirlikçi tasarım aracı olarak masaüstü uygulamaların alanına girdi
- Notion (2016) ve benzerleriyle birlikte, web'in masaüstü düzeyinde yazılım üretebildiğini kanıtladı
- Bu örnekler, React, Webpack ve build zincirinin karmaşıklığını meşrulaştıran dayanaklar oldu
- Organizasyon yapısı da olgunluk aşamasına geçti
- 2016 civarında, product manager ve engineering manager standart roller haline geldi
- İlk dönemin yatay ekip yapısı giderek süreç odaklı organizasyonlara dönüştü
- Scrum ve çevik ritüeller yaygınlaştı; ekibe göre bazen araç, bazen de şekilcilik haline geldi
- 2017'de, ekosistem yavaş yavaş istikrar dönemine girdi
- React fiilen kazanan olmuştu
- ES6 temel sözdizimi haline gelmişti
- Webpack ve Docker acı verici ama standart kabul ediliyordu
- Bir sonraki aşama ise zaten kendini belli etmişti
- TypeScript'in yükselişi
- Next.js gibi meta framework'ler
- Daha basit dağıtım deneyimi
- Ama bunun önkoşulu birdi
- Bu JavaScript Rönesansı'nın kaosundan geçen geliştiriciler ancak bir sonraki aşamaya ilerleyebildi
TypeScript dönemi
"Types are good, actually"
- JavaScript rönesansının ardından araç karmaşası yatışırken, ekosistemin olgunluk aşamasına girdiği dönüm noktasında TypeScript yer aldı
- TypeScript (2012), JavaScript’e statik tipler getirdi ancak başlangıçta dinamik dil felsefesiyle çelişmesi ve ek build aşaması yükü nedeniyle uzun süre göz ardı edildi
- Uygulama ölçeği büyüdükçe dinamik tiplemenin sınırları giderek daha belirgin hale geldi
- Fonksiyon imzası değiştikten sonra çağrı noktalarını takip etme maliyetinin artması
- Nesne yapısını kavramayı zorlaştıran kod okunabilirliği sorunları
- Basit yazım hatalarının production kesintilerine yol açtığı vakaların tekrarlanması
- 2017–2018 döneminden itibaren TypeScript benimsenmesi hızla yaygınlaştı
- Otomatik tamamlama ve statik analiz sayesinde refactoring güvenliği sağlandı
- Arayüzler, kodla senkronize kalan zorunlu dokümantasyon işlevi gördü
- Başlıca framework’lerin benimsemesi dönüm noktası oldu
- Angular, TypeScript öncelikli stratejiyi benimsedi
- React tip tanımlarının olgunlaşması ve Vue 3’ün TypeScript tabanlı yeniden yazımıyla birlikte fiilî standart olarak görülmeye başlandı
- 2020 civarından itibaren yeni saf JavaScript projeleri neredeyse hiç tercih edilmez oldu
- TypeScript, kod tabanının erişilebilirliğini büyük ölçüde iyileştirdi
- Yeni katılanlar yalnızca tip tanımlarını okuyarak bile alan modelini anlayabilir hale geldi
- Örtük bilgiye bağımlılığın azalması, takım ölçekleme maliyetini hafifletti
- Uygulama ölçeği büyüdükçe dinamik tiplemenin sınırları giderek daha belirgin hale geldi
- VS Code (2015) ile birleşmesi, geliştirme deneyimini belirleyici biçimde değiştirdi
- Akıllı otomatik tamamlama, satır içi hata gösterimi ve güvenilir refactoring sağladı
- Sublime Text ve Atom ise giderek etkisini kaybetti
- React üzerinde bir soyutlama katmanı daha oluştu
- React, bir UI kütüphanesi olarak routing, data fetching ve SSR için varsayılan çözümler sunmuyordu
- Next.js, dosya tabanlı routing, server-side rendering, API route’ları ve otomatik code splitting’i varsayılan olarak sunan bir meta framework olarak bu boşluğu doldurdu
- Nuxt, Remix, SvelteKit, Gatsby gibi çeşitli karşılık framework’ler ortaya çıktı
- React ekosisteminde Next.js fiilî varsayılan seçenek haline geldi
- Meta framework’lerin yaygınlaşmasıyla önceki dönemin tooling parçalanması yorgunluğu büyük ölçüde hafifledi
- webpack ve Babel yapılandırmalarını elle birleştirme süreci varsayılanlara emildi
- Dağıtım ortamı da hızla sadeleşti
- Vercel ve Netlify, yalnızca GitHub bağlantısıyla otomatik deployment ve preview ortamı sundu
- Tasarımcılar, PM’ler ve QA ekipleri, merge öncesinde değişiklikleri gerçek ortamda doğrulayabilir hale geldi
- Heroku’nun etkisi zayıfladı, Railway ve Render gibi yeni nesil PaaS’lar yükseldi
- AWS Lambda (2014) merkezli olarak Serverless kavramı yayıldı
- Kullanım bazlı fiyatlandırma ve otomatik ölçeklendirme sundu
- Cold start, durum yönetimi ve debugging sınırları nedeniyle her işe uyan genel çözüm olmadı
- Cloudflare Workers, bunu edge execution modeliyle genişletti
- CSS alanında da sessiz bir geçiş yaşandı
- Sass ve Less sonrasında CSS-in-JS dalgası geldi, ardından Tailwind CSS (2017) geniş kitlelerce benimsendi
- Utility class tabanlı yaklaşım
- Sınıf adı bulma yükünü ortadan kaldırdı
- cascade ve specificity sorunlarını azalttı
- Sonuç olarak daha küçük stylesheet’lerin korunmasına katkı sağladı
- GraphQL (2015), karmaşık veri yapılarını kullanan uygulamalarda güçlü bir çözüm olarak öne çıktı
- Hassas veri sorgulama, tipe dayalı şema ve tooling ekosistemi gibi avantajlar sundu
- Ancak sunucu katmanındaki karmaşıklık ve caching zorluğu nedeniyle basit CRUD için aşırı bir tercih oldu
- Bazı ekipler REST’te kaldı ya da tRPC gibi daha sade alternatifleri seçti
- Konteyner orkestrasyonu rekabeti 2018 civarında Kubernetes’in zaferiyle sonuçlandı
- Güçlüydü ancak yüksek öğrenme maliyeti ve operasyonel karmaşıklık getiriyordu
- Birçok ekip için gereğinden ağır bir çözümdü ve PaaS’ın yeniden yükselişinin arka planını oluşturdu
- COVID (2020), web geliştirme talebini keskin biçimde büyüttü
- Uzaktan çalışma, e-ticaret ve işbirliği araçları vazgeçilmez hale geldi
- Bu da geliştirici talebinde patlamaya ve geliştirme araçları şirketlerinin hızlı büyümesine yol açtı
- Uzaktan çalışma ortamında asenkron işbirliği ve dokümantasyonun önemi arttı
- Code review, PR açıklamaları ve iç dokümantasyon kalitesi temel unsurlar olarak öne çıktı
- Kurumsal düzeyde de olgunlaşma yaşandı
- Mühendislik seviye sistemleri yerleşti
- IC track meşruiyet kazandı
- PM, EM ve tech lead rolleri ayrıştı
- Developer Experience (DX), bağımsız bir yatırım alanı olarak görülmeye başlandı
- İç platform ekipleri, hızlı CI ve daha iyi onboarding, verimliliğin temel unsurları haline geldi
- 2022 civarında web geliştirme karmaşık ama yönetilebilir bir duruma ulaştı
- TypeScript’in varsayılan hale gelmesi
- Next.js merkezli ekosistem
- Dağıtım otomasyonu ve olgun araç zinciri
- Ve sonra her şey değişti: OpenAI adlı bir şirket, ChatGPT denilen şeyi yayımladı
Yapay zekanın anı
"Wait, I can just ask it to write the code?"
- ChatGPT (2022) ile birlikte, yalnızca soru yazarak açıklama, kod ve debugging sonucu alma deneyimi ortaya çıktı ve geliştirme kuralları değişti
- Kuantum fiziği açıklamaktan Python debugging yapmaya kadar kullanılabiliyordu; kusursuz değildi ama yeterince işe yarar düzeyde olması bile sarsıcıydı
- Geliştiriciler hemen denemeye başladı ve React bileşeni yazma, hata nedenini analiz etme, diller arası kod dönüştürme işleri dokümantasyon ya da forum araması yapmadan saniyeler içinde mümkün hale geldi
- GitHub Copilot (2022), editör içinde otomatik tamamlama biçiminde kod üretimi sunarak, yalnızca yorumlardan implementasyon önerebilen aşırı güçlü bir otomatik tamamlama deneyimini yaygınlaştırdı
- Yapay zeka önerilerini hızlıca değerlendirme, benimseme, düzenleme ve reddetme şeklindeki yeni bir meta beceri, geliştiricilerin temel yetkinliklerinden biri haline geldi
- Tekrarlayan boilerplate, test yazımı ve edge case işleme gibi işler dramatik biçimde hızlandı; böylece akışı bozmayan geliştirme mümkün oldu
- Cursor (2023), yapay zekayı bir özellik değil ön koşul olarak entegre eden bir IDE olarak, kod seçip refactoring isteme, doğal dille açıklayarak çok dosyalı değişiklik yapma ve kod tabanıyla sohbet etme imkânı sundu
- Bu değişim, kıdemin anlamını sarsmış olsa da gerçekte ne yapılacağına karar verme, gereksinimleri, kısıtları ve yan etkileri değerlendirme becerisinin önemini daha da artırdı
- Yapay zeka kod yazabiliyor ama problemi tanımlayıp doğru yönü seçemiyor
- Uç tepkiler olarak bir yanda “programlamanın sonu”, diğer yanda “işe yaramaz bir heves” söylemleri vardı; ancak gerçek sonuç yapay zekayı kullanan geliştiricilerin üretkenliğinin artması oldu
- Bireysel ve yan proje geliştirme için giriş engeli keskin biçimde düştü; eskiden denenmeyen alanlara da (ML, oyunlar, yeni framework’ler) sohbet tabanlı öğrenmeyle erişmek mümkün hale geldi
- Bu akım, web’in uzun süredir taşıdığı yaratımın demokratikleşmesi yönünü daha da hızlandıran bir aşama olarak işledi
- Odak, kod bilmektan ne yapmak istediğini bilmeye kaydı
- Geliştirici olmayanlar da prototip üretimine katılmaya başladı; PM’ler, tasarımcılar ve alan uzmanları doğrudan araç geliştirerek teknik/teknik olmayan sınırları bulanıklaştırdı
- Indie hacker ve solo builder sayısı artarken, tek başına da gerçek bir ürün ortaya çıkarılabilen bir ortam gerçeğe dönüştü
- Aynı anda React Server Components, htmx, gelişen CSS ve JavaScript standartları ile Bun gibi araçlar, “platformun kendisini kullanalım” akımını güçlendirdi
- 2022–2023’teki büyük işe alım patlamasının ardından yeniden yapılanmalarla piyasa sarsılmış olsa da, yapay zeka geliştiricilerin yerini almadı ve yapay zekayı kullanabilme becerisi temel beklenti haline geldi
- 2025 itibarıyla web geliştirme, fikreden deployment’a kadar hızın tarihteki en yüksek seviyeye çıktığı bir noktada
- Cloud, framework ve yapay zekanın birleştiği bu ortamda bireyler her zamankinden daha güçlü üreticiler haline geldi
- Web’in
<br>etiketiyle başlayan vaadi, yani “herkesin bir şeyler üretip paylaşabilmesi” ilkesi, yapay zeka çağında daha da güçlenmiş bir biçimde sürüyor - Şu an gerçekten de web geliştirme yapmak için harika bir dönem
6 yorum
Keyifliydi, adeta bir tarih kitabı gibi okudum.
Cafe24’te bir sunucu hosting’i alıp, ZeroBoard kurarak kendi çapımızda bir topluluk gibi süsleyip eğlendiğimiz o günler haha
Keyifle okudum. Sanki ölmeden önce gözünüzün önünden geçen bir film şeridi gibiydi haha
Keyifle okudum.
Geliştirme ortamı tarafına geçince VS Code ve LSP'nin ortaya çıkışı var. Ardından bunun Tabnine'ın yapay zeka çağından önceki araçlarına kadar uzandığı söylenebilir.
JavaScript의 간략한 역사
Bunu bu yazıyla birlikte okumak iyi olur.
Hacker News yorumları
Her sayfada aynı header, navigasyon ve footer’a ihtiyaç vardı ama bunları paylaşmanın bir yolu yoktu demek tamamen doğru değil
Web sunucularında Server Side Includes (SSI) özelliği vardı; onu kullanmak istemiyorsanız bunu basitçe
cat header body > filekomutuyla da çözebilirdinizİlgili belge: NCSA SSI öğreticisi (1997)
Yazının sonunun, “...ve tüm bu süreç boyunca mütevazı
<br>etiketi hâlâ görevini yapmaya devam ediyor” gibi bir cümleyle bitmesini isterdim diye düşündümEskiden çalıştığım bir şirkette her dağıtımda yeni bir klasör oluşturup sembolik bağlantıyı en son sürüme çeviren bir sistem kullanıyorduk
Manueldi ama her sunucuda atomik geçiş yapılabilmesi ve geri almanın kolay olması nedeniyle bunun gerçekten zarif bir yöntem olduğunu düşünürdüm
Ondan önce onlarca sunucuya dosyaları elle kopyalayıp 10-20 adımlık komutları tek tek çalıştırmak gerekiyordu; onun yanında bu çok daha güvenli ve basitti
Daha sonra otomasyon araçlarını denedim ama yapılandırmaları karmaşık ve opaktı; sonuçta aslında daha kırılgan bir dağıtım süreci ortaya çıkıyordu
“CGI betikleri yazmak için Perl veya C öğrenmeniz gerekiyordu” deniyor ama gerçekten yüzlerce satıra ihtiyaç var mıydı diye merak ettim
Aslında basit bir C fonksiyonuyla bile URL parametreleri okunabiliyor
Ben yakın zamanda tamamen saf C ile bir anket web sitesi yaptım ve eskiden yazdığım HTML üretim kütüphanesi sayesinde bu epey kolay oldu
İşletim sisteminin CGI kütüphanesini refactor edip kullandım ve SQLite’ı statik bağlayarak tek bir binary olarak dağıttım
Web sunucusu olmadan bile stdin/stdout ile test etmek mümkündü
Sonuç olarak CRUD web siteleri C ile de yeterince kolay; ayrıca HTML bir ağaç yapısı olduğundan string interpolation yanlış bir yaklaşım gibi geliyor
<param>ile bittiği için eşleştiriyor; bu nedenle tam eşleşmeyebilir ve yüzde kodlamayı da işlemiyorAma aradan 30 yıl geçmiş olmasına rağmen hâlâ en yaygın aracın string interpolation olduğunu hissediyorum
Gerçekten kapsamlı ve iyi yazılmış bir yazıydı
Yazar iyimser ama ben web geliştirmeyi geçici çözümlerin birikimiyle oluşmuş sallantılı bir kule gibi görüyorum
Web standardizasyonu birkaç tarayıcı üreticisinin kontrolüne geçince temel sorunları çözmek yerine sadece üstüne yeni katmanlar eklendiğini düşünüyorum
Son dönemdeki üretken yapay zeka araçları da bu karmaşıklığı aşmak için geliştirilmiş geçici çözümler gibi görünüyor
Sonunda bu kulenin bir gün çökeceğine inanıyorum
Bu yazı muhtemelen klasik olarak kalacak bir makale olacak
Günümüz geliştiricilerinin kaçırdığı web teknolojisi tarihini özlü biçimde aktarıyor
“Virtual private servers changed this…” bölümünü okurken aklıma geldi
Aslında ilk VPS sağlayıcısı 2001 civarında JohnCompanies idi ve FreeBSD jail tabanlıydı
Müşteriler uzaktan yedekleme istiyordu ve rsync tercih ediliyordu
Bu yüzden dört yıl sonra
rsync.netalan adını kaydettim (rsync/samba yazarlarından izin alarak)1998’den 2012’ye kadar web geliştirme yaptım; bu yazıyı okurken adeta anı yolculuğuna çıktım
Aynı zamanda sonrasındaki değişimleri tek bakışta görebileceğiniz bir özet gibi
Yazının içeriği, benim hatırladığım web teknolojisi akışıyla neredeyse tamamen örtüşüyor
PHP öncesi CGI zahmetliydi ama mod_perl ve FastCGI sayesinde kullanılabilir durumdaydı
Derlemeli bir dille CGI yazmak neredeyse mazoşizm gibiydi; PHP ise bu açıdan hafif ve eğlenceliydi
Ben frontend geliştirmeyi jQuery yükselmeden hemen önce bıraktım
Gerçekten şaşırtıcı bir yazıydı
Sadece teknik bir kronoloji sıralamıyor, her dönemin ruhunu (zeitgeist) canlı biçimde aktarıyor
Genelde yalnızca sözlü olarak aktarılan insani bağlamı yazıya dökmesi özellikle etkileyiciydi
“Nasıl bu kadar karmaşık bir bulut dünyasına geldik?” sorusunu eleştirmekten çok, bunu her dönemde verilmiş makul kararların birikmesiyle oluşan tarihsel sonuç olarak anlamamı sağlıyor
İnsan tarihinin ironisini teknoloji tarihinde hissedebiliyorsunuz