Yazılımın ilk 250 günü - Part 1
16 dk okuma
1. Gün
Bugün çok çok şey öğrendiğimi, en azından çalıştığımı düşünüyorum. Çalıştığım konuları, kısaca hafızamda kalan şekilleriyle sıralayabilirim:- Binary-bit-byte-shifting kavramları
- Asenkronize programlama
- Javascript’te değişkenler, diziler ve object
- Scope hakkında
- AST(Abstract Syntax Trees)
- Döngü kullanmadan döngünün getirilerini sağlayabilmek
- Son olarak SEO
2. Gün
Günün çoğunluğu Javascript ile temel programlama dersleri gibi geçti diyebilirim. Ama çok şey kattığını düşünüyorum. Hızlıca günün özetini yaparsam eğer:- Javascript
- Değişken
- SEO
3. Gün
- Bugün Iterator ve Object konusunu örnekleriyle beraber tamamladım. Dün biraz fazla çalıştığım için ve uykusuz kaldığım için bugün biraz daha verimsiz geçtiğini hissettim. Ama iki gün içinde CodeAcademy’deki Beginner-Javascript kursunu tamamlamak da bir yandan güzel oldu. Sırada Intermediate kısmını tamamlamak var. Tabii burda biraz hızlı olmaya çalışıyorum çünkü çok fazla bilgi var ve olabildiğince şey öğrenip, nasıl kullanıldıklarıın görüp, unutsam bile karşıma bir proje çıktığında ya da bir soru geldiğinde, çözümünü yaparken ya da başka birisinin kodunu incelerken kurduğu algoritmaya, kod yapısına, kodda bulunan ifadelere ve kullanımlarını bilmek istiyorum.
- ‘Eloquent Javascript’ kitabındaki konular, projeler, örnekler ile alakalı bir Github kaynağı buldum. Javascript’in içine biraz daha girince-hatta her konu sonrası- onlara bakıp, daha da çok pekiştirmeyi düşünüyorum.
- Bugün sizin ofisteki toplantınızda konuştuğunuz konulardan “page speed” e dün bakmıştım ve Javascript ile alakalı iyileştirmelerin gerektiğine kulak misafiri olunca aslında doğru bir yeri incelemişim gibi hissettim. SEO konusuna bugün hiç bakamadım ama yarın bunu telafi etmek istiyorum.
- Gün sonuna doğru toplantıda konuşulan konuları aslında gayet beyin jimnastiği gibi gördüm ve çok severek dinledim. Yapay zeka, matematiğin üstüne kurulduğu temel varsayımlar gibi konuları sizden dinleyince, “Gödel, Escher, Bach” ı okumayı daha da çok istedim fakat boş kalan vakitlerde önce MIT’deki bu kitap ile alakalı ders kayıtlarını izleyip, sonra kitabı okumayı düşünüyorum.
4. Gün
Bugünü yine çoğunlukla Javascript’e verdim. Hemen konuya girecek olursam eğer:- Nesne
- Web Compability and Transpilation
- Sınıf
- SEO
Günün Özeti : Gerçekten severek bir şeyleri yapınca zamanın nasıl geçtiğini anlayamıyormuş insan. Bu demektir ki uzun süredir bir şeyleri severek yapmıyormuşum. Öyle düşünmüyordum ama mantığım bunu söyletti şimdi. Demek istediğim biraz alakasız olacak ama Morpheus’tan gelsin:
Bu senin son şansın. Bundan sonra geri dönüş yok. Mavi hapı alırsın - hikaye biter, yatağında uyanırsın ve neye inanmak istiyorsan ona inanırsın. Kırmızı hapı alırsın - Harikalar Diyarı'nda kalırsın ve ben sana tavşan deliğinin ne kadar derine gittiğini gösteririm.Wonderland’ de kalıp, tavşan deliğinin ne derinliklere gittiğini öğrenmek, “Ignorance is bliss”(aslında neden olmasın?) demeden devam edebilmek dileğiyle.
5. Gün
Bugünü kısaca anlatayım:- Sizin bugün yorumlamamızı istediğiniz kodu doğru yorumladığımı düşünüyorum fakat tabii ki eksik yanı fonskiyonların amacını belirtmemiş olmamdı. Aslında kodun sonucunu kağıda yazıp elle hesaplamaya çalışmıştım ve biraz zaman kaybettiğim için onunla, fonksiyonun amacını belirten yorumu yazmamıştım.
- Günün çoğunluğu Eloquent Javasscript kitabından daha önceki konuları tekrar yapmak, yazarın konularla alakalı ilginç düşünceleri ve üstüne çok düşündüren açıklamaları ve oradaki örnekleri yapmak/incelemekle geçti. Class konusuna dün biraz bakmıştım fakat bugün bakmadım doğruyu söylemek gerekirse. Yarın Class konusunu tamamen bitirmeyi düşünüyorum, bir beklenmedik şey olmazsa bitireceğim de.
6. Gün
Bugün tamamen Javascript ile geçti.- Class konusunda ekskik kalan yerleri tamamladım. Inheritance yapısını ve static metodunu öğrendim.
-
Promise objesinin ne olduğunu ve niçin kullanıldığını, bir promise objesi oluşturmayı, catch(),promise.all(), gibi yapıların kullanımını öğrendim. Zincir halindeki birkaç tane promise yapısı oluşturan bir yapıyı inceleyip üstüne örnekler çözdüm. Promise hakkında bugünkü çalışmalardan akılda kalanlar:
- Asenkron programlarda kullanılırlar.
- Üç durumda bulunurlar:”Pending, resolved, veya rejected” Bu konu hakkında bir ev temizliği örneği vardı. Diyordu ki, ev işlerini yaparken mesela sadece odaları süpürmezsin. Aynı zamanda çamaşırları da makineye atarsın, bulaşıkları da makineye atabilirsin. Süpürme işlemin bitince pencereleri temizleyebilirssin. Ama bunları tek tek yapmak yerine sen kendi işlerini hallederken bir yandan da makineler çalışabilir. İşte burda asenkron yapı ortaya çıkıyor. Javascript aslında tek thread’li, yani tek tek işi yapan bir programlama dili fakat event-loop olayı ile multi-thread gibi çalışma özelliği var. Event-loop ve call stack konusuna da bugün bolca baktım. Hangi işlemlere öncelik verildiğini, systemin nasıl çalıştığını öğrendim. Örneğe geri dönelim. Eğer çamaşır tozu makineye koyulmadıysa makine uyarı verir, bunun adı da rejected olarak geçer. Eğer makine işini tamamlarsa bu resolved anlamına gelir. Başlangıçta da adı üstünde pending durumundadır.
- setTimeout (Node API ile çalışır) ile execution’ın zamanı ertelenebilir.Burda da event-loop un çalışma mantığını anlamakta fayda vardı. setTimeout’ta argument olarak bir callback function ve bir tane de delay süresi verilir.
- Promise resolve edildiğinde, .then() kullanarak çağırabiliriz.
- .then() : “I have a promise. When it settles, then here’s what I want to happen” diye özet geçilebilir.
- .catch() ile de diğer handler ımız olan reject durumunda kullanırız.
- Eşzamanlılığın avantaji ile de Promise.all() fonksiyonunu kullanabiliriz.
- İç içe olanlar(nested) yerine zincir içindeki çoklu promise’ler daha işlevli olduğu için onları kullanmalıyız eğer kullanmamız gerekirse.
- Bugün sizin verdiğiniz koddaki problemi anlamak da bugünün en güzel aydınlatıcı konularındna biriydi. Global değişekn kullanmanın zararlarının konu edildiği, iki kod arasındaki çok ufak bir farkla kodlarında işleyişinin farklı olduğu harika bir örnekti. Kodu okuyabildiğimi düşünüyorum, “büyük resmi” görmeye çok yaklaştığımı da hissediyorum fakat biraz daha kavramlar ve kodların arasında kayboluyorum sanırım. Öğrenme aşamasında olduğumuz için, zaten bir anda tüm kodları okuyuop anlayıp yorumlamamızı beklemekten çok, mantıklı yaklaşımlar sergileyebiliyor muyuz ya da çaba verip bir şeyleri anlayacak kadar analitik yaklaşabiliyor muyuz olaylara o önemli sanırım.
- Async-await konusunda bugün en ilgimi çeken nokta, birkaç await yapısı kullanarak, kodun senkron bir kod gibi görünüp okunabileceğini öğrendim.
- Async-await yapısının kullanım amacı .then() zincirlerinden kurtulup, kısa kod yazmak değil, onun synchronous koda benzemesi ve bu sayede maintain ve debug işlemleri için yazılım geliştiriciye yardımcı olmasıdır. Ayrıca store etmesi daha kolaydır.
- Singleton Pattern: Constructor’ı private olan bir sınıfn(class’ın) özelliklerine ulaşmak için bir getter yapısı ile kullanılabilen bir pattern’in genel adıdır. Bu işlemde sadece tek bir instance oluyor.
Günün Özeti : Hamdım, Pişiyorum..
7. Gün
Bugün ilk kez zorlandığımı hissettiğim gündü o yüzden birazcık stres yaptım. Çabuk bir şekilde bir kodu size göndermem gerektiğini düşünüp, çözümü direct stackoverflow da bulup copy-paste yapınca kendimi de kötü hissedip tekrar konuyu inceleyip kendim yazdım. Sonuçta amaç bir kod yazmaktan öte kendimin yazdığı, yanlışlarım da olsa bir şeyler üretmemdi. Sebebi de ilk kez karşılaştığım logic devrelerle alakalı şeyler olunca bir önyargıyla yaklaşıp çözümü aramak oldu. Ama işin içine girince yapılabildiğini anladım. Kendi yazdığım kodda ,Half Adder buldum. Full Adder’ın da yarısını bulup diğerlerini koda dökemedim ama biraz çabalasam olacaktı. Bugün şunları şunları bitirdim gibi bir cümle kullanamam zira bitirmedim. Bugün kod yazmak için bir şeyleri okumaktan çok yine Pratik yapmanın önemini kavradım. Son verdiğiniz kodu Javascript’e uygun hale getirdim ve sorunsuz bir çıktı aldım. Sonrasında da yorumlamaya ilk fonksiyondan başladım ama başlarda kaldı. Yarın devamını getirip hepsini yorumlamış hâle gelmek istiyorum. Son bir şey, siz gittikten sonra ofiste kalıp biraz daha çalıştım ama kötü bi niyetim yoktu yanlış anlamayın, ofiste çalışmak evde çalışmaya göre daha verimli oluyor diye durmuştum. Haber vermem gerekirdi bu konuda ama rahatsız etmemek istemiştim, kusura bakmayın.8. Gün
Bugün öğle arasına kadar verilen php kodunun javascript’e dönüştürüldükten sonra yorumlanması ile geçti. Sonrasında design pattern nedir ve örnekleri nelerdir onlara baktım. Özellikle singleton pattern ile alakalı çok şey araştırdım. Aslında basit bir mantığı var ama anladım ki henüz konuya tam hakim değilim. Javascript’te constructor’I private yapmalıyım diye bir yargının içine girince, biraz afalladım. Ama constructor’ı private yapmadan da private gibi davranabileceği bir yapı öğrendim: Object.freeze () yapısı. Yarın güzel bir örnek üstünde çözmeyi düşünüyorum. Hatta yapabilirsem hem async yapısını, hem singleton’ı, hem module pattern ile privacy yapma konusunu, hem de factory pattern’ini bir kodda yapmaya çalışacağım. Yapamazsam eğer hepsini ayrı ayrı yazıp yorumlamayı düşünüyorum. Bugün design pattern’lere bakarken öğrendim ki, aslında nesne yönelimli programlama ile gelişmişler. Sonrasında UML(Unified Modelling Language) diye bir şey buldum. UML ile soyut olarak tasarlanan nesne yönelimli modelleri görselleştirilebiliyor. Class’lar arasındaki inheritance ilşikisi gibi en basit konular dahi görselleştirilebiliyor. Yani design pattern’ler yazılım konusunda yıllardır biriken çok benzer sorunlara artık bir tepki olarak doğmuş ve bu kalıba göre bir çözüm üretin diye çıkmış gibi. Bu sayede kodun okunabilirliği, düzeltilebilirliği artıyor. Çünkü senden önce o kodu yazan kişinin tasarım kalıbınının ne olduğunu ve mantığını kavrayabiliyorsun.9. Gün
Bugün öğle arasına kadar dün verilen görevi tamamlamaya çalıştım. Singleton ve diğer yapıları çok araştırdım ve artık anladığımı düşünüyorum. Bazı şeyleri sindire sindire öğrenmek istediğim için hıphızlı yapıp birçok şeyi kaçıracağıma, üstüne düşünerek her yapının varlığını ve kullanım sebebini anlayıp ilerlemek açıkçası hoşuma gidiyor. Bugün verdiğiniz ödevi yaparken farkettim ki, bazı şyapıları bol bol kullanmak gerekiyor ki hafızada yer etsin. Tıpkı yabancı dil öğrenmek gibi maruz kalmadan pek sonuç alınmıyor. O yüzden Singleton, Factory pattern’lerine, async...await yapısına, biraz da try catch yapısına baktım bugün. Daha önce de baktığım konulardı fakat tekrar etmek çok iyi oldu. Gün sonlarına doğru da ödevi yapmaya başladım. Onun da birçok kısmı bitti. Sadece yapmam gerekenler şunlar: Satılmamış ürünlerin bulunduğu diziden, alıcının istediği ürünü rastgele(ya da bulunduğu sıraya göre) seçmek ve sonrasındaki işlemleri yapmak. Gün sonunda o kısmın mantığını kafamda oluşturdum, yarın kaldığım yerden devam edeceğim.10. Gün
Bugün güzel geçti. Verilen ödevdeki bazı kısımları yaparken bazı yerleri yapamayacağımı düşündüm ama yeni bir solukla tekrar tekrar üstüne düşününce işin içinden çıkabildiğimi düşünüyorum. Çıkıtılar her ne kadar istenen formatta olmasa da, doğru şeyler çıktığı için mutluyum biraz. Özellikle kendi emeğinle bir kodu ‘okumak’, yorumlamak, istenenler doğrultusunda şekil vermek çok güzeldi. İster istemez mantığın devreye girdiği birçok yer oluyor ve bu da insane keyif veriyor çünkü zekanı kullanıp bir şeyler yaratıyorsun. Evet gelelim yazmam gereken şeylere:- Singleton kalıbı kullanılan bir kodun nasıl çalıştığını bugün daha iyi öğrendim. Class’lardan bir object çıkarmayı, o objeler üstünden başka işlemler yapmayı pekiştirdim. .foreach, .map, .push, if statement, for döngüsü gibi şimdiye kadar öğrendiğimiz her şeyi bu örneğin içinde bol bol kullandım. Diziye nesne eklemeyi, diziden nesne çıkarmayı (gizleme daha doğrusu, kullandığım metoddan dolayı), fonksiyon içine başka bir fonksiyonu argument olarak kullanmayı, kısaca object ve arrays konusu bugünün gündemiydi. Ve bu örneği yapmanın çok faydası olduğunu düşünüyorum. Günün çoğunluğu farklı yöntemlerle ödevin içerdiği mantığı anlamak, buna çözümler üretmekle geçti.
- Module kavramını öğrendim bugün. Bazı kod parçalarını, aynı dosya içinde birkaç farklı dosyaya kaydedip ona göre işlemler yapmamız gerekebilir. Burada da, o dosyalar arasında köprü görevi görecek olan komutları öğrendim. ES6 ve Node Runtime environment’larında ufak farklı isimleri olsa da genel mantık aynı. Export ve import etmek için ‘module.exports’ ve ‘require()’ yapıları temel anlamda kullanılıyor Node için. Birkaç örnek inceleyip kendim de denedim.
-
Bu yaptıklarım aslında biraz ön araştırma ve önbilgi olması amacıyla yaptığım okuma gibi. HTTP Requests konusunu biraz araştırdım. Araştırırken karşıma tekrar ‘event loop, heap, stack, event queue’,hatta ‘XML, AJAX’ gibi kavramlar çıktı. Bunlar hakkında biraz okumalar yapıp üstüne görselleştirmek için biraz video izledim. Daha detaylı şekilde:
- Javascript’in en iyi özelliği, non-blocking özellikleri olması, ya da asenkron yapıda olması.
- İçinde çok fotoğraf bulunan websiteleri örneğin, bu özellik sayesinde daha iyi kullanıcı deneyimine sahip olurlar. Mesela bir gazete websitesi büyük fotoğraf dosyalarına sahip olabilir. Onların yüklenmesi beklenirse kullanıcı durmak istemez ya da beklemek zorunda kalır. Ama o sırada yazıları okuması mümkündür.
- Asenkron foknsikyon çağrılarında event loop kullanılıyor javascript’te. Function calls’lar stack’e eklenir. Server’ın cevap vermesi için beklemesi gereken fonksiyon request’leri, mecburen sıraya girerler. Stack boşaldığı anda sıradakiler execute edilir. First in, first out kuralına göre execute sırası belirlenir.
- Web geliştiriciler de daha iyi bir kullanıcı deneyimi için event loop’ları kullanır.