<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>software on /dev/anil</title><link>https://anxl.dev/tags/software/</link><description>Recent content in software on /dev/anil</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>© 2021 Anıl Mısırlıoğlu</copyright><lastBuildDate>Fri, 01 Jan 2021 12:00:00 +0300</lastBuildDate><atom:link href="https://anxl.dev/tags/software/index.xml" rel="self" type="application/rss+xml"/><item><title>Dark Side: Software</title><link>https://anxl.dev/off-topic/how-to-learn-software/</link><pubDate>Fri, 01 Jan 2021 12:00:00 +0300</pubDate><guid>https://anxl.dev/off-topic/how-to-learn-software/</guid><description>Giriş Herkese merhabalar, bu yazıda kısaca &amp;lsquo;Nasıl Yazılımcı Olurum&amp;rsquo;, &amp;lsquo;Yazılıma Nasıl Başlamayalıyım&amp;rsquo; 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.</description><content>&lt;h2 id="introduction">Giriş&lt;/h2>
&lt;p>Herkese merhabalar, bu yazıda kısaca &lt;em>&amp;lsquo;Nasıl Yazılımcı Olurum&amp;rsquo;&lt;/em>, &lt;em>&amp;lsquo;Yazılıma Nasıl Başlamayalıyım&amp;rsquo;&lt;/em> gibi sorulara cevap verip konuyu
basitçe anlatmaya çalışacağım.&lt;/p>
&lt;p>Ö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.&lt;/p>
&lt;p>&lt;strong>Continuous Learning&lt;/strong> (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.&lt;/p>
&lt;hr>
&lt;h2 id="language-selection">Dil Seçimi&lt;/h2>
&lt;p>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ı:&lt;/p>
&lt;ul>
&lt;li>BackEnd&lt;/li>
&lt;li>FrontEnd&lt;/li>
&lt;li>Database Administration (DBA)&lt;/li>
&lt;li>Site Reliability Engineer (SRE)&lt;/li>
&lt;li>DevOps / Platform&lt;/li>
&lt;li>Security&lt;/li>
&lt;li>Mobile&lt;/li>
&lt;li>Quality Engineer (QA)&lt;/li>
&lt;li>Game Development&lt;/li>
&lt;li>Embedded Systems&lt;/li>
&lt;/ul>
&lt;p>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&amp;rsquo;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.&lt;/p>
&lt;p>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.&lt;/p>
&lt;p>Çü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&amp;rsquo;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 &lt;a href="https://roadmap.sh/">buradaki&lt;/a> roadmap&amp;rsquo;leri takip edebilirsiniz.&lt;/p>
&lt;p>Tabi iş dil öğrenmek ile de bitmiyor, herkes bağımlılık dediğimiz kütüphaneleri/paketleri ve framework&amp;rsquo;leri sık sık
kullanıyor. Mesela bu devirde Java&amp;rsquo;da HTTP server yazmak isteyen herkes SpringBoot kullanıyor kimse Java&amp;rsquo;ya gömülü olan
Servlet ile yazmıyor, çünkü işleri hızlandırıyor, business logic&amp;rsquo;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&amp;rsquo;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&amp;rsquo;i boşuna şişirmemeliyiz gibi konularıda
proje yaptıkça zamanla tecrübe ile öğrenirsiniz.&lt;/p>
&lt;hr>
&lt;h2 id="language-independent">Dil Bağımsız İlerlemek Derken Neyden Bahsediyoruz?&lt;/h2>
&lt;p>Aslına bakarsak sadece GitHub üzerinde kayıtlı 5.000&amp;rsquo;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 &lt;a href="https://datatracker.ietf.org/doc/html/rfc2616">IETF&lt;/a>
standartlarına uygun basit bir HTTP server yazmanız isteniyor, sizin burada HTTP&amp;rsquo;nin TCP/IP tabanlı bir protocol
olduğunu bilip gerekli spec.&amp;lsquo;lere göre dil bağımsız olarak bunu implement edebilmeniz gerekiyor.&lt;/p>
&lt;p>Ö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.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Buna bir örnek vermek gerekirse&lt;/strong>&lt;/p>
&lt;p>Java&amp;rsquo;da bir sınıf oluşturma örneği:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-java" data-lang="java">&lt;span style="color:#f92672">import&lt;/span> foo.bar&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Human&lt;/span>&lt;span style="color:#f92672">{&lt;/span>
&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span> age &lt;span style="color:#f92672">=&lt;/span> 18&lt;span style="color:#f92672">;&lt;/span>
&lt;span style="color:#f92672">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>C#&amp;lsquo;da bir sınıf oluşturma örneği:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-csharp" data-lang="csharp">&lt;span style="color:#66d9ef">using&lt;/span> foo.bar;
&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Human&lt;/span>{
&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span> age = &lt;span style="color:#ae81ff">18&lt;/span>;
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Gördüğünüz gibi temelde C# ve Java&amp;rsquo;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#&amp;lsquo;da &lt;code>using&lt;/code> keyword&amp;rsquo;ünü kullanırken Java&amp;rsquo;da &lt;code>import&lt;/code> keyword&amp;rsquo;ünü kullanmamızdır.&lt;/p>
&lt;/blockquote>
&lt;p>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.&lt;/p>
&lt;p>Ö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.&amp;lsquo;e ihtiyaç duymadan çok hızlı şekilde çalışır ve yazdığınız HTTP server&amp;rsquo;ı 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&amp;rsquo;e ihtiyaç duyar.&lt;/p>
&lt;p>Ö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.&lt;/p>
&lt;hr>
&lt;h2 id="surviving-in-the-software-industry">Yazılım Sektörü İçerisinde Hayatta Kalmak&lt;/h2>
&lt;p>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 &lt;strong>Craftsmanship Skills&lt;/strong> adı altındaki konu başlıklarını listeliyor
olacağım.&lt;/p>
&lt;h2 id="topics-for-backend">Topics for BackEnd&lt;/h2>
&lt;ul>
&lt;li>Restful&lt;/li>
&lt;li>API Gateway, BFF&lt;/li>
&lt;li>API Design
&lt;ul>
&lt;li>Rest&lt;/li>
&lt;li>Versioning&lt;/li>
&lt;li>Backward Compatability&lt;/li>
&lt;li>Rate Limiting&lt;/li>
&lt;li>Idempotency&lt;/li>
&lt;li>OpenAPI Specs. and Swagger&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>WebSockets&lt;/li>
&lt;li>Authentication
&lt;ul>
&lt;li>oAuth&lt;/li>
&lt;li>Basic Authentication&lt;/li>
&lt;li>Token Authentication&lt;/li>
&lt;li>JWT (Json Web Token)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>SSL/TLS&lt;/li>
&lt;li>Object Relational Mapping (ORM)&lt;/li>
&lt;li>Clean Code - SOLID Principles&lt;/li>
&lt;li>Testing (Testing Pyramid)
&lt;ul>
&lt;li>Test Driven Development (TDD)&lt;/li>
&lt;li>Unit Test&lt;/li>
&lt;li>Integration Test (Testcontainers)&lt;/li>
&lt;li>Consumer Driven Contract Test (CDCT)&lt;/li>
&lt;li>E2E UI Test&lt;/li>
&lt;li>Automation Test&lt;/li>
&lt;li>Mocking&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Caching Mechanisms and Key-Value Stores (Redis/Memcached)&lt;/li>
&lt;li>Databases
&lt;ul>
&lt;li>Document Based (Couchbase, MongoDB)&lt;/li>
&lt;li>Relational (PostgreSQL, MySQL)&lt;/li>
&lt;li>Key-Value (Redis, Memcached)&lt;/li>
&lt;li>Graph (Neo4J, OrientDB)&lt;/li>
&lt;li>Search (ElasticSearch)&lt;/li>
&lt;li>Column Family (Cassandra)&lt;/li>
&lt;li>TimeSeries (Prometheus, InfluxDB)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Threads &amp;amp; Concurrency&lt;/li>
&lt;li>Process Management&lt;/li>
&lt;li>I/O&lt;/li>
&lt;li>POSIX Basics (stdin, stdout, stderr, pipes)&lt;/li>
&lt;li>Command-Query Separation (CQRS)&lt;/li>
&lt;li>Message Brokers (RabbitMQ/Kafka)&lt;/li>
&lt;li>Domain Driven Design (DDD)
&lt;ul>
&lt;li>Strategic Domain Driven Design &amp;amp; Microservices Alignment &amp;amp; Event Storming&lt;/li>
&lt;li>Tactical Domain Driven Design - Aggregates, Entity, Value, Spec, Command, Queries.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Hexagonal (Ports &amp;amp; Adapters) / Onion Architecture&lt;/li>
&lt;li>CAP Theorem (Consistency, Availability, Partitioning)&lt;/li>
&lt;li>Fault Tolerance and Resiliency&lt;/li>
&lt;li>Circuit Breaker&lt;/li>
&lt;li>Service Communication (Sync and Async Patterns)&lt;/li>
&lt;li>Change Data Capture (CDC)&lt;/li>
&lt;li>Scheduled Jobs&lt;/li>
&lt;li>gRPC / Protocol Buffers&lt;/li>
&lt;li>GraphQL&lt;/li>
&lt;li>CI/CD (test, build, deployment)&lt;/li>
&lt;li>Canary, Blue, Green Deployments&lt;/li>
&lt;li>Git (and GitHub/GitLab)&lt;/li>
&lt;li>Docker (and Docker Compose)&lt;/li>
&lt;li>Kubernetes
&lt;ul>
&lt;li>Deployment&lt;/li>
&lt;li>Service&lt;/li>
&lt;li>ConfigMap&lt;/li>
&lt;li>Ingress&lt;/li>
&lt;li>CRD&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Service Mesh&lt;/li>
&lt;li>Sidecar Pattern&lt;/li>
&lt;li>Scalability (Horizontally and Vertically)&lt;/li>
&lt;li>Distributed Systems&lt;/li>
&lt;li>Load Balancer&lt;/li>
&lt;li>Content Delivery Network (CDN)&lt;/li>
&lt;li>Network Concepts&lt;/li>
&lt;li>Traffic Management&lt;/li>
&lt;li>Infrastructure as Code&lt;/li>
&lt;li>Observability
&lt;ul>
&lt;li>Monitoring
&lt;ul>
&lt;li>New Relic&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Telemetry
&lt;ul>
&lt;li>Grafana&lt;/li>
&lt;li>Prometheus&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Distributed Tracing and Logging
&lt;ul>
&lt;li>Kibana&lt;/li>
&lt;li>DataDog&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Data Obfuscation, Encryption&lt;/li>
&lt;li>Cloud Platforms (GCP, AWS or Azure)&lt;/li>
&lt;li>Serverless
&lt;ul>
&lt;li>SaaS (Software as a Service)&lt;/li>
&lt;li>FaaS (Function as a Service)
&lt;ul>
&lt;li>AWS Lambda&lt;/li>
&lt;li>Google Cloud Functions&lt;/li>
&lt;li>Azure Functions&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>PaaS (Platform as a Service)
&lt;ul>
&lt;li>Azure Web Apps&lt;/li>
&lt;li>Heroku&lt;/li>
&lt;li>Google Cloud App Engine&lt;/li>
&lt;li>Amazon Elastic Beanstalk&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>CaaS (Container as a Service)
&lt;ul>
&lt;li>Docker Cloud&lt;/li>
&lt;li>Azure Containers&lt;/li>
&lt;li>Amazon Fargate&lt;/li>
&lt;li>Google Cloud Run&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>IaaS (Infrastructure as a Service)
&lt;ul>
&lt;li>AWS EC2&lt;/li>
&lt;li>Google Cloud Compute Engine&lt;/li>
&lt;li>Azure VMs.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>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.&lt;/p>
&lt;p>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.&lt;/p>
&lt;hr>
&lt;h3 id="stay-up-to-date">Güncel Kalmak&lt;/h3>
&lt;p>Diğer bir konu ise güncel kalmak, bu konuda GitHub&amp;rsquo;da projeleri incelemek, HackerNews&amp;rsquo;den günlük topic&amp;rsquo;leri takip etmek,
Twitter&amp;rsquo;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&amp;rsquo;larını
tanımak bilmek ve bunların paylaşımlarınıda takip ederek bir çok şey öğrenebilirsiniz. Ayrıca Medium&amp;rsquo;da haftasonları
pazar okumaları yapabilirsiniz, güncel bir çok makale bulabilirsiniz.&lt;/p>
&lt;hr>
&lt;h3 id="english">İngilizce&lt;/h3>
&lt;p>İ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&amp;rsquo;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.&lt;/p>
&lt;hr>
&lt;h3 id="conclusion">Son&lt;/h3>
&lt;p>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.&lt;/p>
&lt;p>&lt;strong>Sorumluluk Reddi Beyanı (Disclaimer):&lt;/strong> 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.&lt;/p></content></item></channel></rss>