Bölüm 3) Hata takip sistemleri
Dökümantasyon ve kaynak kod yönetimi gibi problemler ekip içerisinde çeşitli araçlar ve yöntemler ile çözüldükten sonra bir başka sorun kendini göstermeye başlar, problemlerin takibi ve çözümü, kaynak kod ve proje büyüdükçe problemlerin tespiti ve giderilmesi bir kaç dakikadan saatlere, günlere ve hatta daha uzun süren bir zamana yayılmaktadır.
Geliştirici hangisini yapacağına tam olarak karar veremez ve işin hep en zevkli tarafını yani yeni özelliklerin eklenmesini tercih eder. Bu tercih ise geçmişte yaşanan problemlerin ve/veya çözümlerin unutulmasına ve daha büyük sorunların çıkmasına neden olur. Bu durumu önlemek için tavsiyem kaynak kod yönetim yazılımınız ile entegre çalışabilen bir hata takip sistemini devreye almanızdır.
mozilla tarafından geliştirilen bugzilla, edgewall grubu tarafından geliştirilen trac, tigris grubu taranfından geliştirilen mantis bu uygulamalardan sadece bir kaçıdır.
Bugzilla
mozilla tarafından geliştirilen bu yazılım perl kullanarak hazırlanmıştır, modüler yapısı sayesinde subversion ve cvs'in commit hooklarına eklenen ufak scriptler sayesinde her iki kaynak kod yönetim sistemi ile entegre çalışabilir.
Trac
edgewall tarafından özgür olarak geliştirilen ve modüler yapısı ile subversion'ı hedef alarak geliştirilmiş bir hata takip sistemidir, küçük ve orta ölçekli subversion kullanılan her proje içerisinde kullanılabilinir. Subversion ile entegrasyonu sayesinde commit mesajları ile her hangi bir hata kaydı kapatılabilinir. içerisinde dahili olarak subversion için web arabirimi, hata takip sistemi ve wiki hazır olarak gelmektedir böylece tüm projedeki gelişmeler tek bir adres ve arabirimden geliştiricilere, katkıcılara, testçilere ve hatta kullanıcılara ulaştırılabilinir.
Mantis
Php ile yazılmış bu hata takip sistemi sadece hata takibini sağlamak için geliştirilmiştir, subversion veya cvs için commit hook'larına eklenen ufak betikler sayesinde kaynak kod yönetim sistemleri ile entegrasyonu sağlanabilir.
Redmine
Pek çok farklı kaynak kod yönetim sistemi ile entegre çalışabilen ve ruby ile geliştirilmekte olan bir takip aracıdır, çoklu dil desteği, forum, wiki, hata izleme sistemi, takvim ve birden fazla proje için kullanılabilmesi ile dikkat çekmekte olan başarılı bir araçtır. Tıpkı trac gibi geliştiricilerin, katkıcıların tek bir adres üzerinden rss ile takibini mümkün kılmaktadır.
Zaman içerisinde sağlıklı ve kararlı bir büyüme gerçekleştirmek istiyor iseniz işe en başından projenizin yazılımsal kontrolünü elden bırakmadan yapmak zorundasınız. Uygulamanızın daha fazla kişi için erişilebilinir olması, uygulamanız, iş modeliniz, sermayeniz ve kullanılacak teknikler ile değişiklik gösterebilir, ancak kaynak kod yönetimi ve hata takip sistemi gibi "genel yapılar" geliştirme sürecinde değiştirilemez parçalarıdır. Bu neden ile bu başlıklar "ölçeklenebilir yazılım geliştirme" altında bulunmaktadır. Yukardaki uygulamalar irili ufaklı hemen hemen her projede kullanılması gereken, iş gücünün dağıtımını ve yönetimini başarı ile yapabilmenizi sağlayan araçlardır. Bir projenin büyümeyi planlayabilmesi için öncelikli olarak geliştiricilerine yukardaki araçları tanıyabilmesi ve kullanabilmesi için gerekli eğitim ve zamanı tanıması gerekmektedir.
yazılım geliştirme ve ölçeklenebilirlilik
Projeler ve yazılım ayrılamayan ikilidir, projeleri gerçekleştiren kişilerin kullandığı diller ve teknolojiler, projenin veya fikrin gerçekleştirilmesini sağlayan yazılımı oluştururken aynı zamanda projenin biçimlenmesinde kimi zaman olumsuz kimi zaman olumlu katkıda bulunurlar.
Türkiyede özellikle yoğun trafik yaşayan web projelerinin azlığı, yazılımcıların ilgi ve tecrübesinin olmamasını pek çok başarılı olabilecek projenin henüz daha doğmadan yok olmasına neden oluyor. Şöyle düşünün, dailymotion yada youtube daha henüz oluşturulmamış iken bir fikir sahibi olarak (teknik bir kişi olmadığınızı var sayarak) online video sitesi kurmak geldi ve çeşitli gelir modelleri belirlediniz, etrafınızdaki yazılımcılardan bu işin yapılabilinirliliği hakkında bilgi ve fiyat almak istediğinizde size bir kaç çözüm ile birlikte bir kaç fiyat çıkartılacaktır, sizde güvendiğiniz ve cebinize uygun fiyatı veren yazılımcı veya yazılımcı ekip ile yola çıktınız.
Projeniz bittiğinde ise aslında sizin elinizde olan sadece yapılacak iş için yapılabilirliliğine ait bir kanıt niteliğinde ürün oldu ancak siz henüz bunu fark etmediniz, fark etmenizi sağlayacak senaryo ise:
ilk haftada saniyede 100 request almaya başladınız, sisteminiz afalladı çünkü yazılımcılarınız ne yazıkkı ölçeklenebilirlik hakkında pek fazla bilgiye sahip değillerdi, dağıtık dosya sistemi için nfs kullanıldı çünkü daha bilinir ve daha kolay geldi, sabit içerikleri ayırmadınız, ön bellek sistemi dosya dizin seviyesinde kaldı, oturum yönetimi dosya dizin seviyesinde çalışıyor. veri tabanına yapılan sorgular önbelleklenmediği ve kimi update işlemleri için (gösterim arttırımı veya azaltımı) veri tabanına erişim yapılıyor. Tüm bu unsurların sonunda sisteminiz gelen trafiğe yanıt veremeyecek duruma gelebilir. Problemi aşmak için büyüme kaçınılmaz ancak nasıl?
Yeni çıkmış bir servisin birden bu duruma düşmesi oldukça kötü olacaktır, bu neden ile yazılım ekibinizin veya yazılımcınızın bu unsurları en başta düşünmesi ve tedbir alması gerekmektedir.
Bu unsurlara göre yazılım tasarımı nasıl olmalıdır? Kullanılabilinir araçlar, teknikler ve teknolojiler nelerdir? Büyüme problemleri, çözümleri ve maliyeti ile ilgili bir süre yazmak bir şeyler "zırvalamak" istiyorum, umarım faydalı olur.
(Yazar) Sevgili günlük...
(Günlük) beni hatırladığına sevindim, efendim?
(Yazar) Yanlış mı yapıyorum sürekli?
(Günlük) Hayatın içerisinde yapılanlar, yapıldıkları sırada yanlış değildir, bu yüzden şimdi düşünme ilerde düşünürsün.
Taşınabilirlilik
Taşınabilirlik bir yazılım için en önemli unsurlardan biridir. Herhangi bir işletim sisteminde kullandığınız ve
başka bir işletim sistemindede olmasını istediğiniz her hangi bir yazılım oldumu hiç?
Taşınabilirlik bir yazılımın yaygınlaşmasını, kullanıcı sayısının artmasını sağlarken bazı şeyleri göz ardı edebilirmi?
Elbette konu bir sistem yazılımı değil, daha çok web yazılımları hakkında.
Şu sıralar ORM sistemlerini incelerken fark ettim ki, taşınabilir olmak adına desteklenen platformlardan tam verim
alamıyoruz. Örneğin A veri tabanında bulunan fakat B veri tabanında bulunmayan bir özelliği ORM sistemine dahil etmiyor,
dışarıda tutuyoruz bunun nedeni ise taşınabilirliliği azaltması olarak gösteriyoruz. Ancak enterprise bir ürün üzerine kod yazıyor isek
kullandığımız tüm sistemlerden (veri tabanı vs. ) tam ve doğru şekilde faydalanmak isteriz, ORM sistemlerinin pek çoğu
(farklı diller için yazılmış olanlar dahil ( python, php, vs.)) bazı açılardan birbirlerine üstünlük sağlasada bunları tek bir
ORM sistemine toplayan bir yazılım ne yazıkki yok. Bunda elbetteki bu veri tabanı üreticilerinin ANSII içerisinde bulunmayan
ancak kullanışlı ve faydalı olduğunu düşündükleri (ki öyleler) veri türlerini sistemlerine dahil etmeleri yada ANSII standartlarında bulunan
bazı veri türlerini belki, henüz dahil etmemeleri. ORM sistemler genel web yazılımları için iyi olabilir ama
web yazılımı sadece bir kaç işlem demek değildir. özelliklede şu sıralar.
Bir ORM sistemi evet taşınabilir olmalıdır ama bunu çok fazla dert etmeye kalkarsa bir sorun ortaya çıkar, performans sorunu.
Bunu aşmak içinde benzer kodları yazar dururuz, elbette bir ORM sistemi geliştirmiyorsak. Desteklenen her platformun her özelliğinin
ORM sistemleri tarafından desteklenmesi gerekir ve bu ORM sistemi ile bir yazılım geliştiriliyor ise ve eğer yazılan yazılımın taşınabilir
olması dert ediliyor ise bunu yazılımın yazarına yani programcıya devretmek gerekiyor.
ORM sistemler yazılımcıya pek çok kolaylık sunabilir, ama bunun bedeli olarak performanstan vaz geçmemelidir.