“Palyaço yapmak” veya “geçici çözüm uygulamak”, bir hatayı düzelten veya işlevsellik ekleyen ancak temel nedeni ortadan kaldırmayan ve projenin mimari standartlarına uymayan geçici bir çözüm oluşturmak anlamına gelir. Palyaço çözümler her geliştirmede kaçınılmazdır: teslim tarihleri, sistemin eksik anlaşılması ve dış kısıtlamalar uzlaşmayı zorunlu kılar. Refactoring Guru'ya göre, pragmatik bir palyaço ile teknik borç arasındaki temel fark, kararın farkındalığı ve onu ortadan kaldırmak için bir planın varlığıdır. Geçici çözümlerin yetkin kullanımı disiplin ve dokümantasyon gerektirir.
Ana Noktalar
Palyaço (crutch), çalışan ancak “aceleyle” yapılmış bir yazılım çözümüdür: belirli bir sorunu çözer ancak nedenini ortadan kaldırmaz, projenin mimarisini takip etmez ve ortamdaki en ufak değişikliklerde bozulabilir. Benzetme yerindedir — gerçek bir koltuk değneği gibi, bu kod “yürümeye” yardımcı olur ancak “bacağı” iyileştirmez.
Geliştiriciler hataları, sürüm uyumsuzluklarını, platform özelliklerini ve acil müşteri gereksinimlerini “geçici çözümlerle destekler”. Tipik bir palyaço koşullu palyaçodur: iOS 15 ise boşluk ekle, Huawei ise butonu gizle. Bu kontroller çoğalır ve kodu platform ve sürüm dallarından oluşan bir “katman pastasına” dönüştürür.
Palyaçolar farklı ölçeklerde gelir: bir palyaço koşuluna sahip tek bir satırdan, bir kütüphanenin davranışını “düzelten” tüm bir sarmalayıcı modüle kadar. Bir palyaçonun her zaman kötü olmadığını anlamak önemlidir: doğru ellerde, ürünü zamanında yayınlamaya olanak tanıyan bir araçtır. Sorun, palyaço kodda sonsuza kadar kaldığında başlar.
Ana neden, ideal çözüm ile projenin gerçek kısıtlamaları arasındaki çatışmadır. Geliştirici doğru şekilde nasıl yapılacağını bilir, ancak zaman, para veya teknik sınırlamalar buna engel olur. Sonuç olarak, “sadece çalışan” bir uzlaşma çözümü ortaya çıkar.
Geliştiricilerin bilinçli olarak palyaçolara başvurmasının dört ana nedenini inceleyelim. Bu nedenleri anlamak, palyaçolara bir hata olarak değil, yönetilmesi gereken pragmatik bir araç olarak yaklaşmaya yardımcı olur.
En yaygın neden. Yayın yarın, hata yalnızca belirli bir modelde tekrarlanıyor ve mimari olarak düzeltilmesi iki hafta sürecek. Koşullu bir palyaço bir saat sürer ve sorunu kapatır. Yayından sonra ekip geri dönüp doğru şekilde yeniden yazmaya söz verir. “Geçici çözümden daha kalıcı bir şey yoktur” — bu tam olarak bu tür palyaçolar için geçerlidir.
A kütüphanesi Android 12 gerektirir, ancak uygulamanız Android 10'u destekler. Çözüm, işletim sistemi sürümünü kontrol eden ve yürütme yolunu seçen bir sarmalayıcı yazmaktır. Bu bir palyaçodur çünkü kütüphane güncellendiğinde sarmalayıcının yeniden yazılması gerekecektir. Ancak alternatif — kütüphaneden veya eski cihaz desteğinden vazgeçmek — daha kötü olabilir.
// API 29 uyumluluğu için palyaço
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
useModernApi()
} else {
useLegacyFallback()
}
Projenin bağımlı olduğu bir kütüphanede hata var, ancak güncellenmesi haftalar sürebilir (PR, kod incelemesi, yayınlama gerekli). Beklemek yerine, ekip bir sarmalayıcı yazar ve kütüphanenin davranışını anında düzeltir. Kütüphanenin düzeltilmiş sürümü yayınlandığında sarmalayıcı kaldırılır. Kaldırılmazsa, bu zaten mimari bir sorundur.
Eski bir projedeki yeni bir geliştirici, kodun neden bu şekilde çalıştığını anlamaz. Anlamak yerine, mevcut koşulların üzerine yeni bir koşul ekler. Bu en tehlikeli palyaço türüdür çünkü yazar bunun bir palyaço olduğunun farkında değildir. Tek çare, kod incelemesi ve yeni ekip üyeleri için eşli programlamadır.
Her palyaço kötü değildir. Gerçek geliştirmede, kodun mutlak saflığı ulaşılamaz ve genellikle pratik değildir. Pragmatik bir yaklaşım, geçici çözümlerin sürecin bir parçası olduğunu kabul eder, ancak farkındalık, dokümantasyon ve bir kaldırma planı gerektirir. Bir palyaço, temiz bir mimari çözümden daha hızlı bir iş sorununu çözdüğünde haklıdır.
Haklı bir palyaçonun kriterleri: belirli bir sorunu çözer, bir sahibi vardır (kaldırılmasından sorumlu biri) ve bir refactoring planı mevcuttur. Bu üç koşuldan en az biri eksikse, palyaço teknik borca dönüşür. Takipçide bir bilet ile TODO yorumları gibi araçlar minimum dokümantasyon yöntemidir.
Yarınki dağıtımdan önce düzeltilmesi gereken yayın dalında kritik bir hata. Temiz çözüm, mimari refactoring gerektirir ve iki hafta sürer. Palyaço: nil kontrolü ekleyin ve düzeltmeyi hotfix olarak gönderin. Haklı çıkma koşulları: takipçide bir refactoring bileti oluşturuldu, bir sahip atandı ve palyaço bir yorumla işaretlendi. İki hafta sonra ekip göreve geri döner.
// TODO: IT-1234 — AuthService refactoring'inden sonra bu palyaçoyu kaldır
guard let userId = session.user?.id else {
return Result.failure(.notAuthenticated)
}
Bilinçli bir palyaço ile mimari bir sorun (teknik borç) arasındaki sınır iki parametreden geçer: kararın farkındalığı ve onu ortadan kaldırmak için bir planın varlığı. Bir palyaço her zaman bilinen bir ömre sahip geçici bir çözümdür. Teknik borç, başıboş bırakılmış birçok palyaçonun sonucudur.
| Parametre | Bilinçli Palyaço | Teknik Borç |
|---|---|---|
| Farkındalık | Ekip bunun geçici bir çözüm olduğunu bilir | Kimse kodun neden böyle olduğunu hatırlamaz |
| Dokümantasyon | TODO, takipçide bilet var | Yorum, referans veya açıklama yok |
| Kaldırma Planı | Refactoring için bir sprint atandı | “Bir gün yeniden yazarız” |
| Etki | Yerel, yeni işlevselliği engellemez | Değişiklikleri engeller, geliştirmeyi yavaşlatır |
Palyaço sayısı kritik kütleyi aştığında durum kötüleşir. Her yeni palyaço sistemin “kırılganlığını” artırır: bir yerdeki değişiklik başka bir yeri bozar. Sonunda geliştirme yavaşlar, hatalar çoğalır ve yeni bir geliştirici, yazarın yardımı olmadan kodu anlayamaz. Bu noktada palyaçolar geçici çözüm olmaktan çıkar ve mimari bir sorun haline gelir.
Kod, işletim sistemi sürümü, cihaz üreticisi ve belirli bir kütüphanenin varlığı için beş iç içe kontrol içeriyorsa — bu bir palyaço değil, mimari bir sorundur. Bir düzeltme eklemek ilgili modüllerde üç gerilemeye neden oluyorsa — palyaçolar artık yerel değildir. Kod incelemeleri “bir palyaço daha” nedeniyle düzenli olarak reddediliyorsa — refactoring planlamanın zamanı gelmiştir.
Palyaçoları refactor etmek, geçici çözümleri mimari olarak doğru olanlarla değiştirme sürecidir. Bu zaman alır, bu nedenle bir önceliklendirme stratejisi gereklidir: tüm palyaçoların hemen ortadan kaldırılması gerekmez. İyi bir strateji, her palyaçoyu iki parametreye göre değerlendirmektir: kodun o alanındaki değişiklik sıklığı ve kullanıcılar üzerindeki etki.
Yüksek öncelik — geliştirmeyi yavaşlatan ve gerilemelere neden olan sık değiştirilen modüllerdeki (iş mantığı, genel amaçlı UI) palyaçolar. Orta öncelik — nadiren değiştirilen ancak kullanıcılar üzerinde potansiyel etkisi olan modüllerdeki (ödeme işleme, yetkilendirme) palyaçolar. Düşük öncelik — istikrarlı çalışan ve değiştirilmesi planlanmayan eski kodlardaki palyaçolar.
Adım 1: envanter — palyaçolarla ilgili tüm TODO ve FIXME'leri bulun. Adım 2: değerlendirme — hangilerinin hala geçerli olduğunu belirleyin. Adım 3: planlama — yüksek öncelikli olanlardan başlayarak bir sprintte palyaço refactoring'ini planlayın. Adım 4: değiştirme — temiz çözümü uygulayın, palyaçoyu ve TODO yorumunu kaldırın. Adım 5: doğrulama — testlerin geçtiğinden ve gerileme olmadığından emin olun.
# Projedeki tüm TODO palyaçolarını bul
grep -r "TODO\|FIXME\|HACK\|XXX" --include="*.kt" --include="*.swift" .
Palyaçolarla savaşmanın en iyi yolu onları gereksiz yere oluşturmamaktır. Bir palyaço yazmadan önce kendinize üç soru sorun: Makul bir sürede temiz bir çözüm uygulayabilir miyim? Palyaço olmayan bir alternatif var mı? Ekibin geri dönüp bunu yeniden yazmak için zamanı olacak mı? En az bir sorunun yanıtı “hayır” ise — kodu “desteklemeden” önce tekrar düşünün.
Sıkça Sorulan Sorular
Palyaço yapmak, sorunu çözen ancak nedenini ortadan kaldırmayan geçici bir çözüm yazmak anlamına gelir. Kod çalışır ancak proje mimarisine uygun değildir ve değişikliklerde bozulabilir.
Bir palyaço, kaldırma planı olan bilinçli bir geçici çözümdür. Teknik borç, birçok unutulmuş palyaçonun sonucudur. Palyaço yereldir, borç sistemseldir ve geliştirmeyi engeller.
Teslim tarihi kritik olduğunda, temiz çözüm zaman aldığında ve palyaço bir TODO yorumu ve takipçide bir bilet ile belgelendiğinde. Koşul: palyaçonun öngörülebilir gelecekte bir kaldırma planı olması.
Bilet numarası ve doğru çözümün kısa bir açıklamasıyla bir TODO veya FIXME ekleyin. Örnek: // TODO: IT-567 — rewrite using Factory pattern. Bilet olmadan palyaço unutulur.
Tüm TODO'ların bir envanterini çıkarın, önceliklendirin, sık değiştirilen modüllerden başlayın. Palyaçoyu temiz bir çözümle değiştirin, yorumu kaldırın ve testlerle doğrulayın.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun