Temiz kod nedir, ne değildir?
Robert C. Martin'in 2008 kitabı "Clean Code" yazılım dünyasında etkili oldu. 2026'da bazı önerileri hâlâ geçerli, bazıları zamanla nüans kazandı. AIOR olarak müşteri projelerinde "temiz kod" kavramını dogma değil pragmatik bir yaklaşım olarak görüyoruz: amaç gelecek geliştiricinin (muhtemelen 6 ay sonraki kendinizin) kodu anlamak için harcadığı süreyi azaltmak.İsimlendirme — en önemli pratik
Kötü isimlendirme en sık karşılaştığımız problem. AIOR projelerinde kod review'larında en çok düzelttiğimiz konu. İlkeler:- Aşırı kısa olmaktan kaçınma (`d`, `tmp`, `data`, `info`) — anlamı belirsiz.
- Aşırı uzunluktan kaçınma (`processedUserRegistrationFormValidatedAndSavedData`) — okunabilirliği bozar.
- Domain dilini yansıtmalı — `customer`, `order`, `invoice` gibi domain terimleri kullanılır.
- Boolean isimler — `isActive`, `hasPermission` (anlamı net).
- Function isimleri fiil — `calculateTotal`, `sendEmail`.
- Class isimler isim — `OrderProcessor`, `UserRepository`.
Function — küçük ve odaklı
Bir function bir şey yapmalı. Pratik kural: function 15-20 satırı geçiyorsa muhtemelen birden fazla iş yapıyor. AIOR review'larında uzun function'ları ayırmayı öneriyoruz.Ancak aşırıya kaçmak da problem — 3 satırlık helper function'lar her yerde olduğunda kod okumak da zorlaşır. Doğru denge: function bir conceptual unit'i kapsamalı.
Comment'ler — son çare[/HEADING>
"Self-documenting code" ideal ama her zaman gerçekçi değil. AIOR projelerinde comment kullanım kuralları:
- Yazılmalı: WHY açıklayan comment'ler (bu kararı neden aldık, hangi edge case'i koruyor, hangi external bug'ı bypass ediyor).
- Yazılmamalı: WHAT açıklayan comment'ler — kod ne yaptığını zaten söylüyor olmalı.
- Tehlikeli: Outdated comment'ler — kod değişti ama comment kalmış; yanlış yola yönlendirir.
`// Bu kodu silme, çalışıyor` tipinde comment'ler kötü kod kokusunun göstergesi.
SOLID prensipleri — pragmatik uygulama
SOLID prensipleri 2026'da hâlâ geçerli ama dogmatik uygulamak proje verimliliğini azaltır:
- Single Responsibility — her class bir nedene bağlı değişmeli. Mantıklı ama "single" subjektif.
- Open/Closed — extension'a açık, modification'a kapalı. Genelde abstraction ile sağlanır.
- Liskov Substitution — subclass parent'ın yerini alabilmeli. Inheritance kullanılıyorsa kritik.
- Interface Segregation — küçük, odaklı interface'ler. Geniş interface'leri böl.
- Dependency Inversion — concrete sınıflara değil abstraction'lara bağımlı ol.
AIOR'da bu prensipleri uygularken pragmatik kalıyoruz — küçük proje için aşırı abstraction zararlı.
DRY — but not at all costs
"Don't Repeat Yourself" hâlâ önemli ama yanlış uygulandığında daha kötü kod üretir. AIOR rule of thumb: 3 kez tekrar görüldüğünde abstraction'a yatırım yap. 2 kez gördüğünde dur, bekle. Premature abstraction yanlış generalize'lara yol açar.
"Code that looks similar isn't necessarily duplicate" — coupling olmadan benzer görünebilirler. Yanlış abstraction'a girmektense duplication'ı kabul etmek daha iyi olabilir.
Magic numbers ve string'ler
Kod içinde sayı veya string literal varsa bir anlamı vardır. Bu anlam constant ile belgelenmelidir:
Code:
// Kötü
if (user.age >= 18) { ... }
// İyi
const ADULT_AGE_THRESHOLD = 18;
if (user.age >= ADULT_AGE_THRESHOLD) { ... }
AIOR projelerinde magic number rule of thumb: tek seferde kullanılan + anlamı self-evident sayılar inline kalabilir; tekrar edilen veya domain anlamı taşıyan değerler constant olmalı.
Error handling — açık ve tutarlı
Hata yönetimi temiz kodun en zor parçalarından biri:
- Try/catch'leri scope'a sınırla — geniş catch block'lar hatayı yutar.
- Generic Exception yakalama yerine specific exception type.
- Hatayı log'la VE re-throw, yoksa silently fail.
- Custom exception type'ları kullan — `OrderNotFoundException`, `InsufficientFundsException`.
- Result type pattern (Rust-style) — bazı dillerde exception'lara alternatif.
Test edilebilirlik = temiz kod
Bir kod test edilebiliyorsa muhtemelen temizdir. Test yazmak zor ise muhtemelen tasarımda problem var. AIOR projelerinde bu pratik göstergeyi kullanıyoruz: yeni özellik için test yazmak doğal mı, yoksa mock-festival mi gerektiriyor? İkincisi tasarım kokusu.
Dependency injection, pure function'lar, immutable data — bunların hepsi test edilebilirliği destekler ve aynı zamanda temiz koda yol açar.
Code review — temiz kodun bekçisi
Code review temiz kod kültürünün operasyonel uygulanmasıdır. AIOR projelerinde her PR ikinci bir mühendisten geçer. Review'da kontrol edilenler:
- İsimlendirme net mi?
- Function çok mu uzun?
- Test coverage yeterli mi?
- Edge case'ler düşünüldü mü?
- Error handling tutarlı mı?
- Security implications var mı?
- Performance impact ne?
Sonuç
Temiz kod 2026'da hâlâ önemli ama dogma değil pratiğin amacı. Net isimlendirme, küçük focused function'lar, WHY-comment'leri, pragmatik SOLID, dikkatli DRY, ve disiplinli code review — bunlar yıllarca yaşayan kodbazların temeli. AIOR olarak müşteri projelerinde bu pratikleri standart paket olarak uyguluyoruz, dilden bağımsız. Sizin tarafınızda temiz kod kültürü için en sık karşılaştığınız zorluk ne — code review disiplini, naming consistency, yoksa test coverage mı?
Code:
// Kötü
if (user.age >= 18) { ... }
// İyi
const ADULT_AGE_THRESHOLD = 18;
if (user.age >= ADULT_AGE_THRESHOLD) { ... }
What clean code is, and isn't
Robert C. Martin's 2008 book "Clean Code" had a major impact on software practice. In 2026, some of its recommendations still hold; others have gained nuance. AIOR treats "clean code" as a pragmatic approach, not dogma: the goal is to reduce the time a future developer (probably yourself six months from now) spends understanding the code.
Naming — the most important practice
Bad naming is the issue we encounter most. It's the most common thing fixed in AIOR code reviews. Principles:
- Avoid being too short (`d`, `tmp`, `data`, `info`) — meaning is unclear.
- Avoid being too long (`processedUserRegistrationFormValidatedAndSavedData`) — kills readability.
- Reflect the domain language — `customer`, `order`, `invoice` — use domain terms.
- Boolean names — `isActive`, `hasPermission` (meaning clear).
- Function names are verbs — `calculateTotal`, `sendEmail`.
- Class names are nouns — `OrderProcessor`, `UserRepository`.
Functions — small and focused
A function should do one thing. Practical rule: if a function exceeds 15–20 lines, it probably does more than one thing. We recommend splitting long functions in AIOR reviews.
But going too far is also a problem — 3-line helpers everywhere also harm readability. The right balance: a function covers one conceptual unit.
Comments — a last resort
"Self-documenting code" is the ideal but not always realistic. Comment usage rules on AIOR projects:
- Should be written: WHY-explaining comments (why we chose this, which edge case it guards, which external bug it bypasses).
- Shouldn't be written: WHAT-explaining comments — code should already say what it does.
- Dangerous: outdated comments — the code changed but the comment remained; misdirects readers.
`// Don't delete, it works` style comments signal bad code smells.
SOLID principles — pragmatic application
SOLID still applies in 2026, but dogmatic application reduces project productivity:
- Single Responsibility — a class should change for one reason. Sensible but "single" is subjective.
- Open/Closed — open to extension, closed to modification. Usually achieved with abstraction.
- Liskov Substitution — a subclass should replace its parent. Critical if inheritance is used.
- Interface Segregation — small, focused interfaces. Break up wide interfaces.
- Dependency Inversion — depend on abstractions, not concrete classes.
At AIOR we stay pragmatic when applying these — excessive abstraction is harmful on small projects.
DRY — but not at all costs
"Don't Repeat Yourself" still matters but, wrongly applied, produces worse code. AIOR rule of thumb: invest in abstraction when you see the third repeat. After two, pause and wait. Premature abstraction leads to wrong generalisations.
"Code that looks similar isn't necessarily duplicate" — they can look similar without being coupled. Accepting duplication can be better than introducing the wrong abstraction.
Magic numbers and strings
Numbers and string literals inside code have meaning. That meaning belongs in a constant:
Code:
// Bad
if (user.age >= 18) { ... }
// Good
const ADULT_AGE_THRESHOLD = 18;
if (user.age >= ADULT_AGE_THRESHOLD) { ... }
Magic number rule of thumb on AIOR projects: numbers used once with self-evident meaning can stay inline; recurring values or those with domain meaning become constants.
Error handling — explicit and consistent
Error handling is one of the hardest parts of clean code:
- Scope try/catch tightly — broad catch blocks swallow errors.
- Catch specific exception types, not generic Exception.
- Log the error AND re-throw, or you silently fail.
- Use custom exception types — `OrderNotFoundException`, `InsufficientFundsException`.
- Result-type pattern (Rust-style) — alternative to exceptions in some languages.
Testability = clean code
If code is testable, it's probably clean. If writing tests is hard, there's probably a design problem. AIOR uses this practical signal: does adding a test for a new feature feel natural, or does it require a mock-festival? The latter is a design smell.
Dependency injection, pure functions, immutable data — all of these support testability and tend toward clean code.
Code review — clean code's gatekeeper
Code review is the operational application of clean-code culture. Every PR on AIOR projects passes through a second engineer. What's checked in review:
- Naming clear?
- Function too long?
- Test coverage sufficient?
- Edge cases considered?
- Error handling consistent?
- Any security implications?
- What's the performance impact?
Bottom line
Clean code in 2026 still matters but as the goal of practice, not as dogma. Clear naming, small focused functions, WHY comments, pragmatic SOLID, careful DRY, and disciplined code review — these are the foundation of codebases that live for years. AIOR applies these practices as a standard package on customer projects, language-independent. What's the biggest challenge on your side for clean code culture — code review discipline, naming consistency, or test coverage?
What clean code is, and isn't
Robert C. Martin's 2008 book "Clean Code" had a major impact on software practice. In 2026, some of its recommendations still hold; others have gained nuance. AIOR treats "clean code" as a pragmatic approach, not dogma: the goal is to reduce the time a future developer (probably yourself six months from now) spends understanding the code.Naming — the most important practice
Bad naming is the issue we encounter most. It's the most common thing fixed in AIOR code reviews. Principles:- Avoid being too short (`d`, `tmp`, `data`, `info`) — meaning is unclear.
- Avoid being too long (`processedUserRegistrationFormValidatedAndSavedData`) — kills readability.
- Reflect the domain language — `customer`, `order`, `invoice` — use domain terms.
- Boolean names — `isActive`, `hasPermission` (meaning clear).
- Function names are verbs — `calculateTotal`, `sendEmail`.
- Class names are nouns — `OrderProcessor`, `UserRepository`.
Functions — small and focused
A function should do one thing. Practical rule: if a function exceeds 15–20 lines, it probably does more than one thing. We recommend splitting long functions in AIOR reviews.But going too far is also a problem — 3-line helpers everywhere also harm readability. The right balance: a function covers one conceptual unit.
Comments — a last resort
"Self-documenting code" is the ideal but not always realistic. Comment usage rules on AIOR projects:- Should be written: WHY-explaining comments (why we chose this, which edge case it guards, which external bug it bypasses).
- Shouldn't be written: WHAT-explaining comments — code should already say what it does.
- Dangerous: outdated comments — the code changed but the comment remained; misdirects readers.
`// Don't delete, it works` style comments signal bad code smells.
SOLID principles — pragmatic application
SOLID still applies in 2026, but dogmatic application reduces project productivity:- Single Responsibility — a class should change for one reason. Sensible but "single" is subjective.
- Open/Closed — open to extension, closed to modification. Usually achieved with abstraction.
- Liskov Substitution — a subclass should replace its parent. Critical if inheritance is used.
- Interface Segregation — small, focused interfaces. Break up wide interfaces.
- Dependency Inversion — depend on abstractions, not concrete classes.
At AIOR we stay pragmatic when applying these — excessive abstraction is harmful on small projects.
DRY — but not at all costs
"Don't Repeat Yourself" still matters but, wrongly applied, produces worse code. AIOR rule of thumb: invest in abstraction when you see the third repeat. After two, pause and wait. Premature abstraction leads to wrong generalisations."Code that looks similar isn't necessarily duplicate" — they can look similar without being coupled. Accepting duplication can be better than introducing the wrong abstraction.
Magic numbers and strings
Numbers and string literals inside code have meaning. That meaning belongs in a constant:
Code:
// Bad
if (user.age >= 18) { ... }
// Good
const ADULT_AGE_THRESHOLD = 18;
if (user.age >= ADULT_AGE_THRESHOLD) { ... }
Magic number rule of thumb on AIOR projects: numbers used once with self-evident meaning can stay inline; recurring values or those with domain meaning become constants.
Error handling — explicit and consistent
Error handling is one of the hardest parts of clean code:- Scope try/catch tightly — broad catch blocks swallow errors.
- Catch specific exception types, not generic Exception.
- Log the error AND re-throw, or you silently fail.
- Use custom exception types — `OrderNotFoundException`, `InsufficientFundsException`.
- Result-type pattern (Rust-style) — alternative to exceptions in some languages.
Testability = clean code
If code is testable, it's probably clean. If writing tests is hard, there's probably a design problem. AIOR uses this practical signal: does adding a test for a new feature feel natural, or does it require a mock-festival? The latter is a design smell.Dependency injection, pure functions, immutable data — all of these support testability and tend toward clean code.
Code review — clean code's gatekeeper
Code review is the operational application of clean-code culture. Every PR on AIOR projects passes through a second engineer. What's checked in review:- Naming clear?
- Function too long?
- Test coverage sufficient?
- Edge cases considered?
- Error handling consistent?
- Any security implications?
- What's the performance impact?