37 Zamanlayıcı, Tek %T: Yeni Bir Adım Ekleyince 40 Dakikayı Harcadım
Bir panoda 37 zamanlayıcı vardı, hepsi sırayla %T1'den %T37'ye. Bir müşteri 'araya bir rötuş adımı koy' dedi, ben de find-replace ile %T1'i %T2 yaptım — %T10'dan %T19'a kadar da değişti. Neden zamanlayıcıyı numara değil isimle adresselediğim, kendi vaka üzerinden anlatıyorum.

Müşteri telefonu açtığında sesi sakin ama telaşlıydı: “abi, makineye aradan bir rötuş adımı ekliyoruz, ama senin o zamanlayıcılar var ya… hangisi hangisi?” Ben de o an içimden “T17, T18, T19…” diye saymaya başladım. Sayamadım. Çünkü bilmiyordum. O an T17’nin ne yaptığını hatırlamıyordum, ve bu, kendi programıma bakarken hissettiğim en utanç verici şeydi.
37 Zamanlayıcı, Hepsi “T01, T02…”
Makineyi iki yıl önce yazmıştım. O günler aceleydi, “biri bizi izliyor” acelesi. Zamanlayıcıları sırayla numaraladım: %T1, %T2, %T3… sona kadar, %T37. Sıfır isim. Sıfır yorum. Çünkü isim vermek “sonra”ya kalıyordu, ve “sonra” gelmedi. Program, %T adreslerinin bir yığını gibi duruyordu, her network’te “bu T12 ne bekliyor acaba” diye duruyordum.
Müşterinin istediği küçük bir şeydi: dolum bittikten sonra, şişeyi almakta önce kısa bir “rötuş bekle” adımı. Ben de o adım için yeni bir zamanlayıcı açtım. Ama elimde serbest bir numara yoktu; seriler doluydu. İki seçeneğim vardı ya aradaki bir zamanlayıcıyı kaydırıp 37 satırı yeniden numaralandıracaktım, ya da T38’i sona ekleyip işe bakacaktım. T38 koydum. Çalıştı. Ama T38, kullanıldığı mantıkta 30 satır uzaktaydı. İki yıl sonra o satırı açan kimse “neden T38 burada, neden T37 ile bitmiyor” diye soracaktı. Soracak.
Find-Replace’in %T1 ile %T10’u Karıştırması
Asıl dert, o akşam patladı. “Ya T38’i kaydırmayayım da, T17’den sonrasını bir geri çekip aralara sığdırayım” dedim. Bul-değiştir (find-replace) ile başladım. %T1 (arkasında boşluk) → %T2 dedim.
Bul-değiştir, kelime sınırlarını bilmez. %T1 aradı, ama %T10 de %T1 ile başlar arka tarafında boşluk vardır. O yüzden %T10, %T11, %T12, %T13, %T14, %T15, %T16, %T17, %T18, %T19 — hepsi %T2 oldu. Bir hamlede on adresi değiştirdim. Makine o gece garip garip dönmeye başladı: bir zamanlayıcı iki yerde aynı anda tetikleniyor, bir kapama beş saniye geç oluyor. “Hayalet” bir timing hatası. İki saat uğraştım, sonunda o geceki bul-değiştirme adımına geri sarıp tek tek %T10’u geri koydum.
İki saatin, bir %T1 →%T2 satırına mal olması, masada 40 dakikada yakalanacak bir “numara kullanma” kararının sahada iki saat almasıdır.
Numara Değil, İsim
Artık kuralım şu: bir zamanlayıcıyı, bir sayaçtı — ne olursa olsun — numara ile adresleme yok. İsimle yaz: Motor_Hazir_Bekle, Vana_Kapama_Zaman, Rotu_Bekle, Basin_Tut. İsimler çakışmaz. Motor_Hazir_Bekle’i bul-değiştirirsen, Motor_Hazir_Bekle2’yi de değiştirirsin ama en azından ikisi de “motor hazır bekle” ailesindendir, ikisinin de ne olduğunu bilirsin. %T1’i değiştirirsen %T10’u kırarsın ve ikisinin ne olduğunu bilmezsin.
Bir de ek kural var, onu da ekleyeyim. İsimi, o zamanlayıcının neyi beklediğiyle değil, neden beklediğiyle ver. T_Bekle_3sn kötü isimdir, çünkü “kaç saniye” değişir, isim değişmez. Kapak_Basin_Sonra_Bekle iyi isimdir, çünkü “neden beklendiğini” söyler, saniye değiştirse de isim hâlâ doğrudur.
İki yıl sonra o panoyu açan kimse — belki benim, belki biri — T17’ye bakıp “bu ne” demesin diye. Numara, iki yıl sonra herkesi unutturur. İsim, iki yıl sonra bile neye yaradığını fısıldar.
Bu seride bir sonraki yazıda, “sensör koptu mu, yoksa değer gerçekten sıfır mı” diye anlatıyorum. Bir seviye göstergesi 0 gösterdiğinde, boş tank ile kablo kopukluğunu nasıl ayırt ettiğim.