Yazılımın son yıllarda ülkemizde popülerleşmesi ile birlikte hem gençlerin hem de ebeveynlerin sıklıkla merak ettiği;
Gibi sorular başta olmak üzere bu kitapta yazılım ile alakalı bir çok sorunuza cevap bulabilirsiniz.
Ya da ücretsiz bölümleri görüntüleyin.
Binary Sistemi
Binary Sistemi Nedir?
Binary Sistemi Neden Önemlidir?
Bit, Byte ve ASCII Kavramları
Binary Sistem ile Çalışan İlk Makine
Bilgisayar
Bilgisayar Nedir?
İlk Mekanik Bilgisayar
Mekanik ve Elektronik Karşılaştırması
İlk Elektronik Bilgisayar
Programlama
Programlama Nedir?
Girdi ve Çıktı Kavramları
İlk Programlanabilir Mekanik Bilgisayar
İlk Programcı Kimdir?
Yazılım
Yazılım Nedir?
Yazılımın Tarihçesi
Makine Dili ve Assembly
Düşük Seviye Yazılım Dilleri
Yüksek Seviye Yazılım Dilleri
İlk Yazılım Dilleri
Short Code
FORTRAN
ALGOL
LISP
COBOL
BASIC
PASCAL
Smalltalk
C
SQL
Ada
Yazılımda Temel Kavramlar
Algoritma
Açık Kaynak
Sözdizimi
Nesne
Sınıf
Blok / Gövde
Yapıcı
Parametre
Veri Tipleri
İlkel Veri Tipleri
İlkel Olmayan Veri Tipleri
Değişken
Sabit
Liste / Dizi
Fonksiyon
Ön Tanımlı Fonksiyonlar
Kullanıcı Tarafından Tanımlanan Fonksiyonlar
Metot
Nesne Yönelimli Programlama
Nesne Tabanlı Programlama
Miras / Kalıtım
Tekli Kalıtım
Çoklu Kalıtım
Çok Aşamalı Kalıtım
Hiyerarşik Kalıtım
Melez Kalıtım
Elmas Problemi
Soyutlama
Veri Soyutlama
Süreç Soyutlama
Veri Gizleme
Erişim Değişkenleri
Soyut Sınıf ve Arayüz
Çoklu Biçim
Statik Çoklu Biçim
Dinamik Çoklu Biçim
Şartlar
Döngüler
While Döngüsü
Do-While Döngüsü
Döngüyü Kırmak
For Döngüsü
Foreach Döngüsü
Popüler Yazılım Dilleri
1.JavaScript
2.Python
3.Java
4.TypeScript
5.C#
6.C++
7.PHP
8.Bash (Unix Shell)
9.C
10.Ruby
Yazılım ile Neler Yapılabilir?
Yapay Zekâ
Veri Bilimi
Büyük Veri
Makine Öğrenmesi
Veri Madenciliği
Web Siteleri
Front-End
Kullanıcı Deneyimi (UX)
Kullanıcı Arayüzü (UI)
Back-End
Full-Stack
Web Uygulamaları
Mobil Uygulamalar
Masaüstü Uygulamaları
Siber Güvenlik
Video Oyun Geliştirme
Veri Tabanı Yönetimi
Veri Tabanı Nedir?
Otomasyon
Dijital Sanat
Sunucu Yönetimi
Prensipler ve Standartlar
Ekip Çalışması
Kod Okuma
Temiz Kod
Test Edilebilirlik
Modülarisazyon
SOLID Prensipleri
Tek Sorumluluk Prensibi
Açık-Kapalı Prensibi
Liskov’un Yer Değiştirme Prensibi
Arayüz Ayrımı Prensibi
Bağımlılığı Tersine Çevirme Prensibi
Sözdizimi (Syntax) Standartları
Yazılım Mimarileri
Yazılım Mimari Desenleri
Katmanlı Mimari Deseni
İstemci-Sunucu Mimari Deseni
Olay Güdümlü Mimari Deseni
Mikro Çekirdek Mimari Deseni
Mikro Servisler Mimari Deseni
Proje Geliştirme Süreçleri
Planlama
Hedef Kitle Belirleme
Kazanç Modeli Belirleme
Gereksinim Analizi
Tasarım
Kodlama
Test
Hata Düzeltmeleri ve Bakım
Yayınlama
Pazarlama
Yazılımda Takım Çalışması
Agile
Scrum
Kanban
Extreme Programming (XP)
Versiyon Kontrol Sistemleri
Faydaları Nelerdir?
Yazılım ile İlgili Üniversite Bölümleri
Alaylı Yazılımcı Olmak
Yazılımcı Olarak Çalışmak
Tecrübe Seviyeleri
Stajyer
Junior
Mid-Level
Senior
Manager
Sektörün Yazılımcıdan Beklentileri
Yetkinlikler
Yabancı Dil
Ekip Çalışmasına Uygunluk ve İletişim Becerileri
Problem Çözebilme Becerileri
Bilgi Paylaşımı
Yazılımcının Sektörden Beklentileri
Maaş
Yan Haklar ve Ekstralar
Uzaktan Çalışmak
Esnek Çalışma Saatleri
Sektöre Dair Tavsiyeler
Yazılıma Nasıl Başlanır?
Alan Seçimi
Yazılım Dili Seçimi
Algoritma Çözümleme
Yazılım Öğrenmek İçin Hangi Kaynakları Tercih Etmeliyiz?
Güncel Kalmak
Sorunlarla Nasıl Başa Çıkarız?
Bir Yazılımcının CV’si Nasıl Olmalıdır?
Yazılımcı Hangi Yabancı Dilleri Bilmelidir?
Yazılımda İş Görüşmeleri
Mülakatlara Nasıl Hazırlanılır?
Kavramsal Sorular
Yazılımsal Sorular
Peki neden bu mekanik aletleri “bilgisayar” diye isimlendiriyoruz? Bunun sebebi yukarıda bahsettiğimiz bilgisayar tanımından gelmektedir. Bu mekanik aletler de tıpkı modern bilgisayarlar gibi bir veri girişi, veriyi işleme (veri manipülasyonu, matematiksel hesaplamalar vb. gibi) ve bir çıktı sunma yeteneklerine sahiptirler.
Aynı zamanda günümüz modern bilgisayarları ile bu mekanik aletlerin çalışma prensipleri temelde -daha önce anlatıldığı gibi- aynıdır. Kısaca “var veya yok” prensibi ile çalışmaktadırlar. Küçük çark dönerse büyük çarkı döndürür, büyük çark dönerse kendine bağlı olan ipi çeker, ip çekilirse yuvarlak taş yerinden oynar gibi birbirini takip eden koşullar bir dizi işleme, en sonunda da bir çıktı almaya sebep olmaktadır. Bugün kullandığımız yazılım ile programlanmış uygulamalar da tıpkı böyle çalışmaktadır. Kullanıcı kutucuklara kullanıcı adı ve şifresini doğru girdiği takdirde sisteme giriş yapabilir.
Peki neden elektronik cihazlar günümüzde mekanik cihazlardan daha önemlidir? Bu sorunun cevabı iki kelimede gizlidir; hız ve yetkinlik. Bizler bugün elektrik akımının neredeyse ışık kadar hızlı şekilde ilerlediğini bilmekteyiz. Elektronik aletler ile yapılabilen işlemler bizlere öyle güzel sonuçlar vermektedir ki günümüz teknolojisinde transistör kullanarak yaptığımız bilgisayarlar bizlere “nasıl daha iyi ve daha küçük transistörleri yapabiliriz?” sorusunun cevabını sağlamaktadır. İşte bu sebeple teknoloji sürekli artan bir ivmeye sahiptir ve çok hızlı şekilde gelişebilmektedir. 1963-1993 yılları arasındaki teknolojik ilerleme ile 1993-2023 yılları arasındaki teknolojik ilerleme arasında çok büyük fark olmasının sebebi de burada yatmaktadır.
Ayrıca elektronik cihazlar daha kolay programlanabilir olduğu için onlarla yapabileceğimiz işlemlerin yelpazesi de mekaniklere göre çok daha fazladır. Mekanik cihazlar genellikle bir veya birbiriyle alakalı birkaç işlem için üretilebilirler fakat elektronik bir bilgisayar ile bundan çok daha fazlasını kolaylıkla yapabiliriz. Örneğin günümüz bilgisayarları ile yapılabilecek şeyleri bir düşünün. Görsel ve ses işleme, çok karmaşık matematiksel hesaplamalar, her platformda çalışabilecek uygulamalar, bankacılık işlemleri ve aklınıza gelebilecek daha sayısız işlem…
Programlama kısaca; herhangi bir şeyi belirli bir işi yapması için düzenlemek, kurgulamak, kodlamak demektir. Örneğin çocukken oynadığımız kurmalı arabaları ele alalım, onların hareket etmesini sağlamak için kurma kolunu birkaç kez çevirmemiz gerekmektedir. Bu girdi, içeride bulunan mekanizmayı tetikler ve oyuncak araba üretilirken tasarlandığı gibi hareket etmeye başlar.
Programlama kavramını düşünürken, tıpkı “çalıştırmak” kavramı gibi mekanik ya da elektronik bilgisayarlardan ve hatta herhangi bir cihazdan tamamen bağımsız olarak düşünmemiz gerekir. Örneğin akıllı televizyonunuzu yarım saat sonra kapanması için programlayabileceğimiz gibi bir boksör maç süresi boyunca karşı taraftan gelecek yumruktan kaçmak için kendini programlamıştır diyebiliriz.
Programlama kavramını, “tasarlanmak” kavramı ile karıştırmamak gerekmektedir. Bir otomobil sizin onu sürmeniz için programlanmıştır fakat emniyet kemeri sizi emniyette tutmak için tasarlanmıştır. Aynı şekilde yukarıdaki oyuncak araba örneğinde; oyuncak araba ileri gitmek için tasarlanmıştır fakat kurma kolunu çevirmeniz sizin onu tasarlandığı şekilde harekete geçirmek için programladığınızı ifade eder.
Buradan anlaşılacağı gibi yazılım üretmek ve programlamak genel açıdan bakıldığında aynı olmadığı gibi “yazılım” ve “program” kavramları da tamamen birbirini karşılamamaktadır. Modern bir bilgisayar için “yazılım ile programlanabilir” açıklamasını yapmak bu iki kavramı daha iyi anlamamıza sebep olabilir. Fakat günümüzde yazılımdan bahsederken sık sık program kelimesini kullandığımız bir gerçektir. Bu kelime zaman içerisinde anlam kaymasına uğramıştır.
Daha önce hangi cihazlara neden bilgisayar dendiğini ve programlama kavramının tanımını görmüştük. Şimdi de tarihte bilinen ilk “programlanabilir mekanik bilgisayarını” tanıyalım.
Alman mucit Charles Babbage 1791 yılında zengin bir tekstil tüccarının oğlu olarak
dünyaya gelmişti. Matematik ile arası her zaman çok iyi olan Babbage nihayetinde
Cambridge Üniversite’nde Lucasian Matematik Profesörlüğü’ne kadar yükselmeyi başarmıştı.
Bu zamana kadar birçok farklı hesaplama cihazları icat ettiği biliniyordu. İngiliz
hükümeti, kendisinden “Fark Motoru” isminde mekanik bir hesap makinesi yapmasını
istemişti. Fakat Babbage’nin aklında her zaman Fark Motor’undan çok daha işlevsel, çok
daha gelişmiş bir makinenin düşüncesi vardı. O her zaman matematiksel hesaplamaların
mekanik aletler ile çok daha hızlı ve doğru şekilde yapılabileceğini ve bu aletlerin
insanların yanında taşıyabileceği kadar küçük ölçütlerde tasarlanabileceğini düşünmüştü.
Fark Motoru yedinci derecen polinomları tablolar halinde gösterebilecek kadar yeteneğe sahip, bir sürü hassas ve küçük çarkların birleşiminden oluşan, çok ince işçilikler isteyen bir cihazdı. Babbage önceleri bu hassas birimleri üretebilecek kişileri bulamamıştı daha sonraları ise İngiliz Hükümetinin kendisi için ayırdığı tüm bütçeyi harcamasına rağmen bu icadını hiçbir zaman tamamlayamadı. Sadece toplantılarda sunum yapabilecek kadar küçük bir parçasını tamamlamış olduğunu bilmekteyiz.
1833 yılına gelindiğinde Fark Motoru için ayrılan bütçe tamamen bitmiş ve bu mükemmel
icadın yapımı durdurulmuştu. Fakat bu bir son değil çok daha güzel bir sürecin
başlangıcı olmuştu, Babbage’a “bilgisayarların babası” unvanını veren, günümüzde “ilk
programlanabilir mekanik bilgisayar” olarak kabul edilen “Analitik Motor” un temelleri
atılmış oldu. Babbage, Fark Motoru’nu 8 dişli sütunu kullanılacak şekilde tasarlamıştı,
Analitik Motor ise bu sütunlardan yüzlercesini kullanabilecekti. Aynı zamanda delikli
kartların sağladığı kolaylıklardan yardım alacak, sıralanmış birden fazla işi
yapabilecek ve sonuçları ayrı ayrı gösterebilecekti. Bu 19. yüzyıl için bir devrimdi.
Babbage’nin planladığı makineler zamanının çok ötesindeydiler bu yüzden kâğıt üzerindeki tasarımlardan çıkıp gerçekleşmeleri çok zordu. Nitekim Babbage son nefesini verirken Analitik Motor da Fark Motoru gibi yarım kalmıştı. Analitik Motor’un tamamlanması Babbage’in oğlu sayesinde 19. yüzyılın sonlarına doğru gerçekleşebilmişti.
Kâğıt üzerinde de olsa artık bir “programlanabilir bilgisayar” vardı. İlk programcının tarih sahnesine çıkması artık an meselesiydi. İşte bu isim Lovelance Kontesi, Augusta Ada King olacaktı. Bizler onu bugün Ada Lovelance ismiyle tanıyoruz.
Ada’nın zekâsı çocukluğundan beri çevresindekiler tarafından dikkat çekiyordu.
İlgilendiği birçok alanda başarılı olduğunu gören annesi onun mantık ve matematik
derslerine yoğunlaşması konusunda ısrarcı oldu. 19. yüzyılın ortalarında bir kadın için
bu eğitimler pek de rastlanan bir şey değildi. Fakat bu ne Ada’ı ne de annesini
yıldırmadı.
17 yaşındayken Analitik Motor’un mucidi ve ileride “Bilgisayarların Babası” unvanıyla anılacak olan Charles Babbage ile tanışmış ve yakın arkadaş olmuşlardı. Babbage, Ada’nın ileri matematik eğitimi görmesine yardım etmiş ve kendisine akıl hocalığı yapmıştır. Tanıştıkları sıralarda Babbage, Analitik Motor üzerinde çalışmalara devam ediyordu, Lovelance bu icattan muhteşem derecede etkilenmişti. Çalışma prensibini daha iyi anlamak için Babbage’ten makinenin detaylı şemalarının birer kopyalarını istemişti.
Babbage, Analitik Motor için İngiliz Hükümetinden finansal destek alamamıştı. -Bunda Fark Motoru’nun yapım aşamasında çok fazla para harcanması ve makinenin tamamlanmamış olmasının da etkisi olduğu sanılmaktadır.- Bu sebeple Babbage kendisine finansal kaynak aramak üzere İtalya’ya gitmişti. Burada İtalyan mühendis -ve geleceğin başbakanı olacak olan- Luigi Menabrea ile görüşmeler yaptı ve onu Analitik Motor üzerine bir makale yayınlanması için ikna etti. 1842 yılında Manebrea, Fransızca olarak önce Fark Motoru’nun nasıl bir icat olduğundan genel hatları ile bahseden sonra ise Analitik Motor’un detaylarından ve o dönem için ne kadar muazzam işler yapabileceğinden bahseden uzun bir makale yayınladı.
Bundan daha da önemli olan ve Ada Lovelance’a “ilk bilgisayar programcısı” unvanını kazandıracak olan olay bir yıl sonra yaşanmıştı. Lovelance, Menabrea’nın Fransızca olan makalesini İngilizce’ye çevirmişti fakat bunu sadece bir çeviri olarak yayınlamadı. Makalenin altına, makalenin birkaç katı kadar uzunluğundaki kendi notlarını da eklemişti.
Bu notlar içinde Analitik Motor’un yeniden programlanarak farklı matematiksel işlemlerin nasıl yapılacağını anlattığı gibi bütün olayın sadece matematik ve sayılardan ibaret kalmaması, bu makineler ile örneğin notalar kullanılarak müzikler de yapılabileceği fikrini belirtmişti. Bu yenilikçi fikri dünya tarihinde ortaya ilk atan da Lovelance olmuştu.
Lovelance bu uzun notlarının içinde Analitik Motor ile Bernoulli sayılarının nasıl hesaplanacağını anlatan bir algoritmaya da yer vermişti. İşte bu algoritma günümüzde ilk bilgisayar programı olarak kabul görmekte ve Lovelance da “ilk bilgisayar programcısı” unvanını kazandırmaktadır.
Modern bilgisayar, akıllı telefon, akıllı tablet, Raspberry Pi, Arduino ve benzeri gibi mikroskobik transistörler içeren işlemciye sahip elektronik cihazlarda belirli işlemleri yapabilmek için yazılan komutlar bütününe yazılım denir. Bir başka tanımla, yazılım dillerinin nihayetinde bilgisayar diline -yani 0 ve 1’lere- dönüşmesiyle işlemcinin programlanmasıdır.
Yazılım ile bir proje geliştirirken algoritmalar kullanır ve bazı yazılımsal süreçlerden geçeriz (bunları ilerleyen bölümlerde detaylı şekilde göreceğiz). Yazılımın en temel amacı bir dizi planlanmış işlemler sonucunda (hesaplamalar, analizler vb. gibi) bir veya daha fazla çıktı elde etmektir. Elde edilen bu çıktılar daha sonra aynı yazılımın başka bir parçasında veya tamamen başka bir yazılımda kullanılabileceği gibi son kullanıcıya bir sonuç göstermek için de elde edilmiş olabilir.
Yazılımın türleri çok çeşitliği olduğu gibi yazılım dilleri de çok çeşitlidir. Bazı yazılım dilleri birçok platformda farklı amaçlar için kullanılabilme yeteneğine sahipken bazı yazılım dilleri ise sadece belirli ve kısıtlı bir alan için üretilmiştir. Örneğin: HTML (HyperText Markup Language) sadece bir web sitenin iskelet yapısını kurmak için kullanılan bir dildir ve sadece bir web tarayıcısı üzerinde derlenir. Öte yandan Python veya Java gibi yüksek seviye yazılım dilleri işlemci üzerinde çalışabildiği için oyun yazılımından, back-end servislerine, görsel işlemeden, yapay zekâ ile müzik üretimine kadar birçok alanda sıklıkla kullanılan yazılım dilleridir.
Yazılım, bir bilgisayarı programlamak olduğu için her yazılımcı bir bilgisayar programcısıdır diyebiliriz fakat pratik olarak her bilgisayar programcısı bir yazılımcı değildir. Bu yüzden ilk bilgisayar programcısı Ada Lovelance kabul edilirken “ilk bilgisayar yazılımcısı” kavramı için başka kişilerden konuşmamız gerekmektedir.
Herhangi bir ürün için farklı izinleri içeren birden fazla lisanslama türü vardır. Bunlardan bazıları ürünü sadece kişisel olarak kullanmanıza izin verirken bazıları ise şirketiniz ya da aileniz gibi gruplar için kullanımına izin verir. Bazı lisans türleri ise parayla satın aldığınız bu ürünleri kişi ya da kurumlara satabilmenize olanak sağlayan izinleri içermektedirler.
Yazılımda açık kaynak kavramı; bir ürününün kaynak kodlarına, dokümanlarına ve tasarım şemalarına tamamen ücretsiz ve kolay şekilde ulaşılabileceğiniz anlamına gelir. Aynı zamanda bu kaynaklar üzerinde düzenleme, değiştirme yapabilir ve kendi isimlendirmeniz ile yeniden dağıtım yapabilirsiniz. Bu modelin amacı insanları, iş birlikleri içinde, bir merkezden yönetilmeyen tamamen özür yazılımlar üretmeye teşvik etmektedir.
Yazılımda açık kaynak kavramı bir yazılım dili ile üretilmiş ürünler için var olduğu gibi direkt olarak yazılım dili için de geçerlidir. Örneğin C dili açık kaynak bir yazılım dilidir ve kendisinden sonra kaynak kodlarında değişiklikler yapılarak onlarca başka yazılım dili türetilmiştir. Ayrıca açık kaynak kodlu olarak dağıtılan Unix işletim sisteminden de -Linux en meşhuru olmak üzere- onlarca farklı işletim sistemi versiyonu yayınlanmıştır.
Bugün en popüler açık kaynak yazılım lisansları olarak; Apache License, MIT License, GNU General Public License (GPL), BSD License, GNU Lesser General Public Licence (LGPL) ve Mozilla Public License (MPL) sıralanmaktadır.
Açık kaynak kavramı hayatımıza yazılımdan çok önce girmiş olmakla beraber yazılım için görebildiğimiz ilk resmi açık kaynak kod çalışması Richard Stallman’ın 1980’li yıllarda yayınladığı GNU projesidir.
Diğer adıyla “Ölümcül Ölüm Elması” probleminden bahsetmek için öncelikle çoklu kalıtım modelinden bir kez daha bahsedelim. Bu kalıtım modeli yani bir alt sınıfın birden fazla üst sınıftan kalıtılması işlemi uzun yıllar boyunca tartışma konusu olmuştur. Bunun sebebi A ve B nesnesinden türetilen bir C nesnesinin hem A’da hem B’de yer alan aynı isimli fonksiyon ve değişkenlerin hangisine sahip olacağı sorusudur.
Örneğin bir Buton (D) sınıfı Dikdörtgen (B) ve Tıklanılabilir (C) sınıflarından genişletilmiş olsun. Bu iki sınıf da üst sınıf olan Nesne (A) sınıfından genişletilmiş olsun. Nesne sınıfında yer alan bir X metotu, Dikdörtgen ve Tıklanılabilir sınıfları içerisinde çağırılır ve fonksiyon gövdesinde farklı işlemler tanımlanabilir. Bu durumda Buton sınıfı hangi üst sınıfındaki X metodunu kullanmalıdır?
Bu soruna çözüm üretmek için yazılım dilleri farklı yöntemler geliştirmişlerdir. Swift, Java, Fortran, C# ve Ruby gibi yazılım dilleri ise çoklu kalıtım modelini desteklemezler.