yazılım

Programlama öğrenmek ciddi bir süreç. Hele bir de hiç bilmiyorsanız nereden başlayacağınıza karar vermek çok daha kritik ve önemli bir dönüm noktası. Bizim eğitim dünyamızda Matematik gibi Programlama da ne yazık ki doğru yerden başlayarak öğretilmiyor. O nedenle Matematik düşmanı genç beyinler yetiştiği gibi Programlama bilmeyen/sevmeyen (hatta nefret eden) bilgisayar nesli yetişiyor. Oysaki anlamlı ve değerli bir hayat için Matematik neyse Bilgisayar Bilimleri için programlama da o.

Peki böylesine değerli bir konu nasıl öğrencilere aktarılmalı? Programlama sevdalı olmasa da, problem çözme yeteneği gelişmiş algoritmik düşünce ile yoğrulmuş gençler nasıl yetiştirilebilir? Öncelikle programlama dili eğitimi verilmeyerek başlanabilir. Evet yanlış okumadınız programlama dili bilmek veya öğrenmek demek programlama bilmek demek değil. Büyük yanılgı buradan başlıyor.

Programlamanın en temelinde aslında “problem çözme” eylemi var. O nedenle öncelikle problemi tespit edip analiz etme, onu parçalara ayırma işin ilk aşaması. Problemi doğru kavramadan programlamanan bir çok yazılım hayatımızı kolaylaştırmaktansa yeni problemler yaratıyorlar. Oysa ki doğru çözümlenmiş bir problem nereden nasıl başlanacağı konusunda önemli ipucuları vermektedir.

İkinci aşamada ise,  çözüm metodlarının karar verilmesi geliyor. Çözüm metodlarının kara verilmesi ve değerlendirilmesi ise tasarım disiplininin kapsamında değerlendirilebilir. İşte bu noktada, yazılım mimarisinin rolü başlar. Tabii tasarım süreci ile mimarisini birbirine karıştırmamak gerek. Mimari de meseleyi detaylıca hem teknik hem de içerik açısıından irdelemeye başlanır. (Tasarım kelimesini de sakın ha grafik arabirim tasarımı olarak algılamayın :) )

Yazılım geliştirme yerine yazılım tasarımı ve yazılım mimarisi ilkelerini öğrenmek ile yola başlamak çok önemli ve değerli. Böylece programlama dilinden bağımsız olarak yola nasıl çıkılacağı, bir fikrin nasıl yazılıma adapte edileceği konusunda deneyim elde etmek mümkün. Çünkü veri yapıları ve tipleri ile haşır neşir olmak yazılımın sağlıklı geliştirilmesi için de önemli bir unsur.

Yazılım mimarisi şunları içerir :

  • Sistemin organizasyonu hakkında önemli kararlar
  • Sistemin önemli yapısal elementleri ve bunların arayüzleri ile birbirleri arasındaki etkileşim
  • Sistemin önemli yapısal ve davranışal elemanlarının altsistem’lere dağılımı

Yazılım mimarisi yapı ve davranışların yanı sıra kullanılabilirlik , fonksiyonalite , performans , esnekllik , yeniden kullanım , anlaşılırlık , ekonomik ve teknolojik kısıtlar gibi özellikleri de yansıtır.

Tüm bu özellikleri ile “Yazılım Mimarisi” sistemin anayasasıdır. Tüm yazılım geliştirme sürecinin merkezinde durur ve her türlü faliyete kılavuzluk eder.

Kısaca, yazılım mimarisi bize sistemin karmaşıklığını yönetmek ve bütünlüğünü korumak için , kontrol edilebilir bir yapı sunar.

Ayrıca artık sadece bunlarla başlamak yeterli olmuyor. Modern programlama dillerin artık hepsi nesne tabanlı geliştirme olanakları sunuyorlar. O nedenle nesne tabanlı programlama yaklaşımını benimsemek ve öğrenmekte başlangıç sürecine dahil edilebilir.

En son elde edilen tüm bu tecrübeler nasıl bir programlama dili ile birleştirilecek ona karar verilmeli.

 

 .

02 Temmuz 20140 commentsDevamı

Bilgisayar ile ilgili meslekleri düşünüldüğü zaman akla ilk gelen seçeneklerden biri her zaman programcı (diğer bir tabir ile geliştirici) olur. Kimilerine göre bir yaşam tarzı kimilerine göre ise bir kimliktir. Bu meslek erbabına sahip insanlar kimi zaman asosyal olarak yorumlanırken kimi zamanda kendilerini ifade etmekte zorlandıklarına dair düşünceler ortaya atılır. İşin müptelalarının ve duayenlerinin çeşitli metaformozlar geçirdiği ve katilden farksız olduğu bile iddia eden kimi uygulamalar mevcuttur. Ama işin özüne baktığınız zaman hayatın tam ortasında yatan bir derde çare bulmaya çalışır; problemlere çözüm üretebilmek”

İnsanoğlunun mayasında olan manayı bırakıp iskelete bağlanma çabası bu durumda da ayan beyan kendini gösterir. Programcıların bilgisayar başında harcadıkları saatleri, basit bir hatayı çözebilmek için sarfettikleri çaba gözleri korkutur. O nedenle bu bilişim dünyasına hayat veren bir ve sıfırların ete kemiğe büründüğü yazılım geliştirme alanı pek sevilmez.

Bu yazıyı da aslında o kadar korkulacak bir şey yok diyebilmek için yazıyorum. Hem modern tabiri ile yazılım geliştirmenin özünde programlamanın nereden nasıl başlanacağına dair giriş niteliğinde ısındırma yollarını tarif edeceğim.

1. Şu hayatta en azından bir tane bile problem çözdüyseniz, siz de bir programcısınız!

Evet acı ama gerçek olan bu. Hayat biz plan yaparken başımıza gelen olayların tümü ya, o nedenle problemsiz bir hayat düşünülemez. Yaşadığımız her gün onlarca sorun ve dert üzerine kafa yoruyoruz. Kimi zaman problemlerimiz ölçülebilir değerler barındırırken kimi zaman da sadece iç sıkıntısı ile manevi kaynaklardan ortaya çıkmış olabiliyor. Bir şekilde yaşamaya devam edebilmek için de tüm bunların üstesinden gelebilmek için gayret sarf ediyoruz. O nedenle size söylenen dilleri, yazım kurallarını unutun! Eğer hayatınızda en azından bir problem bile çözdüyseniz, demek ki için de canavar bir programcı yatmakta. Proglama yeteneğinin özünde saklı olan formül bize problem çözebilme yeteneği olarak tespit edebilme. Ne kadar hızlı ve doğru olarak problemi giderebiliyorsanız o kadar bu yolda yol kat edebilirsiniz. Türkiye’deki en büyük eksiklik yazılım alanındaki problemler gösterilmeden A,B,C dilleri ile yola çıkmak. Oysaki tüm dillerin çare bulduğu sorunlar hep aynı. Sadece söyleme şekilleri farklı. O nedenle algoritma dediğimiz sihirli bir yapı ile problemlerin nasıl çözebileceğimizi öğrenmemiz gerek. Daha sonra da bilgisayara doğru bir şekilde anlatabilmek için programlama dillerine başvurmalıyız.

Haydi bir de şu yöntemle problemlere bakalım; Günlük hayatta çözdüğümüz problemleri adım adım kağıda yazarak düzenleyin. Eğer problem gözümüze büyük geliyorsa problemi meydana getiren sorunları küçük parçalara bölelim. Tek büyük bir problemi parça parça bölelim. Her küçük parçayı çözümleyip büyük sorunu ortadan kaldırmaya gayret edelim. Tüm yaptıklarımızı da kağıt üzerine ister şekillerle, ister düz yazı ile not edelim. İşte hepsi bu!

2. Bir yerlerden başlamak için ısındırma kitapları

Yola devam etmek için bir nebze uzman desteği almak her zaman iyidir. Malesef programlama becerisi ve yazılım geliştirme teorileri üzerine çok sayıda Türkçe kitabımız yok. Özellikle basit bir dil ile neyin nasıl yapıldığını anlatan bir kitabımız yok. Bu noktada biraz İngilizce bilmenizin paha biçilmez olacağının altını kuvvetle çizmek isterim. Çünkü bu alanda yapacağınız çalışmalarda size destek olacak tüm doyurucu kaynaklar hepsi ama hepsi İngilizce. Örneğin, programlamaya başlamak istiyorum ama nereden nasıl olacağını bilmiyorum diyorsanız, O’Reilly başucu kitabı sayılacak Code Simplicity‘i bir an olsun yanınızdan ayırmayın derim. Programlama düşüncesi ve sanatını hiç derinlere inmeden size anlatan bu kaynak manayı çöze bilmenize yardımcı olacaktır. Kitabın konularından yola çıkarak yapacağınız küçük çaplı bir amazon araştırmasında bile başka yayınevlerinin birçok benzer nitelikle kitabı olduğunu an be an görebilirsiniz. Onlara da bir göz atmanızı tavsiye ederim.

3. Sevdiğiniz ortamı ve medyayı belirleyin!

İlk projenizi gerçekleştirebilmek için oturup ANSI-C ile makina dilinde geliştirme yapmanız gerekmiyor! Gelişen teknoloji ve büyüyen komüniteler sayesinde programlama dilleri de gelişti ve çoğaldı. Eskiden low-level diyebileceğimiz 1-2 dil varken artık onlarca dil ve platform arasından size en uygun olanını seçebiliyorsunuz. Bu karışıklık ve çeşitlilik içerisinde en doğru yolu bulabilmek için ilk yapmanız gereken; projenizi hangi medya veya aygın için geliştirmek istediğinize karar vermek olacaktır. Bu seçimi yaptıktan sonra o aygıt veya medya için özelleşmiş geliştirme ortamlarını incelemeye başlayabilirsiniz. Bu noktada yazılım geliştirme uzmanları için verilen iş ilanları da size yol gösterebilir. Örneğin, projeniz web tabanlı bir sistem ise, sizin için uygun olan sunucu dillini tespit edebilmek için bu konuda verilen iş ilanlarına bakmak oldukça yol gösterecektir. Türkiye ekseninde günümüzde sunucu dili için verilen ilanlara baktığınız zaman “.net platformu” ve “php ortamının” yaygınlığı gözünüze çarpacaktır. Buradan hareket ile İnternet üzerinde ufak bir araştırma ile sizin için en doğru dili bulabilirsiniz. Bu seçimi yaparken faydalanabileceğiniz bir diğer yöntem ise sizin projenize benzer nitelikteki projelerin altyapılarını ve kullandıkları teknolojileri incelemek olacaktır. Bu sayede hangi programlama platformundan başlayacağınıza hızlı bir şekilde karar verebilirsiniz.

4. Programlama dilini öğrenmeye çalışmayın, proje geliştirin!

Yapılan tüm araştırmalar gösteriyor ki programlama için en iyi öğrenme metodu sadece ve sadece oturup proje geliştirmektir. Bu işin başka bir yolu yok malesef. Eğer farzedelim, php öğrenmek için video derslerini takip edeceğim kitaplar okuyacağım derseniz, “çöpe atacak bol bol vaktiniz var demek ki” derim. Çünkü bir programlama diline hakip olabilmek için çılgınca not tutmak veya onlarca kitap okumak hiçbir anlam ifade etmez. Eğer öğrenilen yabancı dilde olduğu gibi kullanılmayan bilgi, kelime, ifade zihni yoran çöpten başka bir şey olmayacaktır. O nedenle bir dile hakim olabilmek için o kadar çok kullanmanız yani proje geliştirmeniz gerekmektedir. Ancak dilin sınırlarını ve kabiliyetlerini bu şekilde görebilecek ve fark edebileceksiniz.

5. Çalışacağınız ortam için şartları belirlemek

Bir programcının en büyük gücü sahip olduğu IDE’dir. IDE programlama serüveninin gerçekleştiği ortamdır. “integrated development environment”, “integrated design environment ” veya “integrated debugging environment” gibi açılımlara sahip yazılım geliştiricilerinin proje geliştirmesinde onlara yardımcı olan yazılımlara, ortamlara verilen addır. En basit haliyle; notepad’dir, word’dür. Zamanı gelince saatlerinizi, günlerinizi başında geçireceğiniz bu ortamın en iyi koşullara sahip olması gerekir. Bu koşullar kişiden kişiye beklentileri ölçeğinde değişir. Başka bir yazının konusu olan IDE seçimi önemli ve göz ardı edilmemesi gereken bir iş ortağı seçimidir.

