Dr. Volkan Tunalı'nın Kişisel Blogu

Bilgisayar, Teknoloji, Bilim, Sanat

Archive for the ‘programlama’ tag

Bilgisayar Bölümlerinde Hangi Programlama Dili?

one comment

Bilgisayar ve Yazılım Mühendisliği bölümlerinde öğretim programı hazırlayan bazı hocalarım ve akademisyen arkadaşlarımla birinci sınıftan itibaren öğrencilere hangi programlama dilinin öğretilmesinin uygun olacağı konusunda çeşitli zamanlarda görüş alışverişlerimiz oldu. Programı hazırlarken ve dil seçimini yaparken genellikle aşağıdakiler gibi bir takım kriterler üzerinde durduklarını gördüm:

  • Bu bölümden mezun olan kişi piyasada yaygın olarak kullanılan bir programlama dilini doğrudan uygulamaya yönelik olarak iyi derecede biliyor olsun, piyasaya çıktığında bu dili kullanarak gerçek hayat uygulamaları geliştirebilecek düzeyde olsun
  • Bu dil mutlaka tam anlamıyla Object Oriented bir dil olsun, öğrenciler OOD (Object Oriented Design) ve OOP (Object Oriented Programlama) kavramlarına tam anlamıyla hakim olsunlar
  • Web uygulamaları geliştirilmesi konusunda da dilin desteği ve kolaylıkları olsun

Bu kriterler göz önüne alındığında ve bölümlerin Bilgisayar Bilimleri’nden ziyade Yazılım Mühendisliği ağırlıklı olmasının istenmesi de hesaba katıldığında genellikle en iyi tercihin MS.Net tabanlı C türevi bir dil olan C# (C Sharp) olduğunu düşünüyoruz. Her ne kadar Microsoft çatısı altında geliştirilen ticari bir ürün olsa da C#, C’ye ve Java’ya benzerliklerinin yanı sıra son derece olgunlaşmış, gelişmiş ve güçlü bir genel amaçlı programlama dili durumunda. Aslında Java da bu kriterlere uygun bir dil gibi görünüyor ancak C#’ın Türkiye’deki artan popülerliğini ve yaygınlığını da dikkate aldığımızda Java ikinci planda kalıyor.

Açıkçası ben kendi adıma, bitirdiğim Bilgisayar Mühendisliği bölümünün öğretim programını düşündüğümde Bilgisayar Bilimleri alanındaki konulara verilen ağırlığın çok yerinde ve dengeli olduğunu düşünüyorum ve Pascal ile başlayıp C ile devam eden programlama derslerinin iyi ve sağlam bir temel oluşturduğuna inanıyorum. Bence Bilgisayar Bilimleri’nin ağırlığının yüksek olduğu bölümlerde Pascal ve C gibi bir dilin mutlaka ders programında yer alması gerekir. İlk öğretilen programlama dili olarak Java veya C# gibi nispeten daha yüksek seviyeli bir dil olsa bile devamında Veri Yapıları ve Algoritmalar derslerinin uygulamaları için Pascal ya da C gibi prosedürel bir dilin kullanılması yararlı olur. Sonrasında zaten ihtiyaca ve bireysel tercihlere göre yeni dillerin öğrenilmesi ve bu dillerde uzmanlaşılması çok büyük bir sorun olmayacaktır. Elbette ki öğretim programı içerisinde hangi dil kullanılırsa kullanılsın OOD ve OOP ağırlıklı en az bir dersin bulunması gerekir. Bunun yanı sıra bir süre öncesine kadar sadece akademik olduğu düşünülen ancak artık yazılım sektöründe oldukça ciddi bir yer edinmeye başlayan fonksiyonel dillerden birine de (mesela bir Lisp türevi olan Scheme) öğretim programında yer verilmesi çok yerinde olacaktır.

Yurtdışında da akademik dünyada uzun süredir bu konuda çok çeşitli, benzer görüşler ve tartışmalar var. Hatta ilk yıl programlama ile ilgili bir ders konulmasının Bilgisayar Bilimleri bölümünü zorlaştırdığını, programlama dersinin ileriki yıllarda görülmesi gerektiğini savunan görüşlere bile rastlamak mümkün.

Konuyu daha fazla dağıtmadan bitireyim. Uzun lafın kısası, Bilgisayar bölümlerinde hangi programlama diliyle başlanmalı, nasıl devam edilmeli, bir dil ile temelleri öğretip sonra başka bir dile mi geçilmeli, yoksa başından sonuna kadar bir dil üzerinde uzmanlaşılacak bir program mı hazırlanmalı? Emirsel/komutsal (Imperative) bir dil yerine günümüzde epeyce popüler hale gelen fonksiyonel dillerden biriyle mi başlanmalı? Bu konudaki düşünceleri duymak isterim, lütfen yorumlarınızla katılın.

Written by vtunali

Nisan 12th, 2010 at 9:17 pm

Uç Programlama (Extreme Programming XP) Nedir?

leave a comment

Uç Programlama (XP), yazılım geliştirme süreci boyunca son derece kaliteli olmak koşuluylaçalıştırılabilir kod üretmeye odaklanmış bir yazılım geliştirme metodolojisidir. Yazılım geliştirme sürecinin en temel, en önemli ve final çıktısı ya da ürünü çalıştırılabilir kod olduğundan, XP metodolojisi sürecin en başından itibaren çalıştırılabilir kodu sürecin merkezinde tutmaktadır. İşte bu yüzden bu metodolojinin adı XP’dir.

Uç Programlama kısa adımlardan oluşan tekrarlı bir süreçtir. Her bir tekrar süresi birkaç gün ila birkaç haftadan daha uzun değildir. İlk adımın sonucunda geliştirilmekte olan sistemin minimum seviyede çalıştırılabilir bir örneği üretilmiş olmalıdır. Bu ilk adımdan sonraki her bir tekrar adımında bir önceki adıma göre daha fazla özelliğe sahip ve aynı zamanda iyileştirilmiş bir sürüm ortaya çıkarılması hedeflenmektedir. Bu şekilde sık tekrarlar ile sistemin bütünü
tamamanmış olacaktır.

Uç Programlama, her bir adımda genişletilebilirlik ve sürdürülebilirlik özellikleri bakımından yüksek kalitede kod üretimine önem vermektedir. Her bir adımın temel hedefi geliştirmek ve refactor etmektir. Geliştirmek, yeni işlevler ve özellikler eklemek demektir. Refactor etmek ise çalışan kodun işleyişine zarar vermeden kodun kalitesinin arttırılması amacıyla yeniden yapılandırılması demektir. Refactor etmek, Uç Programlamanın ısrarla üzerinde durduğu bir işlemdir.

Uç Programlama’nın özünde aşağıdaki uygulamalar yer alır:

  • Planlama: Her tekrar adımına basit bir planla başlanır ve gerekli oldukça bu planda değişikliğe ve iyileştirmeye gidilir.
  • Sık ve küçük sürümler: Her tekrar adımında çalışan bir sürüm temel hedeftir. Tekrarlamaların süresi de birkaç haftadan daha uzun olmamalıdır.
  • Basit tasarım: Tasarım mümkün olduğunca basit tutulmalı, gerektiğinde refactor edilmelidir.
  • Önce test: Kod yazılmadan önce yazılacak kodun testinin yazılmasıdır.
  • Refactor etme: Kod tekrarlarından uzak durmak, sade ve temiz kod elde etmek için sürekli olarak refactor edilmelidir.
  • Çift programcı: Kodun hep çiftler halinde yani eşli olarak yazılmasıdır.
  • Sürekli bütünleştirme (Continuos Integration): Her kodlama görevi tamamlanır tamamlanmaz ana sistemle bütünleştirilmelidir.
  • Haftada 40 saat çalışma: Geliştirme ekiplerinin verimli çalışabilmesi için aşırı çalışma saatlerinden kaçınılmalıdır.
  • Müşteri ile yakın iletişim: Müşterinin tam zamanlı olarak geliştirme ekibiyle yakın temas halinde bulunması ve sürece her an dahil olabilmesi gerekir.
  • Kodlama standartları: İsimlendirme, kaynak kod düzenleme ve dokümantasyon için yaygın standartların tüm ekip tarafından benimsenmesi gereklidir.

Written by vtunali

Kasım 18th, 2009 at 12:31 am

Primary Key: Identity mi GUID mi?

leave a comment

Birincil Anahtar (Primary Key) olarak ne kullanılması gerektiği veritabanı tasarımında en sık karşılaşılan ve çözümü de çok kolay olmayan bir sorundur. Aslında veritabanı teorisi açısından en doğrusu Doğal Anahtar (Natural Key) olan kolonun birincil anahtar olarak kullanılması. Ancak pratikte bunun çeşitli sakıncaları bulunduğu için pek tercih edilmiyor. Günümüzün Nesne Yönelimli (Object Oriented) tasarımlarıyla daha iyi örtüştüğü için Doğal anahtar yerine Surrogate Key (harici, vekil anahtar) kullanımı daha çok tercih ediliyor. Özellikle de ORM (Object Relational Mapping) gibi veri ve iş mantığı katmanlarının kullanıldığı yazılım projeleri için Surrogate Key tek seçenek durumunda.

Surrogate Key’i kısaca tanımlamak gerekirse; kayıtlardaki veriyle hiçbir doğal bağlantısı ve ilgisi olmayan, tek amacı kayıtları eşsiz olarak nitelemek olan, genellikle de değerini veritabanı sisteminin kendisinin ürettiği tablo kolonudur. Çoğunlukla bu kolonun veri tipi olarak otomatik artan (Auto Increment, Identity, Sequence gibi) Integer ya da GUID (Globally Unique Identifier = Küresel Eşsiz Tanımlayıcı) tercih edilmektedir. İşte asıl sorun da bu noktada yaşanmakta: Bu ikisinden hangisini seçmeli ve neden? Ne yazık ki bu sorunun tek ve kesin bir yanıtı yok. Tasarlanmakta olan sistemin bugünkü ve de öngörülebilen gelecek ihtiyaçlarına bağlı olarak bir tercih yapılması gerekiyor. Bu tercihi yaparken her iki seçimin de avantaj ve dezavantajlarını ortaya koymak ve bunları iyi değerlendirmek gerekiyor. Bu makalede her iki veri tipini ayrı ayrı ele alacağız ve bir sonuca ulaşmaya çalışacağız.

GUID – Globally Unique Identifier

+ Bu veri tipinin en büyük avantajı evrensel olarak (ve en azından teoride) eşsiz değerlere sahip olması. Sadece bir tablodaki bütün satırlar değil, veritabanındaki tüm satırlar, hatta ve hatta evrendeki tüm tablolardaki tüm satırlar eşsiz kimliğe sahip olacak.

+ Eşsiz olma özelliğinden dolayı dağıtık durumdaki veritabanlarını bir gün gelip de merkezi hale getirmek gerektiğinde yani merge etmek (birleştirmek) gerektiğinde hiçbir sorun yaşanmadan, hiçbir dönüşüme gerek kalmadan bu işlem gerçekleştirilebilir. Dolayısıyla bu veri tipinin tercih edilmesinde kurulan sistemin böyle bir gereksinime cevap verebilir olmasının gerekliliği en önemli etkendir. (Örneğin MSSQL Server’da replikasyon yapıldığında eğer yok ise sistem her tabloya bir adet GUID kolon ekliyor.)

+ Programsal olarak üretilebildiği için veritabanına Insert işlemi sırasında değeri bilinebilir ve böylece Insert’ten sonra bir kez de en son kullanılmış değeri elde etmek için veritabanı sunucusuna bir erişime daha ihtiyaç duyulmaz. ORM açısından da bunun güzel bir özellik
olduğu düşünülebilir.

- GUID’nin en büyük dezavantajı veri boyutunun çok büyük olmasıdır. GUID’nin boyutu 128 bit = 16 byte’tır. Birincil anahtar olarak GUID kullanılan bir tablodaki diğer bütün index’lerin de bu 16 byte’ı taşıyacağı anlamına gelir. Sonuç olarak fazladan veritabanı boyutu ve disk alanı demektir. Elbette ki fazladan I/O işlemi = performans sıkıntısı.

- Veritabanı açısından değil belki ama yazılım geliştiriciler açısından B85E62C3-DC56-40C0-852A-49F759AC68FB gibi değerlerin debug etme işini epeyce zorlaştıracağı da bir gerçek.

- Çoğu veritabanı yönetim sistemi artık GUID veri tipini kendiliğinden destekliyor olsa da bunu doğal olarak desteklemeyen sistemlerde karakter veri tipi olarak tutulması gerekebilir (gerçek bir uygulamada böyle yapılmak zorunda kalındığını biliyorum).

- GUID’ler üretildiklerinde belli bir sıra takip etmezler, yani tamamen rastgele üretilirler. Yani, sonradan üretilen GUID, bir önceki GUID’den daha büyük olmak zorunda değildir. Bu durum bize Clustered Index şeklindeki birincil anahtar olarak tanımlanan GUID kolonlarda büyük bir
dezavantaj oluşturmaktadır. Bildiğiniz gibi Clustered Index demek, verilerin bu index’e göre veritabanı sayfaları üzerinde gerçekten doğal sırasıyla tutulması anlamına geliyor. Yani Clustered olmayan indexler gibi sadece index olmaktan ibaret değil. Bu durumda her sırasız Insert için tabloya ait sayfalarda yer değiştirme ve yer ayırma yapılması gerekiyor. Bu soruna çözüm olarak mesela MSSQL Server 2005′ten itibaren Sequential GUID gibi -bence zorlama ve uydurma- veri tipleri gelmekte ya da sıralı GUID üreten fonksiyonlar yazılmakta. Ek olarak, GUID türündeki birincil anahtarların Clustered yapılmaması da dikkat edilmesi gereken bir konu.

Identity Integer

+ Eğer 4 byte’lık Integer veri tipi kullanılırsa işlemci için en doğal ve en hızlı işlenen veri tipi olması bakımından ilişkisel veritabanı operasyonları için en uygun veri tipi olduğu söylenebilir.
16 byte genişliğinde GUID veri tipiyle kıyaslandığında veritabanı ve disk alanı bakımından da son derece avantajlı olduğu görülüyor.

+ Sıralı üretildikleri için GUID’deki Clustered Index problemi yaşanmıyor.

+ Program geliştiriciler için debug edilmesi, gözle takip edilmesi son derece kolaydır.

- Kayıt Insert edildikten sonra son üretilen Identity değeri elde etmek için sunucuya fazladan bir erişim yapmak ve işlem yaptırmak gerekiyor.

- Ayrık veritabanlarını merkezi olarak birleştirmek gerektiğinde çakışan değerler için ekstra uğraş gerekiyor.

Sonuç ve Değerlendirme

Dağıtık veritabanlarının replike edilmesi ya da merkezileştirilmesi gibi ihtiyaçlar söz konusu ise GUID büyük boyutuna ve diğer dezavantajlarına rağmen en iyi seçenek gibi görünüyor. Bunun dışında, 32 bit ya da gerçekten gerekli ise 64 bit Integer Identity şeklindeki Surrogate Key daha az masraflı, daha fazla sistem tarafından doğal olarak desteklenen ve daha pratik bir seçenek durumunda. Bu aşamada kişisel bir tercih belirtmem gerekirse mutlaka gerekmiyorsa GUID’den uzak durmayı seçiyorum.

Written by vtunali

Kasım 18th, 2009 at 12:13 am

Programlama [Dili] Nasıl Öğrenilir?

99 comments

Programlama öğrenmeye yeni başlıyorsanız iki temel zorlukla karşılaşırsınız. Birincisi bilgisayara istediğiniz işlemleri yaptırmak için kullanılan programlama mantığını anlamak, diğeri ise programlamaya başlangıç için seçtiğiniz ya da seçmek zorunda kaldığınız dilin özelliklerini öğrenmek.

Programlama bilgisine sahip olup da başka bir dil ya da geliştirme ortamını öğrenmek istiyorsanız yeni dilin problem çözümüne getirdiği farklı yaklaşımları öğrenmek zorundasınız. Yeni bir programlama dili sadece yeni bir sözdizim (=syntax) kullanmak değil bazen programlamaya tümüyle bambaşka bir bakış açısıyla bakmak demektir. Örneğin, C++ biliyorsanız Java’ya adapte olmak kolay olabilirken Lisp gibi bir sistemi öğrenmek çok farklı bir deneyim olacaktır.

İster programlamaya yeni başlayın, ister başka bir dili/ortamı öğrenmek isteyin, öğrendiğiniz programlama diliyle kaydadeğer programlar geliştirecek duruma gelebilmek için biraz ter dökmek zorundasınız. İşte bu ter döktürecek, saç baş yolduracak, son derece zahmetli ama sonuçlarını aldıkça da keyif verici süreçte başarılı olmanız için yapmak zorunda olduğunuz, olmazsa olmaz şeylerden birkaçı:

1. Denemezseniz öğrenemezsiniz

