48

Grokking Algorithms Üzerine

Grokking Algorithms kitabı hakkında detaylı bir inceleme ve algoritmaların yazılım geliştirmedeki önemi üzerine düşünceler.

Bugün uzun zamandır beklettiğim ve sonunda okuma fırsatı bulabildiğim “Grokking Algorithms: An Illustrated Guide for Programmers and Other Curious People” kitabından bahsedeceğim.

Algoritmalar ve veri yapıları konusunda okuyacağınız en keyifli yayınlardan biri olacak bu kitap, karmaşık konuları basit bir dille ve görsel ögelerle anlatıyor. Algoritmalar ve veri yapıları dünyasına ilk adımı atan ve bu konularla ilgili öğrenme süreci yeni başlayan arkadaşların baş ucu kitabı olabileceğini rahatlıkla söyleyebilirim.

Alışılagelmiş makalelerin ötesinde bir yazı yazmak istiyorum. Bu konuyla ilgili onlarca makale yazılmış ve video çekilmiş olduğunu düşününce aslında bu makaleyi yazıp yazmamakta kararsızdım fakat hem kitabın ikinci baskısının çıkmasından dolayı hem de önemli gördüğüm bazı kısımlarla ilgili okuyucuya bir parça da olsa ışık tutabilmek için makaleyi yazmaya karar verdim.

Özellikle teknik kitap okurken kendimize sorduğumuz sorulardan bir tanesi: “Bu kitap bana ne kazandıracak? Neden bu kitabı okumalıyım?” olur. Hepimizin zamanı kıymetli olduğu için bu soruları sormak kadar doğal bir şey olmasa gerek. Bu soruların cevabını vermek istediğim makalemde size faydalı olabilirsem ne mutlu bana. Hadi başlayalım!

Neden bu kitap?

”Introduction to Algorithms” ve “Algorithms Design Manual” gibi kült kitaplara göre Grokking Algorithms’in akademik dilden uzaklaştığını ve algoritmaları hayatın içinden senaryolar üzerinden anlattığını görebilirsiniz.

Grokking Algorithms

Algoritmaların önemi neden sürekli vurgulanıyor?

Algoritmalar, modern dünyanın adeta görünmez kahramanlarıdır. Ayrıca günlük hayattan yazılım dünyasına, matematiğe ve teknolojiye kadar her alanda kritik bir rol oynarlar. Öncelikle, algoritmalar problemleri sistematik ve verimli bir şekilde çözmemizi sağlar. Bu, basit bir yemek tarifinden karmaşık bir bilgisayar programına kadar her türlü süreci optimize etmemize yardımcı olur. Yazılım dünyasında, her uygulama ve program, temelinde bir veya birden fazla algoritma barındırır. Bu algoritmalar, uygulamaların hızlı, etkin ve hatasız çalışmasını sağlar. Matematikte, problemleri çözmek için kullandığımız yöntemler de birer algoritmadır.

Örneğin, dört işlem sırası bile bir algoritma örneğidir. Bilgisayar bilimlerinde algoritmalar, veri yapılarıyla birlikte, karmaşık problemleri çözmek, büyük veri setlerini işlemek ve yapay zeka sistemleri geliştirmek için kullanılır. Günlük hayatta ise, farkında olmadan sürekli algoritmaları kullanırız; alışveriş yaparken, seyahat planlarken veya basit bir karar verirken bile. Algoritmaların önemi, hayatımızı düzenlemesi, karmaşık süreçleri basitleştirmesi ve teknolojik ilerlemeyi mümkün kılmasında yatar. Bu nedenle, algoritmaları anlamak ve geliştirmek, sadece yazılımcılar için değil, modern dünyayı anlamak ve şekillendirmek isteyen herkes için vazgeçilmez bir beceridir.

Neden bu kitap?

Anlatımın görseller üzerinden yapıldığı bu kitapta algoritmaları daha basit ve akılda kalıcı bir şekilde anlayabiliyorsunuz.

Teknik kavramlar öğretilirken yenilikçi bir yaklaşım kullanılıyor.

Kabul edelim, teknik kitapları okumak her zaman zordur. Sayfa sayısının çok olması ve birçok görselin, grafiğin anlaşılamaz gelmesi genellikle korkutur okuyucuyu. Üniversite yıllarında ve sonrasında okumak zorunda olduğunuz ve daha sonra rafa kaldırılan onlarca kitabı düşündüğünüzde neden bu kitabı okumalıyım sorusunu kendinize sormanız çok olası.

