-->

Neden Yazılım Mühendisliği

Neden Yazılım Mühendisliği?Neden Yazılım Mühendisliği?Makaleler 03 Temmuz 2015Facebook'ta Paylaş Twitter'da Paylaş 54.6b
Melih Hilmi ULUDAĞ Merhaba arkadaşlar. Üniversite tercihlerine adım adım yaklaşırken heyecanların, streslerin, hayallerin arttığını; düşüncelerinizin karmaşık bir hâl aldığını ve geleceğinize yön verme sürecinde yoğun araştırmalar yaptığınızı tahmin edebiliyorum. Bu yazımda sizlere Yazılım Mühendisliği’ni elimden geldiğince anlatmaya çalışacağım. Umarım bu bölümü düşünen arkadaşlar için yararlı bir yazı niteliğinde olur.
En çok yöneltilen soruları, soru-cevap şeklinde ele almayı istedim arkadaşlar. İçerikleri uzun tutup anlatmaya çalıştım. (Dileyenler belirli bölümünü de okuyabilsinler diye) Haydi başlayalım…

Yazılım nedir? Öncelikle bu soruya cevap arayalım.

“Yazılım, elektronik aygıtların belirli bir işi yapmasını sağlayan programların tümüne verilen isimdir. “ [1]  Yani bir bilgisayar sistemi gibi elektronik cihazın, donanımlarını kontrol ederek kullanıcı hizmetine sunan daha doğrusu bilgisayarı kullanmamızı sağlayan komutlar topluluğuna verilen isimdir.

Bir nevi insan için ruh ne ise, bilgisayar içinde yazılım odur diyebilirim. Aslında sürekli bilgisayar demek istemiyorum. Genelleme yapmış oluyorum ama biliyoruz ki akıllı telefonlar, tabletler vb. teknolojik ürünler birer bilgisayar sistemi çeşitidir. Dolayısıyla yazılım genel olarak elektronik tabanlı bir cihazın ruhudur diyelim ve sorularımıza cevap aramaya devam edelim...



Peki, Yazılım Mühendisliği nedir?

“Yazılım Mühendisliği; sistemli, düzenli, ölçülebilir bir yaklaşımın yazılım geliştirme de, yazılımın işlenilmesinde ve bakımında uygulanmasıdır. Yani mühendisliğin yazılıma uygulanmasıdır. “ [2] Yazılım geliştirmek, dışarıdan bakıldığında “bilene kolay” gibi görünse de kompleks yazılımların geliştirilmesi ve bir sisteme entegre edilmesi mühendislik eğitimini gerekli kılmıştır.

Aslında mühendislik, herhangi bir bilim alanındaki teoriyi sistematik olarak pratiğe geçirmeyi hedefler ve bilim ile matematiği kullanır. Yazılım da uygulanan mühendislik ise ilgili sistemi tanımlamaktan (analiz etmekten) başlar sistemi kullanma esnasındaki bakıma kadar uzanan tüm etkinlikleri kapsar. Sadece teknik etkinlikle de değil, yönetim etkinliklerini de içerir. (Bu noktaya ilerleyen kısımlarda değineceğim.)

Bu kadar bahsediyoruz, anlatıyoruz ama Yazılım Mühendisliğinin geçmişi nerelere dayanmaktadır?

“1960’lardan itibaren yazılım ürünlerine artan talepler çoğalmıştır. Birkaç farklı çözümler uygulanmış olsa da yeterli üretim kapasitesine erişilememiştir. Bu yetersizlik,
“yazılım krizi”söylemiyle dünya literatüründe yerini almıştır. “ [3]

Yazılım krizinin temel sebebi, üstel olarak artan talebe karşılık doğrusal hızla artış
gösteren üretim kapasitesidir. Diğer yandan yazılım projelerindeki başarısızlık oranı da
şaşırtıcı derecede yüksek olup bu krizi beslemektedir.



Şekil 1. Yazılım Krizinin Sonuçları [3]

O yıllarda yapılan NATO konferansında, Güvenilir ve etkin olarak çalışan yazılımların ekonomik olarak elde edilebilmesi için mühendislik ilkelerinin uygulanması öngörülmüştür. Ülkemizde ise “Yazılım Mühendisliği” kavramı son yıllarda yer almıştır. Bu süreçte “Bilgisayar Mühendisliği” bölümünde bir ders ve yüksek lisans alanı olarak kullanılmıştır.

Yazılımı Mühendisliğini, Bilgisayar Mühendisliğinden ayıran şey nedir?

