Şimdiye kadar gördüğünüz en büyük Bad Code neydi?
(news.ycombinator.com)"25 milyon satırlık Oracle Database 12.2 kodu."
HN'de sorulan bir soruya eski bir Oracle çalışanının verdiği yanıt
"Hayal bile edilemeyecek bir dehşet. Mevcut 1000 testi geçmeden tek satır kod yazmak bile mümkün değil.
Elle not alıp çözmeden anlaşılamayan gizemli makrolar var; bu makroların gerçekte ne yaptığını anlamak bir ila iki gün sürüyor.
Bazen kodun farklı durumlarda nasıl çalışacağını öngörebilmek için 20 farklı flag'in değerlerini ve etkilerini anlamanız gerekiyor.
Bazen bu sayı 100'ü bile geçiyor. Abartı değil.
Bu ürünün hâlâ hayatta kalıp çalışmasının tek nedeni, kelimenin tam anlamıyla milyonlarca test olması."
Oracle DB geliştiricisinin hayatı
-
Yeni bir bug üzerinde çalışmaya başla
-
Bu bug'a neden olan ve gizemli biçimlerde birbiriyle etkileşen 20 farklı flag'i anlamak için 2 hafta harca
-
Yeni özel senaryoyu ele almak için bir flag daha ekle. Bu flag'i kontrol etmek için birkaç satır kod yaz, ardından problemli durumu çözmek ve bug'ı önlemek için birkaç satır daha ekle
-
Kod değişikliğini 100~200 makineden oluşan test farm'ına gönder. Ardından yeni Oracle DB build'i alınır ve milyonlarca test dağıtık biçimde çalıştırılır
-
Eve git. Ertesi gün gel ve başka bir işe başla. Testlerin tamamlanması 20~30 saat sürer
-
Eve git. Ertesi gün gel ve test sonuçlarına bak. İyi bir günde yaklaşık 100 test fail olur. Kötü bir günde yaklaşık 1000 test fail olur. Bu testlerden birkaçını seçip varsayımlarında neyin yanlış olduğunu anlamaya çalış. Muhtemelen bug'ın özünü kavramak için dikkate alman gereken 10 kadar flag daha vardır
-
Bu sorunu çözmek için birkaç flag daha ekle. Değişikliği tekrar test farm'ına gönder. Yine 20~30 saat bekle
-
2 hafta boyunca bu flag kombinasyonlarının düzgün çalışması için düzeltmeler yap ve aynı döngüyü tekrarla
-
Nihayet 'güzel bir gün'de hiçbir test fail etmez
-
Yaptığın değişiklik için yüzlerce ek test yaz ki şansı yaver gitmeyen bir sonraki geliştirici bu düzeltmeyi bozamazsın
-
Son testler için tekrar gönder. Sonra review için gönder. Review yine 2 haftadan 2 aya kadar sürebileceği için başka bir bug'a geçip çalışmaya başla
-
2 hafta ile 2 ay sonra, her şey bittiğinde kod main branch'e merge edilir
Oracle programcısının bug düzeltme hayatı böyle. Abartı değil.
Yeni bir özellik geliştirmenin nasıl bir dehşet olduğunu artık siz düşünün.
Küçük bir özelliğin geliştirilmesi 6 ay ile 1 yıl, bazen 2 yıl bile sürebilir. (Örneğin Active Directory kimlik doğrulaması gibi yeni bir kimlik doğrulama yöntemi eklemek.)
Bu ürünün çalışıyor olması bir mucize.
Artık Oracle'da çalışmıyorum ve bir daha da Oracle'da çalışmayacağım.
8 yorum
Şimdiye kadar gördüğünüz en büyük Bad Code neydi?
Test döngüsü şöyle:
Kod yaz
Test yaz
Kodu refactor et, sonra 1'e dön
Ama 1 ve 2 çok zaman aldığı için, sonuçta 3. adımın sürekli atlanması ortaya çıkıyor.
Bu vesileyle Martin Fowler’ın konuşmasına yeniden bakalım. Görünüşe göre Oracle Database’in “iç kalite”si (Internal Quality) pek iyi değil.
https://tr.news.hada.io/topic?id=2752
Oracle açısından bakınca bir şekilde doğal görünüyor; hatta bu yazılıma bakıp “gerçekten enterprise içinmiş...” diye düşünecek kadar güven veriyor.
Ama o yazıdaki gibi bir yerde çalışmak istemezdim.
Bence tam tersine, test odaklı geliştirme kültürü yüzünden geliştirme süreci bozulmuş olabilir diye düşünüyorum.
Nasıl olursa olsun yeter ki testlerden geçsin anlayışıyla geliştirme yapılıyor... Muhtemelen böyle bir ortamda refactoring yapmayı hayal bile edemezsiniz.
Sorun testten çok, bir özelliği düzeltmek/eklemek için 20~100 bayrağı hesaba katmayı gerektiren tasarımsal problem daha büyük değil mi?
DBMS'nin karmaşıklığı yüzünden bunun kaçınılmaz olduğunu düşünsem de.
Test de sonuçta geliştiricinin yazdığı koddur. Aklıma gelmişken testlerle ilgili bir yazı paylaşmıştım.
https://tr.news.hada.io/topic?id=2883
Proje o kadar kötü durumda değilse, testler arayüzü baştan aşağı değiştirseniz bile eskisiyle aynı kaldığını sürekli garanti edebildiği için, aksine refactoring konusunda insana cesaret verebilir diye düşünüyorum. Ben de bu aralar yaptığım emülatörde parametreleri
BYTEdeğerlerindenEnumdeğerlerine dönüştürme işi yaptım. Derleme başarılı oldu ama testler başarısızdı; testler olmasaydı ne yapardım diye düşününce bir kez ciddi ciddi irkildiğim olmuştu.Kod tabanı o kadar büyükse, refactoring yapmayı düşünseniz bile fazla devasa olduğu için vazgeçiliyor, üstüne bir de kod eklenmeye devam ediyor... Muhtemelen böyle bir sonsuz döngüye düşmüş olabilirler diye temkinli bir tahminde bulunuyorum.
O kişinin zorlanmış olmasını ben de anlayabiliyorum,
ama paradoksal biçimde, "testlerin ne kadar önemli olduğunu" düşündüren bir yazı olduğu için çevirdim.
Bu yanıtın asıl soru gönderisine toplam 578 yanıt gelmişti.
Ask HN: Şimdiye kadar çalışırken gördüğünüz en büyük kötü kod miktarı neydi?
https://news.ycombinator.com/item?id=18442637
Sadece 1. seviye yanıtlar bile eğlenceli. İnsanların yaşadığı şeylerin her yerde aynı olduğunu düşündürüyor..