Software Engineering at Google Kitap Özeti



"Software Engineering at Google" kitabının bölümlerinin özetleri aşağıda verilmiştir:


### Part I: Thesis


#### 1. What Is Software Engineering?

Bu bölüm, yazılım mühendisliği ile programlama arasındaki farkları vurgular. Yazılım mühendisliğinin zaman, ölçek ve değişimle nasıl başa çıkması gerektiğini tartışır. Google'ın yazılım mühendisliği konusundaki benzersiz perspektifini ve sürdürülebilir yazılım geliştirme yöntemlerini açıklar.


### Part II: Culture


#### 2. How to Work Well on Teams

Takımlarda iyi çalışmanın önemini ve bu konuda kullanılabilecek yöntemleri ele alır. Kodun saklanmaması gerektiğini, erken tespit ve takım çalışmasının önemini vurgular.


#### 3. Knowledge Sharing

Bilgi paylaşımının zorluklarını ve bu zorlukların üstesinden gelmek için kullanılabilecek yöntemleri tartışır. Google'daki bilgi paylaşım kültürünü ve bunun neden önemli olduğunu açıklar.


#### 4. Engineering for Equity

Çeşitliliğin ve kapsayıcılığın önemini vurgular. Farklı kültürel kapasiteyi artırma ve süreçleri gözden geçirme üzerine odaklanır.


#### 5. How to Lead a Team

Bir takımın nasıl yönetileceğini ve liderliğin farklı yönlerini tartışır. Mühendislik yöneticilerinin ve teknik liderlerin rollerini açıklar.


#### 6. Leading at Scale

Büyük ölçekli projelerde liderlik yapmanın zorluklarını ve bu zorluklarla başa çıkma yöntemlerini tartışır. Sürekli karar verme ve takımın kendi kendine yeterli hale gelmesini sağlama konularını ele alır.


#### 7. Measuring Engineering Productivity

Mühendislik üretkenliğini ölçmenin neden önemli olduğunu ve bu ölçüm için kullanılabilecek metrikleri tartışır. Veri kullanarak metrikleri doğrulama ve sonuçları takip etme konularını ele alır.


### Part III: Processes


#### 8. Style Guides and Rules

Kodlama standartlarının ve kurallarının neden önemli olduğunu açıklar. Google'daki stil kılavuzlarının oluşturulma sürecini ve bu kuralların nasıl uygulandığını tartışır.


#### 9. Code Review

Kod inceleme sürecini ve bu sürecin Google'da nasıl işlediğini açıklar. Kod doğruluğu, tutarlılık ve bilgi paylaşımı gibi kod incelemenin faydalarını tartışır.


#### 10. Documentation

Dokümantasyonun ne olduğunu ve neden gerekli olduğunu açıklar. Farklı dokümantasyon türlerini ve hedef kitleleri tanımlar.


#### 11. Testing Overview

Test yazmanın neden önemli olduğunu ve Google'da test kültürünü tartışır. Testlerin hızla yazılması, çalıştırılması ve tepki verilmesi gerektiğini vurgular.


#### 12. Unit Testing

Birim testlerinin önemini ve nasıl yazılması gerektiğini açıklar. Değişmez testler yazmanın ve testleri kamu API'leri üzerinden gerçekleştirmenin önemini vurgular.


#### 13. Test Doubles

Test double'larının yazılım geliştirme üzerindeki etkisini ve Google'da nasıl kullanıldığını açıklar. Mocking, stubbing ve interaction testing gibi test tekniklerini tartışır.


#### 14. Larger Testing

Daha büyük testlerin ne olduğunu ve Google'da nasıl uygulandığını açıklar. Büyük testlerin yapısı ve farklı büyük test türlerini tartışır.


#### 15. Deprecation

Deprecation sürecinin neden zor olduğunu ve bu süreci yönetmenin yollarını tartışır. Farklı deprecation türlerini ve bu sürecin nasıl yönetilmesi gerektiğini açıklar.


### Part IV: Tools


#### 16. Version Control and Branch Management

Sürüm kontrolünün ve dal yönetiminin neden önemli olduğunu açıklar. Google'da sürüm kontrolü nasıl yapıldığını ve sürüm kontrol sistemlerinin geleceğini tartışır.


#### 17. Code Search

Kod arama araçlarının nasıl çalıştığını ve Google'da kod aramanın nasıl kullanıldığını açıklar. Kod arama araçlarının tasarımı ve ölçeklenebilirliği tartışılır.


#### 18. Build Systems and Build Philosophy

Build sistemlerinin amacını ve modern build sistemlerinin nasıl çalıştığını açıklar. Build sistemlerinin Google'da nasıl kullanıldığını ve modüller ile bağımlılık yönetiminin nasıl yapıldığını tartışır.


#### 19. Critique: Google’s Code Review Tool

Google'ın kod inceleme aracı Critique'in nasıl çalıştığını ve kod inceleme sürecinin aşamalarını açıklar. Kod inceleme araçlarının prensiplerini tartışır.


#### 20. Static Analysis

Statik analiz araçlarının nasıl çalıştığını ve etkili statik analiz yapmanın ipuçlarını tartışır. Google'ın Tricorder platformunu açıklar.


#### 21. Dependency Management

Bağımlılık yönetiminin neden zor olduğunu ve Google'ın bağımlılıkları nasıl yönettiğini tartışır. SemVer ve minimum versiyon seçimi gibi kavramları açıklar.


#### 22. Large-Scale Changes

Büyük ölçekli değişikliklerin ne olduğunu ve bu değişikliklerin nasıl yönetildiğini tartışır. Büyük ölçekli değişikliklerin zorlukları ve süreçlerini açıklar.


#### 23. Continuous Integration

Sürekli entegrasyonun ne olduğunu ve Google'da nasıl uygulandığını açıklar. Sürekli entegrasyonun faydalarını ve zorluklarını tartışır.


#### 24. Continuous Delivery

Sürekli teslimatın ne olduğunu ve Google'da nasıl uygulandığını açıklar. Sürekli teslimatın temel prensiplerini ve takım kültürüne etkilerini tartışır.


#### 25. Compute as a Service

Yönetilen hesaplama ortamlarının nasıl çalıştığını ve Google'da nasıl kullanıldığını açıklar. Compute as a Service'in faydalarını ve zorluklarını tartışır.


### Part V: Conclusion


#### Afterword

Kitabın son sözü, Google'ın yazılım mühendisliği konusunda paylaştığı bilgilerin genel bir değerlendirmesini sunar.


Bu özetler, kitabın temel içeriğini ve ana temalarını kapsamaktadır. Her bölüm, Google'ın yazılım mühendisliği uygulamaları ve deneyimlerinden elde edilen önemli dersleri paylaşmaktadır.


### 1. What Is Software Engineering? Bölümünün Geniş Türkçe Özeti


Bu bölümde yazılım mühendisliği ile programlama arasındaki temel farklar üzerinde durulmaktadır: zaman, ölçek ve değişim. Yazılım mühendisliği, yalnızca kod yazmanın ötesinde, bu kodun zaman içindeki sürdürülebilirliğini ve yönetimini de içerir. Google'ın perspektifine göre, "Yazılım mühendisliği, zaman içinde entegre edilmiş programlamadır." Bu, yazılım mühendisliğinin sadece kod geliştirmeyi değil, aynı zamanda bu kodun bakımını ve geliştirilmesini de kapsadığını ifade eder.


#### Zaman ve Değişim


Kodun yaşam süresi sorusu, yazılım mühendisliğinin temel ayrım noktalarından biridir. Kodun ömrü kısa olduğunda, değişikliklere uyum sağlama gerekliliği azalır. Ancak, uzun vadeli projelerde, kodun sürekli olarak değişen teknoloji ve gereksinimlere uyum sağlaması gerekir. Bu sürdürülebilirlik kavramı, yazılım mühendisliğinin temelini oluşturur. Projeniz, yazılımın beklenen ömrü boyunca değerli değişikliklere tepki verebilecek kapasitede olmalıdır. Kısa vadeli projelerde bu genellikle daha kolaydır, ancak uzun vadeli projelerde bu durum çok daha karmaşıktır.


#### Ölçek ve Büyüme


Yazılım mühendisliği, genellikle bir ekip çalışmasıdır. Bir programlama görevi bireysel bir yaratım eylemi olabilirken, yazılım mühendisliği görevleri çok kişili bir çaba gerektirir. Bu, yazılım mühendisliği ile programlama arasındaki diğer bir önemli farktır. Takım organizasyonu, proje kompozisyonu ve yazılım projelerinin politikaları ve uygulamaları, yazılım mühendisliğinin karmaşıklığını belirleyen unsurlardır. Ölçek arttıkça, iletişim ve insan kaynakları yönetimi gibi sorunlar da artar.


#### Karar Alma ve Maliyetler


Yazılım mühendisliği, daha karmaşık kararlar almayı ve bu kararların sonuçlarını değerlendirmeyi gerektirir. Yazılım mühendislerinin ve mühendislik liderlerinin görevi, organizasyon, ürün ve geliştirme iş akışı için sürdürülebilirlik ve ölçeklenebilirlik maliyetlerini yönetmektir. Karar alırken, farklı yollar arasında yapılan takasları değerlendirmek ve rasyonel kararlar almak önemlidir. Bazen bakım değişikliklerini ertelemek veya iyi ölçeklenmeyen politikaları benimsemek gerekebilir, ancak bu kararlar açık ve maliyetleri belirli olmalıdır.


#### Sürdürülebilirlik


Yazılım mühendisliği, yazılımın sürdürülebilir olmasını sağlamayı hedefler. Bu, yazılımın yaşam süresi boyunca teknolojik değişikliklere, bağımlılıklara ve ürün gereksinimlerine uyum sağlayabilme yeteneğini gerektirir. Hedef, değişiklik yapma kapasitesine sahip olmaktır, her zaman değişiklik yapmak zorunda olmak değil.


#### Sonuç


Yazılım mühendisliği, programlamanın ötesine geçer ve zaman içinde yazılımın bakımını ve gelişimini içerir. Google'ın deneyimleri, yazılım mühendisliğinin sürdürülebilirlik, ölçek ve karar alma gibi temel prensipler üzerine kurulu olduğunu göstermektedir. Bu bölümde tartışılan ilkeler, uzun vadeli ve büyük ölçekli yazılım projeleri için geçerlidir ve daha küçük projeler için de uygulanabilir dersler içermektedir12:1†source】【12:2†source】【12:4†source】【12:5†source】【12:7†source.


### 2. How to Work Well on Teams Bölümünün Geniş Türkçe Özeti


Bu bölüm, yazılım mühendisliğinin bir ekip işi olduğunu ve başarılı bir mühendislik ekibinde çalışmak için gerekli olan sosyal ve kültürel becerileri vurgular. Ekip çalışmasının verimliliği artırdığı ve daha başarılı sonuçlar elde edildiği üzerinde durulmaktadır. Bölüm, başarılı bir ekip oluşturmanın ve yönetmenin yollarını üç temel prensip üzerinden açıklar: alçakgönüllülük, saygı ve güven.


#### Gizlememe


Bu bölümde, mühendislerin çalışmalarını ve kodlarını başkalarından gizlememeleri gerektiği vurgulanır. Gizleme, hem bireysel hem de ekip performansını olumsuz etkiler. Erken geri bildirim almak ve işbirliği yapmak, projenin başarısı için kritik öneme sahiptir. Projeyi gizlemek, büyük hataların erken tespit edilmesini ve düzeltilmesini engelleyebilir.


#### Erken Tespit


Projelerin erken aşamalarında yapılan hataların tespiti ve düzeltilmesi daha kolay ve daha az maliyetlidir. Bu nedenle, projelerin erken aşamalarında mümkün olduğunca çok geri bildirim almak önemlidir. Geri bildirim döngüleri, projenin doğru yolda ilerlemesini sağlar ve büyük hataların önüne geçer.


#### Otobüs Faktörü


"Otobüs faktörü", bir projede kritik bilgiyi taşıyan kaç kişinin otobüs çarpması durumunda projenin tamamen duracağı anlamına gelir. Bilgi ve sorumlulukların ekip içinde yayılması, projenin sürdürülebilirliği açısından önemlidir. Eğer proje yalnızca bir kişinin bilgi ve becerilerine dayanıyorsa, bu kişi projeden ayrıldığında proje büyük zarar görebilir.


#### İlerleme Hızı


Ekip çalışmasının, bireysel çalışmadan daha hızlı ve verimli olduğunu vurgular. Ekip üyeleri birbirlerinden öğrenir ve birbirlerine destek olurlar, bu da projelerin daha hızlı ilerlemesini sağlar. Tek başına çalışmanın zorlukları ve yavaş ilerleme hızı, ekip çalışmasıyla aşılabilir.


#### Sosyal Etkileşim


Başarılı bir ekip oluşturmanın temelinde üç sosyal beceri bulunur: alçakgönüllülük, saygı ve güven. Bu üç prensip, sağlıklı etkileşim ve işbirliğinin temelini oluşturur. Ekip üyeleri birbirlerine karşı alçakgönüllü, saygılı ve güven dolu olmalıdır. Bu, ekip içinde sağlıklı bir çalışma ortamı yaratır ve verimliliği artırır.


#### Alçakgönüllülük


Ekip üyeleri, evrenin merkezi olmadıklarını ve hatalar yapabileceklerini kabul etmelidir. Kendini geliştirmeye açık olmalıdırlar ve başkalarının görüşlerine değer vermelidirler. Alçakgönüllülük, ekip içinde sağlıklı bir işbirliği ortamı yaratır.


#### Saygı


Ekip üyeleri, birbirlerine karşı samimi bir ilgi göstermeli ve birbirlerinin yeteneklerine ve başarılarına değer vermelidir. Saygı, ekip içinde olumlu bir çalışma ortamı yaratır ve işbirliğini teşvik eder.


#### Güven


Ekip üyeleri, birbirlerinin yetkinliklerine güvenmeli ve gerektiğinde kontrolü başkalarına bırakabilmelidir. Güven, ekip içinde sağlıklı bir dinamik oluşturur ve verimliliği artırır.


