Yazılımın ilk 250 günü - Part 14

15 dk okuma

131. Gün

Dün çalışırken akılda kalan muğlaklıklar bugün biraz da olsa giderildi. Dün yaşanılan problem: Farklı teknolojiler (birçok terminal komutu, strapi, postman, react native-{component,context, …diğer konular}-, asenkron fonksiyonu doğru kullanmaya çalışmak, iç içe component kullanmak ile ilgili sözdizimini doğru oluşturmak) ile birdenbire karşılaşılması ve hangi birinin anlaşılacağı ve ortada ne döndüğünü kendi kendine açıklayamayan bir insanın yaşadığı fatal error.

Bugüne gelelim. Düne göre kıyaslanamayacak kadar iyi geçti. Çünkü bilmediğim konularda bir şeyler yapmaya çalışmaktan çok onları anlamaya, konsepti kafamda oturtmaya çalıştım. Sırayla gidelim:
  1. İlk önce Context’in ne olduğuna sil baştan tekrar baktım. Ağaç içerisinde bir prop’un kökten en uçtaki dala ulaşabilmesi için normalde gövdedeki her kısımdan ve budaklanmadan geçmesi gerekli. Fakat bu datanın(prop) hepsine uğrama zorunluluğu karmaşıklığı oldukça arttırabilir. Context burada bize provider’a erişen consumer component’lerin erişebildiği global bir veri (state) sağlar.
  2. Component kısaca bir Javascript fonksiyonu gibi, prop ise input. State prop’a benzese de private ve component tarafından control ediliyor. State güncellendiğinde re-rendering gerçekleşir. Component’ler React’ın bize verdiği bir armağan gibi. Kodların tekrar kullanılabilirliğini sağlayan yapıtaşları. Bir button componenti yazdığımızı düşünelim. Her buton kullanılan sayfada tekrar tekrar button için kod yazıp tekrara düşmek yerine aynı component’i kullanabiliriz. Aynı component’in farklı varyasyonlarını da yaratabiliriz. Aynı button componentinin farklı varyasyonlarını kullanarak tutarlı bir tasarım elde ederiz (Her sayfada ilgisiz ve örtüşmeyen butonlar kirli ve tutarsız bir görünüm sağlayacaktır. Uygulamanın hafızalarda kalan kendine özgü tasarımı bu olmamalıdır).
  3. Sonrasında tavsiyeniz ile tıpkı bir web sitesi projesinin mimarisini oluşturmak gibi, react projesinin de nasıl bir mimariye, klasör dizinine, design pattern’e sahip olması gerektiği üzerine okumalar yapıldı. Web projesi mimarisinde olduğu gibi burada da tek bir doğru veya yanlış olmadığı gibi herkesin best practice’i kendi yaklaşımıydı. Özellikle iki dizaynın sıkça bahsedildiği görüldü: Componentlerin atomik yapı (atom-molecule-organism-template-page) ile oluşturulduğu bir proje mimarisi vardı. Burada atomlar küçük gruplara bölünemeyen en küçük yapı taşı componentlerdi. Moleküller atomlardan oluşan ve tek bir şey yapan bir gruptu. Form alanı gibi düşünülebilir. Organizma ise moleküllerden oluşan ve app’in daha kompleks parçasını oluşturan bir yapıydı. Template ise adından da anlaşılacağı gibi bir sayfanın layout’ı, template’i idi (Örneklendirme: Nesnenin template’i class. Sayfa ise template’in instance’ı). Diğer sıkça karşılaşılan dizayn ise Container/Component konsepti idi. Mantığı anlaşıldığı kadarı ile componentleri elden geldiğince stateless yaparak onları “dump” olarak görmekti. Container ise hem bir controller hem de sayfanın kendisi olarak davranıyordu. Bu konunun çok fazla dezavantajı ile geçmişte karşılaşılmış ve şimdi de bunun için optimize çözümler getirilmiş (design pattern’lardan command pattern’i uygulamak, hook’ların yardımı ile geliştirme yapmak,, vs.) fakat farklı farklı uygulamaları olduğu için ve saat de geç olduğu için sonra değinmeyi düşünüyorum. Ama atomik dizaynın anlatıldığı referans kaynaklarda container/component konseptinin ölçeklenebilir olmadığı, ne iş yaptığının belli olmadığı (sayfa mı yoksa controller gibi hareket eden stateful bir component mı) gibi konulara değinilip bunu kullanmaya gerek yok denilmiş. Gri taraftan bakınca ikisinin de oldukça fazla kullananı var ve bizim işimize en çok hangisi yararsa ve gelecekte daha az soruna yol açacak hangisi ise ona göre bir dizayn oluşturmak faydalı olacaktır. Seçenekler ise sadece ikisi değil bambaşka bir yapıda olabilir.

