Jan 31 2009

Martin Fowler’ın Yazıma Cevabı

Tag: Agile,GenelM. Cihat Altuntaş @ 3:09 pm

Birkaç gün önce Süreçler mi?, insanlar mı? adında bir yazı yazmıştım. Martin Fowler blogumu takip ettiğinden olsa gerek birkaç gün sonra dediklerimi tastikler bir şekilde  FlaccidScrum yazısını yazmış:) Yazıda Scrum metolojisinin uygulanırken karşılaşılan zorluklardan ve sebeplerinden bahsediyordu. Son iki paragrı aşağıya kopyalıyorum.

I always like to point out that it isn’t methodologies that succeed or fail, it’s teams that succeed or fail. Taking on a process can help a team raise it’s game, but in the end it’s the team that matters and carries the responsibility to do what works for them. I’m sure that the many Flaccid Scrum projects being run will harm Scrum’s reputation, and probably the broader agile reputation as well. But since I see SemanticDiffusion as an inevitability I’m not unduly alarmed. Teams that fail will probably fail whatever methodology they mis-apply, teams that succeed will build their practices on good ideas and the scrum community’s role is to spread these good ideas around widely.

Many people are looking to Lean as the Next Big Agile Thing. But the more popular lean becomes the more it will run into the same kind of issues as Scrum is facing now. That doesn’t make Lean (or Scrum) worthless, it just reminds us Individuals and Interactions are more valuable than Processes and Tools.

Şaka bir yana Fowler’da paragrafta benim de daha önceden vurguladığım konuların üzerinde durmuş. İşaretlediğim yerlerde bizlere başarının yada başarısızlığın süreçlerden değil insanlardan kaynaklandığını, herhangi bir sürecin bir takıma uygulandığında onu başarıya ulaştıracak olanın takım tarafından alınan sorumlulukla mümkün olduğunu belirtmiş. Asıl başarının insanlardan kaynaklandığını birçok teknik, araç ve metodolojinin öncüsü olan Martin Fowler tarafından tekrar belirtilmesi beni sevindirdi. Sizinlede paylaşmak istedim.


Jan 24 2009

Süreçler mi?, insanlar mı?

Tag: AgileM. Cihat Altuntaş @ 7:39 pm

Geçenlerde Yazılım Mühendisliği Türkiye grubunda  Krizde Agile Olmak adlı bir konu açılmıştı. Konu Cenk Civici tarafından krizde agile olmanın maliyetleri düşürmede, karlılığı arttırmada,daha hızlı üretimde kullanılabilecek iyi bir yöntem olduğu belirtilerek açıldı. Bu konuda kendisine tamamen katılıyorum. Bu fikir benimde aklıma daha önceden gelmişti. Neden firmalar kriz,yada işlerin sıkıştığı zamanlarda çeşitli sosyal olanaklardan kesinti yapar, daha fazla mesai, kaliteden ödün verme gibi aslında pek fayda sağlamayan yollarak başvururlar hep düşürüm.

Aslında daha kaliteli ürünler, daha iyi bir altyapı, müşterinin ne istediğini bilerek müşteri ile yapılan yazılım,testler ile desteklenmiş daha az hatalı, daha fazla geri dönüşü olan yazılım bu israfı önlemede oldukça faydalı olacak yöntemler fakat çoğu firma tarafından görmezden gelinir.Bu konuda çevik süreçlerin fayda sağlayacağı kesin. Fakat konuda ilerleyen mesajlarda bir arkadaşın verdiği cevap oldukça ilginçti. Arkadaş şöyle diyordu

Süreçler kuşkusuz krizde veya düzlükte maliyetleri azaltıyor.
Peki ya çevik takımın bedeli konusunda birşeyler söyleyemez misiniz?

Güzel bir soru. Peki Agile pratikleri iyi güzelde. Agile takımı oluşturmak için nasıl bireylere ihtiyaç var? Agile süreçleri uygulamanın en büyük zorluğu:

  1. Firma kültürü
  2. Takım elemanları

Burada çok güzel bir noktaya değinilmiş oldu. Genelde süreçleri tanımlarken, hep faydasına uygulandığında getirdiği faydalara değiniriz. Süreçler takip edildiğinde herşey dört dörtlük olacak mı? Süreçleri uygulamak için insanlara mı robotlara mı ihtiyaç var? Malesef süreçleri uygulamak için henüz robotları kullanabilecek bir teknolojiye sahip olmadığımız için insanlarla yetinmek zorundayız. Yani süreçleri işleten insanlar.

