Bir sayfayı yenileyip CSS'inizin yok oluşunu izlediyseniz veya bir dosyayı geri alıp (revert) neyi değiştirdiğinizi hatırlayamadığınızı fark ettiyseniz, kod yazmak ile onu kontrol etmek arasındaki boşluğu anlıyorsunuz demektir. Profesyonel web geliştirmenin temelinde iki fikir yatar: Kodunuzun nasıl çalıştığını ve verileri nasıl sakladığını belirleyen tarayıcı ortamı (browser environment) ve deneylerinizin kalıcı olarak kaybolmuş öğleden sonralarına dönüşmesini engelleyen Git. Her ikisinde de erkenden uzmanlaşmak, sizi daha sonra karşılaşacağınız gizemli hatalardan ve bozuk dağıtımlardan (deployments) kurtarır.

Bir Adres Sistemi Olarak URL

Navigasyon çubuğuna her adres yazdığınızda, tarayıcıya bir dizi koordinat vermiş olursunuz. Bir Uniform Resource Locator (Tekdüze Kaynak Bulucu) sadece bir karakter dizisi değildir; altı farklı parçaya ayrılan yapılandırılmış bir talimat kılavuzudur.

İlk olarak genellikle HTTPS olan protokol (protocol) gelir. Bu, tarayıcıya sunucuyla nasıl konuşacağını ve konuşmanın şifrelenip şifrelenmeyeceğini söyler. Ardından alan adı (domain), DNS aracılığıyla bir IP adresine dönüşür; böylece tarayıcı hangi fiziksel veya sanal makineyi arayacağını bilir.

Port, o sunucu üzerindeki tam kapı numarasını belirtir. Üretim (production) sitelerinde bunu nadiren görürsünüz çünkü web sunucuları HTTPS için varsayılan olarak 443 portunu kullanır, ancak yerel geliştirmede sürekli portlarla uğraşırsınız. localhost:3000 veya localhost:5173 gibi örnekleri düşünün. Eğer port yanlışsa, bağlantı basitçe zaman aşımına uğrar.