Veri yapıları ve algoritmalar ilgi çekicidir, ancak aynı zamanda çok karmaşıklardır ve anlaşılmaları zordur, özellikle de somutlaştırılmamışlarsa ve çok iyi açıklanmamışlarsa. Kendinizi vererek ilerlemenize imkan vermeyen bu tür kitapların keyiften ziyade eziyete dönüşmesi hissini, üniversite yıllarında okumak zorunda olduğunuz ve okuduktan sonra da kitaplık raflarında tozlanan onlarca kitabı düşündüğünüzde mutlaka yaşamışsınızdır.

Aditya Bhargava, algoritmaları öğretme konusunda yenilikçi bir yaklaşım sergiliyor. Kitap, karmaşık kavramları günlük hayattan örneklerle açıklayarak, okuyucuyu algoritmalar dünyasına adım adım sokuyor. Örneğin, binary search algoritmasını telefonunuzdaki rehberde isim ararken kullandığınız yönteme benzetirken, arrays ve linked lists konusunu sinemaya giden arkadaş grubu örneği üzerinden ilerletiyor.

Kitaptaki en güzel örneklerden biri, Dijkstra’s Algorithm’i anlatırken verdiği hikayedeki karakterimiz Raman’ın kendisine piyano alabilmek için en uygun takası nasıl yapabileceğini anlattığı “Trading for a piano” örneği. Bu tür benzetmeler, soyut kavramları somutlaştırarak öğrenmeyi kolaylaştırıyor ve akılda kalıcılığı artırıyor.

“Trading for a piano” örneğinden bir görsel.

Kitap size kendini anlatırken görsel bir şölen sunuyor.

Değerlendirmemde birinci sıraya koyacağım madde nedir diye sorarsanız, her sayfasını süsleyen eğlenceli grafikler ve resimler diyebilirim. Bu grafikler ve resimler algoritmaların işleyişini adım adım göstererek öğrenme sürecini hızlandırıyor ve kendinizi adeta çizgi roman okuyormuş gibi hissediyorsunuz. Örneğin, quicksort algoritmasını ve algoritmanın kullandığı divide and conquer (D&C) problem çözme yaklaşımını açıklarken kullanılan çizimler, algoritmanın çalışma mantığını adım adım gelişen resimlerle bir bakışta anlamanızı sağlıyor.

Neden bu kitap?

Her bölüm, teorik bilginin yanı sıra, pratik uygulamalar ve kod örnekleri de içeriyor. Bu sayede okuyucu, öğrendiği kavramları nasıl uygulayacağını da görebiliyor.

Grokking Algorithms’i okumayı düşünenler için biraz da içeriğinden bahsetmek istiyorum. Kitabın içeriği, algoritmaları ve veri yapılarını basitten karmaşığa doğru ele alacak şekilde düzenlenmiş. İşte içindekiler kısmından öne çıkan bazı bölümler:

  • Introduction To Algorithms
  • Selection Sort
  • Recursion
  • Quicksort
  • Hash Tables
  • Breadth-First Search
  • Trees
  • Balanced Trees
  • Dijkstra's algorithms
  • Dynamic programming
  • K-Nearest Neighbors

Kitabın ikinci baskısını okumanızı tavsiye ederim. Yazar, ikinci baskıda “Trees” ve “Balanced Trees” bölümlerini ekleyerek kitabın içeriğini zenginleştirmiş.

Recursion

En dikkat çekici bölümlerinden bir diğeri de, özellikle yeni başlayanların sıklıkla zorlandığı recursion (özyineleme) kavramını ele aldığı kısımdır. Yazar, bu karmaşık görünen konuyu, büyükanne evinin çatı katındaki kilitli bir bavulu açabilmek için iç içe koyulmuş bir sürü kutu içerisinden bavulun anahtarını nasıl bulabileceğimizi anlatarak açıklıyor. Hikaye ile beraber ilerlerken de recursive fonksiyonları kullanırken iki önemli kavram olan base case ve recursive case’i anlatarak konunun kolayca anlaşılmasını sağlıyor.

Recursive fonksiyonları anlatırken kullanılan iç içe geçmiş kutular örneği.

Trees & Balanced Trees

Grokking Algorithms, veri yapıları ve algoritmaların temellerini anlaşılır bir şekilde anlatırken, trees ve balanced trees konularına özel bir önem veriyor.

