The Big Bang – INDEX

Merhaba,

Daha önceki konuyu okuduysanız, şuan nerede olduğunuzun farkındasınızdır. Eğer okumadıysanız, buraya tıklayarak okuyabilirsiniz. (Okumanızı öneririm)

Diğer konuda bahsettiğim gibi bu kısımda konuların Index’ne ulaşabileceksiniz. Bütün konuları yazmadığımdan, doğal olarak bu sayfa zaman içerisinde sık sık güncellenecek.

Bu eğitim serisini takip etmek için bilmeniz gereken konulara buraya tıklayarak ulaşabilirsiniz.

INDEX

  1. Giriş
  2. Index (Bu sayfadasınız)
  3. Algorithms (Algoritmalar)
    1. Algoritma I (Nedir? Ne değildir? Kısaca tanımlar)
    2. Algoritma II (Analizler, Big-O, Optimizasyon, Code örnekleri vs.)
  4. Basic Data Structures (Temel Veri Yapıları)
    1. Array and strings
      1. Array
      2. String
      3. Array and string problems
      4. Summary (Son bilgiler ve özet bu kısımlarda olacak)
    2. Linked Lists
      1. Singly Linked List
      2. Doublely Linked List
      3. Circular Linked List
      4. Linked List Operations
      5. Linked List Problems
      6. Summary
    3. Trees
      1. Binary Trees
      2. Binary Search Trees
      3. Heaps
      4. Common Searches
      5. Traversals
      6. Summary
    4. Graphs
      1. Tree And Graph Problems
      2. Summary
  5. Recursion
    1. Recursion I
    2. Recursıon Problems
    3. Summary
  6. Sorting
    1. Selection Sort
    2. Insertion Sort
    3. Quicksort
    4. Merge Sort
    5. Yeni sort algoritmaları daha sonra eklenebilir.
    6. Summary
  7. Concurrency
    1. Basic Thread Concepts
      1. Threads
      2. System Threads and User Threads
      3. Monitors and semaphores
      4. Deadlocks
      5. Threading Examples
    2. Concurrency Problems
      1. Busy Waiting
      2. Producer/Consumer
    3. The Dining Philosophers
    4. Summary
  8. OOP/D (Object-Oriented Programming/Design)
    1. Fundamentals
    2. Brain Sync (Herkesin aynı şey hakkında konuştuğundan emin olmak için…)
    3. OOP Problems
    4. Design I
    5. Design II
    6. Design III
    7. Summary
  9. Design Patterns
    1. Design Pattern I
    2. Common Design Patterns
    3. Design Pattern Problems
    4. Summary
  10. Databases
    1. Fundamentals
    2. Brain Sync
    3. Database Problems
    4. Summary
  11. Graphics And Bit Manipulation
    1. Graphics
    2. Bit Manipulation
    3. Graphics Problems
    4. Bit Manipulation Problems
    5. Summary
  12. Puzzles
    1. Tackling Brainteasers
    2. Brainteaser Problems
    3. Graphical and Spatial Puzzles
    4. Graphical and Spatial Problems
    5. Summary
  13. FED (Ne demek olduğunu daha sonra açıklayacağım.)
    1. Java VS C++
    2. Garbage Collection
    3. X64 VS 32-bit Apps.
    4. Web Application Security
    5. Hash Tables VS Binary Search Trees
    6. Network Performance
    7. Ve çok daha fazlası eklenecek…
    8. Summary
  14. Security
    1. Daha sonra alt başlıklar eklenecek
  15. Software Engineering
    1. Daha sonra alt başlıkları ekleyeceğim

Şimdilik konular bu şekilde, zaman içerisinde ekleme/çıkartma yapabiliriz.

Herkese başarılar dilerim.

Algoritma – 2

Big-O-notation[1]

Example of Big O notation: f(x) ∈ O(g(x)) as there exists c > 0 (e.g., c = 1) and x0 (e.g., x0 = 5) such that f(x) ≤ cg(x) whenever x ≥ x0. -Wikipedia (2015)

Bir önceki konuda algoritma(lar) hakkında kısaca bilgi verdim ve şimdi asıl noktaya yani analiz ve değerlendirme kısmına geldik.

