‘Yazılım’ Category

Scrum’a iyice alıştık

March 14th, 2010

ScrumMaster course at Barbaros Point Hotelİstanbul’daki ScrumMaster kursuna katılmamın üstünden 5 aya yakın bir süre geçti. Muhteşem bir adam, James O. Coplien, tarafından harika denebilecek bir eğitim aldık. ScrumMaster kursunu bir yana bırakırsak çevik yöntemlere olan ilgim ise çok daha eskisine dayanıyor.

Yaklaşık 10 yıldır profesyonel olarak bulunduğum yazılım sektöründe; geliştirici, analist ve proje yöneticisi olarak bir çok farklı proje içinde yer aldım. Bu projelerde yaşadıklarım, gördüklerim ve duyduklarım bir çok şey öğrenmeme vesile oldu.

Müşterinin ihtiyaç duyduğu özelliklerin yeterince iyi tespit edilememesiyle başlayan ve bir dizi planlama hatasıyla devam eden başarısız projeleri hepimiz duymuşuzdur. Zamanında teslim edilemeyen, müşterinin işine yaramayan, beklenen değeri yaratamayan ve planlandığından çok daha pahalıya patlayan bu projeler hem müşterinin hem de yazılımı üreten firmanın kimi zaman çok ciddi maddi kayıplara uğramasına yol açabilir. Hatta bazen kaybedilen prestij kaybedilen paradan daha büyük olabilir.

Kişisel olarak neler yapabileceğimi düşündüğümde şuna karar verdim: dünya standartlarını yakalamak ve yüksek kalitede ürün geliştirebilmek için bazı farkındalıklara sahip olmak lazım. Müşterinin beklentilerini anlamak, paydaşlar için değerli bir ürün ortaya koyabilmek ve başlangıcından teslimatına kadar yüksek kalitesi bir ürün ortaya koyabilmek için bazı pratikleri sıkı sıkıya uygulamak, tekrarlamak, ölçmek ve beceri setini sürekli geliştirmek gerekiyor. Çevik yöntemler de tam bu noktada karşıma çıktı.

Scrum‘da karar kıldım çünkü hem oldukça iyi tanımlanmış pratiklere ve prensiplere sahip hem de herkes tarafından anlaşılabilecek kadar basite indirgenmiş.Ve ayrıca çok büyük bir topluluk tarafından destekleniyor ve gerçek projelerde  yüksek başarı oranıyla kullanılıyor.

Scrum

Scrum

Biz de Starsale‘de bir kaç farklı projede Scrum pratiklerini uygulamaya devam ediyoruz. Çok açık bir şekilde şunu söyleyebilirim ki Scrum uygulamaya başladığımız günden beri neyi, ne zaman, ne sıklıkla ve nasıl yapacağımızı çok daha iyi biliyor  ve ürünlerimizi çok daha başarıyla yönetebiliyoruz.

Scrum Alliance profilim : http://www.scrumalliance.org/profiles/76810-erol-kabaday
Kursu düzenleyen firma : http://www.acm-software.com

Unicode değişken adları

July 20th, 2008

Yine ilginç bir yazıyla beraberiz! [demeyi çok isterdim]. Bu yazıda çok fazla teknik detaya girmeden unicode değişkenler hakkında bilgi vereceğim.

