OKUMA SÜRESİ 08:06

2024’te Öğrendiğim Yeni Şeyler

Sabah Elliott’ın YouTube videosunu izlerken düşündüm. Acaba ben neler öğrendim diye.

Yılın ilk aylarında, devraldığım Python/Flask projesi için api dokümantasyonu hazırlamam gerekti. Uygulama otomatik dokümantasyon yapamaya müsait olmadığı için tüm enpodint’leri elle, manuel olarak dokümante etmek zorunda kaldım. Bu zorlu süreç sayesinde OpenAPI Spec 2.0’ı sular seller gibi öğrendim. Gözüm kapalı swagger yaml’ları yazmaya başladım.

Bir süredir tüm yoğunluğum Go ile geliştirme yapmak olduğu için, ilk gözağrım Django’yu da unutmamak, melekelerimi kaybetmemek için geliştirmeler yapmaya devam ettim. Madem yeni şeyler öğreniyorum, haydi o zaman bu projede Tailwind CSS öğreneyim diyerek, önce bir TextMate bundle’ı yaptım. Projemde kullanırken gördüm ki standalone compiler’ı buggy. Mecburen Django projesi içinde sanki bir Node.js projesi gibi Tailwind’i entegre etmeyi de öğrendim.

TextMate’ten kopamayan adam olarak Ruff Linter ve Python Linter bundle’ları yaptım, bu esnada Ruby 1.8.6 (Tedavülden kalkalı en az 10 yıl oldu) ile mecburen uğraşmak zorunda kaldım :)

Django’dan kopamadığım için daha önce çalıştığım şirketin organizasyonundan yayınladığım ettiğim, ayrıldıktan sonra erişim sıkıntısı çektiğim bir Django Admin filtresi projem vardı, onu başlatan yazdım, bu esnada python paket reposunun manifestlerinin değiştiğini görüp yeni stili öğrenmek zorunda kaldım. Hatta ilk olarak eksik yayınlamışım, sağolsun Bahattin ikaz etti de düzelttim.

Her projemde, command-line otomasyonları için Rakefile kullanan biri olarak, aynı zamanda Ruby melekelerimi de korumamı sağlıyor, hep aklımda olan Rubocop ruby linter entegrasyonunu da hayatıma sokayım dedim, demez olaydım :)

Python için linter olarak Ruff’ı kullanıyorum, hızlı olduğu için. Ne yazık ki static check’leri yapamıyor. Yani olmayan bir paket import ettiğinizde Pylint gibi sizi doğal olarak uyaramıyor, böyle bir paket yok diye.

Mecburen Python/Django projeleri için Ruff ile birlikte çalışabilecek pylint entegrasyonu yapmayı da öğrenmem gerekti. Bu da yetmedi, bu işleri Pre-Commit ve GitHub Action’a da bağlamam gerekti. Keza rubocop’u da. Dolayısıyla kendimi iyi kötü bildiğimi düşündüğüm ama çok eksiğim olduğunu farkettiğim GitHub Action’ları bir tur daha pekiştirirken buldum.

Çok kullandığım bumpversion artık geliştirilmediği için yenisine geçeyim dedim; bump-my-version. Bir sürü şeyi öğrenmek, anlamak ve düzletme yapmam gerekti.

GitHub Action’lar da hızla güncelleniyor, tekrar depandabot entegrasyonu, action’ların güncel halleri, depricated olan direktiflerin düzeltilmesi vs derken yeni bilgilerle öğrenmeye devam ettim.

Yine Elliott’ın başka bir videosu beni acayip gaza getirdi ve bildiğimi sandığım Docker’da yeni level’lar açıldı. Neler mi geldi? Docker Swarm, sanal makineye cluster kurdum, kendi çapımda bir AWS, GCP ultra minimal versiyonunu kurdum. Traefik proxy/load balancer, Docker Networking, Docker Secrets, secure container images, Docker Stack gibi gibi bir sürü şeyi öğrendim ve production ortamı oluşturdum. Portainer diye harika bir orkestrasyon aracı ile tanıştım, hastası oldum.

Her şeyi minimum giderle yapmak için, GitHub’ın container registry’sini (GHCR) daha iyi kullanmayı öğrendim.

İmkanlar kısıtlı olunca kaynağı da doğru ve efektif kullanabilmek için hesap kitap yapmam da gerekti. Hangi servis, ne kadar memory, cpu tüketmeli, kaç replica ile işi çözerim, zero-down-time deployment’ı nasıl çözerim, custom servislerin metrikleri Grafana’ya nasıl akıtırım gibi gibi bir sürü branşım dışı şeyi de kurcalaya kurcalaya öğrendim.

Eski çalıştığım işlerde genelde devops konularını birileri çözerdi ve ben sadece tüketici olarak dashboard’lara bakar takip ederdim, şimdi hepsini kendim yapmak durumunda kalınca mecburen bunları da öğrenmek zorunda kaldım.

İş başa düşünce mecburen öğrenmek gerekiyor, zevkli de oluyor, kendi adıma acayip keyif aldım. Prometheus entegrasyonu, özel bir alarm yapıp bunu Slack’e göndertmek bu kadar zor olmamalı, korkunç bir kullanıcı deneyimi olan Grafana işini süper yapmasa gerçekten kullanması çok zor :) Belkide benim beceriksizliğim de olabilir ama sonuç olarak eliniz ayağınız oluyor Grafana!