Big-O Nedir?

Big O notation is used in Computer Science to describe the performance or complexity of an algorithm. Big O specifically describes the worst-case scenario, and can be used to describe the execution time required or the space used (e.g. in memory or on disk) by an algorithm. (Devamı için tıklayınız) – Rob Bell ’09 (2015)

Yukarıdakı yazıdan da anlaşıldığı üzere, bilgisayar bilimlerinde bir algoritmanın performans ve kompleksliğini ifade etmek için kullanılmaktadır. Big-O notasyonu genelde en kötü senaryo için gerekli çalışma zamanı ihtiyacını ve alan kullanımını ölçmeyi hedefler.

Neden böyle bir şey yapmışlar ki? 2 tane script yazıp makine üzerinde çalıştırıp benchmark yapsam bende ölçemez miyim?

Kısa cevabı; hayır, ölçemezsiniz. Çünkü; yaptığınız ölçümler, sizin kullandığınız system (PC, Server etc.), konfigürasyon, test yazılımı sürümleri ve bunun gibi parametreler dahilinde geçerli olacaktır. Yani, genel bir değerleme veremez. Big-O ise matematiksel şekilde çalışma zamanı ve alan ihtiyacını vererek hangi sistemde kullanırsanız kullanın onun üzerinden aynı oranı gösterir. Örneğin; her ay kazancınızın %25’ni devlete vereceksiniz dediğinde, sabit bir tutar yoktur. Yani, 100 TL kazanan 25 TL öder, 150.000 TL kazanan 37.500 TL öder ama sonuc olarak her iki kişininde %25 kazancını alacağını ifade etmiş olur. Big-O yapısıda aynı böyle çalışır.

Neler var bu Big-O notasyonunda?

Hesaplama sonuçları “O” harfinin yanına eklenen parantezin içinde gösterilir. Yaygın olarak aşağıdaki şekilde olanları ile karşılaşabilirsiniz.

  • O(1) – Constant
  • O(N) – Linear
  • O(Log N) – Logarithmic
  • O(N Log N) veya O(Log N!)
  • O(N^2) – N üssü 2
  • O(N!) – factorial
  • ve daha fazlası…

Big-O hesaplaması sonucu algoritma için size O(1) diyorsa; bu girdi parametresinin boyutunu dikkate almadan her zaman aynı çalışma zamanı ve/veya alanı kullanacağını ifade etmektedir. Yani artan bir kullanım O(n) yok. Örneğimize uyarlayacak olursak; metroya binmek isteyen herkes 2 TL öder şeklinde yorumlayabilirsiniz. Bu herkes için geçerlidir. Taksim’den Beşiktaş’a da gitseniz 2 TL, Mecidiyeköy’den Kartal’a gitsenizde 2 TL. 50 kişide binse her biri için 2 TL, 2 milyon kişide kullansa her biri için 2 TL. Yani, girdi parametresinin bir önemi yok her zaman alacağı tutar 2 TL. Ayrıca bildiğiniz gibi bir algoritmanın O(1) sonunucu vermesi O(N)’den hızlı çalışacağı anlamına gelmez veya O(N) her zaman O(N^2)’den iyidir sonucunu çıkartmaz.

Niye böyle şeyler yapıyoruz? Kodumuzu yazsak, kahvemizi içsek olamaz mı? Neden gece, gece icat çıkartıyorsun ki başımıza? :)

Bildiğiniz gibi günümüzde zaman, paradan önemli tek şey. Para ile satın alamayacağınız nadir şeylerden biri de zamandır. Pahalı sunucular ve sınırlı işlem kapasitesi ile başa çıkabilmenin yöntemlerinden biride optimizasyondur. Ayrıca, sadece bunun için değil geliştirdiğiniz yazılımın ne kadar kaynak kullanarak, ne kadar zaman da, ne kadar işlem yapabileceğini bilmeniz sizin planlamanız içinde çok önemlidir.

