Takımlar için Yazılım Geliştirme Manifestosu

Hedefi olmayan gemiye hiçbir rüzgar yardım etmez
Montaigne

Hedef ulaşılmak ya da elde edilmek istenen yer demektir. Hedef nişan aldığınız şeydir. Bunun için keskin bir konsantrasyon ile odaklanmak gerekir. Hedef gitmek istediğiniz yerdir. Onun için plan yapar, en verimli şekilde en doğru yoldan nasıl ulaşabileceğinizi araştırırsınız. Hedef ona ulaşabilmek için tüm enerjinizi ona yönlendirmenizi ister. Bazen yıllar süren çalışma gereklidir. Sizi rahatlıkla yıldırabilecek başarısızlıklar ve sayısız deneme yanılma yaşamak zorunda kalırsınız. Bazen de hedef birkaç santim ötenizdedir. Tek bir hamle yeter, ancak o hamle için doğru zamanı yakalamak zorundasınızdır.

Ulaşmak istediğimiz şeyler için çoğunlukla kendimize -bilerek ya da bilmeyerek- hedef belirleriz. Kariyer hedefleri arasında terfi almak ya da kendi şirketini açmış olmak sıkça yer bulur.  Evlenmek, arabayı değiştirmek, ev sahibi olmak, zengin olmak, yurtdışı seyahate çıkmak, iyi bir okulda okumak, sınavlarda başarılı olmak da kişisel hedeflerimiz arasındadır. Herkesin büyük ya da küçük, uzun ya da kısa vadeli, kolay ya da zor mutlaka bir hedefi vardır.

Takım ve şirketlerin de hedefleri olmalıdır. Tüm stratejik kararlar bu hedefler doğrultusunda yapılmalı ve çalışanların emek ve odakları tek bir noktada toplanmalıdır. Bunun örneklerini birçok yerde görebilirsiniz. Mesela toplam kalite yönetimi uygulayan şirketlerin çoğunun girişinde tabelalar üzerinde büyük puntolarla şirketin misyonu ve vizyonu yazar. Şirketin ilkeleri ve ulaşmak istediği nihai hedefler açık seçik belirtilir ki, şirketin ne amaçladığı, yaşatılmak istenen kurum kültürünün ne olduğu çalışan çalışmayan herkes tarafından bilinsin. Tüm stratejiler bu ilkeler çerçevesinde oluşturulur. İlkelerin benimsenmesi için çalışanlar eğitilir ve amaca hizmet edecek aktiviteler gerçekleştirilir. Misyon ve vizyon, şirketlerin “ben buyum ve bu olmak istiyorum” dedikleri ulvi ilke ve amaçlardır.

Bir diğer örnek de internette sıkça gördüğünüz manifestolardır. Manifesto kavram olarak toplumsal bir hareketin duyurulması ve savların belirtilmesi üzerine kurulan, bir akımın, bir hareketin oluşunu bildiren yazılara denir. Toplumlara ya da topluluklara ulaşabilmek amacıyla nihai bir amaç ve ulvi bir hedef gösterir. Manifestolar dünya tarihinde olduğu kadar Türk tarihinde de önemli bir yere sahiptir. Kurtuluş savaşımızının ilk yıllarında yayınlanan ve tüm milleti tek hedef üzerinde odaklayan sivas ve erzurum kongreleri kararları bunlardan birkaçı olarak gösterilebilir. Yazılım dünyasında ise manifestolar tanımladığı ilkeler ve prensipler ile yaşanan sorunları çözmeyi hedefler. En bilineni Agile Manifesto ve Software Craftsmanship Manifesto bu alanda sayılabilir.

Yazılım geliştirmek, özellikle de takım halinde yazılım geliştirmek belli bir disipline sahip olmayı gerektirir. Hızla değişen yazılım dünyasına, ışık hızında gelişen teknolojilere, projelerin türlü ihtiyaçlarına ayak uydururken kalıcı, dayanıklı, esnek ve kaliteli yazılım geliştirmek için elinizde size yol gösterecek tek şey yazılım ilkeleridir. Yazılım ilkeleriniz sizin, takımınızın ve kurumunuzun misyon ve vizyonudur. “Ben şu şekilde yazılım geliştiriyorum” diye anlatabileceğiniz kültürdür, disiplindir.

Yazılım geliştiren her takım ve kurum yazılım ilkelerini belirlemeli, takip edeceği disiplini oluşturmalıdır. Çalışanlarından da bu ilkelere uymasını beklemelidir. İlkeleri esnetmemeli, herkesten aynı hassasiyeti beklemelidir.

Eğer yazılım takımınızın bir manifestosu yoksa, hemen birini yaratmaya koyulun. Bu manifesto, hedeflerinizi ve bu hedeflere ulaşmak için uymayı planladığınız prensipleri içermelidir. Örnek olması açısından, yazılım takımlarımız için hazırladığım “Yazılım Geliştirme Manifestosu”nu aşağıda listelemeye çalıştım. Manifestoyu tasarlarken Agile Manifesto, Software Craftsmanship, XP, Scrum ve Kanban’dan esinlendiğimizi belirtmeliyim.

