Rehber Yazılıma nereden başlanır?

Arkadaşlar herkese merhabalar,

Ben Fatih AKTÜRK, Yazılım Mühendisiyim, Siber Güvenlik, Görüntü İşleme ve Yapay Zeka alanlarında ortak bir çalışma yürüten Yüksek Lisans eğitimindeyim.

Forumda ve diğer platformlarda sıklıkla karşılaştığım bu sorunun cevabını, naçizane cevaplamak için bir rehber hazırlamak istedim.

Sevgili arkadaşlar,

Yazılım ülkemizde hemen herkesi iştahlandıran bir sektör haline geldi. Bu alana gerek maddi kazanç gerekse ilgi yönünden çok fazla yoğunlaşan insan var.
Konuya başlamadan önce, kendimizi tanımamız gerekiyor. Bu alana neden yöneliyoruz? Para kazanmak mı? İlginiz var ve keyfî öğrenmek için mi? Yoksa her ikisi de mi?

Bu sorunun cevabını verebildiğiniz takdirde, yolun büyük bir kısmını geçmiş oluyorsunuz.

Alana yönelim nedenimizi ele aldıktan sonra alana hakimiyet konusunu ele alalım;

Günümüzde yazılımcılar ya alaylı ya da kolejli olarak kendini ayırmaktadır.

Bunlar;
ALAYLI: Bu alan ile alakalı herhangi bir okul okumadan kendisini geliştiren ve yazılımcı olarak geliştiren/çalışan kişilerdir.

KOLEJLİ: Bu alan ise yazılım ile alakalı üniversite okuyan kişilerdir. Bu kısımda ikiye ayrılır, kolejliler ya Bilgisayar Programcılığı, Web Tasarım Kodlama gibi iki yıllık bölüm okuyanlar ile Yönetim Bilişim Sistemleri gibi 4 yıllık bölüm okuyanlar ve Bilgisayar, Yazılım vb. Mühendislik okuyanlar olarak bilinir.

Bu tanımlar genel ekseriyetle böyledir.

Bazı alaylılar gerçekten ciddi manada bir çok kolejliyi cebinden çıkartabilir iken bu çok nadir görülen bir durumdur.

Şahsi önerim mühendislik eğitimini muhakkak almalısınız. Okumayın diyenlere asla kulak asmayın. Okulda size kodlama öğretmezler, bakış açısı öğretirler. ŞAHSİ FİKRİMDİR.

Ben bu metnin üzerinde kalan ve altta yazacağım her şeyi, hem alaylı, hem 2 yıllık hem 4 yıllık mühendislik bitirmiş bir kolejli olarak kendi yorum ve gözlemlerime yaptım ve yapacağım.


Herkes mühendis olamayabiliyor. Alaylı bir yazılımcı olduğunuzu kabul edeceksek, kesinlikle ama kesinlikle mühendis gibi düşünmeyi öğrenmeniz gerekmektedir. Bunun bir eğitimi yoktur, tecrübe, ilgi ve bakış açısı ile alakalıdır. Gerçekleştikçe kendiniz fark edeceksiniz.

Gelelim sorumuzun asıl cevabına;
Yukarıda belirtilen durumlara göre kendimizi bir yere koydu isek devam edelim.

Yazılım bir ağaç gibidir. Temelde birbiri ile bağlantılı konular birbirinden ayrılarak ilerler. Bunlara mobil uygulama, web uygulaması, masaüstü uygulama, oyun ve benzeri gibi örnekler verebiliriz.

İlgili olarak bu alana yöneldiğinizi farz edersek, eğer bir oyuncu iseniz oyun yazmak istersiniz, eğer bir öğretmenseniz ders programınızı gösteren bir mobil uygulama yazmak isteyebilirsiniz. Bu örnekler çoğaltılabilir. Tamamen keyfiniz ve zevkinize kalmış şeylerdir ve çok keyiflidir.

Burada sizin çözmeniz gereken işte budur. Ben ne yapmak istiyorum? Bunun cevabını verdikten sonra ciddi bir gelişim göstereceksiniz.