Genel anlamda Bilgisayar, “Yazılım” ve “Donanım”  niteliklerinden oluşur. (Kendi içerisinde ağ teknolojileri, bulut sistemi vs. şeklinde ayrılır. ) Bilgisayar Mühendisi olarak adlandırdığımız kişi, eğitim hayatı boyunca bu iki niteliğin eğitimini alırlar. (Bilgisayar Mühendisliği ile ilgili olan makaleye buradan ulaşabilirsiniz)

Günümüzde geliştirilen yazılımlar küçük çaplı projeler olmaktan çıkmıştır. Bir disiplin altında yazılım geliştirilmeye ihtiyaç duyulmuştur. Yıllar sürecek kompleks projelerin geliştirilmesi, sisteme entegre edilmesi ve yönetilmesi ihtiyacı ortaya çıkınca bunları bir disiplin altında geliştirmek istenildiği için yazılım mühendisliği bilim dalı oluşturulmuştur. Dolayısıyla bu bölümde lisans eğitimi sürecinde yazılım geliştirme üzerine dersler verilmektedir.



Yazılım projelerinde Yazılım Mühendisin çalışma şekli (ciddi düşünen arkadaşlar için ek bilgi)

Yazılım üretim sürecinin çeşitli aşamaları vardır arkadaşlar. Sizlere Yazılım Mühendisliğini daha iyi anlatmak adına sıkmadan, terimli kelimeler kullanmadan çok kısaca bahsetmek istiyorum.

Günümüzde yazılımlara yüklediğimiz istekler sürekli artmakta ve büyümektedir. Dolayısıyla büyük ve karmaşık bir yazılımı geliştirmek kolay bir iş değil diye düşünüyorum. Bunun gibi durumlarda birbirleri ile uyumlu, profesyonel bir proje takımı ile çalışılması gerekli olur.

Yazılım, var olduğu sürede veya üretilmeye başlandığı anda  “Yazılım yaşam döngüsü” dediğimiz bir sürece girer. Bu süreç, çeşitli adımlardan oluşur. Ve her adımında/aşamasında çeşitli niteliğe sahip kişiler çalışmaktadır.

Yazılım yaşam döngüsü adımları aşağıdaki gibidir.

Planlama personel ve donanım gereksinimlerinin neler olacağı ile ilgili çalışmalar yapılır.

Çözümleme aşamasında gereksinim analizi yapılır.  Bunu yapan kişiye analist denir. İleri görüşlü, tahmin yeteneği yüksek olan, müşteri ile iyi iletişim kuran ve istenilen düşüncenin yazılım geliştirmeye uygun olduğunu denetleyebilen nitelikte bir mühendis, matematikçi veya teknikerdir. (Aslında mesleki olarak bir sınır yok. Analistçi olmanın gerekliliğini yerine getirenler bu alanda çalışabilirler.) Bu aşamada ilgili yazılımın ne amaca hizmet edeceği belirlendikten sonra nasıl yapılacağı araştırılır. Yazılım Mühendisliği gözüyle mevcut yapıdaki işlerin ortaya çıkarılması ve gereksinimlerin doğru algılanıp algılanmadığı belirlenir. Yazılımı daha anlamlı ifade edebilmek için UML adını verdiğimiz senaryo diyagramları çizilir.

Tasarım aşamasında ise çözümleme aşamasında belirlenen gereksinimlere karşılık verecek bilgi sisteminin temel yapısı oluşturulur. Bu arada tasarımı 2’ye ayırırız arkadaşlar. Mantıksal tasarım adını verdiğimiz tasarım da gereksinim analizine göre sistemin önerilen yapısını anlatırız. Fiziksel tasarım ile genel olarak sistemin fiziki yapısını, görselleştirmeleri, yazılımı içeren bileşenleri ve ayrıntılarını tasarlarız. Bu aşamada çalışanlara tasarımcı/designer diye hitap edilmektedir. Görsel tasarımcılar, yetenekli olan tasarımcılardan seçilmektedir. Grafik ve animasyon bölümü mezunları gibi. Sistemin mantıksal tasarımını genelde mühendisler yaparlar.

Gerçekleştirim ise yazılımın tamamlandığı aşamadır. Bu aşamada yazılımı herhangi bir bilgisayar dili (programlama dili) ile kodlanır, test edilir ve kurulum yapılır. Bu aşamada çalışanlara kodlayıcı, testçi şeklinde hitap edilmektedir. Ve genelde iyi kod yazan programcılar ile mühendislerden oluşur.

