Yazılım üç ana kategoriye ayrılır: işletim sistemi gibi sistem yazılımı, günlük kullanılan uygulama yazılımı ve bu yazılımların yazılmasını sağlayan programlama/geliştirme yazılımı. Her kategoriden birer örnek vermek gerekirse: Windows (sistem yazılımı), Microsoft Word (uygulama yazılımı) ve Visual Studio Code (geliştirme yazılımı).
Bu üç kategori birbirinden bağımsız değildir; aslında bir cihazda katman katman üst üste binerek çalışır. Aşağıda her kategoriyi tek tek açıyoruz.
Sistem yazılımı, donanımı doğrudan yöneten ve diğer tüm yazılımların üzerinde çalışacağı temel katmanı oluşturan yazılımdır. Windows, macOS, Linux gibi işletim sistemleri bu kategorinin en bilinen örnekleridir; ayrıca bir yazıcının veya ekran kartının donanımla iletişim kurmasını sağlayan sürücü (driver) yazılımları da sistem yazılımı kapsamına girer.
Uygulama yazılımı, kullanıcının belirli bir işi yapması için doğrudan etkileşime girdiği yazılımdır. Microsoft Word ile bir belge yazmak, bir tarayıcıyla internete girmek veya bir oyun oynamak, hepsi uygulama yazılımı kullanmak demektir. Bu kategori, günlük hayatta en çok karşılaşılan ve en çeşitli yazılım türüdür.
Geliştirme yazılımı, diğer yazılımların yazılmasını, test edilmesini ve çalıştırılabilir hale getirilmesini sağlayan araçlardır. Visual Studio Code gibi bir kod editörü veya bir derleyici bu kategoriye girer. Bu araçlar kendileri son kullanıcıya yönelik değildir, yazılımcının başka bir yazılım üretmesine hizmet eder.
Bir bilgisayarda önce donanım, onun üzerinde sistem yazılımı (işletim sistemi) çalışır; sistem yazılımının üzerinde ise uygulama yazılımları çalışır. Geliştirme yazılımı ise bu iki katmanın dışında, üretim aşamasında kullanılan ayrı bir araç katmanıdır. Kullanıcı bir uygulamayı kullanırken geliştirme yazılımıyla hiç karşılaşmaz, ama o uygulama muhtemelen bir geliştirme ortamında yazılmıştır.
Bir sorun yaşandığında ("bilgisayar açılmıyor" mu, "program çöküyor" mu, "kodum çalışmıyor" mu) hangi katmanda arama yapılması gerektiğini bilmek, çözüme daha hızlı ulaşmayı sağlar. Sistem yazılımı sorunuyla bir uygulama yazılımı hatasını karıştırmak, gereksiz yere yanlış yerde çözüm aramaya yol açabilir.
Aynı üçlüyü farklı bir örnekle tekrarlamak gerekirse: Android (sistem yazılımı), bir bankacılık uygulaması (uygulama yazılımı) ve o uygulamayı yazan geliştiricinin kullandığı bir geliştirme ortamı. Hangi cihaz veya platform olursa olsun, bu üç katman mantığı genellikle aynı şekilde işler.
Üç klasik kategorinin dışında, günümüzde giderek yaygınlaşan bulut hizmetleri de bir tür yazılım sınıflandırmasıdır; burada yazılım artık kullanıcının cihazında değil, uzak sunucularda barındırılır ve internet üzerinden hizmet olarak sunulur.
Bazı yazılımlar birden fazla kategoriye aynı anda girebilir; örneğin bir web tarayıcısı hem bir uygulama yazılımıdır hem de içinde başka uygulamaların çalıştığı bir platformdur. Bu, üç kategorinin birbirini dışlayan katı kutular değil, birbirine yakın çalışan katmanlar olduğunu gösterir.
Bilgisayar bilimi eğitiminin başlangıcında bu üçlü ayrımın öğretilmesinin nedeni, öğrencinin bir bilgisayar sistemini katman katman anlamasını sağlamaktır; donanımdan başlayıp sistem yazılımına, oradan uygulama yazılımına çıkan bu model, karmaşık bir konuyu basit bir hiyerarşiye indirger.
Bir kullanıcı günlük hayatında genellikle yalnızca uygulama yazılımıyla doğrudan etkileşime girer; sistem yazılımı ve geliştirme yazılımı arka planda, çoğu zaman fark edilmeden çalışır. Bu görünmezlik, "yazılım" denince akla neden ilk olarak uygulamaların gelme eğiliminde olduğunu açıklar.
Bir binanın temeli donanım, temelin üzerine oturan yapı sistem yazılımı, içindeki odalar ve eşyalar ise uygulama yazılımı olarak düşünülebilir; geliştirme yazılımı ise bu binayı inşa eden işçilerin kullandığı aletlere benzer. Binanın kendisinin bir parçası değildir ama binanın var olmasını sağlar.
Bazı modern sistem yazılımları, özellikle mobil işletim sistemleri, artık kendi içinde küçük uygulama yazılımları (ayarlar, hesap makinesi gibi) barındırır; bu da iki kategori arasındaki sınırın günümüzde eskisi kadar keskin olmadığını gösterir.
Bir yazılım satın alma veya geliştirme kararı verirken, önce hangi kategoriye ihtiyaç duyulduğunu netleştirmek, hazır bir uygulama mı yeterli, yoksa özel bir geliştirme mi gerekli, gereksiz maliyet veya eksik çözüm riskini azaltır.
Uygulama yazılımı çalışabilmek için sistem yazılımına, sistem yazılımı da donanıma bağımlıdır; geliştirme yazılımı ise bu zincirin dışında, üretim sürecinde kullanılan ayrı bir katmandır. Bu bağımlılık sırasını bilmek, bir sorunun kaynağını doğru katmanda aramaya yardımcı olur.
Sistem yazılımı büyük ölçüde arka planda, teknik kullanıcılar tarafından yönetilirken; uygulama yazılımı doğrudan son kullanıcıya, geliştirme yazılımı ise yalnızca yazılımcılara hitap eder. Bu, aynı "yazılım" şemsiyesi altında çok farklı hedef kitlelerin bulunduğunu gösterir.
Techno Fusion'da: TF Bilişim kapsamında en çok karşılaştığımız katman sistem yazılımı ve altyapı tarafıdır. Sunucu işletim sistemleri, sanallaştırma yazılımları ve bunların üzerinde çalışan kurumsal uygulamaların kurulumu ve bakımı.