Eğer para kazanmak isterseniz, günümüz için bazı önerilerde bulunacağım. Günümüzde her firma, kurum vb. hem mobil hem web uygulaması yazmaktadır. Dolayısı ile iki alana da yönelmeniz faydanıza olacaktır. Bu alanlar "Front End" ve "Backend" olarak ikiye ayrılır, adı üzerinde front uygulamaların tasarım kısmını oluşturan bölümler iken back kısmı ise arka planda, kullanıcıların birebir şahit olmadığı, uygulamanın planlandığı yerdir.

Araba gibi düşünürsek front, aracın rengi, tipi vb. iken back ise aracın motoru, yağı, suyu vb.'dir.

Backend komplike bir alandır ve ciddi mühendislik (eğitim olarak değil bakış açısı olarak) ister.

Buraya kadar geldiysek dil öğrenme kısmı burada devreye girecektir. Genel olarak her dil ile her şeyi yapabiliriz. Ancak buna şöyle örnek vereyim, daha iyi anlaşılsın. Normal bir araç ile ana yollarda gezebilirken dağ, tepe vb. gibi çıkması zor yerlerde SUV bir araç ile bunu çok rahat yapabilirsiniz. İkisini de istediğiniz yerde kullanabilirsiniz. Ancak konfor farkı olacaktır. Diller ve amaçlarını genel olarak böyle tanımlarım ben. Ama yazım açısından hemen hepsinin mantığı aynıdır.

Arkadaşlar, yazılımcı bilgisayarla konuşan kişidir. Siz bir çocuk gibi programınızı, bilgisayarınızı eğitirsiniz ve ondan istediği şeyleri yapmasını sağlarsınız.

Bu bakış açısını kazanırsanız eğer kendinizi daha iyi konumlandırırsınız.

Hangi dili öğrenmeliyim konusuna gelecek olursanız;

Yukarıda kendinizi bir yere koyduysanız eğer burayı okumanızı tavsiye ederim.
  • Yazılım ve bilgisayar temelleri için: Assembly, C
  • Web uygulamaları: Java, C#
  • Oyun: C#, C++
  • Mobil: C#, Java, Dart
  • Veri çekme ve işleme: Python
  • Temel yapay zeka: Python
Bu yazdıklarımın dışında bir çok dil bulunmaktadır ancak genel olarak aklıma gelenler ve en kolay kaynağa erişim olanları yazdım. Zaten yazılıma nereden başlamalıyım sorusunun cevabı bence asla bir dili öğrenmek değildir. 😊

Ayrıca soru olarak yazarsanız buradan cevaplarım.

Umuyorum ki faydalı olmuştur, sürç-i lisanım oldu ise affola,

Sorunuz, öneriniz varsa muhakkak dinlemek isterim,

Özel ise özelden de yazabilirsiniz, seve seve cevaplarım.

Saygı ve sevgilerimle, başarılar.
 
Merhaba, teşekkür ederim, inceleyelim eleştirinizi.


Bu yorumunuza cevabı alt satırlarda daha iyi aktarabileceğimi düşünüyorum.


Mantığımı beğenmenize müteşekkirim, ancak sizin kaçırdığınız şey şu, ben burada standart "yazılıma nereden başlanır" sorusunu ve klasik cevaplarını tenkit etmiş durumdayım. Mühendislik fakültelerinden mezun olup, mühendis gibi düşünemeyen ne yazık ki bir çok gencimiz var. Mantığını kavrayabildiğinizi düşünmüyorum. Ayrıca, yazılıma nereden başlarım sorusu soran bir insana, ağır terimler yüklemenin hiç bir mantığı olduğunu düşünmüyorum.


İstirham ediyorum, yazılıma nereden başlayayım sorusunu soran bir insana kod örneği vermenin açıklaması nedir? Lütfen yapmayınız.


Tekrar ediyorum, ben standart olandan bahsetmiyorum. "python öğren knk" demek işin kolayı, sevgili arkadaşım. Ben bu metinin özelinde, yazılıma başlamakta zor olan kısmın dil seçmek, öğrenmek değil kendini konumlandırabilmek ve kişinin ne istediğini anlayabilmesinin olduğunu açıklıyorıum.