#### Suçsuzluk Kültürü


Hatalardan öğrenmek ve bu hataları belgelemek, ekibin sürekli olarak gelişmesine yardımcı olur. Hataları suçlama yerine, bu hatalardan ders çıkarmak ve gelecekte tekrarlanmamasını sağlamak önemlidir. Suçsuzluk kültürü, ekibin daha açık ve dürüst bir şekilde çalışmasını sağlar.


### Sonuç


Bu bölüm, yazılım mühendisliğinde ekip çalışmasının önemini ve başarılı bir ekip oluşturmak için gerekli olan sosyal ve kültürel becerileri vurgular. Alçakgönüllülük, saygı ve güven, sağlıklı ve verimli bir ekip oluşturmanın temel taşlarıdır. Başarılı bir yazılım mühendisliği ekibi, bu üç prensip üzerine inşa edilmiştir ve sürekli olarak gelişmeye açıktır16:0†source】【16:1†source】【16:4†source】【16:8†source】【16:13†source.


### 3. Knowledge Sharing Bölümünün Geniş Türkçe Özeti


Bu bölüm, Google'da bilgi paylaşımının önemini ve etkin bilgi paylaşımı için gereken yöntemleri tartışır. Google'ın bilgi paylaşım kültürünü ve bunun organizasyonel verimlilik üzerindeki etkilerini ele alır.


#### Bilgi Paylaşımının Zorlukları


Bilgi paylaşımının zorlukları arasında psikolojik güvenlik eksikliği, bilgi adacıkları, tek hata noktaları ve papağanlama yer alır. Psikolojik güvenlik eksikliği, insanların hata yapmaktan veya risk almaktan korktukları bir ortam yaratır. Bilgi adacıkları, organizasyon içinde farklı grupların birbirleriyle iletişim kurmadan kendi bilgilerini oluşturmasıdır. Tek hata noktaları, kritik bilginin yalnızca bir kişide bulunmasıdır. Papağanlama ise bilgiyi anlamadan kopyalamaktır.


#### Psikolojik Güvenlik


Psikolojik güvenlik, öğrenme ortamını teşvik etmek için kritiktir. İnsanların soru sormaktan, yanlış yapmaktan ve yeni şeyler öğrenmekten çekinmemesi gerekir. Google, yeni başlayan mühendisler için bir mentor atayarak bu güvenliği sağlar. Mentor, yeni çalışana sorularında yardımcı olmak ve Google kültürüne uyum sağlamasını kolaylaştırmak için vardır.


#### Bilgi Paylaşım Yöntemleri


Google'da bilgi paylaşımını teşvik eden çeşitli yöntemler vardır:


1. **Sorular Sormak**: Bilgi paylaşımının temelidir. Sorular sormak ve cevap almak, bilginin yayılmasını sağlar.

2. **Dokümantasyon**: Yazılı bilgi, özellikle büyük organizasyonlarda bilginin yayılması için kritiktir. Google, g3doc gibi araçlarla dokümantasyonun güncel ve erişilebilir olmasını sağlar.

3. **Kod İncelemeleri**: Kod incelemeleri, hem yazarlar hem de inceleyenler için öğrenme fırsatıdır. Google, kod incelemelerini standart hale getirerek bilgi paylaşımını teşvik eder.

4. **Statik Analiz Araçları**: Bu araçlar, kodun en iyi uygulamalara uygun olup olmadığını programatik olarak kontrol eder ve kodun iyileştirilmesini sağlar.

5. **Topluluklar ve Gruplar**: Google, çeşitli konularda bilgi paylaşımını teşvik eden topluluklar ve gruplar oluşturur.

6. **Tech Talks ve Sınıflar**: Google mühendisleri, teknik konularda sunumlar yapar ve sınıflar düzenler. Bu etkinlikler, bilginin geniş bir kitleye yayılmasını sağlar.


#### Bilgi Paylaşım Kültürünü Oluşturma


Google, bilgi paylaşımını teşvik etmek için iyi bir kültür oluşturmanın önemine inanır. Bu, üst düzey liderlikten gelen bir örneklemle başlar. Google, mühendislerini bilgi paylaşımı konusunda teşvik eden ve ödüllendiren bir sistem kurmuştur. Peer bonusları ve kudos gibi ödüllerle mühendislerin bilgi paylaşımı teşvik edilir.


#### Bilginin Kanonik Kaynaklarını Oluşturma


Kanonik bilgi kaynakları, organizasyon genelinde bilginin standartlaştırılmasını ve yayılmasını sağlar. Google, bilgi adacıklarını önlemek ve bilginin geniş bir kitleye ulaşmasını sağlamak için merkezi bilgi kaynakları oluşturur.


#### Sonuç


Bu bölüm, Google'da bilgi paylaşımının önemini ve etkin bilgi paylaşımı için gereken yöntemleri açıklar. Psikolojik güvenlik, dokümantasyon, kod incelemeleri, statik analiz araçları ve topluluklar gibi yöntemler, bilginin organizasyon genelinde etkin bir şekilde yayılmasını sağlar. Google, bilgi paylaşımını teşvik eden bir kültür oluşturarak mühendislik verimliliğini artırır .


### 4. Engineering for Equity Bölümünün Geniş Türkçe Özeti


Bu bölüm, mühendislerin ürünlerini daha geniş bir kullanıcı kitlesi için tasarlarken sahip olmaları gereken benzersiz sorumlulukları tartışır. Ayrıca, bir organizasyonun çeşitliliği benimseyerek nasıl herkes için çalışan sistemler tasarlayabileceğini ve kullanıcılarımıza zarar vermekten nasıl kaçınabileceğimizi değerlendirir.


#### Önyargı Varsayılandır


Önyargının varsayılan durum olduğunu kabul etmek önemlidir. Bu, yazılım mühendisliğinde çeşitliliğin ve kapsayıcılığın gerekliliğini anlamanın ilk adımıdır. Google, kullanıcılarının çeşitliliğini yansıtacak bir işgücü oluşturmanın, mühendislik mükemmeliyetinin bir parçası olduğunu kabul eder. Bu nedenle, işe alım ve ürün tasarımı süreçlerinde çeşitli perspektifleri dahil etmenin yollarını ararız.


#### Çeşitliliğe Olan İhtiyacı Anlamak


Mühendislerin, ürün tasarımı ve uygulamasında çeşitli perspektifleri dahil etmesi gerektiğine inanıyoruz. İşe alımda ve mülakatlarda önyargılı sonuçların nasıl oluşabileceğini öğrenmek önemlidir. Temsilci popülasyonlarımızı anlamak ve mühendislerin daha geniş bir eğitim alanına sahip olmalarını teşvik etmek gereklidir24:10†source】【24:12†source.


#### Multikültürel Kapasiteyi İnşa Etmek


Olağanüstü bir mühendisin işareti, ürünlerin farklı insan gruplarını nasıl avantajlı veya dezavantajlı hale getirebileceğini anlamaktır. Mühendisler, ne zaman bir şey inşa edeceklerini ve ne zaman etmeyeceklerini bilme yeteneğine sahip olmalıdır. Bu yetenek, olumsuz sonuçlar doğurabilecek özellikleri veya ürünleri belirleme ve reddetme kapasitesini içerir24:17†source.


#### Çeşitliliği Eyleme Dönüştürmek


Sistemik eşitlik ve adalet, sorumluluğun kabul edilmesiyle ulaşılabilir. Kendi rollerimizde sistemik ayrımcılığa karşı mücadele etmek, iş ortamını veya sonuçları iyileştirmek için odaklanmış çabalar gerektirir. Her teknoloji lideri veya yazılım mühendisliği yöneticisi, ekiplerinde adaleti artırmanın yollarını bulabilir24:10†source】【24:13†source.


#### Tek Yaklaşımları Reddetmek


Tek bir felsefe veya metodolojiyi kullanarak teknoloji sektöründeki eşitsizliği çözmek mümkün değildir. Çeşitliliği artırmak için işe alım boru hattını düzeltmenin ötesine geçmeliyiz. İlerleme ve tutma sistemik eşitsizliğini tanımalı ve aynı anda daha temsili işe alım ve eğitim farklılıklarına odaklanmalıyız24:1†source】【24:4†source.


#### Yerleşik Süreçleri Sorgulamak


Daha kapsayıcı ürün özellikleri tasarlamanın ötesine geçmek ve yerleşik süreçleri sorgulamak gerekir. Google'da, global işe alım talepleri sistemi oluşturulurken süreçteki eşitlik etkileri değerlendirildi. Performans değerlendirmeleri ve önyargılar gibi konular ele alındı. Bu analiz, daha adil bir iç mobilite süreci sağladı24:4†source】【24:19†source.


#### Sonuç


Bu bölüm, mühendislerin daha geniş bir kullanıcı kitlesi için ürün tasarlarken sahip olmaları gereken sorumlulukları ve bir organizasyonun çeşitliliği benimseyerek nasıl herkes için çalışan sistemler tasarlayabileceğini tartışır. Google, çeşitliliği teşvik eden ve ürünlerin adil ve kapsayıcı olmasını sağlayan bir kültür oluşturarak mühendislik verimliliğini artırmayı amaçlar.


Bu özetteki bilgiler, "Software Engineering at Google" kitabının ilgili bölümünden alınmıştır. Detaylı bilgi ve kaynaklar için orijinal belgeye başvurabilirsiniz24:0†source】【24:6†source】【24:8†source】【24:11†source】【24:18†source.




### 5. How to Lead a Team Bölümünün Geniş Türkçe Özeti


Bu bölüm, Google'da bir ekibi nasıl yönetmenin inceliklerini ve zorluklarını tartışır. Google'da mühendislik, neredeyse tamamen bir ekip çalışmasıdır ve her ekip için bir lider gereklidir. Google'da iki ana liderlik rolü vardır: bir Manager (Yönetici) ve bir Tech Lead (Teknik Lider). Bu iki rol, benzer planlama becerileri gerektirirken, çok farklı insan becerileri gerektirir.


#### Manager ve Tech Lead Rolleri


- **Manager**: Bir yönetici, takımındaki her kişinin performansından, üretkenliğinden ve mutluluğundan sorumludur. Aynı zamanda işin gereksinimlerinin karşılandığından emin olmalıdır. Yönetici, bireylerin ihtiyaçları ile işin ihtiyaçları arasında denge kurmak zorundadır.

- **Tech Lead**: Teknik lider, ürünün teknik yönlerinden sorumludur. Teknoloji kararları, mimari, öncelikler ve genel proje yönetimi ile ilgilenir. Çoğu zaman, teknik liderler aynı zamanda bireysel katkı sağlayıcılardır ve bu durum, işleri hızlı bir şekilde kendilerinin yapması ile ekip üyelerine delege etmesi arasında bir denge kurmayı gerektirir.


#### Geçiş Süreci


Bireysel bir katkı sağlayıcıdan liderlik rolüne geçiş, genellikle zorluklarla doludur. Yeni liderler, güven ve yetkinliklerini kanıtlamak için çeşitli zorluklarla karşılaşırlar ve bu süreçte doğru dengeyi bulmak önemlidir.


#### Olumsuz Kalıplar (Antipatterns)


- **Yanaşmaların İşe Alımı**: Güvensiz yöneticiler, kendilerinden daha az zeki veya daha az iddialı insanları işe alabilirler. Bu, liderin güvenliğini artırsa da, takımın üretkenliğini ve bağımsız çalışabilme kapasitesini azaltır.

- **Düşük Performans Gösterenleri Görmezden Gelme**: Düşük performans gösterenleri görmezden gelmek, takımın genel moralini ve verimliliğini düşürebilir.


- **İnsan Sorunlarını Görmezden Gelme**: Takım üyelerinin insani ihtiyaçlarını ve sorunlarını dikkate almamak, takımın iş birliği ve üretkenliğini olumsuz etkiler.

- **Herkesin Arkadaşı Olmaya Çalışmak**: Lider, takım üyeleriyle arkadaş olmaya çalışırken otoritesini kaybedebilir ve yönetim becerilerini etkili bir şekilde kullanamayabilir.


#### Olumlu Kalıplar (Positive Patterns)


- **Ego Kaybetmek**: Bir lider, takım üyelerine güvenmeli ve onların yeteneklerine saygı duymalıdır. Bu, mikro yönetimden kaçınmayı ve takımın bağımsız çalışabilmesini sağlar.

- **Zen Ustası Olmak**: Bir lider, sakinliğini korumalı ve takımın karşılaştığı zorluklara karşı yapıcı bir tutum sergilemelidir.


- **Katalizör Olmak**: Bir lider, takımın üyelerini bir araya getirerek iş birliğini teşvik etmelidir.


- **Engelleri Kaldırmak**: Lider, takımın karşılaştığı teknik veya organizasyonel engelleri aşmalarına yardımcı olmalıdır.


- **Öğretmen ve Mentor Olmak**: Yeni üyelerin ve genç mühendislerin öğrenmelerini desteklemek, takımın uzun vadeli başarısını artırır.


- **Açık Hedefler Belirlemek**: Takımın yönünü ve önceliklerini net bir şekilde belirlemek, verimliliği artırır.


- **Dürüst Olmak**: Liderler, takım üyelerine karşı dürüst olmalı ve gerektiğinde zorlu geri bildirimler vermelidir.


#### Sonuç


Ekip liderliği, yazılım mühendisliğinden farklı beceriler gerektirir. İyi bir lider, takımın verimliliğini artırmak için insan ilişkilerini yönetmeli, doğru hedefler belirlemeli ve takımını dış sorunlardan korumalıdır. Google, mühendislik yöneticilerinin yazılım mühendisliği deneyimine sahip olmasını tercih eder, ancak en önemli beceriler sosyal olanlardır. İyi bir lider, alçakgönüllülük, güven ve saygı ilkelerine dayalı olarak takımını yönlendirmelidir .


### 6. Leading at Scale Bölümünün Geniş Türkçe Özeti