Bakım aşaması ise yazılımla ilgili hata giderme ve yeni eklentiler yapma aşamasıdır. Bu aşama yazılımın tüm yaşamında sürer. Yani yazılım üretildikten sonra hep bakım aşaması içerisindedir. (Mevcut projede yeni istekler ortaya çıkabilir, veya değişime uğranılması istenebilir. Tekrar bir gereksinim analizi yapılarak yazılım yaşam döngüsü içerisinde gerçekleştirmeler yapılır. Bu süreci kapsayan metodolojiler ve yöntemler mevcuttur ama daha fazla detaya girip kafanızı karıştırmak istemem)

İşte yazılım mühendisi, yazılım geliştirmeyi bu aşamalarla değerlendirip çözümler üretir. Yani “ben ne istediğimi biliyorum, haydi şu yazılımı yapayım” diyerek işe girişmez. Kafasındaki sorulara göre “kodla düzelt” mantığı ile değil de bir mühendislik disiplini ile yapar. Yazılım geliştirme esnasında çeşitli metodolojiler, yöntemler ve kurallar kullanır. Ayrıca, Bilgisayar Programcısı veya matematikçi sadece kodlama aşamasında çalışırken, Yazılım Mühendisi, yaşam döngüsünün her aşamasında çalışabilir.(Bu doğrultu da eğitimler alarak mezun olur.) Ve bu aşamalarda çalışanların sahip olduğu bilgi birikimine fazlasıyla sahiptir. Bu yönüyle yöneticilik vasfı taşır.

Kaliteli bir yazılım,  “proje başlangıcında yapılan gereksinim analizinde (müşterinin sistemden istekleri, arzuları) ihtiyaç duyulan her isteğe karşılık veren yazılımdır” diyebilirim. Yazılım Mühendisinin hedefi, ilgilendiği yazılımı en optimum şekilde gerçekleştirmek ve onu sisteme uygun entegre etmektir.

Yazılım Mühendisi olarak kimler çalışabilirler?

Açıklamak için sabırsızlandığım sorulardan birisi de buydu arkadaşlar. Şu anda sektörde, Bilgisayar Mühendisleri başta olmak üzere Endüstri Mühendisleri, Elektrik-Elektronik Mühendisleri, Elektronik Haberleşme Mühendisleri, Matematik Mühendisleri veya bölümü mezunları vb. teknik anlamda Bilgisayar/Yazılım bilgisi içeren herhangi bir lisans mezunları bilişim sektöründe Yazılım Mühendisi adı ile görev yapabilmektedir. Bilge Adam gibi kurumlardan Yazılım Mühendisliği eğitimi alarak sertifikalarla diplomalarını süsleyebiliyorlar.

Aslında karşı değilim. Çünkü verilen bu unvan gerçek anlamda bir lisans diploması değil ve büyük bir yazılım projesine bu unvan ile imza atılması yasalara uygun değil. Kendini çok geliştirmiş, oldukça iyi olan ve parmak ile gösterilen birçok yazılım mühendisi var bu şekilde.  Ama bu bilim dalı “kaliteli, ölçülebilir ve sistemli bir şekilde yazılım geliştirmeyi hedeflediğinden” kendi konumunu diğer mühendisliklerden bir noktada ayırdığını söyleyebilirim. Çünkü lisans eğitimi süresinde %90-97 gibi bir rakamla yazılım dersleri üzerine duruluyor. Yani Bilgisayar Mühendisliğinde verilen bir Algoritma ve Programlama eğitimi ile Yazılım Mühendisliğinde verilen eğitimin kapsam alanı bir değil. (Konu çarpıtılmasın diye söylüyorum: üniversiteden üniversiteye, akademik kadro ölçütünde değişken bir konu; bunun üzerine tartışma konusu açmayalım lütfen ☺  Ayrıca başka bir örnek: diyelim matematiğiniz çok iyi ama Matematik Mühendisi ile bir ayrım noktanız yok mudur?)

