TODO aslında 'yapılacak şey' değildir
(sophiebits.com)- Bazı ekipler tüm TODO yorumlarını bug tracker’a kaydetme ya da 1 yıldan eski TODO’ları otomatik silme politikaları kullanıyor, ancak bu tür uygulamalar önerilmiyor
- TODO yorumları, mutlaka tamamlanması gerektiğinde değerli olan şeyler değil; kod yazıldığı andaki bağlamı ve fikirleri bırakan bir beyin anlık görüntüsü işlevi görür
- Önemli TODO’lar issue olarak yönetilmelidir, ancak çoğu, düşük öncelikli veya edge case’leri kaydeden notlardır
- İyi yerleştirilmiş bir TODO, gelecekte kodu okuyan kişinin "Bu kısmı refactor etsem olur mu?" diye düşündüğünde o dönemki yazarın niyetini anlaması için bir ipucu sağlar
- TODO’nun değeri, tamamlanıp tamamlanmamasında değil; bağlamı, niyeti ve olasılıkları kaydederek gelecekteki bakım ve iş birliğine yardımcı olmasındadır
TODO yorumları, gerçekten mutlaka ele alınmalı mı?
- Bazı organizasyonlar kod içindeki tüm TODO’ları bug tracker’a kaydetme ya da belli bir süre geçince (1 yıldan fazla) otomatik silme kuralı uygular
- Ancak bu yaklaşım pratikte verimsizdir ve TODO’nun özünü kaçırır; değeri ancak gerçekten işleme alınmasıyla ortaya çıkan bir şey değildir
TODO’nun gerçek değeri
-
Örneğin,
// TODO: 다음 주 출시 전에 이 파일의 뒷부분을 완성해야 함gibi bir yorumun gerçekten takip edilmesi gerekebilir
-
Ama iyi TODO’lar çoğunlukla
// TODO: 사용자가 이 버튼을 트리플 클릭할 경우, 핸들러에서 \[xyz] 오류 발생örneğinde olduğu gibi edge case’leri kaydetmek ya da şu anda yapılamayan yapısal iyileştirme fikirlerini, gözden kaçan durumları bağlamıyla birlikte kaydetmek için kullanılır
TODO bir 'plan' değil, bir 'kanal'dır
- TODO’ların çoğu aslında hemen ele alınması gerekmeyen düşük öncelikli şeylerdir
- Yazıldığı andaki yazarın düşüncelerini, değerlendirmelerini ve bağlamını gelecekte kodu okuyacak kişiye aktarma işlevi görür
- İleride kodu okuyan biri "Buradaki yapıyı değiştirsem olur mu?" diye düşündüğünde, TODO o zamanki yazarın niyetini anlamaya yardımcı olur
İyi yazılmış bir TODO’nun etkisi
- Koddaki TODO’lar bazen olası sorunlar, yapısal iyileştirme fırsatları, ele alınmamış edge case’ler gibi önemli ipuçları sağlar
- Mutlaka çözüm için yapılmış bir plan olmasa bile, iş birliği ve bakım süreçlerinde ince bağlam aktarımında büyük rol oynar
- Sonuçta TODO yorumları, kodun anlaşılabilirliğini ve gelecekteki bakım yapılabilirliğini artıran değerli kayıtlar olarak işlev görür
Sonuç
- TODO, ancak tamamlandığında değer kazanan bir şey değil; yazarın düşüncelerini, niyetini ve bağlamını bırakıp gelecekte kodu okuyacak kişiyle iletişim kuran bir kanaldır
1 yorum
Hacker News görüşü
Merge öncesinde TODO'yu ele almanın üç yolu olduğunu düşünüyorum.
1. Bir issue bırakmak — gerçekten yapılması gereken bir işse 20 saniye ayırıp kaydetmek ve takip etmek iyi olur
2. Hemen halletmek — issue açmaya değmeyecek kadar küçük bir işse commit'ten önce çözmek
3. Yoruma çevirmek — düzeltmeye değmiyor ve takip etmeye gerek yok ama hatırlamak istiyorsanız normal bir kod yorumu olarak bırakmanızı öneririm
Sağlığınız için brokoli yemek gibi, TODO'ları da takip etme alışkanlığı iyidir.
Harici sisteme kaydedilen issue'lar, o kod parçasına dokunan geliştiriciler için yeterince görünür olmayabiliyor.
Kolayca düzeltilebilecek şeyleri sırf takip etmenin maliyeti gereksizse, onları TODO olarak bırakmak daha verimli.
Kod içindeki TODO'lar, ilgili kod üzerinde çalışırken hemen göze çarpıyor ve refactor sırasında da kolayca silinebiliyor.
Ama TODO yorumu ile normal yorum arasındaki farkı net biçimde açıklamaması biraz eksik kalmış.
TODO teriminin kendisi görsel olarak güçlü; bunun ne tür bir yorum olduğunu hemen anlatıyor.
TODO yorumunu illa "TO DO (yapılacak iş)" diye okumamak gerektiğini söylemek biraz şüpheli geliyor.
Yazıdaki genel görüşe katılıyorum ama bunun yerine doğrudan normal yorum bırakmak daha iyi bir iyileştirme olur diye düşünüyorum.
Bunu ticket sistemine koyarsanız 20 saniyeden uzun sürer ve faydadan çok dikkat dağınıklığı yaratır.
// TODO: improve the routing https://jira.com/whatever/TIX-1234
Sebebi şu: yorum yetim kalırsa kimse neden bırakıldığını anlamaz.
Sadece yorum bırakırsanız daha sonra birileri amacını ve bağlamını unutur.
Bu yüzden ya mutlaka bir ticket oluşturulmalı ya da iş hemen yapılmalı diye düşünüyorum.
FIXME: açıkça yanlış ya da bozuk olan şeyler, en yüksek öncelik
XXX: çirkin görünen veya yanlış varsayımlar içeren şeyler, yüksek öncelik
TODO: bir gün tamamen yeni bir yaklaşım/kategori/dal uygulanması gereken yerler
NOTE: sıradan yorumdan daha önemli bilgi aktarmak için
Ben daha çok legacy / bakımı yapılmayan kod motorlarında çalışıyorum; burada "kod gerçeğin kendisidir", bu yüzden JIRA açmak yerine okurken anında düzeltme yapıyorum.
TODO: release'ten önce kesinlikle gerekli işler, zorunlu maddeler. Buna uymuyorsa başka bir kategoriye taşınmalı. Release'i bloklayan şeylerdir.
FUTURE: bir gün TODO olabilir, genelde yapısal tasarım gibi isteğe bağlı şeylerdir
MAYDO: olsa iyi olur, olmasa da olur
PERF: daha fazla performans gerektiğinde yapılması iyi olur
Bir de alanla ilgili anlam etiketleri kullanıyorum.
Benim görüşüm, TODO'nun bir code smell olmadığı; kod tabanının temel kısımlarında doğal olarak biriken bir şey olduğu yönünde.
Ciddiye almak istersem CI'ı, bu string'i içeren kodu reject edecek şekilde ayarlıyorum.
O açıdan XXX benim için en yüksek öncelik.
Önceliği yukarıdan aşağı sıralarsak:
FIXME: odağı korumak için. Çözülmeden merge edilemeyen ya da tamamlanmış sayılmayan kod.
XXX: yakında düzeltilmeli. Şu an çalışıyor ama kısa süre içinde düzeltilmeli.
TODO: sonra tekrar dönülmeli. Kod tamamen kullanılabilir durumda. XXX'ten daha düşük öncelikte.
NOTE: sıra dışı noktaları veya bilinmesi gereken şeyleri açıklayarak sonradan gelen kişiye yardımcı olur.
TODO, refactor / performans / açıklık iyileştirmesi gibi olası işleri bırakmak için kullanılıyor.
NOTE'yi ise geçmiş bilgileri ya da ilk bakışta anlaşılması zor düşünce akışını bırakmak için kullanıyorum.
Hele ekip içinde çalışıyorsanız daha da öyle.
Bu, keyfi biçimde "anlamsız" demek değil — böyle araçların var olması ya da yapılması gerektiğini düşünüyorum.
Bu tür teknik borçları ya da code smell'leri aslında daha iyi izlemek / kaydetmek / açıklamak gerekir ama JIRA gibi üretkenliği düşüren işler önerildiğinde insanlar hiçbir şeyi kaydetmemeye başlıyor.
En azından kodun içinde bir TODO varsa, bir yerde iz bırakmış oluyor.
TODO gerçekten de bir "yapılacak iş" olduğu için anlamlı.
"Bunu daha iyi yapabileceğimi biliyorum ama bunun için akışımı bilerek durdurmuyorum. Özellik bozulmuyor; sadece olsa biraz daha iyi olurdu."
Editörde TODO vurgusu ara sıra yeniden gözüme çarptığında, kısa bir boşlukta bunu çözmek istememe yardımcı oluyor.
Yine de TODO'ların çoğu ömür boyu kalıyor ya da pratikte neredeyse hiç çözülmüyor.
Bunu JIRA, GH Issues vb. yerlere de yazsanız, nihayetinde kaydın birbirine bağlanması gerekir.
Sadece referans bırakılırsa zamanla anlamını yitirebilir; o yüzden yorumun içinde açıklama da olmalı.
Birçok commit aslında içeriği yeterince iyi aktarmıyor.
Eski usul TODO bırakmak yerine daha iyi araçların kullanımını teşvik etmek isterdim.
Birçok geliştirici çok seyrek commit atıyor ve birden fazla işi tek commit'te topluyor.
Commit mesajları da sık sık "updating somefile.py" gibi anlamsız şeyler oluyor.
Benim kod tabanımda TODO burada açıklandığı gibi kullanılıyor.
TODO, uygulamanın nasıl çalıştığını açıklamak için, özellikle eksik parçaları belgelendirmek amacıyla kullanılıyor — mutlaka yapılması gereken bir iş anlamına gelmiyor.
Bana göre asıl yapılacaklar listesini doğrudan kodun içinde tutmanın pek anlamı yok. Öncelikler sürekli değişir; yazıldığında önemli olan bir şey sonradan olmayabilir ve hiç düşünülmeyen başka bir konu daha sonra çözülmesi gereken işe dönüşebilir.
Sırf TODO yorumlarını güncellemek için sürekli PR açamazsınız.
Yapılacak işleri yazmak istiyorsanız, issue tracker ya da kolayca güncellenebilen bir metin belgesi gibi harici bir yerde yönetmek daha iyi.
Az önce ben de son derece nadir ortaya çıkan istisnai bir durumu kaydetmek için #TODO kullandım. 2 yıldır hiç yaşanmadı ama ileride bu kısmı neden ele almadığımı merak edersem yardımcı olacak.
Bunun bazen sadece yorum olarak bırakılması gerektiğini söyleyenleri de anlıyorum. Bu, kod tabanının doğasına bağlı ve benim gibi 2 kişilik bir ekipte TODO yaklaşımı gayet iyi çalışıyor.
// TBD: [...]ifadesini bunun için kullanıyordu. TODO konusunda takıntılı olanlar fark etmesin diye kullanılan küçük bir hileydi.Aslında düzeltme planı yoktur ama bir gün zaman olursa belki toparlanabilir mi diye ctrl-F ile aranabilecek bir iz bırakmak istersiniz.
Çok fazla araç ve sürecin TODO'yu bir code smell olarak görmesini mantıksız buluyorum.
Bence bu sadece önceliklendirme meselesi; sonuçta kırık pencereye dönüşüyor (Pragmatic Programmer'daki meşhur benzetme).
Gerçekten düzeltmemeye karar verdiyseniz, bunu yazılım dokümantasyonunda belirtmek daha iyi olur.
Örneğin sadece
// If the user triple-clicks this button, the click handler errors because [xyz]
diye yazarsanız bunun bir bug mı yoksa kasten mi böyle olduğu net olmaz.
TODO, "burada kusursuz olmayan bir kısım var, üzerinde çalışırken bunu dikkate al" diyen kısa bir işaret.
Eğer gerçekten çözülmesi gereken bir işse, başka bir yerde takip edilmesi doğru olur.
Ama TODO'ları azaltmaya çalışmak, bence sadece belgelenmemiş kod miktarını artırır.
O sürede doğrudan bug'ı düzeltmek ya da en azından "üçlü tıklama [xyz] yüzünden yok sayılır" gibi bir yorum bırakmak daha iyi olurdu.
Tetikleyiciyi ve sebebi bulduysanız, işin zaten %80'ini bitirmişsiniz demektir.
Sorun, kod tam çalışmıyorken çalışıyormuş gibi varsayılmasıdır.
Gördüğüm en iyi TODO, güvenlik kodunda geçen "TODO: encrypt this" idi.
Bu sayede kodun şifrelenmediği hemen anlaşılıyordu; ayrıca şifrelemenin başka bir modülde yapılıp yapılmadığı ya da iki kez şifrelenme riski konusunda tereddüt azalıyor.
Açıkça bir hata ama ele alma gerekliliği nispeten düşük.
Eğer bunu bug olarak kaydetmeyecek ya da gerçekten üzerinde çalışmayacaksanız TODO bırakmayın.
// TODO: If the user triple-clicks this button, the click handler errors because [xyz]
Bu sadece bir durum kaydı. TODO kelimesi çıkarılmalı.
FIXME, mutlaka düzeltilmesi gereken ya da sıradaki adımı net olan durumlarda kullanılıyor.
TODO ise daha genel düşünceler için ya da sadece zihnimden çıkarıp bir sonraki işe odaklanmak amacıyla.
Henüz tam olgunlaşmamış bir fikir olabilir, gerçekten yapılmalı mı emin olmayabilirim ya da ilgili başka bir şeyi bekliyor olabilirim.
Yazmazsam aklımda dönüp duruyor; ama TODO ya da başka bir şey olarak not alınca psikolojik olarak çok rahatlatıyor.
Keşke kodu yoruma ihtiyaç duymadan hemen anlaşılacak şekilde yazabilsek.
Yine de sonradan ben okuyunca bile anlamayacağım kadar kafa karıştırıcıysa mecburen yorum yazıyorum.
Üzücü olan şu ki, biri sonradan kodu değiştirip yorumu güncellemezse, bu kez daha da fazla kafa karışıklığı yaratıyor.
Bence TODO commit edilmiş kodda bulunmamalı; proje ya da issue yönetim sisteminde takip edilmeli.