Trees bölümünde, öncelikle tree yapısının temel kavramları açıklanıyor. Root, node, parent, child, branch ve leaf gibi terimlerin ne anlama geldiğini öğreniyorsunuz. Ardından da tree’lerin gerçek hayattaki uygulamalarına değiniliyor. Örneğin, dosya sistemlerinin nasıl bir tree yapısında olduğunu rahatlıkla anlayabilirsiniz.

Kitap, tree’ler konusunu derinleştirirken binary trees ve özellikle binary search trees — BST üzerinde duruyor. BST’lerin, verileri hızlı bir şekilde aramak ve eklemek için nasıl kullanıldığını öğretiyor. Ayrıca, depth-first search ve breadth-first search algoritmalarının tree’ler üzerinde nasıl çalıştığı açıklanıyor.

Balanced Trees bölümünde ise, BST’lerin potansiyel bir problemine değiniyor: Dengesizlik. Dengesiz bir BST’nin performansının nasıl düşebileceği anlatılıyor ve bu sorunu çözmek için balanced trees tanıtılıyor. Özellikle AVL trees üzerinde durularak AVL trees’in kendilerini nasıl dengelediğini, rotasyon işlemleri ile detaylı bir şekilde açıklanıyor.

B-Trees’i tekrar tekrar okumanızı tavsiye ederim. Eğer siz de veri tabanı sistemlerine ilgi duyuyorsanız tree yapısının performans konusunda nasıl fayda sağladığını ve disk erişimine nasıl katkıda bulunduğunu çok daha iyi anlayacaksınız.

Soyağacı örneği.

Neyi beğendim?

Grokking Algorithms kitabında en çok beğendiğim konu, karmaşık algoritma ve veri yapısı kavramlarını anlaşılır bir dille ve görsel öğelerle açıklaması oldu. Kitap, günlük hayattan alınan örnekler ve ilgi çekici senaryolarla konuyu somutlaştırmış.

Örneğin, Facebook’un kullanıcı verilerini nasıl depoladığı gibi güncel örnekler, öğrenme sürecini daha ilgi çekici hale getiriyor. Kitabın ansiklopedi kalınlığında olmaması da artılarından biri. Temel veri yapılarını kapsamlı bir şekilde ele alması ve zor konuları bile anlaşılır kılması, kitabı algoritmalara giriş için mükemmel bir kaynak yapıyor.

Nasıl daha iyi olabilirdi?

Kitabı daha da iyi yapabilecek bazı noktalar var. Öncelikle, kitap veri yapıları konusunda biraz daha derinlemesine inceleme yapabilirdi. Özellikle binary trees, BST ve trie gibi önemli veri yapılarına daha da fazla yer verilerek örnekler artırılabilirdi.

Ayrıca, kitap bazı temel algoritmaları (örneğin, kodlama ve şifreleme algoritmaları, map-reduce) kapsamıyor. Her ne kadar kitabın sonunda ek algoritmalar hakkında kısa bir genel bakış sunulsa da, bu konuların daha detaylı işlenmesi, kitabı daha kapsamlı bir kaynak haline getirebilirdi. Yine de, bu eksiklikler kitabın bir giriş seviyesi kaynağı olma amacını etkilemiyor.

Neden okumalısınız?

Algoritmaları ve veri yapılarını öğrenmek için keyifli bir başlangıç yapmak istiyorsanız, teknik bilginizi arttırmaya ve/veya tazelemeye ihtiyaç duyuyorsanız, LeetCode vb. platformlarda karşılaştığınız algoritma sorularının çözümünün mantığını da öğrenmek istiyorum diye düşünüyorsanız, kod incelemesi yaparken karşınıza çıkan veri yapılarının ne maksatla kullanıldığını daha iyi anlamak istiyorsanız ve kariyer gelişimi kapsamında mentorluk yaptığınız kişilere daha faydalı olabilmek için bu kitabı okumalısınız.

Sonuç olarak, eğer algoritmaları daha iyi anlamak, problem çözme becerilerinizi geliştirmek ve yazılım dünyasına farklı bir perspektiften bakmak istiyorsanız, “Grokking Algorithms” kesinlikle okunması gereken bir baş ucu kitabı. Hem yeni başlayanlar hem de deneyimli yazılımcılar için değerli bilgiler ve bakış açıları sunan bu eser, algoritmaların büyüleyici dünyasına eğlenceli bir giriş yapmanızı sağlayacak. Keyifli okumalar dilerim.