Bir API isteğinin ne zaman tamamlanacağını, dosyanın ne zaman okunacağını veya kullanıcının konum bilgisinin ne zaman geleceğini önceden bilemeyiz. JavaScript bu bekleme süresinde uygulamayı durdurmak yerine diğer işleri yürütür. Ancak sonuçları callback fonksiyonlarıyla takip etmeye çalışmak, kısa sürede girintilerle dolu bir “callback cehennemine” dönüşebilir. Promise nesneleri, gelecekte tamamlanacak işlemleri düzenli, zincirlenebilir ve güvenilir biçimde temsil ederek bu karmaşaya çözüm sunar.
Devamı...
Bir web sayfası kullanıcıya yalnızca bilgi gösteriyorsa dijital bir afişten pek farklı değildir. Onu gerçek bir arayüze dönüştüren şey; tıklamaları, tuşları, kaydırmaları ve form girişlerini algılayıp uygun tepkiler verebilmesidir. JavaScript’teki olay dinleyicileri, tarayıcı ile kullanıcı arasındaki bu konuşmayı yönetir.
Devamı...

JavaScript öğrenmeye başlamak için devasa bir kurulum sihrine ihtiyacınız yoktur; modern bir tarayıcı bile ilk programınızı çalıştırmaya yeter. Ancak gerçek projeler geliştirmek istediğinizde tarayıcı konsolu, Node.js, VS Code ve canlı sunucu araçlarından oluşan düzenli bir çalışma ortamı kurmak büyük rahatlık sağlar. Gelin JavaScript atölyemizin ışıklarını birlikte açalım.
Devamı...
Bir alışveriş sepetindeki ürünlerden sınav notlarına kadar pek çok veri, yazılım dünyasında listeler hâlinde karşımıza çıkar. JavaScript dizileri bu verileri tek bir değişkende düzenli biçimde saklarken map, filter ve reduce gibi yüksek mertebe metotlar, döngü karmaşasına kapılmadan verileri dönüştürmemizi sağlar.
Devamı...
Programlamada fonksiyonları yalnızca çağrıldığında çalışan kod paketleri olarak düşünmek eksik kalır. JavaScript gibi dillerde fonksiyonlar aynı zamanda değişkenlere atanabilir, başka fonksiyonlara gönderilebilir ve sonuç olarak döndürülebilir. Kısacası fonksiyonlar, dilin ayrıcalıklı üyeleri değil; diğer değerlerle aynı haklara sahip birinci sınıf vatandaşlarıdır.

Devamı...
JavaScript’te class anahtar sözcüğünü gördüğünüzde dilin prototipleri bırakıp C++ veya Java gibi tamamen sınıf tabanlı bir modele geçtiğini düşünebilirsiniz. Fakat perde arkasında hâlâ prototip zinciri çalışır. ES6 sınıfları, mevcut sistemi değiştiren yeni bir nesne modeli değil; yapıcıları, metotları ve kalıtımı daha okunabilir biçimde tanımlayan modern bir sözdizimidir.
Devamı...
Bir web sayfasındaki başlığın aniden değişmesi, yeni bir kartın listeye eklenmesi veya bir düğmeye basınca menünün açılması sihir değildir. Perdenin arkasında çoğunlukla JavaScript ve DOM birlikte çalışır. DOM, statik görünen HTML belgesini programlama yoluyla okunabilen ve değiştirilebilen canlı bir yapıya dönüştürür.
Devamı...
Bir web servisine istek gönderirken, dosya okurken veya veritabanından kayıt beklerken uygulamanın tamamen durmasını istemeyiz. JavaScript’in async/await sözdizimi, arka planda asenkron çalışan bu işlemleri sanki adım adım ilerleyen senkron kodlarmış gibi yazmamızı sağlar. Sonuç; daha az iç içe fonksiyon, daha anlaşılır hata yönetimi ve geliştiricinin saç baş yolma ihtimalinde kayda değer bir azalmadır.
Devamı...

Bir web sayfası veri indirirken düğmeler çalışmıyor, animasyonlar takılıyor ve kullanıcı boş boş ekrana bakıyorsa tarayıcı muhtemelen uzun bir işlem tarafından meşgul edilmiştir. Asenkron programlama; ağ isteği, zamanlayıcı veya dosya okuma gibi sonucu hemen hazır olmayan işleri beklerken ana akışın çalışmaya devam etmesini sağlar. Callback, yani geri çağırım fonksiyonu ise işlem tamamlandığında “Bitti, şimdi ne yapayım?” sorusuna verilen cevaptır.
Devamı...
Bir makine öğrenmesi modeli dünyayı doğrudan gözlemlemez; ona sunduğumuz veri setinin penceresinden bakar. Pencerenin camı çizik, renkli veya yalnızca belirli bir sokağa dönükse model de gerçeği öyle sanır. Bu nedenle toplumsal önyargılar, kötü niyetli bir algoritma yazılmasa bile veri toplama, etiketleme ve örnekleme süreçlerinden modele sessizce sızabilir.

