Cuma, Ağustos 03, 2007

Yazılım Projesi Nasıl Yapılır?

Bu yazımda bir yazılım projesinin nasıl oluşturulabileceğiyle ilgili önerilerimi anlatacağım. Uzun bir yazı olacak bu nedenle hiç süslü laflar etmeden direk konuya giriyorum. Öncelikli olarak aklımızda devamlı tutmamız gereken konu işi müşterimiz için yaptığımız. Müşterimizin genel anlamda yaptığı işi iyi anlamamız ve müşterimizin program kullanarak neyi amaçladığını anlamamız önemli. Problemi olmayan müşteri program satın almaz. Program istediğine göre mutlaka çözmek istediği bir problemi vardır. Müşteri birincil olarak işletmesinde hangi sıkıntının giderilmesi için program kullanmak istiyor? Müşterimiz sorunu güvenlik mi? Çalışma veriminin arttırılması mı? Daha çok para kazanmak mı? Eğer birincil amacı güvenlik ise müşterimiz; yetkiler, yedekleme, kullanıcınının hatalı veri girmesinin engellenmesi gibi konuların üzerine daha çok düşecektir. Belki istediği özellik işini yavaşlatsa bile buna razı olacaktır. Müşterinin sıkıntısı verimin düşüklüğü ise işlerin yavaşlamasına asla tahammül edemez. Müşterinin yaptığı şikayetler bizim bu konuyu daha iyi anlamamıza neden olacak ipuçları verecektir. Müşteriniz kasada biriken müşterilerden mi şikayet ediyor yoksa gözden kaçan mallardan mı? Buna dikkat etmek gerekir. Kısacası bir proje müşterinin ne istediğini anlayarak başlar. Sonrasında bizim müşterimizin iş yapma şeklini anlamamız gerekir. Eğer bunu yeterince anlamaz isek o zaman müşteri ile çok sık diyaloğa geçmek zorunda kalırız. Bu hem zaman kaybettirir hem de müşterimiz zaten bir işi yürüten bir insan olduğu için her zaman yüksek konsantrasyon seviyesinde olamayabilir. Sıkıntılı durumlar oluştuğunda müşteriye "ama siz böyle istemiştiniz" demek çözüm değildir çünkü bizim de birincil amacımız yazacağımız programla müşterinin yaşadığı sıkıntıyı çözmektir. Bu nedenle müşterimizin zaman zaman yanlış şeyler isteyebileceğini dahi dikkate almamız ve bu tür durumlara hazırlıklı olmamız gerekir. Yazının devamında bu konuya yine döneceğim.

Temel konuları hallettikten sonra sıra geldi projemizi oluşturmak için ilk adımları atmaya. Öncelikli olarak yapmamız gereken yazacağımız programları işyerinde kimlerin kullanacağını anlamak. Programı hangi tür kullanıcıların ne amaçla kullanacağını anlamak önemli çünkü program arabirimlerini kullanıcıların yapacakları işe göre tasarlamak gerekir. Kullanıcı çeşitlerini işyerindeki görevlerine göre belirliyoruz. Örneğin depocu, muhasebeci, kasiyer, satış temsilcisi,vb. gibi. Burada isimlerle değil direk görevlerle ilgileniyoruz. Kullanıcı çeşitlerini belirledikten bunların yapacağı işlerle ilgili bir liste çıkarmaya başlıyoruz. Örneğin depocu kullanıcısının yaptığı işler: irsaliye kesmek, depo girişleri yapmak, depo çıkışları yapmak gibi. Bu analizi yaparken müşterimizle yapacağımız görüşmelerin yanısıra direk kullanıcılarla da temasa geçmek çok faydalı olabilir. Eğer farklı kullanıcı tipleri aynı işleri yapıyorsa onları da öğrenmemiz lazım. Soru cevapları şu şekilde götürebiliriz. A kullanıcısı ne iş yapar? X işini yapar. Bu X işini yapan başka bir kullanıcı var mı? Evet bizim Mehmet de yapar. Mehmet ne iş yapar.... gibi.

Elimizde kullanıcı tipleri ve bunların programda yapacağı işlerle ilgili basit bir dökümanımız oluştu. Bu döküman işimizin aslında belkemiği çünkü projenin kapsamının ne olduğunu buradan anlıyoruz. Bu kapsamın dışına çıkmamamız hem bizim hem de müşterimiz açısından oldukça önemli. Şimdi işi bir adım daha ileri götürerek iş analizlerini yapacağız. İş analizini yapacağımız bir görev seçiyoruz. Öncelikle bu görevin işyerinin temel faaliyetini yürüttüğü görevlerden birisi olması gerekir. Örneğin bir mağaza ise kasiyerin satış kaydını girmesi ve tahsilat yapması birincil faaliyettir. Eğer bir restoran ise temel faaliyet müşteriden siparişin alınması ve masaya servisin yapılmasıdır. Bu tür bir temel görevle analizimize başlıyoruz. Restoran örneğini düşünelim. Garson görevi yürüten bir kullanıcı var. Garson kullanıcısının yaptığı işler: sipariş almak, siparişi mutfağa iletmek, sipariş hazırlanınca yemekleri masaya servis yapmak. Buraya kadarki analizi zaten önceki adımımızda yapmıştık. Şimdi en önemli analizimize geldi sıra. Bu işlerden birini seçeceğiz ve işi adım adım analiz edeceğiz. Örneğin sipariş almak. Yapacağımız iş garsonun sipariş alırken hangi adımlardan geçtiğini analiz etmek. Bu analizi yaparken garsonla kullandığı sistem arasındaki iletşimi baz alacağız. Tıpkı bir tenis maçı gibi top bir garsona bir sisteme geçecek. Bu şekilde ikisinin de hangi olaya hangi tepkiyi vermesi gerektiğini yazacağız.