Firma konusuna fazla değinmeden geçiyorum. Firmanın Agile süreçlerin faydasını anladığını ve bunlardan maksimum yararlanmak için adım attığını vaysayalım . Genelde bu adım çok zor oluyor hatta hiç olmuyor ama öyle varsayalım :) Agile bir takım kurmak için gereken “Highly Motivated People” insanları nereden bulucaz? Arka bahçemizde bunlardan yetişmiyor ve bu tarz insanları bulmak gerçekten pekde kolay olmuyor bence. Yada benim bulunduðum iş ortamlarında çok fazla rastlayamadım. Takım elemanlarının bir defa en önemli özelliği açık fikirli olmaları gerekir. Sonuçta yazılım geliştirme mantıklarını değiştireceksiniz insanlar zaten en ufak bir değişikliğe bile karşı çıkarken, eski tabuları yıkmak bu şekilde daha efektif çalışılır daha verimli olunur demek hiç ama hiç kolay değil.En basitinden Test Driven Development yapmak istiyorsunuz. Herhangi bir developera söyleyin bakalım test yazacaksın size ne diyecek. “Testleri developer yazarmı,vakit kaybı,…”.Ayrıca hadi test yazacağını kabul etti diyelim. Sadece süreci uygulamak  için yazılan testin ne faydası olacak? Testlerin efektif bir şekilde yazılım geri dönüşünü sağlayacak kıvama gelmesi benim deneyimlerim kadarıyla hiçde kolay değil. En azından ben 2 senedir TDD ile yazılım geliştiriyorum yazdığım testler daha yeni yeni istediğim kıvama ulaşıyor.Agile yöntemler ne kadar alt yapıdan bağımsız uygulanabilir varsayılsada değişime kolay adapte olabilmek için Agile mühendislik pratiklerini uygulamak gerekiyor. OOP,Design Patterns,Principles,SOLID.. bunlardan hiç bahsetmedim.

Bu yüzden faydasını yaşayarak gördüğüm Çevik süreçler dahi olsa içerisinde onu uygulayacak insanlar olmadıkça süreçlerin tek başına başarılı olması çok zor. Çevik takımlar iyi derece motive olmuş, her zaman daha iyisini arayan,istekli, açık fikirli, sürekli öğrenen insanlardan oluşur. Herhangi bir süreci işlettiğiniz bir firmada bu tarz insanlar içeren bir takımın sizce başarılı olma olasılığı nedir? Büyük ihtimalle başarılı olacaklardır. Süreçler ne kadar iyi tanımlanmış olursa olsun size bir noktaya kadar yardım edebilirler. Fakat başarının büyük bir bölümü gerçekten iyi işler yapmaya çalışan takım üyelerinden gelecektir.

Kalitesiz, daha iyiyi aramayan elemanlardan oluşan bir takımı istediğiniz süreçle yönetirseniz yönetin sonuç büyük ihtimalle başarısızlık olacaktır. Bu yüzden süreçlere yapılan yatırımın yarısı kadarını insanlara yatırmanın, kaliteli bir ekip kurmanın süreçlerden daha önemli olduğuna inanıyorum. Ve son olarak da Süreçler yerine insanlar diyerek kapaytıyorum.


Oct 15 2008

Değişim Açlığı , IBM Yazılım Zirvesi 2008

Tag: Agile,GenelM. Cihat Altuntaş @ 4:49 pm

Bugün IBM 2008 Yazılım zirvesindeydim. Aslında bu tarz zirveler genelde ürün tanıtımı ve şov olarak geçtiği için pek hoşlanmam. Fakat bu zirvede ilgimi birşey çekti o da zirvenin ana sloganıydı.Slogan Değişim Açlığı olarak belirlenmiş. İlk açılış konuşmasında da slaytlarda yazılım sektöründeki gidişatı göstermiş ve de değişime adapte olabilmenin artık bir seçenek değil zorunluluk olacağına değinilmiş. Geleceğin firmasının değişimi bir fırsat olarak görüp daha iyi işler çıkarıp müşteriyi daha memnun etmek için kullanması gerektiğini söylemiş.

Dikkatimi çeken başka bir konu ise açılış konuşmasında grafiklerde ve konuşmada “Ne kadar iyi teknolojiye sahip olursanız olun, bu teknolojisi kullanarak iyi işler ortaya çıkaracak olan insanlardır” kavramının yer almasıydı. Ve nitelikli ve istekli bireylere ihtiyacın gittikçe artan bir grafiğe sahip olduğunu şekiller ile gösteriyordu. Birçok tanıtımda da takım ve insan faktörünün projelerde ne kadar önemli olduğundan bahsedildi.Biz önceden beri diyoruz ama sakalımız yokki dinletelim :)