Yine, standart olandan bahsediyorsunuz. Bakınız bir yorumda benden hoca tavsiyesi istenildi, cevabım ise bunun herkese göre değişebileceği. Metnin tamamında, kişinin ne istediği, ilgisi, tavrının öneminden bahsediyorum. Yazılıma nereden başlayayım diyen birisine, yapay sinir ağları, makine görmesi vb. anlatmanın hiç bir mantığı yoktur. Bunlar tekdüzelikten öteye geçemeyecektir.


Teşekkür ederim, eleştiri her zaman iyidir. Ancak benim nazarımda birisini eleştirmek için en az onun kadar iş yapmış olmak gerekir (sektördeki işten değil, katkınızdan bahsediyorum.). Forumda size dair bir "Yazılıma nereden başlanır rehberi" göremedim.

Sizden bir ricamda şu olacak, bu yukarıda yazdıklarımı tekrardan okuyarak, bu yazdıklarımı bırakın, buna benzer söylemleri hangi hoca, akademisyen, yazılımcı, eğitimci vb. söylediğini söyler misiniz?

Standart rehberler gibi rehber hazırlamanın, Amerikayı yeniden keşfetmekten farkı ne?

Bu metni tekrar okuduğunuzda, bilen birisi olarak eleştirdiğim konuları anlayarak okumanızı rica edeceğim.

Ve lütfen sizde bir rehber hazırlayın (varsa ben göremedim, bildirirseniz sevinirim), eleştiri ve rekabet ışığında insanlara ve bu bilime faydamız olsun.

Sevgi ve saygılarımla.
Tekrar merhaba, eleştiriye cevabınız için ilave yorum ihtiyacı hissetmiyorum, zaten fikrimi uzunca yazmıştım, sadece neden rehber oluşturmadığım için kısaca bir cevap vereyim.