Bu detaylı isimlendirmelere girmeyen ve React’ı oldukça güzel anlatan bir kaynak açıkçası daha çok dikkatimi çekti: React proje mimarisi.

Açıkçası klasörlendirme yöntemini kişisel olarak beğendim ve web’te genel olarak tavsiye edilen şekle benzediğini farkettim. Tabii container/component konseptine daha yakındı. Bu konu üzerine çokça fikir var ve benim fikrim web’teki konseptin benzerini burada oluşturmak. Ki yukarıdaki linkte de bir benzerinin olduğu kanısındayım.

Farklı bir konuya girilecek olursa, hook’un varlık sebebini biraz daha iyi anladım. Component’ler resusability’yi arttırıyor fakat farklı component’lerin kullandığı bir yapı olduğunu düşünelim. İşte burada biz özel bir hook’u kendimiz oluşturabiliyoruz.

SRP’nin react native’ e çevrilmiş hâli: “Bir component ya da bir hook; tek bir işi yapmalı, o işi çok iyi yapmalı ve yalnızca o işi yapmalı.”

Yine yukarıdaki linki referans alarak şu cümleyi direkt almaktayım: “Birbirleriyle direkt olarak haberleşemeyen fakat içerik olarak birbirleriyle bağımlı her bir modül için ayrı birer context yapısı kurmalısınız. Ek olarak; context, içinde tuttuğu herhangi bir state güncellemesinde bağlı olduğu her bir componenti günceller. Context’i dinleyen componentler zaten o context’e ihtiyaç duyuyor olmalı. Eğer çağırdığınız herhangi bir state’i gereksiz görüyorsanız; ya o state’tin context’e işi yok ya da context’i yanlış kurgulamışsınız demektir. ”

Redux ve context api kullanımı arasındaki farklar hakkındaki bir yazı benim konuyu daha iyi anlamamı sağladı.

Reducer, provider, context, state, useState ve useReducer, dispatch, action gibi kavramları daha iyi kavradım. Henüz useReducer ve useState arasındaki farkı çok bilmesem de eğer birden fazla state’i aynı context’te kullanıyorsam burada useState yerine useReducer’ı kullanmamı react’ın dokümantasyonu tavsiye etmiş. Daha iyi anlamaya çalışacağım.

API’den data alımı,context kullanımı, re-render konusuna yarın sabah tekrar bakmayı düşünüyorum. Hem redux’ı hem react’in yazımında bulunanlardan birinin yorumunu görünce, oop çalışırken Alan Key’in düşüncelerini okumak gibi bir hissiyat oluştu.

Konu hakkındaki sis perdesi biraz aralandı gibi hissediyorum. Tabii ki daha çok çok fazla öğreneceğim bilgiler, yapacağım hatalar, sevineceğim gelişmeler olacaktır. Tek bildiğim düne göre ilerleme oldu.

132. Gün

Günün başlarında yine genel konsept üzerine okumalar yaptım. Dediğiniz gibi teorik bilgileri ne kadar çok edinmeye çalışsam-edinsem de pratiğe dökmedikçe çok bir anlamı olmuyor. Bocalamalar yaşanıyor. Başkalarının problemlerini ve geliştirilen çözümleri okumak lebette faydalı fakat kendim bir probleme sahip olmadan o problemi anlamam da kolay olmayabilir (empati yapmak gibi düşünülebilir: “hmm evet bu sorunla ben de karşılaştım, ve çözümler bu şekildeydi-şekildeymiş”).

