Subscribe:

25 Eylül 2013 Çarşamba

YAZILIMIN EVRİMİ

Her ne kadar darwin teorisinde anlatılan evrimi saçma bulsamda geçmişten günümüze olan yazılım için en uygun ve özet başlık bu gibi duruyor. Bu yazımda, ilk bilgisayarlardan günümüze olan yazılım sektöründeki gelişmeleri araştırıp kendi üslubumla özet bir şekilde aktaracağım.
Eniac Programlama
Eniac Programlama
5 Dönemde Yazılım Evrimi
İlk Dönem(1945-1965)
Bilgisayarların doğduğu dönemden bahsediyorum. O 30 tonluk bilgisayarlar. İlk başlarda amacı sadece savaşlarda silah olarak kullanılmakmış. (Mesela ENIAC, 2. Dünya savaşında ABD'li bilim adamları tarafından üretilmiş.Amacı daha az isabet hatalı uzun menzilli top ve füzelerin hesaplanmasında kullanılması...) Bilgisayarların üretildiği bu yıllarda yazılımlar ilk olarak yığınsal kökenli(kullanıcı ile birebir iletişimde bulunmayan,işlerin toplu olarak verilip yalnızca yazıcı çıktılarının alındığı) biçimde geliştirilmişti. Ayrıca bugünün bilinen anlamında ürün tarzında değil bütünüyle kendisi için yapılan kuruluşa özel yapılmaktaydı. Bu dönemde ilk başlarda programlama delikli kartlarla yapılıyordu. Daha sonraki dönemde(1955'lerden sonra) kullanılan programlama dillerine baktığımızda ise Fortran,Algol 58, Cobol,Lisp gibi diller gelmektedir. Piyasada IBM şirketinin ezici üstünlüğü dikkatleri çekmektedir.
İkinci Dönem(1965-1975)
Bilgisayarların geliştiği, bugünün baba bilgisayarları olarak adlandırılan çok kullanıcılı sistemlerin ortaya çıktığı bu çağda,çok kullanıcılı gerçek zamanlı yazılımlar üretilmeye başlanmıştı. Veri tabanı yönetim sistemleri önce yapılandırılmış kütük sistemleri ile ortaya çıkmıştı. Bugün bildiğimiz bir çok veri tabanı yönetim sisteminin geçmişi bu yıllara dayanır. Ürün türü yazılımlarda bu dönemde ortaya çıkmıştır. Bu dönemin programlama dillerine baktığımızda başta C olmak üzere Pascal,Basic,Snobol gibi diller gelmektedir.

24 Eylül 2013 Salı

SWEBOK

Swebok (Software Engineering Body Of Knowladge), yazılım mühendisliğinin uluslararası standartlara sahip bilgi rehberi olarak tanımlanabilir. Bir kaç meslek kuruluşu ve endüstri üyeleri arasında işbirliği gerçekleştirilerek oluşturulmuş. IEEE Computer Society tarafından yayınlanmış ve halen desteklenmektedir.
SWEBOK İÇERİĞİ
2013 yılındaki sürümünden itibaren yazılım mühendisliği çevrelerinde 15 başlık altında tanımlandı.
-Yazılım Gereksinimleri
Gerçekleştirilecek olan sistemin amacı doğrultusunda gerçekleştirilmeden önceki planlamalardır. Kullanıcının sistemin işlevleri ile ilgili beklentileridir.
-Yazılım Tasarımı
Sistem çözümleme sırasındaki mantıksal tasarımın fiziksel tasarıma dönüştürülme çabasıdır. Tasarım çalışmasının temel çıktıları olan genel tasarım, yazılım birim ya da bileşenlerinin ayrıntılı yapısı ve veri yapısı programcılar için girdi olarak alınır ve bu yapılar kullanılarak yazılımın kodları üretilir. 
-Yazılım İnşası
Tasarım sonucu üretilen süreç ve veri tabanının fiziksel yapısını içeren fiziksel modelin bilgisayar ortamında çalışan yazılım biçimine dönüştürülmesi çalışmalarını kapsar. Yazılımın geliştirilmesi için her şeyden önce belirli bir yazılım geliştirme ortamının seçilmesi gerekmektedir. 
Söz konusu ortam, kullanılacak programlama dili ve yazılım geliştirme araçlarını içerir. Bu ortamda belirli bir standartta geliştirilen programlar, gözden geçirilir, sınanır ve uygulamaya hazır hale getirilir. Üretilen kaynak kodların belirlenecek bir standartta üretilmesi yazılımın daha sonraki aşamalardaki bakımı açısından çok önemlidir. Tersi durumda kaynak kodların okunabilirliği, düzeltilebilirliği zorlaşır. Yazılımın işletimi süresince ortaya çıkabilecek sorunlar ilerde sıkıntı çıkarır ve düzeltilmesi de oldukça zaman alır.
-Yazılım Testi
Yazılım belirtimlerinin ve proje yaşam sürecindeki her bir etkinlik sonunda alınan çıktıların, tamam, doğru, açık ve önceki belirtimleri tutarlı olarak betimler durumda olduğunun doğrulanması gerekir. Proje süresince her bir etkinlik ürününün teknik yeterliliğinin değerlendirilmesi ve uygun çözüm elde edilene kadar aktivite tekrar edilir. Projenin bir aşaması süresince geliştirilen anahtar belirtimler önceki belirtimlerle karşılaştırılır. Yazılım ürünlerinin tüm uygulanabilir gerekleri sağladığının gerçeklenmesi için sınamalar hazırlanıp yürütülür.
-Yazılım Bakımı
Test işlemleri bitirilen yazılımın kullanıcı alanına yüklenmesi ve uygulamanın başlatılması gerekmektedir. Yazılım kullanıma geçtikten sonra, yaşam döngüsünün en önemli ve hiç bitmeyecek aşaması olan "bakım" aşaması başlar.
-Yazılım Konfigürasyon Yönetimi
Tüm yazılım yaşam döngüsü aşamalarının planlanması, düzenlenmesi ve izlenmesiyle ilgili bilgileri içermektedir.
-Yazılım Mühendisliği Yönetimi ( Mühendislik yönetimi )
Tüm aşamaların mühendislik disiplini içerisinde uygulanması gerekir.
-Yazılım Mühendisliği Süreci
Hem geliştirilen ürünlerin kalitesini hem de bu ürünleri geliştirmek için kullanılan süreçlerin kalitelerini belirtir.
-Yazılım Mühendisliği Araçları ve Yöntemleri
Bir sistemin gerçekleştirilmesi için en uygun olan araçlar ve yöntemler tercih edilmelidir.
-Yazılım Kalitesi
Yazılım mühendisliği çerçevesinde sözü geçen yöntem ve araçların amacı, üretilecek olan yazılımda yüksek kalite düzeylerine erişmek olmalıdır. Kalite bir çok boyutu olan bir özelliktir. Program yazıldıktan sonra düşünülecek bir konu olmaktansa, bütün geliştirme evrelerine yönelik etkinlikler ile sağlanmalıdır.
-Yazılım Mühendisliği Ekonomisi
Yazılımın önemi her geçen gün artıyor dolayısıyla büyük bir pazar payınada sahip oluyor.
-Bilgisayar Temelleri
Yazılım mühendisliğinin bilgisayar çağının başından beri sürekli artan önemi ve karmaşıklığı vardır.
-Matematiksel Temelleri
Bütün mühendisliklerin temelinde matematik vardır.
-Yazılım Mühendisliği Mesleki Uygulama
Bir meslek dalı olarak yazılım mühendisliği üzerinde durulması gereken geniş bir konudur.
-Mühendislik Temelleri
Diğer mühendislik dallarından farklı özelliklere sahip olmasıyla zaman zaman tartışma konusu olmuştur.

SWEBOK aynı zamanda Yazılım Mühendisliği ile bağlantılı disiplinleride tanımlar. Bu disiplinler şunlardır.
-Bilgisayar mühendisliği
-Bilgisayar bilimi
-Yönetim
-Matematik
-Kalite yönetimi
-Yazılım ergonomi ( Bilişsel ergonomi )
-Sistem mühendisliği

Daha fazla bilgi için ilgili siteye buradan ulaşabilirsiniz

YAZILIM MÜHENDİSİ

Yazılım Mühendisini, bilişim teknolojilerinin yazılım yaşam süreçlerini yapılandıran ve bunları sisteme entegre edip, aktif kullanıma sunulmasında başrol oynayan kişidir diye kısaca tanımlayarak konuya giriş yapayım.
Öncelikle mühendislik kavramına değinmek istiyorum. Mühendis, en az maliyetle en iyi ürünü ortaya çıkarması gereken kişidir bana göre.  Modern anlamda ise mühendis kavramını şu şekilde tanımlamışlar. "Bilim insanlarının ürettiği teorik bilgiyi tekniker ve teknisyenlerin uygulayabileceği pratik bilgiye dönüştürebilen kişidir." Yukarıdaki tanımdan yola çıkarsak yazılım mühendisi, gerçekleştirilecek olan yazılımın iskeletini oluşturan proje ekibi içerisindeki diğer kişilerin koordinasyonunu sağlayan kişidir.
Hazır yeri gelmişken yanlış anlaşılan bir algıdan da bahsedeyim. Yazılım mühendisi sadece programcı değildir. Ancak programcının tüm yeteneklerine sahip olmalıdır diye düşünüyorum. Programcı, ağırlılkı olarak kodlama, sınama işi ile ilgilenir. Yazılım mühendisinin işi daha çok insanlarla ilişkiyi gerektirir. İnsanlardan aldığı talepler doğrultusuna göre ortaya çıkacak yazılımın planlamasını yapar. Yazılımın daha çok mantıksal boyutuyla ilgilenir. Yazılım mühendisi yazılımın tüm aşamalarında yer alır.
Peki bu meslek dalı nereden çıkmış. Araştırdığımızda yazılım mühendisliği kavramı ilk olarak 1968 yılında Almanya'daki NATO toplantısında gündeme gelmiş. Bu disiplini alan kişilerse yazılım mühendisi olarak ünvanlaştırılmış. Eskiden(Günümüzdede devam etmekte) bu ünvana sahip kişiler elektrik-elektronik mühendislerinden oluşuyordu. 2000'li yıllara doğru bilgisayar mühendisleri bu ünvanı kullanabiliyorlardı. Günümüzde artık Türkiye'de de olmak üzere bir çok üniversitede bir ana bilim dalı olarak sektöre kişiler yetiştirmektedir.
Görevlerinden de bahsedecek olursam...
  • Söz konusu üretimin en az maliyet ve en yüksek nitelikli biçimde yapar.
  • Hazırlanacak yazılımla ilgili müşteri ilişkilerini kurar.
  • Müşteriden gelen talebe göre analiz ve tasarım yapar.
  • Program yazar,test eder.
  • Yazılım bittikten sonra yazılımı kullanacak kişilere yazılım ile ilgili eğitimleri verir
Görev tanımı Tübitak Bilgem'de şu şekilde tanımlanmış.
"Yazılım geliştirme projelerinin; analiz, tasarım, kodlama, birim ve entegrasyon faaliyetleriyle ilgili olarak kendine verilen görevleri yerine getirmek, yazılım birimlerinin doğrulama (test, gözden geçirmeler, vb.) ve geçerleme faaliyetlerinde görev almak, gerçeklenmesinde görev aldığı yazılım birimlerine ilişkin olarak doğrulama ve geçerleme faaliyetleri sonucunda ortaya çıkan uygunsuzlukları gidermek, sorumlu olduğu yazılım kodu ile birlikte veya yazılım koduna ilişkin olarak üretilmesi gereken her türlü dokümantasyonu hazırlamak, kendisine atanan yazılım birimlerine ilişkin yeterlilik testleri ve kabul-muayene faaliyetlerine yerinde destek vermek, kendisine atanan yazılım birimlerinin kesintisiz ve en etkin şekilde kullanımına yönelik olarak kullanıcılara yerinde destek vermek ve kullanıcıların ihtiyaç duyduğu eğitimleri sağlamak, görevinin gerektirdiği diğer yazılım destek süreçleri kapsamında üzerine düşen sorumlulukları yerine getirmek."
Artık günümüzde yazılımın uygulanamayacağı yer yok gibi. Dikkat edildiğinde çevremizdeki çoğu teknolojik aletlerin yapısında karmaşık yazılımlar yer almaktadır. "Akıllı" diye tabir edilen birimler, çeşitli yazılımlar ve yapay zeka yöntemlerinin birlikte kullanılmasıyla olagelmiştir.
Bilgisayar dünyası, baktığımızda kaba tabirle 2 şekilde kategorize ediliyor. Yazılım ve Donanım. Bilgisayarın ilk çıktığı yıllara baktığımızda sektör donanım ağırlıklıydı. Donanım maliyeti yazılımdan kat kat fazlaydı. Fakat günümüzde tam tersi bir durum sözkonusu. Donanım maliyetleri yazılımdan az olmakla beraber dönem dönem  giderek düşme eğilimi göstermektedir. Yazılım ihtiyaçları giderek artmakta, maliyet ve karmaşıklıkta buna paralellik göstermektedir. Karmaşık yazılımları gerçekleştirmek ve bakımını yapmak oldukça zor ve masraflı. Bu yüzden yazılımlar, yazılım mühendisleri tarafından istenilen düzende planlı bir proje şeklinde gerçekleştirilmektedir. Bu tertipli, düzenli geliştirme planına "yazılım geliştirme süreci" adı verilmektedir. Bu konuya da ayrı bir yazıda değinmek istiyorum.
Bu yazımda şu an öğrencisi konumunda olduğum yazılım mühendisliği disiplinin temel yapı taşı olan yazılım mühendisi kavramına değinmeye çalıştım. İnşallah ülkemizde de bu alanda kaliteli ve açığı kapatacak olan kişiler en doğru bir şekilde yetişir.