Takımlar için Örnek Yazılım Geliştirme Manifestosu

Yetenekli, motive ve yenilikçi yazılım geliştirme profesyonelleri olarak bizler, sorunsuz çalışan, iyi tasarlanmış, yüksek kaliteli yazılımlar geliştirmeyi amaçladık. Bu amaca ulaşmak için en iyi teknik ve teknolojileri kullanırız ve aşağıdaki değerlere odaklanırız. Bizler…

  • İyi tasarlanmış, okunaklı, anlaşılabilir, temiz, iyi test edilmiş ve daima değişikliklere ayak uydurabilecek yazılımlar geliştiren…
  • Anlaşılır, kapsamlı ve detaylı ama yeterli analiz ve belgeleme yapan…
  • Sürekli öğrenen, yeteneklerini geliştiren, en iyi pratikleri uygulayan, bilgisini başkaları ile paylaşmaktan zevk alan ve proaktif olarak gözlemleyen ve sorunları çözen çalışanlarız.

Biliyoruz, bu değerlere sahip olmak hiç de kolay değil. Ama aşağıda belirtilen prensipleri takip ederek bunu başabileceğimize inanıyoruz.

  • Kodun sahibi bireyler değil, takımlardır. [Collective Ownership]
  • Kodlama ve analiz için takım standartlarını kullanırız. [Team Stardards]
  • İşler, hikayeler, iterasyonlar ve sürümler için “Bittinin Tanımı”nı belirleriz ve süreçlerimizde buna uyarız. [Definition of Done]
  • Başkası tarafından incelenmemiş (code review) ya da eşli programlama (pair programming) ile geliştirilmemiş kodu canlıya çıkmayız. [Release Procedure]
  • Takıma yeni katılan her yazılımcı, daha hızlı adapte olabilmek için ilk işlerini eşli olarak programlar. [Pair Programming]
  • Sadece olası hataları bulmak için değil, yazılım ve geliştirme hakkında bilgi sahibi olmak için de kodları inceleriz. [Code Review]
  • Hataları çözmeden önce mutlaka otomatik testlerle yeniden yaratırız. Testler ile yeniden yaratmadan hatayı çözmeyiz. [Bug Fix Procedure]
  • Test/kod kapsamını daima gözlem altında tutarız ve düzenli olarak artmasını amaçlarız. [Test Coverage]
  • Yazılım geliştirme, kullandığımız işletim sistemi, IDE ve araçtan bağımsızdır. Bir yazılım geliştirici istediği araçlarla geliştirme yapabilir. [Tool-Free Development]
  • Programlarken tavsiye edilen pratikleri uygularız. [Programming Best Practices]
  • Yazılımları unit, integration, functional, performance, regression, acceptance gibi birçok açıdan test ederiz. [Multi Dimension Testing]
  • Testleriniz kodunuzdur. Unit testleriniz bitmeden kodunuz tamamlanmış sayılmaz. [Unit Testing]
  • Kodu ve geliştirdiğimiz özellikleri TDD ve BDD ile tasarlar, geliştirir ve doğrularız. Testlerin ancak test edilebilir kod için yazılabildiğini biliriz. [TDD / BDD]
  • Temiz kod prensiplerini takip ederiz. Okunaklı test kodu ve kaynak kodu geliştirmeye odaklanırız. [Clean Code Principles]
  • Kullandığımız editör/IDE’yi, komut satırını, build araçlarını, kod analiz araçlarını, Git ve Vagrant’ı ileri düzeyde bilir ve kullanırız. [Tools in Craftsmanship]
  • Sürüm çıkmak ve geliştirmek konularında önerilen standartlara uyarız. [Release & Version Management]
  • Kod analiz araçları ile kodumuzu izler ve kalite metriklerini takip ederiz. [Code Analysis]
  • Düzenli olarak teknoloji havuzumuzda olmayan teknolojilerde de geliştirme yaparak vizyonumuzu genişletiriz. [Technological Agnosticism]
  • Sistemlerimizi tasarlarken tek-hata-noktası durumu yaratmaktan kaçınırız. [Avoid Single Point of Failures]
  • Testleri olabildiğince otomatikleştiririz (ve daha çok otomatikleştirmek için yollar ararız). [Automatization]
  • “Sürekli entegrasyon” ile yazılım kalitesini sürekli takip ederiz. Build’leri yeşil tutarız. Bir build başarısız olursa işimizi bırakır build’i fix ederiz. [Evergreen Builds]
  • Geliştirme, açılma (boot-up), paketleme, test etme ve hata düzeltme sürelerini kısaltırız. [Being Fast]
  • Coderetreat’ler ve kod kataları ile kodlama yeteneklerimizi geliştirmek için egzersiz yaparız. [Practice to Improve]
  • Herhangi bir teknoloji konusunda saplantılı olmayız. İhtiyaçlarımıza uyan teknolojiyi kullanırız. [Openmindness]
  • Teknik borcu olabildiği kadar erken öderiz. Varolan teknik borçları gelecekte ödemek üzere ayrı bir backlog üzerinde kaydederiz. [Technical Debt]
  • Yeniden kullanılabilir komponentler yazar, uygulamanın özelliklerini mümkün olduğunca as-a-servis olarak açarız. [Reusability & Extensibility]
  • Müşteriye daha hızlı cevap verebilmek ve riski asgaride tutabilmek için kısa ve sık sürüm çıkarız. [Short Releases]
  • Aynı anda üzerinde çalışılan iş sayısını sınırlarız. İşleri bireysel değil takımca ve önem sırasına göre bitiririz. [Limit Work-in-Progress]
  • Uygulamamızın mimarisini bulut uyumlu olacak şekilde tasarlarız. [Cloud Compatibility]
  • Yeni özellikler geliştirmek, sorunları çözmek ve kodda denemeler yapabilmek için versiyon kontrol sisteminde yeni dallar yaratır ve kullanırız. Takımca belirlenen akış modellerine uygun kod geliştiririz. [Flow Models]
  • Müşteriye sık sık demo yapar, geliştirme sırasında kendisinden geribildirim alırız. [Customer Involvement]
  • Yeteri kadar ve iyi hazırlanmış belgeler yaratırız. Diyagramları ve tabloları paragraflarca yazıya tercih ederiz. [Agile Documentation]
  • Yarattığımız belgeleri güncel tutarız. Güncellenemeyecek kadar eski belgeleri siler ya da arşivleriz. [Efficient Documentation]
  • Yaratılan belgeleri inceler ve daha iyi olabilmesi için yazarına geribildirim veririz. [Document Review]
  • Eski kod ve tasarımları sürekli yenileriz. Takım olarak sürekli teknik iyileştirme önerileri sunarız. [Refactoring]
  • Takım olarak her sabah toplanır, günü planlarız. [Daily Standup Meetings]
  • Düzenli olarak toplanır geçmişi değerlendiririz. Geçmişte yapılan hataları tekrarlamamak için aksiyon alırız. [Retrospective]
  • Düzenli olarak toplanır teknik sorunları tartışırız. Farklı sistemlerin ortak sorunlarına kalıcı ortak çözümler araştırırız. [Common Solutions]
  • Hergün kalan işleri belirler ve durum kötü olsa bile bunu herkesin görebileceği bir yerde gösteririz. [Transparency]
  • Bilgimizi eğitimlerle, bizzat çalışarak ve başkaları ile paylaşarak arttırırız. [Knowledge Sharing]
  • Eğer sizi yavaşlatan bir sorun varsa, 1 günden fazla beklemeyiz. Mutlaka yardım talep ederiz. [Collaboration]
  • Hatalar ve olası sorunlar nedeniyle kimseyi suçlamayız. [No Blame Rule]
  • Geliştirme sırasında iş akışını beyaz tahta üzerinde görselleştiririz. [Visualization on Whiteboard]
  • Bireysel performanstan ziyade takım performansına önem veririz. Daima yardımlaşır ve bilgi paylaşırız. [Performance Appraisals]
  • Takımca tasarlar, takımca geliştirir ve aldığımız kararların sorumluluğunu takımca alırız. [Shared Responsibility]