Sonrasında dediğiniz üzere bir resme tıklayınca onunla ilgili bir sayfaya gitmesini sağladım. Fakat bunu yapmak biraz uzun sürdü. Uzun sürme sebepleri: Navigasyonu nasıl kullanacağımı hiç bilmiyordum. O kütüphaneyi indirdim. Dokümantasyonunu işime yarayacak kadarı ile okudum. Benzer kod yapıları kullanarak kendi problemimi çözmeye çalıştım. Zamanımı alan problemlerden biri: scrollView ile sayfadaki tüm kaynaklar direkt yüklendiği için onu kullanmaktan kaçınıp Flatlist’i (web’teki lazy initialization’ı default olarak yaptığı için) kendime şiyar edinmiştim. Fakat nereden kaynaklandığını çözemediğim bir sorundan dolayı scroll’u oluşturamadım. Buna tekrar bakacağım. Sonrasında ise navigasyon sırasında parametre aktarımında hata ile karşılaşıyordum. Object destructuring’I iyi bilmediğim için ve copy-paste code’u yanlış kullandığım için böyle bir sorun ile karşılaşmışım. Sizin de yardımınızla onu düzelttim. Şu an kod görünürde normal şekilde çalışmakta. Ama komponentler herhangi bir state kullanmamakta (sadece navigasyon ile alakalı kısımda kullanılmakta fakat o kütüphanenin kendi nesnesinden gelen bir özellik). State tutulmadığı için doğal olarak context’e de ihtiyaç duyulmadı. Temel işlemleri yaptıktan sonra geliştirmeleri de yapabileceğimi düşünüyorum. Özellikle Javascript’e daha çok hakim ve debug kabiliyetlerine daha çok sahip olunabilir. Olunacaktır.

133. Gün

Bugün öğrendiklerimi, yapmayı düşündüm çoğu şeyi toplayıp yapmayı düşünmüştüm. Fakat birbirine çokça bağlı component bulunduğu için kod iyice karışmıştı. İşin içinden çıkılabilirdi tabii ki ama gecekondu çıkar gibi olmuştu yapı. Sonrasında Bir siteden sayfayı scroll ettikçe sonsuza dek fotoğrafların bir api aracılığıyla çekilip gösterildiği bir örnek gördüm. Sadece onu anlamaya çalıştım. Aynı klasör yapıları, aynı dependency’ler ile her şeyi birebir aynıydı. Hem context, hemp api’den veri çekme, hem bol bol callbackler, hem de basit görünen güzel bir mantık ile yazıldığını düşündüğüm için anlamak için çabaladım. Açıkçası o kodda yapılanları genel manada anladım fakat anlaşılmayan yerler de kaldı. Yarın sabah o örnekteki anlaşılmayan kısımlara (özellikle useCallback ve useEffect tam oturmamış, onu kavrayacağım) bakılacak. React Native’de sadece Css Javascript tarafı var olduğu için sadece fronent olduğunu düşünürdüm fakat controller kısmını da içeriyor anladığım kadarıyla. Navigasyon, veri iletimi (state management), biçim(style) kısımları en genel uğraşılan alanlar anladığım kadarıyla. Genel manada düşününce ne var ki bunda yaparım diyorum fakat işler o kadar olmayabiliyormuş. Egoma yenik düşmeyip işe hep ilk başladığım gibi acemiliğin getirdiği çocuksu merak ve tutkuyla bakmaya devam etmeliyim. Edeceğim (Lafla peynir gemisi elbette yürümez, icraatte de elimden geleni yapmaya çalışıyorum).

134. Gün