Bir GPU encoder geliştirdiğinizi düşünün, bunun için bir çok algoritma yazmanız gerekecek. NVidia SDK’ni kullandığınızı düşünecek olursak bir video üzerinde değişiklik yapan algoritmanız ne kadar hızlı çalışıyor dediğiniz de sunabileceğiniz 2 yöntem var. Birincisi, Big-O analinizi verip şu hızda çalışır diyebilirsiniz, ikincisi elinizdeki bir GPU üzerindeki test sonuçlarını verebilirsiniz. Eğer satacağınız firma sizin test yaptığınız GPU’ları kullanmıyorsa ne olacak? Onların GPU’larından bir tane veya bir kaç tane alıp test yapıp tekrar mı açıklama yapacaksınız? Bu çok amatörce olurdu. Yarın bir gün, başka bir müşteri geldi o da bambaşka bir GPU kullanıyor, ne olacak? Yazdığınız kodun ne kadar verimli olduğunu ölçmek için ortam ve donanım bağımsız bir sonuç sunmanız gerek.

Ayrıca, kaliteli bir Yazılım mühendisi her zaman yazdığı koda hakimdir. Nerede ne yaptığını ve ne kadar kaynak/zaman kullandığının farkındadır. Belki aylık 25.000 kişinin kullandığı bir system için önemli değil gibi gözükebilir ama 150 milyon veya 1.5 milyar insanın kullandığı sistemlerde bir algoritmanın 3 saniye yerine 7 saniye çalışması 2 katı alt yapı maliyeti demek. Eğer 250 server ile normalde o işlemi yapılabilecekse siz 4 saniye daha fazla çalışan kötü kod yazdığınız için şimdi 500 server’a ve muhtemelen 15 milyon dolar daha yatırım yapmaları gerekecek. Tabii ki de böyle bir şey yapmayacaklar. Yapacakları şey code-review’dan sonra sizi kovmak olacaktır. :D IT sektöründe 15 milyon dolar eden programcı yok maalesef :)

Big-O kullanmadan manuel hesaplayamaz mıyız?

Evet, hesaplayabilirsiniz ama onu hesaplayabilecek olsanız emin olun bu soruyu sormazsınız çünkü; bunun için assembly seviyesine inmeniz gerek CPU’nun hangi işlem için ne kadar command execute ettiğinden tutun, compiler’ların neyi nasıl optimize ettiğine kadar incelemeniz gerek. Memory olayı falanda var ama şimdi hiç o kısma girmek istemiyorum. Assembly ile uğraşmaktan ve disassemble yazmaktan nefret ederim. :) Kimseye tavsiye etmem, uzak durum bence.

Şimdi bu söylediklerimiz üzerinden biraz basit code örnekleri verelim.

Örnek-01: Bir dizideki en küçük ve en büyük sayıyı bulan kodu yazınız.

Şimdi ilk kodumuzu yazalım ve bunun adı MinMax1 metodu olsun. Kodumuz aşağıdaki şekilde olacaktır. Hatırlatma: Kodları Java olarak yazıyorum siz kullandığınız dilde yazabilirsiniz. Ayrıca, tahmin ettiğiniz gibi bu kodlar örnek içindir production kodu değildir. Yazılım geliştirirken her zaman uluslararası mühendislik standartlarında kod yazmaya dikkat etmeniz gerekiyor. İsimlendirmeden, yorumlara, değişken tanımlamaya kadar bir çok nokta var.

minMax01

Yukarıdaki algoritmayı incelediğimizde sizinde tahmin ettiğiniz gibi O(N) sonucuna ulaşıyoruz.

Nasıl ulaşıyoruz?! Ben hiç bir şey anlamadım! 

Merak etmeyın açıklayacağım. Benimde en sinir olduğum şeydir bu. :) Biraz bilgi verirler sonra kodu yazıp işte burdanda X sonucunu elde ederiz diyerek geçerler. Türkiye’deki eğitim sistemine benziyor. :) Neyse konumuza dönecek olursak; Buradan O(N) sonucuna varmamızın sebebi for loop’un da yapılan işlemler intArr variable’nın boyutuna göre artmaktadır. Mesela şuan koda göre 4 kere dönecek, çünkü intArr 4 elemana sahiptir. Bunu 200’e artırırsam o for loop’u 200 kere dönmesi gerek. Bu da demek oluyor ki; benim algoritmamın alacağı zaman, N sayısına yani bu algoritmada N = intArr olmaktadır. Bu algoritma gibi girdi parametresine göre alacağı zaman veya alan N sayıda doğrusal artan algoritmaları O(N) şeklinde ifade edebiliriz. Ayrıca, atama yapan IF’lerden önce bir IF daha koyup mesela eğer array’deki 4. item’a geldiysen BREAK et kodumunu verseydik bile yine de bu O(N) olurdu, çünkü daha önce bahsettiğim gibi Big-O hep worst-case’i ölçmek ister. Yani; Örneğin bu algoritma için O(N) = 0.007ms ise Big-O size bu algoritma için bu yapıda en fazla 0.007 milisaniye de bu işlemi tamamlar der. Duruma göre 0.003 milisaniyde de tamamlayabilir ama 0.009ms sürmez.

Daha önce bahsettiğim gibi O(N) her zaman O(N^2)’den hızlı çalışmaz. Hemen bunu kanıtlayacak kodu yazalım ve sonrasında açıklamasını yapalım.

minMax02

İlginç değil mi? Nasıl olur da bu kod, yukarıdaki daha az koddan ve tek loop’tan daha hızlı çalışabilir? Bunun için daha önce bahsettiğim Big-O kullanmadan, manuel hesaplama alt başlığına bakabilirsiniz. Orada yazan low-level (Assembly) işlemler ve bir işlemin diğerine göre CPU’da daha fazla direktif gerektirmesinden dolayıdır. Bu demek değildir, o zaman bütün loop’larımızı ayrı, ayrı yazalım kodumuz hızlansın. Biliyosunuz, kodunuz genellikle line-by-line çalışacak. Önce 1. loop bitecek sonra 2.loop’a geçecek. Bunu sadece örnek için ekledim. Ayrıca, artık bildiğiniz gibi bir çok yüksek seviyeli programlama dilinde parallel processing desteği var. Aynı işlemi multi-thread kullanacak parallel bir For Loop’u oluşturarakta yapabilirsiniz. Java-8’de parallel işlemler için stream API’na bakabilirsiniz.

O(1) yapısına örnek vermek gerekirse, min ve max variable define işlemi her zaman O(1) yani sabit bir zaman alacaktır. Bunu şöyle düşünebilirsiniz; elinizde 10 TB büyük bir veri var ve bunu araba ile A noktasından B noktasına taşıyacaksınız. Bu veriyi USB olarakta taşısanız, HDD veya SSD olarakta taşısanız eğer araba saatte 60km hız ile 2 dk’da A noktasından B noktasına ulaşıyorsa bu veri için gereken zaman asla değişmeyecektir. O veri her zaman 2 dakika da B noktasına gidecektir. Yani algoritma için sabit bir değere sahiptir.

Şimdilik burada noktalıyorum. En kısa sürede diğer Big-O yapılarını da buraya ekleyeceğim.

Şimdiye kadar anlattıklarım ile ilgili sorularınız varsa, aşağıdaki yorum kısmından sorabilirsiniz.

Neleri bilmeniz gerekiyor?

Merhabalar,

Başlamadan önce bilmeniz gereken minimum konuları aşağıdan inceleyebilirsiniz. Önerim, bu konuları okumaya başlamadan önce eğer eksiklikleriniz varsa hızla tamamlamanız yönünde olacaktır.

