Yazılımın ilk 250 günü - Part 10
91. Gün
Dün kullanım durumlarını oluşturmuştum ama çok karışıktı. Bugün biraz daha düzenleyip temize çektim bilgisayar üstünde. Hâlâ daha domain model’I oluşturmadım o yüzden. Yarın onu kesinlikle bitirmem, hatta sequence diyagramlarını da tamamlamam gerekiyor. O yüzden bugün uykumu iyice alıp yarın kaldığım yerden devam edeceğim.92. Gün
Toplam 11 tane kullanım durumu oluşturdum. Bugün sadece 1 tanesinin domain class model'ini, sequence diyagramını, ve son olarak class diyagramını oluşturdum. Eksik, hatalı kısımları olabilir ama elimden geldiğince iyi yapmaya çalıştım. Yarın kalan 10 kullanım durumunun hepsini ilerletemeyeceğime göre sanırım pazar günü de tam gaz çalışmaya devam edeceğim.93. Gün
Bulunduğum projede yapacak olduğum görevin süresini nasıl tahmin edebilirim bilmiyordum. Çünkü ilk defa öyle bir şey yapacaktım. Eğer matematiği hiç bilmeyen bir insansam 1+1’in 2 olduğunu ne kadar zamanda hesaplayacağımı varolan bilgilerimle tahmin edemem. Ancak uydurabilirim. Ama daha önce bu hesaplamayı ya da buna benzer bir hesaplamayı yaptıysam daha gerçekçi bir tahmin oluşturabilirim. Eğer ben bu hesabı yapmadıysam nasıl tahminde bulunabilirim? Tekerleği tekrar icat etmeyerek tabii ki de. Ben tekerleği tekrar icat etmeden bu zaman problemine uygun bir çözüm getirmek istedim ama farklı insanların sunduğu zamansal verileri bulamadığım için, açıkçası en başta proje süresini mantıklı olmaya çalışarak uydurmuştum. 1 hafta sonrasında kendi tecrübeme dayanarak projenin bir kısmını ne kadar sürede bitirebileceğim hakkında fikir edinebilmiştim. Sonrasında ona göre bir tahminde bulundum fakat bu tahmini oluştururken kendim için en az riskli şekilde oluşturmaya dikkat ettim.Son gün öğrendiğim şey şuydu: Ne kadar sürede biteceğini bilmediğim ve tamamlamam gereken bir proje önümdeyse eğer, öncelikle o proje hakkında araştırma yapmam gerekli. Daha önceki tecrübelerim, farklı insanların tecrübeleri yardımcı olabilirse tahminimi yüksek doğrulukla oluşturabilirim. Eğer yoksa projeyi daha ufak kısımlara ayırıp, referans (ben ya da başkası) bulabileceğim kısımlar için bir tahmin oluşturabilirim. Bu henüz aklıma geldi açıkçası. Bilinmeyen kısımları ise projeyi bana ileten kişiye iletip, doğrulukla varolan durumu anlatırım.
Bazen karşıma çıkan problemle oynamayı ve basitçe bir yaklaşımla onu çözmeyi çok severken, bazen de onu canavarlaştırabiliyorum. Bu da benim için ilerleme açısından zorluklara neden olabiliyor. Ne yaptığımın genelde farkında oluyorum ama canavar bazen çekici gelebiliyor ve beni daha da derine çekiyormuş gibi hissediyorum. Bu projede bunu birkaç defa hissettim. Ama onunla savaşırken her ne kadar yorulsam ve zaman kaybetsem de, yine de ben kârlı çıkıyorum diye düşünüyorum. Çünkü o gerçek değil. Ben ve benim ilerlemem ise gerçek. Sanırım çok gereksiz detaylara boğuldum. İnsan işte. Beyni gelişmiş sıradan bir canlı.
94. Gün
Bugün kaldığım yerden devam ettim. Ürün arama ve inceleme, ürünü sepete ekleme kısımlarının class diyagramı bugünün konusuydu. Yarın da iki-üç tane kullanım durumu için bu diyagramları yarılamış olacağım. Çarşamba günü de raporun detaylarını (sözel kısımlarını) tamamlarım diye düşünüyorum.95. Gün
Günün başlarında kullanım senaryosunun sınıf diyagramına dönüştürülmesine bakıyordum. Sonrasında sürekli ve sürekli olarak nesnelerin iletişimini düşünüp dururken kendimce uçuk fikirler oluşturmaya başlamıştım. Nesneler ikili iletişim kuruyor ve bu ilişkiler metotlarla sağlanıyordu. Nesneler oluşturulurken güncel hayatla bağdaştırıldığı için (ayazılımda değil tabii ki), düşündüm ki neden bir nesne ona başka bir nesnenin temas etmesine ihtiyaç duyuyor mesajlaşma için? Bugün sinema salonunda fragmanı geçen bir filmde “Aradığın,seni arayandır” (tasavvufu örnek almamak lazım bu konuda belki ama aklıma gelince eklemek istedim) diye bir söz geçmişti. Benim bir nesneyi diğeriyle iletişime geçirmem için, onu araması gerekiyor. Diğer nesne ise aranmayı bekliyor. Bu biraz “zaten aranıyordu” gibi oldu ama öyle bir durum. Üçüncü bir nesne diğer nesnelerin konuşmasını dinlese ne olur diye düşündüm. Yani iki ya da daha çok nesne konuşurken onları dinleyen bir nesne. Nesneler sadece kendilerine seslenince iletişime geçiyorlar. Bana dokunmayan yılan bin yaşasın gibi. Aslında amaç da bu olabilir zaten şu anki kullanımda. Aksi durum (her şeyi duyan ve iletişime geçen nesneler) procedural yöntemde olan sanırım. Çok gereksiz hayaller kurdum bir yere varmayacak gibi hissettim. En azından hayal kurmak da önemli diye bu paragrafı sonlandırayım.Daha sonra Actor Model’e baktım. Alan Key’in Quora hesabı varmış ve oradan birçok soruya yanıt vermiş. Bunu görünce çok fazla etkilendim çünkü gözümde masallardaki kahramanlardan biri olmuştu. Actor Model’in OOP’den aslında çok da bir farkı olmadığından bahsetmiş. Aslında o ilk oluşturulan pure object oriented mantığı, sonrasında biraz daha class oriented’e döndüğü için; Actor Model’in pure OOP’ye güncel olarak kullanılan OOP’den daha çok benzediğini söylemiş. Sebebi ise mesajlaşmaya odaklanması anladığım kadarıyla. Eşzamanlılık konusundaki artısını anladım fakat pratikte görmediğim için sadece mantık olarak kavradım. Onun dışında Actor Model PHP’de de kullanılabiliyormuş sanırım. Peki neden şimdi Actor Model şu an kullanılan OOP yerine kullanılmıyor diye düşündüm. Bulduğum cevaplar vardı. Fakat tam anlamadım. Tek bağdaştırdığım nokta, şu an neden SmallTalk'un kullanılmadığı ile ilgili bir benzerlik olabilir. Tabii ki kullanılıyor bu arada, ayrık (mikroservis gibi. Sadece kavram olarak biliyorum. Detaylarını dair bir fikrim yok) sistemler için özellikle. Fakat çok yaygın olmadığını anladım.
Sonrasında self reference class’lara baktım. Bu da mümkünmüş farklı yollar kullanarak. En dikkatimi çeken özelliği ise algoritmalara bakarken karşılaştığım linked list’lere benzerliği. Tıpkı linked list’ler gibi linked object’lerde oluşturulabiliyormuş.
Bugün biraz fazla araştırmalara daldım açıkçası. Yapmam gerekeni de yaptım fakat bol bol da bu tür konuları araştırdım.
96. Gün
Bugün projedeki sözel kısımların hepsini tamamladım. Sonrasında daha önce yaptığım çalışmaları da dosyaya ekleyip tamamladım. Çok ama çok fazla eksik var farkındayım. Özellikle diyagramlar oluşturulurken resmen evrim geçirmiş gibiler. Çünkü öyle, gerçekten evrim geçirdiler. Yeni öğrendiğim şeyleri hep yeni oluşturduğum kısımlarda denemeye çalıştım. Bazı sınıfların nitelikleri yetersizdi bazıları da fazlalık içeriyor olabilirdi. Bunların üstüne yeterince düşünmeye başladığımda programlama mantığına çokça girmeye başlıyordum o yüzden biraz daha yüzeysel bıraktım.Gün sonunda İngilizceyi düşündüm. Benim de konuşma kısmında epey eksiğim var. Bunun sebebi yabancı dil konuşurken kelimeleri bulmakta sıkıntı yaşamam ve bence bu konu özelinde özgüven eksikliğim de var. Çünkü bir yabancıyla konuşurken çok rahat rahat oluyorken, bir türkle yabancı dil konuşmaktan hiç keyif almıyorum. Çünkü hep bir yanlışımı arayacakmış gibi geliyor ve bu yüzden alçakgönüllü normal bi insan değilse konuşmamayı tercih ediyorum Türkler özelinde. Neden İngilizceden bahsettim? İngilizce konuşmanın özündeki tavsiyeler, türkçe düşünmemek ve gündelik hayatta da çeviri yapmadan İngilizce konuşmaya düşünmeye çalışmak var. Bense gündelik hayatta karşıma çıkan şeylerin genelde kelime anlamlarını bilmediğim için hep bundan vazgeçiyorum genelde. Buna nasıl bir çözüm üretilebilir? Gündelik hayatta sıkça kullanılan kelimeler cümleler düşünülerek, o kelimeleri öğrenerek olabilir. Nesneler arası haberleşmede diyagramlar oluşturuluyordu. Bunun için de diyagram oluşturabileceğimi varsaydım. Ben makineye cümleyi türkçe söyleyeceğim. O ingilizce karşılığını bana verecek. Mesela Cortana veya Siri ile bir dilde konuşuluyor evet. Peki ya makine benim cümleme ingilizce karşılık verseydi? O kelimeleri özellikle bana belirterek ve beni konuşturmaya çalışsaydı. Bir nevi makine İngilizce öğretmenim olurdu. Elsa’daki gibi yanlış telaffuzlarımı bana istatistik olarak sunabilirdi. Konuşmalarımızı metin şeklinde bana iletebilirdi. Dilersem okuyabilirdim. Burda biraz farklı teknolojilerden bahsettim. Hepsi tek bir noktada olmalı gibi. Belki böyle bir şey vardır da haberim yoktur. Kısacası İngilizce düşünüp konuşmaya yardım edebilecek bir uygulama düşündüm sadece. Çeviri kısmını translate ile ilgili bir API ile sağlayabilirdi. Fakat onun bana sorması gibi konularda yapay zeka devreye girerdi ki bu konuyu hiç bilmiyorum. Yine de üstüne düşünebileceğim bir konu gibi geldi.
97. Gün
Bugün ortaya karışık bir gündü. Mozilla Developer Network’te bol bol ilgimi çeken konuları okudum. Bir nevi tekrar yaptım aslında. Sonrasında Web sayafası yayınlamak ile ilgili yine MDN’de gördüğüm bir yazıda Github’ta static web sayfası oluşturmaktan bahsedilmiş. Bunu görünce biraz araştırayım dedim. Medium’daki bir yazıdan bu sayfaya Firebase API’si kullanarak veritabanı sağlanabileceğini öğrendim. Statik sitede sadece Javascript, HTML, ve CSS var normalde. Javascript’I kullanarak kullanıcıdan aldığım bilgiyi veritabanına çekmeye çalışacağım API yardımı ile. Ama henüz tamamlayamadım. Yarın boşluk olursa bakacağım. Eğer yapabilirsem burası arka bahçem ya da garajım olabilir diye düşünüyorum. En azından API nasıl kullanılır, NoSql veritabanına veriler nasıl gelir ve nasıl işlem yapılır, GIT nedir ve nasıl kullanılır, Github’ta proje oluşturmak ve GIT ya da Github Desktop ile projesi anlık olarak güncelleyebilmek gibi konuları öğrenmiş olurum diyorum. Haftasonu buna bakmayı düşünüyorum boş olduğum zamanlarda. Bugün biraz GIT’e baktım ama yabancısı olduğum için karışık geldi başlangıçta. O yüzden Github Desktop başlangıç için çok basit olduğundan onu kullandım proje güncellemeyi basitleştirmek için. Ama GIT’i de çözeceğim. Aslında Firebase ile hem mobil uygulama geliştirmede hem hosting de hem veritabanı kısmında çözümler varmış fakat şimdilik veritabanı kısmını çözmek istiyorum. Birinci not: GIT ve Github Desktop'ı kendi bilgisayarıma kurdum. Kurulmasa da olurdu fakat öğrenmek amaçlı. İkinci not: Heroku diye bir site daha Firebase'in yaptığının benzerini yapıyor fakat bazı sorunlara sebep olabiliyormuş: Cors Doc on Mozilla Deev. O yüzden hiç bakmadım diyebilirim. Üçüncü not: Bugün Libra ( Yeni ismiyle Diem) ve SDR nedir diye ufak bir araştırma da yaptım. Paranın birkaç farklı paraya sabitlenmesi ve enflasyondan etkilenmemesi gibi konulara bakarken karşılaştım. Konu hakkında bolca stabil coin kavramı da geçiyordu. Fakat henüz konuya vakıf değilim. Tekrar bakacağım. Bu da hem insanlık hem de benim için küçük bir adım: Its not here. But my first attempt to publish a static website :)
98. Gün
Biraz daha erken döneceğimizi düşünüp akşama bırakmıştım raporu. Ama geç vakte kaldı. Dün baktığım konular üstünden gittim bugün. Github Pages’te dinamik web sayfası oluşturmak anladığım kadarıyla backend bir servis olmadan yapılabildiği için onun üstüne çalışmak gereksiz geldi. Hâli hazırda static bir web sayfasını yapmak gibi bir amacım olmadığı için o konudan vazgeçtim. Sonrasında yine OOP ile ilgili konulara baktım biraz daha. Bir şeyi ya bilmiyordum ya da sonradan tekrar keşfettim: Javascript’te conctructor fonksiyonlar varmış. Sınıf dışında bir fonksiyonun constructor olarak tanımlanmasını daha önce görüp görmediğimi hatırlamasam da yeni öğrenmiş hissediyorum.Bugün de yine bol bol yazılımla ilgili konular hakkında araştırmalar üzerine geçti diyebilirim.
99. Gün
Bugün sonuç odaklı olmak yerine yol odaklıydım. Nereye varacağım değil, varışa giderken aşılan yollardı belki önemli olan... Evet edebi ve felsefi konuşmaktan çok teknik olmalıyım.Daha önce üstüne çalıştığımız tasarım desenleri ve SOLID ile bugün verilen görevi bağdaştırmaya çalıştım. Ona göre ortaya bir şeyler çıkarmak istedim. Başardım mı? Hayır. Ama deniyorum, deneyeceğim. Gerçekten de okurken olduğu kadar kolay değil onu farkettim tekrar. Bir şey üretmek zor olduğu kadar da keyifli. Evet bir sınıf diyagramı oluşturuyorum fakat aralarındaki bağlantılar o kadar eksik ki kendim de farkındayım. Örneğin giriş ve çıkış parametreleri hangi tipten olacak bunu henüz yazmadım. Sınıfların birbirleri arasındaki iletişimi ve ilişkiyi elimden geldiğince öğrendiklerim gibi yapmaya çalışsam da, kod yazarken o sınıf diyagramına ne kadar benzeyeceğini henüz bilmiyorum. Her ne olursa olsun başaracağım. En azından deneyeceğim.
A game story generator (ludo.ai) beni oldukça fazla etkiledi. Mobil oyunlarda beni tek cezbedebilen konular strateji oyunları. Bu yüzden tema olarak stratejiyi seçmiştim. Osmanlı ve dönemindeki devletlerin deniz savaşlarından esinlenen bir oyun neden olmasın diye düşündüm. Ve uygulamanın verdiği fikirlere şaşırdım. Olabilecek düşmanlarımı, ittifaklarımı, savaşılacak bölgeleri (Akdeniz, İstanbul eksenli, Kuzey Afrika kıyıları gibi), hangi dönemlerde oyunun geçebileceğini (ikinci dünya savaşı sonrası modern Türkiye'si bile dahildi mesela), zorluk seviyelerini, karaya yakın bölgelerden savaş gemisine veya uçak gemisinden karaya yapılabilecek saldırıları hikayelendirdi. Yapay zeka körebe oynuyordu sanki. Gözleri bağlıydı ve sadece onu "sıcak soğuk" diye yönlendirdim. Bir sorun vardı fakat. O sadece daha önce yapılmış ve yayınlanmış oyunlardan feyz alıyordu sanırım. Çünkü şöyle bir senaryo geliştirmek istedim fakat hep tam tersi argümanları önerdi. Oluşturmak istediğim senaryo: "Peki ya Adolf Hitler Kazansaydı?". Bunun oyununu oynamak ya da kurgusunu okumak-izlemek bana haz verebilirdi örneğin. Ama uygulama çoğu oyunda olduğu gibi Almanya'ya kaybettirme çabasında olduğundan o konuda başlangıçta kaldım.
En sevdiğim özelliği insanın yaratıcı yönünü açığa çıkarıyor. Sana fikirler veriyor başlangıç olarak ve sen onun üstünden farklı kurgular yaratabiliyorsun. Biraz oyun yapımından bağımsız olsa da AI hakkında daha çok düşünmeme sebep oldu. Eğer bu senaryoları bir uygulama oluşturabiliyorsa, neden AI bir şekilde şiir yazamasın diye düşündüm? Çünkü ciddi ciddi var olan senaryoları kullanarak ortaya karışık bir ürün çıkarabiliyor. Bizi kurguladığı hikayeleriyle manipüle edebilir düşününce. Ki bunu dating app'lerle de kanıtlamışlardı karşı cins bir insan olabileceğine dair. Düşünmesi o kadar keyifli ki insana ve aklına hayran kalıyorum. Primitif akrabalarımızın el aletleri kullanarak yiyecekleri parçalaması, kovanda ulaşamadığı kısımlardan çıkarması, ateşi kullanmaları, kendileri yeterince hızlı olmadığı için farklı hayvanları ulaşım ve iletişimde kullanmaları, ve o kadar çok şey var ki. Şimdi ise zekamızı bazı konularda yeterli bulmadığımız için belki de daha zeki bir şeyi bizim için kullanmak istiyoruz. Umarım varoluşsal kaygılarımın sebebi benden çok daha zeki varlıkların eylemlerinin sonucu yaşadıklarımdır diyerek sözü daha fazla uzatmamak istiyorum.100. Gün
OOP'ye bakış açım zamanla gelişim gösterdi onu farkettim. Birçok hatam hâlâ bulunmakta fakat iyiki o okumaları yapmışız diyorum çünkü sindirmek için pratikte üzerine düşünmek, üretmek, gerekirse yorulmak, acı çekmek varmış.İlk nesne yönelimli programlamanın ne olduğuna baktığımız zamanı hatırlıyorum. Ürünler ve içerdiği kategorilerle ilgili bizden bir şeyler beklemiştiniz. Kategorilerin ve ürünlerin birbirleriyle alakalı olduğu OOP'ye dayalı bir yapı kurmamızdı istenen. O sıralar henüz interface'i öğrendiğim için her yerde interface kullandığımı hatırlıyorum. Ek olarak da sadece inheritance vardı. Ve sonrasında SOLID çalışırken o çalışmada yaptığım bir hata aklıma kazınmıştı: "Interface Segregation Principle". Bir interface'i implement eden nesnenin, onun metodlarını kullanması gerektiği ile ilgiliydi. Inheritance içinde dallanıp budaklanmalar olunca bazı nesneler kullanmayacağı metodları implement etmek zorunda kalıyordu. Ve SOLID'de en hızlı anladığımı düşündüğüm kural ISP olmuştu o yüzden.
Interface'in nasıl yanlış kullanıldığını öğrenmiştim. Sonrasında nesneler arası ilişkideki isimlendirmeleri duymuştum: "Association, aggregation, composition, dependency" gibi. "part-whole" kavramı geçiyordu ama hiç anlamıyor ve üstünü örtüyordum. Ve farklı kavramlarla anlatılan yerlerden öğrendiğimi düşünüyordum. Ki gerçekten öğrendiğimi hissetmiştim. Sonrasında tasarım desenlerini çalıştım. 1 haftada tasarım desenlerini öğrenmek, 1 günde regex'i öğrenmek gibiydi. Okuyunca, örneklerine bakınca anladığımı düşünüyordum fakat pratikte karşılaşıp özümsemediğim için unuttuğumu hissediyordum. Ama regex gibi değil yakın gelecekte en azından birkaç tanesini iyi şekilde kavramış olmam gerekiyor.
1 hafta önce acı çekmiştim. Rapor, planlama gibi konular zorlamıştı. Acı çekmek lazımdı.
Dün kurduğum yapıda (kayıt ve giriş) çokça yerde aggregation ilişkisi vardı. Bu kadar da olmamalı diyerek yanlış olduğunu düşünmüştüm.
Bugün ise kullanıcı bilgilerini görmek ve güncellemek üzerine olan yapıda abstract class, interface, aggregation, association, composition ilişkilerini kurdum. Bunları kurmak zorunda olduğum içn değil, ihtiyaçlar o yöne ittiği için kurmuştum. Belki tamamen yanlış da olabilir mantığım fakat biraz daha anladığımı düşünüyorum. Her gün farklı açılardan bakarak biraz daha iyileştiğini hissedebiliyorum nesneler arası ilişkiye bakış açımın.