1. Garson yeni sipariş komutu verir.
2. Sistem masa numarasını sorar.
3. Garson masa numarasını girer.
4. Sistem masayı aktifleştirir ve sipariş listesini açar ve listeye yeni bir satır ekler.
5. Garson sipariş listesine bir satır ekler.
6. Sistem siparişin türünü kontrol eder.
6a. Sipariş yemek siparişi:
6a1. Sistem 1 porsiyon mu 1,5 porsiyon mu olduğunu sorar
6a2. Garson porsiyonu girer.
6b. Sipariş içecek siparişi:
6b1. Sistem içecekte buz, limon veya ekstra şeker istenip istenilmediğini sorar
6b2. Garson tercihleri seçer.
7. Sistem siparişin satış fiyatını okur, siparişi listeye ekler, fiyatı günceller.
8. Sistem sipariş satış fiyatını hesaplar.
9. Tüm siparişler eklenene kadar 5. satırdan devam edilir.
10. Garson siparişi tamamla komutu verir.
11. Sistem siparişi kaydeder ve sipariş bilgisini mutfağa gönderir.

Bu listeyi oluştururken müşterimizle ve garson kullanıcısı ile direk temasa geçmemiz gerekir. Bu liste garsonun sipariş alırken yapacağı işlerin gösterildiği listedir ve projemizin en önemli parçası budur. Dikkat ederseniz listenin 6. adımında farklı durumlarda sistemin nasıl işleyeceği de gösteriliyor. 6. adımdaki kontrole göre 6a veya 6b adımlarından biri işletiliyor. Örneğin 6b2 adımında garsonun seçimi nasıl yapacağını da başka bir listede detaylandırıp buradan referanslayabiliriz. Bu durumda listelerimizin bir adı ve numarası olmasının büyük faydası vardır. Listelerle ilgili en önemli konu listelerin mutlaka sonlanmasıdır. Sonu olmayan listelerin programa vereceği zarar büyüktür. İçerdiği özellikler açısından mükemmel olan ama böyle bir işi sırasıyla yapmaya kalktığınızda zorluklar ortaya çıkan yüzlerce program vardır. Buna dikkat etmek gerekir. İkinci olarak da programa ekleyeceğimiz bir özelliğin listenin amacına ve bu listede gösterilen çalışma şeklinde bir değişikliğe yol açmaması gerekir. Bir özellik ekleyeceğimiz zaman önce listemizi güncellemeli, eğer çalışma şeklinde bir sorun yoksa programımızı güncellemeliyiz.

Programı yazmaya başlamak için daha fazlasına ihtiyacımız yok. Hemen bu listenin kodlamasına geçebiliriz. Bu arada listelerimizi de oluşturmaya devam edebiliriz. Sipariş alma işini tamamladığımızda hemen kullanıma hazır, müşteri ile oturup inceleyebileceğimiz ve baştan sona tamamlanan bir işi bitirmiş olacağız. Bunun projenin devamlılığı ve müşteri iletişimi açısından önemi çok büyük. Müşterimize ne kadar hızlı çalışan birşey gösterirsek o kadar hızlı yol alırız.

Bu liste programı nasıl yazacağımızı söylüyor aslında. Eğer nesne yönelimli programlama yapıyorsak Sipariş, Yiyecek, İçecek gibi sınıflarımızın olacağını, Yiyecek sınıfımızın porsiyon, içecek sınıfımızın da buzlu, ekstra şekerli, limonlu gibi özellikleri olacağını görebiliyoruz. Hatta listedeki 6a adımındaki dallanma yiyecek ve içecek sınıfımınızın ortak noktaları olduğu ve bunların ortak bir sınıftan türetilebileceği hakkında ipucu veriyor.

Eğer kodlarımızı test etmek için otomatik testler hazırlıyorsak yine bu listeler neyin test edilmesi gerektiğini bize çok iyi gösterir. Test hazırlamasak dahi programda kullanıcı testi yapan kişilerin sadece listelerin tamamlanıp tamamlanmadığını kontrol etmesi yeterli olur.

Sınıfların çıkarılması ve testlerin hazırlanması aslında üzerinde özellikle durulmayı hakeden konular. Şimdilik ana konumuza devam edelim.