Günün benim anlam ve önemi Stackover’da ilk kez bir soruya cevap yazmam. Yine o birçok yerde sorulan ama doğru düzgün cevaplanmayan basit sorulardandı aslında (2015-16 civarı cevabı github'ta verilmiş gerçi, o da eklendi). Hiç hakim olmadığım ve yeni başladığım bir konuda yazmak elbette doğru olmayabilir fakat karşılaşılan sorunun sebebini biraz da olsa anladığımı düşündüğüm için yazmak istedim. Yanlışsa da silerim ya da güncellerim tabii ki utanılacak bir şey yok diye düşünüyorum.

Onun dışında render konusunda verdiğiniz bilgiler için teşekkür ederim. useEffect’in kullanımı siz anlattıktan sonra tam olarak kavradım.

Farklı olarak ne yaptım derseniz, Google’a “react native examples” yazıp, karşıma çıkan ufak örnekleri ben de onlara bakarak ya direkt copy paste olarak alıp yorumladım ya da kendim yazmaya çalıştım. Bugünlük bu kadardı.

135. Gün

1 haftadır React’a baksam da bugün kullandığınız yapı ile ilk kez karşılaştım. Bir komponentin çocuklarına bazı özellikleri geçirmek için her çocuğuna tek tek o özelliği ‘bahşetmek’ gerekiyormuş anladığım kadarı ile. Çok güzel bir yapı gibi görünmüyor ama çözümü de o yapı sağlıyor. Farklı bir bakış açısıymış. Yaptığımız şeylerin sihir olduğunu düşünmüyorum ama bazen büyüleyici geliyor. Bunun yanlış olduğunu düşünmüyorum. Onun dışında komponentleri oluşturmak, kullanmak zevkli fakat aralarındaki ilişkileri kurmak, asenkron yapıları (olduğunda) kullanmak beni zorlayabiliyor. Daha da zorlarsa sevineceğim çünkü henüz yeni başladık.

136. Gün

Bugün bir yerde sıkıştım. Günün sonuna doğru istenen çözüm için yapılması gerekeni buldum:

@react-navigation/stack

@react-navigation/native-stack

Bu ikisi birbirinden farklıydı. Ben altta bulunan kütüphaneyi kullanıyordum. İkisi arasında iki fark vardı genel olarak: Birinci Kütüphane çok daha fazla özelleştirilmeye müsaitti. İkincisi ise özelleştirilmeye çok açık değildi fakat performans açısından diğerine kıyasla daha hızlıydı. Birincide verilen görevdeki navigasyon şekli direkt olarak sağlanıyordu (denediğim örnekte işe yaradı). İkincisinde ise navigasyon state’inde her yeni gelen state’i overwrite etmekteydi. Bu yüzden asla aradaki screen’lere ulaşamıyordum. Tüm gün bunu gidermenin yolunu aradım. Türlü denemeler yaptım ama bulamadım. Açıkçası bottom tab kütüphanesi içinde yer alan dispatch metodu ile istenilen şey yapılabilir mi diye düşündüm, uğraştım fakat sonuca ulaşamadım. Yarın sabah kaldığım yerden devam edip o sorunu çözmeye çalışacağım.

137. Gün

Bu sabah sizin yaptıklarınızı dikkatle izledim çünkü babamın aşçılıktan öğrenip bana sıkça söylediği “elin değil gözün hırsız olsun” düsturu ile davrandım. Sonrasında drawer navigasyonunu yapmaya çalıştığımda ise yine version hatasından dolayı bir kütüphane ile ilgili hata ile karşılaştım. Sorunu Google’ladığımda farklı çözüm yöntemleri buldum. Dosyalardaki bazı kodlarda değişiklikler yaparak ve ilgili kütüphaneyi kaldırıp farklı bir sürümünü ekleyerek çözüme ulaşabildim. Başta daha da bozarım düşüncesi ile elim titrese de sonrasında “korkanın çocuğu olmaz” düsturu ile elimi korkak alıştırmadan ve dikkatle çözüme ulaştım. Sonrasında sayfaları dosya ve klasör yapısına dönüştürme problem vardı. Kendi oluşturduğum proje ölçeğinde bir yapı kurmaya çalıştım. Web’te bu konu üzerinde araştırma yaptığımda arketipe göre değil özelliğe (group by feature, or group by archetype) göre sınıflandırma yaparak bir dosya-klasör düzeni kurmamız genelde öğütleniyordu. Mobil tarafında da aynı ilkeyi düşünsem de örneklerde en sık screen-component yapısını gördüğümden dolayı on duruma yakınsayan bir çözüm oldu. Son verilen görevde yarın kaldığım yerden devam edeceğim.

138. Gün

Bugün bir konuda zorlandım. Epey fazla zamanımı aldı çözebilmek. Sorun asenkron bir fonksiyonu kullanamama özrümden kaynaklanıyordu. Sorunun kaynağını biliyordum. Senkron bir reducer fonksiyonu içerisinde asenkron olarak çalışıp sunucudan cevap alan bir fonksiyonun cevabını senkron bir yapı içerisinde kullanmaya çalışıyordum. Siz bana güzelce açıklayıp daha önce aynı konudaki hatalı kodumu düzeltmiştiniz. Bugün çözüme ulaşmakta zorlanmamın sebebi, çözüme giden yolu etraflıca düşünüp sistemlice kurgulamamamdan kaynaklanıyordu. Reducer’ın asenkron yapılması ya da reducer içinde asenkron fonksiyon nasıl kullanılıra dalmıştım. Oysa ki reducer’ı tetikleyen dispatch fonksiyonunu, kullandığım asenkron fonksiyona callback olarak verseydim sorun düzelecekti. Ki çok geç de olsa bu çözüme ulaşabildim. Ulaşınca da çok mutlu oldum tabii ki. Asenkron yapı kullanmak hala zorlasa da kendim bir çözüm üretebiliyorum sizlerin de yardımıyla.

Sonuç olarak kullanıcı girdisine göre login state’ine global olarak tüm sayfalardan ulaşılabiliyor ve değişebiliyor. Yarın kullanıcı çıkışını yapabilirim. Kullanıcı giriş ve çıkış yaptığında state’e göre komponentlerin veya sayfaların gösterilmesinde bi değişiklik yapabilirim. Bence gayet bu işi çözeceğim gibi görünüyor.

139. Gün

Bugün biraz iyileştirmeler yaptım yazdığım kodlarda. Öncelikle sunucu iletişimi ile ilgili kısmı ayrı bir sınıfa koydum. Bu sayede direkt oradan api iletişimi için ihtiyaçlarımı temin edebilirdim. Bir fonksiyon komponente koymuştum başta fakat nesne oluşturup http metotlarını nesneye eklenebilecek post, get gibi fonksiyonlar ile çağrılabilirdim. Bu yüzden sınıfa döndürdüm fonksiyon komponenti. Kullanışlı olur diye düşündüm.

Ayrıca kullanıcı token’I oluşturma konusunu front end tarafında yapmıştım fakat sonrasında sunucu tarafında tamamladım. Önce kullanıcının telefonundan elde edilen unique id yi aldım. Sonrasında da unique id nasıl oluşturulur araştırması yaparken karşılaştığım şu cevaptaki örneklerden birini kullandım. Algoritması nasıl işliyor merak etsem de yarın iş sonrası bakmayı düşünüyorum. Çünkü nasıl olur da unique bir id oluşturulabiliyor sonlu sayıda uzunluğu bulunan bir string ifade ile henüz anlamadım. Özetle kullanıcının telefonunda alınan unique id ve kendi oluşturduğum unique bir değeri birleştirerek kendimce bir token oluşturdum. Sonrasında kullanıcı sunucu ile iletişime geçtiğinde header'da bu token’I göndererek kendi varlığını ispatlayabilir. Kullanıcı uygulamayı silse dahi onun telefonundan gelen unique id bizde kalabileceği için, bilgileri tekrar kullanılabilir, hatırlanabilir.

Sonrasında geçen hafta okumalar ve araştırma yaparken karşılaştığım konuya pratikte şahit oldum: state’te nesne olduğunda ve nesnenin içinde bir elementin değerini değiştirdiğimde değişiklik algılanmıyordu. Dolayısıyla da yeniden render yapılmamaktaydı. Sizin de dediğiniz şekilde çözüme ulaştım. Şu an aklımda kalan şekilde anladığım şuydu: biz nesneyi güncellemiyoruz. Yeni bir nesne oluşturuyoruz.

Sonrasında hala ona mı bakıyorsun deme ihtimalinizi düşünsem de yine de call by value-reference konusuna çok az baktım. Bu sefer farklı bir şeyler karşılaştım. Ne pass-by-value, ne de pass-by-reference olduğunu öğrendim object konusunun. Açıkçası php, javascript ve birçok modern dil default olarak pass by value’yu kullansa da object konusunda call(pass)-by-sharing diye bir evaluation strategy siydi.

Anladığım kadarı ile nesneler ne klonlanıyor ne de kopyalanıyor. Nesneler, paylaşılıyor. Evet, paylaşılmasından söz edilmiş. Örnekle gidelim (ilk cevaptan alınmıştır):

function changeStuff(a, b, c)
{
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);  //10
console.log(obj1.item);  //changed
console.log(obj2.item);  //unchanged
Bildiğimiz tek şey, default olarak her şeyin pass-by-value olarak geçtiği. “num” değişkeni bilindiği gibi kopyalanarak (value’su alınarak) geçtiği için değişmemiştir. Fonksiyon içinde işlem yapılan kendisi değil artık. Obj1 nesnesinin geçişini vikipedi’de açıklanan şekilde okuyalım . obj1 bir kutu. Ben kutunun içeriğini değiştirebilirim. Ama kutu yine aynı kutudur. Benim okuduğum gördüğüm bildiğim her şey sadece kutunun kendisi. İçeriğinde bugün ayakkabı olur yarın kablo-bozuk elektronik aletler olur bu beni ilgilendirmez. Dolayısıyla ben kutunun içeriğini değiştirebilirim. Başkası da kutunun içeriğini değiştirebilir. Dolayısıyla kutu aslında paylaşılan bir şeydir. Dolayısıyla en basit manada eski yöntemle düşününce pass by reference(call by sharing, alias(takma ad), vs.) gibi görünür her şey. Oysa değildir. Neden değildir bu kısma gelelim: eğer pass by reference olsaydı obj2 de değişmeliydi. Fakat bir değişim olmadı. Neden? Biz kutuyu fonksiyon ile paylaştık. Al bu kutu ile istediğini yapabilirsin. Peki o ne yaptı? Verdiğimiz kutuyu hiç kullanmadı!. Onun yerine farklı bir nesne oluşturup, bizim kutumuza referans olan değişkene, _“Sen artık bu yeni nesneye referans ol, bize gelen kutuyu bırak”_ dedi. Dolayısıyla obj2’de hiçbir değişim olmadı. Bu kutu örneğini açıkçası sevdim. Her ne kadar konu anlaşılsa da bazen karışıklıklar olabiliyor. Biraz daha iyi anlaşılmasını ve örneklendirilmesini sağlıyor.

Hala daha javascript’in nasıl çalıştığını tam bildiğimi söyleyemem. Ama mümkün zamanlarda daha iyi şekilde anlamaya, öğrenmeye çalışacağım. Her şeyin nesne olduğunu ya da nesne gibi davrandığını biliyorum. Yukarıdaki örneği düşününce, 10 neden değişmedi? 10 bir kutuydu. On ile çarptığımızda (assignment yaptığımızda), eşitlediğimiz değer kendisi değildi. O farklı bir kutuydu. 100’dü o. Belki bu düşüncem hiç doğru değildir (primitive değerleri de obje olarak görme-javascript'te). Direkt pass-by-value diyerek geçebilirim fakat etraflıca düşünmek ve farklı bakış açıları yakalayabilmek ya da yakalamaya çalışmak keyifli ve tatmin edici.

Onun dışında gün sonuna doğru mobil sitedeki problemlere, olsa güzel olur diyebileceğim farklılıklara baktım. Biraz da farklı e ticaret sitelerinin uygulamalarına baktım. Navigasyonlarına, yönlendirmelerine, dizaynlarına göz gezdirdim. Bence yapacak çok şey var. Bence bu harika. Bence ben de çokça katkı sağlayabilirim.

140. Gün

Bugün sadece mobil uygulamadaki hatalar, problemli yerler incelendi. Aslında mobil uygulama tamamen incelendi. Birbirini tekrar eden, estetik açıdan çirkin göründüğü düşünülen yerler de rapora eklendi. Uygulamayı direkt fatal error’a sokan kısımlardan da bahsedildi. Bence yapacak çok şey var. "Krizi fırsata çevirme" deyişi gibi kendime yapabileceğim birçok şey bulabiliyorum. Umarım yapacağım. Yaptığım iş zorunluluk gibi gelmiyor. Gelse büyük ihtimal yapmıyor olurdum. Zorunluluk gibi gelmemesinde sadece işin kendisi değil, işin yapıldığı ortam da çok etkili. Çok şükür ortam bana köstek olan değil beni teşvik eden kıymetli bir ortam. Yapılacak, öğrenilecek o kadar çok şey var ki çalıştığımız konularda… İyi bir yazılımcı olabilirsem, tek yapacağım şey yazılım olmayacak diye düşünüyorum (45 yaşında bir teknede yaşayıp balıkçılık da yapılabilir, direkt akla "CEO olacağım, şirket sahibi olacağım, Newton, Einstein, Galileo gibi tarihe geçeceğim, dünyayı kurtaracağım (neyden?)," gibi fikirler gelmemeli tabii ki). Ama yazılımcı olmak bana büyük bir katkı sağlayacaktır diye düşünüyorum.

Bu arada belirtmek istedim; one drive’daki “günlük” klasörleri, size gönderdiğim raporlardan oluşuyordu. Hatta “xxx” diye bir klasör vardı ki orda da javascript dosyaları vardı (clickbait dosya ismi koymak güzel geliyor nedense :)). Yine teknik olmaktan öte bir rapor oldu. Ama bugün gönderdiğim pdf’te biraz daha teknik olmaya çalıştığım için bu durumun sorun olacağını sanmıyorum.