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

13 dk okuma

71. Gün

Bugünü düşününce, bu kadar bol zamanda verilen soruyu nasıl yapamamışım onu anlamadım. Yani aşırı uzun bir zamanda yine de tam olarak yapamamak üzdü şimdi düşününce. Ama yazdığım kodda her ne kadar mantık hatası olsa da (ki sonradan dediğiniz yerleri düzelttim) bence çok sadeydi ve yerindeydi. Fakat tam istenilen yapıyı oluşturmak için (string ifadelerde kesme işareti koymak gibi) yeterli mi bilmiyorum. Onun için de bir düzenleme yapmam gerekecek. Ya da sil baştan değiştireceğim gibi. Şu anki koda uygulanabilir mi deneyeceğim yarın. Bugün güzeldi. Javascript e uzun zamandır bakmamıştım ve bugün bir dili(Js’i) özlediğimi farkettim. İlk forEach’i gördüğümüz zaman aklıma geldi şimdi. Resmen ezberliyordum. Kendime “'map' daha kolay, ben hayatta bu forEach’I yapamam” demiştim içten içe. Aradan zaman geçti. Şimdi bu dediğime şaşırıyorum. Elbette hâlâ iyi değilimdir ama o hâlimi düşününce şu kısa süreçte (göreceli) “nereden nereye” dedim. Çok uzatırsam subjektif konulara gireceğim gibi geldi. O yüzden günü Aristo’ya ait olduğu iddia edilen, oysa ki sadece Aristocu felsefe için bir yazarın kendi kitabında değindiği sözüyle bitirelim:
“Biz, tekrar tekrar yaptığımız şeyleriz. Demek ki mükemmellik bir eylem değil, bir alışkanlıktır”.

72. Gün

Gerçekten anladım ki saatlerce uğraşıp istenilen sonuca ulaşılamasa da, bir ara verip tekrar bakınca en azından takılınan noktalar düzeltilebiliyor. Bu neden böyle oluyor hâlâ anlamadım. Belki buna inandığım için "plasebo" etkisi gibi bir şey olabilir.

Bugüne dönelim. Verilen görevi ilk gün bitiremedim. Sonraki gün istenilen sonucu hem Javascript'te hem PHP'de oluşturdum. Tabii ki de en iyi performansı veren, en mantık hatalarının olmadığı kod değildi fakat en azından ana fikirleri (recursive, algoritmanın oturtulması, switch-case kullanımının "şık"lığı ve okunabilitesi) sizden aldıktan sonra kendim çabaladığım şeylerdi. O yüzden memnunum şahsi olarak. Bugün öğleden sonra ise tamamen "string olarak gelen sorguyu, nasıl bir array içinde anlamlı node'lar hâline getirebilirim" diye düşünüp sonrasında pratiğe dökmek ile geçti. Başlangıçta bir yanlışım oldu. Gelen veriyi dediğiniz gibi manipüle ettim. Tabii ki bu yanlıştı. Sonra nasıl manipüle etmeden yapabileceğimi düşündüm. Eğer ben manipüle edemiyorsam manuel olarak, yazdığım kod etmeliydi. Eğer string ifadeyi yine boşluklarından split ile ayırırsam ve daha anlamlı hâle getirirsem karakterlerin düzenlenmesi daha kolay olur diye düşünmüştüm. Ama o şekilde işin içinden çıkmak kolay değildi. O yüzden her karakteri ayrı ayrı ele alıp ona göre işlem yaptım. Başta bu çok uzun sürer diye hiç denememiştim bile. Oysa ki o kadar da uğraştırıcı değilmiş.

Şimdi istenilen sonuca ulaşamasam da belli bir yere kadar geldim (Tanrım, umarım doğru yerlerdir). Yarın kaldığım yerden devam edeceğim.

Bu tür sorular ve sorunlar karşıma çıkınca bazen stres yapsam da genel olarak çok keyif alıyorum. Yapamasam bile daha da yapmak istiyorum.

Şeyi farkettim geçenlerde: Yıllardır stresle mücadele etmeye çalışmıştım bireysel olarak. Çünkü stres sağlık sorunlarına da yol açıyordu ve benden uzak olmasını çok istedim. Sonra farkettim ki yıllar boyunca ben stresle mücadele ederken asla beni bırakmıyordu. Madem gitmiyor, gitmeyecek, o zaman benimle kalsın barış içinde yaşayalım dedim. Hâlâ daha şımarıklık yapıyor ama onunla kavga etmekten daha iyidir bu bakış açısı sanki. Öylece kabullenmek stresi. Evet sıradan motivasyon konuşmaları, Amerikan filmlerindeki rehabilitasyon grubu (hani "Evet arkadaşlar Martin Eden 3 aydır alkol almıyor, hep beraber onu alkışlayalım" repliklerinin bol olduğu) konuşması gibi oldu. Çok uzatmayayım.