Neleri bilmeniz gerekiyor?

  • Populer programlama dillerinden birini iyi seviyede bilmeniz.
    • Ben konularda çoğunluk ile C/C++ ve Java kullanacağım. Bazı örneklerde C#’da ekleyebilirim.
    • Basit anlamda iyi bilmekten kastım; internet bağlantınız ve gelişmiş bir IDE’niz olmadan da o programlama dili ile Yazılım geliştirebilecek seviyede olmanızı kastediyorum.
  • Bir üst maddeyi sağlıyorsanız zaten temel seviyede ki bütün veri yapılarını biliyorsunuzdur.
    • String, Int, Double, Float, Binary, Byte v.s. language defined type’ları bilmelisiniz.
    • Array, List, Tree, Queue vs. orta seviyede de olsa bilmeniz gerek.
    • Quick Sort, Binary Search vb. gibi algoritmaların en azından adını duymuş olmanız gerek.
  • Biraz matematik bilgisi
    • Bazen basit matematik denklemleri verebilirim veya formül ile açıklamaya çalışabilirim. Bu nedenle biraz matematik iyi gelir herkese. :)
  • Basit seviye O/S bilgisi. Yazdığımız her şeyin nereye gittiğini ve run-time süresince CPU ne yapıyor? Memory’de ne var? I/O’ya touch ediyor muyum? HEAP ne? STACK ne? Assembly böyle pasta yapmayı nereden öğrendi? :) Gibi sorulara cevap verebilmeniz çok iyi olur. (Eğer O/S bilgisi dendiğinde Windows, Linux kullanmak aklınıza geliyorsa, tavsiyem önce bu kısımdaki eksikliklerinizi tamamlayın.)
  • Günlük en az 1 saatlik çalışma zamanı. Evet, düzenli çalışma da bir gereklilik. Bir konuyu 1 günde veya 1 okuma anlayacaksınız diye bir şey yok. Tekrar, tekrar okuyabilirsiniz.
  • Etik sınırlar içerisinde yorumlar yapmaya dikkat edelim. Daha önceki deneyimlerimden yola çıkarak bu maddeyi eklemeyi uygun gördüm. Özellikle genç arkadaşlar bazen teknik konularda bir anda gereksiz bir tartışma ortamı yaratabiliyor. :) Bilim de genelde tek bir doğru yoktur. Burada hepimiz bir şeyler öğrenmeye çalışıyoruz. Bu nedenle, bir birinize karşı ne kadar hoş görülü olursanız beni o kadar çok yorum silmekten kurtarırsınız. Emin olun bu konuları günlük yoğunluğumdan arttırdığım 10/15dk’lar da yazıyorum. 3-5 parçada bir konu ancak tamamlanıyor.

Not: Eğer index’teki link çalışmıyorsa, henüz o konuyu yazmamış/tamamlamamış olabilirim. Konular tamamlandıkça bu sayfa otomatik güncellenecektir.

Not 2: Başlıkların bazıları İngilizce olabilir, merak etmeyin bütün ders anlatımları Türkçe. Örnekler ve terimler sadece İngilizce olacak. Çünkü İngilizcesini öğrenmeniz gerek.

Not 3: Bu konuları farklı yerlerde paylaşabilirsiniz. Etik olarak kaynak göstermek isterseniz ilgili konu URL’ni ekleyebilirsiniz. “URL, MURL uğraşamam ya” derseniz de, fark etmez. :) Amaç Türkiye’deki developer’ların kendilerini geliştirmeleri. Ha buradan okumuş, ha başka yerden fark etmez bence.

Algoritma – 1

Konu Index’ne ulaşmak için buraya tıklayabilirsiniz.

324px-LampFlowchart_tr.svg

Algoritma, 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. Yani belli bir problemi çözmek veya belirli bir amaca ulaşmak için çizilen yola algoritma denir. Genellikle programlamada kullanılır ve tüm programlama dillerinin temeli algoritmaya dayanır. Aynı zamanda algoritma tek bir problemi çözecek davranışın, temel işleri yapan komutların veya deyimlerin adım adım ortaya konulmasıdır ve bu adımların sıralamasına dikkat edilmelidir. Bir problem çözülürken algoritmik ve sezgisel (herustic) olmak üzere iki yaklaşım vardır. Algoritmik yaklaşımda da çözüm için olası yöntemlerden en uygun olan seçilir ve yapılması gerekenler adım adım ortaya konulur. Algoritmayı belirtmek için ; metinsel olarak düz ifade ve akış diyagramı olmak üzere 2 yöntem kullanılır. Algoritmalar bilgisayarlar tarafından işletilebilirler. (Wikipedia – 2015)

Algoritmanın temel tanımını hatırlatmak için yukarıya ekledim fakat benim değinmek istediğim kısım neden algoritma bilmenize ihtiyacınız var? Şuan eminim bir çok programcı algoritma bilgisi zayıf şekilde yazılım geliştirmektedir. Aslında bir çoğu algoritma dersi görmeden veya çok yüzeysel bir derste anlatılan kadar bilgisi var. Neden dünyanın en büyük yazılım firmaları, sizi ağır Java, C# veya C++ mulakatlarından geçirmek yerine Veri Yapıları ve Algoritma soruları soruyorlar? Onlar C#, Java uzmanı diye ilan vermeyi bilmiyorlar mı? Elbette bu şekilde ilan verebilirler fakat mevcut gelişmiş programlama dillerindeki veri yapılarını kendileri impliment edecek kadar iyi bilen developer’lar C++, C# veya Java’da class mı oluşturamayacak? Impliment etmekten kastım örneğin doubly linked list’i mevcut C# veya Java’nın size sunduğu yapıyı kullanmadan tüm methodları ile kendiniz yazmanız. Eğer bunu yapabiliyorsanız, aynı data structure’ı yazılım geliştirirken kullanamama veya anlayamama şansınız milyonda kaç?

Bu ve daha bir çok nedenden dolayı yazılım geliştirirken asıl yaptığımız iş problemi çözecek bir algoritma geliştirmektir. Algoritmalar dil bağımsız olduğundan hemen, hemen bütün dillerde aynı çözümü uygulayabilirsiniz. Bu noktadan sonrası o dil’e ve framework’e ne kadar hakim olduğunuz ile ilgili ama günümüzdeki web kaynakları ve yazılı kaynaklar o kadar gelişmiş seviyedeki software development ile ilgili milyonlarca kaynağa bir kaç saniyede erişebilirsiniz. Yani firmalar sizin ne kadar iyi Spring Framework veya .NET framework bildiğinizden çok ne kadar iyi ve hızlı problem çözebildiğinize bakıyorlar. Bir nevi beyin gücünüze yatırım yapıyorlar. Çünkü, biraz önce bahsettiğim konuları yapabiliyorsanız, C#.NET veya J2EE & Spring framework’ü öğrenmeniz 1 ay civarında alacaktır ve büyük firmalar bu süreleri sizlere tanıyacaktırlar. Özetle; hiç C# bilginiz olmadan da Microsoft’a, hiç Java, Python vs bilginiz olmadan Google, Oracle, Facebook’a girebilirsiniz ama bu demek değildir sadece data structure’a çalışmam yeter, hiç bir programlama dili bilmesemde olur. Büyük yazılım firmalar en az bir dile halim olmanızı beklerler. Java, C#, C++, Python, Scala vb. gibi.

Bir sonraki konuda algoritma türleri ve öncesinde Big-O konusuna değineceğiz. Bir sonraki konuya gitmek için tıklayınız.

 

The Big Bang – Giriş

Herkese merhaba,

Özellikle Türkiye’de yaşanan son gelişmeleri de dikkate alarak, yeni bir eğitim serisine başlamaya karar verdim. İkinci bir şans isteyenler için faydalı olacağını düşünüyorum. Başlık büyük patlama olsa da biz sadece medium ve senior level developer’lar için sıfırdan başlayacağız. Yani bu eğitim serisinin sıfırıncı noktası, yeni ve/veya deneyimsiz developer için kompleks olacaktır. Detayları aşağıdakı başlıklarda bulabilirsiniz.

Eğitim serisinin amacı nedir?

Bu eğitim serisinin amacı; orta ve üst seviye yazılım geliştiricilerin daha büyük firmalarda ve projelerde hatta uluslararası veya başka ülkelerdeki firmalar da çalışabilmesini sağlamaktır. Türkiye’deki eğitim sisteminin ne kadar başarılı(!) olduğunu herkes biliyor. Bu nedenle, kafasında software development/design ile ilgili soru işaretleri olan ve/veya X yapısını kullanıyorum ama arka planla ne yapıyor hiçbir fikrim yok diyenler için bu makaleler.

Eğitimin konusu ve sınırları nelerdir?

Bu eğitim serisi temel olarak veri yapılarından başlayarak algoritmalara ve diğer kompleks konulara kadar gidecektir. Ne kadar hızla ve ne kadar detaylı ilerleyeceği tamamen dönemsel zaman planıma bağlıdır. Sonuçta tek uğraşım bu blog değil. Eğitimin sınırı daha öncede bahsettiğim gibi temel seviyede konulara ve giriş seviyesi detaylara pek girmeyecektir. Bu eğitim serisinin amacı sizi sağlam bir temel üzerinde bir üst seviyeye taşımaktır. Yani, eğer makalenin başlığı “Distributed Data Structures” ise bu makalede asla Array, Linked List, Tree, Quick Sort algoritması nedir? Gibi bir paragraf bulamayacaksınız. Bunları daha önceden bilmeniz gerekli. Bilmiyorum ama öğrenmek istiyorum diyorsanız Google, Bing vs. search etmeniz için sizleri bekliyor.

Ne olacak, ne olmayacak?

Örneğin; Circular linked list konusunda size Linked list nedir?’i anlatmayacağım. Bu konuyu bildiğinizi farz edip devam edeceğim. Bu nedenle, bu eğitim giriş seviyesi developer’lar için pek uygun değildir. Belki kısaca bir paragraf ekleyebilirim ama bu sadece bazı önemli noktaları hatırlatma mahiyetinde olacaktır. Detaylı bir açıklama beklemeyiniz.

Bu eğitim bana ne katacak?

   Bu tamamen size bağlı eğer hikaye okur gibi okuyup geçerseniz çok fazla bir şey kazandırmaz. En fazla bir mükalatta terimlere ve konulara yabancı olmazsınız ama tahmin ettiğiniz bu, işe alınmanız için yeterli olmayacaktır. Temel seviyeden, ileri seviye veri yapıları, algoritmalar, zorlu yazılım problemlerinin çözümünü öğrenme ve pratik yapma şansı kazandıracaktır.

Bu eğitim serisini nasıl takip etmeyeliyim?

Başlığını okuduğunuz makaleyi bilseniz bile bir kez okumanız size bir şey kaybettirmez, belki de bildiğinizi sanıyorsunuzdur? Eksiklikleriniz varsa bunları tespit edebilirsiniz, eğer yoksa da bilginizi tazelemiş olursunuz.

Eğer okuduğunuz makale bir problemi ve bunun en etkili çözümleri üzerine ise, çözüm(ler)e bakmadan önce kağıt üzerinde (IDE Kullanmayın!) çözmeye çalışın. Çünkü, mükalatta size bir pc sağlamayacaklar. Bütün soruları white board üzerinde çözmeniz gerekecek. Eğer bir noktada sıkışırsanız, sadece çözüme bir ip ucu elde edebilecek kadar bakın, sonrasında tekrar kendiniz çözmeye çalışın. Bunu işleri zorlaştırmak için söylemiyorum. Kendinizi test etmeniz ve eksikliklerinizi keşfetmeniz için çok önemli ve mükalatlar için pratik yapmış olursunuz. Ayrıca, kodları kafanızda compile etmeniz gerekeceğinden biraz beyin cimlastiği de yapmış olursunuz. Unutmayın; genelde soruları kağıt üzerinde 30dk ile 45dk arasında çözebiliyor olmanız gerek. Sadece ileri seviye problemler ve konular için belki 60-70dk civarında süreniz olabilir. Tabii, bu edemek değildir ki 15dk’da best practice solution verebileceğiniz bir problemi 30dk’da çözdüğünüzde mükalattan geçebileceksiniz. İleri de belki farklı bir makale altında, teknik mülakatlar ile ilgili bilgileri derleyebilirim.

Bu eğitim için nelere ihtiyacınız var?

  • Sessiz bir ortam.
  • Kalem/Kağıt veya benzeri bir uygulamayı barındıran bir tablet olabilir.
  • Biraz ingilizce bilgisi. (İş hayatınız için en az Level-4 “Upper-Int.” gerek.) Türkiye’de herkes ingilizce biliyor ama yurtdışına geldiklerinde Cem Yılmaz’ın anlattığı o komik sahneler birebir gerçekleşiyor. Eğer software ile uğraşıyorsanız, ingilizceye çok çalışın.
  • 350 gram sabır. (Her makale için ayrı, ayrı) J
  • Kendinizi geliştirme isteği.