Bu kadar çok değişim ve insan faktörü üzerinde durulması beni neden ilgilendirdi ondan bahsedeyim. Öncelikle daha önce okuduğum Extreme Programming Explained: Embrace Change kitabı gözümün önüne geldi diyebilirim. Sizinde okumanızı öneririm Extreme Programming’in kurucularından Kent Beck oldukça güzel anlatmış. Kitabın başlığıda gördüğünüz gibi Değişimi Benimsemek  olarak konulmuş. Ayrıca Agile yöntemlerin temel felsefesi olan Individuals and interactions over processes and tools yani araçlar ve süreçler yerine bireyler ve iletişimin aslında konferansın ana konularından biri olmasıydı. Aslında IBM zirvesindeki temel konu Extreme Programming ve Agile yöntemler ile oldukça yakından alakalı. Çünkü Agile yöntemlerin temelinde kitabın başlığından da anlayabileceğiniz gibi değişimi benimsemek, ondan korkarak ya da kaçarak değilde onu müşteriyi daha memnun etmek için kullanılan bir araç olarak görmesi, efektif motive olan takımlardan oluşması ve projeyi asıl başarılı kılan faktörün bu olduğu var. Bu bakımdan IBM gibi genelde RUP tarzı ağır yazılım süreçlerinin daha ağır bastığı bir firmanın bu sloganı benimsemesi hoşuma gitti.

Konuşmanın diğer kısımlarında da IBM Jazz adlı ürününü tanıttı. Tabi konunun başlığından da gördüğünüz gibi şaşırmamak gerekli. Jazz ürün ailesi ile Agile yöntemlere uygun yazılım geliştirmenin nasıl kolaylaşacağından oldukça bahsedildi. Sonuçta zirveden benim çıkardığım artık Agile yöntemlerin gittikçe kabul gördüğü ve faydalarının ortaya çıktığı, IBM gibi büyük firmalar tarafından da kabul edilmiş durumda. Bu bakımdan Agile felsese belirli araçları kullanmak olmamasına rağmen en azından Türkiye’de firmaların “IBM gibi biri bunu tanıtıyorsa buna yatırım yapıyorsa bundan bir hikmet vardır” demesine vesile olabilir. Bu bakımdan sektörün Türkiye’de artık yavaş yavaş Agile tarzı yöntemler ile kaliteyi ve müşteri memnuniyetini arttırmasını ümit ediyorum.


Jun 11 2008

Baker’s Dozen

Tag: AgileM. Cihat Altuntaş @ 4:23 pm

baker - Copy

Bugün nedense posterlere taktım kafayı o yüzden daha önceden mutlaka göndermeliyim diye düşündüğüm posteri uzun zaman sonra bulup gönderme fırsatı bulabilidim. Posterde Agile pratiklerin çok güzel özetini ve bu yazıda açıklamasını görüyorsunuz. Her masaüstünde arka plan olarak ya da  en azından geliştirme ortamınızda bir adet bulunması çok güzel olur bence. Çevirmekten benim gibi üşenenler için kısaca türkçe olarak çevireyim dedim.Yanlışlarım varsa kusura bakmayın :)

  • Ortak vizyon oluşturun
  • Sürece değil amaca odaklanın
  • Büyük düşünün küçük başlayın
  • Sabit bütçe,Sabit zaman,değişebilen proje kapsamı,asla kaliteden taviz verme
  • Çalışan kod herşeyden önemlidir
  • Müşterinin bakış açısından görün
  • Küçük kararlar verin
  • Detayların zamanla ortaya çıkmasına izin verin
  • Çalıştır,Doğru çalıştır, Hızlı çalıştır
  • Geribeslemeyle öğren,sürekli geliştir
  • Küçük takımlar oluşturun
  • Yeterli olmaktansa verimli olun

Jun 03 2008

Agile Manifesto

Tag: AgileM. Cihat Altuntaş @ 4:08 am

O kadar Agile yöntemler üzerinde konuşuruz ama asıl ilk yazılması gereken başlığı sona bırakmışım galiba. Çevik yöntemlerin özünü ustalarımız http://agilemanifesto.org/ adresinde bizim için çok iyi özetlemiş.

  • Individuals and interactions over processes and tools
  • Working software over comprehensive documentation
  • Customer collaboration over contract negotiation
  • Responding to change over following a plan

Sizi çevirme zahmetinden kurtarmak için Türkçesini yazacak olursak

  • Süreç ve araçlar yerine Bireyler ve İlişkiler
  • Kapsamlı dökümantasyon yerine Çalışan Yazılım
  • Kontrat görüşmeleri yerin Müşteri İle Birlikte Çalışma
  • Plan izleme yerine Değişikliğe Cevap Verme

Kalın harflerle vurguladığım yerler bir yazılım için başarının anahtarları diyebiliriz. Tabi bu anahtarları kullanıp kullanmamak bizim elimizde..


Dec 06 2007

Benim bilgisayarımda çalışıyor!…

Tag: Agile,GenelM. Cihat Altuntaş @ 7:06 pm