Hazırladığım eğitimler bildiklerime cila çekmeyi de sağlıyor, hem unuttuklarımı hatırlıyorum hem de yeni şeyler ekliyorum. Bu doğrultuda, hazırladığım Docker eğitimi için basit bir endpoint’i olan http servisini her platformda yazıp dockerize ettim;

  • Django
  • Flask
  • FastAPI
  • Node
  • Sinatra
  • Go
  • C
  • C#

Dolayısıyla, C, C# benim için ilk kez kurcaladığım şeyler oldu, tam olarak öğrendim diyemem ama biraz kasarsam istediklerimi yapabilirim gibi geliyor. Bu arada hepsinin yaptığı iş bir tane endpoint var ve geriye json olarak:

{"hello": "world"}

Dönüyorlar. Geliştirmesi bana göre en zor olan C, ama tükettiği ram ve cpu olarak bakınca hiç biri yanından bile geçemiyor. Neredeyse YOK denecek kadar az.

Stack Memory Image Size
C 108KB * 69.3Mb
Go 2.95MB 11.7Mb *
Node 13.8MB 218MB
DotNet 15.92MB 253MB
Sinatra 28.8MB 97.7MB
Flask 34MB 161MB
FastAPI 38.8MB 122MB
Django 53.12MB 203MB

İnanılmaz düşük memory tüketimiyle C açık ara ezdi geçti. En düşük container image size olarak Go affetmedi. Hepsi multi-stage build, kendi bilgilerim dahilinde olabilecek en küçük image’lar…

macOS kullanıyorum, bu bakımdan Docker’la ilişkim çok arttığı için Orbstack’i de derinlemesine kullanmayı öğrendim.

Bu yıl, http katmanıyla çok ilgilendim, dolayısıyla yeni şeyler de öğrendim. Sene başında ilk commit’i yaptığım, geçtiğimiz günler cila çekip refactor ettiğim basit bir http request debugger’la uğraşırken yine RAW HTTP, isteklerin replike edilmesi gibi konularla uğraşıp basit bir araç yaptım.

HTTP Request ile uğraşınca, Accept header’ının da derinlerine indim, lazım olur diye hem öğrendim hem de mimik bir go kütüphanesi yaptım.

ngrok süper bir tool ama her ay $9 ödememek için bunun free ve open-source versiyonuna başladım, tcp katmanında beni bekleyen yeni maceralara da giriş yaptım dolayısıyla. Bittiği zaman açık-kaynak ve ücretsiz olarak, her developer’ın ihtiyacı bir tool olarak dağıtacağım.

Mobile client ile sunucu arasında güvenli iletişimi sağlamak için SSL REVERSE PINNING konularına girdim, dolayısıyla sertifika türleri, üretimi, verify etmek vs gibi konularda bu yıl boğuştuğum şeyler arasındaydı.

Mobil uygulama geliştiricilerinin çok sevdiğini düşündüğüm Supabase’i de bu yıl kurcalamak ve öğrenmek durumunda kaldım. Gerçekten bir çok problemi ücretsiz olarak çözmeyi sağlıyor.

Vercel hep bildiğim bir platform ama hiç kullanmamıştım, denemek için basit bir python app’i deploy ettim, eskiden bu tür işlerde Heroku kullanırdım, Vercel iyi bir alternatif oldu.

Webhook’larla uğraşırken tesadüfen requestcatcher.com diye bir ücretsiz servise denk geldim, çok işime yaradı.

En çok işime yarayan yeni öğrendiğim, daha doğrusu biliyordum ama kullanmamıştım, artık elim ayağım oldu, direnv. Environment Variable’larla uğraşanların çok işine yarar diye düşünüyorum.

GitHub’da hızlıca repo oluşturmak için minik bir tool yaptım, Go’nun yeni embed özelliklerini de bu sayede öğrendim.

Bu sene kitap açısından da (fiziksel kitap, ebook değil) verimli geçti; şu kitaplara başladım:

Dedim ya, asıl stack’im Go. Bir kısım yanlışlarımı da bu yıl öğrendim. Hatta biraz kendime de kızdım, bu hataları benim yapmamam lazımdı. Olsun, en azından artık bu tür hataları yapmam, tokadı yedim :)

Kendi çapımda biraz AI işlerine de baktım ama genel olarak tüketen tarafındayım, ilk kez bu sene local’de bir şeyleri ayağa kaldırıp kurcaladım. ChatGPT’yi çok kullanmaya başladım, bu iyi değil. Irgat gibi işi ona yaptırıp, şurayı düzelt burayı düzelt diyorum.

Şöyle dönüp bakınca bu yıl open-source 1-2 ufak şey yapmışım, bu da beni mutlu ediyor. Bol bol tuturial izledim (YouTube, LinkedIn Learning, O’Reilly, Frontend Masters), bildiğimi sandığım ama çok eksiğim olan şeyleri de görmüş oldum.

Özetle 2024 kendi adıma bol bol öğrenme, okuma, izleme ve geliştirme ile geçmiş. Umarım okuyucalar da benzer şeyleri yaşamıştır. Bakalım 2025 nasıl geçecek!

Linkler

Yazıda bahsi geçen kendi geliştirdiğim projelerin linkleri aşağıda: