Genelde olduğu üzere, şurada okuduğum bir yazıdan esinlenerek (çevirisini deburada gördüm daha sonra) bu işe kendi bakışımdan bir değinmek istedim.
İlk olarak ben her yazılımcının bunları bilmesi gerekir mi bilemiyorum. Ama genel olarak bilinmesi gerektiğine katılıyorum. Bir diğer nokta, uygulama geliştirilen platform farkı. Temel olarak iki çeşit uygulama türünden bahsedebiliriz:Stateless(durağan) ve UnStateles(durağan olmayan) uygulamalar. Gerçi günümüzde gitgide bu fark ortadan kalkıyor gibi ama daha çok var. Web uygulamaları durağandır. Yani yazılan kod belirli işlemlerden sonra render edilerek HTML’e dönüştürülür. Hafızada tutulmaz (bazı durumlar hariç). Durağan olmayan yapıda ise, uygulama bellekte çalışır halde bulunur ve işlemler oradan halledilir. Bu iki çeşit arasında bilinmesi gereken şeylerin büyük farklılık göstereceğini tahmin edebilirsiniz.
Neyse, konumuza dönersek :
1 ) İlişkisel Veritabanları (Relational Databases)
Günümüzde birçok veritabanı sistemi bulunmaktadır. Bunlardan en sık kullanılanı hiç kuşkusuz ilişkisel veritabanı sistemleridir. Örnek olarak, Microsoft SQL Server,Oracle , Mysql vs verilebilir. Buradaki mantık, tablolar arasında ilişkiler kurarak veri bütünlüğü, sınıflandırılabilirliği, kısıtlamaları gibi olayları sağlamaktır. Bu şekilde indekslenmiş yapılar kurulabilir, veritabanlarının yönetimi ve programlaması kolaylıkla gerçekleştirilebilir. Günümüzde hemen her veritabanı uygulamasında (özellikle ülkemizde) bu sistemler kullanılmaktadır. Bu sebeple kesin bilinmesi gerekenler listesine yazılabilir.
2) ORM (Object Relational Mapping)
Veritabanına erişim konusunda ortaya atılmış bir kavram ORM. Hafızada veritabanı tablolarının şemalarını oluşturarak (bunları sınıflara çevirerek), tam manasıyla nesneye yönelimli bir yapıda veritabanı işlemlerinin gerçekleştirilmesini sağlar. Burada SQL sorguları yerine direkt hafızadaki nesnelerle çalışılıp, oluşan data son safhada veritabanına gönderilir. ORM sistemleri kriter denilen parametreler alarak, filtreleme ve ilişkisel yapıları kullanma olanağı sunalarlar. En bilinen ORM sistemleri; Hibernate, LinqToSQL (aslında bunun bir ORM sistemi olup olmadığıyla ilgili çok tartışma var.), EntityFramework, XPO dur. Bunların haricinde de çok ciddi ORM sistemleri vardır. Bu yapının en büyük dezavantajı, verileri tamamen hafızada tuttuğu için, büyük çaplı verilerde yavaş olmasıdır. (bkz)
3 ) Güvenlik
Gerek desktop, gerek web uygulamalarında güvenlik artık çok önemli bir hale geldi. İnsanlar günlük hayatlarında ve çalışma hayatlarında bilgisayarları kullanmaya başladıklarından beri, üzerinde çalıştıkları ya da depoladıkları verinin önemi her geçen gün arttı. Büyük bir kamu kurumunun sayısal ortamda tutulan bir yıllık muhasebe kayıtlarının silindiğini bir düşünün. Bu ve bunun gibi birçok senaryo günümüzde pek olasılık dışı değil. Bu sebeple uygulama güvenliği çok önemlidir. Her yazılımcı en azından temel düzeyde de olsa, yazılım geliştirdiği ortamla ilgili güvenlik kurallarını bilmelidir. Yoksa sonuçları çok kötü olabilir. Hiçbir yazılımcının yazdığı uygulamanın lamerlar tarafından ele geçirildiğini görmek isteyeceğini sanmam. Ayrıca Authorization ve Authentication ında önemi unutulmamalı.
4 ) Veri Yapıları (Data Structures) ve Algoritma
Veri yapıları programlamanın temel taşıdır. Bu konuyu kesinlikle her yazılımcının sular seller gibi bilmesi ve kullanması gerekir. Verileri sınıflandırmak ve onları düzenli bir şekilde kullanmak çok önemlidir. Bana göre gerçekten iyi programcılar, veri yapılarını çok iyi kullanabilen programcılardır. Burada veri yapıları derken sadece çoğu dilde size hazır olarak sunulmuş veri yapıları kalıplarının kullanımından bahsetmiyorum. Konu olarak veri yapılarını kavramalı ve gerekirse kendi veri yapılarınızı tasarlayabilmelisiniz. Özellikle hafızaya çok yüklenecek yazılımlar üzerinde çalışırken (oyunlar gibi) veri yapıları daha bir önem kazanır. Algoritma konusunda ise söylecek pek birşey yok. Bütün programcılarda bulunması gereken bir yetenek olmalı.
5 ) Katmanlı Mimari
Katmanlı mimaride temel amaç, uygulamanın belli başlı alanlarını birbirinden ayırarak aşağıdaki avantajları sağlamaktır :
- Kolay geliştirme,
- Kolayca değiştirme ve yeni eklemeler yapma
- Kod içerisinde hakimiyet
- Tekrarlardan kaçınma
- Birbirinden bağımsızlık sayesinde biçok yerde kullanabilme
Veritabanı uygulamalarında genelde 3 katman üzerinde durulur. Tabiiki programcının kurduğu yapıya göre bu farklılık gösterebilir. Bunlar :
- DAL (Database Accsess Layer – Veritabanı Erişim Katmanı)
- Bussiness Logic (İş katmanı)
- UI – (User Interface ya da GUI – Kullanıcı Arabirimi)
6 ) Test
Yazılım geliştirmeyle test elbetteki ayrı işlerdir. Aslına bakılırsa ayrı uzmanlık alanları gerektirir (Tıpkı kalite mühendisliği ya da analistlik gibi). Fakat her yazılımcı testten anlamak zorundadır. Nasıl test yapılmalı veya test yaparken nelere dikkat edilmelidir? gibi soruların cevabını verebilmelidir. Özellikle ülkemizde test mühendisi pek yaygın bir kavram olmadığından bu gereklidir. Unit test, fonksiyonel test, sistem testi gibi birçok test şekli vardır. Bunların en azından ne oldukları konusunda bir fikir sahibi olunmalıdır. Test yapmak için belirli otomatik araçlarda kullanılabilir (örn: JUnit , NUnit, MbUnit, ZaneBug, TestDriven.Net, Visual Studio Team Test Edition) (ayrıca bkz. Unit Testing vs Functional Testing, Otomatik Test Araçları ve Portalı )
7 ) Programlama Yaklaşımları, Desenler ve Yazılım Mühendisliği
Bu başlıkları sanırım aynı yerde ele alabiliriz. Programlama yaklaşımları, bir yazılımın geliştirme süreçlerinin otomatize edilmiş halleridir. Daha önceden birçok kişi tarafından denenmiş ve uygulanmakta olan süreç tasarımlarıdır. Örnek olarak :Agile Software Development, Extreme Programing, Collaborative software development model verilebilir. Bunun gibi yazılım mühendisliği konularını kesinlikle her yazılımcının bilmesi gerekir. Tasarım desenleri (Design Patterns) ise yazılımların geliştirmesi için daha önceden denenmiş belirli kalıplardır. Hemen her duruma uygun bir tasarım deseni vardır. Bunlar birçok kullanıcı tarafından kullanılıp test edilerek optimize edilmiş olduklarından, kullanmak kesinlikle çok faydalıdır. Belirli bir kalıp kullanılarak tasarlanmış yazılımlar, hem geliştirilmeye açık hem karışıklıktan ve kod kalabalığından uzak, hem de okunabilirliği yüksek olabilirler (en azından bu atılacak ilk adımlardan birisidir). (Bu konuyla ilgili şurası harika bir kaynak)
8 ) Nesneye Yönelimli Programlama
En önemlisini en sona sakladım.
NYP’nin başlıca özelliği, yazılımda birimselliği (İngilizce – modularity) benimsemesidir. NYP’nın altında yatan birimselliğin ana fikri, her bilgisayar programının (izlence), etkileşim içerisinde olan birimler veya nesneler kümesinden oluştuğu varsayımıdır. Bu nesnelerin her biri, kendi içerisinde veri işleyebilir, ve diğer nesneler ile çift yönlü veri alışverişinde bulunabilir.
(Kaynak Vikipedi). Tartışmasız olarak her programcının bilmesi ve etkin bir şekilde kullanabilmesi gereken bir konseptir.
Aslında daha birçok şey söylenebilir. Yeni ve yeni sayılabilecek teknolojier (Ajax, Cloud Computing, Grid Systems, MultiProcessor Programming vs) üzerinde de düşünmek iyi olur. Bu konseptler daha ne kadar geçerliliğini korur bilemem.
Ne de olsa değişmeyen tek şey değişimin kendisidir.
Alıntı: http://kaan.basesistem.com/?p=32
Hiç yorum yok:
Yorum Gönder