works-on-my-machine-stamped.pngCoding Horror’da gezinirken meşhur “It works on my machine” (benim bilgisayarımda çalışıyor) yazılım sendromuna ait güzel espirili bir dille yazılmış bu yazıyı okudum. Açıkça çok beğendim diyebilirim özellikle de sertifika amblemi oldukça hoştu:) İşyerinde bu amblemden ben dahil her arkadaşın masasına yapıştırmak lazımdı aslında.

Durumu hepiniz biliyorsunuz.Versiyon kontrol sisteminden kodu çekeriz, ardından üzerinde değişiklik yaparız, yeni özellik ekleriz sonra kendi bilgisayarımızda çalıştırırız.Büyük bir ihtimalle bizim makinamızda çalışacaktır. Fakat sürüm çıkardığımızda ya da ürün ortamına yazılımı sunduğumuzda işler bizim bilgisayarımızdaki gibi pürüzsüz olmayacaktır. Muhtemelen diğer bilgisayarlarda çalışmayacaktır.En azından mutlaka böyle bir durumla karşı karşıya gelmiştirsiniz.

Bu sertifikayı hak ettiğimi birçok defa hatırlıyorum. Örnek olarak en son çalıştığım Java kullanarak geliştirdiğimiz projede Windows XP üzerinde bütün geliştirme işlemlerini yaptık arından Linux üzerine geçtiğimizde dosya yolları ile alakalı,Java’nın Linux işletim sisteminde Windows XP’den bazı durumlarda farklı davranmasından dolayı birçok hata ile karşılaştırdık.Fakat geliştirme yaparken proje hepimizin bilgisayarında çalışıyordu.

Muhtemelen yazılım ekibinizde bu sertifikaya sahip yani sürüm çıkardığınızda çıkan problemler sonucunda “Fakat benim bilgisayarımda çalışıyor” diyen yazılımcı sayısı fazla ise geliştirme sürecinizde bir problem var demektir.Aslında genelde problem geliştirilen yazılımın test edilmemiş,desteklenen değişik platformlarda denenmemiş düzgün bir sürüm otomasyonuna sahip olmadığından kaynaklanır.Ayrıca genelde yazılımcının kendi bilgisayarında bütün kütüphaneler tam,veritabanı bağlantıları sorunsuz,herşey çalışır durumdadır. Fakat yazılımın asıl çalışacağı Server ya da kullanıcı makinasında bunlar olmayabilir.Bu yüzden yazılımı ayrı bir bilgisayarda test etmek her zaman daha faydalıdır. Burada Unit Test ve Integration Test’lerin iyi hazırlanmaması, otomatikleştirilmesi,Continuous Integration(Sürekli Bütünleştirme) sisteminin kurulması bu tarz problemlerin büyük ölçüde önüne geçer.Özellikle arka planda çalışan farklı platformlarda testleri çalıştırıp build işlemleri yapan bir Continuous Integration Server dertlerinize deva olabilir.

Mesela kendi başıma gelen problemlerin kaynağını düşündüğümde düzgün Integration Test’lere sahip olmaması, Continuous Integration yapılmaması,değişik platformlarda test edilmemesi olduğunu görüyorum.O yüzden geliştirdiğiniz yazılımı yayınlama sırasında saatlerinizi hatanın nerde olduğunu aramakla geçiriyorsanız bu kavramlara eğilmenin vakti gelmiş demektir..


Dec 01 2007

Yazılımda Basitliğin Önemi

Tag: Agile,Patterns,PrinciplesM. Cihat Altuntaş @ 4:22 pm

Herhalde biz yazılımcılar işleri zorlaştırmayı sevdiğimizden olsa gerek yazılım geliştirmede problemlerin çözümlerini karmaşıklaştırmada zorlaştırmada üzerimize yok. Aklıma okul yıllarından, profosyonel iş hayatımdan üzerinde çalıştığım birçok proje geldi.Özellikle okulda arkadaşlara ne kadar karmaşık zor kod yazdığımıza dair övünürdük. İşte şöyle bir kod yazdım bilmem kaç satır , içinde bilmem kaç milisaniye kısa süren sıralama algoritması kullandım.. diye uzayıp giderdi muhabbet. Kısa ve basit çözümler bulanlara kötü gözle bakılırdı .Yazılımcı adam basit şeyler yapmaz zor işlerin adamıdır değil mi?:).Bu yüzden problemleride zor çözüm yollarıyla halletmek iyi gelirdi.Tabi bu alışkanlıklar iş hayatında da peşimizi bırakmadı aynı muhabbetler uzun süre devam etti.