6. Deadline ile erken tanışmayın, acele etmeyin

Programcının en büyük düşmanı deadline’lardır yani teslim zamanları. Bu o kadar kabus hale dönüşür ki, programcıların durmadan çalışmasına sebep olan en büyük ve kritik etken halini alır. Programlamaya başladığınız ilk adımınızda bir öğrenci olduğunuzu unutmayın, kendinizi kesinlikle bir ticari yazılım geliştirme süreci içerisine dahil etmeyin. Öğrenim sürecinde olabildiğince emin ve sakin olarak ilerleyin. Çözümlediğiniz problemleri iyi tespit edin ve doğru bir şekilde öğrene bildiğinizden emin olun. Sakin olun, sabırlı olun, detayları görebilmek ve çözümleyebilmek için olabildiğince ter dökün.

7. Son bir öneri; Janki Method

En son ipucu bir metod önerisi olacak; Janki Method. Ünlü ve yetenekli bir Ruby programcısı olan Jack Kinsella’nın beyin mıncıklayıcı metodu Malcolm Gladwell’ın Outliers adlı kitabında söylediği ustalaşmak için geçirebileceğiniz 10.000 saati üretken bir programcı olabilmeniz için tarif ediyor. En azından ufuk çizginizi yeniden biçimlendirmenize olanak sağlayacak bu metoda bir göz atmanızı tavsiye ederim.

8. Soru sormaktan çekinmeyin

Soru sormak hayatın merkezinde olan bir olay. Programcı için de can simiti niteliği barındırıyor. O nedenle hiçbir zaman soru sormaktan çekinmeyin, daima sorun. Sorulan soruları inceleyin. Bunun için muhteşem bir kaynak olan stackoverflow.com sık sık ziyaret edin. Sizin yaşadığınız problemin bir benzerini bir başkası da yaşamış olabilir, o nedenle daima sorulan soruları incelemeniz de fayda var.

 

Son cümleler…

Öğrenme çok kişisel bir süreç. Burada bahsettiğim metodlar, benim gözlemlerimden ve araştırmalarım kapsamında tespit ettiğim notlar. Tamamı veya bir kısmı sizin için uygun olabilir. Ama programlama ve program geliştirme önemli bir davranış şeklidir. Herkesin bir miktar sahip olması hayatına büyük bir renk katacaktır.

Sizde neden programlamayı sevmediğinizi? ya da nerelerde zorlandığınızı? ya da öğrenme süreçlerinizden bahsederseniz çok mutlu olurum.

 .

23 Ocak 20132 commentsDevamı

Bu sene doktorada epeyce bir zorlandım. Hatta zorlanmaya da devam ediyorum. Tüm derslerin oldukça fazla yükü vardı. Proje geliştirmesinden tutunda araştırmasına kadar eski öğrencilik günlerimi tekrardan hatırladım. Bu dönem içersinde uykusuz gecelerim ve allak bullak günlerim oldu. Zaten bol koşuşturmalı olan günlük periyoduma, bir de bu tip kariyer yükleri binince şenlikli bir süreç geçirdim, anlayacağınız.

Bu dönemin ilk meyvelerinden birini sizlerle paylaşmak istedim. 2011 Bahar dönemin derslerimden biri de Doç. Dr. Murat Erdal‘ın yürüttüğü E-İş dersiydi Bu ders kapsamında bilişim sektöründe tedarikçi analizi, performans değerlendirmesi, performans kartları ve sözleşmeler üzerine çalıştık.

Sektörü farklı bir bakış açısıyla incelemek ve yeni değer yargılarını tespit etmek adına oldukça faydalı bir ders süreci geçirdim diyebilirim. Yazının bundan sonra okuyacağınız kısımı bu dersin ilk meyvesi olan “bilişim sektöründe yapılan sözleşmeler” üzerine bir özet niteliği taşımakta. Günümüz Türkiye’sinde özellikle yazılım sektöründe yapılan sözleşmeler tek taraflı, üreticiyi korumak yönünde. Oysa ki üretici kadar en az alıcının da hakları ve şartlarınında gözetilmesi gerekmekte. Yurtdumda ne yazık ki bu yazılı süreç hala ağızdan çıkan sözlere bağlı. Henüz yaygın bir sözleşme kültürümüz yok. Sözleşme tabiri, kurumsal ve yaptırım gücü yüksek olan firmaların literatüründe mevcut. Bunun giderek yaygınlaşması ve gerekli hukuksal süreçlerden geçirilmesi gerek.