Yıllar önce bir mühendislik öğrencisiyken, değişken adları konusunda uymam gereken bir kaç katı kural öğrenmiştim. Bunlardan biri değişken adlarında kesinlikle Türkçe karakter kullanmamaktı. ( Bu çok normal bir kuraldı çünkü derleyiciler ve yorumlayıcılar henüz bizim dilimizi bilmiyorlardı ;- ) ) ş, ı, ğ, ö, ü, ç gibi harfleri ne editör kabul ediyordu ne de derleyici.
Geride kalan yıllarda, hem dilimiz hem elimiz yarı Türkçe yarı İngilizce kırma bir teknik dile alıştı iyice. Çoğumuz eciş bücüş / yarı ingilizce yarı türkçe değişken adları yaratır olduk. Açıkçası buna mecburduk.
Zaten uluslararası şirketlerde çalışan bir geliştiriciyseniz büyük bir ihtimalle kodlama kurallarınızda (code conventions) değişken adlarının ingilizce olacağı belirtilmiştir. İş arkadaşınızın bir Çinli olduğunu ve değişken adlarını Çince yarattığını düşünsenize. Allah korusun!
Her neyse, asıl konumuza gelirsek; teknik dilbilimciler çok çalıştılar ve neredeyse tüm yazılımlara dünyanın tüm dillerini öğrettiler. Javascript’te de 1.5 sürümünden itibaren unicode desteği eklendi ve artık isteyen herkes değişken adlarını istediği herhangi bir dilde yaratabilir.
Denemesi bedava:
var öçğüış = "ben bir Türkçe değişkenim";
alert(öçğüış);
Son söz
Javascript’te değişken adı yaratırken uymanız gereken kuralları da belirterek yazımızı sonlandıralım.
  • Değişken adları rakamla başlayamaz, ( 99Village, 7Seven, 6699 kimi değişken adları geçersizdir )
  • Değişken adları, sadece [a-z A-Z] harfleri, [0-9] rakamları, $ ve _ (alt çizgi) karakterini içerebilir, ($Yami, _wallColor, $_$, $900  gibi değişken adları geçerlidir)
  • Boşluk içeremez,
  • Anahtar kelimeler (reserved keywords) değişken adı olarak kullanılamaz,
  • Değişken adları büyük-küçük duyarlıdır. Abc ve aBc değişkenleri iki ayrı değişkendir,
  • Unicode karakterler kullanılabilir. Çince ve Korece bile :- )
Kim bilir belki içinizden birileri bunu beğenir ve bundan böyle Türkçe değişkenler kullanmak ister. Kalın sağlıcakla!

IE’de string işlemlerinizi hızlandırın

July 19th, 2008
String işlemleri, javascript programcılarının en sık yaptığı işlemlerdendir. En çokta bir nesneyi ya da sorgudan gelen veriyi serileştirmek gerektiğinde çeşitli string operatörlerine ve metodlarına başvurulur.
+= operatörü

Oldukça kullanışlı ve pratik bir operatördür. İki veya daha çok string veriyi birleştirmede kullanılabilir. Ama bir gerçekte vardır ki bu operatörü kullanan bir çok programcı performansın nasıl etkileneceğini bilmemektedir. ( IE’deki performans, göz ardı edilemeyecek kadar kötü! )
Javascript’teki string işlemlerini, motorun (javascript-engine) içinde bulunan global String nesnesi yürütür. Yaratılmış her metin aslında arka planda geçici bir String nesnesi haline getirilir. Ve işi bitince çöp toplayıcısı (garbage collector – gc) bu nesneyi bellekten siler.
var metinTutucu1 = "abcdefg";
var metinTutucu2 = new String("abcdefg");
Genelde birinci yolu tercih etmemizin nedeni pratik ve kolay anlaşılır olması. Ama isteyen gönül rahatlığıyla ikinciyi de kullanabilir.
Her metin aslında arka planda geçici bir String nesnesi haline getirilir demiştik. Bu sayede; String nesnesine ait metodların hepsini herhangi bir metnin üstüne direkt uygulayabiliriz.
alert("abcdefg".length);
Yukarıdaki satır bize 7 sonucu verecektir.
var metinTutucu = "bir";
metinTutucu += "iki";
metinTutucu += "üç";
metinTutucu += "dört";
alert(metinTutucu); // ekranda birikiüçdört uyarısını verir
+= operatörü kullanımı kolay olmakla beraber belleği en kötü kullanan, masraflı operatörlerden de biridir. Yukarıdaki 4 satırlık kod için bellekte 4 farklı yer kaplanır. Her bir += işleminden sonra bellekte yeni bir alan yaratılır ve yeni metin bu alanda tutulur. Bir önceki bellek alanı ise çöp toplayıcı tarafından silinmek üzere işaretlenir. Ama çöp toplayıcı biz isteyince gelip temizlik yapan bir hizmetçi olmadığı için bellekte bıraktığımız çöpleri ne zaman toplayacağını önceden kestiremeyiz.
Durum böyle olunca da, += operatörü nedeniyle bellekte bir çok yeni alan yaratmak ve bunların en sonuncusu hariç geride kalan bütün alanları çöp olarak bellekte bırakmamız gerekiyor. İşte bu nedenle += operatörü, büyük döngüler içinde kullanılmaya uygun olmayan, hep daha fazlasını isteyen şımarığın tekidir. Yolda gördüğü her şeyi elllediği ve istediği için de onunla seyahat etmek bazen çook ama çook sıkıcı ve yavaştır.
Ama sakın yanlış anlaşılmasın. Az sayıda string birleştirme işi yapılacaksa hiç çekinmeden += operatörünü kullanabilirsiniz. Basitlik her zaman düsturumuz olmalı. (Keep it simple stupid – Kiss)
Çözüm : Array.join() metodu
Özellikle büyük döngüler için çalışacaksanız ve string birleştirme işlemi yapacaksanız oldukça idealdir. Bütün browserlerde hızlı çalışır.
var tmpArray = [];

