Yaptığım projelerde, süreçleri, işlemleri birbiri ile güzelce anlaşabilecek şekilde yapmaya gayret ederim. Birbirleri
ile tam bir otomasyon ile anlaşamayan her bir süreç ileride sorun çıkarıp, projenin aksamasına sebep olabilir. Bununla
birlikte her çıkan sorun bir geriye dönük ilgi gerektirerek ek maliyet çıkardığı istenmeyen bir durum oluşturur.
Bu yüzden projeleri kodlarken kullandığım araçları seçerken
biraz “kıl” davranırım.
Kullanılan araç bana hız kazandırıyor mu ? Yeni bir versiyonu çıktığında geçmişe yönelik desteği nasıl ? Bir sorun
çıktığında bu sorunu google araması ile çözüme ulaşabiliyor muyum ? Kim tarafından geliştiriliyor ? canı istediği zaman
commit yapan birisi tarafından mı geliştiriliyor.
Mevzu teknoloji ve yazılım ise, “daha iyisi” olmayacağını bilecek kadardır bu işi yapıyorum, Hani framework daha iyi ?
sorusunun cevabı bence yoktur, Hangi bilgisayar daha iyi sorusunun cevabı bence spesifik değildir, En iyi programlama
dili hangisi sorusuna cevap aramak vakit kaybıdır benim için.
“İhtiyacımı görecek en iyisi hangisi ?” sorusunu sormak bizi daha çabuk çözüme ulaştırır diye düşünüyorum,
En iyi programlama dili hangisi yerine “linux ortamında konsol işlemleri yapacağım hangi dil kendini bu konuda
geliştirmiş ?”
Web tarafında api isteklerine cevap verecek bir proje yapacağım, hangi dil bu konuda gelişmiş ? diye sormak bence en
iyisi.
Firma olarak Windows Ce kullanan el terminali yazılımından , Facebook uygulamasına kadar bir çok sektöre çözüm
üretiyoruz. Kullanacağımız araçları, “bu platform için en verimli araçlar hangileri ?” sorusunu sorarak seçiyoruz.
En iyi dil PHP’dir diye diretseydik, windows ce kullanan bir el terminaline kod yazamayacaktık. Yada en iyi dil .net’dir
deseydik, Linux sunucusunda Bash script ile çözebileceğimiz bir başka sorun için .net ile çözüm aramaya çalışacaktık.(
çözüm bulamayacaktık.)
Yazılım geliştirme içerisinde Fanatikçe karar almanın faydadan çok zarar getireceğini düşünüyorum.
Çok yakın bir tarihe kadar PHP ‘nin en büyük sorunlarından birisi gelişmiş ve genele yayılmış bir paket yöneticisinin
olmaması idi,
her ne kadar resmi olarak çıkmasa da çok yakın bir geçmişte composer oluşturularak, php’nin
bu eksiği çok büyük ölçüde giderildi.
Bu işte sözü geçen büyük firmalar bile kendini composer içerisine eklediği için topluluğun composer konusunda ciddi
olduğunu da görmüş olduk.
Composer sayesinde artık proje içerisinde kullanacağımız repolara çok
daha kolay şekilde ulaşıyoruz. Tek bir dosya üzerinden repoları yönetip projemize dahil
edebiliyoruz.
Composer ile popüler olan bir çok repo, bir kişinin geliştirmekte olduğu “şeylerden” uzaklaşıp farklı sorunlar ile
karşılaşan insanların pull requestleri ile birlikte gelişip büyüyor.
Bu sayede kendi içinde bir hata takip ve dokümantasyon sistemi oturmuş oluyor.
Yani kullandığınız araçların sorunlarına ve çözümlerine direk o araçların github sayfalarından ulaşabiliyoruz.
bununla birlikte, composer bize php’nin oop gücünü daha iyi kullanmamızı sağlıyor,
kullandığı autoload mimarisi sayesinde gerçek bir mvc deneyimi yaşayabiliyoruz.
Bu işe başladığımda ve devamında etrafımda hep kaliteli yazılımcılar olduğundan ötürü,
“OOP dediğin şey çok kullanılan fonksiyonların, sınıf dosyaları içine konulup lazım olunca çağrılması değil mi canım”
fikrinden kurtulmak çok uzun sürmedi benim için.
Bu yüzden Kendi Frameworkümü kendim yazdım dediğim dönemler sadece 1-2 proje ile sınırlı kaldı :)
Konunun en başına dönecek olursak,
Yaptığınız proje çevre şartları değişmediği sürece sorunsuz şekilde çalışmalıdır, “Kitap gibi çalışıyor” deyiminin
hakkını vermelidir.
Daha önceki bir yazımda, Müşteriye göre şekillenmek konusuna
değinmiştim.
İsteklere göre şekillenmek için çok esnek bir yapıya sahip olmanız gerekiyor. Projenizin, sonradan gelen isteklere göre
şekillendirirken kırılmaması çok önemli bir faktör olarak ilk sıraya çıkıyor.
Kullandığınız her bir aracı bir lego parçası gibi düşünebilirsiniz,
ne kadar ufak parçalar ile çalışırsanız, o kadar esnek projeler üretebilirsiniz ve projenin alacağı şekil, sizin hayal
gücünüze kalacağı için ortaya muazzam işler çıkabilir.
İşte bu yüzden composer çıktığından bu yana, tek bir framework’e bağlı kalmak yerine, frameworklerin güzel tarafları ile
daha esnek araçlar üretebileceğini düşünüyorum.
Gelelim bu durumda Laravel’i neden kullanmadığıma,
1- Sadece ben, hep ben, ben olmuşum laravel !
Laravel Tek ADAM projesi, bunu ben değil Laravel’i yazan arkadaş diyor,
https://twitter.com/taylorotwell/status/420577120188768257
Laravel asla bir community projesi olarak başlamadı.
Tek bir geliştiricinin “Php ile Ruby gibi yazsak nasıl olur ?” fikri üzerine, yine benim az önce bahsettiğim şekilde
ufak araçların composer ile bir araya getirmesinden ibaret.
CodeIgniter’ın geliştirilmesinin durdurulmasının ardından, ortaya çıkan, “basit, günü
kurtaran bir framework” ihtiyacını karşılayabilecek yetkinlikte bir framework laravel.
Yani beni, geçmişe yönelik destek ilgilendirmiyor, günü kurtarmak için yazılım yapıyorum laravel ile yapıp geçeceğim
diyorsanız Laravel tam size göre.
2- Biz bir aileyiz ama kararları ben veririm!
Opensource topluluğuna göz kırpan bir projeyi temelden ilgilendiren kararları tek adam tarafından alınması sonucu ortaya
çıkan sonuçları geçmişte gördük,
Mesela Pardus’un sonunun başlangıcı, topluluk redmine istediği halde
jira’da direten proje başları
sayesinde olmuştu,
Yine Ubuntu’da , pencere butonlarının topluluğun istememesine rağmen sağda değilde solda diretilmesi örnek olarak
verilebilir, Söz ubuntu’dan açılmışken, ubuntu firmasının unity’den tutunda arama bilgilerinizin başkaları ile
paylaşılmasına kadar olan bir yelpaze bile ortaya çıkan şey Open Source olsa bile kararı biz vereceğiz! diretmesinden
başka bir şey değil.
Ubuntuyu birinci işletim sistemi olarak kullanmayı bırakmama sebepte bu tutumlarıdır. Benim gibi bir çok kişi var.
hal böyle olunca,
projeye gelen pull request’leri bile merge etmek yerine kendisi copy paste ile sisteme ekleyen bir adam’a ne kadar
güvenebilirim ?
https://github.com/laravel/framework/graphs/contributors bu
linkten de görebileceğiniz gibi laravel’in büyük bir kısmı @taylorotwell tarafından yazılmış gözüküyor.
adam fırsat bulduğu her platformda “Ehe naber ? laraveli ben yaptım, benim bu proje” demekten kendini alamıyor.
3- Versiyonlama sorunları.
Can alıcı kısım bu aslında. Laravel Semantic Versiyonlama ile yazılmıyor, örnek verecek olursak,
bir yazılımın 1.2.4 versiyonu ile 1.2.5 versiyonu arasında çok büyük değişiklikler olmaz, yani siz bu aracı kullanırken
1.2.4 versiyonunu 1.2.5 versiyonuna yükselttiğinizde projenizin çalışmasına devam etmesini beklersiniz.
Laravel’de durum böyle değil, 1.2.4 versiyonunda desteklediği bir kütüphaneyi yada metodu, 1.2.5 versiyonunda komple
kaldırmış ve yerine bambaşka bir metod eklemiş olabiliyor. Böyle olunca bu gün yazdığınız kod, laravel güncellendikten
sonra tamamen çalışmaz hale gelebiliyor.
Mesela, Python 2 varken ve halen geliştirme süreci devam ediyorken, Python 3 çıkmasının ve onunda geliştirilmesinin
sebebi budur,
yada Opencart 1.5.5.6 sürümü varken Opencart 2.0.0.0 ‘ın çıkmasındaki sebep budur,
köklü değişiklikler olduğunda sizin ürününüzü kullananların “mağdur” olmaması için bu tarz versiyonlama sistemi
kullanılır. Bu her şeyden önce “saygı” sorunudur.
Temel amacımız sorunsuz çalışan bir sistem ise, bu şekilde “ya ruby’de şu özellik var, laravelde neden yok demesin
millet, bende bunu ekleyeyim o zaman” diyerek kafasına göre versiyonlama yapan bir adamın ortaya çıkardığı üründen ne
kadar fayda bekleyebiliriz ?
4- Kullanıcıların sorun çıktığında çözüme ulaşmasının önünü tıkamak.
Geçtiğimiz günlerde Laravel, github üzerindeki issüeleri sildi ve artık sorunları forumlardan
sorulmasını istedi.
Hem kafana göre versiyonlama ile işler yapacaksın, hem sorun çıktığında “buralar çok karışık oluyor” gerekçesi ile çözüm
yollarını tıkayacaksın.
Benim hızlıca çözüme ulaşma kriterim de burada çuvallıyor, üstelik “Laravel Auth Problem”, “Laravel Orm Problem” gibi
çok genel aramalarda çıkan sonuçların içinde bir de hangi versiyon olduğunu aramak zorundayım.
5- Standart üretme çabası ile saçmalama.
Php ‘de interface olarak kullanılan şeyleri alıp,
bunların adına Contracts diyor.
Php’nin adı çıkmış bir kere, Çok dağınık, düzensiz kod yazılmasına izin veriyor, hali hazırdaki interafece özelliğinin
adını değiştirip yeni ve ayrı bir sistem gibi sunalım gibi bir düşünce hakim.
Bu hem kısa hem de uzun vadede çok daha büyük sorunlara gebe kalacak bir düşünce, topluluk desteğini hiçe sayıp her
şey “benden” geçecek dedikten sonra, kullandığınız her aracın contratsını yazacaksınız demek tutarsızlık.
Laravel ile kodlama yaparken yine kör dövüşü yapıp, ben contracts yazmam diyorsanız Laravel kullanmanın anlamı ne o
zaman ?
Hali hazırda Composer paketleri içerisinde görüp beğenip kullanmak istediğiniz bir aracın kendi interface’i, bundle’ı
yada provider’i varken neden laravel’de contracts yazayım ? (yoksa)
Ben composer ile çekip $repo = new repoClass(); diye her yerden ulaşabileceğim bir aracı, neden sadece laravel
içerisinde çalışacak bir hale sokmak isteyeyim ?
“Kırk Küp Kırkınında Kulpu Kırık Küp” gibi bir metni, “kirk-kup-kirkininda-kulpu-kirik-kup” şeklinde url formatına
çevirecek bir araç kullanmak için, composer.json’a tek bir satır ekleyerek istediğim yerden çağırıp kullanmak yerine
neden sadece laravel’de çalışan bir şeye dönüştüreyim ?
Hızlı sonuç alma fikri nerede kaldı ?
Yine aynı şekilde, $nesne = new Nesne(); demek varken, neden make gibi bir metod ile ide dostu olmayan bir yöntem
kullanayım ?
6- Kalıplara sokarken özgünlüğünü yitirme.
Projeyi parçalara ayırarak oluşturmayı legolara benzetmiştim,
Laravel’de aslında parçalara ayrılmış repolardan oluşuyor ancak yukarıda saydığım şeylerden ötürü her bir parça kendi
özgürlüğünü bırakıp laravel’in diretmelerine maruz kalıyor.
Siz güncel paketleri bir araya getirdiğinizde ortaya çıkan şey şu olurken :
Aynı işi laravel yaptığında ise ortaya şöyle bir şey çıkıyor :
Laravel’de size lego sunuyor ama sunduğu parçalar Laravel’in baştan düşündüğü şeylerin dışına çıkamıyor. Böyle olunca da
Laravel Programcısı oluyorsunuz, Php ile alakanız kalmıyor, Laravel’in ürettiği çözümlerin dışına dahi çıkamıyorsunuz.
Senelerdir Visual Studio illetine mahkum kalan .net tayfası için aynı şeyleri söylemedik mi ? (kendim de visual studio
kullanıyorum, windows ce ‘ye sadece VS2008 ile yazılım üretebiliyorsunuz :’( )
7- Destek, Destek, Destek.
Zend Framework 1 , ilk olarak 2007 yılında yazıldı, zamanla üzerine yeni
versiyonlar eklendi, semantik bir versiyonlama kullandığı için ilk versiyonda yazılan (2007 yılında) bir yazılım bugün
bile sorunsuz çalışabiliyor,
üstelik Zend Framework 2 adında yep yeni bir sürüm çıkmasına rağmen hala
Zend Framework 1 için güncellemeler yapılıyor.
Bir diğer Framework olan Symfony, bir kaç gün
önce LTS sürümünü duyurdu.
Ama laravel’in kendi sitesinde bile 4. sürümünden öncesi için dokümantasyon bile yok.
8 - Taklitler aslını yaşatır.
Ruby ‘den esinlenerek tek bir adamın inisiyatifinde olan Ruby çakması bir yapı kullanacağınıza, aynı basitlikte ve
gerçekten topluluk tarafından geliştirilen Ruby’e geçmeniz daha faydalı olacaktır, üstelik MVC nedir sorusuna verecek az
çok cevabınız varsa Ruby’nin öğrenme süresi size çok ama çok basit gelecektir.
Sonuç olarak ;
Yazdığım kodun ileride de sorunsuz çalışmasını istediğim için,
Günü kurtarmak için kod yazmadığım için,
Kullandığım araçları “Herkes bunu kullanıyor, demek ki en iyisi bu” gibi bir argüman ile seçmediğim için,
Benim yazacağım kodun standardını bir topluluk değil de keyfe keder kararlar alan birisinin belirmesinden rahatsız
olduğum için,
İstediğim zaman istediğim yeni araçları ekleyebilmek istediğim için Laravel Kullanmıyorum.
Peki ya çözüm önerisi:
Elbette var,
ilk tavsiyem, kendini ispat etmiş, bu işe yatırım yapmış frameworkleri kullanın (Yii, Zend, Symfony gibi) ,
framework seçerken “en hızlısı buymuş” diye seçmeyin, Hız değişkeni en son dikkat etmeniz gereken faktör.
Diğer tavsiyem, yine kendini ispat etmiş toplulukların desteklediği paketleri ihtiyacınıza göre birleştirin. Girin
Github’a bakın, Php’nin yüksek versiyonları ile geliştirilen projelerde neler kullanılmış inceleyin.
Mesela firma olarak kullandığımız yöntemden örnek vereyim,
Zend FW 1’in route yapısını sevmiyorum, bunun yanında view olarak Zend Framework 1’in harika olduğunu düşünüyorum,
Database katmanında ORM kullanma taraftarıyım, çünkü projesini yürüttüğüm firma 2 gün sonra bir şirket kararı olarak
bundan sonra “Mysql yerine Mssql” kullanmak istiyoruz dediğinde oturup tüm sorguları elden geçirmek istemiyorum,
hatta yıl olmuş 2015 neden hala sql kodu ile uğraşayım ki ? Bu yüzden Doctrine kullanmak istiyorum,
Symfony’nin Route yapısı harika, kendim route katmanı oluşturana kadar bu iş için yine symfony tayfasının yaptığı Silex
adında micro framework var onu kullanırım. Üstelik Silex için hemen hemen tüm çevre birimler için (redis, elastic
search, doctrine vs vs) provider mevcut.
Bu anlattığım yapı için başka bir blog yazısı yazacağım.
İyi kodlamalar.
Ekleme 1 : (02.04.2015)
Bu yazıya bir ekleme yapmak istemiyordum, İçerisinde küfür geçmeyen tüm yorumları yayınlama gibi bir kuralım vardır. Ama
artık, yazıyı okumadan sadece yazının başını ve sonunu okuyarak yorum yapan üstelik bu yorumlarında da yazı içerisinde
söylediğim şeyleri bana sanki söylememişim gibi sav olarak sunan yorumları artık onaylamayacağım. Okuma yazma bilmeyen
insanların yorumları, bu yazıya ve konuya bir şey kazandırmayacaktır.
Teşekkürler.