Evet, bugün sizlere yeni çıkan bir teknolojiden veya bunun etkilerinden değil de herkesin diline pelesenk olmuş, “Yazılım öğrenin gençler!” ifadesinin eyleme dökülmüş bir hâlini aktarıyor olacağım. Bir süredir “Rekabetçi Programlama” denilen alana ilgi duyuyordum ve bu alandaki yarışmaları takip ediyordum. Öncelikle sizlere bunun ne olduğundan bahsedeyim. Bunun bir tür zihinsel spor olduğunu kolaylıkla söyleyebiliriz çünkü size verilen bir problemi çözmek için programlama yeteneklerinizi kullanmanız ve bunu yaparken sorularda belirtilen kısıtlamaları aşmayacak şekilde bir algoritma tasarlamanız gerekiyor.
Peki sizce ne olabilir bu kısıtlamalar? Elbette hız ve hafıza! Problemi çözmek için geliştirdiğiniz algoritmanın çalışma hızı ve çalışırken kullandığı hafızanın belirlenen limitlerin altında olması gerekiyor. Bu tür parametreleri kontrol etmek için de algoritmaların Big-O (Büyük-O) Notasyonu denilen zaman karmaşıklığını matematiksel olarak gösteren gösterimi manipüle etmek gerekiyor. Bu sayede tasarlanılan algoritmaların çalışma hızı hakkında bilgisayara yansıtılmadan önce bir fikir edinebilmemiz sizce de harika değil mi? Teşekkürler matematik…
Şimdi gelelim Google Hash Code maceramıza! Bu konudaki araştırmalarıma devam ederken bir anda Google’ın düzenlediği yarışmaların olduğu bir web siteye denk geldim ve tam bir hafta sonra “Google Hash Code” adlı çevrimiçi bir takım yarışması düzenlendiğini gördüm. ICPC (Uluslararası Üniversitelerarası Programla Yarışması) gibi rekabetçi programlanın zirvelerinden biri olarak kabul edilen yarışmalardaki beklentilerin aksine Google Hash Code, yalnızca bir adet büyük bir optimizasyon problemi vererek kendileri gibi devasa şirketlerin sıkça yüzleşebileceği sorunlara yönelik bir yarışma düzenliyordu. Aslında bu bir şirket için son derece stratejik bir hamle çünkü Google’ın yayınlamış olduğu bir videoya göre Hash Code yarışması 2022 senesinde 120,000’den fazla başvuru aldı. Yani aslında Google kendi yüzleştiği bir çok parametreli optimizasyon problemi için 245 dakikalığına prestijini kullanarak dünyanın her bir yanından birbirinden yetenekli 120,000’den fazla yazılımcıyı işe alıp bu yarışma adı altında hiç de büyük bir bütçe ayırmayarak kendi problemlerini yazılım dünyasının odağı hâline getirmeyi başardılar. Kaldı ki bir optimizasyon problemi için yapılacak en büyük iyilik defalarca kez denenmiş, elekten geçirilmiş, farklı yaklaşımlarla tekrardan denenmiş olmasıdır. Böyle bir yarışma vasıtasıyla da milyonlarca kez her biri farklı yaklaşımlarla geliştirilmiş algoritmaların arasından en iyi sonuç vereni seçebilme rahatlığına erişebilmiş oldular. Bana soracak olursanız bu tür yarışmalar hem mühendislik camiasının gelişmesi için hem de büyük şirketlerin problemlerini çözme noktasında son derece başarılılar. Hatta kaldı ki Hash Code yarışmasının eleme turlarını geçen ilk 50 takım, ki bu katılımcı takım sayısını göz önünde bulundurunca son derece iddialı bir sıralama, Dublin, İrlanda’daki finallere katılarak maharetlerini çok daha zorlayıcı bir problem karşısında yüz yüze de sergilemiş oluyorlar. Elbette bu süreç Google için harika bir işe alım fırsatını da beraberinde getiriyor.
Her ne kadar bir yazılımcı için böylesine prestijli bir şirketin düzenlemiş olduğu yarışmada finallere katılmak kıymetli bir an olsa da Kamil Debowski’nin (Errichto), en iyi rekabetçi programlama sporcularından ve eğitmenlerinden birisidir, de bir YouTube röportajında söylediği üzere şirketler bu sektördeki avantajlarını artırabilmek için büyük değişikliklere gitmek durumunda kaldılar. Eskiden yüz binlerce dolar ödüllü rekabetçi programlama yarışmalarının düzenlendiğine denk gelmek son derece mümkün fakat az önce tarif ettiğim Google Hash Code yarışmasının ilk üçe girenler için vermiş olduğu ödüller sırasıyla: $4,000; $2,000; $1,000! Sizce de devasa bir düşüş yaşanmamış mı? İşte Errichto, bunun sebebini şirketlerin eskiden verdiği ödüllerin iş tekliflerine karşılık çok daha avantajlı olmasına bağlıyor. Sonuçta başarılı bir rekabetçi programlamacı; 3-4 saat gibi bir süre ayırıp $100,000 ödüllü bir yarışmada galip gelmeyi, aynı parayı bir yıl o yarışmayı düzenleyen şirkette çalışarak kazanmaya tercih ediyor. Kaldı ki bu programcı bir sene boyunca bu tarzda onlarca yarışmaya katılıp galip gelebilir! Dolayısıyla şirketler günümüzde artık bu meblağlarda ödüller vermiyorlar.
Peki neydi bu senenin sorusunu Google için bu kadar özel yapan şey? 2022 yılının sorusuna şu linkten ulaşıp inceleyebilirsiniz [TIKLA]. Sorunun ne kadar Google’ın hedefleri ile alakalı olduğunu görüyor musunuz? Bu algoritmanın en optimize hâlini kullanarak devasa bir veri yığınının içerisinden gelecek projelerinizin gerçekleşmesi için hem en verimli hem de en hızlı çözümleri üretebilirsiniz. Aslına bakacak olursanız HackerRank veya türevi programlama mülakat hazırlık web sitelerini çalışanları üzerinde kullanıp sağlıklı ve gerçekçi bir veri kaynağı oluşturan bir şirket, Hash Code’da tasvir edilen problem vasıtasıyla geleceğe yönelik planlarını çok daha sağlam bir şekilde yapabilir. Bu problemi çözmek için ise 2-4 kişilik bir takım ile katılım göstermemiz gerekiyordu. Bu yüzden Ege Aybars Bozkurt, Berkay Gündüz ve Alp Dursunoğlu adlı üç arkadaşımla beraber güzel gir takım oluşturduk ve yurtlarda bir ortak çalışma alanına bilgisayar monitörlerimizi taşıyarak aşağıdaki gibi kendimizi motive edebileceğimiz harika bir atmosfer oluşturduk!
Yarışmanın başlamasıyla beraber geçmiş yılların problemlerine kıyasla çok daha zorlayıcı bir soruyla karşılaştığımızı fark ettik çünkü soruyu henüz açar açmaz kaydırma çubuğunun sağ tarafta küçücük kaldığını kaybettik. (Bu arada geçmiş yılların Google Hash Code problemlerine buradan erişebilirsiniz.) Yaklaşık 25 dakikalık bir problemi çözümleme ve beyin fırtınasının ardından takım olarak belirlediğimiz programlama dili olan Python ile bu probleme karşılık geliştirebileceğimiz hamleleri değerlendirdik. Tam bu noktada şunu da belirtmeliyim ki birçok ICPC yarışmacısı da dahil olmak üzere neredeyse bütün rekabetçi programlama yarışmacıları C++ dilini, özellikle de çok hızlı olduğu, algoritma yönetim stratejilerinin çok fazla alternatif içermesi ve hakkında pek çok doküman bulunması nedeniyle tercih ediyor. Dolayısıyla bu alana dahil olmayı düşünürseniz C++’ın bu alandaki en popüler programlama dili odluğunu bilmenizde fayda var. Biz ise Python gibi bir seçim yapmıştık ve Pandas-Numpy gibi kütüphaneleri kullanarak büyük veri setlerini derlemek ve Nesne OOP (Nesne Yönelimli Programlama) gibi metotlar kullanarak bu soruyu çözebileceğimize karar verdik. Yaklaşık ilk bir buçuk saatte her birimiz bireysel olarak tamamen farklı tekniklerle problemi belli bir noktaya kadar çözmeye odaklanmada karar kıldık. Şahsen ben soruda bahsi geçen projelerdeki roller ve çalışanların sahip olduğu yeteneklere göre derlenmiş sınıflara odaklanmış bir optimizasyon stratejisi geliştirerek Nesne Yönelimli Programlama’dan faydalandım.
Şunu rahatlıkla söyleyebilirim ki bu kadar büyük bir verinin işlenmesi ve sonra da bu kadar fazla parametreye bağlı bir optimizasyon sürecinin yönetilmesi son derece zorluydu. Dolayısıyla ilk bir buçuk saatten sonra herkesin hangi noktada olduğuna ilişkin hızlı bir kritik yaptık ve bir tanesini seçerek ve grup olarak probleme odaklanmaya devam ettik. Bir yandan diğer yarışmacıların Liderlik Tablosunda hızla yükseldiğini görüyorduk ve hepimizin ilk rekabetçi programlama yarışması olduğu için bu hızlara ve sonuçlara gerçekten hayret ediyorduk. Özellikle de rekabetçi programlamanın parlayan yıldızlarından olan Gennady Korotkevich (tourist), gelmiş geçmiş en başarılı ve gözde rekabetçi programcı olduğunu kolaylıkla söyleyebilirim, gibi kişilerin de bu tarz yarışmalara sıklıkla katıldıklarını bildiğimiz için bir yandan da harika bir tecrübe edindiğimizin farkındaydık. Yarışmanın sonlarına yaklaştıkça ise yüklediğimiz çözüm dosyalarının büyük bir kısmının istediğimiz gibi sonuçlar vermediğini fark ettiğimizde yeni bir strateji geliştirerek çok daha basit ve kısa kod kümeleri kullanarak ASCII verilerini bizlerin anlayabileceği ve işleyebileceği seviyelere indirgedik. Ardından da veri çıktılarımızı doğrudan bütün problemin girdilerine sonuç getirecek şekilde değil de parça parça çözerek takımımıza azar azar da olsa daha sıklıkla puan kazandıracak olan bir yöntemi tercih ettik. Yarışmanın son bir saatinde heyecanı da artırmak için liderlik tablosu dondurulmuştu ve takım olarak konsantrasyon problemleri yaşadığımız için artık değişimli olarak tek bir programın üzerinde çalışmaya başladık ve nihayetinde yarışmayı harika deneyimler kazanarak tamamladık! Gerçekten hayatımda karşılaştığım en zorlayıcı problemlerden bir tanesiydi.
Yarışmaya girdikten sonra ve bu alandaki başarılı programcıları araştırdıktan sonra şunu fark ettim ki rekabetçi yarışmacılar gerçekten de bir şirketin kadrosuna dahil olduktan sonra dahil oldukları takımdaki dengeleri çok büyük oranda değiştirebilecek kapasiteye sahip kişiler. Programların karmaşıklık düzeylerini hızlı bir şekilde tespit edip kurgulayabilmeleri kesinlikle bir algoritmanın temellerini oluşturuyor ve bu hususta uzman kişilerle çalışmak şirketler için çok büyük ayrıcalıklar oluşturuyor. Tabii bütün bunların yanı sıra çoğunlukla okunup anlaşılması çok zor kodlar yazmaları, PEP-8 kurallarını sıklıkla ihlal ettiklerini söyleyebilirim, veri girdilerinin kesinliğini ve sorgulanabilirliğini çoğunlukla reddedecek algoritmalar geliştirmeleri, yarışma kültürüne olan bağlılıklarından dolayı girdi dosyalarını esas kabul eden kodlar geliştiriyorlar fakat kullanıcı etkileşiminin yüksek olduğu veri gruplarıyla çalışan şirketlerin projelerinde bu tarz bir yaklaşım büyük problemlere yol açabilir, veri/model zehirlenmelerine yol açabilir ama bunlar elbette bu kişilerin muazzam yazılımcılar olduğu gerçeğini hiçbir şekilde değiştirmez çünkü yığılımlı ilerleme ve çapraz kontrol politikaları sayesinde bu kişilerden çok yüksek verimin alınabileceği çalışma takımları rahatlıkla oluşturulabilir.
Benden size bu alan hakkında son bir tavsiye de en yakın zamanda “On Parmak Klavye” kullanma yeteneğinizi geliştirerek programlamadaki hızınıza hız katmak olacaktır. Her ne kadar alışması diğer herhangi bir alışkanlık kadar zor bir süreç olsa da internette hızlı bir araştırma yaparak bu konuda kendinizi geliştirebileceğiniz birçok web sitesi bulabilir ve kendinizi klavyenizi aşağıdaki resimde gördüğünüz şekilde kullanmaya zorlayarak profesyonel rekabetçi programcılar gibi son derece hızlı yazı yazan kişilere dönüşebilirsiniz! Zaten rekabetçi programcıların videolarını izlerseniz [ÖRNEK VİDEO] problemlere geliştirdikleri cevapların yıldırım gibi olduğunu kolayca fark edebilirsiniz.
İşte bütün bunlar benim 245 dakika gibi kısa bir sürede farkına vardığım ve öğrendiğim bilgilerdi! Dilerseniz sizler de bu konuda çok daha detaylı araştırmalar yaparak Rekabetçi Programlama sporunun bir parçası olarak çok yenilikçi ve problem çöme odaklı yetenekler geliştirebilirsiniz. Bu konuda sizlere yardımcı olabilecek birçok yarışma ve bilgi platformunu da kaynakçama bırakıyorum! Sağlıcakla ve kodla kalın!
Kaynakça
https://www.geeksforgeeks.org/competitive-programming-a-complete-guide/
https://www.freecodecamp.org/news/big-o-notation-why-it-matters-and-why-it-doesnt-1674cfa8a23c/
https://codingcompetitions.withgoogle.com/hashcode/round/00000000008caae7/000000000098afc8
https://www.python.org/dev/peps/pep-0008/
https://codingcompetitions.withgoogle.com/hashcode/archive
Gennady Korotkevich YouTube: https://www.youtube.com/channel/UCkySD00cmDWYHXA31hqRYRw
Fotoğraf/Video Alıntısı:
https://www.getbidbar.com/blog/overview-important-programming-topics