tmpArray.push("bir")
tmpArray.push("iki");
tmpArray.push("üç");
tmpArray.push("dört");
tmpArray.join("");
Birazdan göreceğiniz, tarayıcılara göre hız kıyaslaması sizi çok şaşırtacak. IE geliştirme takımı yine çuvallamış durumda!

Test Kodlarımız

5000 çevrimlik bir döngü oluşturdum ve her iki yöntemin ne kadar süre aldığını ölçtüm. Döngülerin her birini 50 kere çalıştırarak, her bir tarayıcı için en uzun, en kısa ve ortalama süreyi tespit ettim.
Kıyaslama sonuçları

+= IE 7.0 FF 3.0.1 Opera 9.51 Safari 3.1.2
Toplam süre 3.967sn 0.122sn 0.109sn 0.203sn
En uzun süre 0.094sn 0.005sn 0.016sn 0.016sn
En kısa süre 0.062sn 0.002sn 0sn 0sn
Ortalama süre 0.079 0.002sn 0.002sn 0.004sn
Array.join() IE 7.0 FF 3.0.1 Opera 9.51 Safari 3.1.2
Toplam süre 0.719sn 0.160sn 0.453sn 0.141sn
En uzun süre 0.031sn 0.005sn 0.016sn 0.016sn
En kısa süre 0sn 0.002sn 0sn 0sn
Ortalama süre 0.014sn 0.003sn 0.009sn 0.003sn
Sonuç olarak:
Safari ve Firefox neredeyse iki yöntemde de çok hızlı. Aradaki hız farkları göz ardı edilebilir. Dolayısıyla canımız hangi yöntemi isterse onu kullanabiliriz.
Opera ise ilginç bir şekilde += operatörünü kullandığımız birinci yöntemde daha başarılı. Array.join() yöntemindeki hızı, ilkine göre %300 yavaş.
IE’nin durumu tabloda çok açık ve net olarak görülüyor. İlk yöntemde neredeyse 4 saniyeye varan bir yavaşlık söz konusu. İkinci yöntemde kendini toparlıyor ama yine de diğerlerinin yanına bile yaklaşamıyor.
Javascript programcılarının hepsi IE’de karşılaştığımız bu problemi bilmeli ve önceden önlem alabilmeli. Ayrıca IE geliştirme takımı da artık bu tarz can sıkıcı problemleri gidermeli diye düşünüyorum. Kendinize iyi bakın ve kodlarken eğlenmeyi unutmayın.
Ayrıca inceleyin:

IE’deki Array.indexOf problemi

July 18th, 2008

Javascript ile uğraşırken hepimiz mutlaka en az bir kere, bir dizinin içinde aradığımız bir değerin olup olmadığını kontrol etme ihtiyacı hissetmişizdir.

