Professional Documents
Culture Documents
Tekirdağ Namık Kemal Üniversitesi Çorlu Mühendislik Fakültesi Yazılım Mühendisliği Dr. Rabia KORKMAZ TAN
Ders Kaynakları :
1. Yazılım Mühendisliği, Ian Sommerville, 10. Basımdan
Çeviri. Çeviri Editörü, Prof. Dr. N. Yasemin Topaloğlu
2. Software Engineering, Ian Sommerville, 9th edition,
Addison-Wesley
3. Software Engineering A Practitioner
s Approach, Roger S.
Pressman.
4. Ders Notları
Değerlendirme
%30 vize %20 Proje %50 Final
2
■ Yazılım Mühendisliği
► Tanımlar, tarihçe, kapsam
Bilgisayar programları ile bunlarla ilişkili yapılandırma ve
belgelerin bütünüdür.
► Genel yazılım
• Özellikleri pazardaki genel ihtiyaca göre belirlenerek geliştirilir.
• “Generic software”, “commercial-off-the-shelf (COTS) software”
• Örnek: MS Office yazılımı
► Müşteriye özel yazılım
• Özellikleri belirli bir müşterinin ihtiyacına göre belirlenerek geliştirilir.
• “Custom software”
• Örnek: Hava trafiği kontrol yazılımı
İhtiyaç
Yazılım
Software
Günümüz bilgisayar teknolojileri iki temel teoriye
dayanır
Von-Neumann
Turing Makineleri
Yazılımı talep eden kişiyi doğru anlamak
İsteklerin zaman içinde değişebileceğinin farkında
olmak
Problemlerin ve yeni eklentilerin yönetimini
yapabilmek
Maliyeti düşürebilmek
Yazılım ekibini doğru şekilde kurabilmek
Kullanılacak donanımı belirlemek
Eskiden “yazılım geliştirme yaşam döngüsü” Şimdi
“sistem geliştirme”
Analiz, Kod, Raporlama, Test …
■ 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.
a: başarılı
b: büyük miktarda
değişikliklerden sonra
kullanılabilen
c: çok büyük
değişikliklerden sonra
kısmen kullanılabilen
Yazılım ürününe arz ve talep artışları Toplam maliyete göre yazılım başarısı
■ Yazılım ürünlerine olan talep ve yazılım ürünlerinden beklentiler
çok hızlı artıyor
► Boeing 777
• A.B.D. ve Japonya’da 1700 iş istasyonu
• 4,000,000 Kod Satırı
• “Kanatları olan yazılım”
►…
■ Denver havaalanı • Açılış 2 yıl gecikti
otomatik bagaj sistemi • $27 milyon maliyet aşımı
• $360 milyon gecikme maliyeti
İhtiyaç Yazılım
Mühendisliği
Yazılım
■ Yazılım Mühendisliği; yazılım ürününün geliştirilmesi, işletilmesi ve
bakımı için uygulanan; sistematik, disiplinli ve ölçülebilir yaklaşımdır.
[IEEE, 1990]
Bakım-yapılabilirlik (“maintainability”)
Yazılım, değişen ihtiyaçlara göre değişebilir olmalıdır.
Güvenilirlik (“dependability”)
Yazılım, güvenilir olmalıdır.
Etkinlik (“efficiency”)
Yazılım, sistem kaynaklarının israfına sebep olmamalıdır.
Kabul-edilebilirlik (“acceptability”)
Yazılım, kullanıcıları tarafından kabul edilebilmelidir.
(Diğer bir deyişle; anlaşılabilir ve kullanılabilir olmalı, diğer sistemlerle uyumlu çalışabilmelidir.)
Yazılım nasıl daha iyi olabilir? Farklı bakış açıları var.
CS SE
Matematik Yönetim
CE
Fizik
Bilgisayar Bilimleri; bilgisayar ve yazılım sistemlerinin
temelinde yatan teoriler ve yöntemlerle ilgilenir.
► Algoritmalar ve veri yapıları, programlama dilleri, mimari, bilimsel hesaplama,
işletim sistemleri, bilgi ve veri yönetimi, grafik görüntüleme ve çoklu-ortam,
bilgisayar ağları, akıllı sistemler, vb.
(Fizik bilimlerinin, Elektrik ve Elektronik Mühendisliğinin temelinde yattığı gibi)
■ Teslim (“delivery”)
► Yazılımın zamanında teslimi için teknikler geliştirmek
■ Güven (“trust”)
► Yazılımın kullanıcıları tarafından güvenilebileceğini gösteren
teknikler geliştirmek
■ Yazılım mühendisliği, teknik yetkinliğin uygulanmasının
yanında, aşağıdaki konularda sorumluluk gerektirir:
► Gizlilik
• Örnek: Çalışanların ve müşterilerin gizlilik haklarına saygı göstermek
► Rekabet
• Örnek: Kendi yetkinliğiniz dışında iş kabul etmemek
► Özlük hakları
• Örnek: Patent, mülkiyet, vb. haklarına dikkat etmek
29
Sistem geliştirmede nesneye yönelik yaklaşım,
Tümleştirilmiş Modelleme Dilinin (UML: Unified Modeling
Language) standartlaştırılmasıyla 1990’larda
yaygınlaşmaya başlamıştır. Klasik yaklaşımın tersine, veri
merkezli, sınıf modelleri üzerinde gerçekleştirilen bir
yaklaşımdır.
2
Nesneye yönelik analiz ve tasarım yöntemleri kullanıldığında;
Kodların ve modüllerin yeniden kullanılabilirliği kolaylaşır,
Geliştirme süresi kısalır,
Üretkenlik artar,
Yazılım kalitesi yükselir,
Anlaşılabilirlik kolaylaşır.
3
Nesneye yönelik yaklaşım ile;
Yazılım geliştirilirken çeşitli süreç modelleri uygulanabilir.
Kabul görülen en iyi özellikler bir araya getirilerek, modelin
yapısına uygun birleşik (tümleştirilmiş) yazılım süreci
(Unified process:UP) ortaya atılmıştır.
UP, tekrarlı ve artımlı bir süreç yapısı çizer,
Tek bir model, analiz, tasarım, gerçekleştirme ve test
aşamalarında sürekli işlenir, değiştirilebilir ve iyileştirilebilir.
4
Geleneksel yazılım geliştirme metotlarının eksikliklerini
mümkün olduğunca azaltan nesneye yönelik yaklaşım,
birkaç yeni problemi de beraberinde getirmiştir.
Sistemin gerektirdiği çözüm ilişkisel bir veritabanı
kullanımı gerektiriyorsa, kavram ve uygulama arasında
belirgin farklar oluşur.
Süreç içinde aşamaları birbirinden kesin olarak ayırmak
zordur.
Bu da yazılım ölçümlerinin yapılabilmesini zorlaştırır.
Ancak projenin küçük parçalara bölünerek yönetilmesi ve
yinelemeli-artımlı süreç bu problemi çözmeye yarar.
5
Nesneye yönelik sistem analizi ve tasarımda UML bir
standart olarak yaygın kullanılmaktadır.
UML,bir yöntem değil,modelleme dilidir.
UML ile tasarım anlaşılır bir biçimde ortaya koyulabilir.
Notasyon, ağırlıklı olarak çizimlerden oluşur.
6
• Bir kullanıcı için önemli olan sistemin nasıl
geliştiğinden çok, doğru çalışması ve istediği işi
yapmasıdır.
• Zamanla değişen istekler karşısında gerekli
değişikleri ve yenilikleri kolayca yapabilmenin yolu
sistemin daha tasarım aşamasında iyi
tanımlanmasıdır.
• Ayrıca analiz ve tasarım sırasında çizilen UML
diyagramları ile sistemin resmi çizilerek, müşteri ile
etkileşim içinde, projenin doğru yönde ilerlemesi
sağlanır.
7
Gerçek dünyada nesneler, belli sorumlulukları yerine getiren
varlıklardır.
Yazılımda ise değişik hizmetler veren ve özellikleri olan bir
varlık olarak düşünülebilir.
Programcı gözüyle bakıldığında ise nesne, veri ve
fonksiyondan oluşan bir modülden başka bir şey değildir.
8
Bilgisistemi geliştirmenin amacı, bir problemi
çözmektir.
Nesneye yönelik yaklaşımda problemi oluşturan
nesneler, gerçekteki yapılarına benzer olarak
modellenir ve modellenen nesnelerin de özellikleri
ve davranışları olur.
Gerçek hayattan bir örnek verirsek;
o Bahçemizdeki ağaç bir nesnedir.
o Yaprak türü, gövde uzunluğu, meyveleri, çiçekleri nesnemizin
özellikleri,
o Ağacın büyüyerek çiçek açması yaprak ve meyve vermesi de ağacın
davranışlarıdır.
9
Nesneler birbirlerinden kimlik bilgileri ile ayrılırlar.
Örneğin; aynı yemek takımına ait iki tabak tıpatıp
aynı gibi gözükse de üretim sırasında farklı seri
numaraları verildiyse farklı seri numaralarına sahip
farklı iki tabak olurlar.
Nesneye yönelik yaklaşımın hedefi, gerçek hayatta
nesnelerin sahip olduğu durum, davranış, kimlik
gibi özellikleri örnekleme ve modellemeye
çalışmaktır
10
Yapısal UML Diyagramları
1. Sınıf Diyagramı (Class Diagram)
2. Bileşen Diyagramı ( Component Diagram)
3. Birleşik Yapı Diyagramı (Composite Structure Diagram)
4. Nesne Diyagramı (Object Diagram)
5. Paket Diyagramı (Package Diagram)
6. Yerleştirme Diyagramı (Deployment Diagram)
UML’in Davranış Diyagramları
1. Kullanım Senaryosu Diyagramı (Use-Case Diagram)
2. Faaliyet Diyagramı (Activity Diagram)
3. Durum Diyagramı (State Machine Diagram)
4. Etkileşim Diyagramları
1. Ardışıklık Diyagramı (Sequence Diagram)
2. Zamanlama Diyagramı (Timing Diagram)
3. Etkileşime Bakış Diyagramı (Interaction Overview Diagram)
4. İletişim Diyagramı (Communication (Collaboration) Diagram)11
Aktör (Actor); Sistemin kullanıcılarını tanımlamak için kullanılır. Bir
insan, bir başka sistem veya bir cihaz olabilir.
Kullanım Senaryosu (Use Case); sistemdeki aktörler için, belirli bir
sonuç değerini oluşturan, bir dizi eylem bütünüdür. İşlevsel
isteklerin anlaşılmasına yardımcı olan bir yöntemdir.
Yapısal Elemanlar (Structural Elements); sistemde bulunan
yapıtaşlarını, yani sınıfları, nesneleri ve paketleri içeren statik
kısımlardır.
Davranışsal Elemanlar (Behavioral Elements); kullanılan eylem
sözcükleri yardımıyla yazılım modelinin dinamik kısımlarını
tanımlar.
Gruplama Elemanları (Grouping Elements); diğer adıyla paketler,
yazılım elemanlarını gruplamak amacıyla kullanılırlar. Paketlerin
içinde sınıflar, arayüzler, diyagramlar, hatta başka paketler
bulunabilir.
12
Nesne (Object); yazılım modeli içindeki belirli ve sonlu sayıda
olan sistem elemanlarıdır. Nesnelerin karakterleri ve bu
karakterlerin üzerinde duran davranışları vardır. Nesneler bu
yapılarıyla (karakter, davranış) sistem üzerinde kendilerine
verilen görevi yerine getirirler.
Sınıf (Class); nesnelerin sistem içerisinde oynadıkları rolü,
yani nesnelerin öznitelikleri ile iş yapan metotlarını kapsayan
yapılarını belirlerler. Sınıflar nesneler için bir kalıp görevi
görürler. Sistem içerisinde nesneler, bu kalıba göre
oluşturulurlar, belirli etkinlikleri yerine getirirler ve sonlanırlar.
Sınıflar, bir yandan varlıkların belirli özellikleri ve
davranışlarına odaklanarak soyutlama sağlarken diğer
yandan varlıkların bazı özelliklerini ve davranışlarını kapsayıp
dış dünyadan gizleyerek karmaşıklığı azaltırlar.
13
Aktif Sınıf (Active Class); kendi başlarına var olabilen,
uygulamanın akışını kontrol edebilen nesneleri tanımlarlar.
Arayüz (Interface); nesnelerin davranışlarını belirleyen
kurallar bütünü olarak düşünülebilir. Sınıflar, davranışları
belirleyen arayüz yordamlarını gerçekleştirirler.
İşbirliği (Collaboration); belirli bir amaca yönelik kullanım
senaryolarının birleştirilmiş halidir.
Bileşenler (Component); yazılım gereksinimlerinin belirli
kısımlarını gerçekleştiren modüllerdir.
Düğüm (Node); sisteme hesaplanabilir ve ölçülebilir
durumda olan bir kaynak sunan fiziksel elemanlar.
14
Sınıf, aynı özellik ve işlemlere sahip nesne kümesi için bir
tanımlayıcıdır. Nesnelerin oluşturulması için şablon olarak
da düşünülebilir.
15
Sınıf Adı
Özellikler
İşlemler():
16
Özellik bir tip-değer çiftidir. Sınıflarda özelliklerin tip
tanımları yapılır, nesnelerde ise bu özellikler değer taşırlar.
17
Özellik isimleri ve tiplerinin belirtildiği gösterim örnekleri;
Mimar Yapı
Ad: String Ad: String
Soyad: String Yer: String
Doğum Tarih: Date Yapım Tarihi: Date
Ölüm Tarihi: Date Yapan: Mimar
19
Bir sınıfın üyelerine erişim için üç etiket kullanılmaktadır.
Bunlar;
Public (açık): Üyeler diğer nesnelerin kullanımına
açıktır. UML’de üyenin başına konulan “+” işareti ile
gösterilir.
Private (özel): Üyeler sadece o sınıfın nesneleri
tarafından kullanılabilir. UML gösterimi “-” işaretidir.
Protected (korumalı): Üyeler sadece o sınıfın nesneleri
ve alt sınıflarından türeyen nesneler tarafından
erişilebilir. UML gösterimi ise “#” işaretidir.
20
Nesne, bilgi saklayan özelliklerinin yanı sıra bu özellikler
üzerinde işlem yapmaya yardımcı olan işlemleri de içerir.
Bir işlemi gerçekleştirilen yordama ise, “metot” denir.
Metotlar; kendisiyle aynı isimde olan mesajla aktif hale gelir,
bu mesajda metodun sahip olduğu parametrelerin alacağı
değerler de yer alır.
21
İşlemler nesnelerin birlikte çalışmasını sağlarlar
Yığın Liste
- içerik: Liste
+ add():
+ push(): + remove():
+ pop(): + first():
+ last():
Bir işi gerçekleştirmek için, birçok nesne aralarında
mesajlaşarak işbirliği yaparlar. Yukarıda “Yığın”
sınıfı,”push()” işlemini yapabilmek için “Liste” sınıfının
“add()” hizmetinden yararlanır. 22
İşlemlerin görülebilirliği de özelliklerin görülebilirliği ile aynı
esaslara dayanır.
Nesne yönelimli bir programda dış dünyaya hizmet eden ve
haberleşen metotlar açık görünürlüğe sahip, sınıfın kendi iç
yapısında kullandığı işlemler ise özel görünürlüğe sahip olup
dışarıdan erişilemezler.
23
Statik = Sınıf Diyagramları (Class Diagram)
24
Public id : Integer = 0
Private mKod : HashTable
25
Nesneye yönelik bir uygulamanın analiz aşaması, temel
olarak sınıfların ve sınıflar arasındaki ilişkilerin belirlenmesi
esasına dayanır.
26
Bağlantı, sınıflar arası ilişkilerin bir çeşididir.
Sınıflardan türeyen nesneler arasında hizmet alışverişini
sağlar.
Birbirleriyle haberleşecek nesneler bu bağlantıyı kullanırlar.
Bağlantılarda genellikle iki sınıf yer alır; ancak tek sınıf da
kendi üzerinde bağlantıya sahip olabilir.
27
Satış
Satış kalemi
Tarih: Date
miktar: int i..*
Kasiyer: Çalışan
31
32
Kümeleme ve birleştirme, sınıflar arasındaki parça-bütün
ilişkileridir.
Kümelemede (Aggregation) alt parçalar, sadece o sınıfa ait
üyeler değildir, kendi başlarına da kullanılabilirler. UML
diyagramlarında bağlantı çizgisinin ucuna içi boş bir dörtgen
çizilerek gösterilir.
33
Bağımsız iyelik; Nesneler arasındaki bir tür parça bütün ilişkisidir.
Bilindiği gibi günlük hayatta karşılaşılan pek çok komplike varlık,
birden fazla alt parçanın birleşiminden oluşmaktadır.
Aggregation (Kümeleme) ilişkisi; bu tür varlıklar ile onları
oluşturan parçaların modellenmesini sağlar.
34
35
Liste
Yığın
Add():
push(): Delete():
pop(): Firt():
Last():
37
Composite Aggregation : Bağımlı iyelik
Parça ve bütün arasında organik bağımlılık vardır.
38
Ünite Bölüm
Kitap
39
Genel tanımlar içeren ana bir sınıf ile daha özel
ayrıntılara sahip alt sınıflar arasındaki ilişki türüne
genelleştirme denir.
Alt sınıf, üst sınıftan türetilir.
Üst sınıfın özellikleri alt sınıfta aynen kullanılabilir.
Böylece tanımlanmış olan özelliklerin tekrar
tanımlanmaları gerekmez.
Tasarlanan sınıfların tekrar kullanılabilirliği artar.
UML’ de genelleştirme, bağlantı çizgilerinin ucuna
içi boş bir üçgen çizilerek gösterilir.
40
Müşteri
Ad:string
adres:string
Kredi hesapla():Money
41
42
Çok şekillilik (Polymorphism), farklı sınıflardan
yaratılmış olan nesnelerin, aynı mesaja farklı
tepkiler vermesi olarak tanımlanabilir.
Alt sınıfın miras aldığı bir işlem aynen kullanılabilir.
Örneğin “Müşteri” sınıfında tanımlı kredihesapla()
metodu,”ŞahsiMüşteri” alt sınıfında kullanılır.
Ayrıca ”KurumsalMüşteri” sınıfında
“kredihesapla()” işleminin ise çok şekilli olduğu
söylenebilir.
43
Soyut (Abstract) sınıf, üzerinden doğrudan nesne
tanımlayan sınıftır.
Soyut sınıfın UML tanımı, sınıftan ya da soyut
işlemden önce yazılan <<abstract>> anahtar
kelimesidir.
44
Bir sınıf içerisinde tanımlı olan bir işlem aynı isimle
ancak farklı tip veya sayıda değişik parametreler ile
tanımlanabilir. Buna aşırı yükleme (overloading)
denir.
Örneğin toplama işlemine aldığı parametrelere göre
birçok farklı şekilde tanımlanır
o Integer topla(integer a,integer b)
o Float topla(integer a,float b)
o Float topla(float a,integer b)
o Float topla(float a,float b)
45
Yazılım geliştirme yaşam döngüsü açısından
nesneye yönelik sistem analizi, geleneksel yapısal
yaklaşımla aynı aşamalara sahiptir.
46
Planlama, analiz, tasarım, gerçekleştirme aşamaları ve
aşamalarda gerçekleştirilen aktiviteler de aynıdır.
Yapısal sistem geliştirmede işlemlerin tanımlanması ve
modellenmesi üstünde durulurken, nesneye yönelik yaklaşım
nesneler ve etkileşimleri vurgular.
Her iki yaklaşım geliştirme aşamalarında modelleme üstünde
dursalar da, değişik açılardan ele alırlar. Ör; sistem analisti,
veri akış diyagramları yerine, etkileşim diyagramları kullanır.
47
Bundan başka, geleneksel yaklaşımda kullanılan varlık-ilişki
diyagramları ile nesneye yönelik yaklaşımdaki sınıf
diyagramları, farklı gösterimler kullanmalarına karşın birçok
ortak kavram içerirler.
İki yaklaşım arasındaki temel fark, sistem aktivitelerini
göstermek için kullanılan diyagramların farklılığı ve
çeşitliliğidir.
48
Nesneye yönelik yaklaşımda uygulamanın gereksinimlerini
tanımlamak için birbiriyle ilişkili ancak bağımsız iki diyagramdan
yararlanılır:
1)Sınıf (Class Diagram) diyagramı; Bir sistemdeki tüm nesnelerin sınıf
tanımlarını ve ilişkilerini göstermek için kullanılır. Aynı zamanda her
sınıfın özellikleri ve işlemleri de bu diyagramda belirtilir.
2)Kullanım senaryosu (Use Case Diagram) diyagramları; yeni
sistemdeki kullanımların, senaryoların belirlenmesi için kullanılır.
Genel olarak, sistemin nasıl kullanılacağını modeller. Sistemdeki olay
tablosunun bir özet gösterimi şeklindedir. Bu sayede sistemin
gerçekleştirmesi gereken fonksiyonlar belirlenmiş olur. Tek,
anlaşılabilir bir kullanım senaryosu diyagramı ile sistem
modelleneceği gibi, daha küçük diyagramlardan oluşmuş bir kullanım
senaryosu modeli de oluşturulabilir.
49
Tasarlanacak olan sistem analiz edilirken temel amaç,
çözülecek problemin doğru, mantıklı, anlaşılır ve test
edilebilir bir modelini oluşturmaktır. Problemin çözülmesi
analiz aşamasında gerçekleşmez. Buradaki hedef,
problemin tam olarak anlaşılmasıdır. Yazılım nesneleri gibi
tasarıma yönelik detaylarla bu aşamada ilgilenilmez.
50
Bir sistemin davranışı dış olaylara verdiği tepkilerdir.
UML’de, sistemin dışarıdan görülebilen ve test edilebilen
davranışları,kullanım senaryoları ile gösterilir.
Senaryolar: Anlamlı bir sonuca ulaşmak için aktör ile
sistem arasında gerçekleşen olaylardır.
o Aktör ise bir senaryoyla etkileşime geçen kimse ya da şey, kısaca
sistemin kullanıcısıdır. Bir insan veya başka bir sistem olabilir.
o Aktör, senaryodan kullanabileceği bir sonuç bekler.
51
Kullanım senaryosu modellemesi kolay anlaşılırdır, müşteri
ile iletişimi kolaylaştırır.
Gerçeklenen sistemin isteklere uygun olup olmadığı
senaryolar ile test edilebilir.
Nesneye yönelik analiz için uygun bir başlangıç oluşturulur.
52
Aktörler: Senaryo ya da aktörlerden ilk olarak hangisinin
belirleneceği sistem analistinin vereceği karardır.
Aktörler UML’de kullanım senaryosu diyagramları çizilirken
çöp adamlarla ifade edilir.
Ancak aktör özelliklere ve işlemlere sahip olabileceğinden,
normal bir sınıf şeklinde de gösterilebilir.
53
Aşağıdaki örnekte güncel bir uygulama olan internette
alışveriş için uygulamanın yapısı, teknik alt yapı, alışveriş
sırasında gerçekleştirilen işlemler üzerinde durulmuştur.
Sitenin genel yapısı:
Site kahve satışı yapmaktadır.
Hazır kahveler satın alınabileceği gibi, müşteri dilediği
çeşitleri harmanlayarak özel kahve siparişi de
verebilmektedir.
Bir alışverişte birden fazla çeşit kahve siparişi verilebilir.
54
Siparişi tamamlamak için müşteri teslimat ve ödeme
formlarını doldurur.
Kredi kartı ve banka havalesi ile ödeme yapılabilir.
Arka planda müşterinin bilgileri ve ödemesi doğrulanır.
İstenen özelliklerdeki sipariş, kahve sağlayan depodan
alınır, fatura basılır ve müşteriye gönderilir.
55
Aktörleri ve senaryoları belirlemek için öncelikle sistemin
sınırları belirlenmelidir. Bunun için ilk olarak sistemin genel
akışı adım adım özetlenir;
Müşteri, hazır bir kahve seçer. Özellikleri ile fiyatı da
gösterilir.
Müşteri istediği kahveleri harmanlayarak kendine özel bir
kahve oluşturabilir. Fiyat da seçilen kahvelere göre yeniden
hesaplanır.
Müşteri 1. ve 2. adımları tekrarlayarak alışverişine devam
eder.
56
Müşteri siparişini siteden verir. Siparişi tamamlamak için
teslimat ve fatura bilgileri, ödeme detaylarını içeren bir form
doldurur.
Sipariş sisteme girilince, müşteri ve ödeme bilgileri
doğrulanır.
İstenen özelliklerdeki kahve, sağlayıcı depodan alınır,
faturası basılır.
Sipariş, fatura ile birlikte müşteriye gönderilir.
57
Senaryo, bir aktöre fonksiyonel bir değer sunan bir
bütündür.
Herhangi bir senaryoyla ilişkisi bulunmayan bir aktör
sistemde gereksizdir. Ancak hiçbir aktörle ilişkide olmayan
senaryolar bulunabilir.
Kullanım senaryoları belirlenirken sistemin aktörlere karşı
sorumlulukları düşünülmelidir.
58
Kullanım senaryolarının UML gösterimi elips şeklindedir.
Senaryolarla ilişkide olan aktörler de diyagramda yer alır.
Genelde aktör ve senaryoların etkileşimde olması beklenir.
Bir aktörün direk olarak bir başka aktörle etkileşimde olması
ise önerilmez. Aralarında mutlaka etkileşimi sağlayan bir
senaryo bulunmalıdır.
59
<<extend>>
Özel kahve Kahve seçimi
oluşturma
Bilgi Girişi
Depo
Müşteri
<<include>> Sipariş Verme
Fatura Basımı
62
Senaryo KS1 Sipariş verme
64
Nesneye yönelik analizde sistemin iç durumu sınıf modeli ile
tanımlanır.
Bu modellemede sınıflar ile birlikte özellikleri, işlemleri,
bağlantılar, bütünleşmeler, bileşimler ve genelleştirmeler de
yer alır.
Nesneye yönelik sistem analizi sırasında kullanım
senaryosu modellemesi ile sınıf modellemesi paralel olarak
ilerler.
Kullanım senaryoları ile sınıfların belirlenmesi kolaylaşırken,
sınıflar da gözden kaçırılan kullanım senaryolarının
belirlenmesini sağlar.
Bu iki model ile uygulama alanının modeli oluşturulmuş
olur. 65
Sınıf modellemesinde yer alan sınıflar, gerçek dünyayı
oluşturan kavramsal nesnelerdir.
Yazılım sınıfları bu aşamada düşünülmese de, tasarıma
kılavuzluk eder.
Sınıfları belirlemek için, kullanım senaryolarında yer alan
isimlerden ve isim tamlamalarından yararlanılır.
Örnek olarak KS1 kullanım senaryosundaki isimler ve
tamlamaları verilmiştir.
o Müşteri sipariş etmek istediğini belirtir.
o Müşteri teslimat için adını ve adresini, fatura bilgilerini girer.
o Müşteri ödeme şeklini seçer ve ödeme bilgilerini girer.
o Sistem benzersiz tanımlayıcı kod üretir, müşteri hesap bilgileri
ile birlikte veritabanına kaydeder.
66
Gereksinimlerde yer alan bir kavramın gerçekte bir sınıf
olarak gerçekleştirilip gerçekleştirilmeyeceği, birkaç
soru ile kesin olarak belirlenebilir:
o Kavramla ilgili veri saklanması gerekiyor mu?
o Değişik değerler alabilecek farklı özellikleri var mı?
o Kavramdan birçok nesne türeyebilir mi?
o Uygulamanın kapsama alanı içinde mi?
o Kavramın sınırları iyi çizilmiş mi, tanımı tam yapılabiliyor mu?
Problemin çözümü tasarım sürecine bırakılır.
67
Birsınıfın özellikleri, yaratılan nesnelere özgü değerler
alan verilerdir.
Özellikler genellikle basit veri tiplerinden oluşur.
Birden fazla alandan oluşan, üzerinde işlem yapılan,
kendi niteliklerine sahip olan kavramlar, bir sınıfın
özelliği değil ayrı bir sınıf olarak ifade edilmelidir.
68
Bağlantılar nesnelerin işbirliği ilişkilerinin
çıkarılmasına yardımcı olmaktadır.
Sistem gerçekleştirildiğinde sınıflar arasındaki
bağlantılar, bu sınıflardaki belirli özellikler ile temsil
edilir.
Analiz aşamasında ise, bağlantılar çizgiler ve
çoğullama simgeleri ile gösterilir.
69
Bağlantıların belirlenmesi için, sınıfların belirlenmesinde
olduğu gibi kullanım senaryolarından yararlanılır.
Senaryolarda yer alan fiiller, olası bağlantılardır.
Sistemin amacı dışındaki bağlantılar gereksizdir.
Sistemin tasarımı ile ilgili bağlantılar dikkate alınmalıdır.
Ayrıca senaryoda yer alan faaliyetler bağlantı değil etkileşimi
ifade eder. Bu yüzden bağlantı ilişkiyi temsil etmelidir.
İki sınıf arasında birden fazla yol varsa, genellikle çözümde
fazlalık ilişki vardır.
Gereğinden fazla bağlantı sınıf modellemesinin
anlaşılabilirliğini azaltır. 70
Sınıf Musteri, Urun, Siparis
Nitelik İsim, Soyisim, Adres, Teslimat Tarihi,
Ödeme Türü, Kart Numarası
Metot SiparisVer
71
Sınıf diyagramı, kullanım senaryoları ile analizi yapılan
sistemin uygulama modelini gösterir.
Bu diyagramda kavramsal sınıflar, aralarındaki ilişkiler
ve sınıfların nitelikleri yer alır.
Sınıf diyagramlarında henüz işlemler bulunmamaktadır.
İşlemlerin belirlenmesi, sınıfların sorumluluklarının
belirlenmesi demektir ve nesneye yönelik sistem
tasarım safhasını oluşturur.
72
1 Kahve sitesi 1 Kahve
*
Tanım:String
* Birimfiyat:Money
Müşteri
ad:string
telefon:string 0..1 ÖzelKalem
email:string Sipariş İçerik:List
Sipariş Kalemi ÖzelFiyat:Money
tarih:date 1 1..*
1 Teslimadres:String miktar:int
durum:String
StandartKalem
stdFiyat:Money
1
0..1 1
Fatura Ödeme
Tarih:Date miktar:Money
adres:String tarih:Date
ID no:int tip:String
73
Şekil-11.3:Kahve sitesi sistemi için sınıf diyagramı
Tasarım aşamasında analizi yapılarak modellenen sistemin
mantıksal çözümü oluşturulur.
Kavramsal sınıflar baz alınarak yazılım sınıfları belirlenir. Asıl
önemli olan, sınıfların aralarındaki etkileşimlerin belirlenmesi ile
nesnelere sorumlulukların atanmasıdır.
Sorumlulukları yerine getirmek üzere sınıflarda metotlar
oluşturulur.
Nesneye yönelik sistem tasarımı sırasında nesnelerin birlikte
çalışmalarını göstermek amacıyla etkileşim diyagramları çizilir.
Bunlar işbirliği (collaboration) ve ardışıllık (sequence)
diyagramlarıdır.
Bunlarla birlikte sistemin son durumunun tasarım sınıf diyagramı
da çizilir
74
<<Interface>>
KrediKartıOnayAdapter
onayAl(siparis:Sipariş):boolean
onayAl(siparis:Sipariş):boolean onayAl(siparis:Sipariş):boolean
AmExAdapter
onayAl(siparis:Sipariş):boolean
75
Kahve sitesi sistemi için kredi kartı onay tasarımı
Nesneye yönelik tasarım, senaryoları gerçeklemek üzere
sorumlulukların ilgili birimlere atanması ve nesneler arası
işbirliği oluşturulmasıdır. Etkileşim modellenmesi iki
diyagramla yapılır;
İşbirliği (Collaboration) Diyagramı: Hangi nesnelerin birlikte
çalışacağını, nasıl mesajlaşacağını, bir durumu yada
fonksiyonu nasıl gerçekleştireceklerini belirtir. Kullanım
senaryosu diyagramında belirtilen tüm durumlar için, ayrı
işbirliği diyagramları çizmek gerekir.
Ardışıllık (Sequence) Diyagramı: İşbirliği diyagramında
verilen bilginin daha detaylı açıklamalarından oluşur.
Nesneler arasındaki mesajlaşmaların sırası, diyagramdaki
diziliş sırası ile betimlenir.
76
İşbirliği diyagramında (Collaboration Diagram) mesajlar,
yollandıkları sıraya göre numaralandırılırlar. Bir mesajın
yollanması sebebiyle yollanan mesajlara, bağlı alt
numaralar verilir.
n4:Nesne n4:Nesne
1:mesaj1()
2:mesaj4() 1.1:mesaj2()
n4:Nesne n4:Nesne
mesaj1()
mesaj2()
mesaj3()
mesaj4()
78
Tasarımda bir sorumluluğu yerine getirmek üzere
nesne kendi metotlarından birini çağırabilir. Bir
nesnenin kendi metotlarını çağırmasına kendine
mesaj denir.
1:mesaj()
n1:Nesne
n1:Nesne
mesaj()
79
Bir mesajın sadece belirli bir koşul gerçekleştiğinde
gönderilmesi gerekebilir. İşbirliği diyagramında bu
durum mesajın başına eklenen şart ile gösterilir.
1:[şart=uygun] işlemYap()
n1:Nesne n2:Nesne
80
n1:Nesne n2:Nesne
opt [şart=uygun]
81
Bir işlemin yapılması için bir nesne grubuna mesaj
gönderilmesi gerekebilir. Bir nesne grubuna yollanan
mesaj yada mesajlar işbirliği diyagramında
“*”simgesiyle, ardışıllık diyagramında ise “loop”
çerçevesi içinde gösterilir.
82
1 *: alttop=altToplamAl()
s:Sipariş :SiparişKalemi
İşbirliği diyagramı
s:Sipariş :SiparişKalemi
loop
alttop=altToplamAl()
Ardışıl diyagram 83
1:[i=1..N] işlemYap()
n1:Nesne n2:Nesne
n1:Nesne n2:Nesne
loop [i=1..N]
1: işlemYap()
84
Tasarımcının bir kullanım senaryosunda yer alan durumları
modelleyerek anlatması ile senaryolar gerçeklenir.
Tasarımdaki en önemli girdi gerçekleştirilecek olan senaryolar
ve varsa bunlar için yazılan sözleşmelerdir.
Senaryoların gerçeklenmesi ile işbirliği içinde çalışan
nesnelere sorumluluklar atanır.
Senaryoların gerçeklenmesi adımında kullanılan girdiler
aşağıda görülmektedir.
Ardışıl
Senaryolar Diyagramlar
Sorumluluklar
İşbirliği
Sözleşmeler Sorumlulukları
Diyagramları
Tasarım n atanması
Kalıpları ve
Yazılım Sınıf
Prensipler
Diyagramları
85
:Denetçi
yeniSipariş yarat
:Sipariş
Yaratıcı
86
87
88
Başlangıç nesnesi tüm programın çalışmasını
denetleyen bir nesnedir. Başlangıç nesnesi
yaratıldığında ve başlangıçla ilgili diğer işlemler de
yerine getirildiğinde sistem harekete geçer.
Başlangıç sorumluluklarına ana program ya da
sistemin ara yüz nesneleri de sahip olabilir. Sistemin
kullanıcı arayüzü ile olan ilişkisi de Denetçi nesnesi
üzerinden sağlanır. Bu sayede tasarlanan sistemin
kullanıcı arayüzünden bağımsız olması da sağlanır.
89
Görünürlük, nesnenin referansa sahip olması olarak
tanımlanabilir. Dört çeşit görünürlük tipi bulunmaktadır. Bunlar;
• Özellik görünürlük: B nesnesi A nesnesinin bir özelliğidir. Bu
durumda A,B ye sahiptir.
• Parametre görünürlüğü: B nesnesi A nesnesinin bir metodunda
parametre olarak yer alır. Görünürlük sadece o metodun içinde ve
çalıştığı sürece geçerlidir. Metot bitince görünürlük ortadan
kalkar.
• Yerel görünürlük: B nesnesi A nesnesinin bir metodunda yerel
değişken olarak yer alır. Görünürlüğün geçerliliği metodun
çalışma süresi kadardır.
• Global görünürlük: B nesnesi ile A nesnesi aynı uzayda yer
aldığında olan görünürlük tipidir. A ve B nesneleri var oldukça
görünürlük devam eder.
90
Senaryoları gerçekleştirmek üzere etkileşim
diyagramlarının oluşturulmasına paralel olarak,
yazılım sınıflarını gösteren tasarım sınıf diyagramı da
çizilir. Tasarım sınıfı diyagramında yazılım sınıfları,
sınıfların özellikleri, özelliklerin tipleri, metotları,
metotların parametreleri ve erişim hakları gösterilir.
Yazılım sınıfları arasında bağımlılık, özellik
görünürlüğü dışındaki görünürlük tipleri sonucunda
oluşur. Sınıf diyagramında kesik çizgili ok ile
gösterilir.
91
KahveSitesi Kahve
Adres: String
1 KahveKatalog 1..*
Tanım: String
İsim: String Fiyat: Money
tanımAl() İd: in
Bul()
1 Sipariş
Bir e-ticaret
projesinin önemli
nesnelerinden birisi
olan sipariş ve
onunla ilgili
nesneler verilen
UML diyagramında
olduğu gibi
modellenebilir.
93
Verilen diyagram aşağıdaki gibi yorumlanabilir:
• Bu projede iki tür müşteri bulunmaktadır; genelleştirme (generalization). Müşteriler
ya doğrudan İnternet’ten kendileri sipariş verebilir veya bir mağazaya gidip oradan
sipariş verebilirler.
• Müşteri nesnesi için bir koşul/kısıt (constraint) tanımlanmıştır. Bu koşula göre, ancak
ve ancak siteye üye girişi yapmış kişiler sipariş verebilir.
• Müşteri ile sipariş arasında ilişki vardır. Bir müşterinin 0 veya daha fazla sayıda
siparişi olabilir (0..*). Fakat bir sipariş ancak bir tek müşteriye (1) bağlı olabilir. Bir
siparişte en az 1 ürün vardır (1..*) ve bir sipariş en az bir ödeme şekline sahiptir
(1..*).
• Sipariş ile “sipariş detay” arasında oluşum (composition) bağıntısı vardır. Sözkonusu
sipariş silindiği zaman o siparişe ilişkin ayrıntı detay kayıtlar da silinir. “Sipariş detay”
ile ürün arasında içerim (aggregation) bağıntısı vardır. Bu durumda sipariş detay kaydı
silindiği zaman o kayıtla ilişkili ürün nesnesi silinmez.
• Bir müşterinin sistemde 0 (sıfır) veya daha fazla sayıda adresi tanımlı olabilir. Her
siparişin bağlı olduğu iki adres vardır. Bu adreslerden biri fatura adresi diğeri teslimat
adresi olarak kullanılır ve her sipariş için ancak 1 (bir) fatura adresi ve 1 (bir) teslimat
94
adresi tanımlanabilir.
BİLGİSAYAR SİSTEMLERİ
Dış etkilere göre düzenli bir şekilde etkileşen ya da birbirinden
bağımsız olarak belirli bir yapı oluşturan, belli bir hizmeti görmek
üzere veri toplayan, işleyen veya üreten bir grup öğeye sistem
adı verilir.
2
Sistem Çeşitleri:
o Doğal sistemler: Canlı ve cansız olarak ikiye ayrılabilirler.
• Canlı sistemler: Dünyada bildiğimiz tüm canlılar. Ör., Hücreler,
sinir sistemi, dolaşım sistemi.
• Cansız sistemler: Ör., güneş sistemi, coğrafi sistemler.
3
Bilgiyi işlemeye yönelik olarak gerçekleştirilen her türlü
sisteme Bilgi Sistemi (Information System), bu alandaki
teknolojiye de Bilgi Teknolojisi (Information Technology – IT)
adı verilmektedir.
4
Bilgi sistemlerinin çeşitleri:
1. Çevrimiçi Sistemler
2. Gerçek Zamanlı Sistemler
3. Karar Destek Sistemleri
4. Bilgi Tabanlı (Knowledge-based) Sistemler
5. Veritabanı Yönetim Sistemleri
6. Kişisel Bilgisayarlar
7. Ofis Otomasyonu
8. Atölye Otomasyonu
9. İletişim Sistemleri
10. Endüstriyel Sistemler
11. Kontrol Sistemleri
5
Çevrimiçi Sistemler
Çevrimiçi (on-line) sistemler dışarıdan aldıkları bilgileri işler
ve sonuçları gereken yerlere verirler.
Etkileşimde bulunan kullanıcı bilgisayara uzaktan erişir.
Bunun için genellikle bir uçbirim kullanır.
Bankaların ATM (Automatic Teller Machine) makinaları
çevrimiçi sistemlere en güzel örnektir.
İletişim Hatları
Merkezi Bilgisayar
Yerel Uçbirimler Uzak Uçbirimler 6
Gerçek Zamanlı (Real-time) Sistemler
Dış dünya ile etkileşim sağlayan, olayları izleyip anında
çözümleyen, karşılığında bir kontrol işlemi yapan ve bu
işlemleri zaman kısıtlarına (Milisaniyeler veya mikrosaniyeler
bazında) bağlı olarak gerçekleştiren sistemler «gerçek
zamanlı» olarak adlandırılır.
Örneğin,
o Bir takip radarı ve bir uçaksavardan oluşan askeri bir savunma
sistemi,
o Bir nükleer reaktörün çekirdeğindeki ısı algılayıcıları ve işlem kontrol
düzeneklerini kontrol eden sistem,
o Bir savaş uçağını havada tutup özel manevralar yaptıran uçuş kontrol
sistemi.
7
Tepki sürelerine göre gerçek zamanlı sistemler 3’e ayrılır:
o Gevşek gerçek zamanlı (Soft real-time) sistemler:
• Belirli bir işi belirli bir zaman kısıtı içinde tamamlayamazsa tüm sistem çökmez,
yalnızca başarımı düşer.
• Tepki süreleri genellikle 1 saniyenin altındadır. Ör., trafik kontrol sistemleri,
karar destek sistemleri, benzetim (simülasyon) sistemleri.
o Katı gerçek zamanlı (Hard real-time) sistemler:
• Ne olursa olsun verilen zaman kısıtı içinde verilen iş gerçekleştirilmelidir.
• Başarılamaması durumunda sistemin çökmesi ve hayati tehlikelerin doğma
olasılığı mevcuttur.
• Tepki süreleri birkaç mikrosaniye ile birkaç milisaniye arasındadır. Ör., Nükleer
santral kontrol sistemleri, savaş uçakları ve güdümlü mermi uçuş sistemleri,
hastanelerdeki yaşam destek üniteleri. Çoğunlukla özel donanım gerektirirler
ve oldukça yüksek maliyetlidirler.
o Sıkı gerçek zamanlı (Firm real-time) sistemler:
• Arada bir yerde durup küçük bir olasılıkla zaman kısıtının aşılmasının kabul
edilebileceği, kontrol altında tutulabilen sistemlerdir.
• Tepki süreleri birkaç milisaniyedir. Ör., Hassas deniz ve hava trafik kontrol
sistemleri, endüstriyel üretim ve makine kontrol sistemleri. 8
Karar Destek (Decision support) Sistemleri
Bilgisayarlar kendi başlarına karar almazlar ancak insanlara
durum farkındalığı yaratıp gerekli hesaplamaları yaparak
karar almalarında yardımcı olurlar. Ör., çalışma tabloları,
istatistik çözümleme sistemleri.
Karar destek sistemlerinin ortak özellikleri arasında veri
toplama, işleme ve sergileme yanında, bunlar üzerinde
matematiksel ve istatistiksel algoritmalar çalıştırarak çeşitli
sonuçlar elde etmek vardır.
Sonuçları uygulama alanına özgü bir şekilde sergilemek de
yetenekleri arasındadır.
9
Bilgi Tabanlı (Knowledge-based) Sistemler (Uzman Sistemler)
Bilgi tabanlı sistemler çok miktarda bilgiyi kullanarak belirli
bir görevi yerine getirirler.
Bu sistemlere bazen uzman (expert systems) sistemler adı
da verilir.
Uzman sistemler belirli bir uzmanlık alanında çalışan
insanlara yardımcılık yapabilecek kadar yüksek düzeyde bilgi
sağlarlar.
Varılan karara nasıl ulaştıklarını, neden belirli bir yolu seçip
diğerlerini reddettiklerini belirtirler.
Belirsiz veya eksik bilgilerle dahi belirli bir düzeye kadar
çalışabilip, kullanıcılara destek sağlarlar.
10
Uzman sistemler üç modül halinde geliştirilirler:
o Uygulama alanına özgü bilgiler ve temel kurallar bir bilgi tabanı
(knowledge-base) içinde toplanırlar.
o Çıkarsama makinesi (inference engine) bu bilgi tabanının etkin bir
şekilde kullanılabilmesini sağlar.
o Kullanıcı arayüzü ise sistem ile kullanıcı arasındaki etkileşimi sağlar.
Problem
Çıkarım Kullanıcı
Kullanıcı
Makinesi Arayüzü
Çözüm
12
Veritabanı yönetim sisteminin kullanım amaçları:
o Her kullanım amacı için ayrı veriler tutmak yerine, verileri
bir arada ve ortak yapıda toplayarak fazla kopyaların
kullanımı sonucu oluşabilecek sorunları ortadan
kaldırmak.
o Paylaşılır verilerin güncelleştirilmesi sırasında
doğabilecek tutarsızlığın önüne geçmek.
o Kullanıcı özelliğine göre farklı arayüzler sağlamak.
o Birden çok kullanıcıya aynı anda hizmet vermek.
o Menü tabanlı veya doğal dil arayüzleri ile pratik kullanım
sağlamak.
13
o Çok karmaşık ilişkilere sahip verilerin uygun şekilde
depolanmasını ve erişilmesini sağlamak.
o Veri tanımlamaları için standart ve tutarlı yapılar, sergileme
ve raporlama yöntemleri belirlemek.
o Ekonomik bir şekilde genişleyebilme özelliği sağlamak.
o Uygulama geliştirmede zaman tasarrufu sağlamak.
o Verilerin sürekli güncellenebilmesini sağlayarak tüm
kullanıcıların istedikleri anda güncel verilere erişebilmesini
sağlamak.
o Saklanan verileri yedekleyerek koruma altına alabilmek.
14
Kişisel Bilgisayarlar
Kişisel bilgisayarlar (PC) daha çok bireysel kullanım
amaçlarına hizmet eden paket programlar çalıştırırlar.
Kişisel masaüstü yayıncılık, internet erişimi, kişisel kayıtların
tutulması, eğlence gibi birçok kullanım amaçları mevcuttur.
Kendi başlarına bir sistem olarak değerlendirmek pek doğru
değildir; ancak özel amaçlı yazılımlarla belirli amaçlar için
kullanılmaları durumunda özel sistemler oluşturmaktadırlar.
15
Ofis Otomasyon Sistemleri
Ofis otomasyonu, personel haberleşmesi, veri paylaşımı,
masaüstü yayıncılık, planlama gibi amaçlar için oluşturulan
ve genellikle bir ağ ile bağlanmış birden fazla bilgisayardan
oluşan sistemlerdir.
16
Atölye Otomasyon Sistemleri
Üretim maliyetini azaltma, niteliği arttırma, değişik pazar
koşullarına uyum sağlama gerekliliği üretim sektöründe
otomasyonun önemini arttırmıştır.
Atölye kontrol sistemleri en genel anlamda iş planlaması,
ilerleme görüntülenmesi, durum raporlanması ve düzeltici
etkinlikleri kapsar.
Atölye denetimi; kullanıcıya gerçek zamanlı işlem denetimi
için gereken sistem durum raporunu hazırlar.
17
İletişim Sistemleri
Çoğunlukla «telekom» olarak adlandırılan iletişim
teknolojisinde önceleri sadece donanım önemli iken
günümüzde donanım kadar yazılım da önem kazanmıştır.
Gerek veri, gerekse ses ve görüntü aktarımında artık yazılım
da gerekmektedir. Örneğin günümüzde bir telefon santralinde
fiziksel kablolar yerine sanal bağlantı elemanları
kullanılmaktadır.
Ses ve görüntü gerçek zamanlı olarak sayısal hale
getirilmekte, sıkıştırılarak uzak mesafelere çeşitli ortamlar
üzerinde taşınmakta ve sonra tekrar çözülerek hizmete
sunulmaktadır. Bu işlemler için de bilgisayar ve modemlerden
yararlanılmaktadır.
18
Endüstriyel Sistemler
Pek çok endüstriyel sistem çeşitli kurallara göre bilgi işleyen
ve sonuçlarını çeşitli makinelere uygulayan sistemlerdir.
Bilgisayar Destekli Üretim bu sistemler arasında önemli bir
yer tutar.
Bu sistemlerin girdileri, bilgisayar ortamına hazırlanmış
model dosyalarıdır. Bu dosyalardaki verilere göre makine
parçalarına uygun komutlar gönderilerek ham malzemenin
işlenmesi ve ondan mekanik parça üretilmesi sağlanır.
19
Kontrol Sistemleri
Kontrol sistemleri, çeşitli altsistemleri bir mantık ile birleştiren
ve bir merkezden idare edilmesini sağlayan otomasyon
sistemleridir.
Sistemin ilgi alanındaki çevresinden çeşitli algılayıcılarla
toplanan veriler değerlendirilir, kullanan işletmenlere sistem
durumu hakkında işlenmiş verilere dayanan bilgiler verir,
gerektiğinde algılayıcıları, uygulayıcıları ve diğer altsistemleri
kontrol eder.
Kontrol sistemlerinin çeşitleri:
o Askeri sistemler
o Trafik kontrol sistemleri
o Robotik
20
o Gömülü sistemler
Bir bilgisayarlı sistemi oluşturan ana bileşenler, en genel
şekliyle, donanım, altyapı yazılımı ve uygulama yazılımıdır.
İşletim Sistemi
Bilgisayar Donanımı
Donanım
(İşlemci, bellek, ağ ve arayüz donanımları)
21
Sistem Mimarisi
1. Donanım
Bilgisayar tabanlı bir sistem donanım adı verilen çeşitli
elektronik birimlerden oluşur. Günümüzde çoğu donanım
birimi piyasadan temin edilebilmektedir.
Hazır ticari ürün Commercial-Off-The-Shelf (COTS)
22
Yazıcı Çizici
Sunucu
Kontrol Uç
Birimleri
Ağ Birimi
Altsistem
Arayüz
Birimleri
Kullanıcı Arayüz
Birimleri
Altsistemler
23
2. Altyapı Yazılımı
Bilgisayarı çalıştırmak için gereken işletim sisteminden
başlamak üzere uygulama yazılımlarına arayüz hizmeti
veren her türlü yazılıma altyapı (sistem) yazılımı adı verilir.
Bu yazılımların ortak özellikleri arasında bilgisayar
donanımına erişmeleri, çok sayıda kullanıcıya tutarlı bir
şekilde hizmet vermeleri ve bilgisayar özkaynaklarını en
uygun şekilde kullanarak iş sıralaması yapabilmeleri
sayılabilir.
Altyapı yazılımları üç bölümde incelenebilir:
o İşletim sistemi
o Ara Katman Yazılımı
o Yardımcı yazılımlar
24
2.1 İşletim Sistemi;
Bilgisayar donanımını kullanılır hale getirmek üzere merkezi
işlem birimi tarafından sürekli olarak koşturulan çekirdek
(kernel) yazılım grubudur.
İşletim sistemi uygulama alanının gereklerine ve yazılım
gereksinimlerine uygun olmalıdır. Örneğin gömülü sistemler
için grafiksel arayüzü olan bir işletim sistemi gereksizdir.
Gerçek zamanlı sistemlerin gereksinimlerini karşılayabilmek
için yine gerçek zamanlı işletim sistemleri kullanılmalıdır.
Yazılım gereksinimleri yanında kullanılan donanımın
özellikleri, yani bilgisayar ve veri yolu mimarisi de kullanılacak
işletim sistemini etkiler.
25
2.2 Ara Katman Yazılımı:
Donanım, ağ yapısı ya da işletim sistemi gibi yazılım yapısının
alt katmanlarında gerçekleşen hızlı teknolojik gelişmeler
nedeniyle değişim gereksinimi ortaya çıkmaktadır. Uygulama
yazılımları katmanında ise bu gereksinim daha az olduğu için
buraya yapılan yatırım korunmalıdır.
Bunu sağlamanın yolu da değişim hızları farklı olan bu iki
katmanı birbirinden bir ara katman (middleware) kullanarak
ayırmaktır.
Alt katmanlarda gerçekleşen değişiklikler sadece ara
katmanın ilgili bölümlerinin değiştirilmesi ile uygulama
yazılımlarından saklanır.
26
Ara katman, standart bir arayüz ve geliştirme mantığı vererek
uygulama geliştiriciye alt düzeyde yaşanabilecek iletişim ve
eşzamanlılık sorunlarıyla ilgilenmeden dağıtık ve paralel
programlama olanağı sağlar.
Ara katman yazılımı uygulama yazılımlarının hataya dayanıklı
olabilmeleri için gerekli programlama, iletişim, durum
izlemesi, geri kazanma (recovery), kritik veri saklama ve geri
alma gibi yapısal özellikleri desteklemelidir.
27
2.3 Yardımcı Yazılımlar:
Eğer altyapı yazılımları belirli bir uygulama alanına hizmet
etmek üzere kullanılacaksa, bu alanın gereksinimleri göz
önüne alınarak daha yüksek düzeyde bir ara katman yazılımı
oluşturulabilir.
Ara katman yazılımlarını her sistem için ayrı ayrı geliştirmek
yerine gereksinimlerin ortak yönlerini aynı ara katmanda
toplamak, bunları yardımcı yazılımlarla desteklemek, sonra da
aynı alandaki farklı sistemlere uygulamak çok etkin bir
yöntemdir.
Yardımcı yazılımlara bir örnek, grafiksel kullanıcı arayüzü
geliştirmede kullanılacak yüksek düzey tasarım ve geliştirme
araçları ve kütüphaneleridir.
28
3. Uygulama Yazılımları
Tamamen sistemin kullanılacağa alana özgü tanımlanmış
işlevleri yerine getirecek yazılım birimlerini içeren bileşene
uygulama yazılımı (application software) adı verilmektedir.
Asıl yazılım geliştirme süreci bu bileşen için geçerlidir; çünkü
donanım geliştirmesi donanım uzmanları tarafından
yapılırken, yazılım uzmanları da uygun modellere göre önce
altyapı yazılımını sonra da uygulama yazılımlarını geliştirirler.
Uygulama yazılımlarını tam olarak gruplandırmak, günümüzde
her türlü alanda yazılım geliştirildiği için oldukça güçtür.
29
Ancak kullanım alanlarına göre yazılımları gruplandırabiliriz:
o Özel Sistem Yazılımları
o Kişisel Bilgisayar Yazılımları
o İş Dünyası Yazılımları
o Mühendislik Yazılımları
o Bilimsel Yazılımlar
o Yapay Zeka Yazılımları
o Veritabanı Yönetim Sistemi Yazılımları
o İnternet Yazılımları
o Ar-Ge Yazılımları
30
En klasik bilgi işleme yöntemi tek bir bilgisayar işlemcisi
üzerinde bir tek programa ilişkin ifadelerin ardışık olarak
yürütülmesi esasına dayanır.
Günümüzdeki pek çok işletim sistemi ise artık birden fazla
programı beraberce çalıştırabilmektedir. Aynı bilgisayarda
birden fazla işlemci kullanılarak gerçek anlamda eşzamanlı
çalışma olanağı da sağlanmaktadır.
31
Bir bilgisayar programında bilgi işleme yapabilen elemanlar
birer çalıştırma bağı, diğer adıyla iş parçacığı (execution
thread) ya da görev yürütürler.
Bu görevlerin aynı işlemci üzerinde yürütülmesi ile paralellik ya
da koşutzamanlılık (concurrency), farklı bilgisayarlar üzerinde
yürütülmeleri ile de dağıtılmışlık (distribution) sağlanır.
Uçbirimlerin birer operatör değil de ana sistemin etkileşimde
bulunduğu birer altsistem olmaları durumunda, merkezi
(central) ve dağıtık (distributed) olmak üzere iki farklı bilgi
işleme tipi ortaya çıkmıştır.
32
Merkezi Bilgi İşleme
Bir tek bilgisayar tarafından her türlü hizmetin verilmesine dayanır.
Hizmetler birer işletmen tarafından alınabileceği gibi birer altsistem tarafından da
alınabilir.
Bu durumda ana bilgisayar zaman paylaşımlı olarak tüm istemcilere yanıt verir. Ana
bilgisayarda bulunan işlem birimlerinin sayısına göre tek işlemcili ve çok işlemcili
sistemler olarak ikiye ayrılır.
Süreçler Süreçler
Anakart
İşlemciler
Giriş-Çıkış
Kartları
33
Tek İşlemcili Sistem Çok İşlemcili Sistem
Dağıtık Bilgi İşleme
Bazı yazılımlar üzerlerinde çalıştıkları bilgisayarların işlem
güçlerinden daha fazla yararlanabilmek için koşut zamanlı
(concurrent) olarak çalışmak üzere tasarlanmıştır.
Dağıtık çalışmada temel ilke; problemi çok sayıda küçük
parçalara bölerek her birini farklı bilgisayar düğümlerinde
paralel olarak çalıştırarak daha çabuk sonuç almaktır.
Dağıtık bilgisayarlar bir yerel alan şebekesi üzerinde
çalışıyorlarsa gevşek bağlı (loosely-coupled), aynı donanımı
paylaşan işlemciler şeklinde ise sıkı bağlı (tightly-coupled)
olarak adlandırılırlar. Her iki durumda da iş yapan süreçler
ve veriler işlemciler arasında paylaştırılırlar.
34
Paralel Bilgi İşleme
Günümüzün ve geleceğin bilgisayar otomasyonu beklentileri
çok sayıda görevin paralel olarak yürütülmesini
gerektirmektedir. Bazı özel durumlar hariç bilgisayar
yazılımları paralel bilgi işlemeyi destekler. Bunun için
mikroişlemci üzerinde, işletim sistemi yanında, birden fazla
yazılım birimi yani süreç (process) yürütülür.
Tek bir mikroişlemcinin gerçek anlamda paralel çalışması
mümkün değildir ancak bazı süreçler giriş/çıkış için beklerken
diğer hazır olan süreçlerin işlemciyi kullanması yoluyla bir tür
paralel çalışma elde edilebilir.
En iyi paralel çalışma birden fazla işlemci veya bilgisayar
üzerinde farklı süreçlerin aynı anda yürütülmesi ile elde edilir.
35
Bilgisayar ilk çıktığı zamanlarda yazılım ancak tek bir işlemci
üzerinde çalışmaktaydı.
Daha sonra ana çatı (mainframe) bilgisayarları çok sayıda
kişiye aynı anda hizmet verebilmeye başladı. Bu
bilgisayarlarda birden fazla yazılım tek bir ana bilgisayarda
zaman paylaşımlı olarak koşmakta ve kullanıcılara
koşutzamanlı çalışma olanağı sağlamaktaydı.
Bundan sonra paylaşılır diskler ve dizinlerden oluşan
mimariler kullanıldı. Bu mimarilerde yazılımlar kullanıcıların
kendi bilgisayarlarında çalışmakta ve bir ağ üzerinden ortak
olarak eriştikleri dosyaları (kütükleri) paylaşmaktaydı.
36
Günümüzde daha esnek ve yüksek başarım sağlayan çeşitli
mimariler kullanılmaktadır. Bunlar:
o Genel Yazılım Mimarisi
o İstemci – Sunucu (client-server) Mimarileri
• İki Katmanlı Mimari
• Üç Katmanlı Mimari
o Dağıtık Mimariler
o Yazılım Birimleri
• Kullanıcı Arayüz Yazılım Birimleri
• Bilgi İşleme Yazılım Birimleri
• Altsistem Arayüz Yazılım Birimleridir.
37
Genel Yazılım Mimarisi
Uygulama yazılımlarının düzeyi dikkate alınarak sistem yazılım
mimarisi üçe ayrılabilir.
Uygulama Yazılımı
39
Basit Mimari
Bilgisayar üzerinde belirli süreçlerin eşgüdüm içinde
yürütülmesi, sistem özkaynaklarının iyi denetlenmesi ve
çeşitli giriş/çıkış işlemleri isteniyorsa amaca uygun bir
işletim sistemi seçilir ve uygulama yazılımı bu işletim sistemi
üzerinde çalıştırılır.
Karmaşık Mimari
Uygulama yazılımını çeşitli geliştirme ve bakım kolaylıkları
nedeniyle bir ara katman yazılımı ile alttaki işletim sistemi
ve donanımdan ayırmak, geliştirme ve işletim bakımından
çok yararlı olmaktadır.
40
İstemci – Sunucu (Client-Server) Mimarileri
Ağ üzerinde haberleşen bilgisayarlardan oluşan dağıtık bilgi işleme
ortamlarının yaygınlaşmasıyla istemci-sunucu mimarileri de yaygın
hale gelmiştir. İstemci-sunucu mimarisi yazılıma özgü olduğu için
ister merkezi, ister dağıtık ortamda olsun donanımdan bağımsız
olarak kolaylıkla uygulanabilir.
İstemci ve sunucu arasındaki veri iletişimi ve denetim genellikle iki
parçalı olarak geliştirilen ayrık yazılım bileşenleri ile sağlanır.
İstemci
Sunucu istek
İstemci
İstemci
Veritabanı 41
İstemci-Sunucu mimarilerinin üç temel yazılım bileşeni bulunur:
İstemci:
Belirli bir isteği istemciden alıp sunucuya gönderen, sonra da
yanıtı alıp tekrar istemciye veren bileşendir.
Genel olarak ayrı bir bilgisayar ya da uçbirim iş istasyonu
üzerinde çalışır.
İstemci, bir insan olabileceği gibi başka bir yazılım da olabilir.
İstemci, kullanıcıdan gelen isteği oluşturan verilerin
doğrulanması, sonra da bu isteğin belirli iletiler halinde
sunucuya gönderilmesini sağlar.
42
Sunucu:
Bir ya da daha fazla istemci tarafından gönderilen istekleri
yerine getirerek sonuçlarını geri gönderen yazılım
bileşenidir.
Sunucu yazılımı genelde iş yapmadan istemciden istek
gelmesini bekler, gelen isteğe yanıt verir ve tekrar
beklemeye başlar.
Sunucular görevlerine göre birkaç çeşit olabilir:
o Dosya sunucuları
o Ağ sunucuları
o Veritabanı sunucuları
o Web sunucuları
o Servis sunucuları
43
İşlem Yönetimi:
Bir kısım sunucular ara-işlemler (transaction) ile
kullanıcıların isteklerini karşılarlar.
Ara-işlemlerin en büyük yararı işlemin tamamının güven
içinde başlanıp bitirilmesidir.
Hem istemci hem sunucu tarafında özel işlevleri olan ara-
işlem yöneticileri kullanılır.
İstemciden bu yöneticiye gelen istekler işlemin kesilmeden
tamamlanması için gerekli önlemler alınarak sunucuya
gönderilir ve yanıt alındıktan sonra istemciye iletilir.
İşlem yönetimi her uygulama için değişik olduğu için
uygulama mantığı adını alır.
44
İki Katmanlı (two-tier) Mimari
İki katmanlı mimaride (two-tier) istemci sunucu mimarisinde bulunan üç
yazılım bileşeni iki katman üzerinde çalışır.
Kullanıcı arayüzü ile ara-işlem yönetiminin bir kısmı birinci katmanda, yani
istemci bilgisayar üstünde, veritabanı yönetim sistemi ile ara-işlem
yönetiminin diğer kısmı da ikinci katmanda, yani sunucu bilgisayar
üzerinde bulunur.
Bu mimaride işletim mantığı sunucu üzerinde olduğundan başka
sunucularla birlikte çalışırlık özelliği biraz düşüktür.
İstemci ile sunucu arasında oluşan iletişim trafiği yüksek sayıda istemciyi
desteklemez. Yapılan her değişikliğin tüm kullanıcılara uygulanması gerekli
olduğundan bakımı kolay değildir.
İstemci İstemci İstemci İstemci İstemci
49
Yazılım Birimi Türleri
Orta ve büyük ölçekteki uygulama yazılımlarını, çeşitli yazılım
birimi türlerinin yardımıyla oluşturmak mümkündür.
Kullanıcı Arayüz Yazılım Birimleri
51
Bilgi İşleme Yazılım Birimleri:
Sistemler bilgi işleme amacıyla geliştirilirler.
İşlenecek bilgi dış dünyadan çeşitli şekillerde alınır, sistem
içinde çeşitli akışlardan geçer, gerekirse geçici veya kalıcı
olarak depolanır, üzerinde algoritmalar çalıştırılarak başka
bilgilere dönüştürülür ve çıktı olarak yine dış dünyaya verilir.
Bilgi işleme, sistemde en az bir kopyası sürekli çalışan bir ya
da daha fazla yazılım birimi tarafından gerçekleştirilir.
Bilgi işleme yazılım birimleri, sabit disk, yardımcı bellek veya
saklama birimleri gibi sistem donanımları ile iletişim halinde
olabilirler.
Bu birimler, yüksek işlemci gücüne sahip bilgisayarlar
üzerinde koşmalıdırlar.
52
Altsistem Arayüz Yazılım Birimleri:
Altsistemlerin bilgisayarla iletişimini sağlamak için üreticisinin
sağladığı donanım ve veri arayüzünün bilinmesi, ona uygun iletişim
protokolü dikkate alınarak yazılım geliştirilmesi gerekmektedir.
Sistem geliştiricisi ile altsistemin üreticisi arasında bu tür bilgileri
içeren teknik anlaşmaya uygun arayüz yazılımı geliştirilir.
Bu birimler, gerek bilgi işleme yazılım birimlerinden gerekse kullanıcı
arayüzü yazılım birimlerinden aldıkları verileri biçim dönüşümü
yaparak altsisteme aktarırlar; altsistemden gelen verileri de gerekli
dönüşümden geçirerek uygun bir şekilde ana sisteme aktarırlar, yani
altsistemi tümleştirirler (integration).
Altsistem arayüz yazılım birimleri her altsistem için ayrı bir bilgisayar
üzerinde koşabileceği gibi bir bilgisayar üzerinde bir yada daha fazla
altsistemin tümleştirilmesi mümkündür. 53
● Temel varsayımlar
– İyi bir yazılım istiyorsak süreci iyi yönetmeliyiz
– İyi bir süreç yönetimi riskleri azaltır
● Risk yönetimi
– Bir yazılım projesinde neler yanlış gidebilir?
– Risk nasıl azaltılabilir?
2
●
Bir yazılım süreci, bir yazılım ürünü ortaya çıkarmak için
yapılması gereken, birbiri ile ilişkili işlemler bütünüdür.
●
Yazılım süreçleri farklılıklar gösterebilir ancak temel olarak dört
işi içermelidir:
– Yazılımı tanımlama (software specification) - Yazılımın ne
yapacağı, kısıtları tanımlanmalıdır.
– Yazılım tasarımı ve gerçekleştirim (software design and
implementation) – Yazılım, tanımına uygun olarak üretilmelidir.
– Yazılımın doğrulanması (software validation) – Yazılımın müşterinin
isteklerini karşılayabildiği doğrulanmalıdır.
– Yazılımın evrimi (software evolution) – Yazılım müşterinin değişen
ihtiyaçlarına cevap verecek şekilde değiştirilebilmelidir.
3
●
Süreci sadece veri modeli belirleme, kullanıcı
arayüzü tasarımı gibi aktiviteler içermez
●
Süreç şunları da içerebilir:
– Ürünler
– Roller
– Ön ve son koşullar
4
Uygunluk
analizi ve
planlama Gereksinimler
Tasarım
5
Kaos (Herhangi bir modelin uygulanmadığı o dönem)
Şelale (WaterFall) yazılım geliştirme modeli
Artırımsal (Incremental) ve tekrar işlemeli (Iteratif) yazılım
geliştirme modeli
Yalın yazılım geliştirme modeli
Re-use (tekrar kullanımlı) yazılım geliştirme modeli
Prototip yazılım geliştirme modeli
Test güdümlü yazılım geliştirme modeli
Temiz oda yazılım geliştirme modeli
Yazılım kalite unsurları
Kaos (Herhangi Bir Modelin Uygulanmadığı Dönem)
Herhangi bir metot veya model uygulanmayan zamanlardır. Kovboy
kodlaması da denilir.
Aşağıda herhangi bir modelin uygulanmadığı sorunlu bir proje örneği
verdik:
o Projede tutarlı dokümanlar hazırlanmamaktadır.
o Önce tüm yazılım kodlanır sonra hatalar düzeltilmeye çalışılır. Sistem
giderek bir canavara benzer.
o Bakım maliyetleri her geçen gün artar, yeni yazılımcılar sisteme
dokunmaya korkarlar.
o Kod taşınabilir değildir.
o Başarı bireylere bağlıdır, bireyler ayrılınca başarı dramatik biçimde düşer.
o Donanım seçimi iyi yapılmamıştır ve donanım ile yazılım iyi uyuşmamıştır,
donanım genelde büyüyen yazılıma dar gelir.
o Yanlış seçilen algoritmalar vardır ve geri dönülememektedir.
Kaos (Herhangi Bir Modelin Uygulanmadığı Dönem) (devam)
o Yazılımda birkaç dil birden kullanılmıştır ve makine dili ile üretilen kod
bölgelerini kimse anlamamaktadır.
o Yazılım kurnaz yazılım numaraları ile doludur ve kısa bir alanı anlamak
saatleri ve hatta günleri almaktadır.
o Yazılım hala devam etmekteyse ne zaman biteceğini hiç kimse
bilmemektedir ve projeye sürekli adam alınmaktadır veya adamlar
ayrılmaktadır. Bu yüksek adam değişim oranı yüzünden projeye hakim
pek fazla adam kalmamıştır.
o Donanımcılar yazılımcıları ve yazılımcılar donanımcıları suçlamaktadırlar.
o Sistemin bir bölümü çalışmakta bir bölümü çalışmamaktadır. Önemli
bölümleri çalışmadığı halde ekip çok önemsiz ama müşterinin istediği
bir bölümde zaman kaybetmektedir.
o Projenin iptali bile gündemdedir.
Şelale (WaterFall) Yazılım Geliştirme Modeli
o Şelale yazılım geliştirme modeli en klasik yazılım geliştirme modelidir.
o Bu modelde yazılım geliştirme işlemi kesin safhalara ayrılmıştır. Bu
safhalar kabaca aşağıdaki gibidir:
• Gereksinimlerin toplanması aşaması,
• Tasarım aşaması,
• Gerçekleştirme aşaması,
• Doğrulama aşaması,
• Bakım aşaması
o Genellikle yukarıdaki safhalar için önceden tahmini süreler belirlenir ve bu
sürelere sıkıca uyulmaya çalışılır.
o Şelale geliştirme modelinin en önemli özelliği safhaların ardarda
uygulanması ve bir safha bitmeden bir sonraki safhaya geçilmemesidir.
o Şu an gerçekleştirilen safhadan önceki safhalara da bu safhalar
tamamlanmış kabul edildiğinden normal koşullarda pek geri dönülmez.
o Her aşamada yoğun olarak dokümantasyon yazılır ve hatta bu
dokümantasyonlar safha geçişlerini belirler.
Şelale (WaterFall) Yazılım Geliştirme Modeli (devam)
Şelale geliştirme modelinin aşamalarını biraz daha detaylı inceleyelim:
o Gereksinimlerin toplanması aşaması: Bu aşamada problem tanımlanır veya
kullanıcı isteği analiz edilir ve ilgili gereksinimler doküman olarak oluşturulur. Bu
aşamada müşteri veya kullanıcı ile işbirliği yapılır ve bir sözleşme mahiyetindeki
gereksinim ortaya çıkarılır. Bu gereksinim dokümanı diğer safhalar için bir ana
kurallar dizisi olarak oluşur ve bütün aşamalarda içindeki gereksinim maddelerine
aykırı bir şey olmadığı, çalışmaların bu gereksinimleri sağladığı teyit edilir.
o Tasarım aşaması: Bu aşamada detaylı bir tasarım yapılır. Tasarımın her biriminin
gereksinimlere uygunluğu kontrol edilir. Genelde herhangi bir kod yazılmaz. İleriki
aşamalarda bu tasarıma sıkıca uyulur.
o Gerçekleştirme aşaması: Kodlama bu aşamada yapılır. Yazılan kodların birim testleri
de bu aşamada yapılır. Yine her aşamada olduğu gibi gereksinimlerin sağlandığı
kontrol edilir.
o Doğrulama aşaması: Bu aşamada detaylı test dokümanları yazılır ve bu
dokümanlara göre testler yapılır. Her testin hangi gereksinimin gerçekleştiğini test
ettiği izleme matrisi denilen tablolar ile test dokümanlarında bulunur. Modüller birbiri
ile entegre edilir, karakutu ve saha testleri yapılır.
o Bakım aşaması: Bu aşamada sistem kullanıcının emrine verilmiştir ve bu sırada
oluşacak olan problemler giderilir.
Şelale (WaterFall) Yazılım Geliştirme Modeli (devam)
Gereksinim
Toplanması
Tasarım
Gerçekleme
Doğrulama
(Test)
Bakım
Şelale (WaterFall) Yazılım Geliştirme Modeli (devam)
Şelale Yönteminin Avantaj ve Dezavantajları
o Şelale yöntemi yazılım geliştirmede düzenliliği teşvik eden bir modeldir ve eskiden
yazılım projelerinin kabusu olan kaos ortamının giderilmesinde büyük rol oynamıştır.
o Özellikle ciddi ve büyük projelerde düzen, dokümantasyon, detaylı tasarım yönlerinden
kendini kanıtlamış bir modeldir.
o Ancak sonraları modelin sorunları ve dezavantajları olduğu keşfedilmiş ve yeni model
arayışlarına gidilmiştir.
o Bu dezavantajlara değinecek olursak:
• Bir safha tamamlanmadan diğer safhaya geçilemediğinden bir safhada problem
oluştuğu ve o safha uzadığı zaman projelerin süresinin çok uzayabildiği görülür.
Özellikle gereksinimlerin toplanması veya hazırlık safhasında bir hayli zaman
kaybedilebilir.
• Safhalarda daha önce yapılmış safhalarla geçiş kuralları (örneğin eksik kalan işler
için geri dönmek gerekebilir) olmadığı için ya hiç geri bakılmaz ve önceki hatalar
düzeltilemez ya da geriye dönülür ve birçok iş zincirleme olarak büyük emeklerle
düzeltilir. Örneğin müşteri gereksinimi değiştiği zaman geri dönülmesi demek bu
tüm döngünün yeniden geçilmesi demektir.
• Oluşan hatalar tüm döngü boyunca her safhada tekrarlanacağı için özellikle
gereksinimlerde oluşan hatanın sisteme maliyeti çok yüksek olur.
• Tüm gereksinimlerin bir anda toplanması pratik değildir, ya bir şeyler eksik kalır ya
da belirsiz eksik gereksinimler ile sistemin güvenilirliği azalır.
• Müşteri geribeslemesi sadece proje başında yoğun olduğu için nihai ürünün
müşterinin isteğini karşılamaması riski büyüktür.
Artırımsal (Incremental) ve Tekrar İşlemeli (Iteratif) Yazılım
Geliştirme Modeli
Artırımsal (Incremental) ve Tekrar İşlemeli (Iteratif) Yazılım
Geliştirme Modeli
Artırımsal (Incremental) ve Tekrar İşlemeli (Iteratif) Yazılım
Geliştirme Modeli
o Uzun ve kuralcı üretim safhaları olan Şelale (Waterfall) yönteminin
dezavantajları görülünce buna alternatif arayışları ortaya çıktı.
o Bu yüzden artırımsal ve tekrar işlemeli yazılım geliştirme yöntem grubu
ve bir takım alt sınıfları belirdi.
o Öncelikle geriye bir bakacak olursak Şelale yönteminin ana sıkıntısı
şudur:
• Şelale modelinde planlama, gerçekleştirim ve test safhaları sadece bir kez
yapılır ve bu süre çok uzundur, sonuçta herhangi bir sorun çıktığında geri
dönüp bunu telafi etmek mümkün olmaz veya maliyeti çok fazla olur.
• Şelale yöntemi en başta tahmin ve planlamaya dayalıdır, bu yüzden proje
başladıktan sonra değişiklik kararları almak çok zordur.
Artırımsal (Incremental) ve Tekrar İşlemeli (Iteratif) Yazılım
Geliştirme Modeli (devam)
o Bu sorunu aşabilmek için temel olarak iki öneri yapılabilir:
• Safhaları kısa tutarak bir kaç kez tekrar etmek ve her döngüde yeni
özellikler eklemek (Artırımsal (Incremental) yazdım geliştirme)
• Proje planlarmı esnek, değiştirilebilir hazırlayıp proje esnasırtda
sürekli iyileştirmelere imkân tanımak (Tekrar İşlemeli (Iteratif)
yazdım geliştirme)
o Artırımsal ve Tekrar İşlemeli Yazılım Geliştirme Modelinin birçok değişik
yorumu ve uygulama örneği ya da diğer bir değişle alt modelleri
çıkmıştır.
o Bu alt modellerin her biri ana olarak bu iki kurala (yani Artırımsal
Geliştirme ve Tekrar İşlemeli Geliştirme kurallarına) uymakla beraber
kendi kurallarını ve çözüm önerilerini de getirmişlerdir. İlerleyen
kısımlarda bu alt modelleri inceleyeceğiz.
"Acaba ne zaman artırımsal geliştirme yöntemini kullanmalı? Artırımsal
geliştirme modelini sadece başarılı olmak istediğiniz projelerde
kullanmalısınız."
Martin Fowler – Extreme Programing'in Yaratıcısı
Spiral Yazılım Geliştirme Modeli
o Şelale modeline en yakın fakat artırımsal olan yazılım geliştirme modeli
Spiral yazılım geliştirme modelidir.
o Spiral yazılım geliştirme modeli “prototip yazılım geliştirme modeli” ile
“şelale yazılım geliştirme modeli’nin her ikisinin de özelliklerini taşır.
o Şelale modelinden en önemli farkı bir tek döngü yerine birçok döngüden
oluşmasıdır.
o Spiral model ilk olarak Barry Boehm tarafından 1988’de önerilmiştir.
Spiral Yazılım Geliştirme Modeli (devam)
o Spiral yazılım geliştirme modelindeki adımlar aşağıdaki gibi sıralanabilirler:
1. Yeni üretilecek sistemin gereksinimleri mümkün olan en detaylı biçimde planlanır. Bu
genellikle dış ve iç müşterilerin temsilcileri ve halihazırda bir sistem varsa onu inceleyerek
yapılır.
2. Yeni üretilecek sistem için bir ön tasarım hazırlanır.
3. Ön tasarımdan faydalanılarak yeni sistem için ilk prototip hazırlanır. Bu genellikle daha az
yetenekli ve nihai ürünün özelliklerini sadece kabaca taşıyan bir sistemdir.
4. Daha sonra ikinci bir prototipin yapılması için şu işlemler yapılır:
a. İlk prototip kuvvetli ve zayıf yönlerine göre, risklerine göre, incelenir
b. İkinci prototip için gereksinimler belirlenir,
c. İkinci prototip planlanır ve tasarlanır,
d. İkinci prototip üretilir.
5. Bu aşamada artık risk faktörleri rahatça belirlenebilir. Bütçe aşımlarının olup olmayacağı,
işletim giderlerinin miktarı, vb faktörler hesaplanır ve müşteri bu risk faktörlerine göre devam
etmeye veya projeyi sonlandırmaya karar verebilir.
6. Üretilmiş olan prototip bir önceki prototip gibi incelenir ve gerekliyse bir başka prototipin
daha yapımı için işe başlanır.
7. Böylece ürün tatmin edici oluncaya kadar yeni prototiplere devam edilir, müşteri üründen
memnun olunca bu prototip nihai ürün kabul edilir.
8. Son prototipe göre nihai ürün üretilir.
Şöyle ki, “Yukarıdaki maddelerin sağ tarafında yazılı olan öğeler değerlidir
ancak sol taraftaki öğeler daha çok değerlidir.”
Çevik (Agile) Yazılım Geliştirme Modeli (devam)
o Birçok sorunu çözmesine rağmen Çevik Programlamanın dezavantajları
da vardır:
• Yanlış uygulandığı zaman yani çeviklik kavramı yanlış anlaşıldığı zaman
personelin tükenmesi (Employee burnout) dediğimiz yan etkiyi doğurur.
• Ekip liderine çok fazla sorumluluk ve güç verildiğinde bu hem ekip liderini
hem de ekip üyelerini yıpratabilir.
• Çevik programlamanın her türlü yazılım problemini çözeceği
düşünüldüğünde hayal kırıklıklarına yol açar.
• Çevik programlama yazılım geliştiricilerin ve takımın disiplinli, düzenli ve
tecrübeli olmasını tercih eder dolayısıyla buna hazır olmayan
organizasyonlar, takımlar ve geliştiriciler için uygun değildir.
• Dokümantasyon tamamen ihmal edilebilir ve bunun sonuçları kötü olabilir.
• Büyük projelerde çok uygun değildir.
Uç (Extreme) Programlama Yazılım Geliştirme Modeli
o Artırımsal programlamanın birçok alt tipi veya uygulaması vardır.
o Bunlardan biri de Uç Programlama (Extreme Programming) yazılım
geliştirme modelidir.
o Şelale yönteminin dezavantajlarından kaçınan bir yöntem olan Çevik
(Agile) Programlamadan bahsetmiştik.
o Uç Programlama (Extreme Programming) bunu iyice öteye taşır.
o Şelale yönteminin dezavantajlarından büyük ölçüde kaçınır ve yan
etkilere uğramamak için radikal önlemler alır.
Uç (Extreme) Programlama Yazılım Geliştirme Modeli (devam)
o Çiftler halinde (Pair) programlama: Hız sağlar, uzun vadeli planlama eksiğini
doğru tasarım ve kod ile kapatır,
o Kod gözden geçirme toplantıları: Uzun vadeli planlama eksiğini doğru
tasarım ve kod ile kapatır,
o Tüm kod için birim testler: Uzun vadeli planlama eksiğini doğru kod ile
kapatır,
o Gerçekten gerekmedikçe özellik eklememek: Sadelik sayesinde değişime
ayak uydurmak için,
o Yatay yönetim şekli: Hız kazandırır,
o Kodda basitlik ve açıklık: Sadelik sayesinde değişime ayak uydurmak için,
o Müşteri değişikliklerine hoşgörü: Uzun vadeli planlama eksiğini kapatır,
o Müşteri ile iyi iletişim: Uzun vadeli planlama eksiğini kapatır,
o Programcılar arasında iyi iletişim: Hız kazandırır.
Uç (Extreme) Programlama Yazılım Geliştirme Modeli (devam)
o Uç programlamanın ana özelliklerini sıralayacak olursak:
• Basitlik: Gerekli değişikliklere kolay ayak uydurabilmek için,
• Geri besleme: Gerekli değişiklikleri zamanında edinebilmek için,
• Cesaret: Kodda gerekli değişiklikleri yapabilmek için,
• Saygı: Uyumlu çalışma ortamım sağlamak için.
Uç (Extreme) Programlama Yazılım Geliştirme Modeli (devam)
o Uç programlamanın eleştirilen yönleri de vardır:
• Uç programlama ile 10 kişinin altındaki ekiplerde verimli sonuçlar elde edilirken büyük
ekiplerde ve projelerde planlama eksiğinden dolayı kötü sonuçlar verebilmektedir.
Üstelik toplam kalite kurallarına göre mutlaka hazırlanması gereken dokümanlar “Biz Uç
Programlama yapıyoruz” mazereti altında yazılmamakta; ihmaller veya suistimaller
olabilmektedir.
• Uzun vadeli planlama yapılmadığı için hedef sapmaları, koda eklenmiş gereksiz özellikler
rahatlıkla oluşabilmektedir,
• Uç Programlamanın sürekli iletişim ve hatta sözlü iletişim gerektiren çalışma biçimine
(çok kaliteli yazılımcılar olsalar bile) herkes ayak uyduramamaktadır. Üstelik ekipteki
herkesin iyi anlaşamaması da olası bir durumdur,
• Sadece kısa vadeli planların olduğu bu ortamda gerçekten tecrübeli programcılar
gerekmektedir,
• Müşteri ile kontrat sorunları ve çıkan ürün özellikleri üzerinde sonradan sorunlar
çıkabilmektedir,
• Ana özelliklerden olan müşteri katılımı her zaman mümkün olmamaktadır,
• Uzun vadeli detaylı planlama olmadığı için proje tahminleri zorlaşmaktadır,
• Uç Programlama özellik ekleme temelli olduğu için görünür özellikler arasında olmayan
ama altyapı için gerekli olan önemli bazı proje yetenekleri kaçırılabilmektedir (Örneğin
gömülü bir projeye alelacele makine dili ile başlayıp zaman geçtikçe aslında işletim
sistemi ve yüksek seviyeli bir dil gerektiği gerçeği ile karşılaşmak gibi.)
Uç (Extreme) Programlama Yazılım Geliştirme Modeli (devam)
o Uç Programlamanın en belirgin özelliği kısa iterasyonlara sahip olması ve hemen
her zaman çalışan bir sistemin (basit ve özelliksiz bile olsa) paydaşlara
sunulabilmesidir.
o Bu şekilde bir çalıştırılabilir programın olması, projenin gidişatının sürekli kontrol
altında tutulabilmesini sağlar. Oysa klasik yöntem olan şelale modelinde, son ana
kadar başarılı görünen bir yazılım, son inşa sonrasında hiç çalışmayabilir bile.
"Çalışan bir karmaşık sistem kaçınılmaz olarak çalışan basit bir sistemden
geliştirilmiştir. Tam ters ilişki de geçerli gibi görünüyor: Çöplük gibi bir sistemden
geliştirilen bir sistem de asla çalışmaz ve çalıştırılması becerilemez. En baştan çalışan
bir basit sistem kurarak işe başlamak zorundasınızdır."
Gali kanunu (Galls law)- John Gali
o Uç programlamanın bir diğer özelliği de YAGNI prensibidir. YAGNI “You ain’t gonna
need it” yani Türkçe karşılığı ile “İhtiyacın olmayacak ki" cümlesinin sözcüklerinin
baş harflerinden oluşur. Felsefi olarak bir özelliğin ancak gerçekten ihtiyaç
çıktığında koda eklenmesini önerir. İhtiyaç yokken belki ileride ihtiyaç olur diye
boşu boşuna kodu karmaşıklaştırmaya ve büyütmeye karşıdır.
Spiral ve Çevik Yazılım Geliştirme Modelleri Arasındaki Farklar
Spiral ve çevik yazılım geliştirme modelleri birbirleri ile karıştırılabilirler. Her ikisi de
artırımsal ve tekrar işlemeli yazılım geliştirme modelinin alt üyesidirler. Birbirlerine
benzemekle beraber aralarında bazı farklar vardır:
o Spiral modelde ön planlama daha ağırlıklıdır, iterasyonlar önceden planlanır.
Oysa Çevik yazılım geliştirmede sadece o anki iterasyon için detaylı plan yapılır,
diğer iterasyonlar için plan yapılmaz, belirsizlik zaten kabul edilen bir gerçektir.
o Spiral modelde “planla - gerçekle(kodla) - test et - düzelt” tipi bir yaklaşım varken
Çevik modelde testlerin mümkün olan en kısa zamanda hatta bazen iterasyonun
en başında hazırlanması düşünülür. Çevik modelde test kodlamadan daha
önceliklidir.
o Çevik modelde her iterasyon sonunda, öncelikli gereksinimlerin gerçeklendiği,
çalışabilir, tamamen test edilmiş, az özellikli ama hazır bir program üretilir. Spiral
Modelde bu şart değildir, ilk iterasyonlarda sadece bir prototip mahiyetindeki bir
ürün ortaya çıkabilir.
o Spiral model teknik bir üretkenlik yaklaşımı iken buna ek olarak Çevik Model
insan psikolojisini de göz önüne alan, sosyal içerikleri olan bir geliştirme
modelidir.
o Spiral model daha klasik bir yaklaşım olduğu için dokümantasyondan, kod içi
yorumlardan, planlardan ve gereksinimlerden taviz vermez, Çevik modelde ise
bu konular suistimale biraz daha açıktır.
Scrum Yazılım Geliştirme Modeli
o Scrum küçük takımlar için bir yazılım geliştirme modelidir. Scrum yazılım
geliştirme modelinde takım elemanlarının sayısı 10’u geçmemelidir. Birden
fazla takım varsa bunların birbirinden bağımsız çalışabilmesi şartları
hazırlanmalıdır.
o Scrum, Amerikan futbolunda yeni hamleyi yapmak için bir arada,
kenetlenmiş olan takıma ve yaptıkları hamleye denir, bu yazılım yöntemi ve
yöntemi kullanan yazılım ekibi de buna benzetilmiştir.
o Projede ilk safha planlama safhasıdır. Bu safhada bir ürün mimarisi ve planı
geliştirilir ve şef yazılım mimarı seçilir. Projenin yapısından şef yazılım mimarı
sorumludur. Proje sırasında yazılım mimarisi değişebilir ancak değişsin veya
değişmesin mimariye proje boyunca uyulmaya çalışılır.
o Planlama safhasından sonra bir seri kısa geliştirme safhalarından geçilir.
Her safha “depar” (sprint) olarak adlandırılır ve projenin artırımsal olarak
ilerlemesini sağlar. Her bir safha (depar, sprint) genelde 1 ila 4 hafta
arasında sürer. Kapanış safhası ile proje sonlandırılır.
Scrum Yazılım Geliştirme Modeli (devam)
o Yazılım takımı bütün görevleri “işlem maddesi” (backlog) olarak adlandırılan bir
listede tutar. Bu “işlem maddeleri” takımın ana güdüleyicisidir. Her depar
safhasından önce bu “işlem maddeleri” güncellenir, öncelikleri ayarlanır ve yazılım
takımı bu maddelerden gözüne kestirdiklerini yapmak için onay verir. Takımın her
üyesi kendisine düşen birkaç maddeyi depar sırasında tamamlamak için onay verir.
o Genelde bu depar süreleri hafta(lar) boyutunda olmalıdırlar. Büyük görevlerde ve süre
uzadıkça görevi tanımlamak ve iş sırasında rapor vermek güçleşmektedir. Bir depar
sırasında takım dışından kaynaklı bir değişikliğin takıma rica edilmesine izin verilmez.
o Her depar (geliştirim safhası, sprint) sırasında ürüne gözlenebilir, kullanılabilir veya
dışarı sunulabilir bir artım yapılmaya çalışılır. Her deparın ardında yatan felsefe
değerli bir işlevi ürüne katmaktır.
o Deparlar sırasında hedefin depar süresince bitirilmesine çalışılır. Depar süresinde
hedef bitmez ise deparın süresi asla değiştirilmez, bunun yerine gerekliyse hedef
yeniden tanımlanır veya küçültülür. Depar tarihleri ile oynamamak takım içinde genel
bir standardı sağlar.
o Depar sırasında, sıkça, takımın her üyesinin katıldığı toplantılar yapılır. Bunlar
genelde günlük toplantılar olarak organize edilir. Böylece projedeki olası kaymalar,
gecikmeler çok kısa zamanda tespit edilebilir. Toplantılara uzakta çalışan üyeler tele-
konferansla bile olsa çağrılır, böylece takım ruhu ayakta tutulur.
Scrum Yazılım Geliştirme Modeli (devam)
o Scrum modelinde müşteri ile irtibatlı olan pazarlama birimi ile teknik
geliştirme birimi arasında sıkı iletişim ve birlikte çalışma olmalıdır.
Tahminlerin yapılmasında ve hedeflerin tutturulmasında bu çok önemlidir.
Proje sırasında hedeflerin öncelikleri bu iki ekip tarafından ayarlanarak proje
için hayati özelliklerin üründe bulunmasına çalışılır.
o Scrum şefi (şef yazılım mimarı) işlem maddelerini (backlog) hazırlar,
günceller ve depardan önce kullanılabilir duruma getirir. Ayrıca projedeki
ilerlemeyi ölçer, işlem maddelerinin tamamlandığını takip eder, riskleri
hesaplar ve acil önlemler alır. Serum toplantılarının kısa ve amaca odaklı
olmasını kontrol etmek de Scrum şefinin görevidir.
o Her scrum toplantısı 15-30 dakika arasında sürer. Toplantıda tamamlanan
işlem maddeleri, karşılaşılan engeller ve bunları çözmek için yapılan
planlardan söz edilir. Sorunların çözüm yöntemleri için hararetli tartışmalara
girilmez ve bunlar için sadece ilgili taraflarla başka toplantılar yapılır.
o Her depar sonunda tüm deparın sonucunu gözden geçirilir ve her konuda
değişiklik yapılabilir. En son depar ürününün teslimi için yapılır.
Spiral ve Scrum Yazılım Geliştirme Modelleri Arasındaki Farklar
o Scrum yazılım geliştirme modelinin bileşenleri ve fikirleri aslında yeni
değildir.
o Scrum modeli Spiral Yazılım Geliştirme Modeline benzer. Basitçe, zaman
adımlarına bölünmüş, tipik bir artırımsal yazılım geliştirme modelidir.
o Klasik artırımsal modelden fazla olarak “işlem maddelerinin
durumunun, karşılaşılan engellerin ve bu engelleri aşmak için yapılan
planların konuşulduğu sık toplantılar” vardır.
o Bunun dışında Spiral modelin biraz daha hızlandırılmışı olarak kabul
edilebilir.
o Scrum toplamda bir kaç ay süren, her deparı (geliştirme safhası) birkaç
hafta süren, gereksinimleri başlangıçta tam belirli olmayan projeler için
uygundur.
Birleşik İşlem (Unified Process) Yazılım Geliştirme Modeli
o Bir diğer artırımsal (ineremental) ve tekrar işlemeli (iterative) yazılım
geliştirme modeli de Birleşik İşlem yazılım geliştirme modelidir.
o Modelin en büyük özelliği İşlev ve kullanım öykülerini (Use Case) temel
öğe olarak almasıdır.
o Mimari temelli bir modeldir. Risklerin en kısa zamanda belirlenmesi ve
en büyük riske öncelik verilmesine önem verir.
o Dört tane ana safhası vardır:
• Yakalama safhası (Inception),
• Ayrıntılandırma safhası (Elaboration),
• Üretim safhası (Construction),
• Geçiş safhası (Transition).
Birleşik İşlem (Unified Process) Yazılım Geliştirme Modeli
o Yakalama safhası projenin ön hazırlığıdır ve mümkün olduğunca kısa
olması istenir. Projenin hedefi, sınırları, riskleri, kullanıcı ve işlev öyküleri,
ana gereksinimleri bu safhada belirlenir. Kaba bir proje planı ve maliyet
tahmini yapılır. Proje için uygun aday mimariler belirlenir.
o Ayrıntılandırma safhasında sistem gereksinimleri detaylandırılır. Risk
faktörleri hesaplanır ve sistem mimarisi hazırlanır ve doğrulanır.
Doğrulama için projenin ana çatısı gerçeklenebilir. Türlü şemalarla
detaylar desteklenir.
o Üretim safhası en kapsamlı safhadır ve bu sırada ürünün detaylı üretimi
gerçekleştirilir. Üretim kısa zaman adımlarından oluşan yinelemelerle
gerçekleştirilir.
o Geçiş safhası ürünün sahaya sürülmesi, kurulması veya müşteri tarafına
sağlıklı biçimde iletilmesi safhasıdır. Burada ürün sonlandırılana kadar
çeşitli iyileştirme çalışmaları yapılabilir.
Yalın Yazılım Geliştirme Modeli
o Yalın Yazılım Geliştirme modeli (Lean Software Development) endüstrideki
verimli kaynak kullanımı modelini yazılım projelerine de uygulamayı hedefler
(Hibbs 2008).
o Endüstride kullanılan verimli kaynak modeli esaslarını listeleyecek olursak:
• Gereksiz stoklama yoktur,
• Mümkün olduğunca otomasyon yapılır,
• İsraf yoktur, kaçınılacak israf maddeleri şunlardır:
• Hatalar: Klasik hatayı bul ve tamir et yöntemi yerine önleyici tedbirlerle
hatalar oluşmadan engellenmelidir,
• Aşırı üretim; Kaçınılması gereken diğer bir israftır,
• Taşıma: Parçaların işlemler arasında taşıma maliyetleri hesap edilmelidir,
• Bekleme: Parçalar veya insanların beklemesi maliyeti arttırır,
• Stok: Stok para akışını bozacağı için, ödeme dengesini bozar, maliyeti
arttırır, ayrıca alan ve çalışan maliyetini arttırır,
• Hareket: gereksiz yere ekipman veya insanların hareketi de zaman
kaybettirir,
• Gereksiz işleme: Müşterinin istediğinden daha fazla işleme yapmak
maliyetleri arttırır,
• İnsanların faydasız kullanımı: Maliyetleri arttırır.
Yalın Yazılım Geliştirme Modeli (devam)
o Yukarıdaki verimlilik temelli modeli yazılım geliştirmeye de uygulamayı amaçlayan Yalın
Yazılım Geliştirme modeli aynı maddeleri şu şekilde yazılım için yorumlar:
• Tam zamanında işlem ve gereksiz stoklamadan kaçınmak: Bitmemiş, yarım durumda her
yazılım maliyeti arttırır bu sebeple yarım işlerden kaçınılır,
• Otomasyon: Teknolojinin sağladığı tüm gereçlerden faydalanılır, bu bağlamda otomatik kod
yazma, versiyon tutma, hata raporlama, tasarım programları yoğun biçimde kullanılır.
• İsraftan kaçınmak: Kaçınılacak israf maddeleri şunlardır:
• Hatalar: Tüm aşamalarda kalite içeri gömülür, gereksinimlerin hazırlanmasında,
tasarımın yapılmasında, vb hatalar minimuma indirilir ve böylece ürün çıktıktan sonra
oluşacak hatalar azaltılır, yani kalite tüm işlem süresine gömülür ve dağıtılır,
• Aşırı üretim, ekstra özelliklerden kaçınılmalıdır: Kullanıcının isteklerinin %80’inin
ürünün özelliklerinin %20’si ile karşılanabildiği göz önüne alınmalıdır,
• Taşıma: Bilgiler, dokümanlar toplantı raporları herkese aynı anda iletilmelidir,
müşteriden gelen bir gereksinim planlama bölümünden tasarımcıya ulaşana kadar
defalarca el değiştirmekte ve hatalarla dolmaktadır, kulaktan kulağa şeklindeki iletişim
biçimlerinden kaçınılmalıdır,
• Bekleme: Projeler çok iyi planlamak ve beklemeler en aza indirilmelidir,
• Stok: Yarım veya sürmekte olan birçok proje stok maliyetinin artması demektir, projeler
kısa ara hedeflere sahip olmalı ve sürüncemede bırakılmamalıdırlar,
• Hareket: Yazılımcılar sadece bir işle uğraşmalı birden fazla proje bir yazılımcıya
atanmamalı- dır, bir anda bir projeden diğer bir projeye adapte olma süresi çok fazladır,
• Gereksiz işleme: Gereksiz süreçler bir an önce elimine edilmelidir.
Yalın Yazılım Geliştirme Modeli (devam)
o Yalın programlamanın bu esaslardan çıkardığı bazı öneriler de vardır:
• İnsanlara saygı gösterin: Yalın programlamanın esası kaynaklan iyi kullanmaktır
demiştik. İnsanlar da en önemli kaynaklar olduğuna göre insanlara saygı
göstermek, kendilerini yetiştirmelerine gelişmelerine destek olmak, fikirlerine
değer vermek ve iyi bir çalışma ortamı sağlamak Yalın Programlamanın temel
hedeflerindendir. İnsanlara değer vermek, insanların verimlilik kuralları içerisinde
aşırı yıpranmasını önler, yani katı verimlilik sistemini biraz daha insanileştirir,
• Araçlar kullanın: Versiyon kontrol araçları, otomatik script'ler kullanın,
• Otomatik test imkânlarını kullanın: Testlerinizi otomatikleştirin,
• Sürekli entegrasyon: Sürekli birleştirme yaparak süreci iyileştirin, birleştirmeyi en
sonda yapmayın ve sürece yayın,
• Daha az kod yazın: Kodda sürekli iyileştirme (refactoring) yapın ve kaliteli fakat
az kod yazın, daha çok kod daha çok problem demektir, yazılan her kod satırı
harcanan para demektir ve bu sebeple asla gereksiz kod yazılmamalıdır. Müşteri
gereksinimleri çok iyi irdelenmeli ve gerçekten gerekli olmayan gereksinim
çıkarılmalı ve dolaylı olarak gereksiz kodun yazılması engellenmiş olmalıdır.
• Kısa iterasyonlar yapın: Böylece süreci daha bir kontrol altında tutun,
• Müşteri katılımı: En baştan en sona kadar müşteri katılımını sağlayın.
Re-use (Tekrar Kullanımlı) Yazılım Geliştirme Modeli
o Bu modelde sistem ve organizasyonun çoğu ürünü tekrar kullanılabilir modüllerden
faydalanılarak üretilir.
5
Projeye başlarken öncelikle iyi bir analiz süreci yaşamak ve
planlama yapmak gereklidir.
Öncelikle müşterinin ne istediğinin, nasıl bir sistem istediğinin tam
olarak anlaşılması gerekir.
Müşterinin istediğinin ne olduğu tam olarak anlaşıldığında risk
analizi ve maliyet tahminleri yapılır.
Detaylı gereksinimler de analiz ve planlama aşamasında oluşur.
Gereksinimler bu aşamadan sonra değişmeyecek diye bir kural
yoktur, ancak bu aşamada ne kadar tutarlı bir gereksinim
dokümanı oluşturulur ve ona sadık kalınmaya çalışılırsa proje de o
kadar sağlıklı ve rahat gerçekleştirilir.
Analiz ve planlama aşamasında sistemin nasıl test edileceğinin
planlaması da yapılmalıdır. Test edilmesi zor veya test edilme
imkanı bulunmayan bir sistem hiçbir zaman üretilmemelidir.
Analiz ve planlama aşamasında bu konuların yanı sıra projeyi
gerçekleştirecek takım da oluşturulur.
6
Her Şey İş Tanımı İle Başlar
o İş tanımı, projedeki tüm taraflara ve projede çalışan elemanlara
işin amacını ve kapsamını kabaca anlatan bir dokümandır.
o İş tanımı dokümanında şu iki konuya mutlaka değinilmelidir:
• İşin Amacı
• İşin Kapsamı
• Diğer Alanlar:
• İşin süresi
• İşin yapılacağı yer
• Teslim takvimi
• Teslim kalemleri
• Kabul kriterleri
• Ödeme koşulları
7
Projeninbaşarısındaki etkenlerden biri projenin
amacının iyi anlaşılmasıdır
"Bir projeyi planlamaya başlamadan önce projeyi neden
yaptığınızı, yapma sebeplerinizi iyice anlamalısınız. Projeye
neden ihtiyacınız olduğunu kavramadan proje sonunda
başarılı olup olmadığınızı nasıl söyleyebilirsiniz ki?"
Kent Beck, Martin Fowler
8
Projede Maliyet ve Süre Tahminleri
o Bir projenin yapılma sebebi kar etmektir ve bunu mümkün olan en kısa
sürede yapmaktır. Kar edilmeyecek bir projeye girmenin anlamı yoktur,
bu sebeple maliyet ve süre tahminlerinin doğru yapılması çok önemlidir.
o Proje süresi hesaplanırken genel eğilim iyimserliktir ve bu durum birçok
projenin batmasına sebep olur. – İyimserliğin genellikle iki kötü sonucu
vardır:
• Proje ekibi ne pahasına olursa olsun projeyi bitirir ama artık ekipten hayır
gelmez.
• Proje ekibi projeyi zamanında bitiremez, gecikme tazminatları, müşteri kaybı,
ekipte fazla ve sürekli stres gibi birçok zarar oluşur.
11
Proje Büyüklüğünü Tahmin Etmek (devam)
o Aşağıdan Tepeye İnceleyerek Tahminde Bulunma Yöntemi – Sistem en
küçük parçalarından başlanarak incelenir. Detaylı, zaman alıcı bir
yöntemdir. Üstelik parçaların büyüklüğü hesaplanırken bu parçaların
birleştirme maliyeti genelde unutulur. Bu yöntem kullanılarak projede
bir süre yol alındıktan sonra ilk parçaların yapılma süresi gözlenir.
Orantı kurularak tüm parçaların ne kadar zamanda gerçekleşeceği
hesaplanabilir ve ekibin ilerleme hızı ve dolayısıyla projenin süresi
gerçekçi bir biçimde hesaplanabilir.
o Maliyete Göre Tasarım – Bu yöntemde önerilen bütçeye göre ne
yapılabilecekse o tahmin edilip yapılmaya çalışılır. Mühendislik
temelinden uzak bir yöntemdir.
o Parametrik modeller kullanmak – Bu yöntemde detaylı mühendislik
hesapları yapılır ve tahmin yöntemleri kullanılır. Avantajı şudur;
hesaba dayalı bir işlem olduğu için erken sonuçlar alınabilir ve
sonuçlarda objektif olunabilir. Ancak doğru uygulanmadığında ya da
insanlar yöntemi suistimal ettiğinde çok iyimser tahminler üretebilir.
12
Parametrik modeller kullanılarak yapılan tahminlerin
örnekleri:
o Kaynak kod satırı sayısı ile proje büyüklüğü tahmini
o İşlev noktaları sayısı ölçümü ile proje büyüklüğü tahmini
o İşi ana parçalara bölerek proje büyüklüğü tahmini
o Nesne temelli programlama yapılırken kullanılan yöntemler
• Nesne öğeleri sayısı temelli tahmin
• Kullanım senaryoları (Use Case) sayısı temelli tahmin
o COCOMO Tahmin Modeli
Kalite, Hız, Ucuzluk Üçgeni
o Ürün kaliteli ve hızlı yapılırsa ucuz olamaz,
o Ürün kaliteli ve ucuz yapılırsa hızlı yapılamaz,
o Ürün hızlı ve ucuz yapılırsa kaliteli olamaz.
13
Planlama ve İyi Bir Planlamanın Önemi
o Proje küçük de olsa mutlaka bir plan yapılmalıdır
o Plan içerisinde yapılacak ana işler, görev dağılımı, görevlerin başlangıç ve bitiş süreleri
yazılmaya gayret edilmelidir.
Proje Adımlarını Belirleyin
o Proje adımının tanımı
o Bu adıma ulaşmak için gerekli süre
o Bu adıma ulaşmak için gerekli efor ve elemanlar
o Proje adımının başarı kriteri, yani bu adıma başarıyla ulaşıldığının objektif belirlenmesi,
o Aşamaların öncülleri, ardılları.
Proje adımlarını dokümante ederken birçok yöntem vardır. Pert çizelgeleri (Program
Evaluation and Review Technique - İş Değerlendirme ve Gözden Geçirme Tekniği),
CPM Çizelgeleri (Critical Path Method - Kritik Patika Yöntemi), Gantt Çizelgeleri (Gantt
Chart) bunlardan bazılarıdır. Özellikle Gantt Çizelgeleri yazılım projelerini safhalara
ayırırken olmazsa olmaz yöntemlerden biridir. Gantt çizelgeleri basitçe iş parçalarını ve
bunların tahmini sürelerini aynı çizelge üzerinde, zaman ekseninde göstermekten
ibarettir.
14
Proje İçin Gerekli Olan Kaynaklar
o Herhangi bir projeye başlayabilmek için aşağıdaki dört
kaynak olmazsa olmaz unsurlardır:
• İşgücü
• Donanım
• Zaman
• Para
o Bunun yanısıra aşağıdakiler de başarılı olmak için
neredeyse vazgeçilmezdir:
• Proje kapsam tanımı- Project Scope (Proje amacı, büyüklüğü,
gereksinimleri, paydaşlarının belirlenmesi ve başarı kriteri)
• Motivasyon
• Sağlıklı çalışma ortamı
• Kullanıcı geri beslemesi
15
Risk Analizi
o Yazılım projeleri risk oranı yüksek projelerdir. Bu yüzden başarısızlık
oranları bir hayli yüksektir. Başarılı projeler:
• Zamanında tamamlanmış
• Bütçesini aşmamış
• Belirlenen gereksinimleri karşılayan projelerdir.
16
Yazılım Projelerinde En Çok Rastlanan Riskler Nelerdir?
o Proje amaç, tanım ve kapsam riskleri
o Gereksinim riskleri
o Takvim riskleri
o Bütçe ve maliyet riskleri
o Planlama riskleri
o Gerçekleme riskleri
o Kalite güvence riskleri
o Kalite kontrol riskleri
o Organizasyondan kaynaklanan riskler
o Yönetimsel riskler
o Müşteri ve kullanıcılarla ilgili riskler
o Paydaşsal riskler
o Altyüklenici riskleri
o Sosyal riskler ve personel riskleri
o Teknolojik riskler
o Ticari riskler
o Politik ve yasal riskler
o Toplumsal riskler 17
Riskleri Azaltmak İçin Ne Yapılmalıdır?
50
40
30
20
10
0
Hatanın Düzeltme Maliyeti
20
Gereksinimlerin Belirlenmesi Tasarım Kodlama Test Kurulum Sahada Çalışma
Yazılım gereksinim dokümanının faydaları şunlardır:
o Müşteri ile yazılım ekibi arasındaki yanlış anlamaları yok eder, olası
uygunsuzlukların en başta tespit edilmesini sağlar.
o İşgücü, maliyet ve süre analizlerine ek bir temel teşkil eder ve doğru
yapılmalarını sağlar,
o Testler ve kabul kriterleri için temel teşkil eder,
o Diğer dokümantasyonlara temel teşkil eder,
21
İyi Bir Gereksinim Dokümanı Hangi Özelliklere Sahip Olmalıdır?
o Doğru - Elbette gereksinim dokümanınızın doğru olmasını istersiniz.
Ancak önemli olan güncel tutarak uzun süre doğru kalmasını
sağlamaktır.
o Tartışmasız - : Bir gereksinim herkes tarafından aynı şekilde
yorumlanmalıdır. Bir gereksinimden herkes farklı bir şey
anlamamalıdır.
o Tam - Yazılımın gerçeklenmesi için gerekli tüm konulara ait
gereksinmelere değinmelidir.
o Tutarlı - Gereksinim dokümanı içindeki her madde diğer maddeler ile
uyumlu olmalıdır. Gerek mantık olarak gerekse yazım biçimi olarak
uyum sağlanmalıdır.
o Öncelik sıralı - Gereksinimler gerçeklenme önceliklerine göre
gruplanır ve sıralanırsa proje takvimi açısından çok değerli bir iş
yapılmış olur. Önemli gereksinimler önce, daha az önemliler daha
sonra gerçeklenir. Gereksinim dokümanında öncelik bilgisi de
verilmelidir. 22
İyi Bir Gereksinim Dokümanı Hangi Özelliklere Sahip Olmalıdır?
(devam)
o Doğrulanabilir - Gereksinim olarak doğrulanması güç, muğlak ifadeler
kullanmayınız. Örneğin “Sistem hızlı cevap verecektir.” ifadesi yerine “Sistem
alınan mesajlara en fazla 100 ms içerisinde cevap mesajı gönderecektir.”
türünden ölçülebilir ifadeler yazın.
o Değişikliğe uygun - Gereksinim dokümanı içerisindeki gereksinimler ve
açıklamalar basit, ufak ve mümkün olduğunca birbirlerinden bağımsız
olmalıdır. Ayrıca bir gereksinim birçok yerde tekrarlanmamalıdır. Böylece
gereksinim dokümanı değiştirilmek istendiğinde kolayca değiştirilebilir.
o İzlenebilir - Gereksinimlerin gerek sistem gereksinimlerine gerekse testlere
olan ilgileri açıkça belirtilmelidir. Bir yazılım gereksiniminin hangi sistem
gereksiniminden doğduğu bilinirse gerçeklenme daha tutarlı ve hatasız
yapılabilir. Öte yandan hangi testin bu gereksinimi test ettiği bir yerde yazılı
olursa testler esnasında gözden kaçan yani test edilmemiş gereksinim
kalmaz.
o Gerçeklenebilir - Gereksinimlerin gerçekten gerçeklenebilir olduğunun
önceden düşünülmesi faydalıdır. Gereksinimler yazılırken bile bir ön
araştırma yapılıp bu gereksinimin eldeki imkânlarla başarılıp
başarılamayacağı düşünülmelidir. 23
Gereksinimleri Hazırlarken ve Yazarken Nelere Dikkat Etmek
Gerekir?
o Gereksinimleri hazırlama safhasında aşağıdaki konulara
dikkat etmelisiniz:
• Öncelikle birçok projede kullanabileceğiniz standart bir
gereksinim dokümanı şablonunuz olsun.
• Müşteri ve konunun uzmanları ile sıkı bir iletişimde bulunun.
• Proje süresinin %20 ile %25’i gereksinimler için harcanmalıdır.
• Gereksinim dokümanını güncel tutun.
• Gereksinim dokümanını gözden geçirme işlemine sokun, başka
insanlara okutun, anlaşılıp anlaşılmadığını kontrol edin
24
Gereksinimleri yazarken aşağıdaki konulara dikkat etmelisiniz:
o Tümcelerinizi kısa tutun,
o Edilgen tümceler kullanmamaya çalışın, çünkü edilgen yapıda özne olmadığı
için sorumluluğun kimde olduğu belli değildir,
o Gramer kurallarına dikkat edin,
o Gereksinim dokümanı içerisinde geçen terimler için terimler sözlüğü
oluşturun,
o Gereksinim dokümanı içerisinde geçen kısaltmalar için kısaltmalar sözlüğü
oluşturun,
o Gereksinim dokümanı içerisinde anlaşılması zor veya teknik olan konuları
tanım maddeleri olarak verin. Örneğin “Arayüz” kelimesi için “İki veya daha
fazla cihaz arasında veri iletişiminin sağlandığı donanım birimi” gibi bir
açıklama tüm paydaşları çok memnun edecektir,
o Tek bir gereksinim maddesini test etmek için üç-dört testten fazla test
yazmak zorunda kalıyorsanız muhtemelen o gereksinimi aslında birkaç
parçaya bölmeniz gerekiyordur
25
Gereksinimleri yazarken aşağıdaki konulara dikkat etmelisiniz (devam):
o Ve/Veya kelimelerinin fazla geçtiği gereksinim maddeleri genelde özensizce
yazılmış maddelerdir,
o Negatif anlamlı tümcelerden kaçının,
o Gereksinimlerin seviyeleri birbirine yakın olmalıdır. Açıklayacak olursak bir
gereksinim tüm sistemi tarif ederken diğer bir gereksinim bir detayı tarif ediyorsa
bir sorun var demektir,
o Tekrar eden gereksinimlerden kaçının. Sadece açıklama kolaylığı sebebi ile
mecbur kalındığında tekrar eden gereksinimler kullanılmalıdır. Aksi taktirde
tekrar eden gereksinimler dokümanın bakım yapılabilirliğini fena halde azaltırlar,
o Gereksinimi yazan kişiler ile kodlamayı yapan kişiler mümkünse ayrı kişiler
olsunlar,
o Gereksinimi yazan kişilerin dil yeteneği ve iletişim becerisi çok gelişmiş olmalıdır,
o Tam anlaşılmayan veya belirsiz gereksinimlerin ileride size sorun çıkaracağından
emin olabilirsiniz,
26
Gereksinimleri yazarken aşağıdaki konulara dikkat etmelisiniz
(devam):
o Yazılım gereksinimlerini sistem gereksinimlerine (veya ana kaynak üst
gereksinimlere) bağlayan izlenebilirlik tablosu (matrisi) oluşturun,
o Gerçekleme yöntemi ve tasarım detaylarını gereksinimler içine koymaktan
kaçının,
o Bir gereksinim maddesinde sadece bir gereksinimi belirtin,
o Gereksinimi yazarken nasıl test edileceğini de düşünün,
o Gereksinimin gerçek dünyada sağlanıp sağlanamayacağını kontrol edin,
o Sadece normal çalışmayı değil istisnai durumlarda alınacak tutumu da
gereksinimlerde belirtin,
• Sisteme uygun olmayan girdi girildiğinde sistemin davranışını belirtin,
• Sisteme (beklediği) girdi girilmediğinde sistemin davranışını belirtin,
• Sisteme beklenmedik bir bilgi beklenmedik bir zamanda girildiğinde
sistemin davranışını belirtin,
o Sistemin başlatılma ve kapatılma süreçlerindeki davranışını belirtin,
o Gereksinimlerin sistemin hangi mod ve durumlarına ait olduğunu belirtin.
27
Peki bir gereksinim dokümanı neyi içermelidir?
o İşlev: Yazılımın ne yapması isteniyor? Amacı nedir?
o Kullanım senaryoları (Use Cases): Modern gereksinim dokümanları insan-makina
arasındaki kullanım senaryolarını da içerir.
o İş akışı: Hem modern hem de klasik gereksinim dokümanlarında akış
senaryoları, cihazların iletişim protokolleri, mesajlaşma akışına dair bilgiler yer
alır.
o Dış arayüzler:
• Yazılımın insanlarla olan arayüzü (ekranlar, sesler, vb)
• Yazılımın diğer cihazlarla, sistem donanımı ile ve diğer yazılımlarla olan
arayüzü.
o Performans: Hız, düzgün çalışma oranı, cevap verme süresi, vb.
o Yazılımın özellikleri: Taşınabilirlik, doğruluk, bakımı yapılabilirlik, güvenlik, vb
kriterler.
o Gerçekleme üzerindeki kriter ve kısıtlar: Uygulanan standartlar, uygulama yazılım
dilinin adı, veritabanı politikası, kaynak sınırlamaları, işletim ortamı, vb.
o İşe özel kurallar: Bu kısımda işin karakteristikleri, kendine has özellikleri anlatılır.
o Diyagramlar: Gereksinim dokümanında sadece gereksinim maddeleri bulunmaz,
ayrıca teknik detayları veya büyük resmi daha iyi anlamaya yarayan şemalar,28
şekiller, akış diyagramları da bulunmalıdır.
Örnek: Açık Bir Gereksinim Maddesi Hazırlamak
İstek 1: Frene basınca araba dursun.
29
Aşağıda da koşul kalıbı belirsiz bir gereksinim var.
Gerek 1: Araba duracaktır.
Veya Gerek 1: Araba gerektiğinde duracaktır.
İtiraz 1: Gerektiğinde ne demek? Hangi koşulda duracak?
30
Şimdi de tasarımın gereksinimlerde yapılması hatasını görelim.
Gerek 1: Fren pedalına basınca hidrolikler harekete geçecektir.
Gerek 1: Hidrolikler harekete geçince tekerleklere basınç
iletilecektir.
Gerek 1: Hidroliklerin uyguladığı basınç tekerlekleri kilitleyecek ve
böylece araba duracaktır.
İtiraz 1: Peki ya fren mekanik olarak gerçeklenirse ne olacak?
Neden hidrolik kısıtlaması koyalım? Bırakalım işin nasıl yapılacağını
tasarımcı düşünsün.
31
Bu aşamada yazılımın içerdiği tüm bileşenler ayrıntıları ile
tanımlanır ve tasarlanır.
Tasarım aşaması zaman bakımından kritik bir aşamadır.
Gereğinden az zaman harcamak ileride büyük sorunlar
doğurur.
Öte yandan bu aşamada gereğinden fazla zaman harcamak
projenin başarılabilmesini riske sokar.
32
Kavramsal Sistem Tasarım Dokümanı Hazırlayın
o Kavramsal sistem tasarım dokümanı gereksinimler, kullanım senaryoları ve iş
tanımından yola çıkılarak hazırlanan ve sistem tasarımını büyük resimden
başlayıp daha detaylara inerek anlatan dokümandır.
o Öncelikle bu dokümanda sistemin somut ve soyut elemanlarını, onların
birbirleri ile bağlarını, sistemin dış dünya ile olan bağlarını anlatan sistem
mimari planı bulunmalıdır.
o Eğer varsa sistemin ekran pencerelerinin resimleri, rapor formatları bu
dokümanda belirtilir.
o Bu dokümanın birçok işlevi vardır, bunlar:
• Sistemin ana tasarımının çatısını oluşturmak, yanlış tasarımın önüne geçmek,
• Diğer yazılım ve donanım detay dökümanlarının hazırlanmasına temel teşkil
etmek,
• Yeni başlayan proje elemanlarının yetişmesine ve projeye adapte olmasına
yardımcı olmak,
• Eğitimlerin ve eğitim dokümanlarının hazırlanmasını kolaylaştırmak,
• Know-How’ı arttırarak sistemin bakımını kolaylaştırmak,
• Organizasyonun teknik ve teknik olmayan grupları arasında köprü görevi görmek33
Projenin Sorumlulukları ve İş Dağılımı Çizelgesi Hazırlayın
o Büyük projelerde en büyük sorunlardan biri kimin hangi işi yaptığının
belli olmamasıdır.
o Özellikle bürü projelerde sorumluluklar ve iş dağılımı çizelgesinin
(matrisinin) olmaması önemli bir sorun olarak karşımıza çıkar.
o Böyle bir çizelge olmaması durumunda:
• Proje ekibi ile iş yapmak durumunda olanlar kiminle irtibat
kuracaklarını bilemezler,
• İşe yeni başlayanlar bilgiye kimden ulaşacaklarını bilemezler,
• İş vermek isteyen amirler iş yükünü ayarlayamazlar, doğru kişiye
doğru işi veremezler,
• Müşterinin sorunu bir türlü doğru teknik kişiye ulaşamadığından
çözüm süresi bir hayli uzar.
34
Bu çizelge birkaç şekilde hazırlanabilir. Örneğin en basit
halinde:
Proje Lideri Ali
Kontrol Yazılımı Veli
Ekran Tasarımı Mehmet
Haberleşme Altyapısı Ayşe
36
Terimler ve Kısaltmalar Sözlüğü Hazırlayın, kullanacağınız
Birimleri/Limitleri Önceden Belirleyin
o Özellikle büyük ve çok insanın çalıştığı projelerde proje başladığında yapılması
gerçekten çok faydalı olan bazı alışkanlıklar vardır.
o Bunların bir kısmını verecek olursak:
• Tüm projede geçen kavramları, isimleri açıklayan bir terimler sözlüğü; örneğin
sistemlerin adları, sistemin yaptığı önemli işlerin açıklamaları, vb.
Not: Bunun güncel tutulması çok önemlidir.
• Projedeki kısaltmaların açılımları.
• Projede kullanılan birimler kılavuzu; örneğin uzaklık birimi olarak Kilometre mi
yoksa metre mi kullanılacağı, ağırlık olarak Kilogram mı yoksa Pound mu
kullanılacağı, hız ölçüsü olarak Metre/Saniye mi yoksa Km/Saat mi kullanılacağı
gibi.
• Birim zaman belirlenmesi ve kılavuzu; yani sistemin zaman bilgisinin ve artışının
nasıl çalışacağının belli olması; örneğin her birim 10 milisaniyedir, başlangıç saati
olarak Unix saati alınmıştır, göreceli saat olarak maksimum 200000 birimde tur
bindirilir ve bu 4 bayt içinde tutulur gibi.
Not: Yıl 2000 problemi benzeri problemler bir daha olmayacak ve sizin başınıza
gelmez zannetmeyiniz 37
Kodlama Standartları ve Tavsiyeleri Oluşturup Onları Kullanın
o Koddaki hataları mümkün olan en erken zamanda tespit etmenin hata
düzeltme maliyetini 5 ila 100 kat düşürdüğü artık günümüzde bilinen bir
gerçektir.
o Hataları zamanında tespit etmenin en kolay ve verimli yollarından biri de
kod gözden geçirme (code review) toplantılarıdır.
o Kod gözden geçirme toplantıları yapabilmek için standart bir kod
üretilmesi gereklidir
38
Kodlama standartlarının faydalarını inceleyecek olursak, standartlara
uyulduğunda:
o Bakım yapılabilirlik artar: Kodlama standartları okunabilirliği büyük ölçüde arttırır ve
karmaşıklığı azaltır. Bu sebeple kod yazıldıktan çok sonra bile kodu anlamak ve hatalarım
çözmek kolay olur.
o Yazılım elemanı bulmak kolaylaşır: Evet yanlış duymadınız kod standartlarına uymak
kodun karmaşıklığını azalttığı ve okunabilirliğini çoğalttığı için daha az kalifiye bir
yazılımcı da bu kodda eklemeler ve düzeltmeler yapabilir. Yetişmiş bir yazılımcı bulmak
çok zordur, kod standartlarına uyulduğunda daha az tecrübeli bir yazılımcı da rahatça bu
kod üzerinde çalışabilir.
o Kodun tekrar kullanımı kolaylaşır: Kodun anlaşılırlığı arttığı için başka projelerde bu kodu
kullanmak da kolaylaşır. Normal koşullarda bu tekrar kullanılan kodun eskiden birçok
teste tabi tutulmuş olduğunu kabul edersek ve şimdi eklendiği yerde de testlere tabi
tutulacağını düşünürsek koddaki hata oram bayağı düşük olur.
o Kalite kuruluşlarından onay almak kolaylaşır: Standartlara uymanın dolaylı bir yararı da
kalite kuruluşlarının denetlemelerinde daha yüksek puan alabilmek ve kalite belgelerine
güvenilir biçimde ulaşabilmektir.
o Dokümantasyon kolaylaşır: Standartlar yorum satırlarına da bir düzen getirdiği için daha
sonra bu yorumlardaki bilgilerden faydalanarak tutarlı dokümanlar hazırlanabilir.
Dokümantasyon ile kod arasındaki uyumsuzluklar minimuma iner. 39
Kodlama standartlarının faydalarını inceleyecek olursak, standartlara
uyulduğunda (devam):
o Otomatik gözden geçirme gereçlerinin işi kolaylaşır: Standartlara uygun olarak
yazılmış bir kodu otomatik programlarla tarayıp değişik işlemler için kullanmak
kolaylaşır. Bu işlemler için örnek verirsek; satır sayısının hesaplanması,
hataların taranması, kodun karmaşıklığının hesaplanması, değişken
ilklendirilmemesi gibi hataların bulunması, vb.
o Kodun karmaşıklığı azalır: Standart kodlarda karmaşık yapıların kullanımına
izin verilmeyeceği için kodun karmaşıklığı azalır.
o Kodun güvenilirliği artar: Örnek vererek açıklayacak olursak gömülü
sistemlerde dinamik bellek ayrılmasına izin verilmeyeceği için gömülü
sistemlerin sahadaki korkulu rüyası olan null işaretçi hatalarına da rastlanmaz,
kritik bir sistemin sahadayken çökme ihtimali bir hayli azalır.
o Eğitim giderleri düşer: Projeye her yeni başlayan yazılımcı resmi veya gayri
resmi eğitim görür. Yani ya adı konmuş bir eğitim alır ya da kendisi projeyi hatta
kullanılan yazılım dilini öğrenmek için çalışır. Oysa standartlara uyularak yazılan
bir kod adeta bir eğitim kitabı gibidir; gerek yazılım dili gerekse projenin
detayları konusunda yeni başlayan elemana eğitim kaynağı olur. 40
Kodlama standartlarının faydalarını inceleyecek olursak, standartlara
uyulduğunda (devam):
o Bilgi birikimi sağlanır: Standartlara uyulan bir kod gerek hazır kodlanmış
algoritmalarıyla, tasarım desenleri ile gerekse sık yapılan hataların çözümleri ile yeni
yazılımcıya önderlik eder.
o İzlenebilirlik artar: Standartlara uyulan kodlarda gerekirse kod parçası- karşıladığı
gereksinim gibi özellikler not edilebileceği için gereksinimlerin karşılanıp
karşılanmadığını izlemek kolaylaşır.
o Farklı kaynaklardan gelen kodlan bir arada kullanmak kolaylaşır: Kodlama standartları
uygulandığında isim uzayları (name space) uygulanacağından aynı isimli değişkenlerin
çakışması engellenmiş olur. Örneğin A firmasının ve B firmasının kaynak kodlarında
“kullanıcıAdı” diye bir değişken olsa bile farklı isim uzaylarında olacakları için derlemede
sorun olmayacak ve kodlar birlikte derlenebilecektir.
o Koddaki hata miktarı azalır: Genelde kodlama standartları her yazılım dili için özel
olarak hazırlanırlar. Bu sayede, kodun yazımı sırasında oluşan hataların en aza
indirilmesi amaçlanır.
Kodlama standartlarınızı sadece bir proje için değil tüm projelerde kullanmak
üzere oluşturmalısınız. Projenin başından sonuna kadar standartlara uyumu
denetlemelisiniz, kodunuzu projenin en sonunda standartlara uydurmaya41
çalışmamalısınız.
Ne Gerek Var Dokümana Ben Varım ya
o Yazılım geliştirme dokümanları yazılımın tekrar edebilen bir başarıyı
yakalayabilmesi için gerekli öğelerinden biridir. Bu dokümanlar
sayesinde;
• Yazılımın takibi kolaylaşır,
• İş bölümü sağlanır,
• Yazılımın bakımı kolaylaşır,
• Yeni elemanların eğitimi kolaylaşır,
• Yazılımın yönetiminin yapılması, örneğin bütçesinin ve takviminin
hazırlanması kolaylaşır,
• İstatistiki veriler hazırlamak kolaylaşır,
• Kullanıcıların yazılımı öğrenmesi ve kullanması kolaylaşır.
" Siz bir düşüncenizi bir yere yazana kadar o düşünce bir fikir değildir."
Ivan Sutherland 44
Gerçekleme aşaması kodun yazılmaya başlandığı aşamadır.
Tasarımın belli bir seviyeye gelmiş olması gereklidir.
Gerçekleme aşamasında büyük risklerden biri izlenebilirliğin iyi
olmamasıdır. Bu aşamada herhangi bir anda gerçeklemenin ne
kadarının bittiğini ve geriye ne kadarlık iş yükünün kaldığını
belirlemek zor ve yapılması da o kadar önemli bir iştir.
Bu aşamada herhangi bir anda ne durumda olduğunuzu net
olarak bilirseniz, proje süresi hakkında çok gerçekçi
tahminlerde bulunabilir ve riskleri aşabilirsiniz.
Hiçbir Şey Yapmayan Bir Kod Yazın
o Bir projede sistem üzerinde koşturulabilen bir programı görmek
(program çok az iş yapsa ve hatalarla dolu olsa bile) gerek moral
motivasyon gerekse büyük resmi anlamak açısından çok faydalıdır.
o Kodlamaya başladığınızda ilk işiniz bir iskelet oluşturmak olsun.
o Derleme ve bağlama işlemlerinizi geçtiğinden emin olduğunuz bu iskelet
üzerinden kodlamaya devam edin.
o Daha sonra henüz içleri boş olan ana işlevlerinizi kodlayın. Bu anda da
kodunuzun derleme ve bağlama işlemlerinde takılmadığını gösterin.
o İçleri boş da olsa ana işlevleri kodlamak tasarımınızın sağlamlığını da
teyit eder. Henüz hiçbir iş yapmayan bu kodunuzu mümkünse çalıştırın
ve işlevlerin birbirini sağlıklı bir şekilde çağırdığından emin olun.
o Bu aşamada hiçbir iş yapmayan işlevlerin içine ekrana bilgi verici satırlar
döken satırlar ekleyebilirsiniz. Böylece kod akışını tespit edebilirsiniz.
Hiçbir Şey Yapmayan Bir Kod Yazın (devam)
o Özellikle çok kodlayıcılı sistemlerde iskelet oluşturarak kodlamanın çok
faydası vardır.
o Öncelikle motivasyon faydası vardır; çok az iş yapsa bile sonuçta
birşeylerin çalıştığını görmek ekip elemanlarının motivasyonunu
yükseltir.
o İkinci sebep de belli bir aşamadan sonra ekipteki her kodlayıcı kendi
kodunu bağımsız olarak kodlayabilecek ve test edebilecektir.
o Entegrasyon genelde çok zaman alıcı ve üstelik de planlara konulması
unutulan veya ihmal edilen bir safhadır. En başta iskelet oluşturup bu
iskelet sürekli derlenebilir ve çalıştırılabilir durumda tutulduğunda
entegrasyon süresinden de bayağı tasarruf edilir.
o Unutmayın ki tüm kod bir seferde yazılamaz. Programlar canlı
organizmalar gibi büyür ve gelişirler. Hiç kimsenin büyük bir adam/kadın
gibi dünyaya gelemeyeceği gibi programlar da önce bebek olarak
dünyaya gelmek zorundadır.
Yazılım Sürüm Tutma Gereçleri – Konfigürasyon Yönetimi
o Mutlaka bir sürüm tutma yazılımı kullanın.
o Sürüm tutma yazılımları 3 ve daha fazla kişinin bulunduğu
projelerde kritik öneme sahiptir ve kullanılmaları kaçınılmazdır.
o Ancak tek başına bile çalışıyorsanız bir sürüm tutma yazılımı
kullanmanızı tavsiye ederim.
Yazılımınızı Tek Bir Yerde Saklamayın
o Bilgisayarım çökecek mi diye düşünmeyin. Evet mutlaka çökecek.
Yazılımınızı mümkün olan en kısa periyotta yedekleyin.
o Modern editörlerin çoğu otomatik kaydetme (Autosave) özelliğine
sahiptir. Bu özelliği mutlaka açık duruma getirin ve örneğin her 10
dakika gibi bir saklama aralığı belirleyin.
İyi Kod Basit Olandır ( KISS Prensibi – Keep It Simple)
o Kodu yeni mezun olmuş birine verin. Eğer birkaç gün içinde adapte
olabiliyor ve kodu değiştirebiliyorsa kodunuz iyi bir koddur, eğer kodu
değiştirmek için uzman bekliyorsanız iyi bir kod değildir.
"Zarafet (Basitlik, sadelik, açıklık) çöpe atılabilir bir lüks değil, aksine başarı
ve başarısızlık arasındaki seçimi belirleyen bir özelliktir."
Edsger W. Dijkstra – Dijkstra Algoritması'nın yaratıcısı
"Eğer bir programın genel yapısını duş alırken tüm özüyle kavrayamıyorsanız o
programı kodlamaya hazır değilsiniz demektir."
Richard Pattis - University of California, Irvine
"Yazılım tasarımını kurabilmek için iki yöntem vardır: Birinci yöntemde tasarım
o kadar basit yapılır ki ortada hiçbir eksiklik kalmaz, ve diğer yöntemde
tasarım o kadar karmaşık yapılır ki ortada hiçbir eksik fark edilmez. Elbette
ilk yöntem daha zordur."
C.A.R. Hoare – Quicksort'un yaratıcısı
İyi Kod Anlaşılır Olandır
o Anlaşılır kod başkaları tarafından okunacağı düşünülerek yazılmış olan
koddur.
o Anlaşılır olması için mucizelere gerek yoktur; paragraf girintilerinin
düzenli olması, değişkenlerin iyi adlandırılmış olması, işlevlerin
(fonksiyonların) sadece tek işi yapması ve yine iyi adlandırılmış olmaları
vb. konulara dikkat etmek bile anlaşılırlığı gayet arttırır.
"Bir kodlayıcı kendi kodunu test etmek için uygun bir seçim değildir."
Weinberg Yasası
Testte dikkat edilecek konulardan bir diğeri de ürünün test ile
kapsanan kod miktarıdır. Yani testin kodun ne kadarındaki hatalarını
çıkarabildiğidir. Testin kalite unsurlarından biri de budur.
Ancak yüzde yüz test ne yazık ki mümkün değildir. Yazılmın
karmaşıklığı ve dallanıp budaklanma özelliğinden dolayı kodunuzu ne
kadar test ederseniz test edin mutlaka hatalar kalacaktır. Bu sebeple
testlerde öncelik ve kapsam belirlemek önemlidir.
"Bir insanın berbat yazılımı, diğer bir insan için tam zamanlı bir iş imkânıdır."
Jessica Gaston
Yazılım Kalite Unsurları
o Kalitenin birçok tanımı yapılmıştır. Bunlardan birkaçını sıralarsak:
• Kalite amaca uygunluktur.
• Kalite insanlar için değer taşımaktır.
o Yazılım kalitesini belirleyen birçok özellik vardır.
o Yazılım hemen hemen tamamen hatalarından arındırılmış olsa bile
kaliteli olmayabilir.
o Yani hatasızlık bir kalite ölçütüdür ancak kaliteyi belirleyen yegane
özellik değildir.
o Üstelik bu özelliklerden bazıları bir ürün için daha önemli iken bazıları
diğer bir ürün için daha önemli olabilir.
Yazılım Kalite Unsurları
o Yazılım kalitesini belirleyen özellikler büyük ölçüde McCall (1977) ve Boehm’in (1978)
çalışmaları ile belirlendi.
o Bu bilgilerden de faydalanarak yazılım kalitesini belirleyen unsurları şöyle
sıralayabiliriz:
• Anlaşılırlık (Understandability): Gerek sistem yazılımı, gerekse dokümanlar
anlaşılır ve açık mı?
• Tamlık (Completeness): Tüm gerekli bileşenler gerçeklenmiş mi? Sistem
kaynakları yeterli mi?
• Doğruluk (Correctness): Sistem kendisinden beklenen işlevleri doğru olarak
yerine getiriyor mu?
• Taşınabilirlik (Portability): Yazılım başka bir platforma taşınabiliyor mu?
Taşınamıyorsa bu belirtilmiş mi?
• Sürdürülebilirlik-Bakım yapılabilirlik (Maintainability): Yazılımın ileride çıkabilecek
sorunları kolayca çözülebiliyor mu?
• Test edilebilirlik (Testability): Yazılım kolayca ve doğru olarak test edilebiliyor mu?
• Kullanıma uygunluk (Usability): Yazılım kullanıcı dostu mu?
• Güvenilirlik (Reliability) ve Sağlamlık (Robustness): Yazdım kendisinden
beklenenleri gerek süre gerekse koşullara bağlı olmaksızın doğru olarak yerine
getirebiliyor mu?
• Etkinlik (Efficiency): Yazılım (bellek, mikroişlemci kullanımı, haberleşme ağ
kullanımı gibi konularda) hem etkin biçimde yazılmış hem de etkin bir biçimde
Yazılım Kalite Unsurları (devam)
• Güvenlik (Security): Yazılıma sadece yetkisi olan kullanıcılar erişebiliyor mu?
Yazılımın kendisi ve verileri yetkisiz erişime karşı korunuyor mu?
• Esneklik (Flexibility): Yazılıma gerektiği zaman yeni modüller veya işlevler kolayca
eklenebiliyor mu?
• Tekrar kullanılabilirlik (Reusability): Yazılımın modülleri veya tamamını başka
projelerde kullanmak mümkün mü?
• Tutarlılık (Consistency): Yazılımda kullandan değişken adları, matematiksel veya
çeşitli semboller ve ekrandaki elemanlar tutarlı ve birbiri ile uyumlu mu?
• Farkmdalık (Conciseness): İlgili ürün yazdım kuralları, standartları gözetilerek,
yeniden düzenleme ve optimizasyon kurallarına uyularak ve farkında olunarak
yazılmış mı?
• Erişilebilirlik-Edinilebilirlik (Availability): Yazdıma piyasada veya herhangi bir
kanalla erişmek kolay mı?
• Kurulabilirlik (Installability): Yazdımı kurmak kolay mı?
• Uyumluluk (Compatibility): Yazdım diğer sistemlerle uyumlu olarak çalışabiliyor
mu?
"Bir programı güvenli, güvenilir ve hızlı yapmanın tek yöntemi onu küçük
yapmaktır."
Andrew S. Tanenbaum
Kaliteli Kodlamada Dikkat Edilecek Noktalar ve İpuçları
Bu kısımda yazılımcılara daha kaliteli kod yazabilmeleri için her
seviyeden öneriler bulunmaktadır.
Yazdığınız Her Modül İçin Ayrı Bir Test Programı Yazmalısınız
o Burada modülden kastımız herhangi bir projede kolaylıkla
kullanılabilecek bir kütüphane kod birimidir. Örneğin bir dll (Dynamically
Linked Library) bir modül olarak kabul edilebilir.
o O halde tekrar ana konuya gelecek olursak kodladığınız her modül
(örneğin .dll) için bir test programı yazmalı ve modülü bu test programı
içinden koşturmalısınız.
o Bu test programını yazmak için harcayacağınız süre inanın yazmazsanız
daha sonra çıkacak problemleri düzeltmek için harcayacağınız sürenin
yanında çok küçük kalır.
Nasıl Yapılacağını Değil Ne Yapılacağını Kodlayın
o Kodunuzu gruplarken ne yapılacağına göre kodları gruplayın.
o Bir işin nasıl yapıldığını (yani detayları) kod içerisine yaymayın. İyi bir kod
alışveriş listesi gibi olmalıdır; “Bunu yap”, “Şunu yap”, “Onu yap” şeklinde
kodlanmalıdır.
o Örnek: Aşağıdaki kod birden ona kadar olan sayıların nasıl toplandığının
detaylarını gösteriyor, sanırım kodunuzu okuyanlar bu detayları çok da
merak etmiyorlardır, ilgilenenler de zaten detaylara bakacaktır.
Tekirdağ Namık Kemal Üniversitesi Çorlu Mühendislik Fakültesi Veri Yapıları Dersi Dr. Rabia KORKMAZ TAN
Ham Veriden Bilgiye Dönüşüm
Veri ham olarak 1 ve 0’ lardan oluşan bir dizi
şeklindedir.
Bit dizisinin anlamı bunun üzerine uygulanacak veri
yapısından ortaya çıkarılır; aynı bit yapısı değiştirilerek
farklı bilgi ortaya çıkmasına neden olur. Örneğin,
0100 0010 0100 0001 0100 0010 0100 0001
Bit dizisi ham bir veridir; bunun içerdiği bilginin ortaya
çıkarılması için bu bit dizisinin formatının bilinmesi
gerekir. Bu format da veri yapısının kendisidir.
Bu bit dizisinin farklı veri yapılarına göre farklı bilgiye
dönüştüğü birkaç örnek inceleyelim;
Ham veriden bilgiye dönüşüm
Bit dizilerinin ne anlama geldiği uygulanacak veri yapısından ortaya çıkarılır.
Aynı bit dizisinden veri yapısı (veri formatı) değiştirilerek farklı anlamlar
çıkarılabilir.
Örnek:
0100 0010 0100 0001
ASCII formatı Her 8li gruba 1 karakter B A
BCD (Binary Coded Decimal) Her 4lü gruba 1 hane 4 2 4 1
İşaretsiz tamsayı Her 16lı gruba 1 tamsayı 16961
9
ASCII Çevrimi
Bitler sekizerlik gruplara ayrılır ve herbir grup bir karaktere
karşılık düşer:
6
İkili sistemdeki sayıyı ondalık sisteme çevirme
1 0 1 0 0 1 1
26 25 24 23 22 21 20
1 x 26 + 0 x 25 + 1 x 24 + 0 x 23 + 0 x 22 + 1 x 21 + 1 x 20
= 1 x 64 + 0 + 1 x 16 + 0 + 0 + 1x2 + 1x1
= 64 + 16 + 2 + 1
= 83
8
Örnek: 'S' harfinin ASCII değerini (83) ikili sayı sistemine göre yazma.
Ondalık sayıyı ikili sisteme çevirme
Sayı 2’ye bölme Bölen Kalan Bit Sırası
83 83/2 41 1 0
41 41/2 20 1 1
20 20/2 10 0 2
10 10/2 5 0 3
8310 = 10100112
5 5/2 2 1 4
2 2/2 1 0 5
1 1/2 0 1 6
7
BCD (Binary Coded Decimal) Çevrimi
Bitler dörderlik gruplara ayrılır ve herbir grup bir haneye
karşılık düşer:
13 13/2 6 1 0
6 6/2 3 0 1
3 3/2 1 1 2
1 1/2 0 1 3
0,50 2*0,50 1 1 1
1310 = 11012
13,2510 = 1101,012
Sabit Noktalı Sayı
1101.01 = (?)10
1 1 0 1 . 0 1
23 22 21 20 2-1 2-2
1 x 23 + 1 x 22 + 0 x 21 + 1 x 20 + 0 x 2-1 + 1 x 2-2
= 8 + 4 + 0 + 1 + + 0 + 0,25
=13.25
Kayan Noktalı Sayı
Kayan noktalı sayılar gerçel sayıların bilgisayar ortamındaki gösterim
şekillerinden biridir.
Gerçek dünyada sayılar sonsuza kadar giderken, bilgisayar ortamında
bilgisayar donanımının getirdiği sınırlamalardan dolayı bütün sayıların
gösterilmesi mümkün değildir. Bununla birlikte gerçekte sonsuza kadar
giden birtakım değerler bilgisayar ortamında ortamın kapasitesine
bağlı olarak yaklaşık değerlerle temsil edilirler.
Bu sınırlamaların etkisini en aza indiren, sayıların maksimum miktarda
ve gerçeğe en yakın şekilde temsilini sağlayan sisteme Kayan Noktalı
Sayılar sistemi denir.
Kayan noktalı gösterim, kesrin yerini gösteren nokta bilgisinin
kaymasıdır. Örnek:
0,58 5,8 x 10-1 58 x 10-2 0,058 x 101
Kayan noktalı sayı formatı ve IEEE 754
8 bit 23 bit
i üs k
İşaret biti
k’nın 0,… ile başlayan bir ondalıklı sayı olana kadar sayı sırayla 2n
değerlerine bölünür:
n=1 3,14 / 21 = (1+k) ⇒ 1,57 = 1 + k ⇒ k = 0,57
Kayan Noktalı Sayı
Bu aşamada IEEE 754’e göre 3,14 = 1,57 x 21 bulunur.
i üs k
0 128 0,57
2.Adım: k = 0,... şeklinde bir tamsayı olarak bulunana kadar sayı 2n değerlerine bölünür:
0.085 / 2-1 = 0.17
0.085 / 2-2 = 0.34
0.085 / 2-3 = 0.68
0.085 / 2-4 = 1.36 ⇒ k = 0,36
i üs k
3. Adım: k = 0,36 üs – bias = -4 ⇒ üs = 127 - 4 = 123 0 123 0,36
0 01111011 ?
Kayan Noktalı Sayı
Çözüm:
Sayı = (-1)i (1+k) 2üs - bias
3.Adım: k = 0, 0000 1100 0000 0000 0000 000 ikili sayısını ondalıklı sayıya döndürmek için:
k = 2-5 + 2-6 = 1 / 32 + 1 / 64 = 0.03125 + 0.015625 = 0.046875
5
9