Bu bölüm, bir ekibi yönetmekten, birden fazla ekibi yönetmeye geçiş sürecini ve bu süreçte başarılı olmak için gerekenleri ele alır. Google'da mühendislik liderliği, zamanla daha geniş ve soyut sorunları çözmeyi gerektirir. Bu bölüm, liderlerin "Her Zaman Karar Ver", "Her Zaman Ayrıl" ve "Her Zaman Ölçeklendir" prensiplerini kullanarak nasıl etkili olabileceklerini tartışır.


#### Her Zaman Karar Ver


Birkaç ekibi yönetmek, daha yüksek seviyelerde daha fazla karar vermeyi gerektirir. İşiniz, belirli mühendislik görevlerini nasıl çözeceğinizden çok, yüksek seviyede strateji belirlemeye dönüşür. Çoğu karar, doğru takasları bulmakla ilgilidir.


- **Uçak Parabolü**: Bu hikaye, insan davranışlarında bile takasların olduğunu gösterir. Lider olarak, ekiplerin her hafta ne yapacağına karar vermeniz gerekir. Bu, belirli anlarda en iyi kararı vermek ve sürekli olarak bu kararları yeniden değerlendirmek anlamına gelir.

- **Kısıtlamaları Belirlemek**: Bir problemi ilk ele aldığınızda, o problemle yıllarca uğraşmış bir grup insanın zaten olduğunu keşfedebilirsiniz. Bu insanlar, sorunla o kadar uzun süre uğraşmış olabilirler ki, durumu eleştirel bir şekilde değerlendiremeyebilirler. Siz ise yeni bir gözle bakarak, kısıtlamaları görebilir ve yeni stratejiler geliştirebilirsiniz.

- **Ana Takasları Belirlemek**: Önemli ve belirsiz sorunların sihirli "gümüş kurşun" çözümleri yoktur. Yalnızca o an için en iyi cevap vardır ve bu neredeyse her zaman bir yönde veya diğerinde takaslar yapmayı gerektirir.


#### Her Zaman Ayrıl


Yüzeyde, "Her Zaman Ayrıl" kötü bir tavsiye gibi görünebilir. Ancak, başarılı bir lider olmak, organizasyonun kendi başına problemi çözmesini sağlamaktır. Bu, sizi yeni bir probleme geçmek için serbest bırakır.


- **Kendi Kendine Yeten Bir Ekip Kurma**: Başarılı bir lider, zorlu bir problemi kendi başına çözebilecek bir organizasyon kurar. Bu, güçlü liderler, sağlıklı mühendislik süreçleri ve kalıcı bir kültür gerektirir. Zor sorunlar genellikle zor alt sorunlardan oluşur. Bu alt sorunları yönetmek için alt ekipler oluşturmak önemlidir.

- **Alt Sorunları Bölebilmek**: Sorunların zamanla değişebileceğini ve katı takım sınırlarının bu değişikliklere uyum sağlayamayacağını kabul etmek gerekir.


#### Her Zaman Ölçeklendir


Lider olarak en değerli kaynağınız, sınırlı zamanınız, dikkatiniz ve enerjinizdir. Ekiplerin sorumluluklarını ve yetkilerini agresif bir şekilde artırırken, kişisel akıl sağlığınızı korumayı öğrenmezseniz, ölçeklendirme başarısız olur.


- **Başarı Döngüsü**: Bir ekip zor bir problemi ele aldığında, belirli bir döngü ortaya çıkar. Bu, analizi, mücadeleyi, çekişmeyi ve ödülü içerir. Başarı döngüsü, yeni sorunlarla başa çıkmayı ve mevcut sorunları yönetmeyi içerir.

- **Önemli Olan ile Acil Olanı Ayırmak**: Liderliğe geçtikçe, işiniz daha az öngörülebilir ve daha çok yangın söndürme ile ilgilidir. Yani, işiniz daha az proaktif ve daha çok tepkisel hale gelir.

- **Topları Düşürmeyi Öğrenmek**: Yönetici olarak, bir noktada topları düşürmek kaçınılmazdır. Önemli olan, hangi topların düşürüleceğine kasıtlı olarak karar vermektir.

- **Enerjinizi Korumak**: Zamanınızı ve dikkatinizi yönetmek kadar enerjinizi yönetmek de önemlidir. Eğer bunları ustalıkla yönetmeyi öğrenirseniz, genişleyen sorumlulukları ve kendi kendine yeten bir ekip kurma sürecini daha etkili bir şekilde ele alabilirsiniz.


#### Sonuç


Başarılı liderler, zamanla daha fazla sorumluluk üstlenirler. Etkili bir lider olmak, mükemmel kararlar vermek veya her şeyi kendiniz yapmak anlamına gelmez. Bunun yerine, her zaman karar vermeye, her zaman ayrılmaya ve her zaman ölçeklendirmeye odaklanmalısınız.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]16:0†source】【16:2†source】【16:5†source】【16:7†source】【16:11†source.




### 7. Measuring Engineering Productivity Bölümünün Geniş Türkçe Özeti


Bu bölüm, mühendislik üretkenliğini ölçmenin önemini ve Google'da bu sürecin nasıl yönetildiğini tartışır. Google, veri odaklı karar verme kültürüne sahip bir şirkettir ve mühendislik süreçlerini optimize etmek için veri toplama ve analiz etmenin değerini vurgular. Ancak, insan faktörlerinin ölçülmesi bazı zorluklar içerir.


#### Neden Mühendislik Üretkenliğini Ölçmeliyiz?


Bir işinizi büyütmek istediğinizde, mühendislik organizasyonunuzun boyutunu da büyütmeniz gerekebilir. Ancak, organizasyon büyüdükçe iletişim maliyetleri de artar. Bu nedenle, her bireyin üretkenliğini artırmak, işin kapsamını iletişim maliyetlerini artırmadan büyütmenin bir yoludur. Google, mühendislerin daha üretken olmalarını sağlamak için mühendislik süreçlerindeki verimsizlikleri belirleyip çözmeye çalışır ve bu süreci sürekli olarak tekrarlayarak iyileştirmeler yapar36:0†source】【36:1†source.


#### Triage: Ölçmek Bile Değerli mi?


Ölçüm süreci, zaman ve kaynak gerektirdiğinden, hangi metriklerin ölçülmeye değer olduğunu belirlemek önemlidir. Ölçümün maliyeti yüksek olabilir ve mühendislik organizasyonunu yavaşlatabilir. Bu nedenle, ölçümün gerçekten gerekli olup olmadığını belirlemek için belirli sorular sorulur:


1. Hangi sonuçları bekliyorsunuz ve neden?

2. Eğer veriler beklenen sonucu desteklerse, hangi eylemi gerçekleştireceksiniz?

3. Negatif bir sonuç alırsanız uygun eylemi yapacak mısınız?

4. Sonuçlar üzerinde karar verecek kişi kim ve ne zaman harekete geçecek?


Bu sorular, ölçüm sürecinin zaman ve kaynak israfı olmaktan kaçınmak için kritik öneme sahiptir36:2†source】【36:3†source.


#### Anlamlı Metrikler Seçmek


Google, metrik oluşturma sürecini yönlendirmek için Hedefler/Sinyaller/Metrikler (GSM) çerçevesini kullanır:


- **Hedef**: Arzu edilen sonucun yüksek seviyede tanımı.

- **Sinyal**: Hedefe ulaşıldığını nasıl anlayacağımızın göstergesi.

- **Metre**: Sinyalin ölçülebilir vekili.


Bu çerçeve, uygun metriklerin seçilmesini sağlar ve ölçülebilir olmayan sinyalleri tanımlamaya yardımcı olur. Hedefler belirlendikten sonra sinyaller ve ardından metrikler oluşturulur36:7†source】【36:9†source.


#### Verilerle Metrikleri Doğrulamak


Google'da, metriklerin amaçlanan sinyali yakalayıp yakalamadığını doğrulamak için nitel veriler kullanılır. Örneğin, mühendislerin tipik derleme gecikme sürelerini ölçmek için bir metrik oluşturulmuş ve ardından bu metriği doğrulamak için deneyim örnekleme çalışmaları yapılmıştır. Bu süreç, metriklerin geçerliliğini artırır ve beklenmeyen sonuçların nedenlerini anlamaya yardımcı olur36:15†source】【36:18†source.


#### Eyleme Geçmek ve Sonuçları İzlemek


Araştırma tamamlandıktan sonra, Google'daki ekipler sürekli iyileştirme için öneriler hazırlar. Bu öneriler, araçların iyileştirilmesi, belgelerin güncellenmesi veya mühendisler için teşvik yapılarının değiştirilmesi gibi çeşitli alanlarda olabilir. Öneriler genellikle araç odaklıdır ve mühendislerin doğru verileri ve uygun araçları kullanarak doğru kararları alacakları varsayımı üzerine kuruludur36:19†source.


#### Sonuç


Google'da mühendislik üretkenliğini ölçmek ve iyileştirmek için veri odaklı bir yaklaşım benimsenmiştir. Bu süreç, anlamlı metriklerin seçilmesi, verilerle doğrulanması ve sürekli iyileştirme döngüsü ile desteklenir. Bu yaklaşım, mühendislik süreçlerini optimize etmek ve mühendislerin daha üretken olmalarını sağlamak için kritik öneme sahiptir.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]36:0†source】【36:1†source】【36:2†source】【36:3†source】【36:7†source】【36:9†source】【36:15†source】【36:18†source】【36:19†source.


### 8. Style Guides and Rules Bölümünün Geniş Türkçe Özeti


Bu bölüm, yazılım geliştirme sürecinde stil kılavuzlarının ve kurallarının önemini ele alır. Google'da, kodlama standartlarının belirlenmesi ve bu standartların uygulanması, yazılımın kalitesini artırmak ve bakımını kolaylaştırmak için kritik bir rol oynar.


#### Neden Kurallar Belirlenir?


Kurallar, kodun okunabilirliğini, bakımını ve tutarlılığını artırmak için belirlenir. Her mühendis kendi kod stilini kullanırsa, ekip üyelerinin başkalarının kodunu anlaması ve üzerinde çalışması zorlaşır. Kodlama standartları, ekibin her üyesinin kodu aynı şekilde yazmasını sağlayarak bu sorunu çözer.


#### Kuralların Oluşturulması


Kurallar oluşturulurken, aşağıdaki ilkeler göz önünde bulundurulur:


- **Tutarlılık**: Kodun tutarlı olması, bakımını ve okunabilirliğini artırır. Tutarlılık, kodun her zaman belirli bir stilde yazılmasını sağlar.

- **Okunabilirlik**: Kodun kolayca okunabilmesi, hataların daha kolay bulunmasını ve kodun daha hızlı anlaşılmasını sağlar.

- **Basitlik**: Kuralların basit ve anlaşılır olması, mühendislerin bu kurallara uymasını kolaylaştırır.


#### Stil Kılavuzu


Stil kılavuzu, mühendislerin kod yazarken uymaları gereken kuralları ve en iyi uygulamaları içerir. Google'da stil kılavuzları, kodun nasıl yazılacağına dair ayrıntılı talimatlar sağlar. Bu talimatlar, değişken adları, fonksiyon adları, dosya yapısı ve yorum satırları gibi konuları kapsar.


#### Kuralların Değiştirilmesi


Kurallar zamanla değişebilir. Yeni teknolojiler ve en iyi uygulamalar ortaya çıktıkça, mevcut kurallar güncellenmelidir. Bu süreç, mühendislerin yeni kurallara uyum sağlamasını kolaylaştırır ve kodun kalitesini artırır. Kuralların değiştirilmesi süreci şu adımları içerir:


- **Değişiklik Önerisi**: Bir kuralın değiştirilmesi gerektiğinde, mühendisler değişiklik önerisinde bulunur.

- **Gözden Geçirme**: Değişiklik önerisi, diğer mühendisler tarafından gözden geçirilir ve tartışılır.

- **Onay**: Değişiklik, ekip liderleri tarafından onaylandıktan sonra yürürlüğe girer.


#### Kuralların Uygulanması


Kuralların uygulanması, kod incelemeleri ve otomatik araçlar aracılığıyla sağlanır. Kod incelemeleri, mühendislerin birbirlerinin kodunu gözden geçirerek kurallara uyulup uyulmadığını kontrol etmelerini sağlar. Otomatik araçlar ise, kodun stil kılavuzuna uygun olup olmadığını programatik olarak kontrol eder ve gerektiğinde düzeltmeler önerir.


#### Hata Denetleyiciler ve Kod Biçimlendiriciler


- **Hata Denetleyiciler**: Kodda stil hatalarını bulmak ve düzeltmek için kullanılır. Bu araçlar, kodun stil kılavuzuna uygun olup olmadığını kontrol eder.

- **Kod Biçimlendiriciler**: Kodun otomatik olarak belirli bir stile uygun şekilde formatlanmasını sağlar. Bu araçlar, mühendislerin manuel olarak formatlama yapma ihtiyacını ortadan kaldırır.


#### Sonuç


Stil kılavuzları ve kurallar, yazılım geliştirme sürecinde kodun okunabilirliğini, bakımını ve tutarlılığını artırmak için kritik öneme sahiptir. Google, stil kılavuzları ve kuralların oluşturulması, uygulanması ve güncellenmesi konusunda sistematik bir yaklaşım benimser. Bu, mühendislerin daha kaliteli ve sürdürülebilir kod yazmalarını sağlar.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### 9. Code Review Bölümünün Geniş Türkçe Özeti


Bu bölüm, Google'da kod inceleme sürecini ve bu sürecin nasıl işlediğini ele alır. Kod inceleme, yazılım kalitesini artırmak, bilgi paylaşımını teşvik etmek ve kod tabanını sürdürülebilir kılmak için kritik bir uygulamadır. Google'da kod inceleme süreci, belirli adımlar ve en iyi uygulamalar çerçevesinde yapılandırılmıştır.


#### Kod İnceleme Akışı


