Yazılım İhtiyacınızı Kod Yazmadan Önce Netleştiriyoruz

Bir yazılım projesine kod yazarak değil, soru sorarak başlarız. İşletmenizde hangi işin zaman kaybettirdiğini, hangi adımın elle ve tekrar tekrar yapıldığını dinleriz. Çoğu zaman asıl ihtiyaç, istenen özellikten farklı çıkar. Bu yüzden erken aşamada bol soru sorar, varsayımları test ederiz. Karaman’daki bir işletmenin stok takibiyle randevu yöneten bir işletmenin derdi aynı olmaz. İhtiyacı doğru anlamadan yazılan program, ne kadar düzgün kodlanırsa kodlansın yanlış işi çözer. Yazılım projesi ancak gerçek bir sorunu hedeflediğinde değer üretir. Bu ilk aşamada başarıyı nasıl ölçeceğimizi de birlikte tanımlarız. Doğru soru sormak, kod yazmaktan daha zor ama daha değerlidir. Yanlış anlaşılan bir ihtiyaç, sonradan katlanarak maliyet çıkarır. İşinizi anlamadan tek satır kod yazmak, karanlıkta yürümeye benzer. Bu yüzden acele etmeden dinlemeyi tercih ederiz. Erken sorulan doğru bir soru, ileride yazılacak yüzlerce satırı gereksiz kılabilir.

İhtiyacı anladıktan sonra kapsamı yazıya dökeriz. Neyin bu sürümde yapılacağını, neyin sonraya bırakılacağını açıkça ayırırız. Kapsamı net olmayan projeler zamanla büyür, bütçeyi ve takvimi aşar. Bu yüzden her isteği önceliğine göre sıralar, önce çekirdek işlevi hedefleriz. Sizinle birlikte bir öncelik listesi çıkarır, her maddenin iş değerini konuşuruz. Hangi özelliğin gerçekten gelir getirdiğini, hangisinin sadece iyi hissettirdiğini ayırt ederiz. Belgelenmiş bir kapsam, ilerideki anlaşmazlıkların çoğunu baştan önler. Böylece herkes aynı sözü aynı biçimde anlar. Yazıya dökülmemiş her istek, sonradan tartışma çıkarır. Sözlü anlaşmalar zamanla farklı hatırlanır, yazılı olan ise sabit kalır. Neyin dahil, neyin hariç olduğunu netleştirmek iki tarafı da korur. Belirsizlik, projelerin en pahalı düşmanıdır. Net kapsam ise hem bizi hem sizi korur. Yazılı ve net bir kapsam, iki tarafı da beklenmedik sürprizlerden korur.

Kapsamı çizerken bütçe ve takvimi de gerçekçi tutarız. Abartılı sözler yerine, ölçülebilir ara teslimler öneririz. Projeyi küçük parçalara böler, her parçanın ayrı bir çıktısı olmasını sağlarız. Böylece ilerlemeyi somut biçimde görür, yolun ortasında sürprizle karşılaşmazsınız. Riskleri önceden konuşur, belirsiz noktaları küçük denemelerle netleştiririz. Bir fikir kâğıt üzerinde iyi görünse de gerçek veriyle sınanmadan söz vermeyiz. Teknik seçimleri işinizin geleceğine göre yaparız, geçici hevese göre değil. Sağlam bir temel, sonraki her adımı ucuzlatır. Abartılı bir söz, kısa vadede hoş görünür ama sonunda hayal kırıklığı yaratır. Bu yüzden söz verdiğimizin arkasında dururuz. Riskleri önceden konuşmak, onları sürprize dönüşmeden çözmeyi sağlar. Yanlış kurulan bir temel ise her yeni özellikte size pahalıya patlar. Bu yüzden başı yavaş, gerisi hızlı bir yol seçeriz. Sağlam atılan bir ilk adım, sonraki bütün aşamaları hem hızlandırır hem ucuzlatır.

Kapsamı Küçük Bir İlk Sürümle Doğruluyoruz

