Saturday, December 8, 2007

UML ile Yazılım Modelleme - Software Modeling with Unified Modeling Language

Daha onceki projelerde kullandığım ve Imagine Cup 2008 - HCA Software Design Projesi kapsamında yapmayı planladığımız "UML ile Yazılım Modellenmesi" hakkında genel bilgilendirme amacı güden bir yazıdır..

Modelleme
kanıtlanmış ve kabul edilmiş bir mühendislik tekniğidir. Model sayesinde karmaşık bir gerçeği daha basit bir dille ifade etme şansımız olur; böylece modellediğimiz gerçeği daha iyi anlayabilir, hataları yolun başında görebiliriz. Aynı gerçekler yazılım için de geçeridir, özellikle büyük ve karmaşık yazılımlar için modelleme, büyük bir bina için mimari planın (blueprint) gerekliliği kadar vazgeçilmez bir olgudur.

Yazılım modellenmesi sayesinde sistem gereksinimlerini ve sistem davranışlarını daha iyi anlarız ve hata riskimiz azalır. Yazılım yaşam döngüsü içinde hatalar ne kadar erken saptanırsa düzeltme maliyeti de o kadar az olur. Çok karmaşık sistemler için bitmiş bir kodda 1 satırlık bir değişiklik yapmanın maliyeti zaman ve risk açısından çok yüksektir. Bu sebeple sistemi doğru anladığımızdan emin olmamız gerekir, bunu da ancak modelleme sayesinde yapabiliriz.

Büyük yazılım projelerinde proje yöneticileri, müşteriler, çözümleyiciler, tasarımcılar, programcılar, testçiler ve teknik yazarlardan herbirinin eğitim düzeylerinin ve alt yapılarının farklı olması kaçınılmazdır, biz burada yazılım kısmı olarak 2 yada 3 kişi olarak çalışacağız ki yukarıdaki bu birçok alanı içine alıcak işler yapıcak bu kısım. Roller farklı olunca bir ekibin elemanlarının birbirleri ile iletişiminin önemi de ortaya çıkar. Çözümleyicilerin aylar süren görüşmeler sonunda elde ettikleri bütün bilgileri yazılı olarak tasarımcıya veya teyid alabilmek için müşteriye verdiğini düşününebiliyor musunuz? Oysaki sistem, çözümleyici tarafından müşteriye, tasarımcıya veya testçiye hepsinin anladıkları ortak bir dille modellenirse, çok karmaşık anlatımlar basitleşebilir ve iletişim metin ile desteklenen çeşitli diyagramlar ile maksimum düzeyde tutulabilir. Böylece müşteri sistem gereksinimleri raporunu okurken veya teknik yazarlar kullanıcı kılavuzu yazarken veya test senaryoları hazırlanırken bu ortak dilden faydalanılmış olur.

Tasarımcı, çözümleyicinin hazırladığı bazı diyagramları detaylandırıp teknik açıdan kodlamanın yolunu açabilir. Bütün bunlar projelerde yazılım kalitesini artırmanın yanı sıra, proje ekibindeki eleman değişikliğinde yeni elemanların sistemi kolayca kavrayamamasından kaynaklanacak zaman kaybını, yani maliyeti de düşürecektir.

Her yazılımın modellenmesi için mükemmel olan tek bir yöntem yoktur. Bir şirket için mükemmel olan bir modelleme yöntemi diğeri için berbat olabilir. Yapılan işin niteliğine göre farklı diyagramlara ihtiyaç duyulacaktır. Modellemede önemli olan yazılım sektöründeki herkesin ortak bir dili kullanmasıdır olmalıdır. Doğal olarak da her tür ihtiyaca cevap verebilir nitelikte bir modelleme diline ihtiyaç vardır. Müziği düşünecek olalım, 8 notayı bir araya getirerek muhteşem bir eser yaratabiliriz. Yarattığımız eseri ister flüt ile çalarız ister piyanoyla, çaldığı müzik aleti ne olursa olsun orkestranın her elemanı aynı dili anlamaktadır. Sonuçta müzik, nota dediğimiz sembollerin çeşitli şekillerde bir araya gelerek bir bütünü oluşturması ve dünyanın her köşesinde anlaşılabilir bir dilde ifade edilmesidir. Müziğin güzelliği ise besteyi yapanın yeteneğiyle sınırlıdır. Yazılım sektörü için de yazılımın parçalarını ifade edecek modelleme dili müziğin notaları gibidir. Sistemin mükemmelliği, sistemi tasarlayanların yetenekleriyle, bilgi ve tecrubeleriyle ilgilidir.

UML'ye gelince, Unified Modelling Language yazılım mühendisliğinde nesne tabanlı sistemleri modellemede kullanılan açık standart olmuş bir görsel modelleme dilidir. Büyük ve karmaşık sistemleri modellemede başarısı kanıtlanmış mühendislik tecrübeleriyle oluşmuştur. UML'nin yazılım mühendisliğindeki yerini anlayabilmek için tarihçesine söyle bir bakalım:

1989-1994 yılları yazılım mühendisliğinde Metod savaşları olarak bilinen dönemdir. Bu dönemde 50'den fazla modelleme dili paralel bir şekilde aynı şeyleri farklı yöntemlerle ifade ediyorlardı. Herbiri bazı sistemler için mükemmelken, bazıları için işe yaramaz durumdaydı ve hemen hemen hepsi yazılım yaşam döngüsünün bazı adımlarını tanımlamakta yetersiz kalıyordu. 90'lı yılların ortalarına doğru en çok tercih edilen 3 yöntem ön plana çıktı: Booch, OMT (Object Modelling Technology) ve OOSE (Object Oriented Software Engineering). Bunlardan Booch, tasarım ve gerçekleştirim konusunda mükemmeldi. OMT analiz ve veri yoğunluğu çok yüksek olan sistemlere uyuyordu. OOSE ise Use-Case adı verilen bir modelleme yöntemi ile tüm sistemin davranışını kolayca anlamayı sağlayan güçlü bir teknik içeriyordu.

1994 yılında OMT'nin yaratıcısı Jim Rumbaugh, Rational firmasının çatısı altında Booch metodunun yaratıcısı Grady Booch ile birlikte çalışmaya başladı. Daha sonra 1995'de onlara OOSE'nin yaratıcısı Ivar Jacobson da katıldı. 3 Amigolar olarak bilinen bu grup kendi yöntemlerinin olumlu taraflarını birleştirerek, komple bir yazılım projesinde sistemi modellemede kullanılabilecek eksiksiz bir modelleme dili geliştirmeye başladılar. Microsoft, Oracle, HP gibi büyük firmaların da katıldığı bir UML konsorsiyumu kuruldu ve bu şirketler UML'yi modellemelerinde kullanmaya başladılar. Nihayet 1997'de OMG (Object Management Group, kar gütmeyen, bilgisayar endüstrisi standartlarını oluşturan bir organizasyon ) UML'yi sahiplendi ve açık standart olarak geliştirmeye başladı. Doğal olarak UML herhangi bir şirkete veya kişiye ait bir modelleme dili değildir. UML şu an Rational, MS Visio, Together Soft,.. vb birçok modelleme aracı tarafından sunulmaktadır., bizde bu ortamlardan biri ile tasarım aşamasındaki en büyük adımımızı atacağız.

Yazılımın yaşam döngüsü içinde farklı görev gruplarının projeye ve sisteme farklı bakışları vardır. Müşteriyi hangi işin hangi sırayla yapılacağı, sisteme neler verip sistemden neler alacağı veya işler arası ilişkiler ilgilendirirken bir fonksiyonun detayları ilgilendirmemektedir, Çözümleyici açısından bir nesnenin özellikleri, fonksiyonları ve alacağı parametreler yeterli iken tasarımcı açısından parametrelerin veri tipleri veya fonksiyonun ne kadar bir sürede cevap üretmesi gerektiği, bir nesnenin ne zaman etkin olacagi, yaşam süresi gibi bilgiler de önemli olmaktadır. Teknik yazar ise sistemin nasıl davranacağı ve ürünün işleyişi ile ilgilenmektedir. Bu sebeplerle UML çeşitli bakış açılarını ifade eden diyagramlar içermektedir. Projeye dahil olan herkesin faydalanacağı bir veya daha fazla diyagram vardır. Yazılım geliştirme işinde rol alan kişileri özetleyecek olursak: Çözümleyiciler, tasarımcılar, programcılar, testçiler, kalite sorumluları, müşteriler / kullanıcılar, teknik yazarlar. Bunlardan her biri sistemin değişik yönleriyle farklı bakış açılarıyla ve farklı detayda ilgilenirlerken farklı UML diyagramlarından faydalanırlar.

Sistem gereksinimlerinin anlatılmasında Use-Case diyagramlar kullanılır. Bu diyagram sistemin çok basit bir şekilde modellenmesini ve işlerin detayının (senaryonun) metin olarak anlatılmasını içerir, sistemin işleyişini anlattığı için de yukarda listelenen rollerden hepsinin sıklıkla başvuracağı bir diyagramdır.

Kavramsal (conceptual) model dediğimiz Class diyagramları, gereksinimlerin müşteriye özetlenmesinde kullanılabildiği gibi, asıl olarak tasarımda kullanılmaktadır. Class diyagramları, bazı detayları saklanmış şekilde müşteri-çözümleyici iletişimini desteklerken, detaylı haliyle de tasarımcıya ve programcıya hitap etmektedir. Class diyagramların tasarımı ilgilendiren kısmı oldukça kapsamlıdır, nesne tabanlı sistemlerin doğru tasarlanması tamamen tasarımcının tecrübe ve bilgisi ile ilgilidir, bu sebeple tasarlanacak class diyagramlarında, inheritance (türetme), abstract class'lar, class hiyerarşileri, kullanılacak design pattern'lar gibi detayların düşünülmesi gerekmektedir. Bu noktada UML'nin "doğru tasarım nasıl yapılır?" sorusuna cevap vermediğini sadece bir modelleme dili olduğunu tekrar belirtmek gerekir. Sistemin performansı veya gelecekte yüzleşeceğimiz güncelleme ve bakım sorunları, yazılan kodun başka projelerde veya ek modüllerde yeniden kullanılabilir olması (code reuse) gibi detaylar tasarımcı açısından çok önemli olmalıdır. Nesne tabanlı sistemlerde doğru tasarım yöntemleri başlı başına incelenmesi gereken bir konudur.

Colloboration Diyagram dediğimiz nesneler arası etkileşim ve işbirliği diyagramları, nesneler arası akan verileri ve bunların zamana bağlı numaralanmış akış sırasını ifade eden diyagramlardır. Sequence Diyagram ise işbirliği diyagramının ifade ettiği şeyin aynısını bir zaman çizgisi üzerinde farklı bir gösterimle ifade etmektedir. Bu iki diyagram (colloboration ve sequence diyagramlar) biri hazırlanınca diğeri otomatik üretilebilen diyagramlardır.

State Diyagramları (Durum Diyagramları) ise nesnelerin durum değişikliklerini ifade etmekte kullanılırlar, trafik ışıklarının renkler arası geçişi gibi, bir nesneye ilişkin durum değişiklikleri bu diyagramlar ile ifade edilir.

Package Diyagramları (Paket Diyagramları) büyük yazılımlarda sistemi oluşturan alt yazılımlar veya etkileşimde bulunulan yan sistemler olduğu durumda bu paketler arası etkileşimi gösteren kısaca sistem mimarisinin paket yönünü özetleyen kavramsal bir diyagramdır.

Component Diyagramları (Bileşen Diyagramları) ise Paket diyagramlarının fiziksel anlatımıdır. Basitçe paketler yerine, paket içinde yer alan .dll, exe gibi dosyaları ve bunlar arası etkileşimin gösterildiği bir diyagramdır. Paket diyagramlar sistemin analizi ve tasarımı aşamasında kullanılabilirken Bileşen diyagramları programlama bittikten sonra sistemi tarif eder niteliktedir.

Deployment Diyagramları (Dağıtım Diyagramları) yazılımın nasıl dağıtılacağının planlandığı aşamada yardımcı olurlar. Yazılımın kurulacağı bilgisayarların konfigürasyonu, ağ ve yazıcı bağlantıları gibi detayları kapsamaktadır.

Yukarda kısaca anlatılan diyagramlar sayesinde büyük bir yazılımın yaşam döngüsü içinde her adımı kapsayan, ve sisteme çeşitli gözlerden bakış açısı sunan bir modelleme tekniği olarak UML günümüzün nesne tabanlı bir yazılım projesinin paydaşlarını konuşturan en kapsamlı ve en basit ortak dildir düşüncesini taşıyorum.

Monday, October 29, 2007

BFS - Sevilmesi Kaçınılmaz Search (Arama) Algoritması

Recursion doğru kullanıldığı zaman çok işimize yarayabilir, kullanılmadığında ise öldürebilir, çocukların(işe yeni başlayanların) ulaşamıyacağı yerlerde saklayınız. Özellikle ağaç tipi veri yapılarının tüm düğümlerini dolaşmak istediğimizde recursiondan faydalanabiliriz. Fakat bu ağaç yapısının ne kadar derinliğe sahip olduğunu kestiremediğimiz durumlarda bu yönteme çok da bel bağlamamak lazım zira işlem aslında yığın yapısı ile gerçeklendiğinden (tüm derleyici yapımı işlemlerinde dahil), yığın taşabilir yani overflow hatasıyla karşılaşabiliriz.

Alternatif bir yöntem ise kendi yığınımızı kullanarak bu işi yapmaktır. Zaten olay bu değilmidir ? Kendin pişir kendin ye..
Genel adı ile "Breadth First Search" ("Yayılma Öncelikli Arama" diye çeviriyorum akademisyenlerin affına sığınarak):

  • Bir yığın yapısı oluşturulur ve root node bu yığına eklenir. (Queue ile de yapılabilir sadece işleme sıranız değişir, pek alışılagelmemiştir ayrıca)
  • Herhangi bir node'un alt node'ları varsa bunlar da yığına eklenir
  • Bulunduğumuz node işlenir ve yığından bir sonraki node çekilir.
  • Yığın boşalana kadar bu işlem tekrarlanır
Pseudo oluştu sanırım, bundan sonrası standart işler artık, kim olsa yapar :)

Monday, September 24, 2007

Cocuklar&Ebeveynler&Buyukler Icin Ucretsiz Java Kitabi

Java Gurusu ve aynı zamanda birçok Java kitabının yazarı Yakov Fain bir tane de çocuklar için, karikatürlerle renklendirdiği bir Java kitabı yazmış. Kitabın orijinal adı "Java Programming for kids, parents and grandparents" ve ücretsiz olarak pdf formatında (İngilizce ve Fransızca) piyasaya çıkmış. (İndirmek için tıklayınız)

Bu kitap ilk bakışta he ne kadar sadece çocuklara hitap ediyormuş gibi gözükse de aslında Java'ya yeni başlayan herkesin çok faydalanacağı bir başlangıç kitabı. Ayrıca Bilgisayar Eğitmenleri ve Öğretmenleri için de harika bir kaynak.

Kitap 3 sene evvel yazılmaya başlandığı için içerik biraz eski gibi gözükse de Java'nın temel ve pek değişmeyen kavramlarını anlattığı için gayet öğretici. Ayrıca tüm örnekler JDK 1.5 ve Eclipse baz alınarak anlatılmış.

Konu açılmışken Java'ya yeni başlayanların ve ilerletmek isteyenlerin çok faydalanacağını düşündüğüm bir kaynak daha mevcut. http://www.javapassion.com/ adresinde Sang Shin tarafından sunum şeklinde hazırlanmış, pdf formatında harika Java eğitimleri mevcut. Acemisinde, ustasına kadar her kesime hitap eden harika Java eğitimler hazırlamış Sang amcamız.

Özellikle Java Programming with Passion! ismindeki, Basic ve Advanced olmak üzere iki kısımdaki toplam 20 başlık altında topladığı eğitimler harika. Yeni başlayanların mutlaka bu linkteki eğitimlere bir göz atmasında fayda var.

Ustalar için ise aşağıdaki eğitimler gayet faydalı olacaktır,
birçoğu benim zamanımda faydalandığım ve development konusunda katettiğim yollardan geçmemde faydası olan yaklaşımları hoş kaynaklar:
AJAX Programming with Passion!
Java EE Programming with Passion!

Java Programming with Passion!

Web Services Programming with Passion!

Distributed Programming using Jini and JavaSpaces Technology

XML

Basic Servlet and JSP programming

Advanced J2EE programming

J2EE programming(5-day)

Servlet programming

Struts programming

Web services programming

Web services programming

JavaServer Faces (JSF) programming

NetBeans IDE 5.0 1-day Workshop

J2SE 5.0 (Tiger) programming

Açık Kaynak Konusuna Bakışım

Açık Kaynak mı? Ücretsizdir kullanalım!?

Başlamadan önce Açık Kaynağın ne olduğunu anlamam ve anlatmam gerekiyor. Birincisi açık kaynak ücretsiz olmaktan öte özgürlük kavramı ile daha çok bağdaşır.Yani kod geliştirirken, dağıtırken veya kullanırken özgür olabilmek açık kaynağın getirdiği fırsatlardır. Bunun getirdiği bir sürü avantaj vardır ki, bunlar için ayrı ayrı bir sürü yazı yazılmıştır. Yani bu yazıyı okumaya devam etmeden önce kafanızdaki açık kaynak=bedava eşitliğini bir süreliğine bırakmanız veya kafanızda biraz gerilere itelemeniz gerekiyor.

Asla!! Açık Kaynak bu şirketin kapısından içeri adım atmayacak dedim sana!! :)
Biz MS destekli firmayız, en iyisini onlar bilirrrr ona göre!!


Zaman zaman etrafımızda, çalıştığımız yerde görürüz, Açık kaynak öcüymüş gibi bir tavır sergilenir.Bu tavır genellikle büyük ölçekli, kurumsal şirketlerde gösterilir. Ve en temelde iki sebebi (ya da öyle olduğu söylenir) vardır. İlki, güvenlik açıklarından dem vurulur.. İkincisi, destek ve dokümantasyon olmadığından yakınılır.

Öncelikle güvenlikten bahsedelim. Güvenlik açığı heryerde olabilir. Sisteminin mükemmel işlediğini düşünen bankalarda dahi güvenlik açıkları vardır. Her programda olduğu gibi açık kaynak uygulamalarda da güvenlik açıkları vardır. Ama uygulamada geliştirme/kullanma olarak katılımcı sayısı (ki bu açık kaynak topluluğu denen grupta gerçekten çok sayıda da insan var) fazla ise güvenlik açıkları zaman içerisinde bulunmuş ve düzeltilmiş/düzeltiliyordur. Eğer bundan yana çok şüphe duyuluyorsa kodlar nasıl olsa elimizde bakabiliriz değil mi? Bu noktada sanki kapalı kaynak kodlar biraz daha güvensiz gibi duruyor farkındayım.

Destek ve dokümantasyona gelirsek, açık kaynak uygulamalar ölçeklerine bağlı olarak ücret karşılığında destek ve dokümantasyon sağlarlar. Tabi açık kaynağı bedava olarak niteleyip, ardından "nereden çıktı bu masraf" denmemeli. Az önce de belirttiğim gibi açık kaynak her zaman bedava anlamına gelmez. JBoss lisans ücreti ödemezsiniz, ama JBoss ON için CPU başına bir lisans ücreti ödemek zorundasınızdır, dünyanın en büyük güvelik ve network firmaları bu yazılımı kullanıyor gözümle gördüm :)

Açık kaynak geliştiricileri kazanmıyor mu?

Açık kaynak uygulamalar Microsoft'un aksine lisans ücreti talep etmezler, bunun yerine dokümantasyon ve destek, zaman zaman da yardımcı entegre modüller asıl para getiren kısımlardır. Bununla ilgili
Matt Asay'in Open Road'daki "Why Microsoft fears open source more than other proprietary vendors do" yazısı lisanslama ve dokümantasyon/destek arasındaki farkı ve bununla ilgili Microsoft ve Açık Kaynak arasındaki görüş farklılıklarını çok güzel anlatmış. Bir göz atmakta fayda var.

Açık kaynak kodu çok mu iyidir ? O halde neden herşey açık değil ?