Kod inceleme süreci, geliştiricilerin yazdıkları kodu diğer takım üyelerine sunmaları ve bu kodun gözden geçirilmesiyle başlar. Bu süreç, kodun kalitesini ve tutarlılığını artırmak için tasarlanmıştır. İnceleme süreci genel olarak şu adımları içerir:


1. **Kod Yazımı ve Gönderimi**: Geliştirici, kodu yazar ve inceleme için gönderir.

2. **İnceleme Talebi**: Kod, belirli bir inceleme grubuna veya bireylere atanır.

3. **Kod İncelemesi**: İnceleyiciler, kodu gözden geçirir ve geri bildirim sağlar.

4. **Düzeltmeler ve Onay**: Geliştirici, geri bildirimlere göre kodu düzeltir ve incelemeyi yeniden gönderir. Kod, inceleyiciler tarafından onaylanana kadar bu süreç tekrarlanır.


#### Kod İncelemenin Faydaları


Kod inceleme, birden çok açıdan fayda sağlar:


- **Kod Doğruluğu**: Hataların ve sorunların erken tespit edilmesini sağlar.

- **Kod Anlaşılabilirliği**: Kodun daha okunabilir ve anlaşılır olmasını sağlar.

- **Kod Tutarlılığı**: Kodun stil ve standartlara uygun olmasını sağlar.

- **Psikolojik ve Kültürel Faydalar**: Takım üyeleri arasında bilgi paylaşımını ve işbirliğini teşvik eder.


#### En İyi Kod İnceleme Uygulamaları


Google'da kod inceleme sürecinin etkili olabilmesi için belirli en iyi uygulamalar benimsenmiştir:


- **Kibar ve Profesyonel Olmak**: Geri bildirim verirken saygılı ve yapıcı olmak önemlidir.

- **Küçük Değişiklikler Yazmak**: Büyük değişiklikler yerine küçük ve yönetilebilir değişiklikler yapmak daha iyidir.

- **İyi Değişiklik Açıklamaları Yazmak**: Değişikliklerin neden yapıldığını açıklayan net ve özlü açıklamalar yazmak önemlidir.

- **İnceleyici Sayısını Minimumda Tutmak**: Gereksiz yere fazla inceleyici atanması süreci yavaşlatabilir.

- **Otomasyonu Kullanmak**: Mümkün olan her yerde otomatik araçlar kullanarak manuel iş yükünü azaltmak.


#### Kod İnceleme Türleri


Farklı kod inceleme türleri bulunmaktadır ve her biri farklı amaçlar için kullanılır:


- **Yeni Kod İncelemeleri**: Yeni yazılan kodun gözden geçirilmesi.

- **Davranış Değişiklikleri ve İyileştirmeler**: Mevcut kodun davranışında yapılan değişiklikler veya iyileştirmelerin incelenmesi.

- **Hata Düzeltmeleri ve Geri Alımlar**: Hata düzeltmeleri veya kodun eski bir sürümüne geri alınması.

- **Refaktöring ve Büyük Ölçekli Değişiklikler**: Kodun yeniden yapılandırılması veya büyük değişikliklerin incelenmesi.


#### Sonuç


Kod inceleme, Google'da yazılım geliştirme sürecinin ayrılmaz bir parçasıdır. Kodun kalitesini artırmak, bilgi paylaşımını teşvik etmek ve yazılımın sürdürülebilirliğini sağlamak için yapılandırılmış bir inceleme süreci benimsenmiştir. Bu süreç, en iyi uygulamalar ve otomasyon araçlarıyla desteklenir ve sürekli olarak iyileştirilir.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### 10. Documentation Bölümünün Geniş Türkçe Özeti


Bu bölüm, Google'da dokümantasyonun önemini ve dokümantasyonun nasıl yapılması gerektiğini ele alır. Dokümantasyon, yazılım geliştirme sürecinde bilgi paylaşımını ve yazılımın sürdürülebilirliğini artırmak için kritik bir bileşendir.


#### Dokümantasyonun Önemi


Dokümantasyon, kodun nasıl çalıştığını, nasıl kullanıldığını ve nasıl bakım yapılacağını açıklayan yazılı bilgilerden oluşur. İyi dokümantasyon, yeni geliştiricilerin projeye hızlı bir şekilde adapte olmasını sağlar ve mevcut geliştiricilerin kodu anlamalarını kolaylaştırır. Google'da dokümantasyon, bilgi paylaşımını teşvik eden ve projelerin sürdürülebilirliğini artıran önemli bir araçtır.


#### Dokümantasyon Türleri


Google'da çeşitli dokümantasyon türleri bulunmaktadır ve her biri farklı bir amaç için kullanılır:


1. **Kullanıcı Dokümantasyonu**: Yazılımın son kullanıcılarına yönelik dokümantasyondur. Kullanım kılavuzları, yardım belgeleri ve öğreticiler içerir.

2. **Geliştirici Dokümantasyonu**: Yazılımın geliştiricilerine yönelik dokümantasyondur. API belgeleri, kod örnekleri ve geliştirme kılavuzları içerir.

3. **İç Dokümantasyon**: Ekip içi kullanım için oluşturulan dokümantasyondur. Tasarım belgeleri, teknik raporlar ve toplantı notları içerir.


#### Dokümantasyonun Özellikleri


İyi bir dokümantasyonun aşağıdaki özelliklere sahip olması gerekmektedir:


- **Doğruluk**: Bilgilerin doğru ve güncel olması gerekir.

- **Anlaşılabilirlik**: Dokümantasyonun kolayca okunabilir ve anlaşılabilir olması önemlidir.

- **Eksiksizlik**: Gerekli tüm bilgileri içermelidir.

- **Erişilebilirlik**: Dokümantasyonun kolayca erişilebilir olması gerekir.


#### Dokümantasyonun Yazımı


Dokümantasyon yazarken dikkat edilmesi gereken bazı noktalar şunlardır:


- **Net ve Öz Olmak**: Bilgileri net ve öz bir şekilde sunmak önemlidir.

- **Okuyucu Kitlesini Düşünmek**: Dokümantasyonu yazarken hedef kitlenin bilgi seviyesini ve ihtiyaçlarını göz önünde bulundurmak gerekir.

- **Görseller ve Örnekler Kullanmak**: Dokümantasyonu daha anlaşılır kılmak için görseller ve kod örnekleri kullanmak faydalıdır.

- **Sürekli Güncelleme**: Dokümantasyonu sürekli olarak güncellemek ve yeni bilgiler eklemek önemlidir.


#### Dokümantasyon Araçları


Google, dokümantasyon oluşturma ve yönetme sürecini kolaylaştırmak için çeşitli araçlar kullanır. Bu araçlar, dokümantasyonun yazılmasını, düzenlenmesini ve paylaşılmasını kolaylaştırır. Örneğin, Google Docs, iç dokümantasyon için yaygın olarak kullanılan bir araçtır. Ayrıca, API dokümantasyonu için özel araçlar ve platformlar kullanılır.


#### Dokümantasyonun Bakımı


Dokümantasyonun sürekli olarak güncel ve doğru tutulması gerekir. Google'da, dokümantasyonun düzenli olarak gözden geçirilmesi ve gerektiğinde güncellenmesi için belirli süreçler ve sorumluluklar belirlenmiştir. Dokümantasyonu güncellemek, yazılımın sürdürülebilirliği ve geliştiricilerin verimliliği açısından kritik öneme sahiptir.


#### Sonuç


Dokümantasyon, yazılım geliştirme sürecinde bilgi paylaşımını ve yazılımın sürdürülebilirliğini artıran önemli bir bileşendir. Google, dokümantasyonun doğru, anlaşılır, eksiksiz ve erişilebilir olmasını sağlamak için belirli standartlar ve araçlar kullanır. İyi dokümantasyon, geliştiricilerin verimliliğini artırır ve projelerin uzun vadeli başarısını destekler.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### 12. Unit Testing Bölümünün Geniş Türkçe Özeti


Bu bölüm, Google'da birim testlerinin önemini ve nasıl yapılması gerektiğini detaylandırır. Birim testleri, yazılım geliştirme sürecinde kritik bir rol oynar ve kodun doğru çalıştığını doğrulamak için kullanılır.


#### Birim Testlerinin Önemi


Birim testleri, yazılımın en küçük bileşenlerini (genellikle fonksiyonlar veya metodlar) test etmek için kullanılır. Bu testler, kodun belirli bir parçasının beklenen şekilde çalışıp çalışmadığını doğrular. Birim testlerinin temel avantajları şunlardır:


- **Hata Tespiti**: Erken aşamalarda hataları tespit eder ve düzeltir.

- **Kod Kalitesi**: Kodun kalitesini artırır ve bakımını kolaylaştırır.

- **Güven**: Geliştiricilere, yaptıkları değişikliklerin mevcut işlevselliği bozmadığı konusunda güven sağlar.

- **Dokümantasyon**: Kodun nasıl çalıştığını belgeleyerek yeni geliştiricilerin projeye hızlı bir şekilde adapte olmasını sağlar.


#### Birim Testlerinin Temel İlkeleri


Google'da birim testleri yazarken belirli ilkeler benimsenmiştir:


- **İzole Testler**: Birim testleri, test edilen birimin dışındaki bağımlılıkları izole eder. Bu, testlerin sadece test edilen birimin davranışını doğrulamasını sağlar.

- **Deterministik Testler**: Birim testlerinin her çalıştırıldığında aynı sonuçları vermesi gerekir. Bu, testlerin güvenilir ve tekrarlanabilir olmasını sağlar.

- **Hızlı Testler**: Birim testleri hızlı çalışmalıdır. Bu, geliştiricilerin testleri sık sık çalıştırmasını teşvik eder ve geri bildirim döngüsünü kısaltır.

- **Kolay Anlaşılır Testler**: Testlerin okunabilir ve anlaşılır olması önemlidir. Bu, testlerin bakımını kolaylaştırır ve diğer geliştiricilerin testleri anlamasını sağlar.


#### Birim Testleri Yazma


Google'da birim testleri yazarken şu adımlar izlenir:


1. **Test Edilecek Birimi Belirleme**: Test edilecek fonksiyon veya metod belirlenir.

2. **Test Senaryoları Oluşturma**: Birimin farklı kullanım senaryolarını kapsayan test senaryoları oluşturulur.

3. **Test Ortamını Hazırlama**: Birimin bağımlılıkları izole edilir ve test ortamı hazırlanır.

4. **Testlerin Yazılması**: Testler yazılır ve her senaryo için beklenen sonuçlar tanımlanır.

5. **Testlerin Çalıştırılması**: Testler çalıştırılır ve sonuçlar doğrulanır.

6. **Testlerin Güncellenmesi**: Gerektiğinde testler güncellenir ve yeni senaryolar eklenir.


#### Birim Testlerinin Bakımı


Birim testleri sürekli olarak güncellenmeli ve bakım yapılmalıdır. Yazılım geliştirme sürecinde yapılan değişiklikler, birim testlerine de yansıtılmalıdır. Google'da, testlerin düzenli olarak gözden geçirilmesi ve güncellenmesi için belirli süreçler ve sorumluluklar belirlenmiştir.


#### Birim Testlerinin Otomasyonu


Google, birim testlerini otomatikleştirerek test sürecini hızlandırır ve güvenilirliğini artırır. Otomatik testler, sürekli entegrasyon ve sürekli teslimat süreçlerine entegre edilmiştir. Bu, kod değişikliklerinin sürekli olarak test edilmesini ve hataların erken aşamalarda tespit edilmesini sağlar.


#### Sonuç


Birim testleri, yazılımın kalitesini, güvenilirliğini ve sürdürülebilirliğini sağlamak için kritik bir süreçtir. Google'da birim testleri, izole, deterministik, hızlı ve anlaşılır olmalıdır. Testlerin otomatikleştirilmesi ve sürekli olarak güncellenmesi, yazılımın uzun vadeli başarısını destekler.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### 13. Test Doubles Bölümünün Geniş Türkçe Özeti


Bu bölüm, yazılım testlerinde kullanılan test doubles'ların ne olduğunu ve Google'da nasıl kullanıldığını açıklar. Test doubles, birim testleri sırasında gerçek nesnelerin yerini alan nesnelerdir ve çeşitli türleri vardır. Bu nesneler, testlerin izole edilmesini ve daha kontrollü bir test ortamı sağlanmasını mümkün kılar.


#### Test Doubles Türleri


Test doubles, beş ana kategoride sınıflandırılır:


1. **Dummy Objects (Geçici Nesneler)**: Gerçekten kullanılmayan, ancak parametre olarak geçirilmesi gereken nesnelerdir. Bu nesneler genellikle test edilen birim için gerekli değildir.

   

2. **Fake Objects (Sahte Nesneler)**: Gerçek uygulamaya benzer şekilde çalışan, ancak daha basit bir şekilde tasarlanmış nesnelerdir. Örneğin, bir veri tabanı yerine hafızada çalışan bir veri deposu kullanılabilir.


3. **Stubs (Durağan Nesneler)**: Belirli bir senaryo için önceden tanımlanmış yanıtlar dönen nesnelerdir. Test sırasında çağrıldığında, belirli sabit yanıtlar döner.


4. **Spies (Casuslar)**: Çağrıların yapıldığını ve belirli eylemlerin gerçekleştirildiğini kaydeden nesnelerdir. Spies, testlerin sonunda yapılan çağrıları ve parametreleri doğrulamak için kullanılır.


5. **Mocks (Model Nesneler)**: Belirli beklentileri olan ve test sırasında bu beklentilere göre davranan nesnelerdir. Mocks, çağrıların belirli bir sırayla yapılması gerektiği durumlarda kullanılır ve bu beklentiler karşılanmazsa testler başarısız olur.


#### Test Doubles Kullanımının Avantajları


- **İzole Testler**: Test doubles, test edilen birimin dışındaki bağımlılıkları izole eder. Bu, testlerin sadece test edilen birimin davranışını doğrulamasını sağlar.

- **Kontrollü Test Ortamı**: Test doubles, test ortamını daha kontrollü hale getirir. Gerçek bağımlılıkların davranışı tahmin edilemez olabilir, ancak test doubles ile bu kontrol altına alınabilir.