Sırada, /blog/2024/march gibi belirli bir dosyaya veya rotaya (route) işaret eden yol (path) vardır. Bunu, soru işaretinden sonra gelen ve ?category=javascript&sort=date gibi verileri sunucuya geri taşıyan sorgu dizisi (query string) takip eder. Son olarak, bir diyez (#) sembolü ile işaretlenen fragman (fragment), sayfa içindeki belirli bir bölüme işaret eder. Fragmanlar, dokümantasyon bağlantıları ve erişilebilirlik için kullanışlıdır çünkü kullanıcıları belgeyi yeniden yüklemeden doğrudan bir başlığa götürürler.

Bu yapıyı anlamak; yönlendirme hatalarını ayıklamanıza, daha temiz API'lar oluşturmanıza ve ağ günlüklerini (network logs) gözlerinizi kısmadan okumanıza yardımcı olur.

DOM Sizin Çalışma Zamanınızdır (Runtime)

Tarayıcılar, bir derleyicinin .c dosyanızı önce ayrıştırmadan (parse etmeden) çalıştırmadığı gibi, ham HTML metnini de doğrudan işlemezler (render etmezler). Bir tarayıcı işaretlemenizi (markup) indirdiğinde, etiketleri ve metni Document Object Model'e (Belge Nesne Modeli) dönüştürür. Bu, her öğenin JavaScript'in dokunabileceği bir düğüm (node) haline geldiği bellek içi (in-memory) bir ağaçtır.

DOM, sayfanızın yaşayan versiyonudur. Bir hamburger simgesine tıkladığınızda yan menü dışarı kayıyorsa, JavaScript sunucudan yeni bir HTML istemiyor demektir. DOM ağacını sorguluyor, bir sınıfı (class) değiştiriyor ve geçişi yönetmesi için CSS'e bırakıyordur. Aynı durum form doğrulama, canlı sayaçlar ve sonsuz kaydırma (infinite scroll) için de geçerlidir. Eğer bir öğeyi inceleyip (inspect) arka plan rengini değiştirirseniz, diskteki dosyayı değil, doğrudan DOM'u düzenliyorsunuz demektir.

Bu önemlidir çünkü editörünüzde yazdığınız yapı ile tarayıcının tükettiği yapı birbirinden farklılaşabilir. Betikler (scripts) yeni düğümler ekleyebilir. Üçüncü taraf widget'lar işaretleme ekleyebilir. Stil verme veya olay dinleyicileri (event listeners) konusunda hata ayıklarken, sadece orijinal kaynak kodunuza değil, işlenmiş (rendered) DOM'a bakmanız gerekir.

Veriler Tarayıcıda Nerede Yaşar?

HTTP tasarımı gereği durumsuzdur (stateless); bu da her isteğin sunucuya, son ziyaretten haberi olmayan bir yabancı gibi geldiği anlamına gelir. Kalıcılığı sağlamak için tarayıcılar, her biri farklı kurallara ve ömürlere sahip üç ana depolama mekanizması sunar.

LocalStorage, kullanıcı tarayıcıyı tamamen kapatsa bile küçük miktardaki verileri basit anahtar-değer (key-value) dizeleri olarak saklar. Karanlık mod anahtarı veya daraltılmış bir yan menü durumu gibi düşük riskli tercihler için doğru yerdir. Hassas kimlik bilgileri için kullanmayın; alan adında çalışan her betik tarafından erişilebilir ve kendi kendine asla sona ermez.

SessionStorage, API açısından aynı görünür ancak farklı davranır. Verileri tek bir sekmeye izole eder. Eğer kullanıcınız bir ödeme akışını açar, formun yarısını doldurur ve yanlışlıkla sayfayı yenilerse, SessionStorage bu taslağı tutabilir. Sekme kapandığı anda veriler kaybolur. Bu da onu geçici, sekmeye özel iş akışları için LocalStorage'dan daha temiz kılar.

Cache (Önbellek); resimler, yazı tipleri, stil dosyaları ve betikler gibi daha büyük varlıkları (assets) yönetir. Her ziyarette iki megabaytlık bir ana görseli (hero image) tekrar çekmek yerine, tarayıcı bir kopyayı yerel olarak saklar ve sunucunun daha güncel bir versiyona sahip olup olmadığını kontrol etmek için başlıkları (headers) kontrol eder. Bu, sitenizin tekrarlanan ziyaretlerde ne kadar hızlı hissettireceğini doğrudan kontrol eder.

Günlük Bir Alışkanlık Olarak DevTools

Most developers open the browser console to log a variable and stop there. That is like owning a workshop and using only the screwdriver. The browser DevTools are an integrated debugging environment, and you should learn to use at least four of its panels deliberately.

The Elements panel shows the live DOM and its computed styles. When a layout breaks, inspect the node and look at the cascade. You can toggle properties on and off in real time without touching your source code, which makes finding specificity wars much faster than guessing in your editor.

The Console shows errors with stack traces, but it is also a REPL. You can query selectors, test API responses, or evaluate expressions against the current page state.

The Network panel reveals the timeline of every request. You can spot a failing endpoint, measure API latency, and identify which asset is blocking your first paint. If a user says the app is slow, this is where you prove whether the server or the frontend is the bottleneck.

The Application panel lets you inspect cookies, LocalStorage, and SessionStorage in one place. When testing authentication or debugging a state bug, you can clear storage manually to simulate a brand-new visitor without nuking your entire browsing history.

Thinking in Git Stages, Not Files

Saving a file is not the same as versioning it. Git works because it forces you to think about changes in three distinct stages before anything is permanently recorded.

Your working tree is the messy desk. You edit files, break things, comment out experiments, and rename variables. Nothing is tracked yet. If you delete a file here and you have not committed it, it is simply gone.

The staging area, also called the index, is where you decide what matters. With git add, you place selected changes into a pre-commit holding zone. The staging area exists so you can separate unrelated work. If you fixed a login bug and also refactored a utility function, you can stage them independently and write two clear commit messages instead of one vague blob.

Finally, the local repository stores the actual history. Running git commit locks your staged changes into a snapshot with a unique hash, a message, and a timestamp. That snapshot is now recoverable even if you butcher the file tomorrow. Commits are cheap, so make them small and logical. A history of tiny, readable commits is far more useful than a single giant dump of Friday afternoon code.

The Real Takeaway

These topics are not theoretical computer science. They are practical control systems. When you understand how a URL breaks apart, you read logs better. When you treat the DOM as a living runtime instead of static markup, your JavaScript becomes predictable. When you use LocalStorage and SessionStorage correctly, you stop leaking state across tabs. When you open DevTools with intent, you stop guessing why a button is green instead of blue. And when you respect Git’s three-stage workflow, you stop fearing the undo button.

Do not try to memorize every edge case at once. Instead, build a habit: inspect the DOM for ten minutes when a layout breaks, check the Network tab before blaming the backend, and commit every time you finish a coherent thought. The reliability of your applications will follow.