Açık kaynak trendi özellikle Sun CEO'su Jonathan Schwartz'ın katkıları ve vizyonu ile önce OpenOffice, sonra OpenSolaris ve ardından OpenJDK ile ivme kazandı. Sun'ın bu çabasına yakın zamanda IBM de OpenOffice.org topluluğuna katıldığını açıklayarak bir anlamda destek oldu. Sonra sırası ile birçok geniş ölçekli program trend değiştirip kodlarını açma kararı aldılar. Bunun en son örneği ise VMWare oldu. RedHat Fransız Eğitim Bakanlığı ve İsveç'te büyük ölçekte bir ilaç portali olan Fass.se'nin tüm server'larını (IBM ve Solaris'ten) RedHat Linux'e geçirdi.

Yapılması Gerkenler:

Bu kadar yazıdan sonra etrafımdakilerden haraketle olaya nasıl baktığımın özeti:

1.Hala açık kaynak bir uygulama gördüğümüzde kalitesiz ve ucube muamelesi yapıyoruz (Ve hatta lisanslı ürünlerin web sayfalarını inceleyip, aynı ürünün açık kaynak bir şekilde yapılamayacağına kendimizi inandırıyoruz)
2.Açık kaynağın bedava olmaktan öte paylaşımcı, sürekli geliştiren ve öğretici bir topluluk olduğunu anlamakta zorlanıyoruz.
3.Biz geliştirdiğimiz uygulamaları sanki dünyada kimse yazamazmış gibi, kodları kapalı ve lisanslı satmaya çalışıyoruz. (Tamam bu biraz fazla oldu, ama öyle)

Yukarıda yazdığım sonuçlar ile kimseyi suçlamıyorum..Sadece dünyanın yöneldiği trendi hala görmemekte ısrar ediyoruz. Benim vurgulamak istediğim nokta bu, Turgut Uyar gibi insanlar olmadığı sürece açık kaynak kodunun amacı ve gerekliliği de ülkemizde yayılamıyacak gibi.

Hmm tabi bunları söyledikten sonra şunları da ekleyeyim,
OpenOffice kullanıyorum, Sun Server'lar üzerine Solaris 9 yerine OpenSolaris veya RedHat kuralım diye her fırsatta iddalı insanlar görüyorum. Firefox favorim. NetBeans ve Eclipse'ten daha iyi IDE'ler tanımıyorum. Projelerine baktığım Kaynak Kodların çoğu Subversion'da (Starteam'den geçtik) tutuluyor. Server ve scripting işlemleri Hudson/CruiseControl ve Ant kullanılarak yapılıyor, yazlım konusundaki tecrübelerini yakından takip ettiğim Sun'da ANT Scriptleri kullanan büyük firmalardan :) ve daha birçoğu....

Son olarak Linux Torvalds (bkz: http://en.wikipedia.org/wiki/Linus_Torvalds) tam bir efsane insandır, dikkatle tüm hayatı ve yaptıkları en
otobiyografik detayında incelenmelidir, ilgisi olanlara..

Sunday, September 23, 2007

Algorithms Book (Memory remains from Course: Analysis of Algorithms)

I just finished a fantastic book called "Algorithms", by Sanjoy Dasgupta, Christos Papadimitriou and Umesh Vazirani. Even better: this book is free and can be downloaded in PDF form.

At 300+ pages, it's not lightweight either, but the authors have done a fantastic job at explaining the main foundations of essential algorithms in simple terms that even developer who don't have a CS degree will find easy to read and to absorb. You will see a few mathematics formulas and proofs here and there, but you can safely skip them if you are not comfortable with them and just take away the very natural and friendly wordings that the authors never omit to make when they are trying to get you to understand the overall idea behind an algorithm.

The book is very extensive and covers the most important algorithms you will ever come across in your life as a developer, starting with the introduction of the "big O" notation, and then progressively moving to more complex topics such as graphs, dynamic programming (nothing to do with dynamic languages), linear programming and culminating this area with the Simplex algorithm (I loved this section).

I would consider the chapters that follow as a "second part" of the book (even though it's not structured as such) since they cover more advanced (and sometimes, still not completely understood yet) problems such as NP completeness and quantum programming.

A must-read for any developer who never got a chance to understand how all these algorithms work or who simply want to get a refresher...

And hats off to Sanjoy, Christos and Umesh for making such a great contribution to the computing world!

XML: Performans Katili - Another Performance Killer

XML teknolojisi yazılım dünyasının işlerini bir çok noktada kolaylaştıran ama bir o kadar da zorlaştıran bir teknoloji. Özellikle Java ile uygulama geliştiriyorsanız XML'den olabildiğince uzak durmak gerekiyor. XML parsing & generating operasyonları sırasında çok fazla String işlemi olduğu için JVM memory ve CPU kullanımı korkunç artıyor. XML'e performans diye boşu boşuna dememişler.

Bu yazımın esas amacı aslında Java uygulamarında XML kullanmanın getirdiği maliyetleri ve Dennis Sosnoski amcamızın meşhur XML Model Benchmark Test'lerini tanıtmak.

XML'in performance killer 'dan nasıl proje katiline dönüşebileceğine bakmadan evvel öncelikle neden uygulamalarımızda XML kullanmak zorunda kaldığımıza bir bakalım.

XML kullanımı, özellikle Java dünyasında Web Service'lerin yaygınlaşması ile artmaya başladı. Web Service kullanımını arttıran da hepimizin yakından bildiği SOA (Service Oriented Architecture) oldu. 2000'li yılların başında SOA'nın moda olmaya başlamasıyla, dünyaca ünlü vendor'larımız her zaman yaptıkları gibi bu kavramı da hemen suistimal etmeye başladılar. Bir metodoloji çok tuttuğunda vendor'larımızın ilk yaptığı şey, satabilmek için ortaya zorlama bir ürün çıkarmaktır. SOA'nın bu ürünü de Web Servis implemantasyonları oldu. Web Service ailesi (XML-RPC , REST, SOAP) içinde de en fazla öne çıkarılan SOAP mesajları oldu.

Halbuki SOA'nın felsefisinde tüm servis hizmetlerinin web servisler aracılığı ile verilmesi diye bir zorunluluk yoktur. SOA'da bir servise dış veya iç sistemden erişim ihtiyacı varsa öncelikle servis hizmetini veren (server) ile alanın (client) ortamlarına bakmak gerekir.

1. Durum Servis hizmetini veren ve alanın aynı java container'ında olması.
2. Durum Servis hizmetini verenin ve alanın farklı java container'larında olması
3. Durum Servis hizmetini verenin java fakat alanın farklı bir dile (ASP,C#,vs.) ait container'da olması.

1. Durumda istemci ve sunucu aynı JVM'de olduğu için zaten web servis kullanmaya gerek yoktur. Fakat dikkat edilmesi gereken konu, SOA'nın şartlarından biri olan servisler arası bağımsızlığın (loose coupling) korunmasıdır. Spring Framework 'unun da kullandığı Inversion of Control diye adlandırılan patterni bu duruma güzel bir örnektir.

2. Durumda istemci ve sunucu farklı container'da olmasına rağmen iki taraf da java olduğu için yine web servis kullanmaya gerek yoktur. İlk bakışta servis çağırmak için RMI kullanmak en mantıklı çözüm gibi gözüksede, RMI teknolojisinin http protokolü kullanmaması nedeniyle firewall ve proxy'lerde problem yaşaması, farklı java versiyonları kullanan istemci/sunucu mimarilerinde sorun yaşanması gibi sebeplerden pek tercih edilmemektedir.

Bunun yerine en mantıklı çözüm serialized java objects kullanmaktır. Serializable java nesnelerini aynı web servis mantığı ile örnekteki gibi byte array'e çevirip container'lar arasında http üzerinden transfer edebilirsiniz. Objelerin serialVersionUID 'lerini değiştirmediğiniz sürece JDK 1.3 - 1.5 arasındaki container'lar arasında bile servis çağırabilirsiniz. Serialization&DeSerialization, XML parsing'e göre çok daha hızlı, daha az memory kullanan, binary olduğu için daha az data büyüklüğü oluşturan bir işlemdir. Vakti zamanında yaptığımız testlerde özellikle büyük datalarda 30 kata yakın performans elde etmiştik. Eğer bu konuda daha yetenekli, productionda kullanmaya hazır bir API'ye ihtiyaç duyarsanız JBoss Remoting 'e bir göz atabilirsiniz.

3. Durumda istemci java'dan başka bir container olduğunda web servis kullanmaktan başka bir çare yok. Fakat bu konuda da alınabilecek önlemler var. Eğer standart web servis implementasyonlarından herhangi birini seçme imkanınız var ise SOAP'dan kesinlike uzak durun derim. SOAP çok genel amaçlar için tasarlanmış ve sistem performansını en çok düşüren bir XML protokolüdür.

XML'in sisteminizin performansına olan etkisini belirleyen 3 önemli unsur vardır:

1. XML'in yapısı

Varsayalım elimizde 100KB. büyüklüğünde 2 farklı yapıda XML dosyası olsun. Birincisinin ağaç yapısında varsayalım:

XML teknolojisi yazılım dünyasının işlerini bir çok noktada kolaylaştıran ama bir o kadar da zorlaştıran bir teknoloji. Özellikle Java ile uygulama geliştiriyorsanız XML'den olabildiğince uzak durmak gerekiyor. XML parsing & generating operasyonları sırasında çok fazla String işlemi olduğu için JVM memory ve CPU kullanımı korkunç artıyor. XML'e performans diye boşu boşuna dememişler.

Bu yazımın esas amacı aslında Java uygulamarında XML kullanmanın getirdiği maliyetleri ve Dennis Sosnoski amcamızın meşhur XML Model Benchmark Test'lerini tanıtmak.

XML'in performance killer 'dan nasıl proje katiline dönüşebileceğine bakmadan evvel öncelikle neden uygulamalarımızda XML kullanmak zorunda kaldığımıza bir bakalım.

XML kullanımı, özellikle Java dünyasında Web Service'lerin yaygınlaşması ile artmaya başladı. Web Service kullanımını arttıran da hepimizin yakından bildiği SOA (Service Oriented Architecture) oldu. 2000'li yılların başında SOA'nın moda olmaya başlamasıyla, dünyaca ünlü vendor'larımız her zaman yaptıkları gibi bu kavramı da hemen suistimal etmeye başladılar. Bir metodoloji çok tuttuğunda vendor'larımızın ilk yaptığı şey, satabilmek için ortaya zorlama bir ürün çıkarmaktır. SOA'nın bu ürünü de Web Servis implemantasyonları oldu. Web Service ailesi (XML-RPC , REST, SOAP) içinde de en fazla öne çıkarılan SOAP mesajları oldu.

Halbuki SOA'nın felsefisinde tüm servis hizmetlerinin web servisler aracılığı ile verilmesi diye bir zorunluluk yoktur. SOA'da bir servise dış veya iç sistemden erişim ihtiyacı varsa öncelikle servis hizmetini veren (server) ile alanın (client) ortamlarına bakmak gerekir.

1. Durum Servis hizmetini veren ve alanın aynı java container'ında olması.
2. Durum Servis hizmetini verenin ve alanın farklı java container'larında olması
3. Durum Servis hizmetini verenin java fakat alanın farklı bir dile (ASP,C#,vs.) ait container'da olması.

1. Durumda istemci ve sunucu aynı JVM'de olduğu için zaten web servis kullanmaya gerek yoktur. Fakat dikkat edilmesi gereken konu, SOA'nın şartlarından biri olan servisler arası bağımsızlığın (loose coupling) korunmasıdır. Spring Framework 'unun da kullandığı Inversion of Control diye adlandırılan patterni bu duruma güzel bir örnektir.

2. Durumda istemci ve sunucu farklı container'da olmasına rağmen iki taraf da java olduğu için yine web servis kullanmaya gerek yoktur. İlk bakışta servis çağırmak için RMI kullanmak en mantıklı çözüm gibi gözüksede, RMI teknolojisinin http protokolü kullanmaması nedeniyle firewall ve proxy'lerde problem yaşaması, farklı java versiyonları kullanan istemci/sunucu mimarilerinde sorun yaşanması gibi sebeplerden pek tercih edilmemektedir.

Bunun yerine en mantıklı çözüm serialized java objects kullanmaktır. Serializable java nesnelerini aynı web servis mantığı ile örnekteki gibi byte array'e çevirip container'lar arasında http üzerinden transfer edebilirsiniz. Objelerin serialVersionUID 'lerini değiştirmediğiniz sürece JDK 1.3 - 1.5 arasındaki container'lar arasında bile servis çağırabilirsiniz. Serialization&DeSerialization, XML parsing'e göre çok daha hızlı, daha az memory kullanan, binary olduğu için daha az data büyüklüğü oluşturan bir işlemdir. Vakti zamanında yaptığımız testlerde özellikle büyük datalarda 30 kata yakın performans elde etmiştik. Eğer bu konuda daha yetenekli, productionda kullanmaya hazır bir API'ye ihtiyaç duyarsanız JBoss Remoting 'e bir göz atabilirsiniz.

3. Durumda istemci java'dan başka bir container olduğunda web servis kullanmaktan başka bir çare yok. Fakat bu konuda da alınabilecek önlemler var. Eğer standart web servis implementasyonlarından herhangi birini seçme imkanınız var ise SOAP'dan kesinlike uzak durun derim. SOAP çok genel amaçlar için tasarlanmış ve sistem performansını en çok düşüren bir XML protokolüdür.

XML'in sisteminizin performansına olan etkisini belirleyen 3 önemli unsur vardır:

1. XML'in yapısı

Varsayalım elimizde 100KB. büyüklüğünde 2 farklı yapıda XML dosyası olsun. Birincisinin ağaç yapısında olduğunu,ikincinin ise tek nod'dan oluştuğunu varsayalım:
Herhangi bir XML parser ile (DOM, SAX, PULL farketmez) yukarıdaki aynı büyüklükteki 2 farklı yapıdaki dosyayı parse ettiğinizde çok farklı sonuçlar (hız, cpu ve memory kullanımı) elde ettiğinizi göreceksiniz. Birazdan bahsedeceğimiz XML Parser'in seçimi ile XML'in yapısı arasında çok yakından bir ilişki vardır.

2. XML'in büyüklüğü

XML data'sı büyüdükçe sistem performansı doğal olarak düşer. Fakat XML verisinin büyüklüğü ile sistem performansı arasındaki oran logaritmiktir. Bunun sebebi ise XML'in daha evvel bahsettiğimiz gibi çok fazla memory ve cpu kullanmasıdır. Bir JVM'de aynı anda çok fazla XML parsing işlemi olduğunda CPU bu işlemleri sıraya koymaya başlıyacak, sırada bekleyen XML nesneleri çok fazla memory kullandığından heap'i doldurmaya başlıyacak, JVM heap'in dolduğunu görünce sık sık GC (Garbage Collector) çalıştırmaya başlıyacak, GC çalışırken çok fazla CPU kullandığı ve tüm sistemi çalıştığı sürece suspend ettiği için tüm sistem tabir yerinde ise ağır çekimde ilerleyecektir. Tabii bu durum son kullanıcıya program çöktü olarak yansıyacaktır.

3. XML Model

Buraya kadar anlattıklarımıza rağmen data alışverişlerinde hala XML kullanmaya kararlı iseniz o zaman yapmanız gereken doğru XML parseri seçmek. Aynı zamanda bir SOA danışmanı olan Dennis Sosnoski 'nin eski ama hala meşhur XML Model Benchmark sonuçlarını incelerseniz, farklı test tipleri için meşhur XML API'lerin nasıl değişik test sonuçları verdiğini görebilirsiniz.

Ben genelde parser olarak çok daha hızlı olan ve az memory kullanan PULL parser'ları tercih ediyorum. Bu konuda size de XPP3 'i önerebilirim. Fakat son yıllarda VTD-XML isminde XML datasını String olarak değilde byte olarak işleyen çok hızlı bir XML parser ön plana çıktı. (world's fastest XML processor benchmark results).

Sonuç

Buraya kadar anlattıklarımızı özetlersek çok çok mecbur kalmadıkça konfigürasyon dosyası dışında XML kullanmayın derim. (Bu konfigürasyon dosyalarını okumak için de lütfen kendiniz bir API yazmaya kalkmayın, Apache Commons Configuration'ı kullanın.) Diyelimki çok mecbur kaldınız o zaman aşağıdaki önerilere kulak asmanızda fayda var:

1) SOAP'tan uzak durun ve XML'in yapısını oldukça basit tutun. XML'in yapısı ne kadar basit ise o kadar hızlı işlenir.
2) Farklı yapılarda XML veriniz var ise hepsi için aynı XML Model'ini kullanmayan. Hatta process etmeden evvel, XML'in büyüklüğüne ve yapısına bakıp en uygun XML Model'ini seçen generic bir API bile yazabilirsiniz.
3) Veri büyüklüğünün üst sınırını bilemediğiniz servislerinizi XML ile sunmayın ya da limit koyun. Test ortamlarında ortalama 100Kb.'lık datalar ile çalışırken, production'da bir servis sonucu 10MB.'lık bir XML oluşursa çok ciddi üzülürsünüz :)
4) XML operasyonlarını servisi hazırladığınız veya karşıladığınız katmanda yapın ve XML objelerini hemen basit java objelerine çevirin. Business metodları içine XML objelerini geçirmeyin.
5) Vendorların her söylediğine hemen kanmayın (hatta şüphe ile yaklaşın). Unutmayın onların hedefi daha fazla ürün satmak, sizin hedefiniz ise projenin başarılı olması.

Bu aralar AJAX'ın çok moda olması nedeniyle XML konusunda bir hatırlatma daha yapmak istiyorum. Bildiğiniz gibi AJAX 'da client/server arasındaki data alışverişini mecburen XML ile yapıyor. Developer'lar AJAX kullanırken XML yüzünden sisteme binen yükün farkında değiller. Konu açılmışken AJAX'a henüz giriş yapmayanlar Sezer Yeşiltaş'ın AJAX konusundaki blog'una bir göz atabilirler

Performans katili, projelerimizin katili olmamalı! Önümüzdeki projelerde de buna dikkat etmeliyiz!

Konuyla ilgilenmek isteyen hem .NET'ciler hem de JAVA'cılar için birkaç link vermek istiyorum:

Comparing Web service perfomances(1):
http://msdn2.microsoft.com/en-us/vstudio/aa700840.aspx

Comparing Web Service performances (2):
http://www.sosnoski.com/presents/cleansoap/comparing.html

Checklist Web Service performances:
http://msdn2.microsoft.com/en-us/library/ms979173.aspx

Ve Sun 'ın olaya yanıtı:
http://java.sun.com/performance/reference/whitepapers/WS_Test-1_0.pdf

Adobe Acrobat: Please Die!! (Expirence during old AMVG Internship days)

Don’t get me wrong, Adobe makes some fine products. But for the life of me, I think their programmers are insane.

Up until six months or so ago, I used Adobe Acrobat to view, edit, create, etc. PDF files. And what happens every time you open Adobe Acrobat? It takes 5 minutes to load all of it’s fancy schmancy dlls and plugins just so that I can view a friggin PDF!

“No more!” said I six months ago, “this shall not continue!”

So I downloaded Foxit Reader to view my PDFs in. All well and good. You may ask why I’m posting this now, six months after the fact. because even though I can view PDFs in Foxit (without the 5 minute wait for Adobe), I can’t create or edit them. So, I have to keep Adobe installed for that purpose. Luckily, though, the need to create a customized PDF happens somewhat rarely, and most of the time I can just use the Bullzip PDF Printer from MS Word or Publisher or whatever. Sometimes though, I need the more advanced features of Adobe. Such an event occurred this very eve. I needed to make a PDF form…

So, I launch Adobe Acrobat, go make myself a cup of coffee while I wait, and proceed to create said PDF. Easy peasy, no fuss, etc. All done. Close Adobe and get a terse message that Adobe needs to download critical updates.

Now, having experienced the Adobe update routine before, I wasn’t too keen about it. I declined the request to update.

But Adobe wasn’t done yet.

Not by a long shot.

An hour goes by, the customer is happy with their PDF, and I decide to relax with a short game of Hacker Evolution. Midway through level 3, the game minimizes to the task bar (it runs full screen) and Adobe asks again to be updated.

No!” I shout, worried about the progress of my game which was interrupted. Accordingly, I click the button to dismiss the dialog and go back to my game (which paused automatically, thank goodness). I successfully finish level 3 in record time!

Okay, back to work. Now I’m writing a letter to a past due customer, asking them if they would be so kind as to pay their friggin bill. But wait! Adobe needs to install it’s updates right now!!

Now I’m irritated. I fumble through the dialog looking for the “Don’t ever ask me again, you stupid cow!” button. I know there is one; not visible, perhaps. In frustration, I click the “Download and Install Now” button. Big mistake.

So here I am 6,348 reboots later with a fully updated Adobe. Big whoop.

I summary, here are some questions for the Adobe Acrobat team:

  1. Why the heck do you need to load every single possible DLL and plugin that you can think of just to view a friggin PDF?! Why!?
  2. Why is Acrobat the only program in existence that requires the entire computer be restarted after every single update?! Even Windows Updates don’t need that, and they’re patching the ***-da**ed operating system. Do they need to reboot after ever update? NO! They need only one, big reboot after installing as many updates as were needed. Come on! If you can’t figure out a way to patch an application without restarting the OS each time, then you need to change careers; there is no place for you in the programmers’ kingdom.
  3. Why, oh why, do you feel it necessary to insert your bloatware into every possible orifice of an OS? I don’t want nor need your program to load with Windows, consuming resources and calling home every day in case their are any updates.

Useful Links:
Foxit Reader For Windows, an excellent free PDF viewer.


And i do not expect to get a reply message from Adobe Team encouraging me for development to do a better product, My answer is ready: G me the source, i'll give you the best :)

There, I feel better now.

Tuesday, August 28, 2007

Computer Sayings (My Favorites)

There are two ways to write error-free programs; only the third one works.

  • A printer consists of three main parts: the case, the jammed paper tray and the blinking red light.
  • The programmer's national anthem is 'AAAAAAAARRRRGHHHHH!!'.
  • At the source of every error which is blamed on the computer, you will find at least two human errors, including the error of blaming it on the computer.
  • Beta. Software undergoes beta testing shortly before it's released. Beta is Latin for "still doesn't work."
  • Computer analyst to programmer: "You start coding. I'll go find out what they want."
  • Computer Science: solving today's problems tomorrow.
  • Hidden DOS secret: add BUGS=OFF to your CONFIG.SYS
  • Hit any user to continue.
  • I wish life had an UNDO function.

  • If your computer says, "Printer out of Paper," this problem cannot be resolved by continuously clicking the "OK" button.
  • It said "Insert disk 3..." but only 2 fit in the drive.
  • Microsoft Windows: computing While U Wait
  • 665.9238429876 - Number of the Pentium Beast
  • I have yet to meet a C compiler that is more friendly and easier to use than eating soup with a knife.
  • My software never has bugs. It just develops random features.
  • Programming graphics in X is like finding sqrt(pi) using Roman numerals.
  • "To know recursion, you must first know recursion"
  • Life's unfair - but root password helps!
  • Mountain Dew and doughnuts... because breakfast is the most important meal of the day.
  • Hey! It compiles! Ship it!
  • "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
  • Intel: We put the "um..." in Pentium.
  • Helpdesk tip #2: When the support analyst says "Click...", wait for the rest of the sentence.
  • BREAKFAST.COM Halted...Cereal Port Not Responding
  • BUFFERS=20 FILES=15 2nd down, 4th quarter, 5 yards to go!
  • As a computer, I find your faith in technology amusing.
  • Disinformation is not as good as datinformation.
  • Smash forehead on keyboard to continue.....
  • Enter any 11-digit prime number to continue...
  • All wiyht. Rho sritched mg kegtops awound?
  • A good programmer makes all the right mistakes.
  • Managing programmers is like herding cats.
  • "There is an old saying that if a million monkeys typed on a million keyboards for a million years, eventually all the works of Shakespeare would be produced. Now, thanks to Usenet, we know this is not true."
  • "A good programmer is someone who looks both ways before crossing a one-way street."
  • C makes it easy to shoot yourself in the foot. C++ makes it harder, but when you do, it blows away your whole leg.
  • A computer scientist is someone who, when told to "Go to Hell," sees the "go to," rather than the destination, as harmful.
  • 1010011010 - The binary number of the Beast
  • APATHY ERROR: Don't bother striking any key. Application has reported a "Not My Fault" in module KRNL.EXE in line 0200:103F
  • "The three most dangerous things in the world are a programmer with a soldering iron, a hardware type with a software patch and a user with an idea."

Monday, August 27, 2007

Veritabanı Nedir?

GİRİŞ

Bu dökümanda aşağıdaki konular ele alınacaktır

  1. Veritabanı tanımı
  2. SQL nedir?
  3. Veritabanlarının kullanım alanları
  4. Relational veritabanlarının açıklanması
  5. Veritabanı çeşitleri ve açıklamaları
  6. Hangi veritabanı nerede kullanılmalıdır?
  7. e-posta listeleri

Veritabanı nedir?

http://www.m-w.com/ adresindeki Merriam-Webster sözlüğünde bir veritabanı :

“a usually large collection of data organized especially for rapid search and retrieval (as by a computer)” olarak tanımlanır. Şuanda çalışmakta olduğum ortramdan çıkardığım tanımıysa “You know DB is most complicated arena , just behind Operating system” olarak değerlendirilmesi gerken en karmaşık ve önemli yapılardandır.

Kitaplıklar, uygulamalar ve yardımcı programların birleşmesinden oluşur.

Verilerin saklanması ve yönetilmesi ile ilgili konulardaki ayrıntılardan veritabanı yöneticilerini kurtarır.

Kayıtların güncellenmesi ve kayıtlar üzerinde araştırma yapılması da mümkündür.

SQL (Structured Query Language)

Veritabanı dilidir. Program geliştiriciler, bir veritabanına veri eklerken, silerken, güncellerken veya sorgularken bu dili kullanırlar.

ANSI ve ISO standardıdır.

Select, Delete, Update, Where

SQL Nedir?

SQL (Structured Query Language)

Veritabanı dilidir. Program geliştiriciler, bir veritabanına veri eklerken, silerken, güncellerken veya sorgularken bu dili kullanırlar.

ANSI ve ISO standardıdır.

Select, Delete, Update, Where

Neden Veritabanı?

Gerçekten veritabanına gereksinmeniz var mı?

Veritabanları, verilerin saklanması ve yönetilmesi için kullanılmalıdır.

Küçük bilgiler için metin dosyaları yeterli olabilir.

Amacınızın iyi belirlenmesi gerekir.

Veri sadece bir konuyu içeren bir listenin içinde mi?

Sorun karmaşık mı?

İstatiksel bir analiz mi yapmak istiyorsunuz?

Bir yönetim mi yapacaksınız?

Metinsel veritabanları

Kullanım kolaylığı

Bilimsel formüllere gereksinmeniz olacak mı?

Veriyi paylaşma gereksinmeniz olacak mı?

Veriyi webde sunacak mısınız?

Relational Database Modeli (RDBMS)

Tablolardaki kayıtlar matematiksel açıdan tuple olarak tanımlanırlar.

Bir tuple tanımlanmış bir veri tipi olan bileşenlerden oluşan sıralı grup olarak tanımlanır.

Tüm tuplelar aynı sayıda ve tipte bileşenlerden oluşur.

{“ab01”, “Aydın”, “2001”}.

{“ab02”, “İstanbul”, “2002”}

Örnekteki her bir tuple da 3 bileşen bulunmaktadır:

Kaçıncı akademik bilişim olduğu (string)

Hangi ilde yapıldığı (string)

Yıl (numeric)

Relational veritabanlarında bu “kümeye” ya da tabloya eklenen tüm kayıtlar aynı biçemde olmalıdırlar

{“ab02”, “Aydın”}

– eksik bileşen

{“ab02”, “Aydın”, “2002”, “Şubat” }

fazla bileşen

{2002, “ab02”, “Aydın”}

– yanlış bileşen tipleri (yanlış sırada)

Ayrıca tuple lardan oluşan bir tabloda aynı veriler bulunmaz.(No duplicate record). Dolayısıyla relational veritabanlarındaki herhangi bir tabloda birbiriyle tamamen aynı iki kayıt (row or record) bulunamaz.

Bu, çok gereksiz bir sınırlama olarak görünebilir. Örnek vermek gerekirse, aynı kullanıcının aynı malı iki kez sipariş etmesi görünürde engellenmiştir. Bunu da tabloya bir bileşen ekleyerek çözebilirsiniz.

Bir kayıttaki her bir bileşen “atomik”, yani bir veri olmalıdır; başka bir kayıt ya da diğer bileşenlerin listesi olamaz.

Tablodaki bileşenlerin veri tipleri de üsttekilerle ve dolayısıyla tablo tanımlarındakilerle aynı olmalıdır. (Veritabanı tarafından desteklenen veri tiplerinden biri olmalıdır.).

Birbiriyle eş kayıtları ayırmak için kullanılan bileşenlere key denir.

referential integrity.

Tablodaki bir kaydı diğer tüm kayıtlardan ayırmak için kullandımız bileşene, primary key adı verilir. Primary key, o kaydı “unique” yapar. Tüm relational veritabanlarında her bir tablo ya da relationda mutlaka primary key olmalıdır.

Veritabanı çeşitleri

Öncelikle ne yapılacağına karar verilmelidir:

  1. Bu veritabanı ile neler yapacaksınız? Küçük bir şirket çalışanlarının özel bilgileri mi tutulacak, yoksa büyük bir şirketin binlerce müşterilerinin bilğileri mi?
  2. Sitenizi günde kaç kişi ziyaret edecek?
  3. Aynı anda kaç işlem yapılacak?
  4. Güvenlik ne ölçüde olacak?

Verilerinizin güvenliği ne ölçüde olacak?

Yanlış bir kanı : “Paralı ürünler iyidir, ücretsiz ürünler iyi değildir!

Linux, bu tezi çürüten, bilgisayar sektöründeki son yıllardaki en iyi konudur.

Bir veritabanının ücretsiz olup olmamasından çok işinizi görüp görmeyeceği önemlidir.

  1. Microsoft Access (Hala bankalarda kullanılan m.ö’den kalan db)
  2. MySQL (tam anlamıyla sp yazamadığın nasa’nın nasıl kullandığına hayret ettiğim db)
  3. IBM DB2 (Yetenekleri hiçbirzaman Oracle kadar olamayacak pahalı db)
  4. Informix
  5. Microsoft SQL Server (Her ms ürünü gibi kullanmaya mecbur kalacağım db)
  6. PostgreSQL (Favorim – Open Source’un en kral db’si)
  7. Oracle (Hala var olan en yetenekli ve gelişmis db)
  8. Interbase

MS Access

Microsoft Office ürünüdür.

Küçük ölçekli uygulamalar içindir.

Tablo başına 2 GB a kadar veri depolayabilir.

Aynı anda 255 bağlantıya izin verebilir.

Linux/MAC sistemlerinde kullanılamaz.

“Transaction locking” özelliğine sahiptir, ancak “trigger” ve “stored procedure” özelliklerine sahip değildir.

MySQL

MySQL Inc.

Windows, Linux, OS/2,Solaris, AIX vb.

“trigger” ve “stored procedure” özelliklerine sahiptir, ancak “Transaction locking” özelliği bulunmamaktadır.

Tablo başına 2 GB veri depolayabilir.

IBM DB2

IBM

Access ve MySQL e göre daha performanslı, ancak küçük işletmelere göre daha yüksek maliyete sahiptir.

*nix ve Windows üzerinde çalışabilir.

Transaction locking”, “trigger” ve “stored procedure” özelliklerine sahiptir.

Informix

Illustra

Ücretli ve güçlü bir veritabanıdır.

Orta ölçekli işletmelerin yükünü kaldırabilecek kapasitededir.

1994’deki Postgres kodundan geliştirilmeye başlanmıştır.

MS SQL Server

Microsoft

Dezavantajı: Sadece Windows üzerinde çalışabilir. Yüksek maliyet

Kullanım kolaylığı, güvenilirliği,işlem gücü

Maliyeti diğer veritabanlarına göre yüksektir.

Tablo başına 4 TB veri depolayabilmektedir.

“Transaction locking”, “trigger” ve “stored procedure” özelliklerine sahiptir.

PostgreSQL

PostgreSQL Global Development Group

Linux, Unix, BSD, Windows, AIX vb.

Ücretsiz, akademik bir veritabanı

Çok güçlü işlem yapısı

Veri güvenliği ön planda

Tablo başına 64 TB veri tutabilme özelliği

“Transaction locking”, “trigger” ve “stored procedure” özelliklerine sahiptir.

Anlıyacağınız Oracle’ın ücretsiz haline yakındır, 14tb veri tuttuğunu gözlerimle gördüm :)

Oracle

Oracle, Inc.

Dünyanın en güçlü ve güvenilir veritabanı olarak gösterilmektedir.

Support konusunda sorunu olmayacak, yüzlerce tool’u olan bir efsanedir.

Çok yüksek maliyetlidir

Windows, Unix, Linux

Oracle, sınırsız sayıda tabloları desteklemektedir.

Hangi Veritabanını Seçmeli?

Çok derin ve stratejik bir karar olmakla birlikte çok çok sığ bakarsak olaya;

Küçük yoğunlukta trafik: MySQL ya da Access

Daha büyük ve orta ölçekli uygulamalar içinse, MS SQL ya da Linux makineler ve Server'lar üzerinde PostgreSQL kullanılabilir.

Oracle ise çok yüksek güvenilirlik ve işlem gücü gerektiğinde tercih edilen bir veritabanı sunucusudur.