Herkesin aklına ilk indexOf metodu gelir doğal olarak. Ama nedense diğer bir çok programlama dilinden aşina olduğumuz bu metod Internet Explorer takımının aklına gelmemiş.

Firefox, opera ve safari tarafından desteklenen ve javascript motorlarına dahil etmiş oldukları indexOf methodu IE motoruna eklenmemiş ne yazık ki. Bu nedenle yazmış olduğunuz kod firefox, opera ve safari’de çalışırken IE’nin hiç bir sürümünde (IE7′de bile) çalışmayacak.

Ama korkmayın :-) Javascript burada da imdadımıza yetişiyor. Javascript’te bulunan temel Array sınıfını prototype ile genişleterek kodumuzun IE’de de sorunsuz çalışmasını sağlayabiliriz. Size iki alternatif kod aktaracağım. Herhangi birini kullanmakta serbestsiniz.

İlk önce Firefox’un kendi motorunda da kullanmış olduğu kodu görelim:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

Veya aşağıdaki gibi daha basit bir kod kullanabiliriz:

if(!Array.indexOf){

      Array.prototype.indexOf = function(s){
         for(var i = 0; i < this.length; i++)
            if(this[i] === s) return i;

         return -1;
      }
   }

Yukarıdaki kodlardan herhangi birini javascript kodunuza dahil ettiğinizde, kodunuz artık browser ayrımı yapmadan çalışacaktır.

    var myArray = ["1","2","3","4"];
    alert(myArray.indexOf("3")); // Bütün browserler de 2 değerini verir.
Önemli not : Her iki metod Firefox, IE, Safari ve Opera’da test edilmiş ve testi başarıyla geçmişlerdir.
Ayrıca inceleyin:

Kendi Ajax çatımızı/kütüphanemizi nasıl yaratırız?

February 28th, 2007

Programcılar ve yazılım geliştiriciler tarafından yıllardır üvey evlat muamelesi gören javascript‘in son zamanlardaki inanılmaz yükselişini hepimiz yakından takip ediyoruz. Artık hepimiz harıl harıl ajax öğreniyoruz çünkü ajax ve arkasından gelecek benzer teknolojilerin önümüzdeki 5-10 yıllık geleceğe hükmedeceği apaçık ortada. Ben de bunlardan biriyim. Neredeyse son 2 ayımı bu işe adamış durumdayım. Ve emin olun daha da devam edecek. Keşke ajax kendi içinde tek bir teknolojiyi barındırsa da hemen yalasak yutsak. Ama öyle değil! ( İyiki de değil )

Javascript öyle yetenekli bir dil haline gelmiş ki gözlerime inanamadım. Bunu daha önce farkedemeyip ,javascripti sadece açılır menü veya form validation yapmak için kullanmak dışında daha ileri seviyede neden kullanmadım!? Kızıyorum kendime…

İnternette küçük bir araştırmayla en az 5-6 tane javascript veya ajax çatısına rastlamanız mümkün. Bu kütüphanelerin hepsini inceledim ve javascripti ileri seviyede nasıl kullandıklarını öğrenmeye çalıştım. Zaten kendi kütüphanemizi yazmak için yapılması gereken ilk şey Javascript dilindeki yazımsal yenilikleri öğrenmek olacaktır. Çünkü alet çantamızdaki en önemli araç şu an için o. Ardından Döküman Nesne Modeli’nin işleyişini öğrenmek lazım. Ve elimizdeki bu iki aracı (Javascript ve DOM) bir arada kullanabilmeyi öğrenmek için bol bol pratik yapmak ve bilgimizi pekiştirmek gerekecek. Bu arada sakın acele edeyim demeyin. Bu DOM var ya, çok sorun çıkartacak başınıza. Browerler arası uyuşmazlık nedeniyle bir sürü Dom özelliğinde çift dikiş hatta bazen 3 dikiş atmanız gerekecek. En çok kullanılan browserler olarak IE, FirefoxOpera ve Safari’yi kabul ederek tüm çalışmalarımızı bunlara göre genişletmeniz sizin için iyi olacaktır.

