Yazılım Nedir?
Yazılım, bilgisayarları çalıştırmak ve belirli görevleri yürütmek için kullanılan bir dizi talimat veya programdır. Bir başka şekilde özetleyecek olursak yazılım, bir elektronik cihazda çalışan uygulamalara, komut dosyalarına ve programlara atıfta bulunmak için kullanılan genel bir terimdir.
Yazılım, uygulama (application) yazılımı ve sistem (system) yazılımı olmak üzere iki ana kategoriye ayrılır. Uygulama (application) yazılımları belirli bir bir ihtiyacı gidermek için veya belirli görevleri yerine getirmek için oluşturulan yazılımlardır. Sistem yazılımları ise bir bilgisayarın donanımını çalıştırmak üzere tasarlanan yazılımlardır. Sistem yazılımlarının diğer en önemli özelliği ise; uygulama yazılımlarının üzerlerinde çalışmaları için bir platform sağlamalarıdır.
Diğer yazılım türleri: yazılım geliştiricilerinin ihtiyaç duyduğu programlama araçlarını sağlayan programlama yazılımı; sistem yazılımı ve uygulamalar arasında yer alan ara katman yazılımı ve bilgisayar aygıtlarını ve çevre birimlerini çalıştıran sürücü yazılımları gösterilebilir.
İlk yazılımlar belirli bilgisayarlar için yazılmış ve üzerinde çalıştığı donanımla birlikte satılmıştır. 1980’lerde, yazılımlar disketlerde daha sonra ise CD ve DVD’lerde satılmaya başlandı. Günümüzde ise çoğu yazılım satın alınma konusunda ve doğrudan internet üzerinden indirilmek veya direk kullanılmaktadır (Bulut sistemleri).
Yazılım Çeşitleri ve Örnekleri
Çeşitli yazılım kategorileri arasında en yaygın türler aşağıdakilerden oluşur.
Uygulama Yazılımı (Application Software): En yaygın yazılım türü olan uygulama yazılımı, bir kullanıcı veya bazı durumlarda başka bir uygulama için belirli bir işlevi yerine getiren bir yazılım paketidir. Bir uygulama bağımsız olabilir veya uygulamayı kullanıcı için çalıştıran bir program grubu olabilir. Modern uygulamalara örnek olarak ofis paketleri, grafik yazılımları, veri tabanları, veri tabanı yönetim programları, web tarayıcıları, kelime işlemciler, yazılım geliştirme araçları, görüntü düzenleyiciler ve iletişim platformları gösterilebilir. Askında son kullanıcının istekleri doğrultusunda geliştirilmiş tüm uygulamalar uygulama yazılımı bölümüne girmektedir.
Sistem Yazılımı (System Software): Bu yazılım, bir bilgisayarın uygulama programlarını ve donanımını çalıştırmak için tasarlanmıştır. Sistem yazılımı, donanım ve yazılımın faaliyetlerini ve işlevlerini koordine eder. Ayrıca, diğer tüm yazılım türlerinin çalışabileceği bir ortam veya platform sağlar. İşletim sistemi, sistem yazılımının en iyi örneğidir.
Sürücü Yazılımı (Driver Software): Aygıt sürücüleri olarak da bilinen bu yazılım tipi, genellikle bir tip sistem yazılımı olarak da kabul edilir. Aygıt sürücüleri, bir bilgisayara bağlı aygıtları ve çevre birimlerini kontrol ederek belirli görevlerini gerçekleştirmelerini sağlar. Bir bilgisayara bağlı olan her aygıtın çalışması için en az bir aygıt sürücüsüne ihtiyacı vardır. Örnek yazıcılar, klavye, mause, USB depolama aygıtları ve benzeri donanımlar.
Ara Katman Yazılımı (Middleware): Ara katman yazılımı, uygulama ve sistem yazılımı arasında veya iki farklı tipteki uygulama yazılımları arasında aracılık yapan yazılım tipidir. Ayrıca daha yeni uygulamaların eski uygulamalarla çalışmasını sağlamak içinde kullanılırlar.
Programlama Yazılımı (Programming Software): Programlama yazılımı veya programlama araçları, yazılım geliştiricilerinin yazılım geliştirmesine, yazmasına, test etmesine ve hata ayıklamasına olanak tanıyan programlara denir. Programlama yazılımı örnekleri arasında birleştiriciler, derleyiciler, hata ayıklayıcılar ve yorumlayıcılar bulunur.
Yazılım Nasıl Çalışır?
Tüm yazılımlar, bilgisayarların çalışması ve kullanıcıların ihtiyaçlarını karşılaması için gereken yönergeleri ve verileri sağlar. Bununla birlikte, iki farklı tür olan – uygulama yazılımı ve sistem yazılımı, farklı şekillerde çalışırlar.
Uygulama Yazılımı
Uygulama yazılımı, son kullanıcılar için rapor yazma ve web sitelerinde gezinme gibi belirli işlevleri gerçekleştiren birçok programdan oluşur. Uygulamalar, diğer uygulamalar için de görevler gerçekleştirebilir. Bir bilgisayardaki uygulamalar kendi başlarına çalışamazlar; çalışmak için diğer destekleyici sistem yazılım programlarıyla birlikte bir bilgisayarın işletim sistemine ihtiyaç duyarlar.
Örneğin masaüstü uygulamaları bir kullanıcının bilgisayarına yüklenir ve görevleri gerçekleştirmek için bilgisayar belleğini kullanır. Bilgisayarın sabit diskinde yer kaplarlar ve çalışmak için internet bağlantısına ihtiyaç duymayabilirler. Ancak masaüstü uygulamaları, üzerinde çalıştıkları donanım aygıtlarının gereksinimlerine uymalıdır.
Web uygulamaları ise çalışmak için yalnızca internet erişimi gerektirir; çalıştırmak için donanım ve sistem yazılımına güvenmezler. Sonuç olarak, kullanıcılar web tarayıcısı olan cihazlardan web uygulamalarını başlatabilir. Uygulama işlevinden sorumlu bileşenler sunucuda olduğundan, kullanıcılar uygulamayı Windows, Mac, Linux veya başka herhangi bir işletim sisteminden başlatabilir.
Sistem Yazılımı
Sistem yazılımı, bilgisayar donanımı ile uygulama yazılımı arasında yer alır. Kullanıcılar, arka planda çalıştığı ve bilgisayarın temel işlevlerini yerine getirdiği için sistem yazılımıyla doğrudan etkileşime girmez. Bu yazılım, bir sistemin donanımını ve yazılımını koordine eder. Böylece kullanıcılar belirli eylemleri gerçekleştirmek için üst düzey uygulama yazılımını çalıştırabilir. Sistem yazılımı, bir bilgisayar sistemi açıldığında yürütülür ve sistem açık olduğu sürece çalışmaya devam eder.
Tasarım ve Uygulama
Yazılım geliştirme yaşam döngüsü, proje yöneticilerinin yazılım tasarlama ile ilgili aşamaları ve görevleri tanımlamak için kullandığı bir çerçevedir. Tasarım yaşam döngüsündeki ilk adım planlanmadır ve ardından yazılımı kullanacak kişilerin ihtiyaçlarının analiz edilmesi için analiz gelir. Planlama ve analizinden sonra ise tasarım aşaması gelir.
Bir sonraki adım, geliştirme çalışmasının tamamlandığı ve ardından yazılım testinin gerçekleştiği uygulamadır. Ayrıca bakım aşaması, sistemi çalışır durumda tutmak için gereken tüm görevleri içerir.
Yazılım tasarımı, uygulanacak yazılımın yapısının, veri modellerinin, sistem bileşenleri arasındaki ara yüzlerin ve potansiyel olarak yazılım mühendisinin kullanacağı algoritmaların bir tanımını içerir.
Yazılım tasarım süreci, kullanıcı gereksinimlerini bilgisayar programcılarının yazılım kodlama ve uygulamasını yapmak için kullanabilecekleri bir forma dönüştürür. Yazılım mühendisleri, yazılım tasarımını yinelemeli olarak geliştirir, ayrıntı ekler ve tasarımı geliştirirken düzeltir.
Farklı yazılım tasarımı türleri şunları içerir:
- Architectural (Mimari) Tasarım: Bu, mimari tasarım araçlarını kullanarak sistemin genel yapısını, ana bileşenlerini ve bunların birbirleriyle olan ilişkilerini tanımlayan temel tasarımdır.
- High-level (Üst Düzey) Tasarım: Bu, sistemin tüm bileşenleriyle birlikte bir yazılım yığını tarafından desteklenen modüller biçiminde nasıl uygulanabileceğine odaklanan ikinci tasarım katmanıdır. Üst düzey bir tasarım, veri akışı ile sistemin çeşitli modülleri ve işlevleri arasındaki ilişkileri tanımlar.
- Detay Tasarım: Bu üçüncü tasarım katmanı, belirtilen mimari için gerekli tüm uygulama ayrıntılarına odaklanır.
Yazılım Kalitesi Nasıl Korunur?
Yazılım kalitesi, yazılımın hem işlevsel hem de işlevsel olmayan gereksinimlerini karşılayıp karşılamadığını ölçer.
İşlevsel gereksinimler, yazılımın ne yapması gerektiğini tanımlar. Teknik ayrıntıları, veri işlemeyi, hesaplamaları veya bir uygulamanın neyi başarmayı amaçladığını belirten diğer herhangi bir özel işlevi içerirler.
Kalite nitelikleri olarak da bilinen işlevsel olmayan gereksinimler, sistemin nasıl çalışması gerektiğini belirler. İşlevsel olmayan gereksinimler taşınabilirlik, olağanüstü durum, kurtarma, güvenlik, gizlilik ve kullanılabilirliği içerir.
Yazılım testi, yazılım kaynak kodundaki teknik sorunları tespit eder ve çözer. Ayrıca gereksinimlerini karşıladığından emin olmak için ürünün genel kullanılabilirliğini, performansını, güvenliğini ve uyumluluğunu değerlendirir.
Yazılım kalitesinin boyutları aşağıdaki özellikleri içerir:
- Accessibility (Erişebilirlik): Ses tanıma ve ekran büyüteçleri gibi uyarlanabilir teknolojilere ihtiyaç duyan bireyler de dahil olmak üzere farklı bir grup insanın yazılımı rahatça kullanabilme derecesi.
- Compatibility (Uyumluluk): Yazılımın farklı işletim sistemleri, cihazlar ve tarayıcılar gibi çeşitli ortamlarda kullanıma uygunluğu.
- Efficiency (Yeterlilik): Yazılımın enerji, kaynak, zaman veya para harcamadan iyi performans gösterme yeteneği.
- Functionality (İşlevsellik): Yazılımın belirtilen işlevlerini yerine getirme yeteneği.
- Installability (Kurulabilirlik): Yazılımın belirli bir ortama kurulabilme yeteneği.
- Localization (Yerelleştirme): Bir yazılımın çalışabileceği çeşitli diller, saat dilimleri ve benzeri diğer özellikler.
- Maintainability (Sürdürebilirlik): Özellikler eklemek ve geliştirmek, hataları düzeltmek vb. için yazılımın ne kadar kolay değiştirilebileceği.
- Performance (Verim): Yazılımın belirli bir yük altında ne kadar hızlı performans gösterdiği.
- Portability (Taşınabilirlik): Yazılımın bir yerden başka bir yere kolayca aktarılabilmesi.
- Reliability (Güvenilirlik): Yazılımın, belirli koşullar altında belirli bir süre boyunca hatasız olarak gerekli bir işlevi yerine getirme yeteneği.
- Scalability (Ölçeklenebilirlik): Yazılımın, işleme taleplerindeki değişikliklere yanıt olarak performansı artırma veya azaltma yeteneğinin ölçüsü.
- Security (Güvenlik): Yazılımın yetkisiz erişime, gizliliğin ihlaline, hırsızlığa, veri kaybına, kötü amaçlı yazılımlara vb. karşı koruma yeteneği.
- Testability (Test Edilebilirlik): Yazılımı test etmek ne kadar kolay.
- Usability (Kullanılabilirlik): Yazılımı kullanmak ne kadar kolay.
Yazılım kalitesini korumak için geliştiriciler, yeni müşteri gereksinimlerini karşılamak ve müşterilerin belirlediği sorunları ele almak için sürekli olarak bu kuralları uyarlamalıdır. Bu kurallar, sorunları önlemek için işlevselliği geliştirmeyi, hataları düzeltmeyi ve yazılım kodunu ayarlamayı içerir. Bir ürünün piyasada ne kadar süre dayanacağı, geliştiricilerin bu bakım gereksinimlerine ayak uydurabilme becerisine bağlıdır.
Bakım yapmaya gelince, geliştiricilerin yapabileceği dört tür özelliği vardır:
- Corrective (Düzeltici): Kullanıcılar genellikle, kodlama hataları ve yazılımın gereksinimlerini karşılamasını engelleyen diğer sorunlar da dahil olmak üzere geliştiricilerin düzeltmesi gereken hataları belirler ve bildirir.
- Adaptive (Uyarlanabilir): Geliştiriciler, işletim sisteminin yeni bir sürümünün çıkması gibi değişen donanım ve yazılım ortamlarıyla uyumlu olduğundan emin olmak için yazılımlarında düzenli olarak değişiklik yapmalıdır.
- Perfective (Mükkemmel): Bunlar, performansı artırmak için kullanıcı arabirimini iyileştirmek veya yazılım kodunu ayarlamak gibi sistem işlevselliğini artıran değişikliklerdir.
- Preventive (Önleyici): Bu değişiklikler, yazılımın başarısız olmasını önlemek için yapılır ve kodu yeniden yapılandırma ve optimize etme gibi görevleri içerir.
Yazılım Lisanslama ve Patentler
Yazılım lisansı, yazılımın kullanımını ve dağıtımını kısıtlayan yasal olarak bağlayıcı bir belgedir.
Tipik olarak, yazılım lisansları, kullanıcılara, telif hakkını ihlal etmeden yazılımın bir veya daha fazla kopyasına sahip olma hakkı sağlar. Lisans, sözleşmeye taraf olan tarafların sorumluluklarını ana hatlarıyla belirtir ve yazılımın nasıl kullanılabileceğine ilişkin kısıtlamalar getirebilir.
Yazılım lisanslama hüküm ve koşulları genellikle yazılımın adil kullanımını, sorumluluk sınırlamalarını, garantileri, feragatleri ve yazılımın veya kullanımının başkalarının fikri mülkiyet haklarını ihlal etmesi durumunda korumaları içerir.
Lisanslar genellikle, onu oluşturan kuruluş, grup veya bireyin mülkiyetinde kalan özel mülk yazılımlar içindir; veya kullanıcıların yazılımı çalıştırabileceği, inceleyebileceği, değiştirebileceği ve dağıtabileceği ücretsiz yazılım için.
Açık kaynak, yazılımın ortaklaşa geliştirildiği ve kaynak kodunun ücretsiz olarak erişilebilir olduğu bir yazılım türüdür. Açık kaynak yazılım lisansları ile kullanıcılar, özgür yazılıma benzer şekilde yazılımı çalıştırabilir, kopyalayabilir, paylaşabilir ve değiştirebilir.
Son yirmi yılda, yazılım satıcıları yazılım lisanslarını tek seferlik satmaktan bir hizmet olarak yazılım abonelik modeline geçtiler. Yazılım satıcıları yazılımı bulutta barındırır ve abonelik ücreti ödeyen ve yazılıma internet üzerinden erişen müşterilerin kullanımına sunar.
Telif hakkı, başkalarının bir geliştiricinin kodunu kopyalamasını engelleyebilse de, telif hakkı, onların aynı yazılımı kopyalamadan bağımsız olarak geliştirmelerini engelleyemez. Öte yandan bir patent, bir geliştiricinin, yazılımı bağımsız olarak geliştirmiş olsa bile, bir geliştiricinin bir geliştiricinin bir patentte iddia ettiği yazılımın işlevsel yönlerini kullanmasını engellemesini sağlar.
Genel olarak, yazılım ne kadar teknikse, patent alma olasılığı o kadar yüksektir. Örneğin, bir yazılım ürününe yeni bir tür veritabanı yapısı yaratıyorsa veya bir bilgisayarın genel performansını ve işlevini iyileştiriyorsa patent verilebilir.