şükela:  tümü | bugün sorunsallar (2)
693 entry daha
  • yıllarca strongly-typed diller kullanıp ardından javascript'e geçen birisi olarak bayağı eleştirmiştim kendisini. iş değişikliği sebebiyle java/c# kullanılan bir ortamdan javascript'e geçiş yapınca, insanın gözüne ilk olarak eksileri çarpıyor. type safety, oop eksikliği, module import yapısı, gereğinden fazla esnek olması, hatayı farkettirmemeye elverişli yapısı vs vs derken, en ufak bir hatada "ya işte javascript böyle dandik", "böyle dil olmaz", "amma iğrenç bir dil bu ya!", "10 günde tasarlanmış bu kadar olur işte"şeklinde kötülediğim zamanlar çok oldu. yıllarca profesyonel olarak kullandıktan sonra, bugün vardığım noktada, kendisi hakkında söyleyebileceğim tek şek "sorunları var ama gayet etkili bir dil" olur. bunun sebebi, çok açık şekilde, bu dil ile yeteri süre içli dışı olup, kullanım kolaylıklarına alışıp, ne yapılıp ne yapılamayacağını -belli bir ölçüde- farkında olmamdır. kısacası; deneyim.

    konuyla ilgili deneyim sahibi ya da bilgili olmak önemli çünkü javascript'in de her dilde olduğu gibi bir convention'ı, kullanırken yapılması ve yapılmaması gereken uygulamaları var. bunları öğrenip, neyin ne amaçla yapıldığını bilerek ilerlemek, dili etkili kullanma açısından belli bir öneme sahip. tabii ki konu javascript olunca bu önem katlanarak artıyor. sebebi ise javascript'in diğer dillere göre çok daha esnek bir dile sahip olması (hem iyi hem kötü anlamda). iş böyle olunca da, belli konularda yüzeysel bilgi sahibi olunmasına rağmen, o alanda kodlamaya devam edince de hataya elverişli, logic error içeren kodlar ortaya çıkıyor. ortamda adam akıllı bir code analysis tool yoksa da, compilation/syntax error falan almadan, hatalı kod production ortamına girebiliyor, ilerde baş ağrıtabiliyor.

    this.number = 5;
    settimeout(function(){console.log(this.number);}, 10);
    //>> undefined

    ya da

    for(let i=0;array.length;i++){
    //my first endless loop
    }

    javascript'in esnek yapısının iyi yönü de var elbette; dilin bilinçli kullanıldığı durumda, hatırı sayılır miktarda kullanım kolaylığı sağlıyor olması. genelde pek çok scripting dilinin sahip olduğu weak typing'i bu durumun dışında tutuyorum tabii. hayır, kastettiğim şey, dilin minimal dizaynından kaynaklı -bazıları büyük ihtimalle farkedilmeden ortaya çıkan- bir takım syntactic sugar'lar (ki birisi bunların misuse olduğunu iddia ederse kabul ederim). aynı şekilde, başka bir dilden gelip de javascript okumaya başlayınca bazı kullanımlar ilk bakışta garip geliyor ve "bu ne ya?" gibi tepkilerle kodu anlamaya çalışıyorsunuz. ancak, kullanmaya başlayınca da, belli başlı kodlamaları kısalttığı için insanın hoşuna gitmeye başlıyorlar. ancak bunun kötü tarafı da var: başla dillere geçiş yapınca, farkında olmadan kullanıp logic error'lara sebebiyet verebiliyorsunuz. code review'lar de orada devreye giriyor işte.

    //default value initialization
    let name= inputstring || defaultname;
    // java: inputstring == null ? defaultname : defaultname;

    //method execution without type checking
    object.method_which_may_not_exist && object.method_which_may_not_exist();
    //java: if(object instanceof someclass) object.method_which_may_not_exist();

    (yukarıdaki örnek aynı zamanda kötü bir dizayn örneği tabii. (bkz: polymorphism))

    //null + undefined check
    let isempty= !object;
    //java: boolean isempty = object == null;

    son önemli nokta ise dilin sahip olduğu yetkinlik. javascript, bilindiği gibi, yaklaşık 25 yıl önce, web siteleri için client-side programming amacıyla ortaya çıkmış basit bir dil. kolaylığı ve yüksek hata toleransı sebebiyle de hızla popüler hale gelip bir web sitesi için vazgeçilmez hale gelmiş. ardından çeşitli spesifikasyonlarla mümkün olduğunca standartlaştırılmaya çalışılmış (bkz: ecmascript). günümüzde ise kullanımı frontend'e ek olarak, nodejs gibi teknolojiler sayesinde backend tarafında da hızlı bir şekilde yaygınlaşıyor, kullanıldığı alanlar arttıkça artıyor, yerini sağlamlaştırdıkça sağlamlaştırıyor; tıpkı ipv4 ya da html gibi bir türlü terkedilemeyen teknoloji standartları gibi...

    yeni bir projeye başlama aşamasında, programcı, ne yapmayı amaçladığını, projenin zaman gereksinimini, ileriki aşamalarını, performans gereksinimini vs. iyi analiz edip dil ve teknoloji seçimini ona göre karar vermeli. bana göre, javascript her ne kadar küçük/orta çaplı projeler için kullanılabilir bir yapıda olsa da, proje büyüdükçe, takımdaki programcı sayısı arttıkça weakly-typed bir dilden strongly-typed bir dile geçiş yapma ihtiyacı artıyor, her ne kadar projenin dökümantasyonu iyi bir şekilde yapılıp, konunun hakimi bir ide kullanılsa da. bu durumda, client-side için typescript kullanımı değerlendirilebilir (javascript'in browserlar tarafından desteklenen yaygın bir alternatifi yok ne de olsa).

    server-side'a gelince işler farklı. ortada onlarca hatta yüzlerce alternatif var. ilk kez programlamaya javascript ile başlayıp da, server tarafına gelince "javascript kullanılabiliyorsa öyle yapalım" diyerek yola nodejs ile devam etme olayının yaygın olduğunu düşünmek sanırım pek yanlış olmaz. frontend'e göre hata toleransının çok daha düşük olması gereken backend kısmında (sebebini açıklamaya gerek yoktur herhalde), javascript tercih edilecekse 2 hatta 3 kere düşünülmeli, adam akıllı bir risk analizi yapılmalı. konuyla ilgili fikrimi ifade etmem gerekirse: küçük projeler için backend tarafında kullanılır ama büyüme potensiyeli olan bir projeyi kendisine emanet etmem.

    toparlamak gerekirse, javascript, ilk görüşte kötü gibi yorumlanan ancak deneyim arttıkça kıymeti anlaşılan, özellikle frontend tarafında (projenin ciddiyetine göre) bir takım kolaylıklar sağlayan hoş bir dil. proje ve codebase büyüdükçe çeşitli nedenlerden ötürü*** daha strict bir dil arayışı başlıyor. ancak, bu taraftaki browserlar yüzünden kısıtlı: typescript gibi javascript'e compile edilen kısıtlı alternatifleri var. backend tarafında gelince de, dil tercihi, projenin ihtiyaçlarına ve sahip olunan problemin çözümüne göre yapılmalı; javascript dünyanın en iyi dili (oha) olarak yorumlandığı için değil.

    öte yandan, ecmascript de gün geliştikçe gelişiyor. bundan 2-3 sonra tutup da "backend'de javascript'ten başkasını kullanmam" falan da diyebilirim (umarım demem ama, yok artık).