Notlar ve diğer bilgiler

Klavyemden dolayı bazen Türkçe harfleri hatalı yazabilirim. Ayrıca, olası Türkçe gramer hataları için şimdiden özür dilerim. Makalelerde bilerek terimleri İngilizce kullanacağım çünkü computer science’ta bir çok terimin Türkçe karşılığı yok, olanlarından çoğunu Türk olduğum halde anlayamıyorum. Bu nedenle, sizin de orjinalinden öğrenmeniz faydanıza olacaktır.

Bu aşamadan sonra The Big Bang eğitim serisi index’i konusuna geçebilirsiniz veya zamanınız varsa aşağıdaki kısmı okuyabilirsiniz.

Sorular ve Sorunlar

  • Konuya yorum yaptım neden kimse cevap vermedi?
    • Konuları işlerken elbette sorularınız olacaktır ama soru yağmuruna tutmadan önce internette araştırın lütfen. İnternette basitce bulunabilecek şeyleri soruyorsanız, neden yorumlarıma kimse cevap vermiyor diye düşünmeyin.
  • Sana nasıl ulaşıcaz?
    • Yapılan yorumları zamanım olduğunda okuyorum. Hepsine hemen cevap veremem çünkü burada sabah olduğunda, Türkiye’de gece oluyor. Ayrıca, tahmin edeceğiniz gibi benimde sorumluluklarım var.
  • Yok ille de ben sana ulaşıcam!
    • Eğer makaleler dışında farklı bir konu da ulaşmak isterseniz hakan.damar{at}linux[dot]com adresinden bana ulaşabilirsiniz.
  • Bir yazılım projemde problem var, yardım eder misin?
    • Hepimizin problemleri var J ama maalesef her istediğimiz an çözüm bulamıyoruz. Burada çok yoğun bir programım var bu nedenle farklı bir projeye ayırabilecek zamanım sıfıra çok yakın.
  • Seminerlere falan katılıyor musun? Oralarda görüşme şansımız olur mu?
    • Maalesef Türkiye’de yaşamadığımdan oradaki etkinliklere katılma şansım çok, çok düşük. ABD’deki önemli teknik seminerlere katılıyorum. Eğer ABD yaşıyorsanız, görüşme şansımız olabilir.
  • Sosyal medya hesaplarından sana nasıl ulaşabiliriz?
    • Facebook kullanmıyorum. Şaşırdınız değil mi? J Twitter hesabım var oraya bile zar, zor telefondan bakabiliyorum. Oradan follow edebilirsiniz.
  • Sen hacker mısın? :)
    • Değilim.
  • Bunlar CeHaPe’nin oyunu mu? :)
    • Değil.

Herkese başarılar dilerim.

Bu blog’a ne oldu?

Merhaba,

Daha önceki blogumu takip edenler varsa, şuan ki değişimi hemen fark etmişsinizdir. Evet, uzunca bir ara verdim. Ayrıca eski yazdığım makaleleri, yazıları, dersleri vs.’leri maalesef tekrar buraya yüklemeyeceğim. :)

Artık, yeni teknolojiler hariç giriş ve orta seviye teknik bir makele yayınlamayı da düşünmüyorum. Bu kararı vermemdeki sebep, 10 yıl önce bu tür teknik yazılar paylaşmaya başladığım da Türkiye’de henüz yeterince Türkçe kaynak yoktu. Artık, bir çok blogger var ve hızla Türkçe kaynak üretiliyor. Bu nedenle sadece kompleks ve ileri seviye konular hakkında yazacağım.

Bilgisayar bilimleri üzerine doktora seviyesi almaya çalıştığımdan, artık yazılarım serbest yapıdan biraz daha akademik makale tarzına kayacaktır. Merak etmeyin, dengeyi sağlamaya çalışacağım. :)

Herkese faydalı olması dileğiyle…

Hakan