Şimdi kendi yazdığım kodları gözden geçiriyorum ve aynı kompleksliği görebiliyorum.Çok basit bir şekilde halledebileceğim şeyleri ne kadar gereksiz zora sokup uzatmışım, ne kadar karmaşık şekilde çözmüşüm hayret ediyorum.Tabi yıllar sonra yazılımcının zor problemleri kolay ve basit bir şekilde çözmesi gerektiğini anladım.Sebebi adı gibi çok basit. Basit çözüm anlaması basit, değiştirmesi basit, yönetilmesi basit olduğundan her zaman kompleks çözümden daha avantajlıdır. O halde işleri zorlaştırmanın karmaşıklaştırmanın hiçbir gereği yok.

Extreme Programming’in temel prensiplerinden olan Basitlik(Simplicity) yazılım geliştirmede büyük bir öneme sahip.Basitliği bir problemin en basit çözümü olarak düşünebiliriz.Kod için düşündüğümüzde belirli bir işi yapması gereken kodun en basit şekilde sonucu üretmesi, ya da yazılımın şuandaki gereksinimleri karşılayan en basit halde olması diyebiliriz.Aksi takdirde anlaşılması zor ,yönetilmesi zor, değiştirmesi zor gereksiz birçok karmaşıklık içeren yazılıma sahip oluruz buda akıl,ruh sağlığı ve iş hayatımızdaki mutluluğumuz için pekde iyi değildir.

Aşağıda daha önceden yazdığım bir kod parçasından örnek verirsem demek istediğimi kod için daha rahat anlayabilirsiniz.Bu arada kızmayın, nasıl bu kadar karmaşık yazdığıma bende şaşırıyorum ama sebebi sanırım bir aralar Design Patterns hastalığına tutulmamdı:)

interface PanType {
    static final String LEFT  ="PanLeft";
    static final String RIGHT ="PanRight";
    static final String UP    ="PanUp";
    static final String DOWN  ="PanDown";
}

interface IPanPoint {
    Point2D.Double getCenterPoint(int screenWidth,int screenHeight);
}

abstract class AbstractPanPoint implements IPanPoint{
    public static IPanPoint createInstance(String panType){
        if(panType.equals(PanType.LEFT))
            return new PanLeftPoint();
        else if(panType.equals(PanType.RIGHT))
            return new PanRightPoint();
        else if(panType.equals(PanType.UP))
            return new PanUpPoint();
        else if(panType.equals(PanType.DOWN))
            return new PanDownPoint();
        else
            throw new IllegalArgumentException();
    }

    public Point2D.Double getCenterPoint(int width,int height) {
        return new Point2D.Double(calculateX(width),calculateY(height));
    }

    abstract int calculateX(int screenWidth);
    abstract int calculateY(int screenHeight);
}

class PanDownPoint extends AbstractPanPoint{
    int calculateX(int width) {
        return width/ 2;
    }

    int calculateY(int height) {
        return (height / 2 + height / 6);
    }
}

class PanLeftPoint extends AbstractPanPoint{
    int calculateX(int width){
        return  (width/ 2) - (width/ 6);
    }

    int calculateY(int height){
        return (height /2);
    }
}

class PanRightPoint extends AbstractPanPoint{
    int calculateX(int width) {
        return  (width/ 2) + (width/ 6);
    }

    int calculateY(int height) {
        return (height /2);
    }
}

class PanUpPoint extends AbstractPanPoint{
    int calculateX(int width) {
        return (width/ 2);
    }

    int calculateY(int height) {
        return (height / 2) - (height / 6);
    }
}

public class MapModel
{
   //diğer metodlar ve alanlar.....
   public void pan(String panType) {
        IPanPoint panPoint = AbstractPanPoint.createInstance(panType);

        Point2D.Double mapPoint = panPoint.getCenterPoint(width,height);
        //diğer işlemler....
   }

}

Yukarıda gördüğünüz kod parçasının ne yaptığını fazla önemsemeyin.Yapılan şey kısaca sağ,sol,yukarı,aşağı yönlerine göre ekran büyüklüğü kullanılarak x,y değerlerini hesaplamak ve o değerlere göre bazı işlemler yapmak.Şimdi kodumuza şöyle bir bakalım.2 interface,1 abstract sınıf, 4 adet normal sınıf var. Ayrıca her sınıfta 2 metod,ayrıca 1 factory metodu var. Şimdi kullanılan Design Pattern’lara bakıyorum bol bol kullanmışız.1 adet Factory ,1 adet Template Method, 1 adet Strategy Pattern kullanmışız.(Ben neymişim be abi) Ama hemen kızmayın birde esneklik olarak baktığımızda baya iyi durumdayız. Kodumuz sonradan eklenebilecek durumlara karşı değişmeyecek. Tabi bu şekilde Design Pattern kullanmasak durum böyle olmazdı.Mesela ileride olabilecek kuzeybatı yönü hesaplaması için sadece AbstractPanPoint sınıfını extend edip ilgili metodu yazmamız birde Factory metoda eklememiz yeterli.MapModel sınıfı içinde hiçbir değişiklik yapmamıza gerek kalmadan yeni yönümüzü ekleyebiliriz.Fakat ileride böyle bir istek olacak mı?Büyük bir ihtimalle hayır.Olsa bile bugünden ileride gelebilecek istekleri aşırı kompleks düşünüp kodumuzu zorlaştırmanın anlamı yok.