Manifestonuzun benim verdiğim örneğe benzemesi gerekmez. Uzun ya da kısa olması gibi bir zorunluk da yok. Sizin yazılım geliştirme kültürünüzdeki ve iş yapış şeklinizdeki hedeflerinizi göstersin yeter.

Manifestonuzu yazmanız yetmez. Bu bilgileri şirketinizdeki tüm yazılımcılara ve aranıza katılan her yeni çalışana anlatmalısınız. 2012’de manifestoyu yarattıktan sonra ilk işim bunu tüm takım ile paylaşmak ve onlara madde madde anlatmak oldu. O andan bu yana da aramıza yeni katılan yazılımcıların ilk gün eğitimlerinde manifestomuzu anlatıyorum. Herkesin takımımızın hedefi olan yazılım geliştirme kültürünü bilmesi ve buna uyması gerektiğini düşünüyorum.

Hedefler ve prensipler uygulanmaz sadece yazıda kalırsa, size yokluğundan daha çok zarar verir. Bu nedenle manifestonuz ışığında yazılım geliştirme süreçlerinizi değiştirmek, düzenlemek ve iyileştirmek zorundasınız. Biz mevcut manifestomuzu 2 kez yeniledik ve daha gerçekçi hale getirdik. Düzenli olarak gözden geçirip yeni eklemeler ve düzenlemeler ile iyileştirmekteyiz.

Belirleyeceğiniz yazılım geliştirme manifestosu size yepyeni bir motivasyon sağlayacaktır. Her maddenin bir anda başarılabilmesi elbette mümkün değil. Ancak disiplinli ve odaklı bir şekilde takip edilirse, yönetiminizin de desteğiyle bir süre sonra daha motive çalışan, daha mutlu müşteri ve daha kaliteli ve başarılı yazılımlara ulacağınız kesin.

Lemi Orhan Ergin
Agile Software Craftsman

1 Comment

Post a Comment

Comment
Name
Email
Website