- **Hız ve Performans**: Test doubles, genellikle gerçek bağımlılıklara göre daha hızlı çalışır. Bu, testlerin daha hızlı çalıştırılmasını sağlar ve geri bildirim döngüsünü kısaltır.

- **Güvenilirlik**: Test doubles, testlerin deterministik olmasını sağlar. Bu, testlerin her çalıştırıldığında aynı sonuçları vermesini garanti eder.


#### Test Doubles Kullanımının Zorlukları


- **Bakım Zorluğu**: Test doubles, gerçek bağımlılıklara yapılan değişikliklere uyum sağlamak için güncellenmelidir. Bu, bakım yükünü artırabilir.

- **Yanlış Pozitifler ve Negatifler**: Test doubles, bazen gerçek bağımlılıkların davranışını tam olarak simüle edemeyebilir. Bu, yanlış pozitifler veya negatifler üretebilir.

- **Kompleksite**: Test doubles kullanımı, testlerin ve kodun karmaşıklığını artırabilir. Bu, testlerin anlaşılmasını ve bakımını zorlaştırabilir.


#### Google'da Test Doubles Kullanımı


Google, test doubles'ları geniş çapta kullanır ve çeşitli test stratejileri ile birleştirir. Bu stratejiler, testlerin doğruluğunu ve güvenilirliğini artırmayı hedefler. Google'da, test doubles kullanırken belirli en iyi uygulamalar benimsenmiştir:


- **Anlaşılabilirlik**: Test doubles'ın kolayca anlaşılabilir ve bakımı yapılabilir olması önemlidir.

- **Tutarlılık**: Test doubles'ın gerçek bağımlılıkların davranışını tutarlı bir şekilde simüle etmesi gereklidir.

- **Belgelendirme**: Test doubles'ın nasıl kullanılacağını ve neyi simüle ettiğini açıklayan iyi bir belgelendirme gereklidir.


#### Sonuç


Test doubles, yazılım testlerinde önemli bir araçtır ve testlerin izole edilmesini, kontrol edilmesini ve hızlandırılmasını sağlar. Google'da test doubles kullanımı, testlerin doğruluğunu ve güvenilirliğini artırmak için kritik bir stratejidir. Ancak, test doubles kullanımı bazı zorlukları da beraberinde getirir ve bu zorlukların yönetilmesi için dikkatli bir planlama gereklidir.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### 14. Larger Testing Bölümünün Geniş Türkçe Özeti


Bu bölüm, Google'da geniş kapsamlı testlerin nasıl yapıldığını ve neden önemli olduğunu ele alır. Geniş kapsamlı testler, yazılımın tamamının veya büyük parçalarının birlikte nasıl çalıştığını değerlendirmek için kullanılır. Bu testler, sistemin genel performansını, entegrasyonunu ve kullanıcı deneyimini gözden geçirmek amacıyla yapılır.


#### Geniş Testlerin Amacı


Geniş kapsamlı testlerin temel amacı, sistemin genel işleyişini ve entegrasyonunu doğrulamaktır. Bu testler, birim testlerinin kapsayamadığı daha geniş senaryoları ele alır ve şu hedefleri taşır:


- **Sistem Entegrasyonu**: Farklı bileşenlerin birlikte doğru çalıştığını doğrulamak.

- **Kullanıcı Senaryoları**: Gerçek kullanıcı davranışlarını ve senaryolarını simüle ederek sistemin performansını ve işlevselliğini değerlendirmek.

- **Performans ve Ölçeklenebilirlik**: Sistemin yüksek yük altında nasıl performans gösterdiğini ve ölçeklenebilirliğini test etmek.

- **Regresyon Testi**: Yeni değişikliklerin mevcut işlevselliği bozmadığını doğrulamak.


#### Geniş Test Türleri


Google'da kullanılan geniş test türleri arasında şunlar bulunur:


1. **Entegrasyon Testleri**: Birden fazla bileşenin birlikte nasıl çalıştığını doğrulayan testlerdir. Bu testler, bileşenler arasındaki veri akışını ve etkileşimleri kontrol eder.

2. **Sistem Testleri**: Tüm sistemi bir bütün olarak test eder. Bu testler, tüm bileşenlerin entegrasyonunu ve sistemin genel performansını değerlendirir.

3. **Kabul Testleri**: Yazılımın son kullanıcı gereksinimlerini karşıladığını doğrular. Bu testler, genellikle müşteri veya son kullanıcı tarafından gerçekleştirilir ve yazılımın kabul kriterlerini karşıladığını gösterir.

4. **Yük ve Performans Testleri**: Sistemin yüksek yük altında nasıl performans gösterdiğini ve ölçeklenebilirliğini test eder. Bu testler, sistemin yanıt sürelerini, işlem kapasitesini ve kaynak kullanımını değerlendirir.


#### Test Ortamları ve Senaryoları


Geniş testler, gerçek dünya senaryolarını ve ortamlarını simüle etmek için tasarlanır. Testlerin doğru sonuçlar verebilmesi için, test ortamlarının ve senaryolarının gerçeğe yakın olması önemlidir. Google, geniş testlerde şu stratejileri kullanır:


- **Gerçekçi Test Verileri**: Test ortamlarında, gerçek dünya verilerine yakın veriler kullanmak.

- **Üretim Benzeri Ortamlar**: Testlerin, üretim ortamına benzer koşullarda gerçekleştirilmesi.

- **Kapsamlı Senaryolar**: Kullanıcı davranışlarını ve etkileşimlerini geniş bir yelpazede simüle eden senaryolar oluşturmak.


#### Test Otomasyonu


Geniş testlerin otomatikleştirilmesi, test sürecini hızlandırır ve güvenilirliğini artırır. Google, geniş testleri otomatikleştirmek için çeşitli araçlar ve çerçeveler kullanır. Otomatik testler, sürekli entegrasyon ve sürekli teslimat süreçlerine entegre edilmiştir. Bu, kod değişikliklerinin sürekli olarak test edilmesini ve hataların erken aşamalarda tespit edilmesini sağlar.


#### Geniş Testlerin Zorlukları


Geniş testler, küçük testlere göre daha karmaşıktır ve çeşitli zorluklar içerir:


- **Yüksek Maliyet ve Zaman**: Geniş testler, daha fazla kaynak ve zaman gerektirir.

- **Karmaşıklık**: Büyük sistemlerin ve entegrasyonların test edilmesi karmaşık olabilir.

- **Gerçekçi Senaryolar Oluşturma**: Gerçek dünya senaryolarını ve veri setlerini simüle etmek zor olabilir.


#### Sonuç


Geniş kapsamlı testler, yazılımın genel performansını, entegrasyonunu ve kullanıcı deneyimini değerlendirmek için kritik öneme sahiptir. Google, geniş testlerde entegrasyon testleri, sistem testleri, kabul testleri ve yük testleri gibi çeşitli test türlerini kullanır. Bu testler, yazılımın yüksek kalitede ve güvenilir olmasını sağlamak için otomatikleştirilir ve sürekli olarak güncellenir.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### 15. Deprecation Bölümünün Geniş Türkçe Özeti


Bu bölüm, yazılım geliştirme sürecinde deprecation (eskitme) işleminin nasıl yönetildiğini ve Google'da bu sürecin nasıl uygulandığını ele alır. Eskitme, yazılımın belirli özelliklerini veya bileşenlerini aşamalı olarak kullanımdan kaldırma sürecidir ve bu süreç dikkatli bir planlama ve yönetim gerektirir.


#### Eskitme Sürecinin Önemi


Eskitme, yazılımın güncel ve güvenilir kalmasını sağlamak için kritik bir süreçtir. Teknolojiler ve gereksinimler zamanla değişir, bu nedenle eski özelliklerin ve bileşenlerin kullanımdan kaldırılması gereklidir. Eskitme, yazılımın bakımını kolaylaştırır, performansını artırır ve güvenlik açıklarını azaltır.


#### Eskitme Türleri


Google'da çeşitli eskitme türleri kullanılır ve her biri farklı senaryolar için uygundur:


1. **Planlı Eskitme**: Belirli bir zaman dilimi içinde aşamalı olarak gerçekleştirilen eskitme. Bu tür eskitme, kullanıcıların yeni özelliklere geçiş yapmaları için yeterli süre tanır.

2. **Aniden Eskitme**: Hemen ve hızlı bir şekilde gerçekleştirilen eskitme. Bu tür eskitme, kritik güvenlik açıkları veya büyük hatalar nedeniyle acil bir gereklilik haline geldiğinde kullanılır.

3. **Kademeli Eskitme**: Farklı kullanıcı gruplarına veya bölgelere göre aşamalı olarak gerçekleştirilen eskitme. Bu tür eskitme, potansiyel sorunların kademeli olarak tespit edilmesini ve yönetilmesini sağlar.


#### Eskitme Sürecinin Adımları


Google'da eskitme süreci genellikle şu adımlardan oluşur:


1. **Planlama ve İlan**: Eskitme sürecinin planlanması ve kullanıcıların bilgilendirilmesi. Kullanıcılar, eskitilecek özellikler ve yeni alternatifler hakkında bilgilendirilir.

2. **Geliştirme ve Test**: Yeni özelliklerin geliştirilmesi ve test edilmesi. Eskitilecek özelliklerin yerine geçecek yeni çözümler hazırlanır.

3. **Geçiş Dönemi**: Kullanıcıların yeni özelliklere geçiş yapmaları için belirli bir süre tanınır. Bu süre zarfında hem eski hem de yeni özellikler desteklenir.

4. **Eskitme ve Kaldırma**: Eskitilen özelliklerin aşamalı olarak kullanımdan kaldırılması ve tamamen devre dışı bırakılması.


#### Eskitme Zorlukları


Eskitme süreci çeşitli zorlukları beraberinde getirir:


- **Kullanıcı Tepkisi**: Kullanıcılar, alıştıkları özelliklerin kaldırılmasına tepki gösterebilirler. Bu nedenle, kullanıcıların yeni özelliklere adaptasyonu için yeterli zaman ve destek sağlanmalıdır.

- **Teknik Borç**: Eskitilen özelliklerin kod tabanında kalması, teknik borç oluşturabilir. Bu nedenle, kodun düzenli olarak temizlenmesi ve güncellenmesi önemlidir.

- **Geriye Dönük Uyum**: Yeni özelliklerin eski özelliklerle uyumlu olması gereklidir. Bu, yazılımın kesintisiz çalışmasını sağlar ve kullanıcı deneyimini korur.


#### Google'da Eskitme Stratejileri


Google, eskitme sürecini yönetmek için çeşitli stratejiler benimser:


- **Dokümantasyon**: Kullanıcılar için ayrıntılı dokümantasyon sağlanır. Bu, kullanıcıların yeni özelliklere geçiş yapmalarını kolaylaştırır.

- **Geri Bildirim**: Kullanıcılardan geri bildirim alınır ve bu geri bildirimler doğrultusunda eskitme süreci düzenlenir.

- **Eğitim ve Destek**: Kullanıcılar için eğitim ve destek sağlanır. Bu, kullanıcıların yeni özellikleri öğrenmelerini ve kullanmalarını kolaylaştırır.


#### Sonuç


Eskitme, yazılımın güncel ve güvenilir kalmasını sağlamak için kritik bir süreçtir. Google, eskitme sürecini planlama, geliştirme, test etme ve kullanıcıları bilgilendirme adımlarıyla yönetir. Bu süreç, yazılımın performansını artırır, güvenlik açıklarını azaltır ve kullanıcı deneyimini iyileştirir.


### 16. Version Control and Branch Management Bölümünün Geniş Türkçe Özeti


Bu bölüm, yazılım geliştirme sürecinde sürüm kontrolü ve dal yönetiminin önemini ele alır. Google, geniş ölçekli projeleri yönetmek için etkili sürüm kontrol sistemleri ve dal yönetimi stratejileri kullanır. Bu sistemler ve stratejiler, kod tabanının düzenli ve uyumlu kalmasını sağlar, ekip işbirliğini artırır ve yazılımın sürümlemelerini etkili bir şekilde yönetir.


#### Sürüm Kontrolünün Önemi


Sürüm kontrolü, yazılım geliştirme sürecinde yapılan değişikliklerin izlenmesi ve yönetilmesi için kritik bir araçtır. Sürüm kontrol sistemleri, yazılımın farklı sürümlerinin saklanmasını, geri alınmasını ve karşılaştırılmasını sağlar. Bu, ekiplerin işbirliği yapmasını kolaylaştırır ve kod tabanında yapılan değişikliklerin tarihçesini tutar.


#### Dal Yönetimi


Dal yönetimi, sürüm kontrol sistemlerinin önemli bir parçasıdır. Dallar, yazılımın farklı özelliklerinin veya sürümlerinin paralel olarak geliştirilmesini sağlar. Google'da dal yönetimi stratejileri, kod tabanının düzenli ve uyumlu kalmasını sağlar ve ekiplerin daha verimli çalışmasına yardımcı olur.


#### Google'ın Sürüm Kontrol Sistemi


Google, kendi sürüm kontrol sistemi olan Piper'ı kullanır. Piper, Google'ın tüm kod tabanını tek bir depo içinde tutar. Bu yaklaşım, kod paylaşımını ve yeniden kullanımını kolaylaştırır. Piper, aynı zamanda hızlı ve etkili bir sürüm kontrolü sağlar, büyük ölçekli projelerde bile.


#### Dal Yönetimi Stratejileri


Google, dal yönetimi için çeşitli stratejiler kullanır:


1. **Ana Dal (Mainline) Geliştirme**: Tüm geliştirmelerin ana dal üzerinde yapılmasını sağlar. Bu strateji, sürekli entegrasyon ve sürekli teslimat süreçlerini destekler.

2. **Kısa Ömürlü Dallar**: Özellik geliştirme veya hata düzeltme gibi kısa vadeli işler için kullanılan dallardır. Bu dallar, iş tamamlandığında ana dala birleştirilir.