Javascript’i ve Dom’u bitirdiyseniz işte size XMLHttpRequest nesnesi! Yeni nesil browserlerin hepsi tarafından desteklenen bu nesne sayesinde ajax kardeşimiz hayat bulmaktadır. Bu nesne sayesinde sayfanın yeniden yüklenmesine gerek kalmadan uzaktaki server ile irtibata geçiyor ve ilgili işlemleri yaptırabiliyoruz. Yaptığımız bu işlemler; bize bir sonuç döndüren türde işlemler olabileceği gibi hiç bir veri döndürmeyen ve sadece veritabanından veri silme gibi işlemlerde olabiliyor. ( Bu noktayı lütfen aklınızda tutun. Birazdan ajax yöntemindeki son halkayı da sizlere açıklayacağım )

Varsayalım ki biz veritabanına bir sorgu yolladık ve bu sorgunun sonucunu da ,sayfa yeniden yüklenmeden, sayfanın istediğimiz herhangi bir yerinde göstermek istedik. O zaman ne yapacağız?

İşte burada devreye XML veya Json giriyor. Serverde yapılan işlemler sonrasında geriye döndürülen verinin ya Xml ya Json ya da normal metin formatında olması gerekiyor. Dönen veri XMLHttpRequest nesnesinin responseText veya responseXml özelliğinde tutuluyor ve bizim onu alıp sayfanın ilgili yerlerine yazdırmamızı bekliyor.

Peki bu yazdırma işlemini kim yapıyor? Tabi ki javascript ve Dom. Javascripti kullanarak Dom ile hiyerarşiye oturtulmuş tüm nesne ve elemanlara ulaşıp içeriklerinde oynama yapabiliriz. Ve tüm bunlar yapılırken sayfamızın kılını kıpırdatmasına bile gerek yoktur.

Buraya kadar anlattıklarımızı özetlersek. Kendimize ait bir ajax/javascript kütüphanesi/çatısı yazmak istiyorsak aşağıda sıraladığım teknolojilerin hepsine hakim olmalıyız:

  1. Javascript
  2. Dom
  3. XMLHttpRequest nesnesi
  4. Xml
  5. Json

Bunların her biri kendi içinde bir derya. Bu nedenle sakın fazla düşünüp treni kaçırmayın. Hemen başlayın birinci seçenekten.

Şansınız bol olsun ;)

Kabus dolu CSS günleri

November 10th, 2006

Starsale‘de cumartesi eğitim günüdür. Son 4 eğitimde xhtml ve css üstüne yoğunlaştık. Ve bir kaç eğitim daha bu böyle sürecek sanırım. Hiçte dışarıdan göründüğü gibi kolay değilmiş, tasarımı temiz bir Css’le buluşturmak.

DIV elementinin sayfa içindeki pozisyonu konusunda ciddi sıkıntılarım var. Bir türlü kontrol edemiyorum bu elementi. Float, clear, overflow, position gibi özellikleri çok daha iyi öğrenmem gerekiyor. Tabi benim gibi bu işe soyunan herkesin bunları iyice anlaması lazım. Bu da bol bol örnek yapmakla olabilir.

Elementlerin site içindeki yerleşimi esnasında yaşanan zorluklar tablosuz tasarımın en büyük dezavantajı olsa gerek. Ama tüm bunlara rağmen bu işin ucunu bırakma niyetinde değilim. Önemli değil, biraz daha uzun zamana yayılsın öğrenmek.

Belki “öğrenmene ne gerek var, bir çok sitede yapılmışı var, onları kullan” diyenler olabilir. Fakat bu tarz bir çalışma beni ne kadar tatmin edebilir ki. Önce kendim anlayıp yazabilmeliyim aynı kodları ki yaptığım işten keyif alayım ve olası sorunları kolayca giderebileyim. Değil mi?

SEO Powered by Platinum SEO from Techblissonline