Konunun hassaslığının farkında olduğumu belirtmek için şunu da söylemeliyim ki bilişim/yazılım sektörü tamamen kişisel gelişime bağlıdır. Lisans sürecinde alınan mühendislik eğitimi özellikle bu bölüm için ilgi, merak, sabır ve sürekli kendini yenileme gerektiriyor. Teknolojinin bu kadar hızlı ilerlediği bilişim çağında özellikle Yazılım, Bilgisayar ve Elektronik Mühendisliği gibi bölümlerde okuyan/çalışan kimselerin kendilerini yeniliğe açık tutması ve gelişen teknolojinin getirdiği gereksinimlere ayak uydurması gerekiyor. Örneğin bir Yazılım Mühendisi’ nin şu anda etkin olarak kullandığı programlama dili “java” ise bundan 5-10 sene sonra popüler olarak kullanılan programlama dilinin ne olacağı belli değil. İyi bir Yazılım Mühendisi, her geçen gün geliştirilen ve yenilenen mesleki gereksinimlere uyum sağlayabilmeli ve kendini yeniliğe sürekli olarak açık tutabilmeli. (Dilediğiniz kadar iyi bir üniversiteden mezun olun, uygulamaya ve yeniliğe kapalı iseniz, mesleki gereksinimlere sahip değil ve sadece aldığınız lisans eğitimiyle ayakta kalmaya çalışıyorsanız sektörde rahat çalışabilecek  bir mühendis olamazsınız diye düşünüyorum. Çünkü hemen hemen her mühendislik bölümü bir hayli sayıda mezun biriktiriyor. Sizi öne çıkaran bir adımı atmanız lazım, değil mi?)

Yazılım Mühendisi olacak kimselerin sahip olması gereken özellikler bence önemli bir etmen. Tercih yapacak arkadaşların, kesinlikle okumalarını tavsiye ederim.
Algoritma nedir? Sizlere bu kavramdan ve yazılımla olan önemli ilişkisinden bahsetmek istiyorum.

Yapılması istenen düşünceyi veya problemi bir noktadan başlayıp, sonucuna varacak şekilde adım adım ifade etme yoludur. Tamamen soyut bir varlıktır; düşünceniz ile şekillendirip, akış diyagramı gibi yöntemleri kullanarak çözüm yolunuzu ifade edersiniz.

Yazılımın en temel varlığıdır algoritma… Demem o ki, bir yazılım üretilirken algoritmaya dayandırılarak geliştirilme yapılır. İstekleri iyi tanımlanmış, sistemden istenileni optimum şekilde karşılayan, belirli adımlardan oluşan, esnek bir algoritma ile geliştirilen yazılım kaliteli yazılımdır. Ayrıca algoritmanın temeli matematik ve mantıktır. Sayısal düşünce gücü yüksek olan insanlar; güçlü, hızlı ve az adımlardan oluşan dinamik algoritmalar geliştirir. Dolayısıyla böyle bir algoritmanın dayandığı yazılım etkin bir yazılım olur. Bölümün temelinden bahsettikten sonra, Bu bölümü tercih edecek olan arkadaşlarımın:

Soyut şeyler ile uğraşmaktan zevk alması gerekiyor. Tamamen hayal gücü

Sayısal zekâsına güvenmesi gerekiyor. (Bazı okullarda Matematik-Bilgisayar bölümleri vardır, araştırılırsa yazılımın matematiksel düşünce gücüne dayanması sonucuna varılır.)

Kendini sürekli geliştirmesi ve yeniliğe açık olması gerekiyor. Daha önce yukarıda anlattığım gibi, teknoloji çok hızlı ilerliyor. Mesleğinizden birkaç yıl uzakta kalmanız veya kendinizi geliştirmemeniz sizi çok gerilerde bırakabiliyor. Makine veya İnşaat Mühendisliği gibi bölümlerde içerikler genelde sabittir. Ama yeni bir teknoloji, Yazılım Mühendisi için takip edilmesi gereken en önemli etmendir.

Sabırlı, istekli ve azimli olmanız gerekiyor. Günlerce, aylarca hatta yıllarca yazdığınız ve ortaya çıkardığınız bir programı düşünelim. Binlerce satır kodların arasında bir virgül (“,”) veya bir nokta (“.”) istenmeden konulsa tüm yazılım derleme hatasına düşer ve çalışmaz. Geliştirdiğiniz algoritma eğer çelişkili bir yapıya sahipse ve iyi hazırlanmamışsa kod yazma size ızdırap olur ve içinden çıkılmaz bir hâl alır.

Genel anlamda bu özellikleri taşıyanların sektörde koşar adımlarla ilerlediği görülmektedir. Ve bilişim sektöründe yoğun olarak çalışanların, birkaç yıl içerisinde kendilerini hızla geliştirdikleri, kıdem atladıkları, maaşlarının oldukça arttığı gibi olumlu yanları da görülmektedir. ☺