Bu şekilde kodu yazmamızın hiçbir getirisi yok şuanda ilerisi için kodu daha esnek hale getirsekte karmaşıklığı sayesinde ileride değiştirmek daha zor olacak. Ayrıca 4 yönden başka durum olamayacak yani ilerisi içinde böyle bir değişiklik olacakmı onu bile bilmiyoruz. İleriyi düşünerek daha esnek yapalım derken gereksiz yere kodu karmaşıklaştırdığımızla kaldık.Ama bu arada süper iyi programcıyız bakın nasıl kompleks şekilde çözmüşüz problemi nasılda havalı Design Patternlar kullanmışız.:) Şimdi süper iyi programcı modundan çıkıp probleme daha basit gözle bakalım.Kodumuzu aşağıdaki gibi yeniden düzenleyelim.

public class MapModel{
//.........
    public static final String LEFT  ="PanLeft";
    public static final String RIGHT ="PanRight";
    public static final String UP    ="PanUp";
    public static final String DOWN  ="PanDown";

    public void pan(String panType) {
        Point2D.Double mapPoint ;

        if (panType.equals(LEFT)) {
            mapPoint = new Point2D.Double((width / 2) - (width / 6), (height / 2));
        } else if (panType.equals(RIGHT)) {
            mapPoint = new Point2D.Double((width / 2) + (width / 6), (height / 2));
        } else if (panType.equals(UP)) {
            mapPoint = new Point2D.Double((width / 2), (height / 2) - (height / 6));
        } else if (panType.equals(DOWN)) {
            mapPoint = new Point2D.Double(width / 2, (height / 2 + height / 6));
        }
        //nokta kullanılarak yapılan işlemler.......
    }

}

Gördüğünüz gibi eski karmaşık kodu aslında bu kadar basit birkaç if-else içeren kod ile halledebiliyoruz.Birçok sınıf,interface,gitti yerine birkaç satır kod kaldı. Ayrıca kullanılan Design Pattern’lar da kalktı.MapModel sınıfı belki geleceğe yönelik bir istekte değişecek fakat bugünün ihtiyaçlarını en basit şekilde karşılıyor. Anlaşılması öncekinden daha kolay ,yönetilmesi daha kolay vb…Gördüğünüz gibi basit şekilde problemi çözdük.

Basitlik sözde basit gibi gözüksede uygulamada kompleks problemler için basit çözümler üretmek gerçekten zordur.Özellikle yukarıdaki kod parçasında da gördüğünüz gibi Design Pattern gibi koda esneklik sağlayan ilerisi için yapılmış şeyler kodu oldukça zorlaştırmaktadır. Aynı şey bugünden karşımıza çıkmayan gereksiz performans optimizasyonu için de geçerli. Performans sıkıntısı çekmeden kod daha iyi çalışsın diye yapılan değişikliklerde kodu aynı şekilde karmaşıklaştırır.Bu yüzden kodu yazarken sadece bugünün isteklerini göze alıp geliştirmek önemli. Şahsen ben bazen bunu gelecek varsayımlara göre yukarıdaki gibi karmaşık kod geliştiriyordum ama hatalarımdan ders aldım diyebilirim.Özellikle Design Pattern gibi koda komplekslik katan kalıpları kullanırken dikkatli olmak önemli.Zaten Design Patterns kitabanın yazarlarından Eric Gamma’da bir sözünde Design Pattern’ların sadece Design acısı çekildiği zaman kullanılmasını öneriyor.O yüzden hepimizin asıl zor olan şeyi başarmak olan “zor problemlere basit çözümler bulmak” için çabalamasını tavsiye ediyorum.


Oct 30 2007

ALT.NET Fırtınası

Tag: AgileM. Cihat Altuntaş @ 6:57 am

Son dönemlerde yazılım dünyasından özellikle .NET cephesini kasıp kavuran ALT.NET’i özellikle takip ettiğim bloglarda görmeye başlamıştım. İlk başta yeni bir Microsoft teknolojisi diye düşünüp es geçsemde ardından gün geçtikçe hakkında daha çok yazı çıkınca okuyup ,araştırıp ne olduğunu öğrenmeye karar verdim.

