Dark Side: Software

Giriş⌗
Herkese merhabalar, bu yazıda kısaca ‘Nasıl Yazılımcı Olurum’, ‘Yazılıma Nasıl Başlamayalıyım’ gibi sorulara cevap verip konuyu basitçe anlatmaya çalışacağım.
Öncelikle bu mesleği ne için yapmak istediğimizi bilmeliyiz. Sadece parası iyi diye yazılımcı olmak istiyorsanız kesinlikle yanlış yerdesiniz. Yazılım aslında sürekli öğrenmeye dayalı bir daldır, sizin her daim öğrenmeye ve yeniliklere açık olmanız gerekir.
Continuous Learning (veya diğer adıyla Lifelong Learning - Yaşam Boyu Öğrenme) bu noktada çok önemli oluyor, zira yazılım sektörü her 5 senede bir kendini yeniliyor. Dün üzerinde bilgi sahibi olduğunuz ve para kazandığınız teknolojilerin bugün değeri kalmamış, azalmış veya yerini daha iyilerine bırakmış olması muhtemeldir.
Dil Seçimi⌗
Genelde yeni başlayan herkes hangi dil ile başlamalıyım gibi sorular sorup dururlar. Aslında burada dikkat edilmesi gereken konu dil seçimi değil yazılımın hangi alanında çalışmak istediğinizdir. Çünkü yazılım çok genel bir terimdir ve altında dallara ayrılır. Bunların bazıları:
- BackEnd
- FrontEnd
- Database Administration (DBA)
- Site Reliability Engineer (SRE)
- DevOps / Platform
- Security
- Mobile
- Quality Engineer (QA)
- Game Development
- Embedded Systems
Bunlar daha da fazla çoğaltılabilir fakat temel olarak yazılımı alt dallara ayırdığımız zaman karşımıza böyle bir tablo çıkıyor. Aslında her dalın farklı ihtiyaç, gereksinim ve use case’leri buluyor, örneğin BackEnd alanında çalışan insanlar genelde Go, Java gibi teknolojiler kullanırken FrontEnd tarafında React/Vue gibi teknolojiler kullanıyorlar. Eğer bundan bir 5-6 sene önceye gitmiş olsaydık belki FullStack gibi kavramları konuşuyor olabilirdik fakat günümüzde büyük altyapılar ve hızlı uygulamalar yapmak gerekiyor. Bunlar da monitoring, logging, zero downtime scale gibi sorunları ortaya doğuruyor. Hepsi ayrı ayrı başlı başlına bilinmesi gereken bir konu olduğu için herkesin kendi alanında uzmanlaşıp o alan üzerinde gelişmesi çok daha doğru oluyor.
Bu konuyu doktorluğa benzetebilirsinz. Plastik Cerrah ile Genel Cerrah aynı işi yapmıyor, ikisinin ilgilendiği ve çözmeye çalıştığı sorunlar aslında bambaşka ama ikisinide yapabilmek için temel doktorluk bilgisi gerekiyor. Yani günün sonunda sizin öncelikle kendinize bir alan belirlemeniz gerekir. Daha sonra o alanda popüler olarak kullanılan dil ve teknolojileri öğrenmeye başlayabilirsiniz, öğrenirken bol bol proje yapmayı unutmayın.
Çünkü sizi en çok proje yapmak geliştirecektir, ne kadar çok proje yaparsanız o kadar fazla sorun ile karşılaşırsınız ve o kadar fazla soruna çözüm aramaya çalışır, araştırır ve öğrenirsiniz. StackOverflow’u kullanmaktan çekinmeyin. Ama şunu da unutmamak gerekir, dil öğrenirken öğrendiklerinizi aslında dil bağımsız olarak öğrenmeniz gerekmenizdir. Bu konuda adeta altın değerinde olan buradaki roadmap’leri takip edebilirsiniz.
Tabi iş dil öğrenmek ile de bitmiyor, herkes bağımlılık dediğimiz kütüphaneleri/paketleri ve framework’leri sık sık kullanıyor. Mesela bu devirde Java’da HTTP server yazmak isteyen herkes SpringBoot kullanıyor kimse Java’ya gömülü olan Servlet ile yazmıyor, çünkü işleri hızlandırıyor, business logic’leri daha kolay yazmanızı sağlıyor ve sizin için ortam hazırlıyor, bu sebeple o dilde en çok kullanılan framework’leride öğrenmekte fayda var. Bunun dışında bağımlılık yönetimi, ne zaman bağımlılık kullanmalıyız, nerde kullanmamalıyız, code base’i boşuna şişirmemeliyiz gibi konularıda proje yaptıkça zamanla tecrübe ile öğrenirsiniz.
Dil Bağımsız İlerlemek Derken Neyden Bahsediyoruz?⌗
Aslına bakarsak sadece GitHub üzerinde kayıtlı 5.000’den fazla programlama dili bulunuyor ve bunların hepsini öğrenmeniz mümkün değil. Programlama dilleri aslında temelde kod yazabilmeniz için araçtır, diyelim ki sizden IETF standartlarına uygun basit bir HTTP server yazmanız isteniyor, sizin burada HTTP’nin TCP/IP tabanlı bir protocol olduğunu bilip gerekli spec.‘lere göre dil bağımsız olarak bunu implement edebilmeniz gerekiyor.
Özellikle C#, Java gibi OOP diller birbirlerine çok benzerdirler ve birine alıştıktan sonra diğerine alışmanız o kadar da zor olmaz.
Buna bir örnek vermek gerekirse
Java’da bir sınıf oluşturma örneği:
import foo.bar; public class Human{ public int age = 18; }C#‘da bir sınıf oluşturma örneği:
using foo.bar; public class Human{ public int age = 18; }Gördüğünüz gibi temelde C# ve Java’da sınıf oluşturmak aynıdır. Bu örnekler kapsamında tek değişen, bir şey import etmek istediğimiz zaman C#‘da
usingkeyword’ünü kullanırken Java’daimportkeyword’ünü kullanmamızdır.
Bu konularda özellikle teknoloji/dil taraftarlığı yapmamak çok önemli, ileride bir işe girdiğiniz zaman ben x dilini yazıyorum y dilini yazmam diyebilirsiniz ve bu teknoloji taraftarlığına girer. Aslında bir ekip Tech Stack belirlerken proje ihtiyaçlarını göz önüne alırak belirler.
Örneğin internal bir API geliştirilmesi gerekiyor ve çok yüksek trafik almayacak, ekipteki herkesde çok iyi NodeJS biliyor, o halde bu projede NodeJS kullanılabilir. Ama diyelim ki milyonlarca istek alıcak ve çok hızlı scale olması gereken servisler yazmanız gerekiyor, burada Go kullanmak daha mantıklı olacaktır çünkü Go static build olup libc gibi herhangi bir thirt-party lib.‘e ihtiyaç duymadan çok hızlı şekilde çalışır ve yazdığınız HTTP server’ı anında ayağı kaldırabilir, buna karşın Java VM içerisinde çalıştığı için Go kadar hızlı scale olmaz ve çalışması için container içerisinde bir çok depend’e ihtiyaç duyar.
Özetle ezbere iş yapmayın ve neyi ne sebeple yaptığınızı kesinlikle öğrenin ve bilin. Çünkü yazılımda en küçük gereksiz görünen detayın bile mutlaka çok önemli bir sebebi vardır. Günün sonunda aslında olay kod yazmaktan ötedir, kötü code base düzeltilebilir fakat kötü design edilmiş bir sistem düzeltilemez, düzeltmek o sistemi baştan yazmak demektir.
Yazılım Sektörü İçerisinde Hayatta Kalmak⌗
Yukarıdada bahsettiğim üzere yazılım aslında hayat boyu devamlı öğrenmeyi gerektiren, oldukça geniş bir meslek dalıdır. Bu kısımda kendi alanım olan BackEnd için temeli öğrendikten sonra bu sektörün içerisinde kalabilmek ve Senior seviyesine ulaşana kadar öğrenmeniz gereken teknik Craftsmanship Skills adı altındaki konu başlıklarını listeliyor olacağım.
Topics for BackEnd⌗
- Restful
- API Gateway, BFF
- API Design
- Rest
- Versioning
- Backward Compatability
- Rate Limiting
- Idempotency
- OpenAPI Specs. and Swagger
- WebSockets
- Authentication
- oAuth
- Basic Authentication
- Token Authentication
- JWT (Json Web Token)
- SSL/TLS
- Object Relational Mapping (ORM)
- Clean Code - SOLID Principles
- Testing (Testing Pyramid)
- Test Driven Development (TDD)
- Unit Test
- Integration Test (Testcontainers)
- Consumer Driven Contract Test (CDCT)
- E2E UI Test
- Automation Test
- Mocking
- Caching Mechanisms and Key-Value Stores (Redis/Memcached)
- Databases
- Document Based (Couchbase, MongoDB)
- Relational (PostgreSQL, MySQL)
- Key-Value (Redis, Memcached)
- Graph (Neo4J, OrientDB)
- Search (ElasticSearch)
- Column Family (Cassandra)
- TimeSeries (Prometheus, InfluxDB)
- Threads & Concurrency
- Process Management
- I/O
- POSIX Basics (stdin, stdout, stderr, pipes)
- Command-Query Separation (CQRS)
- Message Brokers (RabbitMQ/Kafka)
- Domain Driven Design (DDD)
- Strategic Domain Driven Design & Microservices Alignment & Event Storming
- Tactical Domain Driven Design - Aggregates, Entity, Value, Spec, Command, Queries.
- Hexagonal (Ports & Adapters) / Onion Architecture
- CAP Theorem (Consistency, Availability, Partitioning)
- Fault Tolerance and Resiliency
- Circuit Breaker
- Service Communication (Sync and Async Patterns)
- Change Data Capture (CDC)
- Scheduled Jobs
- gRPC / Protocol Buffers
- GraphQL
- CI/CD (test, build, deployment)
- Canary, Blue, Green Deployments
- Git (and GitHub/GitLab)
- Docker (and Docker Compose)
- Kubernetes
- Deployment
- Service
- ConfigMap
- Ingress
- CRD
- Service Mesh
- Sidecar Pattern
- Scalability (Horizontally and Vertically)
- Distributed Systems
- Load Balancer
- Content Delivery Network (CDN)
- Network Concepts
- Traffic Management
- Infrastructure as Code
- Observability
- Monitoring
- New Relic
- Telemetry
- Grafana
- Prometheus
- Distributed Tracing and Logging
- Kibana
- DataDog
- Monitoring
- Data Obfuscation, Encryption
- Cloud Platforms (GCP, AWS or Azure)
- Serverless
- SaaS (Software as a Service)
- FaaS (Function as a Service)
- AWS Lambda
- Google Cloud Functions
- Azure Functions
- PaaS (Platform as a Service)
- Azure Web Apps
- Heroku
- Google Cloud App Engine
- Amazon Elastic Beanstalk
- CaaS (Container as a Service)
- Docker Cloud
- Azure Containers
- Amazon Fargate
- Google Cloud Run
- IaaS (Infrastructure as a Service)
- AWS EC2
- Google Cloud Compute Engine
- Azure VMs.
Bu liste dahada uzatılabilir, biraz olay çalıştığınız yerdeki sorumluluklarınız neler, ne olmak istiyorsunuz, ne tür şeyler yapmak istiyorsunuz da bitiyor. Eğer ben yerel esnafa, bakkalcı Mehmet abime 3-5 liraya PHP ile WordPress site yapıcam diyorsanız tabiki bunların hiçbirine ihtiyacınız yok, bunu bir kaç video izleyerek kısa sürede yapabilirsiniz, ama gerçekten mühendislik yapmak isteyip bu sektörde gelişmek istiyorsanız durum bu.
Bu liste elbette göz korkutucu gelebilir fakat bunlar seneler içinde okuyarak, öğrenerek, çalışarak ve tecrübe ederek öğrenebiliceğiniz türden şeyler. Bu yüzden tekrar söylüyorum ki continuous learning de kararlılık büyük önem arz ediyor. Tabi bunların yanında overengineering yapmamak, şirket kültürü, doğru şekilde soru sorma, doğru iletişim kurma, doğru geri bildirim vermek, doğru döküman yazmak gibi bir çok konulardada kendinizi geliştirmeniz gerekiyor.
Güncel Kalmak⌗
Diğer bir konu ise güncel kalmak, bu konuda GitHub’da projeleri incelemek, HackerNews’den günlük topic’leri takip etmek, Twitter’da yazılım alanında ismi duyulmuş/duyulmamış insanları takip etmek, şirketlerin bloglarındaki ilginizi çeken yazıları okumak gibi şeyler yapabilirsiniz. Özellikle kullandığınız veya katkı yaptığınız projelerin maintainer’larını tanımak bilmek ve bunların paylaşımlarınıda takip ederek bir çok şey öğrenebilirsiniz. Ayrıca Medium’da haftasonları pazar okumaları yapabilirsiniz, güncel bir çok makale bulabilirsiniz.
İngilizce⌗
İngilizce herkes için sorun olmuştur. Eğer yeni başlayansanız başlangıç seviyesi için bol bol Türkçe kaynak bulabilirsiniz. Fakat daha sonrası için ingilizce şart gibi bir şey olmaya başlıyor. Dökümanlar, videolar, white paper’lar vs. hepsi ingilizce olduğu için ingilizcenizin kötü olması sizin için büyük bir sorun teşkil etmeye başlıyor. Bu konuda ingilizcenizi geliştirmeye önem vermeniz gerekiyor. Ayrıca şunuda ekleyeyim, uzun süredir bu sektörün içerisinde kalırsanız teknik mesleki ingilizceniz kendi kendine gelişecektir.
Son⌗
Umarım bu yazı sizin için faydalı olmuştur. Elimden geldiğince bir çok konuya değinmeye ve açıklamaya çalıştım. Hayat boyu öğrenmeye devam edebilmeniz ve hayallerinizi gerçekleştirebilmeniz dileğiyle hoşçakalın.
Sorumluluk Reddi Beyanı (Disclaimer): Bu yazıda ki her şey çalıştığım şirket ve pozisyon bağımsız olarak kendi görüşlerimden oluşmakta olup, tartışmaya açıktır.