2 Haziran 2016 Perşembe

Algoritma Analizi


Algoritma Nedir ?

  Belli bir problemi çözmek veya belirli bir amaca ulaşmak için tasarlanan yoldur. Matematikte ve bilgisayar biliminde bir işi yapmak için tanımlanan, bir başlangıç durumundan başladığında, açıkça belirlenmiş bir son durumunda sonlanan, sonlu işlemler kümesidir.

Algoritma Analizi Nedir ?

 Algoritma analizi çalışmalarının dayandığı karmaşıklık teoremi genel olarak bir bilgisayar programının veya algoritmasının asimptotik değerini bulmayı hedefler. Buradaki amaç, algoritmanın ulaşabileceği en kötü veya en iyi durumu matematiksel olarak modellemektir.

•Özelliklerinin analizi
–Algoritmanın çalışma zamanı
–Hafızada kapladığı alan 

Bir programın performansı genel olarak programın işletimi için gerekli olan bilgisayar zamanı ve belleğidir. 
 Karmaşıklık:
Algoritma performansı ölçme yöntemi Bir algoritmanın performansı iç ve dış faktörlere bağlıdır.

 • Girdi verisinin büyüklüğü
 • Bilgisayarın hızı
 • Derleyicinin kalitesi

Algoritma verimliliği:
• Çalıştırmak için gereken zaman
• Çalıştırmak için gereken yer (bellek alanı)


Zaman Karmaşıklığı (Time Complexity):

 Programın işletim süresidir.
 
Yer karmaşıklığı (Space Complexity):

 Programın işletildiği sürece gerekli olan yer miktarıdır.  

  Bir problemin çözümünde, kullanılabilecek olan algoritmalardan en etkin olanı seçilmelidir. En kısa sürede çözüme ulasan veya en az işlem yapan algoritma tercih edilmelidir. Burada bilgisayarın yaptığı iş önemlidir. Bazı durumlarda da en az bellek harcayan algoritmanın tercih edilmesi gerekebilir.
 Programcının yaptığı is açısından veya algoritmaların anlaşılırlıkları bakımından da algoritmalar karşılaştırılabilir. Daha kısa sürede biten bir algoritma yazmak için daha çok kod yazmak veya daha çok bellek kullanmak gerekebilir

Algoritmayı Neden Analiz Ederiz ? 

 –Algoritmanın performansını ölçmek için
 –Farklı algoritmalarla karşılaştırmak için
 –Daha iyisi mümkün mü? Olabileceklerin en iyisi mi? 


Büyüme Hızı ve Büyük-O(big-O)notasyonu:

Büyüme hız bir algoritmanın performansını yansıtan en iyi göstergedir. Büyük-O notasyonu büyüme hızını gösterir. Bir algoritmanın performansını en iyi tanımlayan matematiksel bir formüldür ve algoritmanın iç detaylarına bakılarak elde edilir. Büyük-O girdi verisinin büyüklüğünü gösteren bir N parametresine dayanan bir fonksiyondur.

Diğer Notasyonlar:


Sıralama Algoritmaları İçin Karmaşıklık

 

 

8 Aralık 2015 Salı

BULUT DEPOLAMA / YANDEX DİSK


   Bulut depolama nedir ? Bulut depolama servisleri nelerdir ? sorularına daha önceki yazılarımda değinmiştim. Şimdi bir bulut depolama servisi olan Yandex.Disk'i ele alalım. 
   
    Yandex.Disk nedir ?
  
   Yandex sunucularında dosya depolamanızı sağlayan bir servistir. Disk'te bulunan dosyalarla internete bağlı herhangi bir cihazdan çalışabilirsiniz. Arzu ederseniz önemli dosyalarınızı saklayabileceğiniz ücretsiz bir servistir. Her türlü video, resim, döküman ve kişisel bilgilerinizi saklayabileceğiniz Yandex Disk ile bilgisayarınız bozulsa bile dosyalarınıza kolaylıkla ulaşabilirsiniz. Bunun dışında diskinizde bulunan dosyalara nerede olursanız olun sadece bir internet bağlantısı ile ulaşmak da sizin elinizdedir.

  Bu özelliklerinin dışında Yandex Disk'te bulunan dosyaları istediğiniz zaman dosya erişimine kimlerin erişmesini istiyorsanız onlarla paylaşabilirsiniz. Yandex Disk’in bir diğer güzel özelliği de yine Yandex Posta servisi ile aldığınız ve gönderdiğiniz e-postalar üzerinde bulunan ekli dosyaları tek bir klasör altında depolayabilmenizdir.
   
   Yandex Disk tüm bu özellikleri kullanıcılarına ücretsiz olarak sunmaktadır. Kullanıcılarına üç kolay adımda kolayca ulaşabilecekleri 10 GB’lık disk alanını da ücretsiz olarak sunuyor.

 Yandex Disk Kurulumu

  Yandex Disk'i kullanabilmek için öncelikle bir Yandex hesabına sahip olmalısınız, eğer bir Yandex hesabına sahip değilseniz, öncelikle kendinize bir hesap oluşturmanız gerekmekte veya bir Yandex E-Posta hesabı oluşturarak, hesabımızı Yandex Disk ile entegre bir şekilde kullanabiliriz. Hesabınızı oluşturduktan sonra Yandex Disk'e ulaşabilmek için ya e-posta hesabınıza giriş yaparak:




 
Ya da Yandex Disk sitesi üzerinden varolan Yandex kullanıcı adı ve parolamız ile giriş yaparak:


   Yandex Disk hesabınıza ilk kez giriyorsanız karşınıza üç basit adımda 10 GB dosya saklama alanına sahip olabileceğinizle ilgili bir uyarı gelecektir. Şu an için 3 GB olan dosya saklama alanınızı, nasıl 10 GB'a yükseltebilirsiniz sorusuna cevap bulalım.



  Ek olarak 3 GB'lık bir dosya saklama alanı kazanmak için ilk yapmanız gereken şey Yandex Disk programını bilgisayarınıza veya mobil cihazınıza indirmek olacaktır. Bu işlemi karşınıza gelen sayfa üzerinden "Windows için Yandex Disk Kur" butonuna tıklayarak başlatabilirsiniz. Şimdi nasıl olacağına bir bakalım. İndirme işlemleri ve kurulum bittikten sonra:


 
   Yandex Disk uygulamasını kurarak ilk adımı tamamlamış olduk ve görüldüğü üzere dosya depolama alanımızı 3 GB daha arttırarak 6 GB'lık bir dosya depolama alanına sahip olduk. Şimdi sıra geldi 2 GB'lık ek depolama alanına daha sahip olabilmek için uygulamayı kullanarak Yandex Disk üzerine bir iki dosya yüklemeye. Bunun için sistem tepsisinde çalışan Yandex Disk uygulamasına tıklayarak "Yandex Disk klasörünü aç" butonuna tıklıyoruz ve açılan klasör üzerine yedeklemek istediğimiz bir kaç dosyamızı atıyoruz.



  
  Bu adımı da gerçekleştirdiğimize göre artık 8 GB'lık bir depolama alanına sahibiz. Şimdi sırada 2 GB'lık ekstra depolama alanına daha sahip olabileceğimiz üçüncü adım olan "Arkadaşlarınıza davet yollayın" kısmına geldik. Bu adımı gerçekleştirebilmek için Yandex Disk hesabımız üzerinden "Arkadaşlarınıza davetiye gönderin" butonuna tıklamak ve açılan pencere yardımıyla sosyal ağlar üzerinde paylaşmak:


   Artık son adımı da gerçekleştirdik. Şu anda Yandex.Disk'te 10 GB'lık bir alana sahipsiniz. Umarım yazımdan keyif almışsınızdır. Güle güle kullanmanız dileğiyle...

2 Aralık 2015 Çarşamba

YAZILIM MÜHENDİSLİĞİNE DAİR



  Günümüzde, akla gelebilecek her türlü iş alanında yazılım kullanılmayan iş merkezlerinin başarılı olması ve devamlılığı pek mümkün görünmemektedir. Örneğin, bankacılık sektöründe işe uygun bir yazılım kullanmayan bir bankayı düşünmek bile olası değildir. Sadece bankacılıkta değil telekomünikasyon, lojistik gibi hemen hemen her sektörde yazılım artık “olmazsa olmaz” bir bileşen haline gelmiştir. Yazılım mühendisliği de işte tam bu noktada devreye girer. Aksi halde, karmaşık, büyük, entegrasyon içeren yazılım projelerinin başarıya ulaşması mümkün değildir. 

  Bir bilgisayar mühendisi olarak  sizlere yazılım mühendisliği nedir, süreçleri nelerdir, güncel yazılım geliştirme süreçleri nasıldır bunları açıklamaya çalışacağım.
 
  Süreç, olguların ya da  olayların,        belli bir taslağa uygun ve belli bir sonuca varacak biçimde düzenlenmesidir. Yazılım süreci ise bir yazılım ürününü üretmeyi sağlayan birbiriyle tutarlı aktivite grubudur.Daha açıklayıcı olacak olursam yazılım süreci bizim yazılım üretme yolumuzdur.

 Yazılım geliştirme süreci için pek çok aktivite vardır. Ama tüm süreçler için ortak olanlar:
  • Yazılım Belirtimi (Software Specification)
  • Yazılım Tasarım ve Geçekleştirimi (Software Design and Implementation)
  • Yazılım     Geçerleme  (Software  Validation)
  • Yazılım Gelişimi (Software Evolution) 