3. **Uzun Ömürlü Dallar**: Büyük özellikler veya sürümler için kullanılan dallardır. Bu dallar, daha uzun süreli geliştirme süreçlerini destekler ve tamamlandığında ana dala birleştirilir.


#### Sürekli Entegrasyon ve Teslimat


Google, sürekli entegrasyon (CI) ve sürekli teslimat (CD) süreçlerini sürüm kontrol ve dal yönetimi ile entegre eder. CI/CD, kod değişikliklerinin sürekli olarak test edilmesini ve ana dala entegrasyonunu sağlar. Bu süreçler, yazılımın daha hızlı ve güvenilir bir şekilde teslim edilmesini mümkün kılar.


#### Google'ın Deneyimleri ve Uygulamaları


Google, sürüm kontrol ve dal yönetimi konusunda yılların deneyimine sahiptir. Şirket, bu süreçleri sürekli olarak iyileştirmek için geri bildirimler toplar ve en iyi uygulamaları benimser. Google'ın sürüm kontrol sistemi Piper ve dal yönetimi stratejileri, büyük ölçekli yazılım projelerinin başarıyla yönetilmesini sağlar.


#### Sonuç


Sürüm kontrolü ve dal yönetimi, yazılım geliştirme sürecinin temel unsurlarıdır. Google, kendi sürüm kontrol sistemi Piper ve etkili dal yönetimi stratejileri ile bu süreci başarıyla yönetir. Sürekli entegrasyon ve teslimat süreçleri ile entegre edilen bu sistemler, yazılımın hızlı, güvenilir ve düzenli bir şekilde geliştirilmesini sağlar.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### 17. Code Search Bölümünün Geniş Türkçe Özeti


Bu bölüm, Google'da kod arama süreçlerini ve bu süreçlerin yazılım geliştirme üzerindeki etkilerini ele alır. Kod arama araçları, büyük kod tabanlarında belirli kod parçacıklarını hızlı ve etkili bir şekilde bulmayı sağlar. Google, büyük ve karmaşık kod tabanlarını yönetmek için gelişmiş kod arama araçları ve teknikleri kullanır.


#### Kod Aramanın Önemi


Kod arama, geliştiricilerin kod tabanında hızlı bir şekilde gezinebilmeleri ve ihtiyaç duydukları bilgileri bulabilmeleri için kritik bir araçtır. Büyük ölçekli projelerde, belirli bir fonksiyonun veya değişkenin nerede tanımlandığını veya kullanıldığını bulmak zaman alıcı olabilir. Kod arama araçları, bu süreci hızlandırır ve geliştiricilerin verimliliğini artırır.


#### Google'da Kod Arama


Google, geniş ve karmaşık kod tabanlarını yönetmek için güçlü kod arama araçları geliştirir. Bu araçlar, geliştiricilerin kod tabanında hızlı ve etkili bir şekilde arama yapmalarını sağlar. Google'ın kod arama araçları, kodun yanı sıra dökümantasyon ve diğer kaynaklarda da arama yapabilme yeteneğine sahiptir.


#### Kod Arama Araçları


Google'da kullanılan kod arama araçları, belirli özellikler ve yetenekler sunar:


1. **Hızlı Arama**: Kod arama araçları, büyük kod tabanlarında bile hızlı arama yapabilme yeteneğine sahiptir. Bu, geliştiricilerin ihtiyaç duydukları bilgilere hızla ulaşmalarını sağlar.

2. **Detaylı Filtreleme**: Kod arama araçları, arama sonuçlarını belirli kriterlere göre filtreleyebilme yeteneğine sahiptir. Bu, geliştiricilerin arama sonuçlarını daraltmalarını ve istedikleri bilgilere daha hızlı ulaşmalarını sağlar.

3. **Kapsamlı Arama**: Kod arama araçları, kodun yanı sıra dökümantasyon, yorumlar ve diğer kaynaklarda da arama yapabilir. Bu, geliştiricilerin daha geniş bir perspektif elde etmelerini sağlar.


#### Kod Aramanın Faydaları


Kod arama araçları, yazılım geliştirme sürecine çeşitli faydalar sağlar:


- **Verimlilik Artışı**: Geliştiricilerin ihtiyaç duydukları bilgilere hızlı bir şekilde ulaşmalarını sağlar, böylece verimlilik artar.

- **Hata Tespiti**: Kod arama araçları, kod tabanında belirli hataları ve sorunları hızlı bir şekilde bulmayı sağlar.

- **Bilgi Paylaşımı**: Kod arama araçları, geliştiricilerin birbirlerinin kodunu daha kolay anlamalarını ve üzerinde çalışabilmelerini sağlar.


#### Google'ın Deneyimleri ve Uygulamaları


Google, kod arama süreçlerini sürekli olarak iyileştirmek için geri bildirimler toplar ve en iyi uygulamaları benimser. Şirket, kod arama araçlarını geliştirerek ve optimize ederek büyük ölçekli projelerin yönetimini daha verimli hale getirir. Google'ın kod arama araçları, şirketin geniş ve karmaşık kod tabanlarında hızlı ve etkili arama yapabilme yeteneği sağlar.


#### Sonuç


Kod arama, yazılım geliştirme sürecinin temel unsurlarından biridir. Google, güçlü kod arama araçları ve teknikleri ile büyük ve karmaşık kod tabanlarını yönetir. Bu araçlar, geliştiricilerin verimliliğini artırır, hata tespitini kolaylaştırır ve bilgi paylaşımını teşvik eder. Google'ın kod arama süreçleri, yazılım geliştirme sürecinin hızını ve verimliliğini artırmak için kritik öneme sahiptir.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### 18. Build Systems and Build Philosophy Bölümünün Geniş Türkçe Özeti


Bu bölüm, Google'da yazılım derleme sistemleri ve bu sistemlerin ardındaki felsefeyi ele alır. Derleme sistemleri, yazılım geliştirme sürecinde kodun derlenmesi, test edilmesi ve dağıtılması için kritik bir rol oynar. Google, büyük ölçekli projeleri yönetmek için gelişmiş derleme sistemleri ve stratejileri kullanır.


#### Derleme Sistemlerinin Önemi


Derleme sistemleri, yazılımın geliştirilmesi, test edilmesi ve dağıtılması sürecinde merkezi bir rol oynar. İyi tasarlanmış bir derleme sistemi, yazılımın hızlı ve güvenilir bir şekilde derlenmesini sağlar ve geliştiricilerin verimliliğini artırır. Derleme sistemleri, kodun tutarlılığını ve bütünlüğünü korur, hataların erken tespit edilmesini sağlar.


#### Google'ın Derleme Sistemleri


Google, büyük ölçekli yazılım projelerini yönetmek için kendi derleme sistemlerini geliştirmiştir. Bu sistemler, yüksek performanslı, güvenilir ve ölçeklenebilir olacak şekilde tasarlanmıştır. Google'ın derleme sistemleri, aşağıdaki özelliklere sahiptir:


1. **Yüksek Performans**: Google'ın derleme sistemleri, büyük kod tabanlarında bile hızlı derleme yapabilme yeteneğine sahiptir. Bu, geliştiricilerin geri bildirim döngüsünü kısaltır ve verimliliği artırır.

2. **Dağıtık Sistemler**: Google, derleme süreçlerini dağıtık sistemler kullanarak optimize eder. Bu, derleme yükünü dağıtarak daha hızlı ve verimli bir derleme süreci sağlar.

3. **Modülerlik ve Yeniden Kullanılabilirlik**: Google'ın derleme sistemleri, modüler ve yeniden kullanılabilir bileşenler kullanarak tasarlanmıştır. Bu, kodun bakımını ve genişletilmesini kolaylaştırır.


#### Derleme Felsefesi


Google'ın derleme felsefesi, birkaç temel prensip üzerine kuruludur:


1. **Tekrarlanabilirlik**: Derleme süreçlerinin her seferinde aynı sonuçları vermesi önemlidir. Bu, kodun tutarlılığını ve güvenilirliğini sağlar.

2. **Hız ve Verimlilik**: Derleme süreçlerinin hızlı ve verimli olması, geliştiricilerin verimliliğini artırır ve yazılımın piyasaya sürülme süresini kısaltır.

3. **Otomasyon**: Derleme süreçlerinin otomatikleştirilmesi, manuel hataları azaltır ve süreçlerin daha güvenilir olmasını sağlar.

4. **Şeffaflık**: Derleme süreçlerinin şeffaf olması, geliştiricilerin süreçleri anlamalarını ve gerektiğinde müdahale edebilmelerini sağlar.


#### Google'ın Deneyimleri ve Uygulamaları


Google, derleme sistemlerini sürekli olarak iyileştirmek için geri bildirimler toplar ve en iyi uygulamaları benimser. Şirket, derleme süreçlerini optimize etmek ve geliştiricilerin verimliliğini artırmak için çeşitli araçlar ve stratejiler kullanır. Google'ın derleme sistemleri, büyük ölçekli projelerin yönetimini daha verimli hale getirir.


#### Sonuç


Derleme sistemleri, yazılım geliştirme sürecinin temel unsurlarından biridir. Google, güçlü derleme sistemleri ve felsefesi ile büyük ve karmaşık yazılım projelerini yönetir. Bu sistemler, yazılımın hızlı, güvenilir ve tutarlı bir şekilde derlenmesini sağlar. Google'ın derleme süreçleri, yazılım geliştirme sürecinin hızını ve verimliliğini artırmak için kritik öneme sahiptir.