İlk sürümü olabildiğince küçük ve işlevsel tutarız. Amacımız, çekirdek işi çalışır hâlde erkenden elinize vermektir. Küçük bir sürüm, Karaman’daki gerçek kullanıcılarla test edilebilir; büyük bir vaat ise aylarca görünmez kalır. Yazılım geliştirme yolunda erken geri bildirim, sonradan yapılacak pahalı düzeltmeleri önler. İlk sürümde yalnızca gereken özellikleri barındırırız. Kullanıcı gerçek işini bu sürümle yapmaya başlayınca, hangi eksiğin önemli olduğu netleşir. Bu yaklaşımı hem bütçeniz hem de projenin sağlığı için tercih ederiz. Erken çalışan bir çekirdek, geç gelen kusursuzluktan daha değerlidir. Küçük başlamak, hatayı ucuz aşamada yakalamayı sağlar. Büyük ve kapalı bir proje, aylarca görünmez ilerler ve riski büyütür. Gerçek kullanım, en isabetli yol göstericidir. Kâğıt üzerindeki kusursuz plan, gerçek kullanımda çoğu zaman şaşar. Bu yüzden erken ve küçük çıkmayı yeğleriz. Erken elinize geçen çalışan bir sürüm, en isabetli kararları almanızı sağlar.

Küçük sürümü canlıya alırken riskleri kontrol altında tutarız. Sınırlı bir kullanıcı grubuyla başlamayı öneririz. Böylece bir sorun çıkarsa etkisi dar kalır ve hızla düzeltilir. Kullanıcıdan gelen ilk tepkileri düzenli toplar, notları önceliğine göre sıralarız. Bu geri bildirim, sonraki sürümün yol haritasını belirler. Varsayımlarımızın hangisinin doğru, hangisinin yanlış çıktığını dürüstçe değerlendiririz. Yanlış çıkan bir varsayım başarısızlık değil, ucuz bir derstir. Erken öğrenmek, yolun sonunda büyük kayıplardan korur. Kullanıcının ilk tepkisi, bize en değerli yol haritasını verir. Bu yüzden geri bildirimi düzenli toplar, ciddiye alırız. Kullanıcıyı sürece katmak, tahmin yürütmekten çok daha güvenlidir. Öğrenerek ilerlemek, kör bir güvenle koşmaktan çok daha sağlıklıdır. Gerçek geri bildirim, en pahalı toplantıdan bile değerlidir. Dar bir grupla yapılan deneme, olası hataların etkisini küçük ve yönetilebilir tutar.

İlk sürümün ardından geliştirmeyi düzenli döngülerle sürdürürüz. Her döngünün başında ne yapılacağını, sonunda ne çıktığını konuşuruz. Böylece proje şeffaf ilerler ve siz her aşamada söz sahibi olursunuz. Öncelikleri iş koşulları değiştikçe yeniden düzenleriz. Sabit ve katı bir plana körü körüne bağlı kalmayız. Ortaya çıkan gerçek veriler, hangi özelliğin sıraya gireceğini belirler. Her teslimde çalışan, denenmiş bir parça veririz. Yarım kalan işleri birikmiş borç gibi ertelemeyiz. Düzenli döngüler, projeyi tahmin edilebilir bir ritme oturtur. Böylece sürpriz gecikmeler yerine, öngörülebilir bir akış kurarız. Katı bir plana körü körüne bağlanmak, çoğu zaman yanlış işi bitirmek demektir. Böylece proje her hafta biraz daha sağlamlaşır. Küçük ve düzenli adım, büyük ve geç teslimden daha az risklidir. Öngörülebilir bir ritim, projeyi hem şeffaf hem de güvenilir bir hâle getirir.

Geliştirmeyi Sık Testlerle Birlikte İlerletiyoruz

Geliştirme sırasında kaliteyi sona bırakmayız, işin içine yayarız. Yazdığımız kodu düzenli olarak test eder, hataları erken yakalarız. Otomatik testler, sonradan yapılan değişikliklerin eski işlevi bozmadığını güvence altına alır. Kod okunur ve düzenli olmalıdır, çünkü bir gün başka bir geliştirici devralabilir. Yazılım süreci boyunca yaptığımız işi anlaşılır biçimde belgeleriz. Karmaşık numaralar yerine sade ve sürdürülebilir çözümleri seçeriz. Her yeni parçayı canlıya almadan önce ayrı bir ortamda deneriz. Böylece kullanıcı, yarım test edilmiş bir özellikle karşılaşmaz. Kaliteyi işin sonuna bırakmak, en pahalı hataları en geç anda bulmak demektir. Bu yüzden test etmeyi günlük bir alışkanlığa çeviririz. Erken yakalanan bir hata, hem zaman hem itibar kurtarır. Kalite sonradan eklenen bir süsleme değil, işin dokusuna işlenen bir alışkanlıktır. Sürdürülebilir bir yapı, yıllar içinde kendini fazlasıyla öder. Erken yakalanan bir hata, geç fark edilen bir arızadan çok daha ucuza kapanır.