-Yazılım Belirtimi sürecinin fazları:
  1. Yapılabilirlik çalışması (Günümüz teknolojisine uygun mu ?)
  2. Gereksinim ortaya çıkarma ve çözümleme (Sistem modellerini geliştirme)
  3. Gereksinim belirtimi (Kullanıcı isteklerini belgeleme)
  4. Gereksinim geçerleme (Tamlık ve tutarlılığı kontrol etme) 
-Yazılım Tasarım ve Geçekleştirimi süreci yazılım tasarımı (yazılım yapısını tasarlama) ve gerçekleştirim (tasarlanan yapıyı çalıştırılabilir programa çevirme) aşamalarından oluşur. Sistem belirtimini çalıştırılabilir sisteme çevirme sürecidir.

-Yazılım     Geçerleme   süreci ise gerçekleme (verification) ve geçerleme (validation),  sistemin belirtimlerine uyduğunu ve sistem müşterisinin gereksinimlerini karşıladığını göstermek içindir.
Aşamaları ise:
  • Kontrol etme (Checking)
  • Gözden geçirme (Review) 
  • Sistemi test etme (System testing) 
-Yazılım Gelişimi sürecinde işle ilgili şartların değiştikçe gereksinimler de değiştiği için işi destekleyen yazılımın da gelişmesi ve değişmesi işlemi gerçekleştirilir.

  Yazılım süreç modelleri kontrol, tutarlılık ve düzen sağlar. Karmaşıklığı azaltıp kaosu önler.

   * Süreç:   Belirli bir amaç için gerçekleştirilen bir grup aktivite
   * Aktivite: Belirli bir amacı gerçekleştirmek için bir takıma ya da proje çalışanına atanan bir görev
 
Genel Yazılım Süreç Modelleri


  > Kodla ve Düzelt (Code and Fix) :   

     Analiz(Çözümleme) süreci sonrası kodlama, kodlama sonrası da düzeltme aşamaları getirilerek oluşturulan modeldir.

 > Çağlayan  Modeli      (Waterfall     Model):

   -  Sonraki faz  bir önceki  faz  tamamlanmadan       başlayamaz.
   -  Her fazın sonucu bir ya da birden fazla onaylanan (imzalanan) belgedir.
   -  Gerektiğinde geliştirme                 aktivitelerinde  iterasyonlar (tekrarlamalar) olabilir.

> Evrimsel Geliştirme (Evolutionary  Development):
  
    -  Anahat   gereksinimleri  ile  başlangıç   sistemi  geliştirilir.
    -   Müşteri geribildirimi ile sistem pek çok versiyonla yavaş yavaş geliştirilir.
    -   Belirtim, geliştirme ve geçerleme aktiviteleri koşut zamanlı yapılır.
 
> Prototipleme (Prototyping):

    - Gereksinim      tanımlama  fazında  hızlıca  yapılan  kısmi gerçekleştirme.
    - Gereksinimler  netleştikçe  prototipi  düzeltme.
    - Müşteri  memnun  olana  kadar  düzeltmelere  devam  etme.

> Spiral Model:

    - Süreç  arka  arkaya  devam  eden  sıralı  aktiviteler  şeklinde gösterilmek  yerine  spira l şekilde  gösterilir.
   - Spiral  üzerindeki  her  bir  halka  bir  fazı  gösterir.
   -  Belirtim,  tasarım  gibi  kesin  fazlar  yoktur.
      -    Spiral' deki halkalar  neye  ihtiyaç  varsa  onu  gerçekleştirmek  için  seçilir.
   -  Süreç  boyunca  risklerin  değerlendirilmesi  ve çözümü  açık olarak  yapılır.