Ama ne ironiktir ki, sözleşmelerden bahsederken benim güzel memleketim, hiçbir kullanıcı grubu yorumu almaksızın ulusal nitelikte filtre uygulamalarına muhatap kalıyor. Hadi bilgi edinme, bilgi sahibi olma gibi temel vatandaşlık haklarını bir yana bıraktım, en basitinden tüketici haklarına (tüketici çünkü bu interneti kullanmak için çatır çatır vergiler alınıyor) bile uygunsuz bir hareketten bahsederken yazılı kültürümümüz perçinlemek tabii ki zor. Neyse bu konuya geri döneceğimi hatırlatarak biz asıl meseleye geçelim.

Bilişim Sektöründe Yapılan Sözleşmeler

Yazılım geliştirme sürecini ve sonunda elde edilen ürünün kapsayan çok çeşitli sözleşme tipleri vardır. Fakat en kaba haliyle genel olarak bakıldığı zaman 2 ana kategori altında toplanabilir. Bunlardan birincisi satıcının herkes için ortak hazırladığı bir sözleşme tipidir. Sahip olduğu kriterler geneldir. Teklif yazılım satıcısı tarafından hazırlanır. İkinci kategoriye giren sözleşmeler ise alıcının belirlediği ihtiyaçlara göre özel olarak değerlendirilen ve hazırlanan yazılımlar için hazırlanan sözleşmelerdir. Bunda teklif alıcı tarafından hazırlanır.

Sözleşme tiplerine baktığımız zaman;

1. Ürün sözleşmesi, garanti ve lisans sözleşmeleri: Bu sözleşmeler ürün sahibi ile alıcı arasında yapılan anlaşmalardır. Satın alınan donanım ürününün garantisi, yazılım lisansları bu sözleşme türüne birer örnektir. Bu sözleşmeler alıcı tarafından imzalanmaz. Ürünü aldığı takdirde veya yazılımı kullanmaya başladığı andan itibaren geçerli olan sözleşmelerdir. Alıcının detaylı ihtiyaçlarını kapsayan özel ürünler için kullanılmaz. Genel amaçlı satın alma süreçleri için geçerli değerler barındırır.

2. Ürün tedarikçisi için sözleşmeler: Bu sözleşmeler alıcı için belirli bir ücret ve şartlar içermektedir. Tedarik sözleşmeleri bu nedenle yazılım distribütörü veya yazılım tedarikçisi ile alıcı arasında yapılan anlaşmalardır. Satış sürecine odaklanır, ürünün fiyatı, temini, ödeme biçimi gibi maddeler barındırır. Garanti veya lisans üzerine herhangi bir şart barındırmaz. (Bu sözleşmeler direk yazılım üreticisi ile alıcısı arasında yapılan anlaşmalardır. 1. Tip anlaşmalar )

3. Ürün tedarikçisinin hizmet sözleşmeleri : Alıcının ihtiyaçlarına yönelik hazırlanmış hizmetleri kapsayan sözleşmelerdir. Birçok farklı tipi vardır.

a. Tek seferlik hizmete hazır hale getirme (one-time deployment services ): Bir sefere mahsus yazılımın kurulumu ve hizmete hazır hale getirilmesi sürecini kapsayan sözleşmelerdir. Gerekli ayarların ve donanım optimizasyonunun yapılması içerir.
b.
Tek seferlik eğitim hizmeti (one-time training services): Alıcı firmanın çalışanları için tek seferlik verilen kuruma özelleştirilmiş eğitim içeriğinin barındırır.
c.
Yönetim Hizmeti (managed Services): Alıcının IT altyapısına yönelik bakım ve ihtiyaç analizlerini kapsayan süreçler üzerine yapılan anlaşmalar için kullanılan sözleşmelerdir. Bu sözleşmelerde alıcı firmanın hem yazılım hem de donanım altyapısına yönelik iyileştirmeler ve bakım ihtiyaçları karşılanır.
d.
Dış tedarik hizmetleri (outsourced services): Alıcı firmanın kendi hizmet içi ihtiyaçlarına yönelik alınan hizmetler için yapılan sözleşmelerdir.
e.
Yazılım Bakımı (software maintenance): Kullanılan yazılımın bakım ihtiyaçlarını kapsayan sözleşmelerdir. Hem özelleştirilmiş yazılımların hem de paket yazılımların bakım ve ihtiyaç gereksinimlerini karşılar.

Hizmet sözleşmeleri yapıldığı bölgeye göre ve hizmetin içeriğine yönelik özelleştirilmiş şartlar içerebilmektedir.  Ama genellikle ücret, işin tanımı, temini, varsayımları, gereksinimleri, öngörülen çalışma takvimini ve gerekli yasal süreçleri üzerine ilgili şartlar ve maddeleri barındırır.

4. İhtiyaca yönelik özel geliştirme veya destek çözümleri için sözleşmeler: Bu sözleşmeler satıcıların alıcılar için yapacağı özel işlerin yapılabilmesi için gerekli maddeleri barındırır. Genellikle birkaç sözleşmenin birleşmesinden meydana gelir. (hizmete hazır hale getirme sözleşmesi + ürün tedarik sözleşmesi gibi). Bakıldığı kadar da basit değildir. Çünkü hem alıcı hem de satıcı yakın temas çalışmak zorundadır. Gerekli ihtiyaçlar net bir şekilde tanımlanmalı ve sorumluluklar taraflar arasında eşit niteliklerde paylaştırılmalıdır. Yapılan işin entelektüel sahibinin hangi taraf olacağı net olarak belirtilmelidir. Çünkü kullanım hakkı ile sahiplik hakkı aynı değerleri taşımaz.

Bir de mühendislik tabanlı geliştirme süreçlerini barındıran anahtar teslim projeler için hazırlanmış sözleşme formatları vardır.

  1. Sabit Fiyatlı Sözleşmeler (lump sum contract/ fixed fee contract): Kapsamı net olarak tanımlanmış projeler için kullanılan sözleşmelerdir. Proje kapsamı yeteri kadar tanımlanabildiği için gerekli olan çalışma takvimi ve ücreti net olarak belirlenebilir.
  2. Birim Fiyat Sözleşmeleri (unit price contract): Projenin sahip olduğu niceliklere göre tanımlanan sözleşmelerdir. Bu nicelikler üzerinden çalışma takvimi hazırlanır. Pey der pey geliştirilen projeler için uygun olan sözleşmelerdir. Her adım ayrı tanımlanır ve şartlandırılır. Ona göre sözleşme bazlı olarak proje tamamlanır.
  3. Ek ücret sözleşmeleri (cost plus contract): Proje içersinde öngörülmeyen ve geliştirme sürecinde projeye dahil edilen tüm malzeme veya iş gücü ihtiyaçlarının ekstra olarak hesaplanması için yapılan sözleşmelerdir. Bu sözleşme proje durumuna göre farklı tiplerde gerçekleştirilebilir.
    Cost + Fixed Percentage Contract
    Cost + Fixed Fee Contract
    Cost + Fixed Fee with Guaranteed Maximum Price Contract
    Cost + Fixed Fee with Bonus Contract
    Cost + Fixed Fee with Guaranteed Maximum Price and Bonus Contract 

    1. Teşvik Edici Sözleşmeler (Incentive Contracts): belirlenen hedefe, bütçeye veya çalışma takvimine göreperformansdeğerlendirmesiüzerine yapılan sözleşmelerdir.Bu sözleşmelerin2 ana kategorisi vardır.
      a.Fixed Price Incentive Contracts:
      belirli bir ücretin üzerine belirli bir performans gösterilmesi beklenen sözleşmelerdir.
      b.
      Cost Reimbursement Incentive Contracts: tarafların görüşerek karar verdikleri bir ücret, gösterilecek olan ekstra performans ile ilgili olarak bir formül geliştirilir. Bu formül ile minimum ve maksimum limitler belirlenir. Proje sonunda da gösterilen performansa göre bu formül uygulanır.

.

20 Haziran 20110 commentsDevamı
View Sidebar