Kaynak: [Titus Winters, Tom Manshreck, Hyrum Wright - Software Engineering at Google: Lessons Learned from Programming Over Time-O'Reilly Media (2020)]


### Critique: Google’un Kod İnceleme Aracı


**Giriş**

Google'un yazılım geliştirme sürecinde kod inceleme önemli bir rol oynar. Kod incelemenin ana amacı, kod tabanının okunabilirliğini ve sürdürülebilirliğini artırmaktır. Google'da bu süreci desteklemek için kullanılan ana araç Critique'dir. Critique, kod incelemenin birincil motivasyonlarını destekler ve değişiklikler üzerinde yorum yapma imkanı sunar. Ayrıca, "scoring" sistemi ile hangi kodun kod tabanına dahil edileceğine karar vermede kapı bekçiliği yapar.


**Kod İnceleme Araç Prensipleri**

Critique, Google'ın geliştirme kültüründen şekillenen bazı temel prensiplere sahiptir:

- **Basitlik**: Critique'in kullanıcı arayüzü, gereksiz seçenekler olmadan kod incelemenin kolay yapılmasını sağlamak için tasarlanmıştır. Arayüz hızlı yüklenir ve gezinme kolaydır.

- **Güven Temeli**: Kod inceleme, başkalarını yavaşlatmak için değil, güçlendirmek içindir. Meslektaşlara güvenmek, inceleme sürecinin önemli bir parçasıdır.

- **Genel İletişim**: İletişim sorunları nadiren araçlar aracılığıyla çözülür. Critique, kullanıcıların kod değişiklikleri hakkında yorum yapmaları için genel yolları önceliklendirir.

- **İş Akışı Entegrasyonu**: Critique, diğer temel yazılım geliştirme araçlarıyla bir dizi entegrasyon noktasına sahiptir. Geliştiriciler, kodu görüntüleme, düzenleme ve test sonuçlarını kolayca görebilirler .


**Kod İnceleme Akışı**

Critique, kod inceleme sürecini aşağıdaki aşamalar üzerinden gerçekleştirir:

1. **Değişiklik Oluşturma**: Kullanıcı, kod tabanında bir değişiklik yapar ve bu değişikliği Critique'e yükler. Bu işlem, otomatik kod analizörlerini tetikler.

2. **İnceleme İsteme**: Yazar, değişiklikten memnun olduktan sonra, inceleme için bir veya daha fazla kişiye gönderir.

3. **Yorum Yapma**: İnceleyiciler, değişiklik üzerinde yorum yapar. Otomatik analiz sonuçları da incelenir.

4. **Değişikliği Düzenleme ve Yorumlara Yanıt Verme**: Yazar, inceleyicilerin geri bildirimlerine göre değişiklik yapar ve yeni anlık görüntüleri yükler.

5. **Değişiklik Onayı**: İnceleyiciler, değişikliğin son haliyle ilgili memnun olduklarında, onay verirler ve değişikliği "LGTM" (bana göre iyi görünüyor) olarak işaretlerler.

6. **Değişiklik Commit Etme**: Değişiklik onaylandıktan sonra, yazar değişikliği kod tabanına commit edebilir .


**Sonuç**

Critique, Google'ın kod inceleme sürecini desteklemek için kullanılan ana araçtır. Basitlik, güven, genel iletişim ve iş akışı entegrasyonu gibi prensipler üzerine kurulmuştur. Kod inceleme süreci, kod tabanının okunabilirliğini ve sürdürülebilirliğini artırmayı hedeflerken, aynı zamanda ekip içi güveni ve iletişimi de güçlendirir. Critique'in başarıyla kullanılması, Google'ın yazılım geliştirme süreçlerinde önemli bir rol oynar .


### Statik Analiz: Google’un Kod İnceleme Aracı


**Giriş**

Statik analiz, kaynak kodun analiz edilerek potansiyel hataların, antipatternlerin ve diğer sorunların tespit edilmesini sağlayan bir tekniktir. "Statik" kısmı, bu analizin çalıştırılmayan kod üzerinde yapılmasını ifade eder. Google’da statik analiz, kodun üretim kodu olarak kontrol edilmeden önce hataların tespit edilmesini sağlar ve API sürümlerine uyumun sağlanması gibi en iyi uygulamaların benimsenmesine yardımcı olur .


**Etkili Statik Analizin Özellikleri**

Etkili statik analiz araçları için iki temel özellik vardır: ölçeklenebilirlik ve kullanılabilirlik. Google’ın milyarlarca satırlık kod tabanıyla çalışacak analiz araçlarının ölçeklenebilir olması gerekmektedir. Bu, analiz araçlarının yalnızca bekleyen kod değişikliklerinden etkilenen dosyaları analiz etmeleri anlamına gelir. Ayrıca, analizlerin doğrudan ilgili mühendislere gösterilmesi, sürecin tıkanmasını önler .


**Ölçeklenebilirlik**

Modern yazılımlar büyüdükçe, analiz araçlarının ölçeklenebilir olması ve yazılım geliştirme sürecini yavaşlatmadan sonuç üretmesi gerekmektedir. Google’daki statik analiz araçları, değişiklikten etkilenen dosyalar veya satırlar üzerinde odaklanarak büyük kod tabanlarını parça parça analiz eder. Bu yaklaşımlar, analizin daha hızlı ve etkili olmasını sağlar .


**Kullanılabilirlik**

Analiz araçlarının kullanılabilirliği, geliştiricilerin zaman maliyeti ile analizden sağlanan fayda arasındaki dengeye bağlıdır. Örneğin, mevcut çalışan kodda bir uyarıyı düzeltmek yeni hatalara yol açabilir. Bu nedenle, genellikle yeni eklenen uyarılar veya değiştirilen kod üzerindeki uyarılar üzerinde odaklanılır. Ayrıca, analiz raporlarının geliştiriciler için gerçekten faydalı olmasına özen gösterilir. Otomatik olarak düzeltilebilen hatalar varsa, bu hatalar otomatik olarak düzeltilir .


**Geliştirici Mutluluğuna Odaklanma**

Statik analiz araçlarının başarısı için geliştirici mutluluğu büyük önem taşır. Google’da, düşük yanlış pozitif oranlarına sahip analiz araçları kullanılır ve geliştiricilerin geri bildirimleri dikkate alınarak bu araçlar sürekli olarak iyileştirilir. Bu geri bildirim döngüsü, kullanıcı güveni oluşturur ve analiz araçlarının kullanımını artırır .


**Statik Analizin Geliştirici İş Akışının Bir Parçası Haline Getirilmesi**

Google’da statik analiz araçları, kod inceleme araçları ile entegre edilmiştir. Bu entegrasyon, geliştiricilerin değişiklik gönderirken analiz sonuçlarını görmelerini ve bu sonuçlara göre hareket etmelerini sağlar. Kod inceleme süreci, analiz sonuçlarının gösterilmesi için ideal bir noktadır, çünkü geliştiriciler zaten değişiklik yapma modundadır ve analiz sonuçlarına göre kodlarını güncelleyebilirler .


**Kullanıcıları Katkıda Bulunmaya Teşvik Etme**

Google’da, alan uzmanlarının bilgi birikimlerini geniş ölçekte kullanmalarını sağlamak amacıyla yeni analiz araçları veya mevcut araçlar için yeni kontroller geliştirmeleri teşvik edilir. Bu sayede, yazılım geliştirme sürecinde karşılaşılan belirli hataların tekrar ortaya çıkması önlenir ve kod kalitesi artırılır .


**Tricorder: Google’ın Statik Analiz Platformu**

Tricorder, Google’da kullanılan statik analiz platformudur. Tricorder, kod inceleme aracı Critique ile entegredir ve analiz sonuçlarını kullanıcıya gösterir. Analiz sonuçları, kod inceleme sayfasında gri yorum kutuları olarak görüntülenir. Tricorder, günde 50.000’den fazla kod incelemesini analiz eder ve her saniye birden fazla analiz gerçekleştirir .


**Entegre Araçlar ve Geri Bildirim Kanalları**

Tricorder, farklı türde statik analiz araçlarını destekler ve geliştiricilerden gelen geri bildirimleri toplar. Geri bildirim döngüsü, analiz sonuçlarının sürekli olarak iyileştirilmesini sağlar. Geliştiriciler, analiz sonuçlarının yararlı olup olmadığını belirtebilir ve bu geri bildirimler, analiz araçlarının performansını izlemek ve iyileştirmek için kullanılır .


**Sonuç**

Statik analiz, kod tabanını iyileştirmek, hataları erken tespit etmek ve daha pahalı süreçlerin (insan incelemesi ve test gibi) odaklanmasını sağlamak için harika bir araçtır. Google’da, statik analiz altyapısının ölçeklenebilirliği ve kullanılabilirliği artırılarak, statik analiz yazılım geliştirme sürecinin etkili bir bileşeni haline getirilmiştir .


### Bağımlılık Yönetimi: Google’un Yaklaşımı


**Giriş**

Bağımlılık yönetimi, kontrol etmediğimiz kütüphane, paket ve bağımlılıkların yönetimini içerir ve yazılım mühendisliğinin en zor ve en az anlaşılan problemlerinden biridir. Google'da bağımlılık yönetimi, harici bağımlılıkların sürümlerini nasıl güncelleyeceğimiz, sürümleri nasıl tanımlayacağımız ve hangi tür değişikliklerin izinli veya beklenen olduğu gibi sorulara odaklanır19:0†source.


**Bağımlılık Yönetiminin Zorlukları**

Bağımlılık yönetimi sorunlarını tanımlamak bile alışılmadık zorluklar sunar. Bağımlılık yönetiminin ana problemi, iki bağımlılık düğümünün çelişkili gereksinimlere sahip olduğu ve organizasyonun her ikisine de bağlı olduğu durumlardan kaynaklanır. Bu genellikle, bir bağımlılığın yeni bir sürümüne ihtiyaç duyulması ancak diğerinin bu yeni sürümle uyumsuz olması durumunda ortaya çıkar19:3†source】【19:6†source.


**Çözüm Yaklaşımları**

1. **Statik Bağımlılık Modeli**

- En basit çözüm, bağımlılıkları asla değiştirmemektir. Bu modelde, API değişiklikleri veya davranış değişiklikleri yapılmaz; yalnızca kullanıcı kodunu bozmayacak hata düzeltmeleri yapılır. Bu model, güvenlik sorunları veya hata düzeltmeleri gerektirmeyen bir dünyada çok çekici olabilir, ancak uzun vadede sürdürülebilir değildir19:12†source】【19:13†source.


2. **Semantik Sürümleme (SemVer)**

- SemVer, sürüm numaralarının üç bileşenli (ana, küçük, yama) olması pratiğidir. Ana sürüm değişiklikleri, mevcut kullanımı bozabilecek değişiklikleri ifade ederken, küçük sürüm değişiklikleri yalnızca işlevsellik ekler ve yama sürüm değişiklikleri API'yi etkilemeyen hata düzeltmelerini içerir. Bu sistem, bağımlılık ağlarının sürüm gereksinimlerini belirlemede kullanılır ve genellikle tatmin edici sürüm gereksinimlerini çözmek için SAT çözücüler kullanır19:12†source】【19:13†source.


3. **Paket Dağıtım Modelleri**

- Bu modelde, bir organizasyon bir dizi bağımlılığı toplar, uyumlu bir sürüm seti bulur ve bu koleksiyonu tek bir birim olarak yayınlar. Örneğin, Linux dağıtımları bu modeli kullanır. Dağıtımcılar, uyumlu sürüm setlerini bulmak, yamalamak ve test etmekle sorumludur19:15†source.


4. **Başta Canlı Modeli**

- Google'da önerilen bu model, tüm bağımlılıkların güncel sürümlerine bağımlı olmayı ve hiçbir şeyi değiştirmemeyi öngörür. Bu model, API sağlayıcılarının değişiklikleri tüm ekosistem üzerinde test etmelerini gerektirir ve değişikliklerin güvenli olup olmadığını pratik deneyimlerle belirlemeyi amaçlar19:15†source】【19:18†source.


**Google’ın Bağımlılık Yönetimi Yaklaşımı**

Google, bağımlılık yönetimi sorunlarının çoğunu kaynak kontrolü sorunlarına dönüştürerek çözmeye çalışır. Çoğu bağımlılık, içsel olarak geliştirilmiş projelerdir, bu nedenle kaynak kontrolü, bağımlılık yönetiminden çok daha kolaydır. Ancak, harici projelerin eklenmesi gerektiğinde, bu bağımlılıklar "third_party" dizinine eklenir. Google'da bir OSS projesi eklenirken belirli adımlar izlenir ve bu sürecin yönetimi için politikalar uygulanır19:14†source.


**Sonuç**

Bağımlılık yönetimi, yazılım mühendisliğinde karmaşık API yüzeylerinin ve bağımlılık ağlarının yönetimini içerir. Google'da kullanılan çeşitli modeller ve yaklaşımlar, bu sorunun çözümünde önemli bir rol oynar. Semantik sürümleme ve başta canlı modeli gibi yaklaşımlar, bu sürecin daha etkili yönetilmesini sağlar19:16†source.


### Büyük Ölçekli Değişiklikler: Google’un Yaklaşımı


**Giriş**

Google’da büyük ölçekli değişiklikler (LSC), kod tabanının ve mühendis sayısının büyümesiyle birlikte ortaya çıkan zorlukları aşmak için geliştirilmiş teknik ve sosyal stratejileri içerir. Bu değişiklikler genellikle tek bir atomik birim olarak gönderilemeyen, mantıksal olarak ilişkili bir dizi değişikliği ifade eder19:0†source】【19:1†source.


**Büyük Ölçekli Değişiklik Nedir?**

LSC, birçok dosyayı etkileyen ve genellikle çok büyük veya çok sayıda dosya nedeniyle tek bir atomik değişiklik olarak gönderilemeyen değişikliklerdir. Google’da LSC’ler genellikle otomatik araçlar kullanılarak oluşturulur ve çeşitli kategorilere ayrılır:

- Yaygın antipatternlerin temizlenmesi

- Kullanımı sonlandırılmış kütüphane özelliklerinin değiştirilmesi

- Derleyici yükseltmeleri gibi altyapı iyileştirmeleri

- Kullanıcıları eski bir sistemden yenisine taşıma19:1†source.


**Teknik Kısıtlamalar**

LSC’lerin atomik olarak gönderilmesinin önündeki en büyük engellerden biri, versiyon kontrol sistemlerinin büyük değişiklikleri işleme kapasitesidir. Çoğu versiyon kontrol sistemi, değişikliklerin büyüklüğüne göre lineer olarak ölçeklenir ve büyük değişiklikler sistemin diğer kullanıcılarını engelleyebilir19:6†source.


**Birleştirme Çatışmaları**

Değişiklik büyüdükçe, birleştirme çatışmaları yaşama olasılığı da artar. Çoğu versiyon kontrol sistemi, merkezi depoda daha yeni bir sürüm varsa güncellemeyi ve birleştirmeyi gerektirir. Bu durum, özellikle çok sayıda mühendis aynı depoda çalışıyorsa, karmaşık hale gelir19:7†source.


**Kod Tabanı İçgörüsü**

Google, kod tabanının geniş çaplı analizini yapabilmek için Kythe gibi semantik indeksleme araçlarını kullanır. Bu araçlar, fonksiyonun nerede çağrıldığını veya hangi sınıfların türetildiğini gibi soruları cevaplamayı sağlar. Ayrıca, bu verileri yeniden düzenleme araçlarına entegre ederek büyük ölçekli değişikliklerin uygulanmasını kolaylaştırır19:9†source.


**Değişiklik Yönetimi**

Google, LSC’lerin küçük parçalara bölünmesini ve bu parçaların bağımsız olarak test edilmesini, gözden geçirilmesini ve gönderilmesini yöneten Rosie adlı bir araca sahiptir. Rosie, büyük değişiklikleri proje sınırları ve sahiplik kurallarına göre böler ve her parçayı bağımsız olarak test eder ve gönderir19:3†source.


**Test Etme**

Her bağımsız parça, Google’ın CI çerçevesi olan TAP ile test edilir. TAP, değişikliklerin etkilediği tüm testleri çalıştırır ve her parçanın güvenli bir şekilde gönderilmesini sağlar. Bu, düşük olasılıklı olayların bile büyük ölçekte neredeyse kesinlikle gerçekleşeceği anlamına gelir, bu yüzden sürekli olarak otomatik hata tespiti ve ortadan kaldırma sistemleri kullanılır19:13†source】【19:17†source.


**Kod İncelemesi**

Google’da tüm değişiklikler gönderilmeden önce gözden geçirilmelidir. LSC’lerin gözden geçirilmesi zahmetli olabilir, bu yüzden araçlar kullanarak bu süreci kolaylaştırmak önemlidir. Rosie, değişiklikleri uygun gözden geçiricilere otomatik olarak gönderir ve inceleme sürecini hızlandırır19:12†source】【19:14†source.


**Sonuç**

Google’da büyük ölçekli değişikliklerin yönetimi, otomasyon ve iyi bir test altyapısı ile desteklenir. Bu, kod tabanının uzun vadede evrim geçirmesini sağlar ve yazılım mühendisliği uygulamalarını ölçeklendirirken geniş çaplı değişiklikler yapma esnekliği kazandırır19:15†source】【19:19†source.


### Sürekli Entegrasyon (Continuous Integration): Google’un Yaklaşımı


**Giriş**

Sürekli Entegrasyon (CI), yazılım geliştirme pratiğinde, ekip üyelerinin çalışmalarını sık sık entegre ettiği ve her entegrasyonun, entegrasyon hatalarını hızlı bir şekilde tespit etmek için otomatik bir derleme (ve test) ile doğrulandığı bir uygulamadır. Temel hedef, problemli değişiklikleri olabildiğince erken yakalamaktır .


**Temel Kavramlar**

1. **Hızlı Geri Bildirim Döngüleri**

- Bir hata ne kadar geç yakalanırsa, maliyeti o kadar artar. Hatalar, kod değişikliğinin yaşam döngüsünün farklı aşamalarında yakalanabilir. CI, hızlı geri bildirim döngüleri kullanarak bu maliyeti minimize eder. Geri bildirim döngüleri, kod değişiklikleri yerel geliştirme ortamından üretime kadar ilerlerken oluşur .


2. **Otomasyon**

- CI, derleme ve dağıtım süreçlerini otomatikleştirir. Otomasyon, mühendislerin zamanını korur ve süreçleri daha güvenilir hale getirir. Google'da, Test Otomasyon Platformu (TAP) kullanılarak sürekli derleme ve testler gerçekleştirilir. TAP, her gün 50.000'den fazla değişikliği işler ve dört milyardan fazla test çalıştırır .


3. **Sürekli Test**

- Sürekli test, kod değişikliklerinin yaşam döngüsünün her aşamasında uygulanır. Bu süreç, kod değişikliklerinin güvenliğini ve bütünlüğünü sağlar. Üretim ortamında bile testler çalıştırılarak, yazılımın çalışma durumu ve testlerin geçerliliği doğrulanır .


4. **Erişilebilir ve Kullanılabilir Geri Bildirim**

- CI geri bildirimlerinin geniş ölçüde erişilebilir ve kullanımı kolay olması önemlidir. Google'da, test raporlama sistemi, tüm test sonuçlarını ve logları tek bir yerden erişilebilir kılar. Bu şeffaflık, mühendislerin geri bildirimleri paylaşmasını ve entegrasyon hatalarından öğrenmesini sağlar .


**Zorluklar ve En İyi Uygulamalar**

- **Hızlı geri bildirim döngülerini optimize etme**: Presubmit ve post-submit testlerin doğru zamanda çalıştırılması gereklidir. Bu dengeyi sağlamak, mühendislik verimliliğini artırır ve ürün kalitesini iyileştirir .

- **Kapsamlı otomasyon**: Otomasyon, manuel hataları azaltır ve süreçleri hızlandırır. CI sürecinde otomasyon, sürekli derleme ve teslimat ile entegre edilmiştir .

- **Geri bildirimin eyleme dönüştürülebilir olması**: Geri bildirimlerin mühendisler için eyleme dönüştürülebilir ve anlaşılır olması gerekir. Bu, sorunların hızlı bir şekilde tespit edilmesini ve çözülmesini sağlar .


**Sonuç**

Google’da CI, yazılım geliştirme sürecinin ayrılmaz bir parçasıdır. Hızlı geri bildirim döngüleri, otomasyon ve sürekli test, CI’nin başarısını sağlar. Bu uygulamalar, mühendislerin kod değişikliklerini güvenle entegre etmelerini ve yüksek kaliteli yazılımlar geliştirmelerini mümkün kılar .


Bu özet, CI'nin Google'daki uygulamalarını ve sağladığı faydaları genel hatlarıyla anlatmaktadır. Daha detaylı bilgi için ilgili bölüme başvurabilirsiniz.


### Sürekli Teslimat (Continuous Delivery): Google’un Yaklaşımı


**Giriş**

Sürekli Teslimat (CD), yazılım değişikliklerinin sürekli olarak üretim ortamına alınmasını sağlayan bir süreçtir. Google'da, CD, ekiplerin yüksek kaliteli ürünleri hızlı bir şekilde kullanıcılarına ulaştırmasını sağlar. CD, yazılım geliştirme sürecinin hızını ve çevikliğini artırarak, piyasaya hızlı çıkış süresini optimize eder19:3†source.


**Temel Kavramlar**

1. **Agility (Çeviklik)**

- Google'da, küçük partiler halinde ve sık sık sürüm yayınlamak temel bir prensiptir. Bu yaklaşım, yazılım kalitesini artırır ve hata bulma sürecini hızlandırır.


2. **Otomasyon**

- Sürekli entegrasyon (CI) süreçlerinin bir uzantısı olarak, CD süreci de otomatikleştirilmiştir. Otomasyon, manuel hataları azaltır ve mühendislerin daha verimli çalışmasını sağlar. Örneğin, TAP (Test Otomasyon Platformu) kullanılarak otomatikleştirilmiş derleme ve test süreçleri yürütülür19:3†source.


3. **Yalıtım**

- Modüler bir mimari, değişikliklerin yalıtılmasını ve hata ayıklama süreçlerinin kolaylaşmasını sağlar. Google'da bu, bağımsız hizmetler veya mikro hizmetler kullanılarak gerçekleştirilir19:12†source】【19:13†source.


4. **Güvenilirlik**

- Anahtar sağlık göstergeleri (örneğin, çökme oranları veya gecikme süreleri) sürekli olarak ölçülür ve iyileştirilir. Bu göstergeler, yazılımın güvenilirliğini artırmak için kritik öneme sahiptir19:13†source.


5. **Veri Odaklı Karar Alma**

- A/B testleri, yeni özelliklerin etkinliğini değerlendirmek için kullanılır. Bu testler, kullanıcı deneyimini optimize etmek için veri odaklı kararların alınmasını sağlar19:14†source.


**CD Sürecinin Adımları**

1. **Sürüm Adaylarının Hazırlanması**

- Sürüm otomasyonu, en son kod ve yapılandırmaları sürekli olarak derleyerek sürüm adaylarını oluşturur. Bu süreç, değişikliklerin üretim ortamına alınmadan önce test edilmesini sağlar19:12†source】【19:13†source.


2. **Özellik Bayrakları ve Deneyler**

- Özellik bayrakları, belirli özelliklerin etkinleştirilip devre dışı bırakılmasına olanak tanır. Bu, kullanıcıların belirli bir özelliği kullanıp kullanmamasına karar verme sürecini esnek hale getirir ve riskleri minimize eder19:12†source】【19:13†source.


3. **Aşamalı Yayın**

- Yeni sürümler, küçük kullanıcı gruplarına aşamalı olarak sunulur. Bu süreç, olası sorunların geniş kitlelere yayılmadan önce tespit edilmesini ve düzeltilmesini sağlar19:13†source.


4. **Kültürel Değişim ve Disiplin**

- Sürekli yayınlama kültürü, ekiplerin daha sık ve güvenle yayın yapmalarını teşvik eder. Bu kültürel değişim, yazılım geliştirme sürecinin daha verimli ve etkili olmasını sağlar19:14†source.


**Sonuç**

Google’da Sürekli Teslimat, yazılım değişikliklerinin hızlı ve güvenli bir şekilde üretim ortamına alınmasını sağlayan bir süreçtir. CD, otomasyon, veri odaklı karar alma ve kültürel değişim gibi prensipler üzerine kuruludur. Bu süreç, Google’ın yenilikçi ve yüksek kaliteli yazılımlar üretmesini sağlar19:13†source】【19:14†source】【19:16†source.


### Compute as a Service (CaaS): Google’un Yaklaşımı


**Giriş**

Compute as a Service (CaaS), yazılımın çalışması için gerekli donanım kaynaklarını sağlama sürecidir. Bu bölüm, Google’ın CaaS çözümlerine nasıl ulaştığını ve bu çözümlerin zamanla nasıl geliştiğini açıklar. CaaS, yazılım mühendislerinin uygulamalarını yönetmek ve çalıştırmak için ihtiyaç duyduğu hesaplama gücünü sağlar .


**Hesaplama Ortamının Yönetimi**

Google, iç sistemlerinden biri olan Borg'u kullanarak CaaS çözümlerini geliştirdi. Borg, Kubernetes ve Mesos gibi modern CaaS mimarilerinin öncüsüdür. Borg’un temel özellikleri arasında otomatik planlama, yük dengeleme ve hata yönetimi bulunur .


**Kapsayıcılaştırma ve Çoklu Kiracılık (Multitenancy)**

Kapsayıcılar, uygulamaların izole bir şekilde çalışmasını sağlar ve kaynak verimliliğini artırır. Google, cgroups ve chroot jails gibi teknolojiler kullanarak kapsayıcılarını geliştirdi. Bu, sanal makinelerin (VM) getirdiği ek yüklerden kaçınarak daha hafif ve hızlı bir çözüm sunar19:14†source.


**Otomasyon**

CaaS, manuel iş yükünü azaltmak için otomasyon sağlar. Örneğin, makine atamasını otomatikleştirmek, insan müdahalesi olmadan makineleri seçip, iş yüklerini bu makinelere dağıtmayı mümkün kılar. Bu, özellikle büyük ölçekli organizasyonlarda önemlidir, çünkü yüzlerce veya binlerce makineyi manuel olarak yönetmek imkansız hale gelir19:15†source.


**Sunucusuz (Serverless) Mimariler**

Sunucusuz çözümler, kullanıcıların altyapıyı yönetmek zorunda kalmadan uygulamalarını çalıştırmalarını sağlar. Bu modeller, yüksek soyutlama seviyeleri sunar ve ölçeklenebilirliği artırır. Ancak, sunucusuz çözümler, tamamen durumsuz (stateless) olmayı gerektirir ve bu da bazı kullanım durumlarında sınırlamalar getirebilir19:11†source.


**Kapsayıcılar ve Sunucusuz Çözümler Arasındaki Karşılaştırma**

- **Kapsayıcılar**: Kapsayıcılar, daha fazla kontrol ve esneklik sunar. Uygulama gereksinimlerine göre özel ayarlar yapabilir ve çeşitli iş yüklerini yönetebilir.

- **Sunucusuz**: Sunucusuz çözümler, yönetim yükünü azaltır ve ölçeklenebilirliği artırır. Ancak, daha az kontrol ve bazı sınırlamalar getirir19:11†source.


**Kamusal ve Özel Bulut**

Kamu bulutu, yönetim yükünü bulut sağlayıcısına devrederek, organizasyonların kendi uzmanlık alanlarına odaklanmalarını sağlar. Özel bulut ise daha fazla kontrol ve güvenlik sunar. Google, genellikle her iki bulut çözümünü de kullanarak hibrit bir yaklaşım benimser19:16†source】【19:19†source.


**Sonuç**

Google’da CaaS, ölçeklenebilirlik ve verimlilik sağlayan temel bir çözümdür. Kapsayıcılar, otomasyon ve sunucusuz mimariler gibi teknolojiler, hesaplama ortamının yönetimini kolaylaştırır ve yazılım mühendislerinin daha verimli çalışmasını sağlar. CaaS çözümleri, uygulamaların sorunsuz çalışmasını ve kaynakların verimli kullanılmasını sağlar19:13†source】【19:17†source】【19:18†source.


### Son Söz: Google’un Yazılım Mühendisliği Yaklaşımı


**Giriş**

Google’da yazılım mühendisliği, büyük ve sürekli evrilen bir kod tabanını geliştirme ve sürdürme konusunda olağanüstü bir deneyim olmuştur. Bu süreçte, mühendislik ekipleri, milyarlarca kullanıcıya dokunan ve teknoloji endüstrisinde lider bir şirket olan Google'ı ileriye taşımıştır. Bu başarı, bu kitapta belirtilen ilkeler olmadan mümkün olamazdı, bu nedenle bu sayfaların hayata geçmesini görmek beni çok heyecanlandırıyor .


**Sürekli Değişen Teknoloji Ortamı**

Son 50 yıl (veya önceki sayfalar), yazılım mühendisliğinin asla durağan olmadığını kanıtladı. Teknolojinin sürekli değiştiği bir ortamda, yazılım mühendisliği işlevi, bir organizasyon içinde özellikle önemli bir rol oynar. Günümüzde yazılım mühendisliği ilkeleri, yalnızca bir organizasyonu etkili bir şekilde nasıl yönetileceği ile ilgili değil, aynı zamanda kullanıcılar ve dünya genelinde daha sorumlu bir şirket olmayı da kapsar .


**Çözüm Bulma ve Çeviklik**

Yaygın yazılım mühendisliği problemlerine çözümler bulmak, çoğu zaman gizli değildir - çoğu, mevcut günün problemlerine işe yarayan ve teknik sistemlerdeki kaçınılmaz değişikliklere de dayanabilecek çözümleri belirlemek için kararlı bir çeviklik seviyesi gerektirir. Bu çeviklik, 2008'de Google'a katıldığımdan beri çalıştığım ve öğrendiğim yazılım mühendisliği ekiplerinin ortak bir özelliğidir .


**Sürdürülebilirlik**

Sürdürülebilirlik fikri, yazılım mühendisliğinin merkezindedir. Bir kod tabanının beklenen ömrü boyunca, ürün yönü, teknoloji platformları, temel kitaplıklar, işletim sistemleri ve daha fazlasındaki değişikliklere tepki verebilmeli ve uyum sağlayabilmeliyiz. Bugün, yazılım ekosistemimizin değişen parçalarında gerekli esnekliği sağlamak için bu kitapta belirtilen ilkelere güveniyoruz .


**Paylaşılan Öğrenimler**

Google’da sürdürülebilirlik elde etmenin yollarının her organizasyon için işe yarayacağını kanıtlayamasak da, bu önemli öğrenimleri paylaşmanın önemli olduğunu düşünüyorum. Yazılım mühendisliği yeni bir disiplindir, bu yüzden çok az organizasyon hem sürdürülebilirlik hem de ölçek elde etme şansına sahip olmuştur. Gördüklerimizin bir özetini sunarak ve yoldaki tümsekleri göstererek, kod sağlığı için uzun vadeli planlamanın değerini ve uygulanabilirliğini göstermeyi umuyoruz. Zamanın geçişi ve değişimin önemi göz ardı edilemez .


**Sonuç**

Bu kitap, yazılım mühendisliği ile ilgili bazı temel prensiplerimizi özetlemektedir. Yüksek düzeyde, teknolojinin toplum üzerindeki etkisini de aydınlatmaktadır. Yazılım mühendisleri olarak, kodumuzun herkes için kapsayıcı, eşitlikçi ve erişilebilir olacak şekilde tasarlanmasını sağlamak bizim sorumluluğumuzdadır. Yalnızca inovasyon amacıyla inşa etmek artık kabul edilebilir değildir; yalnızca belirli bir kullanıcı grubuna yardımcı olan teknoloji hiç de yenilikçi değildir .


Google’daki sorumluluğumuz her zaman iç ve dış geliştiricilere iyi aydınlatılmış bir yol sağlamaktı. Yapay zeka, kuantum bilişim ve ortam bilişim gibi yeni teknolojilerin yükselişiyle birlikte, bir şirket olarak öğrenecek çok şeyimiz var. Yazılım mühendisliğinin önümüzdeki yıllarda nereye gideceğini görmek beni özellikle heyecanlandırıyor ve bu kitabın o yolu şekillendirmeye yardımcı olacağına inanıyorum .

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال