Posts under Programlama Category
RIA(Rich Internet Applications-Zengin Internet Uygulamaları) henüz ülkemizde fazla bilinmeyen ancak gelecekte çok konuÅŸulacak ve kullanılacak bir teknoloji… RIA nedir sorusunun detaylı bir cevabını İlyas DoÄŸruer’in sitesinde okuyabilirsiniz.
RIA ile ilgili geliÅŸmeleri yakından takip ediyorum. Özellikle geniÅŸbant Internet baÄŸlantılarının yaygınlaÅŸmasıyla SaaS (Bir hizmet olarak yazılım) konseptinin Türkiye’de de oturacağını ümit ediyorum. 2000-2001 yılında ASP (Uygulama Hizmet SaÄŸlayıcılığı) kavramı Türkiye’de de tartışılmış ama gerek ÅŸirketlerin güvenmemesi, gerekse Internet baÄŸlantılarının hızının yetersiz ve maliyetinin yüksek olması sebebiyle bir türlü kabul görmemiÅŸti. Åžimdi ise SaaS ve On Demand yöntemlerini kullanan ERP vb. iÅŸ uygulamaları piyasaya çıktı. Microsoft ve Sun gibi ÅŸirketler yeni teknolojileri duyurmaya baÅŸladı. Adobe sessiz sedasız pazarın en popüler ve hırslı ÅŸirketi oldu.
RIA gibi yeni bir konseptin Türkiye’de bir konferansla tartışılacağını gördüğümde ise ÅŸaşırdım. Konunun böyle geniÅŸ bir yaklaşımla ele alınması çok sevindirici bir geliÅŸme… MMİstanbul ekibi, Temmuz ayı sonunda düzenlemeyi planladığı RIA konferansı öncesinde 2 günlük bir hazırlık konferansı düzenlemiÅŸti.
Cumartesi günü aynı anda Webrazzi & Techcrunch Meetup toplantısı da olduğundan katılım biraz azdı. Aslında RIA için daha önemli konuların konuşulduğu son oturumlarda ise iyice azalmıştı. Ancak sanırım asıl konferans daha yüksek katılımla yapılır.
MMİstanbul bir Adobe kullanıcı topluluÄŸu olduÄŸundan olsa gerek, ağırlıklı olarak konular Adobe teknolojileri üzerineydi. Ajax ve Silverlight sunumları vardı ama belki de Türkiye’de pek tanınmadığından, JavaFX, OpenLaszlo, Curl gibi pazarın nispeten küçük ama iddialı oyuncuları yoktu. Daron Yöndem’in stand up benzeri bir tanıtımla yaptığı Silverlight sunumunda “.Net programcılarını Flex öğrenmeye zorlayamazsınız. Bu yüzden Silverlight popüler olacak” dediÄŸi gibi, mesela Java programcıları da JavaFX öğrenmek ve kullanmak taraftarı olacaklardır. Yine özellikle kurumsal RIA pazarının ilginç oyuncularından birisi olan Curl kendi yazılımının çok daha performanslı ve güvenli olduÄŸunu iddia ediyor.
İddialar bir tarafa, önemli olan kurumsal RIA konsepti… İster PHP+AJAX kullanarak, ister AIR kullanarak yazın; eÄŸer kullanışlı ve güvenli bir ERP ya da CRM uygulaması yazdıysanız bu sektörden ekmek yersiniz. İdealERP veya Unity On Demand gibi…
Haftasonunu dolduracak kadar kapsamlı bir hazırlık konferansı düzenledikleri için MMİstanbul ekibine teÅŸekkürler… Asıl konferansı sabırsızlıkla bekliyoruz.
Bu yazı Bilgisayar mühendisi ne iÅŸ yapar? adlı çalışmanın ilk bölümü…
Bilgisayar mühendislerinin en bilinen çalışma alanlarından birisi yazılım sektörüdür.
Yazılım geliÅŸtirme iÅŸi genelde adına “Yazılım yaÅŸam döngüsü” denilen bir süreç içerisinde yürür. Bilgisayar mühendisleri planlama, analiz, tasarım, kodlama, test/kalite yönetimi ve kurulum gibi aÅŸamalardan oluÅŸan bu sürecin her tarafında yer alabilirler.
Bazen aşağıdaki pozisyonlar için ayrı insanlar çalışabildiği gibi, bazen de bir kişi pozisyonlardan birkaçının işini yapar.
Planlama / Analiz
İş Analisti
Müşterilerin ihtiyacını anlamaya yönelik çalışmalar yapan pozisyondur. Şurada anlatıldığına göre;
İş analisti, proje yaşam döngüsünün daha çok proje imza öncesi ve proje başlangıç aşamasında rol alır. Bu kişiler, yazılıma özel gereksinimlerden daha çok yapılacak işe özel ihtiyaçları belirler.
Burada “ihtiyaç” dememin de özel nedeni var. Bunlar müşterinin “ihtiyaç” duyduÄŸu ama hala gereksinime dönüşmemiÅŸ haldedir. Şöyle örnek vereyim: Bir kiÅŸinin arabaya ihtiyacı olur. İş analisti sadece bu kiÅŸinin araba ihtiyacını ortaya koyar. “Adam araba istiyor” der geçer. Sonra gereksinim analisti, bu kiÅŸinin hangi marka, ne özelliklerde, ne tip arabaya ihtiyacı olduÄŸunu belirleyerek arabanın “gereksinimlerini” ortaya koyar.
Sistem Analisti
Yazılım dünyasında sistem analistleri, kullanıcılardan ya da iş analistlerinden gelen bilgileri kullanarak geliştirilecek yazılım veya çözümün yapısını belirler. Gerekli işlem adımlarını ve aşamalarını hazırlar. Yani sadece ihtiyacı değil, ihtiyaca göre çözümü üretir.
Sistem analisti genel olarak ise tüm bir bilgi işlem sistemini tasarlayıp ihtiyaca göre çözümler öneren kişidir.
Tasarım
Yazılım Tasarım Uzmanı
Yazılım tasarımı, altyapı bileÅŸenleri dahil tüm yazılım yapısını planlamak demek. Büyük yazılım ÅŸirketlerinde sadece yazılım tasarımı ile görevli mühendisler bulunur. Bu mühendisler kod yazacak kiÅŸilere ihtiyaçları olan yapıyı hazırlar. Yazılım geliÅŸtirme iÅŸini hızlandıran “tasarım ÅŸablonlarını” tavsiye eder. Gerekirse yazılımın bir prototipini hazırlar.
Yazılım Modelleme Uzmanı
UML denilen modelleme ve diyagram çizme dilini kullanarak yazılımın işleyişini tanımlar. Hatta programı şekiller (diyagramlar) kullanarak baştan sona yazarlar. Modellemesi doğru yapılmış bir yazılımın hem geliştirilmesi, hem bakımı hem de dokümantasyonu daha kolay olur. Bugün Rational Rose gibi yazılımlar kullanılarak UML diyagramları ile kod parçacıkları kolaylıkla ilişkilendirilebiliyor.
GeliÅŸtirme
Programcı / Geliştirici / Yazılım Uzmanı
Programlama dillerini ve teknolojilerini kullanarak ürün geliştiren kişidir. İşin ve firmanın büyüklüğüne göre bazen tüm yazılımı geliştirir, bazen sadece kendisine verilmiş bölümü hazırlar. Programın bütününe hakim olmadığı durumlarda, sistem analistinden ya da proje yöneticisinden destek alır.
Yazılım Mühendisi
Yazılım Mühendisliği aslında genel bir kavram. Bir yazılım mühendisi yazılımla ilgili tüm aşamalarda bulunabilecek özelliklere sahip kişidir. Hem analiz, tasarım hem de kodlama aşamalarının teorisini bilir, uygulamalarını yapabilir. Yöneticilik pozisyonlarına gelebilir, altında programcı ve analistler çalıştırabilir. Sektörde en çok kullanılan ünvanlardandır.
Yazılım Mimarı / Yazılım Danışmanı
Yazılım mimarlarının sorumluluk alanları çok geniş ve zordur. Şurada yazdığı şekliyle;
Projede kullanılacak teknolojileri seçerler, proje metodolojisi ve süreçlerinde tavsiyelerde bulunurlar, uygulamanın genel tasarım ve yapısını oluşturur ve korurlar, projenin doğru tanımlanmasını sağlarlar, tasarımın dökümante edilmesi ve kodlama standartlarının belirlenmesi ile uğraşırlar. Proje yöneticisine teknik görev tahminlerinde, proje maliyetleri ve yararları konusunda yardım ederler. Zor teknik görevlerde programcılara yol gösterirler. Teknik personel seçimi ve işe alımında yönetime yardımcı olurlar.
Her alanda olduğu gibi yazılım alanında da yöneticilik pozisyonları var. Genelde geliştirme ekiplerinde belli bir süre çalıştıktan sonra yönetim kademelerine geçiş yapılır ya da yeteneğe ve politikalara bağlı olarak değişir.
Ekip Lideri / Proje Yöneticisi
Proje Lideri/Yöneticisi yazılım ekibini bir arada tutan ve zaman çizelgelerine uyulması için gerekli motivasyonu sağlayan yöneticidir. Ayrıca yönetim ile proje ekibi arasındaki bilgi alışverişini de sağlar. Bütçe konularında düzenlemeler ve maliyet analizlari konusunda yönetim kuruluna bilgi ve tavsiye verir. Yazılacak modüllerin ve arayüzlerin zorluk derecelerine göre zamanlarını tayin eder ve proje planı içinde yayınlar. Diğer proje ekipleri ile bilgi alışverişini sağlar ve kontrol altında tutar. Projedeki her türlü riski takip eder ve kaynaklarını ona göre tahsis eder. Riskleri belgeleyerek çözümler için onaya sunar. Onay sonucu çıkan kararları işleyerek sonuçları tekrar yönetim kuruluna bildirir. Kaynak
Program Müdürü
Türkiye’de çok fazla kullanılmayan bu terim karşılığını en fazla Microsoft’ta bulur. Program Müdürleri teknik konulardan daha çok yönetim iÅŸleri ile sorumludur. Proje yöneticilerini koordine edip raporlar alarak projelerin saÄŸlıklı yürümesini saÄŸlarlar ve üst yönetimi bilgilendirirler.
Test / Kalite Güvence
Yazılımda kalite güvence, kısaca yazılım projesinin standardlara uygunluğunu ve ihtiyaçları karşıladığını denetleyen çalışmalar demektir.
Bilgisayar mühendisleri bu alanda da çeşitli görevler alır.
Yazılım Kalite Uzmanı
İhtiyaçların ve geliştirilen çözümün doğru belirlenip belirlenmediğini, yazılımın belirli standardlarda olup olmadığını denetleyen kişidir.
Yazılım tasarımı ve/veya yazılım testi konularında bilgi sahibidir. Genel kalite yönetim sistemi standartlarını, uluslararası yazılım mühendisliği standartlarını ya da süreç olgunluk modellerini (CMMI, SPICE, v.b.) bilir. Geliştirilen yazılımın bunlara uygun olarak yürümesini sağlar.
Test Uzmanı / Test Mühendisi
Test uzmanı/mühendisi yazılımın test edilmesinde fiilen çalışan kişidir. Yazılım hatalarını tespit etmek, hataların sebepleri ve sonuçları ile ilgili süreci yönetmek, test kapsamının oluşturulması, test senaryolarının hazırlanması gibi işleri yürütür.
Birim testi, sistem testi, entegrasyon testi, kullanıcı kabul testleri gibi kavramları bilir ve uygular. Sonuçlara göre dokümantasyon hazırlar.
Test mühendisliği hakkında şurada güzel yazılar var.
Test Yöneticisi
Test yöneticisi test ekiplerini koordine eden, gerekli kalite standartlarının sağlanması için çalışan, yazılım geliştirme ve diğer ekiplerle koordinasyonu sağlayan pozisyondadır.
Yazılımın testi geçip geçemediği, kabul edilmeye hazır olup olmadığı kararlarını verir.
Test sürecini kolaylaştıracak, otomatize edecek çözümleri uygular.
Konfigürasyon Yöneticisi
Yazılım geliştirme süreci boyunca üretilen bütün dokümanların, kodların, web uygulaması ise web sayfalarının, test scriptlerinin versiyonlarının kontrol edilmesi gerekir. Yazılım sürümleri içerisinde hangi hataların düzeltildiğinin hangi değişikliklerin yapıldığının izlenmesi gerekir. Ürün haline gelmiş projelerin satışa hazırlanan versiyonlarının belirlenmesi ve yönetilmesi gerekir.
İşte konfigürasyon yöneticisinin işi bunları takip etmektir.
Yazılımcıların bitmeyen merakı ilginç sonuçlar doğuruyor. Şurada gösterdiği ve şurada uzun uzun anlattığına göre, iPhone üzerine bir Java sanal makinesi ve web server kurarak, cihazı mobil bir java sunucuna dönüştürmüşler.
JamVM çok küçük boyutlu ve açık kaynak kodlu bir Java sanal makinesi. Ufaklığına rağmen, çoklu thread yapısını ve hatta JNI destekliyor. Jetty de tamamen Java kodlu bir web server. Bu ikisini birleştirerek iPhone üzerinde java uygulamalar yazılabilecek bir ortam oluşturmuşlar.
Aslında iPhone’un klavyesi bile yok. Ama geniÅŸ bir ekranı ve sanal klavyesi var. Bu da bir programcıyı tetiklemeye yetiyor.
iPhone bazı uygulamaların bilgilerini SQLite veritabanında saklıyor. Proje ile uğraşanlar SQLite için JDBC sürücüsü kullanarak iPhone veritabanına erişen bir uygulama da yazmışlar.
Cep telefonlarından Internet eriÅŸimi yıllardır var. Ancak ne WAP ekranları, ne de Internet Explorer ya da Opera’nın cep telefonlarının boyuna sığmaya çalışan mobil sürümleri kullanıcıları tatmin edemedi. Üstelik web teknolojileri almış başını giderken, hala mobil cihazlardaki yazılımların sayfaları render etme yeteneÄŸi yetersiz.
Daha doÄŸrusu öyleydi. iPhone’un çıkışı kablosuz aÄŸların yaygınlaÅŸması ve yeni web teknolojileriyle birleÅŸince durum deÄŸiÅŸti. Bakın NetApplications ve Cloud Four tarafından yapılan araÅŸtırmaların istatistikleri ne diyor?

- iPhone’un pazar payı %1 civarında. Symbian iÅŸletim sistemi kullanan telefonların pazar payı ise %40.
- Bu yılın ilk günlerinde iPhone’lardan yapılan Google aramalarının sayısı tüm Symbian telefonlarından yapılan aramaları geçti.
- iPhone kullanıcılarının %95′i düzenli olarak Internet’te sörf yapıyor. %51′i Youtube’den video izlemiÅŸ.
- iPhone’dan yapılan Google aramalarının sayısı diÄŸer herhangi bir mobil cihazdan yapılan aramaların 50 katı. Bu sonuç Google’ı o kadar ÅŸaşırtmış ki, doÄŸru olduÄŸuna emin olmak için log dosyalarını yeniden incelemiÅŸler.
- Google, Yahoo, Quicken gibi büyük şirketler iPhone için özel web sayfaları ve hizmetleri hayata geçirmişler.
Üstelik bu sonuçlar iPhone 3G öncesinde böyle.
Mobil Internet kullanımının artışı web sitelerinin yapısında mobil kullanıma uygunluk için deÄŸiÅŸiklikler yapmayı gerektiriyor. Mesela Yahoo bir web sitesini hızlandırmak için daha az HTTP request yapılmasını, verilerin Gzip kullanılarak sıkıştırılmasını, Javascript ve CSS’in gömülü deÄŸil harici bir dosyadan çağırılmasını vb. öneriyor.
Bir proje yönetim yazılımı olmadan yazılım projelerini yürütmek çok zordur. Bu yüzden, ticari ya da ücretsiz bir çok proje yönetim yazılımı var.
Peki binlerce personel barındıran Google’da proje yönetimi nasıl yapılıyor? 
Şurada yazılan bilgilere göre Google bu iş için bilinen bir yazılım kullanmıyor. Aksine e-mail gibi basit bir araç kullanıyor.
Her hafta Google çalışanları geçen hafta ne yaptıklarını ve bu haftaki planlarını soran otomatik oluÅŸturulmuÅŸ bir e-mail alıyor. Åžirket içinde geliÅŸtirilmiÅŸ bir program dönen e-maillerin içindeki bilgileri ayıklıyor ve düzenli bir ÅŸekilde saklıyor. Daha sonra, mesela bir sonraki hafta gelen e-mailde “Geçen hafta ÅŸu 6 iÅŸi yapacağını söylemiÅŸtin. Bitti mi?” gibi ifadeler yer alıyor.
Google zaten uzmanlık alanı olarak veri ayıklama ve anlamlandırma işi ile uğraştığından bu e-mailleri de düzenli bir yapıda saklayabiliyor. Böylece çalışanlar bir sürü seçenek işaretlemeden, kolay ve düz bir şekilde rapor vermiş oluyor.
Ayrıca bu veriler bir veritabanında aranabilir bir şekilde saklanıyor. Yöneticiler projelerin nasıl gittiğini aramalar yaparak görebiliyor. Yine bu veritabanında diğer Google çalışanları da aramalar yapıp istedikleri projeye katılmak üzere başvurabiliyor.
- Günümüzdeki bilgisayar mühendisliği dersleri yeterince sıkı değil, iyi düşünme ve problem çözmeyi teşvik etmiyor. Aksine derslere katılımı kolaylaştırmak için içerik daha da basitleştiriliyor.
- Mesela, ilk dil olarak Java’nın öğretilmesi bu süreci hızlandırıyor. Özellikle de grafik arayüzlerinin kullanımı öğrencileri arka plandaki kaynak kodu anlamadan sürükle bırak kolaycılığına itiyor.
- “Matematik eÄŸlenceli deÄŸil, derslerdeki oranını düşürelim. Algoritma zor, gerek yok. Hazır kütüphaneler zaten var. Sonra insanlar görsel güzelliÄŸe önem veriyor. Komut satırını boÅŸverin” anlayışı yerleÅŸiyor.
- Eski yazılımcılardan biri yeni mezun olmuÅŸ çalışanına hatayı bulmak için “call stack” a bakmasını söylediÄŸinde “böyle bir ÅŸey duymadım” dediÄŸini anlatıyordu.
- Bir Java kitabı alıyorsunuz, 1200 sayfa. Ama içinde 300 sayfa komutlar kalan 900 sayfa hazır kütüphaneler… Bu yazılım mühendisliÄŸi deÄŸil, tüketici düzeyi programcılık…
- EÄŸer öğrenciler okula gelip, Java’yı, hazır kütüphaneleri ve web programcılığını öğrenip bırakacaklarsa, bu bir iÅŸe yaramaz. Yetenek gerektirmeyen iÅŸleri, daha ucuza çalışılan ülkelere kaydırırsınız, olur biter.
- Yani, bugünün hazır kod programcısı, yarın pizzacı olur.
- Yazılım mühendisi olacak kişinin zor problemlerle uğraşmaktan zevk alması, ilginç algoritmalar üretmesi, zekice veri yapıları oluşturabilmesi lazım. Problem çözmekten sıkılan adam bizim aradığımız adam değil.