Devamı...
Bir sızma testinde ilk erişimi elde etmek final değil, yalnızca hikâyenin dönüm noktasıdır. Post-exploitation aşaması; ele geçirilen erişimin etkisini, saldırganın ilerleyebileceği yolları ve kurumun bu hareketleri fark etme kapasitesini yetkilendirilmiş sınırlar içinde incelemeyi amaçlar. Buradaki başarı, sisteme gizlice yerleşmekten çok riski güvenli biçimde kanıtlamak, iz bırakmadan değil kontrollü iz bırakarak çalışmak ve test sonunda ortamı başlangıç durumuna döndürmektir.

Devamı...
Bir satranç motorunun tahtaya bakıp “Bu hamle bana mantıklı geliyor” dediğini hayal ederiz; oysa uzun yıllar boyunca makinelerin sezgisi değil, yalnızca yorulmak bilmeyen hesap gücü vardı. Satranç motorlarının Minimax’tan AlphaZero’ya uzanan tarihi, daha fazla pozisyon hesaplamanın ötesinde, “Zekâ nedir?” sorusuna verilen mühendislik cevaplarının da tarihidir.
Devamı...

Bir kod bloğunu okurken bazen her şey ilk bakışta yerine oturur; bazen de üç satır sonra değişkenlerin neyi temsil ettiğini unutup başa dönersiniz. Sorun her zaman algoritmanın karmaşıklığı değildir. Kod, bilgisayar için kusursuz çalışırken insan zihni için yorucu olabilir. Bunun nedeni, beynimizin aynı anda işleyebildiği bilgi miktarının sınırlı olmasıdır.
Devamı...
Bir açık kaynak lisansı seçmek, yalnızca hukuk metinleri arasında tercih yapmak değildir; geliştiriciler, şirketler ve kullanıcılar arasında oynanan uzun vadeli bir strateji oyununa katılmaktır. MIT özgürlüğü en az koşulla dağıtırken GPL, bu özgürlüğün sonraki sürümlerde de korunmasını ister. Peki rasyonel aktörlerin bulunduğu bir ekosistemde hangi yaklaşım kazanır?
Devamı...

Bir Git deposunun commit geçmişi yalnızca kodun nasıl değiştiğini anlatmaz; ekibin iletişim alışkanlıklarını, baskı altında nasıl davrandığını ve sorumluluğu nasıl paylaştığını da gösterir. “fix”, “nihayet çalıştı” veya “ödeme servisinde zaman aşımını düzelt” ifadeleri teknik olarak aynı değişikliği işaret edebilir; fakat her biri bambaşka bir ekip kültürünün izini taşır.
Devamı...
Bir grup insanın ortak karar vermesi gerektiğini düşünün: Bazıları dürüst, bazıları kararsız, bazılarıysa kasıtlı olarak yalan söylüyor. Üstelik kimse aynı odada değil; iletişim gecikebilir, mesajlar kaybolabilir ve farklı kişilere farklı bilgiler ulaşabilir. Bu senaryo bir aile grubunu, şirket toplantısını veya siyasi ittifakı çağrıştırsa da dağıtık sistemlerin en ünlü problemlerinden birini anlatır: Bizans Generalleri Problemi. Bilgisayar bilimindeki bu teknik mesele, özünde güvenilir bir otorite olmadan işbirliği yapabilmenin hikâyesidir.
Devamı...
Kablosuz ağ güvenlik testi, yalnızca parolayı “kırmayı” denemek değildir; kullanılan protokolün güvenlik modelini, istemci davranışlarını ve parola politikasını birlikte değerlendirmektir. Aircrack-ng paketi bu süreçte trafiği izleme, paket yakalama ve parola dayanıklılığını çevrimdışı sınama gibi görevler sunar. Bu çalışmaları yalnızca sahibi olduğunuz veya test iznini yazılı olarak aldığınız, izole bir laboratuvar ağında gerçekleştirmelisiniz.

Devamı...
Bir ağdaki güvenlik açıklarını elle bulmaya çalışmak, karanlık bir odada LEGO parçası aramaya benzer: mutlaka bir şeye basarsın ama acı biraz geç gelir. Zafiyet analizi, Nessus veya OpenVAS gibi entegre tarayıcılarla sistemlerdeki bilinen güvenlik açıklarının otomatik tespit edilmesi, önceliklendirilmesi ve raporlanması sürecidir. Amaç saldırmak değil; saldırganlardan önce eksikleri görmek, ölçmek ve kapatmaktır.

Devamı...
Bir web uygulamasını güvenli sanmak, kapıyı kilitleyip pencereyi açık bırakmaya benzer. Burp Suite ve OWASP ZAP gibi proxy araçları, tarayıcı ile sunucu arasına oturarak HTTP trafiğini görünür kılar; böylece SQL enjeksiyonu, XSS ve yetkilendirme hataları gibi mimari zayıflıkları kontrollü ve izinli ortamlarda analiz edebiliriz.
Devamı...
Bir zafiyetin tespit edilmesi, sistemin gerçekten ele geçirilebildiği anlamına gelmez; yalnızca araştırılması gereken bir kapı bulunduğunu gösterir. Sızma, bu kapının yetkili ve izole bir laboratuvar ortamında kontrollü biçimde açılmasıdır. Metasploit Framework ise hazır istismar modülleri, payload seçenekleri ve oturum yönetimiyle bu süreci standartlaştıran güçlü bir güvenlik test platformudur.
Devamı...