Öğrendikten sonra aslında bildiğim şeylerin yeni bir isim altından .NET kullanan yazılımcılar için kılavuz niteliğinde özetlenmiş prensipler olduğunu gördüm. Kısaca özetlersek .NET yazılım geliştiricileri için Agile(Çevik) yazılım geliştirme prensiplerinin özetlenmiş hali diyebiliriz. İsmi ilk olarak ortaya atan Dave Laribee yazısında ALT.NET’i nasıl tanımladığını buradan görebilirsiniz. Yazarın bunu kullanmasının sebebi ise kelime anlamı olarak Alternative .NET olarak kısaltmak istemesi.

Bizde oradan biraz kopya çekip yazılanları türkçe olarak özetlersek, ALT.NET bir microsoft teknolojisi ya da herhangi bir araç, yazılım değil.Anti Microsoft, Microsoft dışındaki araçları kullanarak yazılım geliştirme hiç değil. Açık fikirli bir yazılım geliştirme felsefedir diyebiliriz. Kısaca sıralarsak

  • Eğer gözünüz sürekli dışarıda daha iyi yazılım geliştirmenin bir yöntemini araştırıyorsanız.
  • Eğer teknoloji gruplarınıda(Ruby,Java,Agile…) takip edip onların iyi özelliklerine adapte olmaya çalışıyorsanız
  • Eğer şuanki durumunuzdan memnun değilseniz, sürekli daha kaliteli işler yapma çabasındaysanız
  • Eğer işinizi kolaylaştıracak, sizi en iyi pratikleri uygulamanızda kolaylık sağlayacak araçları(Microsoft ya da değil farketmez) kullanıyorsanız (Resharper)

Kısacası size ALT.NET yazılım geliştirici diyebiliriz.

Aslında bunlar daha öncedende .NET topluğu dışında Java, Ruby, Agile.. topluluklar tarafındanda bilinen ve uygulanan şeylerdi.Burada soruna birazda değinmek istiyorum. Sorun .NET ve Microsoft cephesinin bu tarz Açık fikirli yaklaşımlara kapalı olmasıydı bu yüzden açık fikirli .NET yazılım geliştiricilerin böyle bir tanımı ortaya çıktı.

Kendi tecrübelerimden bahsedersem,Son iki senedir Java kullanarak yazılım geliştiriyorum ve bu son iki sene hariç .NET ilk çıktığından beri onu kullanarak yazılım geliştiriyorum diyebilirim.Okurken 2 sene yarı zamanlı .NET yazılım geliştirici olarak çalışmıştım. O zamandan da gördüğüm ve hala devam eden .NET yazılım geliştiricilerin diğer teknolojileri kullanmada, .NET, Microsoft dışındaki yenilikleri takip etmede,kaliteli yazılım geliştirmeyi sağlayacak Yazılım prensipleri, Agile,XP.. gibi geliştirme yöntemlerini takip etmede oldukça büyük eksikleri vardı. Açıkçası .NET bir araç değil amaç olarak görülüyordu diyebilirim. Bunu .NET developer olarak kendi yazılım takımımda beraber çalıştığım arkadaşlarımında çoğu yapıyordu diyebilirim. Bu yüzden ALT.NET aslında .NET geliştiricilerin eksikliğini kapatması için bir klavuz diyebiliriz.

Kendimden örnek vereyim şuanda Java ile yazılım geliştirmeme rağmen sürekli, .NET, Ruby ve diğer yazılım geliştirme topluluklarınıda takip etmeye çalışıyorum, .NET,Java yazılım geliştiricilerin bloglarını takip ediyorum,kısacası yazılım dünyasında benim daha iyi yazılım geliştirmemi ne sağlayacaksa onu bulmaya ondan yararlanmaya çalışıyorum. .NET, Java, Ruby.. sadece birer araç amaç çalışan müşteri isteklerini karşılayan kaliteli yazılım üretmek bu yüzden gözümüzün sürekli açık daha iyiyi arıyor olması gerektiğine inanıyorum. Eğer Java ya da Ruby ile yazılım geliştiriyor olsanız bile açık fikirli olmadıkça ALT.NET sizin içinde bir klavuz olmalı bunun için bu tanımı
geliştirip ALT.DEVELOPER diyelim ve hepimiz daha iyiyi arıyan yazılım geliştiriciler olalım..


Sep 16 2007

Yazılım Takımı Çalışma Ortamı

Tag: AgileM. Cihat Altuntaş @ 5:45 am

İş yerinde yeni çalışma ortamımıza geçen hafta taşınmışken bu konuya ait genel düşüncelerimi ve bu konuda tavsiye edilenleri,okuduklarımı,bildiklerimi yazayım dedim.

Genelde bir ayrıntı olarak görülebilir fakat yazılım takımının çalışma ortamının yapılan işin kalitesini üretkenliğini ve verimliliği önemli ölçüde etkilediği inkar edilemez. Özellikle Agile,XP,Scrum gibi yazılım geliştirme yöntemlerinde bu konunun üzerinde oldukça fazla duruluyor. Bu yöntemlerin temelinde iletişim ,takım vb. etkenler olduğu için haliyle takımın rahatını çalışma verimliliğini etkileyen çalışma ortamı da önemli oluyor.

Öncelikle bir önceki çalışma ortamımızdan bahsedeyim. Müşterinin yanında çalışıyorduk dolayısıyla bize tahsis edilen çalışma odasında çalışmak zorundaydık. Bütün takım büyük bir odanın içinde dağılmış durumdaydı.Odanın içinde herkes bir köşeyi kapmıştı. Ayrıca odanın ortasında koskoca kirişler vardı ve birbirini duymak ya da görmek imkansızdı. En çok hissettiğim önemli problemlerden biriyde iletişimdi bilgi paylaşmak ya da herhangi bir konuda beraber çalışmak için resmen odayı bir uçtan yarış atı gibi engelleri atlayarak geçiyorduk. Ayrıca herkes kendi kabini içine gömülü çalıştığı için kimin hangi problemle boğuştuğu ne yaptığı birbirinden hebersizdi.Sadece yanımızdaki arkadaşlar ile sürekli iletişim halindeydik.

Bunun aksine çevik(Agile,XP,Scrum..) yöntemlerde tavsiye edilen çalışma ortamı aşağıdaki gibi sıralanmış.

  • Işık, Hava, Doğa
    • İnsanların çalışması nefes alması fotosentez yapması :) için gerekli olan şartlar çalışmak için uygun ortamı oluşturmakla kalmayıp yavaşça takımın moralini ve motivasyonunu yükseltir.
  • Yerleşim
    • İnsanlar genellikle birbirini görecek yüzyüze iletişim halinde olacak şekilde yerleşim planı yapılmalıdır. Birbiriyle kale duvarı gibi ayrılmış kabin şeklinde masalar iletişimi azaltacağı için tavsiye edilmez.
  • Ergonomi
    • Rahat bir masa rahat bir koltuk fazla söz söylemeye gerek yok sanırım :)
  • Mahremiyet
    • Herkese ait özel bir alan yada kabin tahsis edilmesi takımdaki bireylerin ihtiyacı olduğunda özel telefon vs. görüşme yapabileceği alanla.
  • Kişisel Alanlar
    • Herkesin kendi çalışma ortamında kendine ait kart, çizim, çiçek, börtü böcek koyabileceği alanlar..
  • Ulaşılabilirlik
    • Çalışma ortamında herkesin rahatlıkla ulaşabileceği printer, çay kahve makinası ve diğer gerekli şeylerın olması
  • Gürültü
    • Takım sürekli iletişim halinde olacağı için (dikkatinizi çekerim sessiz çıt çıkmayan bir ortam değil) diğer çalışma grplarından birbirini rahatsız etmeyecek şekilde ayrılması

Aslında bütün maddelerde takım için nasıl daha iyi bir çalışma ortamı oluşturulur onun üzerinde duruluyor. iletişimi takımın, bireylerin motivasyonunu arttıracak şeyler tavsiye edilmiş.

Aşağıda XP123 sitesinde yayımlanmış çalışma ortamı fotoğraflardan birini görüyorsunuz .

team1.gif

Başarılı bir proje için iyi motive olmuş iyi iletişim halinde çalışan bir takım olmazsa olmazlardan biri olduğu kesin. Yöneticilere bu şekilde bir çalışma ortamına sahip olmak için istekte bulunmanın gerekli olduğuna inanıyorum. Ya da onların takımın verimliliğini arttırmak için bu tarz şeyleri yöneticilerin düşünmesini diliyorum….


Sep 08 2007

Yazılımda Bitirmenin Tanımı

Tag: AgileM. Cihat Altuntaş @ 1:42 pm

Agile (Çevik) yazılım ile alakalı bir blog takip ediyordum. Blogdaki bir yazıda yazılımda bitirmenin oldukça güzel tanımı yapılmış bende buraya aynen yazayım dedim.

Geliştirdiğimiz bir koda,modüle,yazılıma bitti dememiz için :

  • Unit testleri yazılmış
  • Müşteri tarafından onaylanmış
  • Kullanılabilirliği test edilmiş
  • Entegrasyon testleri yapılıp projeye entegre edilmiş
  • Dökümantasyonu yapılmış
  • Performans testi yapılmış
  • Diğer takım arkadaşları ile gözden geçirilmiş
  • Kod düzenlenmiş, okunabilir, tekrar içermeyen
  • Hata içermeyen

olması gerekir.


Next Page »