Yazılım Mühendisliği (Software Engineering) Nedir?


Yazılım Mühendisliğine Genel Bakış ve Tanımlar

Yazılım mühendisliği; yazılım mühendislerinden oluşan bir veya birden çok takımın karmaşık yazılım sistemlerini üretmek amacıyla bir araya geldiği Bilgisayar Bilimleri alanıdır. Genelde üretilen yazılım sistemlerinin yeni versiyonları oluşturularak yıllarca kullanılırlar. Yeni versiyonların oluşturulma nedenleri aşağıdaki gibidir;

  • Mevcut özelliklere eklentiler yapılması
  • Müşteriler tarafından talep edilen yeni özelliklerin eklenmesi
  • Eski özelliklerin ve taleplerin sistemde desteklenmemesi
  • Yazılım sisteminin yeni teknolojilere ve altyapılara uyum sağlama zorunluluğu
  • Yasal zorunluluklar ve mevzuatlarda olan değişiklikler
  • Vb.

sengParnas [1] yazılım mühendisliğini; bir yazılımın birden çok versiyonu üzerinde birden çok kişinin aynı anda çalışması olarak tanımlamaktadır. Aslında bu basit tanım bile yazılım mühendisliği ve programlamanın birbirinden ne denli ayrıldığını gösteriyor. Bir programcı tek başına tüm programı yazar, tek tabanca çalışır. Yazılım mühendisi ise bir yazılım bileşeni yazar ve o bileşen diğer yazılım mühendisleri tarafından yazılmış diğer bileşenler ile entegre çalışır. İlerleyen zamanlarda bu bileşenler farklı yazılım mühendisleri tarafından farklı versiyonlarda değiştirilebilirler. Programlama kişisel bir aktivite iken yazılım mühendisliği tam bir takım çalışması gerektirir.

Yazılım mühendisliği; sistemli, düzenli, ölçülebilir bir yaklaşımın yazılım geliştirmede, yazılımın işletilmesinde ve bakımında uygulanmasıdır. Yazılım mühendisliğinin hedefi; yazılım üretimindeki karmaşıklıkları gidererek, üretimin en az maliyet ve en yüksek nitelikte yapılmasını sağlamaktır. Programcı değildir. Ancak programcının tüm yeteneklerine sahiptir. Yazılımın daha çok mantıksal boyutuyla ilgilenir ve işi insanlarla ilişkiyi gerektirir.

Kısa Tarihçe

Yazılım mühendisliği kavramı 1960’lı yılların sonunda ortaya çıkan karmaşık yazılım proje krizleri ile birlikte doğal olarak oluşmaya başlamıştır. Projeler zamanında tamamlanamamakta ve bütçeleri fazlasıyla aşmaktadır. Güçlü programlama yeteneklerine sahip olmanın kaliteli yazılım sistemleri ortaya çıkarmadığı bu yıllarda görülmüştür. Tam olarak 1968 yılında NATO tarafından Almanya’da düzenlenen konferansla “Yazılım Mühendisliği” terimi popüler olmuştur. Yazılım mühendisliğinin olgunlaşma sürecini hızlandırmak için yakın geçmişte, uluslararası meslek kuruluşları olan Association for Computing Machinery (ACM) ve IEEE Computer Society (IEEE CS), “Yazılım Mühendisliği Koordinasyon Komisyonunu” oluşturmuş ve yazılım mühendisliği alanında çeşitli projelere başlamıştır. Bunlar aşağıdaki gibi belirlenmiştir;

  • Yazılım mühendisliği çekirdek bilgisinin tanımlanması – Software Engineering Body of Knowledge (SWEBOK),
  • Yazılım mühendisliği etiklerinin tanımlanması – Software Engineering Code of Ethics and Professional Practice (SWCEPP),
  • SWEBOK ile uyumlu olarak örnek bir eğitim programı tanımlanması Software Engineering Education Project(SWEEP),

Yazılım Mühendisliği Eğitimi Bilgi Alanları