Kısaltarak çevirdiÄŸim bu yazıda, New York Üniversitesi’nin kıdemli profesörlerinden Robert Dewar Amerikan öğrencilerinden bahsediyor. Ancak sanki yazılanlar bize pek yabancı deÄŸil. Ne dersiniz?
Java ile yazdığınız uygulamanın kaynak kodlarında bir satır bile değiştirmeden kullanıcı adı ve şifre kontrolünü, akıllı kart kullanımını ya da parmak izi kullanımını nasıl eklersiniz?
JAAS (Java Authentication and Authorization Service) paketleri Java’nın içindeki güvenlik sistemini biraz daha geliÅŸtiriyor ve farklı kaynaklar kullanılarak güvenlik sistemleri oluÅŸturmayı mümkün hale getiriyor.
Java SDK içindeki java.security.* paketleri bir uygulamanın güvenliğinin sağlanması için temel metotları içeriyor. Bunlar arasında byte-code doğrulayıcısı (byte-code verifier), sınıf yükleyicisi (class loader), güvenlik yöneticisi (security manager), erişim denetleyicisi (access controller), politikalar (policy) ve koruyucu alanlar (protecting domain) sayılabilir.
Bunlara ek olarak geniÅŸletme kütüphaneleri (extension API) sayesinde uygulamaların güvenliÄŸi istenilen seviyelerde arttırılabiliyor. JAAS bunlardan birisi…
JAAS temel olarak uygulamaya kimlik bilgisi döndürecek bir LoginContext ve bu kimlik bilgisinin çeÅŸitli yollarla elde edilmesini saÄŸlayan bir LoginModule‘den oluÅŸuyor.
LoginModule sınıfından genişletilerek oluşturulan modüller kimlik bilgisi için bir veritabanına bağlanan, Kerberos ya da LDAP dizininden kullanıcı bilgisi alan, akıllı kart okuyucudan veya parmak izi okuyucudan bilgi aktaran bir yapıda tasarlanabilir. Uygulamadan bağımsız olarak modüller tasarlamak bize eklenip çıkarılabilir bir kimlik denetimi yapısı sağlar.