Son geldiğim noktayı paylaşmak istiyorum. Tam olmadığı için hiç açıp bakmasanız bile hiç sorun değil. Sadece paylaşmak istedim.

73. Gün

Bugün sabah baktığım görevde sonuca çok yaklaştığımı hissetmiştim. Fakat kendi kurduğum yapının karışmaya başlaması ve çokça şey yaptıktan sonra kalem oynatamadım nerdeyse. Sonrasında verdiğiniz görevi yaptım. Daha sonrasındaki için ise ne yapabileceğim üstüne fikir yürütüp bir mantık kurdum. Yarın onun üstüne çalışacağım sabah.

Bir cümlemiz var. Biz onu nasıl okurken anlamlandırıyorsak, makine için de aynısını yapmamız gerekiyor. Gelen veriyi anlamlı hale getirmek amacımızdı. Son örnekte ("mer(h)aba" ("a" asd) benim "sss" asdasd') tırnak işareti içindeki parantezin de tırnak işaretinin bir parçası olduğunu ve ayrı bir anlamı olmadığını nasıl ifade edebilirdim? Ve tabii ki aynı şey diğer kısımlardaki benzer durumlar için de geçerliydi. O zaman şu yapılabilir: Verideki her bir eleman tek tek gezilir. Eğer bir iç içelik söz konusu ise (anlamı oluşturmak için kullanılan anahtar kelimelerde), iç kısımda bulunan anahtar elementin pozisyonunu(index’ini) eğer bir yere kaydedersem ve onu sonrasında anlamlı yapıyı oluşturmak için kullanmazsam sorun çözülür. Bu iç içelik durumunda görmem gereken sadece içteki elemanı anahtar element olarak görmemek olacaktır o örnek için. Fakat iç içe yapılarda alt düğüm(sub-node) oluşturacaksam, elbette onu da yine hesaba katmam gerekecektir. Kısacası, karşımızda bulunan soruna göre farklı sonuçlar üretebiliriz. Makinenin dilini kullanabilmek için en temel mantıksal çıkarımları yapmak gerekiyor sanırım. Ve bu şekilde bir yapı oluşturmak ya da oluşturmaya çalışmak, felsefe ve matematiğin içine itiyor insanı. 4 ay önce bana bunları dese inanmazdım herhalde. Ancak yapay zeka gibi içinde “fazla zekice görünen kelimeler” bulunan konularda sanırdım. Oysa ki bir string varlığı anlamlı hale getirmek bile gayet “zekice” bir konuymuş.

74. Gün

Bugün aslında daha hızlı çalışıp tekrar query building’e de bakabilirdim. En olmadı mesai sonrasında da bakabilirdim. Ama yapmadım çünkü bugünkü görevin üstüne farklı neler yapabilirim onları denedim. Nasıl daha “clean code” yazarım diye düşünüp bir şeyler denedim fakat yine de pek clean olmadı. Yazarken sadece en rahat yazdığım şekilde ilerliyorum fakat sonrasında üstünde değişiklikler yapabiliyorum. Yazarken bunu düşünüp yazmaya çalışacağım elimden geldiğince. Bazı konularda problemin köküne inebildiğimi düşünüyorum fakat her yerde olmuyor. Gözden kaçan bazı noktalar sonrasında düzeltmem gereken farklı problemlere sebep olabiliyor. Ama bir şeyler yazdıkça ve üzerine gittikçe daha da oturacaktır. Bu hafta bir şeyler yaptım. Gerçekten de istenilen sonuçlara biraz da olsa yakın ya da problemlerin köklerine biraz da olsa yaklaştım. Yaklaşmamışsam da biraz öyle hissettim. Ama hep eksikler vardı. Sizin “algoritma çalışın” demenizi anlıyorum. Ben de boş zamanlarımda “competitive programming” gibi internette bolca bulunan kaynaklara bakmak istedim fakat onun yerine farklı şeylere vakit ayırdım. Şimdi anladım ki elimden geldiğince bakmalıyım. Eğer kitap gelirse kendime bir amaç koydum. O kitaptaki her algoritmayı PHP ve Javascript’te deneyeceğim. Ortaya işe yarar ve “clean” olan uygulamalar koyacağım. Tabii ki mesai dışında olan boş zamanlarda bunu deneyeceğim. Anlayarak adım adım ilerleyerek biraz zamanımı alır sanki ama denemekten zarar gelmez sanırım. Bugünlük bu kadardı.

75. Gün

Dün bir önceki görevdeki ana eksikler tamamlandı. Hâlâ daha eksikleri mevcuttu fakat onlara henüz çözüm getiremedim. Ama ilerleme kaydettiğimi düşünüyorum. Çok farklı bir şeyler üstüne düşünmemiştim bir yerden sonra. O yüzden biraz farklı konular da araştırdım. Sonra geri dönüp tekrar baktım ama yine olduğu kısımda kaldı. Yarın tekrar bakmaya devam edeceğim farklı bir görev verilmediği sürece.

76. Gün

Bugün biraz karışık ilerledim. Sabah 2. göreve tekrar bakıp ufak düzeltmeler yaptım. Sonrasında sizin verdiğiniz görev tamamlandı. Başta dediğiniz gibi hardcoded'dı ve ve sonrasında düzeltince sizin bize anlattığını mantığa uygun hâle yaklaşmıştı ama farklılık vardı. Siz anlattıktan sonra onu da anladığımı düşünüyorum. Sonrasında biraz Selenium nedir diye araştırma yaparken karşıma eskiden baktığım linklerden gargabe collector'ün ne olduğu ile ilgili bir stack overflow sayfası çıktı. Biraz da onu araştırıp notlar aldım. En yüzeysel şekilde ne işe yaradığını biraz anladım diyebilirim. Sonrasında ise sizin boş zamanlarınızda bakmamızı söylediğiniz PDF'e dönüp okudum. Saat 8'den sonra da tekrar 2. göreve dönüp parantez açmadaki problemlerimi düzeltmeye çalıştım. Maalesef ama maalesef hâlâ daha problemleri devam etmekte. Tam yaptım diyorum sonrasında birkaç farklı şekilde test edince yine istenmeyen sonuçlarla karşılaşıyorum. Hep çözümün çok yakınlarında gezip ona ulaşamadığımı hissediyorum. Belki de hislerime güvenmekten öte, neden sonuç ilişkilerini iyi kurup programın işleyişini daha iyi incelemem gerekiyor.

Bugün en karmakarışık ilerlediğim gündü sanırım. Enteresan şekilde kafamın çok karıştığını hissetmedim. Ve bir şeyden eminim: bir şeyi programlamaktan (ya da bunun için çabalamaktan) gerçekten büyük keyif alıyorum. Umarım hep böyle devam edecek.

Günü, kendime hep öğütlemeye çalıştığım sözlerden biriyle kapatmak istiyorum:
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."

77. Gün

Bugün tekrar 2. görevimiz üstüne çalıştım. Daha önce bulduğum temel hataları düzelttim. Daha az hatalı sonuçlar elde edebildim bu sayede fakat kodun kalitesini biraz düşürmüş olabilirim. Onunla ilgilenmekten çok çözüm odaklı baktım bir süre sonra. Sonrasında tekrar iyileştirmeler yapabilirim. Parantez açma ve kapamalarda mysql fonksiyonunun parantezi dışında bir sorun yer almıyor test ettiğim kadarıyla. Sonrasında üstüne yeni şeyler geliştirmekte zorlandığımı ve üretkenliğimin azaldığını hissedince ilgimi boş zamanlarımızda okumamızı söylediğniiz PDF’e yönlendirdim tekrar. En büyük ortak bölenin nasıl bulunduğu ile ilgili bir örnek vardı. Buna yüzyıllar önce Öklid’in geliştirdiği algoritma ile bir çözüm sunulmuştu. Biraz da internette araştırarak benzer matematiksel örnekleri, daha da hayran kaldım. Programlama ve programlama dilleri ile ilgili en temel bilgilerin verildiği giriş kısımlarını bitirdim. Kitapta şimdi C diline geçildi ve orada kaldım. Yine boş kaldığım vakitlerde o PDF’teki konulara çalışmaya, öğrenmeye devam edeceğim.

78. Gün

Bugün o PDF’in çoğunluğunu okudum, anlamaya çalıştım. Genel olarak C dili ile programlamanın nasıl yapıldığını, programlama temellerini anlatıyordu. Örneklerin birçoğuna baktım ama zaman kaybettirecek gibi olanlara bakmamayı tercih ettim. PHP ve Javascript’i şimdiye dek gördüğümüz kısımlar içerisinde hatim ettiğimiz için C’ye bakarken biraz şaşırdım aslında. Sebebi şuydu: örneğin memory yönetimi pointer kullanılarak kullanıcıya devrediliyor. PHP ve Javascript’te böyle bir şeyle hiç karşılaşmamıştık. Ya da numaralandırma kısmına bakınca şaşırmıştım. Bunun PHP ve Javascript te de yapılabilme şekilleri olsa da C’de daha ayrıntılıydı ve üstüne düşülmüştü. Ve object-class ilişkileri şimdiye dek en çok üzerine durduğumuz konulardı bugüne kadar. Fakat her ne kadar C’de de polymorphism ve inheritance’ın uygulanabilirliği söz konusu olsa da (stack overflow’da okuduklarıma göre) block yapılı bir dil olduğu için (bunun anlamını henüz tam kavramadım) OOP’nin uygulanması biraz zoraki göründü. Aklımda bazı soru işaretleri kaldı hâlâ daha (konunun cahili olduğum için olabilir) : örneğin Python ve Java gibi dillerin hem derleme hem yorumlama yönteminin pozitif yanlarını alarak çalıştıklarını okudum. Eğer böyle bir şey mümkünse neden şu an sadece derleme ya da yorumlama ile çalışan diller var biraz ona şaşırdım. Ama bunun cevabını basitçe google’a sormak yerine biraz daha soru işareti olarak kalmasını ve düşünmemi istedim.

Sizin bugün konuşmalarınızda “axios” kelimesini duyunca hemen aklıma Node.js kullanarak sunucu taraflı yaptığımız ufak çalışma geldi. “axios”un ne olduğuna tekrar bakarken react.js ile bir yerde karşılaştım ve biraz göz attım. Gerçekten hep bilmediğim ve öğrenecek çok şey olduğu için gözlerim ışıldadı. Kendi sitesindeki gördüğüm demolarda class yapısının kullanılarak client-side bir şeylerin geliştirilebildiğini (içinde bolca div ve diğer elementlerin bulunduğu), javascript’in farklı kullanım şekilleri ile karşılaştığımı görünce mutlu oldum sebebini bilmediğim bir şekilde.

Sanırım bu hafta boş bırakılınca bizim ne yaptığımıza bakmak istediniz ya da yoğun olduğunuz için serbest bıraktınız biraz. Gerçi her zaman bir görev verilebilir. En son üstüne çalıştığım görevde her ihtimali düşünerek bir şeyler yazmaya çalışmak gerçekten uzun zaman alacak gibiydi. Ve mantığını bir nebze çözebildiğimi, bir şeyler yapabildiğimi düşündüğüm için orada bıraktım. Ama query builder geçen hafta nerede bıraktıysak orada kaldı. Onu bitirememek hâlâ aklımın köşesinde kaldı. Ama tam anlamıyla bitirmek biraz daha zaman alacak gibiydi. Ama o görevler sayesinde farklı farklı bakış açılarını kazanabilmiştim her problem karşıma çıktığında. Bulabildiğim sorunlara çözüm getirmeye çalışmak ve bir kısmına getirmek de çok memnun etti. Kodlama becerimi daha çok kod okuyarak, yazarak, ve tabii ki hepsinin varoluş amaçları ile mantığını anlayarak daha da geliştireceğime inanıyorum.

Bazı zamanlar çok problemle karşılaşıp çözüm üretmeye çalışıyorum. Bulamadığımda ya da yanlış yaklaşımlarım olduğunda siz ve google sayesinde yanlışlarımı düzeltebiliyorum.Bazı zamanlarda ise okuduğum her şeyi anlıyormuşum gibi hissediyorum fakat bu bana yanlışmış gibi geliyor. “Hayır Buğra, kesin bir şeyi kaçırdın. Anlamış olmamalısın” diyorum. Bugün o PDF’e bakarken bolca kendime, “ tamam çözdüm bunu” dedim bol miktarda. Birçok yerde sadece bilgilerimi pekiştiriyorum gibi hissettim. C ile alakalı konularda syntax farkları, varlıkların kullanılış biçimindeki farklar, ve yorumlanan dillere göre farklarını görünce onları araştırdım biraz. C’de bir kod yazmayı denemediğim için sanırım böyle demiş de olabilirim ama gördüğüm kısımlar için konuşacak olursam biraz zaman alsada halledebileceğimi düşünüyorum. Bugünlük bu kadardı.

79. Gün

Bugün verilen görevi yapmadan önce bol bol farklı sitelerde benzer örnekleri incelemeye çalıştım. İnceledim diyemiyorum çünkü benzerini örnek alabileceğim güzellikte bir site bulamadım. Verilen problem şuydu: Bayi ve yazıcı sistemi için başvuracak kişilere ithafen bir sayfa hazırlamak. İki durum için tek bir sayfa olmalıydı. Bir sayfa içinde iki farklı sekme olursa sayfanın karışıklığı ve uzunluğu azalır diye düşündüm. Default olarak bir sekmenin başlangıçta açık olarak gelmesi gerekir bu düşünceyle. Yayıncı insan zaten bilgisayarla oldukça haşır neşir olduğu için, bayi sistemi default olmalı diye düşündüm. Peki içerikte ne olmalı? Bayi olmak için başvuracak birey bilgilerini bize bir şekilde ulaştırmalı. Bunun için de iletişim adresi verebiliriz ya da kullanıcıdan istediğimiz verileri form aracılığı ile alabiliriz. Peki kullanıcı bayi olmak istiyorsa, bu linke kadar geldiyse neden tercih etmesi gerektiğini biraz süslü bir dille anlatıp ikna etmek iyi olmaz mı? Bence olur. O yüzden sitenin (şirketin) temel özelliklerinden birkaçını sayısal olarak sunmak (kaç yıl sektörde bulunulduğu, kaç firmanın yetkili satıcısı olduğu, yetkili satıcısı olunan firmaların ürünlerinin sektördeki genel hacmi, vb) verilebilir diye düşündüm. Özetle iki şey düşünebildim: Kullanıcıyı ikna etmek, gönül rahatlığı ve istekle ile bizimle iletişime geçmesini sağlamak.

Akşam mesai sonrasında ise önsöz, teşekkür kısımlarını dahi okuyarak, bazen de sapıkça kitabı koklayarak (ilk alınan kitap kokusu (sayfaların iç kısmı)) başladım. Big O notasyonunun ne olduğuna kadar geldim. “Giriş kısmını okuyarak zaman kaybediyorum” düşüncesi olsa da bilgisayarın, hesaplamanın makine ile yapılmasının tarihini okumak güzeldi. Charles Babbage’dan Alan Turing’e, John Mauchly’nin çabalarından ve bolca fikirlerinin çalınması ya da üstüne konulmasından Apple’a, tarihte ilk programcının hep erkek olduğunu farzeden cinsiyetçi idrak yeteneğimi Ada Lovelace’ın kırmasına kadar çokça şeyle karşılaştım. Sanırım yazmaya devam edersem rapor, rapor niteliğinden çıkabilir çünkü sonrasında Ada Lovelace’ın Lord Byron’un kızı olduğunu, Lord Byron ayağı sakat halde Çanakkale Boğazını yüzerek geçtiğini, Don Juan’ı yazdığnıı ve Albert Camus’nun Sisifos Söyleni kitabında Don Juan hakkındaki çıkarımlarına kadar gideceğim. Uyku zamanı geldi.

Yarın görevi bitirmeye çalışacağım. Yeni şeyler deneyerek bir şeyler yapmak istediğim için biraz zaman alıyor. Sadece eski öğrenmiş olduğum şeyleri tekrar edersem elbette daha kısa sürer fakat kendimi zorlamak istiyorum yeni şeyleri de kullanabilmek için. Deneyeceğim.

80. Gün

Bugün tamamen CSS ve biraz da Javascript ile geçti. Bir şeyler yaptım fakat pek içime sinmedi. Kendim, “tamam işte, bu oldu” diyemedim. Oysa ki kargolu ürünler tasarımında diyebilmiştim. Yine de üstüne düşünülse daha da iyi şeyler yapılabilir.

Bugün bayi sisteminin form kısmı ve yayıncı sisteminin tasarımı gerçekleştirildi. Ekstra bir kütüphane kullanılmadı. Sadece Google Charts’tan yararlanıldı ama basitçe resim dosyası haline çevrilebilir. Yayıncı kısmında renkler ve düzen tam oturmadı. Responsive’liğe dikkat edilmeye çalışılsa da sayfa küçültüldüğünde bozulmalar oldukça fazlaydı. Elle tutular sonuçlar elde edildi fakat istenen düzeye gelmedi.