Sıra listemizi kullanarak yapacağımız çalışmanın ana hatlarını ortaya çıkarmaya geldi. Öncelikle müşterimizin satacağı ürünleri ve bunların fiyatlarını tanımlayacağı bir yere ihtiyacımız var. Buna stok kartı diyebiliriz. Üzerinde sadece Ürün Kodu, Ürün Tipi ve Satış Fiyatı alanları listemizi tamamlamamız için yeterli. Dikkat çekmek istiyorum. "Gelecekte ihtiyacımız olacak" düşüncesi ile listemizle ilgisi olmayan özellikleri eklemememiz gerekiyor. Listemiz neyi gerektiriyorsa o kadarı. Diğer işler için oluşturacağımız listelerle birlikte zaten stok kartında olması gereken diğer alanlar da açılmış olacak. Müşterimize kalabalık ekranlar göstermenin daha iyi olacağını düşünsek bile kısa zamanda çalışan birşeyler göstermek her zaman müşterinin kendisini daha rahat hissetmesini sağlayacaktır. İkinci olarak siparişleri gireceğimiz bir listeye ihtiyacımız var. Listemizde Ürün Kodu, Açıklama ve Satış Fiyatı sütunları olacak. Açıklama sütununda siparişin tipine göre porsiyon veya içecek özelliklerini göstereceğiz. Bir dakika! Satış fiyatı sütunu mu? Listemizde Garsonun toplam sipariş tutarını görebileceği söylenmiş ama tek tek her siparişin fiyatlarının gösterilmesi söylenmemiş. Peki Satış Fiyatını koymayalım. Bu listeye de Sipariş Formu diyelim. Listemize göre ürün porsiyonunu ve içecek özelliklerini seçebileceğimiz iki küçük ekrana daha ihtiyacımız var. Stok Kartı olmadan Sipariş olmaz ama Sipariş olmadan Stok Kartı olabilir. Bu nedenle önceliği Stok Kartına vermek gerekir. Bu işleri liste haline getirirsek.

1. Stok kartlarının tasarımı ve veritabanı işleri.
2. Sipariş formunun tasarımı ve veritabanı işleri.
3. Sipariş formuna sipariş satırı eklenmesi ve stok kartından ürün kodu, fiyat bilgilerinin okunması.
4. Porsiyon ve içecek tipleri için Seçenek Formlarının hazırlanması.
5. Sipariş formuna sipariş eklenirken Ürün Tipine göre ilgili seçenek formunun gösterilmesi ve seçimin yapılmasının sağlanması.
6. Ürün tipi ile ilgili bilgilerin sipariş satırındaki açıklama sütununda gösterilmesi.
7. Porsiyon seçeneği de dikkate alınarak sipariş tutarının güncellenmesi.
8. Siparişin kaydedilmesi ve Mutfağa gönderme sistemine hazır hale getirilmesi.
9. Programa bir ana menü tasarlanıp Stok Listeleme, Ekleme, Düzenleme, Yeni Sipariş alma gibi komutların yerleştirilmesi.


Elimizdeki bu listeyi hemen kodlamaya başlayabiliriz. Tabii bu liste ekip halinde çalışıyorsak işleri ekip arkadaşlarımıza dağıtma anlamında da çok faydalı. Sadece hangi işin bitmeden hangi işin başlayamayacağını belirlemek yeterli. Ayrıca bu liste o kadar küçük parçalara ayrılmıştır ki her birinin ne kadar sürede bitebileceğini de kestirebilmek mümkündür. İşlerin bitiş ve başlangıç sıralarını da gözönüne alarak listeyi kodlamanın ne kadar sürebileceğini kestirebiliriz.

Kodlama işlerimizi tamamladıktan sonra listemizin ilk adımından başlayarak son adımına kadar denememizi yaptıktan sonra gönül rahatlığıyla işimizi bitirip sıradaki listemize geçebiliriz.

Anlattığım sistemi elimden geldiğince esnek tutmaya çalıştım. Siz bu yapıyı kendi ihtiyaçlarınız doğrultusunda istediğiniz şekilde daraltıp genişletmeniz mümkün.

a. Son listedeki iş parçalarını tek tek veya birleştirerek kartlara yazıp dağıtabilirsiniz. İş süreleri ile ilgili yaptığınız tahminleri de kartların üzerine yazarsanız gelecekte daha isabetli tahminler yapabilmenize faydalı olacak bir hafızanız da oluşmuş olur.
b. Bahsettiğimiz stok kartı, sipariş formu ekranlarının prototiplerini hazırlayıp kartlara iliştirebilirsiniz.
c. Veritabanı yapısını veya sınıf diyagramlarını üretebilirsiniz.
d. Kartlarla eşli programlama yapabilirsiniz.
e. Otomatik testler yapıp listelerin her adımının doğru çalışıp çalışmadığını test edebilirsiniz.
f. Liste adımları arasında detaylı açıklamaya ihtiyaç olan varsa onlar için akış diyagramları da oluşturabilirsiniz.


Ne sistem kullanırsanız kullanın sisteminizin en önemli parçasının müşteriniz olduğunu unutmayın.

1 yorum:

Umut Uygar dedi ki...

Çok işime yaradı, teşekkürler...