Çoğu proje tek başına çalışmaz, başka sistemlerle konuşması gerekir. Ödeme, kargo, muhasebe ya da mesajlaşma servisleriyle bağlantı kurarız. Entegrasyonları kurarken güvenliği ve hız sınırlarını dikkatle gözetiriz. Dışarıdaki bir servis çökerse uygulamanın tümden durmamasını sağlarız. Bağlantı hatalarını sessizce yutmaz, kayıt altına alıp izleriz. Böylece bir aksaklık olduğunda nedenini hızlıca buluruz. Her entegrasyonu gerçek veriyle sınar, sonra canlıya alırız. Dışa bağımlı parçaları, gerektiğinde değiştirilebilir biçimde tasarlarız. Ödeme ya da muhasebe bağlantıları doğru kurulmazsa sistem kırılgan olur. Bu yüzden her bağlantıyı dikkatle tasarlar ve sınarız. Dışarıdaki bir servis çökse bile uygulamanın ayakta kalmasını isteriz. Bir servisi yarın değiştirmek gerekirse, tüm sistemi sökmek zorunda kalmayız. Bu esneklik, uzun ömürlü bir sistemin gizli sigortasıdır. Doğru kurulan bir bağlantı, dışarıdaki bir servis çökse bile sistemi ayakta tutmaya devam eder.

Veri, çoğu uygulamanın kalbidir; bu yüzden onu özenle ele alırız. Verinizi düzenli olarak yedekler, yedeğin gerçekten geri yüklenebildiğini sınarız. Kişisel bilgileri yalnızca gereken kadar toplar ve koruruz. Erişim yetkilerini rol bazında ayırır, herkesin her şeyi görmesini engelleriz. Şifreleri güvenli biçimde saklar, açık metin olarak asla tutmayız. Bir sızıntı ihtimaline karşı kayıtları izler, olağan dışı hareketi erken fark ederiz. Güvenlik tek seferlik bir işlem değil, sürekli bir alışkanlıktır. Bu disiplin, sizi de müşterinizi de korur. Bir yedeğin varlığı değil, geri yüklenebilirliği önemlidir. Bu yüzden yedekleri düzenli olarak deneriz. Erişimi ayırmak, olası bir hatanın etkisini sınırlar. Alınmayan bir yedek, bir gün en pahalı eksik hâline gelir. Bu nedenle yedeği kurmakla yetinmeyiz, çalıştığını da sınarız. Denenmiş bir yedek, kötü bir günde bütün işinizi baştan kurtaran sessiz bir sigorta gibidir.

Bakımı Kaynak Kodu Sahipliğiyle Teslim Ediyoruz

Bir sistem teslimle bitmez, canlı bir varlık gibi bakım ister. Sunucu, kütüphane ve güvenlik güncellemelerini düzenli uygularız. Güncellenmeyen bir sistem zamanla hem yavaşlar hem de açık verir. Bakım kapsamını ve yanıt sürelerini sözleşmede açıkça yazarız. Bir sorun çıktığında kime, nasıl ulaşacağınızı önceden bilirsiniz. Yazılım çözümü ancak düzenli bakımla uzun ömürlü olur. Kritik hatalara öncelik verir, küçük istekleri planlı sıraya alırız. Böylece sistem yıllar içinde çürümek yerine olgunlaşır. Bakım, bir uygulamayı zamana karşı ayakta tutan sessiz emektir. İhmal edilen bir sistem, bir gün beklenmedik bir hatayla durur. Düzenli güncelleme, bu riski küçük ve yönetilebilir tutar. Bakımı bir masraf değil, uzun ömürlü bir yatırım gibi görürüz. Düzenli ilgi, onu her geçen yıl daha güvenilir kılar. Düzenli bir bakım, sisteminizi her geçen yıl biraz daha güvenilir ve dayanıklı kılar.

Kaynak kodun sahibi, ilk günden itibaren sizsiniz. Yazılım projesi tamamlandığında kodu, belgeleri ve erişim bilgilerini eksiksiz teslim ederiz. Kodu kendimize kilitlemez, sizi bize mahkûm etmeyiz. İsterseniz yarın başka bir ekiple yola devam edebilir, her şeyi düzenli hâlde bulabilirsiniz. Verinizi de dışa aktarılabilir bir biçimde tutarız; kayıtlarınız bizim değil sizin malınızdır. Kullandığımız araçları ve mimariyi sade bir belgede anlatırız. Böylece devir gerektiğinde kimse sıfırdan başlamak zorunda kalmaz. Şeffaflık, uzun vadeli güvenin tek gerçek zeminidir. Kaynak kodu size ait olduğunda, geleceğiniz başkasının insafına kalmaz. Dilediğiniz an başka bir ekiple yola devam edebilirsiniz. Bu özgürlük, aslında bize olan güveni de artırır. Bağımlı bırakılan müşteri değil, özgür bırakılan müşteri geri döner. Biz de bu yüzden kapıyı hep açık tutarız. Kodun size ait olması, işinizin geleceğini kimsenin insafına bırakmamanız anlamına gelir.

Teslimden sonra da yanınızda kalırız. Sistemi kullandıkça yeni ihtiyaçlar doğar; bunları birlikte değerlendiririz. Küçük iyileştirmeleri hızlı yapar, büyük eklentileri ayrı planlarız. Kullanım verisine bakarak hangi özelliğin işe yaradığını görürüz. Gerçekten kullanılmayan parçaları sadeleştirmekten çekinmeyiz, çünkü sadelik bakımı ucuzlatır. İşiniz büyüdükçe sistemin de aynı hızda büyümesini sağlarız. Amacımız, tek seferlik bir teslim değil, sürüp giden bir iş ortaklığıdır. Sağlam kurulan bir temel, yıllarca sizinle birlikte gelişir. Bir sistemi kurmak kadar, onu yıllarca yaşatmak da ustalık ister. Gereksiz karmaşadan kaçınır, bakımı kolay bir yapı bırakırız. Sistem genişledikçe biz de yanında büyürüz. Sürekli bir ortaklık, tek seferlik bir işten çok daha fazlasını kazandırır. Bu yüzden teslim günü bizim için sonun değil, yolun başlangıcıdır. Kurmak kadar yaşatmayı da üstlenmek, uzun soluklu bir ortaklığın en doğal gereğidir.

Yazılım Hakkında Sık Sorulan Sorular

Baştan kalın bir teknik doküman şart değildir. İş kuralları, kimin hangi rolde olduğu ve beklenen sonuç netse teknik ayrıntılar çözümleme sırasında birlikte oluşturulur. Belirsiz kalan noktaları varsayımla kapatmıyor; ekibin verdiği örnek kayıtlar ve senaryolar üzerinden karara bağlayıp kapsamı yazılı hâle getiriyoruz.

Aktarılabilir, ama önce verinin incelenmesi gerekir. Yinelenen kayıtlar, birbirinden farklı tarih biçimleri, eksik değerler ve bozuk karakterler baştan raporlanır. Karaman’da önce bir deneme aktarımı yapıp sonucu onayınıza sunuyor, ancak ondan sonra canlı taşımayı planlıyoruz.

Verilebilir. Görüntüleme, düzenleme, onaylama ve dışa aktarma sınırları göreve göre ayrı ayrı kurulabilir. Bu yetki düzenini iş sorumluluklarıyla birlikte doğruluyor, yönetici hesabının gündelik işler için gereksiz yere paylaşılmamasına dikkat ediyoruz.

İlgili servis güvenilir bir bağlantı arayüzü sunuyorsa kurulabilir. Kimlik doğrulama, veri sınırı, hata yanıtı ve tekrar deneme davranışı önceden belgelenir. Bağlantının koptuğu durumda kayıt kaybını önleyen yöntemi seçiyor, alışverişi izlenebilir tutuyoruz.

Deneyebilirsiniz. Tamamlanan akışlar bir deneme ortamında kademe kademe açılır. Geri bildirimleri hangi ekran ve senaryoya ait olduğuyla topluyor; onaylanmış bir davranışı değiştirmeden önce süreye, veriye ve diğer bölümlere etkisini birlikte değerlendiriyoruz.

Önce talebin hangi sorunu çözdüğü ve ne sıklıkta kullanılacağı ölçülür. Veri düzeni, yetkiler, mevcut akış ve doğuracağı bakım yükü incelenerek kapsam çıkarılır. Acil bir hatayla yeni bir geliştirmeyi ayrı kuyruklarda yönetiyor, ikisini birbirine karıştırmıyoruz.