İster kursa gidin, ister özel ders alın, ister bir kitaptan kendi kendinize öğrenmeye çalışın, hiç farketmez! Gördüklerinizi ekranın başına geçip kendiniz kodlamazsanız, derleyip çalıştırmazsanız, sonucu kendi gözlerinizle görmezseniz bu işi unutun. Program geliştirme aracını kullandıkça el alışkanlığınız artar, neyi nerede bulacağınızı bilir hale gelirsiniz. Kodladıkça dilin sözdizimine ve mantığına alışırsınız.
Kendi kendinize denemeler yapın. Çeşitli kaynaklardaki örnekleri yazın, değiştirip değiştirip deneyin. Koddaki farkın sonuca nasıl etki ettiğini anlamaya çalışın. Denemezseniz öğrenemezsiniz. Saatlerinizi, gecelerinizi bu işe feda etmezseniz birşeyler bilirsiniz ama vasatın ötesine geçemezsiniz.

2. Başkalarının kodlarını inceleyin

Sizden daha iyi program yazan kişilerin programlarını incelediğinizde belki de hiç aklınıza gelmeyecek güzel kodlama stilleri, zekice ifadeler, elegan kodlar bulabilirsiniz. Bu nedenle bulabildiğiniz tüm kaynaklardaki kodları hiç olmazsa şöyle bir inceleyin.

3. Kitaplardaki örnekleri unutun ve gerçekten işe yarar, ciddi programlar yazmayı deneyin

Basit örnekleri, basit işler yapan programları anlamak, yazmak kolaydır. Hata yapma ihtimali çok düşüktür. Hata olsa bile bulup düzeltmek çok kolaydır. Kendinize gerçekçi bir proje bulun ve onu geliştirmeye başlayın. İşe yarar birşeyler yapan bütün programlarda işe yarar hatalar olması normaldir. Bu hataları arayıp bulmak bazen saatler süren bir kovalamacayı gerektirebilir. Önemli değil. Önemli olan bu hatalardan birşeyler öğrenmektir. Hatalarınızı düzelttikçe programlamayı ya da yeni öğrendiğiniz dili daha iyi anlarsınız, öğrenirsiniz. Evet, 20-30 satırlık programcıklardan daha fazlasını yapmayı deneyin.

4. Programlamayla birlikte işletim sistemi ve bilgisayarın çalışma prensiplerini de öğrenmeye çalışın

Bu sayede yazdığınız programların aslında sistemin nerelerine ne kadar dokunduğunu bilirsiniz. Daha az sorunlu, daha verimli, daha yüksek performanslı programlar yazabilmek için sisteme bir bütün olarak bakabilmek çok yararlıdır.

5. Teach Yourself …… in 7 Days gibi saçmalıkları bir kenara bırakın

Yedi günde olsa olsa bir dilin neye benzediğini öğrenebilirsiniz. Gerçekçi olun. Programcılık ya da programlama dili öğrenmek, ustalaşmak yıllar sürer. 10 yıl sonra bile gördüğünüzde sizi şaşırtan, size bir şey öğreten şeyler olacaktır. Programcılık zahmetli ve emek isteyen bir iştir. 7 günde öğrenilecek kadar kolay olsaydı herkes programcı olurdu.

Özetle, iyi bir programlama bilgisi edinmek, bir programlama dilini hakkıyla öğrenmek oldukça zahmetli, yorucu, zaman alıcı bir süreçtir. Bu süreçte sabırlı ve ısrarcı olmak gerekir. Bir iki günde kurumsal uygulamalar yazabilecek seviyeye gelmeyi düşünüyorsanız en başından bu düşüncenizi gözden geçirmenizde yarar var. Emek olmadan ekmek olmaz. Yoksa “no pain no gain” mi demeli :)

Written by vtunali

Mayıs 14th, 2009 at 9:51 am

Refactoring Databases: Evolutionary Database Design

leave a comment

Refactoring DatabasesYazılım geliştirmede önemli aktivitelerden biri özellikle Uç Programlama (Extreme Programming XP) ile daha fazla ön plana çıkan Refactoring (yeniden düzenleme) işlemidir. Yeniden düzenlemenin amacı tasarımı ya da kodu iyileştirmek, kalitesini yükseltmektir.

Scott Ambler ve Pramod Sadalage, “Refactoring Databases: Evolutionary Database Design” isimli kitaplarında yeniden düzenlemenin veritabanı sistemlerinde uygulanmasına yönelik özel teknikleri anlatıyorlar.

Written by vtunali

Mart 7th, 2009 at 9:51 pm