1998 yılında IEEE CS ve ACM, bilgisayar lisans programlarının müfredatlarına yönelik rehberlerin gözden geçirilmesi ve yenilenmesi için ortak bir kurul oluşturmuşlardır. Kurul, on temel alandan oluşan Yazılım Mühendisliği Eğitimi Bilgi Alanları (Software Engineering Education Knowledge Areas) tanımlamıştır[2]:

  1. Temeller: Yazılım mühendisliğinin temelleri, yazılım mühendisliğinin ürettiği ürünlerin niteliklerini anlatan teorik ve bilimsel temellerden, bu ürünleri modellemeyi ve tanımlamayı kolaylaştıran matematiksel temellerden ve öngörülebilir sonuçlar üreten ana ilkelerden oluşur. Buradaki ana nokta, kaynakları belirlenmiş bir amaca dönüştürmek için mühendislik tasarımı ve mühendislik biliminin uygulanmasıdır.
  2. Profesyonel Uygulama: Profesyonel uygulama, yazılım mühendislerinin, yazılım mühendisliğini profesyonel ve etiğe uygun olarak uygulayabilmeleri için sahip olmaları gereken bilgi, beceri ve davranışlarla ilgilidir. Profesyonel uygulamalar bilgisi teknik iletişim, psikoloji ve sosyal ve mesleki sorumlulukları içerir.
  3. Gereksinimler: Yazılım gereksinimleri, bir sistemin amacını ve hangi içerikte kullanılacağını tanımlar. Gereksinimler, kullanıcıların gerçek gereksinimleri ile yazılım ve diğer bilgisayar teknolojileri arasında köprü oluşturur. Gereksinimlerin belirlenmesi, sistemin fizibilite çalışmasını, kullanıcıların gereksinimlerinin analizi, sistemin ne yapacağının ve ne yapmayacağının kısıtlamalar göz önünde alınarak belirlenmesini ve bu bilginin kullanıcılar tarafından doğrulanmasından oluşur.
  4. Tasarım: Yazılım tasarımı, bir bileşenin veya bir sistemin nasıl gerçekleştirileceğini belirlemek için kullanılan teknikler, stratejiler, gösterimler ve desenlerle ilgilidir. Tasarım, kaynaklar, performans, güvenilirlik ve güvenlik gibi kısıtlamalar göz önüne alınarak işlevsel gereksinimlere uygun olmalıdır. Ayrıca, yazılım bileşenleri arasındaki içsel arayüzler, mimari tasarım, veri tasarımı, kullanıcı arayüzü tasarımı, tasarım araçları ve tasarımın değerlendirilmesi de bu alanın kapsamındadır.
  5. Yazılım Oluşturma: Bu alan, tasarımda belirlenmiş yazılım bileşenlerinin geliştirilmesiyle ilgili bilgileri içermektedir. Bu kapsamda, bir tasarımın bir gerçekleştirim diline çevrilmesi, bileşen sınamaları ve program belgelemeleri incelenmektedir.
  6. Yazılım Sınama ve Doğrulama: Yazılım sınama ve doğrulama, elde edilen programın hem belirlenen gereksinimleri sağladığını hem de gerçekleştirimin beklenenlere uygun olduğunu kontrol etmek için statik ve dinamik sınama teknikleri kullanır. Statik teknikler, yazılımın tüm yaşam döngüsü boyunca elde edilen gösterimlerin analizi ve kontrolüyle ilgilenirken, dinamik teknikler sadece gerçekleştirilmiş sistemi içerir.
  7. Yazılım Gelişimi: Yazılım gelişimi, yazılımın kullanıma verilmesinin öncesindeki ve sonrasındaki aşamalarda etkin bir maliyetle desteklenmesini sağlar. Bu destek, gelişen sistemi oluşturan versiyonların veya sürümlerin her biri için hazırlık aktivitelerine gerek duyar. Bu aktiviteler, planlama, ölçüt desteği, regresyon sınama ve karmaşıklık kontrolünü içermektedir. Bu aktiviteleri desteklemek için kullanılan teknikler, program anlama, sürüm planlaması, değişiklik tanımlaması, yeniden mühendislik, tersine mühendislik, bakım, sistemin kullanımına son verilmesini içerir.
  8. Yazılım Süreci: Yazılım süreci, yaygın olarak kullanılan yazılım yaşam döngüsü süreç modellerinin tanımlanmasıyla ilgili bilgileri ve kurumsal süreç standartlarını; yazılım süreçlerinin tanımlanmasını, gerçekleştirilmesini, ölçülmesini, bakımını, yönetimini, değiştirilmesi ve iyileştirilmesini; ve yazılım geliştirme ve bakımı için gereken teknik ve yönetimsel aktiviteleri gerçekleştirmek için tanımlı bir süreç kullanımını kapsamaktadır.
  9. Yazılım Kalitesi: Yazılım kalitesi, yazılım geliştirmenin ve bakımın tümünü etkileyen ve tümünden etkilenen bir kavramdır. Hem geliştirilen ürünlerin kalitesini hem de bu ürünleri geliştirmek için kullanılan süreçlerin kalitelerini içerir. Ürün kalite nitelikleri, kullanılabilirlik, güvenilebilirlik, güvenlik, bakıma uygunluk, esneklik, etkinlik ve performans gibi kriterleri kapsamaktadır.
  10. Yazılım Yönetimi: Yazılım 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 geliştirme projelerinin başarısı için, farklı organizasyonel birimlerdeki işlerin koordinasyonu için, yazılım versiyonlarının bakımı için, kaynakların gerekli oldukları zaman var olabilmesi için, projedeki işlerin uygun olarak bölünebilmesi için, iletişimin kolaylaşması için kritik önemdedir.