Yazılımcı olmanın zaman sonra size kazandırdığı kötü alışkanlıklarda yok değil ☺ Bir süre sonra vücudunuzun %80’ i kahveden oluşabiliyor. Veya günlük hayatınızda  bilgisayarlaşabiliyorsunuz. Algoritma geliştiricisi iseniz hayata farklı pencerelerden bakabiliyorsunuz. Attığınız her adımı bir sonuca bağlayıp, farkında olmadan mantıklı kararlar alabiliyorsunuz ☺ veya en basitinden bir yazılım geliştirdiğinizde sizi uğraştıran bir alanı yapıp, bitirdiğinizde çok ilginç sevinçler gösterip, çevrenizi şaşkınlığa uğratabiliyorsunuz. (Bu anlattıklarım, mesleğiniz ile ne kadar örtüştüğünüze bağlı tabi. Biraz da mizahi.)

Yazıyı çok fazla uzatıp sizi sıkmak istemiyorum arkadaşlar. Son soruya da cevap verip bitirelim istiyorum ☺

Yazılım Mühendisleri çok yüksek ücrette mi çalışıyor?

En çok yöneltilen soru buydu sanırım.

Cevabı: “Evet!”, ama önemli bir şartı var. “Etkin, söz sahibi ve mesleğine hakim bir Yazılım Mühendisi iseniz.” (Çoğu meslekte olduğu gibi.)

Bir şey belirtmek istiyorum, Dünya şu anda ne üzerine kurulu?

Teknoloji, doğru mu? Bence kesinlikle.

İnsanlığın en büyük gelişim ve ilerleme gösterdiği teknoloji çağında her şey yazılım arkadaşlar.  Bu kadar net ve kesin konuşuyorum. En basitinden yolda durup beklediğiniz trafik lambaları, avm’ lerde bir üst kata çıktığınız yürüyen merdivenler, arabanızda yakıt tüketimini gözlemlediğiniz yol bilgisayarı, elinizden düşürmediğiniz cep telefonları, bilgisayarlar, televizyonlar, bizleri bilmediğimiz sokaklarda dolaştıran navigasyonlar, buz dolapları, sürekli vakit geçirdiğimiz sosyal ortamlar… Robotlar! Her şey! Bilgisayarınıza bulaşan virüs bile. “Overlokçu makinası ayağınıza geldi” diye konuşan ablanın ses cihazından bize seslenişi ☹ (1 ve 0’ ı taşıması yeterli)… Bütün her şey bir yazılım ürünüdür. (Sanırım bu konuda günlerce konuşabilirim, kısa kesmeliyim.)

Dünya’ nın en zengin şirketlerine bakacak olursak: Microsoft, Apple, Google, Facebook, Twitter? Daha fazla çoğaltmak kolay olsa gerek. Yazılımlarının ne kadar değerli olduğunu, bu şirketlerin geçmişini okuduğumuzda anlayabiliyoruz.(Var olmayan bir düşünceyi geliştirip bizim hayatımıza sunan ve yaşamımıza, geleceğimize yön gösteren bu şirketler birçok teknolojinin doğmasına zemin hazırlamıştır) Milyardolarlık servetin bir yazılım ürünü ile beslendiği bu günlerde bilişim sektöründe başarılı olarak çalışanların çok yüksek ücrette çalıştığını söylemek mümkün olsa gerek.

Dünya şirketlerinden yola çıkıp düşüncemi savunmaya çalışmıyorum. Türkiye’ de Bilişim sektöründe ciddi olarak görev alan ve önemli işlere imza atmış birçok Bilgisayar/Yazılım Mühendisi vardır.

Vee sorular bitti,

Devam edersem oldukça uzun bir yazı olacak sanırım. ☺ Vurgulamak istediğim son bir şey daha var: Ben, böylesi geniş bir alana hitap eden bu mesleği okyanusa benzetiyorum. İyi bir yazılımcı sadece belirli bir alanda mesleki sorumluluklarını yerine getirecek mühendis olmalı, yani okyanusun belirli sularında yüzmeli. Her alanda bilgi birikimine sahip olmak mümkün. Ama bir alan uzmanlaşıp, sektöre eğilmeniz gerekiyor. İlginizin olduğu alana yönelip sektörde çalışırsanız çok daha başarılı olacağınızı söyleyebilirim. (Aynı düşünceye diğer mühendislik bölümlerinde de katılıyorum.)

Elimden geldiğince Yazılım Mühendisliği bölümünü anlatmaya çalıştım. Birkaç gün içerisinde Adli Bilişim Mühendisliği ile ilgili makalemi yayınlamayı düşünüyoruz. Umarım az da olsun yardımcı olabilmişimdir… Şimdilik hoşçakalın arkadaşlar…