Uygulamamızda JAAS kullanmak için şöyle bir yol izliyoruz:
Öncelikle bir konfigürasyon dosyası oluşturuyoruz. Daha sonra uygulamayı çalıştırırken parametre olarak bu dosyayı vereceğiz.
jaas.config
Ornek
{
DBLoginModule required
debug="true"
url="jdbc:mysql://localhost/jaasdb?user=root&password=pass"
driver="org.gjt.mm.mysql.Driver";
};
Uygulamayı çalıştırırken kullanımı:
java -Djava.security.auth.login.config=jaas.config JaasTest
Burada kullanacağımız modül, bir MySql veritabanına bağlanarak kullanıcı adı kontrolü yapıyor.
JaasTest uygulamamıza bu modüllere eriÅŸip kullanacak LoginContext’i tanımlıyoruz.
JaasTest.java
...
/* JAAS sınıfları */
import java.security.*;
import javax.security.auth.*;
import javax.security.auth.login.*;
...
try {
// LoginModule ile haberleşecek olan sınıf
ConsoleCallbackHandler cbh = new ConsoleCallbackHandler();
LoginContext lc = new LoginContext("Ornek", cbh);
try {
// LoginModule içinde login metodunu kendimize uygun şekilde
// tanımlayacağız.
lc.login();
// Subject : kimlik denetimi bilgilerini içeren nese
subject = lc.getSubject();
// Principal : Yetkili olan kiÅŸiler vb.
Iterator it = subject.getPrincipals().iterator();
// Credential : Yetkiler, haklar vb.
it = subject.getPublicCredentials(Properties.class).iterator();
...
// Programın çalışma rutinleri
// Program çıkışında
lc.logout();
} catch (LoginException lex)
{
....
}
} catch (Exception ex)
{
...
}
System.exit(0);
}
Temel anlamda kullanılan sınıf ve metotlar böyle…
Şimdi MySQL veritabanına bağlanıp kontrol yapan login modülümüze bakalım.
DBLoginModule.java
...
import java.security.*;
import javax.security.auth.spi.LoginModule;
import javax.security.auth.login.LoginException;
import javax.security.auth.Subject;
import javax.security.auth.callback.*;
...
public class DBLoginModule implements LoginModule
{
// initial state
CallbackHandler callbackHandler;
Subject subject;
...
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
// ön işlemler
}
public boolean login() throws LoginException
{
// veritabanına bağlanıp yapılacak kontroller
// Buraya akıllı kart, parmak izi okuyucu vb.
// kontrolleri eklenebilir
}
public boolean commit() throws LoginException
{
// Otomatikmen çalışır
// login işlemi doğru yapıldı ise true, değilse false döndürür
}
public boolean abort() throws javax.security.auth.login.LoginException
{
// işlem başarısız olduğunda burası çalışır
}
public boolean logout() throws javax.security.auth.login.LoginException
{
// uygulamadan çıkışta yetkileri temizler
}
}
Bu örnekte veritabanına bağlandık. Sadece LoginModule ve jaas.config dosyalarında değişiklik yapılarak istenen kontrol yöntemi uygulanabilir. Böylelikle uygulamamızın kaynak koduna müdahale etmeden güvenlik kontrolü ekleyebiliriz.
JAAS konusunda bilgilenmek isteyenler için maalesef Türkçe doküman yok. Ancak İngilizce olarak şu bilgilendirici sunum, şu yazı, Sun sitesindeki orijinal kılavuz faydalı olabilir. Ayrıca veritabanına bağlanan, akıllı kart okuyucudan bilgi alan, parmak izi okuyucuya bağlanan örnekler incelenebilir.
Facebook, -şöhreti, getirdikleri ve hakkındaki iddialar bir yana- sonuçta bir yazılım… Bu kadar çok kullanılan bir uygulamanın arkaplanında ve teknik altyapısında neler var?
Önce birkaç istatistik… (Facebook sayfasından)
- Siteye ortalama her gün 250 bin yeni kayıt oluyor.
- Ayda ortalama 65 milyar sayfa gösterimi var.
- Kullanıcıların en az yarısı her gün giriyor.
- Dünya’nın en çok kullanılan fotoÄŸraf paylaşım uygulaması… En yakın üç rakibinin toplamından daha fazla resim gösterimi yapılıyor.
- Facebook platformunu kullanan 7 binden fazla uygulama yazılmış. Her gün yüzden fazla yeni uygulama ekleniyor.
Teknik altyapıya gelince…
- Neredeyse tamamen açık kaynaklı uygulamalar kullanılmış.
- Yazım dili PHP. Arka planda çalışan bazı uygulamalar Java, Python ve Perl kullanıyor. Ayrıca C++ uyumlu uygulamalar için gcc ve Boost kütüphaneleri kullanılmış. Yine, c++ uygulamalarının daha sağlıklı çalışması için kendileri phpembed adlı bir kütüphane yazmışlar.
- Sunucularda Linux yüklü. Web server olarak Apache kullanılıyor. Dünyanın her yerinde hızlı çalışması için içeriğin çoğunu Akamai sunucularında tutuyorlar.
- Sistemde 2 milyardan fazla fotoÄŸraf dosyası yüklü. Bunlar diskte yaklaşık 200 terabyte yer tutuyor. Kullanıcılar her hafta 80 milyon civarında resim yüklüyor. Her fotoÄŸraf için 4 ayrı boy tutulduÄŸundan, bu 300 milyondan fazla resim dosyası demek. OluÅŸan yoÄŸunluÄŸu karşılayabilmek için, yüklenen fotoÄŸrafları iÅŸleyen bir çok sunucu var. Ayrıca bir grup sunucu, iÅŸlenmiÅŸ fotoÄŸrafları Akamai’ye gönderiyor. Bazı fotoÄŸrafları tutmak üzere kendi dosya sunucuları da var.
- Veritabanı olarak MySQL kullanılıyor. Birbirine bağlı binlerce MySQL veritabanları var.
- Veritabanından bilgi çekmek çok yavaş olduğu için cache (önbellek) mekanizması kullanılıyor. memcached isimli açık kaynaklı uygulamayı kendi yazdıkları kodlarla geliştirmişler. (detaylı bilgi)
- Sitenin neredeyse belkemiÄŸi bu uygulama. Kullanıcı profillerini, arkadaÅŸ bilgilerini, uygulamaları hep önbellekte (RAM’de) tutuyor ve çok hızlı gelmesini saÄŸlıyorlar.
- 400′den fazla memcached sunucusu var.
- 5 Terabyte’dan fazla RAM önbellekleme için kullanılıyor.
- memcached sorgularının daha hızlı çalışması için TCP yerine UDP portunu kullanmışlar.
- Ayrıca APC kütüphanesini kullanarak sayfa görüntülemeyi 30 kat hızlandırmışlar.
- Kendi yazdıkları site içi arama motorunu kullanıyorlar. Ayda 1 milyara yakın arama yapılıyor. Önbellek için 2 terabyte civarında RAM ayrılmış. Ortalama sonuç süresi 100 milisaniye civarında imiş.
- Yazdıkları kodu yerinde debug etmek için phpsh adlı bir komut satırı kütüphanesi yazmışlar. Ana bilgisayara yükleyip bağlandığınızda komut satırından php kodları yazıp çıktısını görüyorsunuz.
- Versiyon yönetimi için Subversion ve git kullanıyorlar.
Yani, Facebook olmak istiyorsanız altyapınızı da ona göre kuracaksınız.
Aslında sanallaÅŸtırmadan bahsederken geleceÄŸin teknolojisi olarak anlatmak yanlış. Çünkü neredeyse 40 yıldır varolan bir terim ve kullanım… Ancak, son dönemde yeni geliÅŸtirilen özellikler ve donanım teknolojileri sayesinde yeniden popüler oldu. Gelecekte özellikle iÅŸ uygulamalarında yıldızı parlak olacak.
Sanallaştırma (Virtualization), en basit haliyle, bir bilgisayar üzerinde birden çok işletim sistemini aynı anda çalıştırmak olarak tanımlanabilir. Örneğin Windows XP yüklü bilgisayarımızda, bir pencere içinde Linux çalıştırabilir ve tüm donanım özelliklerini Linux içinden de kullanabiliriz.
Sanallaştırma işlemi bir çok amaçla kullanılıyor. Örnek vermek gerekirse;
- MS-DOS için yazılmış bir programı yeni bir bilgisayarda program üzerinde değişiklik yapmadan çalıştırabiliriz.
- Güçlü bir bilgisayara birden çok iÅŸletim sistemi kurarak donanım maliyetlerinden tasarruf edebiliriz. Bir firmanın sayfasında %70′e kadar maliyet düşüşünden bahsediliyor.
- Bir uygulamayı sanal işletim sistemine kurup, daha sonra fiziksel bir değişiklik gerektiğinde, örneğin yeni bir ana bilgisayara geçilirken sanal işletim sistemini durdurup, işletim sistemi dosyasını yeni bilgisayara taşıdıkta sonra tekrar çalıştırarak kaldığımız yerden devam edebiliriz.
Sanallaştırma işlemi değişik seviyelerde yapılıyor. Mesela platform sanallaştırması bir bilgisayarda birbirinden bağımsız işletim sistemlerini kaynakları paylaştırarak çalıştırmayı sağlıyor. Çok detaylı bir konu ama şöyle bir örnek verebiliriz: 8 işlemcili bir bilgisayara 8 ayrı sanal işletim sistemi kurup her birine ayrı işlemciler ve RAM kaynakları tahsis edilebiliyor.
Son dönemde hosting şirketleri bu yöntemi kullanarak isteyenlere sanal özel sunucu denilen (VPS) bir hizmet sunmaya başladılar.
Bu konuda pazarın güçlü oyuncusu VMvare hakkında bir teknik doküman şurada yer alıyor.
Ayrıca Microsoft’un stratejileri ve diÄŸer bir oyuncu Xen hakkındaki bu sunum teknik anlamda faydalanılabilecek kaynaklar…
Sektördeki bir çok firma, sanallaÅŸtırma alanında çalışmalar yapıyor. Neler olup bittiÄŸini anlamak için bu ve bu yazıları okuyun. Amerika’daki bir araÅŸtırma ÅŸu anda En büyük 1000 firmada %29 oranında sanallaÅŸtırmaya ilgi duyulduÄŸunu gösteriyor.
Yazı içindeki baÄŸlantılardan bu konu ile ilgili bir çok detay öğrenilebilir. Gelelim, bir biliÅŸim öğrencisi için gelecekte bu konuda ne gibi fırsatlar olduÄŸuna…
Donanım, ağ ve işletim sistemleri konusunda kariyer yapmak isteyen öğrenciler sanallaştırma üzerine geleceklerini kurabilirler. Bu noktada öğrenilecek çok şey var. Öncelikle şu harika makale okunmalı. Daha sonra, makalede geçen ürün ve kavramlar (hypervisor gibi) hakkında detaylı bilgiler edinilmeli. Uygulamalı çalışmalar yapılmalı. Teknolojik gelişmeler ve etkinlikler yakından takip edilmeli.
Yazılım üzerinde kendini geliÅŸtirecek öğrenciler için de sanallaÅŸtırma büyük fırsat… Sanal makineleri yönetecek uygulamalar, sanal makineler arası haberleÅŸme ve transfer yapacak uygulamalar, yedek alma, web üzerinden sanal makinelere ulaşım uygulamaları geliÅŸtirilebilecek yazılımlardan birkaçı… Bunların bir kısmı zaten yazılmış durumda ama genelde üst düzey uygulamalar…
Bir diÄŸer alternatif, kendi sanal sisteminde çalışacak uygulamalar geliÅŸtirmek… Programı tüm özellikleri ile geliÅŸtirip, müşterilere olduÄŸu gibi sanal sistemiyle veriyorsunuz. Dosyayı sanal sunucusunda çalıştırdığında hazır kurulu uygulama olarak kullanabiliyor.
Bunlar ÅŸu anki vizyonla üretilmiÅŸ fikirler… Konu ile ilgili teknik bilgiler derinleÅŸtikçe çok uç noktalara ve çözümlere ulaşılabilir. Bu da size kalmış.
Bu makalenin çıkış noktası aslında Microsoft’un yeni iÅŸletim sistemi Windows 7′nin çekirdeÄŸini tanıtmasıydı. Windows 7 çekirdek düzeyinde sanallaÅŸtırma destekleyecek. Bu noktada rakip taraftan RedHat Linux ekibinin teknik ÅŸefi gelecek vizyonu özetliyor:
“Varolan modeli deÄŸiÅŸtirmeye çalışıyoruz. Normalde, iÅŸletim sistemini alırsınız, sanal sunucu programını alırsınız ve sistemi kurarsınız. Halbuki daha entegre sistemler kurulmalı”.
Yani, sanallaÅŸtırma yeteneklerini içinde barındıran ve iÅŸlemcilerle en alt düzeyde haberleÅŸerek maksimum performansı saÄŸlayan iÅŸletim sistemleri…
Önümüzdeki yıllar masaüstü sistemlerde sanallaÅŸtırmanın parladığı yıllar olacak. Donanım ve sistem yazılımı alanında geleceÄŸini kurmak isteyen öğrenciler için sanallaÅŸtırma uzmanlığı iyi bir fırsat…
Pownce bir tür web tabanlı paylaşım platformu.
Dosya, link, etkinlik ve mesaj gönderim imkanı sunan servis, oluşturduğunuz sosyal ağınız dahilindeki kullanıcılarla web üzerinden ya da masaüstü uygulaması ile paylaşım gerçekleştirebilmenizi sağlıyor.
Pownce’nin programcısı, programı yazarken yaÅŸadığı uygulama geliÅŸtirme tecrübelerini paylaÅŸmış.
Özetle şöyle diyor:
- Teknolojiyi doÄŸru seç. Biz Python üzerinde Djangoyu seçtik. Amazon’un S3 servisini kullandık. Adobe AIR’i kullandık. Avantajları …..(detayları orada okuyun)
- Az adamla çok iş yap. Kısa bitiş hedef süreleri koy. Herkes birden fazla rol üstlensin.
- Açık kaynak kodlu uygulamaları kullan. Başkaları bu uygulamaların sorunlarını çözmüşlerdir. Büyük ihtimalle de senden daha akıllıdırlar.
- Tüm bilgi kaynaklarını kullan. ArkadaÅŸlar, IRC, forum siteleri ne varsa… Toplululuklara üye ol.
- Veritabanına önem ver. Önbellekleme (cache) kullan. Sorguları kuyruğa al, sırası geldikçe işle. Kayıtları lazım olduğu sayıda çek, limit koy. İndeks kullan. Basitleştir. Gereksiz sorguları ele.
- Sorunlara hazır ol. Çabuk cevap ver. Yedek al. Versiyon kontrol sistemleri kullan.
- Yazdığın uygulamayı kullananlarla iletişim içinde ol. Kodun durumunu bilsinler. Hata bildirimine açık ol. Hataları düzelt. Verdiğin bitiş hedeflerine uy.
- Büyümeye hazır ol. Uygulamanın tasarımını buna göre yap. Gerektiğinde büyük değişiklikler yap.