Alaylı olmadığım için kurs, sertifika, bootcamp, youtube hocası vb. bilgilerine sahip değilim, yeni başlayacak arkadaşların işine yarayacak bu bilgileri/bağlantıları veremeyeceğime göre de rehber hazırlamam saçma olacaktır, yani birisi bana hoca öner dediği zaman cevap veremem. Sizin yazdıklarınızı ya da benzer söylemleri (para kazanmak için frontend ya da backend alanına girin, mobil için C#, Dart kullanın gibi) de bana hoca, akademisyen, yazılımcı, eğitimci vb. pek söylemedi, söylemeleri de abes kaçardı diye düşünüyorum. Forumu da kitlelere hitap edecek şekilde değil, başlıklara cevap şeklinde yani konuyu açanı muhatap alarak kullanmayı seviyorum. Bu forumda sizinle rekabet ederek (hayır, "o arkadaş bilmiyor, en iyi ben biliyorum benim rehberimi okuyun" mu diyeceğim) insanlara ve bilime bir fayda sağlanacağını düşünmüyorum, zaten fayda sağlayacağımı düşündüğüm başlıklarda yorum yapmaya çalışıyorum arada, bu topic de böyle oldu. Neden iyi, neden kötü, neden eksik olduğunu da kendimce yorumladım. Ha zaten "forumda böyle rehber açmamışsanız eleştiremezsiniz" gibi bir ek not koysaydınız ben de rehberi okur geçerdim. Yazılıma başlamayı düşünen alaylı arkadaşlara yazılıma nereden başlanır rehberi hazırlayamıyorum o zaman bir mühendisin oluşturduğu rehberi okuyup eleştireyim demiştim. Benim hangi dil ile başladığınızın önemi olmadan algoritma öğrenmeniz lazım, ingilizce öğrenmeniz lazım, bazı konseptleri öğrenmezseniz yazılım nasıl geliştirilir anlayamazsınız vb. şeklinde olması gerektiğini düşündüğüm içerik yerine bu rehber de tabuları yıktığını düşünerek yenilikçi bir yaklaşımla bu dediklerimden bahsetmeyerek hatta bahsetmeyi reddederek nihayetinde talebe uygun şekilde dil öneriyor, belki de böylesi daha doğrudur. Esen kalın.
 
Merhaba,

Öncelikle herhangi bir süre belirtmek doğru olmaz. Çünkü bir dili tam anlamıyla öğrenmenin mümkün olduğuna inanmıyorum.

Bir dilde bir işi onlarca farklı yol ile yapabilirsiniz, mühendislik burada devreye girer, işlemi sunucuyu en az yoracak şekilde tasarlamak gerekir. Çok sevdiğim bir söz var burada, bir yemeği herkes yapar ama en iyi aşçı yapar.

Kendinizi geliştirme için sürekli proje yapmanız lazım, doğru yanlış demeden ısrarla kod yazmanızı öneriyorum, bu süreçte sizi kod yazmak değil hatalar ile karşılaşmak geliştirecektir.

Bilgisayarınızın özelliklerini bilmeden bir şey söylemek pek mantıklı değil ancak temel seviyede birçok işlemi basit bilgisayarlar ile yapabilirsiniz. Sadece SSD muhakkak öneriyorum.

İyi bilgisayar genellikle oyun yazımlarında, ağır veri tabanı ile çalışırken lazım olacaktır.

Hocam ben 4 yıldır Roblox oynuyorum ve Roblox'unda bir oyun yapma Studio'su var ve Lua kullanıyor bende şöyle bir karar aldım ilk Lua öğrenip daha sonrasında diger dilleri ögrenmeye çalışıcagım sizin Lua hakkında bilginiz var mıdır cevapladıgınız için teşekkürler.
 
Hocam ben 4 yıldır Roblox oynuyorum ve Roblox'unda bir oyun yapma Studio'su var ve Lua kullanıyor bende şöyle bir karar aldım ilk Lua öğrenip daha sonrasında diger dilleri ögrenmeye çalışıcagım sizin Lua hakkında bilginiz var mıdır cevapladıgınız için teşekkürler.

Yani sadece bir kaç platformdan görmüştüm ismini. Öncelikle algoritma mantığını oturtup sonra o dile geçmenizi öneririm. Çünkü zannediyorum ki kaynak azdır. Dolayısıyla dili öğrenirken algoritmada geri kalmayın.
 
Hocam ben 4 yıldır Roblox oynuyorum ve Roblox'unda bir oyun yapma Studio'su var ve Lua kullanıyor bende şöyle bir karar aldım ilk Lua öğrenip daha sonrasında diger dilleri ögrenmeye çalışıcagım sizin Lua hakkında bilginiz var mıdır cevapladıgınız için teşekkürler.

İlk önce yazılımın temellerini bilmek önemli Lua biraz karışık ama Roblox üzerinden oyun yapmak eğlencelidir Lua'yı araştırman lazım dediğim gibi biraz karmaşa var.
 
Merhaba, yazınızı okudum, içerik olarak eleştirilmesi gerekiyor.

Yazılıma nereden başlanır sorusunun yani asıl konunun cevabı yok, clickbait gibi kalmış bu sebeple.

Mühendis gibi düşünmek için mühendislik eğitimi almalısınız tavsiyesi de yazılıma nereden başlanır sorusu ile alakalı bir soru değil. Mühendis mantığıyla yazılım geliştirmenin önemini vermeniz güzel, "herkes mühendis olamayabiliyor, o zaman mühendis mantığıyla düşünmeyi öğrenmelisiniz" diyorsanız da mühendislik eğitiminde geçen temel şeylerden bahsedilmeli, mesela input output, dosya açma/yazma, veri yapıları... vb. gibi temel şeylerden bahsedilmeliydi. Mühendis gibi düşünmenin eğitimi yoktur deniyor, mühendislik fakülteleri bu eğitimi veriyor işte.

Ya da bu mantığı anlatmak için şöyle çok basic bir örnek verilebilir;
Mesela alan hesaplama ile ilgili bir alanHesapla(Integer en, Integer boy) methodu olsun

alanHesapla(Integer en, Integer boy){
Integer alan = en * boy;
return alan;
}
bu kod çalışan bir kod ama mühendis gözüyle incelenirse "int alan" değişkeninin gereksiz olduğu görülür, bu gereksiz sistem kaynağı yer, bu method çok kullanılırsa önemsiz gibi görünen şey sorun yaratabilir. Onun yerine,

alanHesapla(Integer en, Integer boy){
return en * boy; -> gereksiz değişkenden kurtulduk.
}
En ya da boy değerleri negatif gönderilirse ya da tamsayı değil de virgüllü sayı gönderilirse, sıfır gönderilise, null gönderilirse vb. durumları da düşünmemiz gerekir vb. diye vurgulanabilir.

Neyse, ilgi/hobi için yazılım öğrenmek istiyorum diyen bir kişiye zaten nereden başlanır bilgisi hiç verilmemiş, "öğretmenseniz ders programınızı gösteren bir mobil uygulama yazmak isteyebilirsiniz" örneği var ya mesela, bu öğretmen ne yapacak, nereden başlayacak, bir bilgi yok, siz karar verin gelişirsiniz diye geçiyor rehberde.

Para kazanmak için, yazılımı meslek olarak ele alacak arkadaşlara piyasanın talebine uygun backend/frontend nedirin anlatılması güzel. Ancak en sonunda elimize, forumun kısır döngüsü olan hangi dili öğrenmeliyim mezvusundan başka bir şey geçmiyor, bin tane konu başlığı zaten mevcut bu konu üzerine, buradaki rehber de conceptleri, paradigmaları öğrenmeden dil öğrenmeye sevk ediyor, ya da siz dil öğrenin, bunları da bir şekilde öğrenirsiniz diyor.

Burada da mesela şu verilebilir, diyelim ki frontend developer olmak istiyorsunuz, dil öğrenmeden önce öğrenmeniz gereken şeyler nedir (browser bu html denen şeyle ne yapar, arayüzde çalışan script nedir, veri nereden gelir, nereye gider vs.), backend geliştirici ne yapar, frontend geliştirici ne yapar hakkında bilgi verilebilir (arabanın motoru değil de somutlaştırılmış bir örnek ile devam yani, ör: bir online alışveriş firmasındaki backend geliştiricisi oldunuz, neler yapar da para kazanır bu adam) sorumlulukları nelerdir, ülkemizde iş imkanları nelerdir (madem para kazanma hususu açıldı), para kazanabilmek için ne kadar öğrenmek, tecrübe kazanmak lazım, yazılımdan para kazanmak bu kadar kolay ise neden herkes bir dil seçip biraz if-else biraz for döngüsü falan öğrenip para kazanmıyor vb. diye gider. Siz yüksek yapıyormuşsunuz, eğer bir yandan da çalışıyorsanız; öğrencilik sürecinizden, nasıl iş bulduğunuzdan, ne yaptığınızdan örnekler verebilirsiniz, frontend backend dışında sizin alanlarınızdan, yani siber güvenlik, yapay zeka vb. bahsedebilirsiniz.

Özetle bu rehber temel yazılım genel kültürü (alaylı, okullu, backend, frontend nedir) dışında bize yazılıma nereden başlanır konusunda çok bilgi vermiyor. Yani şöyle bir akış var;

ben deminki örnekteki mobil app yapmak isteyen öğretmenim
-(para için mi ilgi için mi yazılım) ilgi için
-(alaylı nedir, kolejli nedir) kolejli değil alaylı olduğumu öğrendim
-(mühendislik eğitimini muhakkak almalısınız) hobi için kendime mobil app yapacağım ben
-(kesinlikle ama kesinlikle mühendis gibi düşünmeyi öğrenmelisin o zaman) zevk için yapacaktım ben
//diğer para kazanma ile ilgili conditionlara girmiyor farkındaysanız direkt sonuca gidiyor
-Yazılıma nereden başlanır sorusunun cevabı: Mobil: C#, Java, Dart //nereden başlanır, C#tan başlanır, tamam

ben para kazanmak isteyen liseye giden bir öğrenciyim
-(para için mi ilgi için mi yazılım) para için
-(alaylı nedir, kolejli nedir) kolejli değil alaylı olduğumu öğrendim
-(mühendislik eğitimini muhakkak almalısınız) tamam o zaman ben şimdi yazılıma başlamamalıyım, üniversite sınavına çalışmalıyım değil mi? bilgi alabilir miyim?
-(kesinlikle ama kesinlikle mühendis gibi düşünmeyi öğrenmelisin o zaman) nasıl, kimden, nereden??
-(frontend ve backend nedir) siber güvenlik diye bir şey duymuştum ama rehbere göre yazılımda backend ve frontend var. backend komplike bir alanmış ve mühendis bakış açısı gerekiyormuş. ben yazılıma daha yeni başlamaya çalışan biri olduğuma göre yazılıma backend ile başlamamalıyım, frontendden başlıyorum
-Yazılıma nereden başlanır sorusunun cevabı: ??
//farkındaysanız diller bölümünde frontend için bir sonuç yok, yani klişe olarak frontend-> html, css, javascript gibi bir şey bekliyordum ama yok

Uzun bir rehber ama yeterli olmadığı gibi sıkıntılar barındırıyor. Terimlerden, konseptlerden bahsedilmemiş tamam ama yazılıma başlama rehberinde algoritma kelimesi geçmiyor mesela ona şaşırdım. İlerde daha güçlü, yazılıma merak salmış arkadaşlara çok daha yararlı bir içerik hazırlayabileceğinizi düşünüyorum, emeğinize sağlık.
Her şey çok güzel yazı güzel fakat bahsettiğiniz örnek gereksiz sistem kaynağı yemez zira parantez içerisinde oluşturulmuş değişkenler parantez kapandığında silinirler.
Belki formatting açısından en * boy direkt olarak return edilebilir.
 
Her şey çok güzel yazı güzel fakat bahsettiğiniz örnek gereksiz sistem kaynağı yemez zira parantez içerisinde oluşturulmuş değişkenler parantez kapandığında silinirler.
Belki formatting açısından en * boy direkt olarak return edilebilir.
Yüksek trafikli multithreaded ortamda bol keseden memory yiyen kod yazılırsa, bizim java garbage collection gidip de parantez kapanmış, o zaman memory açayım diyene kadar sistemi kilitlersiniz, daha önce kendi yazdığım kodla da buna sebep oldum, başkasının sorunlu kodunu refactor ederken de sebebin bu olduğunu tespit ettim, bu örnekteki gibi belki tek bir Integer'ın (özellikle de günümüzde oldukça yeterli olan sistem kaynakları için) buna sebep olması zor ama örnek gereksiz değil.
 
Yüksek trafikli multithreaded ortamda bol keseden memory yiyen kod yazılırsa, bizim java garbage collection gidip de parantez kapanmış, o zaman memory açayım diyene kadar sistemi kilitlersiniz, daha önce kendi yazdığım kodla da buna sebep oldum, başkasının sorunlu kodunu refactor ederken de sebebin bu olduğunu tespit ettim, bu örnekteki gibi belki tek bir Integer'ın (özellikle de günümüzde oldukça yeterli olan sistem kaynakları için) buna sebep olması zor ama örnek gereksiz değil.
Hocam olay garbage collection falan değil ama yanlış anlamışsınız, bir çift süslü parantez bir scope’dur. Bir scope içerisindeki değere başka scope’dan doğrudan erişilemez. Scope kapandığında bellekten veriler silinir. Bu C için de geçerli C++ için de belki/muhtemelen Rust için de.

Bir de günümüz derleyicileri otomatik kod optimizasyonu yaptığı için siz alan’ı return etseniz bile mesela C derleyicisi (GCC) otomatik olarak en * boy’u döndürecek alan diye bir değişken hiç oluşmayacak derleyicinin Assembly çıktısında.
 
Hocam olay garbage collection falan değil ama yanlış anlamışsınız, bir çift süslü parantez bir scope’dur. Bir scope içerisindeki değere başka scope’dan doğrudan erişilemez. Scope kapandığında bellekten veriler silinir. Bu C için de geçerli C++ için de belki/muhtemelen Rust için de.

Bir de günümüz derleyicileri otomatik kod optimizasyonu yaptığı için siz alan’ı return etseniz bile mesela C derleyicisi (GCC) otomatik olarak en * boy’u döndürecek alan diye bir değişken hiç oluşmayacak derleyicinin Assembly çıktısında.
👍C, c++, rust vb. seviyesindeki dillerle üniversiteden beri uğraşmadım bu arada, doğrudur dediğiniz. Automatic garbage collection dillerde allocate edilen memory şişer, çalışan kod yavaşlamaya, makineyi yormaya başlar, compilerın code optimisationı da kurtarmıyor bu kadar kör göze parmak seviyesinin üzerindeki kodlarda vs. onları kast etmiştim sorun yaratabilir diye.
 

Geri
Yukarı