Yeni bir özellik geliştirmeniz isteniyor. Kullanıcılar dosya yükleyecek, sistem verileri kontrol edecek, hataları gösterecek ve uygun kayıtları veritabanına aktaracak. İstek birkaç cümleden oluşuyor; fakat işe başlayınca sorular çoğalıyor.
Hangi dosya biçimleri desteklenecek? Eksik alanlar nasıl ele alınacak? Aynı kayıt tekrar yüklenirse ne olacak? İşlem yarıda kesilirse kullanıcı ne görecek?
Yazılımcılar için problem çözme, büyük bir işi anlaşılır, uygulanabilir ve doğrulanabilir adımlara dönüştürmekle başlar. Kod yazmak bu sürecin bir bölümüdür. Öncesinde neyi çözdüğünüzü netleştirmeniz ve parçaların nasıl birlikte çalışacağını belirlemeniz gerekir.
Bu yazıda, büyük problemleri küçük parçalara bölmek için kullanabileceğiniz yaklaşımı bir dosya aktarım örneği üzerinden inceleyeceğiz.
Büyük problemler neden zor görünür?
Bir problem çoğu zaman aynı anda çok fazla karar vermeyi gerektirdiği için zorlaşır.
Dosya aktarımı örneğinde arayüzü, veri doğrulamayı, kayıt işlemini ve hata mesajlarını birlikte düşünmeye çalıştığınızda dikkatiniz sürekli yer değiştirir. Henüz verinin yapısını belirlememişken ilerleme çubuğunun nasıl çalışacağını tartışabilirsiniz.
Üstelik belirsiz gereksinimler, teknik kararlarla birbirine karışır. “Hatalı satırları ne yapacağız?” bir ürün davranışı sorusudur. “Satırları hangi fonksiyonda kontrol edeceğiz?” ise uygulama tasarımıyla ilgilidir.
Problemi parçalara ayırmak, bu soruları doğru sırada ele almanızı sağlar.
1. Çözmek istediğiniz problemi açıkça tanımlayın
İlk adım, görevi kendi cümlelerinizle yazmaktır.
“Dosya yükleme özelliği geliştirilecek” ifadesi başlangıç için fazla geniştir. Daha açık bir tanım şöyle olabilir:
Kullanıcı, belirlenen şablona uygun bir CSV dosyası yükleyebilmeli; sistem satırları kontrol ederek geçerli kayıtları eklemeli ve hatalı satırları gerekçeleriyle göstermelidir.
Bu tanım bile bazı kararları açık bırakır. Kodlamadan önce şu soruları yanıtlayın:
- Dosyada hangi alanlar zorunlu?
- Tekrarlanan kayıtlar nasıl ele alınacak?
- Bir satır hatalıysa diğer satırlar işlenecek mi?
- Dosya boyutu veya satır sayısı için sınır var mı?
- İşlemi hangi kullanıcılar yapabilecek?
Her sorunun yanıtını baştan bilmeniz gerekmeyebilir. Ancak bilinmeyenleri görünür hâle getirmek, varsayımların fark edilmeden uygulamaya yerleşmesini önler.
2. “Tamamlandı” durumunu tarif edin
Bir işi küçük görevlere bölmeden önce başarılı sonucun ne olduğunu belirleyin.
Dosya aktarımı için kabul ölçütleri şöyle olabilir:
- Geçerli bir dosyadaki uygun kayıtlar eklenir.
- Zorunlu alanı eksik satırlar, satır numarasıyla gösterilir.
- Aynı dosyanın yeniden gönderilmesi mükerrer kayıt oluşturmaz.
- Kullanıcı, eklenen ve reddedilen kayıt sayılarını görür.
- Yetkisi olmayan kullanıcı aktarım yapamaz.
Bu ölçütler, geliştirme sırasında yönünüzü korumanıza yardımcı olur. Bir parçanın çalışıyor olmasıyla bütün özelliğin tamamlanmış olması arasındaki farkı da netleştirir.
3. Problemi anlamlı sorumluluklara ayırın
Büyük problemleri küçük parçalara bölmek, yalnızca uzun bir görev listesi hazırlamak değildir. Her parçanın anlaşılır bir sorumluluğu olmalıdır.
Örneğimizde şu ayrımı yapabiliriz:
| Parça | Sorumluluğu | Beklenen çıktı |
|---|---|---|
| Dosya kabulü | Yetki, boyut ve dosya uygunluğunu kontrol etmek | İşlenebilir dosya veya hata |
| Ayrıştırma | Dosya içeriğini satırlara ve alanlara dönüştürmek | Yapılandırılmış satırlar |
| Doğrulama | Zorunlu alanları ve iş kurallarını kontrol etmek | Geçerli satırlar ve hata listesi |
| Kayıt | Uygun verileri tekrarları gözeterek saklamak | Kayıt sonuçları |
| Sonuç bildirimi | İşlem sonucunu kullanıcıya açıklamak | Özet ve satır bazlı hatalar |
Bu ayrım sayesinde bir doğrulama kuralını değiştirdiğinizde dosya yükleme arayüzünü de yeniden düşünmeniz gerekmez.
Başlangıçta her parçayı ayrı bir servis veya uygulama hâline getirmeniz de gerekmez. Aynı proje içindeki anlaşılır fonksiyonlar ve modüller yeterli olabilir.
4. Her parçanın girdisini ve çıktısını belirleyin
Sorumlulukları ayırdıktan sonra parçaların birbirinden ne beklediğini yazın.
Örneğin doğrulama adımı için:
Girdi: Ayrıştırılmış satırlar ve her satırın dosyadaki numarası.
Çıktı: Geçerli kayıtlar ve satır numarası içeren doğrulama hataları.
Sınır: Bu adım veritabanına kayıt yapmaz.
Bu kadar kısa bir açıklama bile tasarımı netleştirir. Doğrulama davranışını, dosya yüklemeye veya veritabanı bağlantısına ihtiyaç duymadan kontrol edebilirsiniz.
Şu soruyu da sorun: Bu parçanın doğru çalıştığını tek başına nasıl anlayacağım?
Yanıt vermek zor geliyorsa parçanın sorumluluğu hâlâ fazla geniş veya belirsiz olabilir.
5. Bağımlılıkları ve belirsizlikleri belirleyin
Görevlerin küçük olması, herhangi bir sırayla yapılabilecekleri anlamına gelmez.
Dosya biçimi belirlenmeden ayrıştırıcıyı tamamlamak zordur. Tekrarlanan kaydın tanımı yapılmadan kayıt davranışı netleştirilemez.
Basit bir bağımlılık sırası şöyle olabilir:
Dosya şablonu → Ayrıştırma → Doğrulama → Kayıt → Sonuç bildirimi
Bunun yanında en belirsiz konuyu erken inceleyin. Örneğin dışarıdan gelen dosyaların biçimi tutarsızsa, önce birkaç gerçek örnekle küçük bir deneme yapmak yararlı olabilir. Böylece temel varsayımınızı sınamadan arayüz ve kayıt akışına büyük yatırım yapmamış olursunuz.
Başlangıç noktasını seçerken görevin kolaylığını, bağımlılıklarını ve taşıdığı belirsizliği birlikte değerlendirin.
6. Baştan sona çalışan en küçük akışı kurun
Parçaları ayrı ayrı geliştirmek faydalıdır; ancak aralarındaki uyumu da erken görmeniz gerekir.
İlk hedefiniz şu kadar küçük olabilir:
Tek bir geçerli satır içeren dosyayı kabul et, satırı kontrol et, kaydet ve sonucu göster.
Bu akış çalıştığında temel bağlantıları doğrulamış olursunuz. Ardından kapsamı genişletebilirsiniz:
- Birden fazla geçerli satırı destekleyin.
- Hatalı satırları raporlayın.
- Tekrarlanan kayıt davranışını ekleyin.
- Belirlenen dosya sınırlarını uygulayın.
- Yarıda kesilen işlem senaryolarını ele alın.
Bu sıra örnektir; projenizdeki risklere göre değişebilir. Önemli olan, her adımın gözlemlenebilir bir sonuç üretmesidir.
7. Parçaları ve bütün akışı doğrulayın
Tek tek çalışan parçalar, birlikte beklediğiniz gibi davranmayabilir.
Örneğin doğrulama adımı bir alanı isteğe bağlı kabul ederken veritabanı aynı alanı zorunlu tutabilir. Ya da kayıt tamamlandığı hâlde kullanıcıya yanıt ulaşmayabilir ve kullanıcı işlemi yeniden başlatabilir.
Bu nedenle doğrulamayı iki düzeyde yapın:
- Parça düzeyinde: Eksik alan, geçersiz değer ve tekrarlanan kayıt gibi kuralları kontrol edin.
- Akış düzeyinde: Dosyanın alınmasından sonucun gösterilmesine kadar bütün süreci deneyin.
Kontrollerinizi olası sonuçlara odaklayın. “Fonksiyon çağrıldı mı?” sorusunun yanında “Kullanıcının beklediği kayıt doğru biçimde oluştu mu?” sorusunu da yanıtlayın.
Problemi parçalara bölerken yapılan yaygın hatalar
Belirsiz görev adları kullanmak
“Backend’i bitir” veya “hataları çöz” gibi görevler ne yapılacağını açıkça anlatmaz.
Bunun yerine “Eksik e-posta alanını satır numarasıyla raporla” gibi sonucu görülebilen ifadeler kullanın.
Gereğinden fazla parçalamak
Her küçük işlemi ayrı bir soyutlamaya dönüştürmek, parçalar arasındaki iletişimi takip etmeyi zorlaştırabilir.
Bir görevin tek bir amacı varsa, anlaşılırsa ve doğrulanabiliyorsa daha fazla bölünmesi gerekmeyebilir.
Yalnızca sorunsuz senaryoyu düşünmek
Geçerli verinin işlendiği akış kadar boş dosya, yetkisiz istek, tekrar gönderim ve yarıda kalan işlem de değerlendirilmelidir. Bu senaryoları sona bırakmak, tasarımın yeniden ele alınmasına yol açabilir.
Bütün resmi kaybetmek
Alt görevler tamamlanırken başlangıçtaki kullanıcı ihtiyacına düzenli olarak dönün. Teknik olarak çalışan bir aktarım, hataları anlaşılır biçimde göstermiyorsa kullanıcının işini tamamlamasına yetmeyebilir.
Bir sonraki probleminizde kullanabileceğiniz kısa kontrol listesi
Kod yazmaya başlamadan önce şu sorulara yanıt verin:
- Problemi birkaç cümleyle açıklayabiliyor muyum?
- Başarılı sonucun ölçütleri belli mi?
- Gereksinimlerle varsayımları ayırdım mı?
- Her parçanın sorumluluğu, girdisi ve çıktısı açık mı?
- Bağımlılıkları ve en önemli belirsizliği belirledim mi?
- Baştan sona çalışan en küçük akış ne?
- Hatalı durumları ve tekrar denemeleri nasıl ele alacağım?
Yazılımcılar için problem çözme becerisi, bu soruları gerçek görevler üzerinde tekrar tekrar uygulayarak gelişir. Zamanla hangi ayrımın işi kolaylaştırdığını, hangi ayrımın gereksiz karmaşıklık oluşturduğunu daha iyi fark edersiniz.
Bir sonraki büyük görevinizde kısa bir duraklama yapın: Problemi yazın, başarı ölçütlerini belirleyin ve ilk doğrulanabilir adımı seçin. Böylece ilerlemenizi, tamamladığınız anlamlı davranışlar üzerinden takip edebilirsiniz.