> Artımlı Geliştirme (Incremental Development):

   - Sistemi  tek  bir    parka  olarak  en  sonda   teslim  etmektense, sistem, her  biri  sistemin  ayrı  bir  istenen  işlevini  yerine getirecek artımlara (increments) bölünür.
  - Kullanıcı  gereksinimleri  önceliklendirilir, ve  yüksek  öncelikli gereksinimler  ilk  artımlar  arasında  gerçekleştirilir.
  - Bir  artımın  geliştirilmesine  geçilince  diğer  artımlar  için  gereksinim  gelişimi  devam  etse  bile  o artım  için  olan gereksinimler dondurulur.

> Çevik Model (Agile Method) :

   Çevik modelleme (Agile), yazılım sistemlerini etkili ve verimli bir şekilde modellemeye ve dokümantasyonunu yapmaya yönelik pratiğe dayalı yöntemlere verilen genel addır. Yazılım geliştirme amacıyla üretilen bu modelleme biçimi, kapsadığı değerler, prensipler ve pratikler sayesinde geleneksel modellemelere metotlarına göre yazılımlara daha esnek ve kullanışlı biçimde uygulanabilir.

  Aslında Agile bir proje yönetim biçimidir, proje geliştirirken direkt olarak agile kullanılmaz, bunun kolları (yani frameworkleri) kullanılır.

Agile ile hedeflenen asıl şey ise süreçleri etkin kullanarak hızlandırmak ve gerektiğinde bunları dokümante etmektir.

Agile Proje Yönetimi dediğimizde bilmemiz gereken; değişime açık olunması, takım içi iletişimin üst düzeyde olması, hızlı ve sürekli ürün teslimi, test odaklı anlayış, basit ve gerçekçi bir planlama olmalıdır.

Avantajları:
  • Ekip ruhu kazandırır
  • Planlama ve yürütme bir arada olduğu için sürdürülebilir kalite sağlar.
  • Ayrıntılı plan süreçleri yerine iteratif planlar (tekrar eden süreçler) uygulanır.
  • Müşteri ihtiyaçlarına uygunluk önemlidir, sık sık ürün çıktısı verilir ve müşteriden gelen geri bildirimlerle ihtiyaca uygun, doğru ürün çıkarılır.
Dezavantajları:
  • Kurumsal bir yapıda uygulamak için ciddi anlamda zorlanırsınız
  • Hedefler kısa vadeli olduğu için ekip üzerinde sonuç baskısı oluşabilir
  • Kısa süreli ürün teslimi sonucunda gelen geri bildirimlerle çalışma sürelerinin artması muhtemeldir
  • Dokümantasyon konusundaki bilinen birçok şeyin, tabiri caizse, “gereksiz” kılınması durumu vardır.

  Çevik yazılım sürecini bizzat kendim deneyimleyerek gördüm ve şimdi sizlerle ekip arkadaşımla yaptığımız projeden ve tecrübelerimizden bahsedeceğim.

 Öncelikle ilk toplantımızda (meeting)  proje konumuzu, hangi dilde geliştireceğimize karar kıldık. Projemiz olan Özel Organizasyonlar (doğum günü, yılbaşı, düğün vb.) için müşterilerin rezervasyon, paket seçme, ekleme gibi aktiviteleri yerine getirebileceği bir uygulamayı  Visiual Studio'da C# dilinde geliştirmeye karar verdik. Veri tabanı geliştirmesi için de MsSql'i tercih ettik.

  İkinci toplantımızda yazılımımız geliştirmek için yazılım mühendisliğinin süreçlerinden olan Agile metodunu kullanmayı uygun gördük. Bunu kullanmak için de Visual Stduio Online / Team Foundation Server (TFS)'yi seçtik. İlk iş olarak hesap açıp, takım lideri olarak ben ekip arkadaşımı projeye dahil ettim.


  Toplantımızın üçüncüsünde ise günlük olarak neler yapmamız gerektiğini belirledik. Planlar yapıp, haftalık hedefler koyduk. Tüm bunları da TFS'de biriktirim (backlog) olarak oluşturduk. Ve hangi işi kimin yapacağının atamasını gerçekleştirdik.

Backlog: 

 
Board:


Görev Ataması:
  
  Son toplantımızda artık kodlama işlemimiz bitmişti ve yavaş yavaş TFS'de kodlarımıza yer vermeye başlamıştık.

Code:

 Build:


Evet arkadaşlar bu yazımda sizlere yazılım mühendisliğini, çevik yazılımı ve kendi deneyimlerimi aktardım umarım sizlere yararlı olabilmişimdir. Keyifli günler...