Genel Sistem Tasarımı içerisinde Yazılım Mühendisliğinin Yeri

Bir yazılım sistemi bazı durumlarda çok daha büyük bir sistemin sadece alt bir bileşenidir. Yazılım mühendisliği aktivitesi de daha büyük sistem tasarımı aktivitesinin sadece bir bölümüdür. Dolayısıyla yazılımdaki ihtiyaçlar sistemin diğer bileşenlerinin özellikleri ve kısıtları gözetilerek oluşturulmalıdır.

Örnek Senaryo

Amaç Bir telefon santral sistemi tasarlamak istiyoruz.
Bileşenler Bilgisayarlar, telefon hatları ve kabloları, telefonlar, diğer donanımsal bileşenler ve tüm bileşenleri kontrol edecek yazılım sistem bileşeni.
İhtiyaçlar
  • İhtiyaç1: 20 yıl boyunca sistem 1 sn bile çalışamaz durumda olmamalıdır.
  • İhtiyaç2: Telefon kapandıktan en fazla 0.5 saniye sonra çevir sesi gelmelidir.
  • ….
  • İhtiyaç(n):….

 Böyle bir senaryoda ihtiyaçların istenilen şekilde gerçekleşmesi için;

  • Donanım, yazılım ve diğer özel donanımlar tam teşekküllü organize olmalıdır.
  • Yazılım mühendisi sistem tasarımı aşamasında yani işin en başında sürece dahil edilmelidir.
  • Yazılım mühendisi uygulama alanına hakim olmalıdır.
  • Yazılım mühendisi sistemi kullanacak son kullanıcıların profillerini bilmelidir.
  • Vb.

Yazılım Mühendisinin Rolü

Bir yazılım mühendisi aynı zamanda iyi bir programcı olmalıdır. Veri yapılarına, algoritmalara ve tasarım modellerine hakim olup, bir veya birden fazla programlama dilinde yüksek derecede kodlama yapabilmelidir. Belirsiz ihtiyaçları, kesin spesifikasyonlara çevirebilmelidir. Sistem kullanıcılarıyla teknik detaylar yerine uygulama mantığı ve kullanımı çerçevesinde konuşabilmelidir.

Uygulama modelleme (framework seviyesinde) yeteneği de diğer bir ihtiyaçtır. Yazılım mühendisi ileride karşılaşacağı problemlere karşı detaylıca ölçüp biçilmiş bir uygulama modeli tasarlayabilmelidir . Uygulama modeli hem sistem davranışları hem de performansı ile ilgili sorulara cevap verebilmelidir. Yazılım mühendisi aynı zamanda bir takım üyesidir ve sağlam iletişim yeteneklerine sahip olmalıdır. Aynı zamanda kendisinin ve diğer çalışanlarının zaman planlamasını yapabilmelidir.

Genelde organizasyonlar bu sorumlulukları çeşitli uzmanlıklar altında özelleştirip, farklı görev tanımlarına dağıtma yoluna gitmektedirler. Örneğin; iş analisti, yazılım mimarı, veritabanı uzmanı vb. Bu yapılanmanın avantaj ve dezavantajları kurum kültürüne, ürün hedeflerine ve kurum çalışanlarının profillerine göre farklılık gösterebilir.

Deniz KILINÇ

Kaynaklar

[1] Parnas, D. L. “Software Engineering Programs Are Not Computer Science Programs”, IEEE Software, Kasım/Aralık 1999, s. 19-30.

[2] “Computing Curricula – Software Engineering Volume”, http://sites.computer.org/ccse/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: