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

12 dk okuma

81. Gün

İlk defa kendi açımdan responsive’liğe uyduğunu düşündüğüm bir tasarıma yaklaştım. Konu CSS olunca biraz sihir gibi hissetmiyor değilim, her ne kadar kurallara uyulduğu sürece istenilen çıktıları vereceğini bilsem de. Bugün toplantıda konuştuğumuz konular tekrar bazı konuları düşünmeme ve farklı açılardan bazı problemleri düşünmeme katkı sağladı. Ve gerçekten zamanın o esnada nasıl geçtiğini ve ne kadar zaman geçtiğini farketmemiştim. Gün sonuna doğru farklı farklı CSS örneklerine baktım tekrar. Mesela SCSS’in CSS’e çeviren online formatter’larda varmış bunu bilmiyordum. Codepen’deki birçok güzel tasarımda SCSS kullanılıyordu ama onları direkt es geçiyordum kullanmayıp ve dikkatle incelemeyip. Artık onun da bir kısayolunu öğrenmiş oldum eğer işime yarayacaksa. Bugün genel olarak tasarımı güzelleştirmeye çalışmak ve arta kalan zamanlarda benzer konuları, örnekleri araştırmakla geçti.

82. Gün

Bugün de CSS ile geçti. Daha çok, farklı neler yapabileceğim üzerine düşündüm. Farklı tasarımlarda güzel görünen kısımları kendim de uygulamak istedim bazen ama o güzel görünümü sağlayamadım. Birinci tasarımda elimden geldiğince özgün (örnekleri birçok yerde olan uygulamalar tabii ki ama bütün olarak bakınca böyle görünebilir) ve sade bir içerik üretmeye çalıştım. İkinci tasarım hâlâ daha gün sonuna doğru şu aşamada kaldı: “Deftere eskizlerini çizme aşaması”. Amaç sadece hızlı olmak olsa üstüne çok az düşünüp bir şeyler çıkarıbilir. Amaç mükemmel bir görünüm çıkarmak olsa uzun zaman sürer fakat oldukça iyi bir tasarım oluşturulabilir. Ama amaç aradaki dengeyi koruyabilmekte sanırım. Yani zaman ve kalitenin trade-off’unu doğal bir şekilde oturtabilmek kafada şu an. Ve bizden ikinci kez tasarım istemenizi iki şeye bağlıyorum: Daha iyisini yapmamızı istemeniz ya da farklı açılardan bakmanızı istemeniz. Ben de her iki vardığım sonuca göre bir şeyler çıkarmak istiyorum.

Mesai saatleri sonrasında iki şey yaptım: Ülke ekonomisini, gündemini, insanların konuştukları konuları görüp moralimi bozdum. Sonra da algoritma kitabında kaldığım yerden okumaya devam ettim. Henüz kitabın en başlarındayım. Yüzyıllar önce Arapların ve sonrasında Rusların geliştirdiği çarpma algoritmalarını gördüm. Yarın da Karatsuba’nın çarpma algoritması ne imiş ona bakacağım akşam. Bu hafta kitabın giriş kısmındaki basit algoritmaları bitirmek amacım. Hızlıca biterse ikinci bölüme devam edeceğim (Bence geçerim ve ilerlemeye devam ederim). İlginç bir şey farkettim: Mısırlıların sayı sisteminde, “1,10,100,1000, hatta 1 milyon” sayıları bulunuyor. Düşündüm, Mısırlıların olduğu devirde 1.000.000’u kullanacak kadar ne yapmış olabilirler diye. Elbette piramitler (mühendislik), sağlık, astronomi gibi alanlarda çok gelişmişlerdi. Hatta vergi sistemi ve askerlikle alakalı şeyler dahi olabilirdi. Ama ben 3000 yıl önce yaşasam 1 milyon sayısını hiç kullanmazdım herhalde bir çölde diyerek şaşkınlığımı düşünürken gizleyemedim. Belki de öyle bir sayıyı hiç kullanmadılar ama bizim “sonsuz ya da belirsiz” ifadelerimiz gibi bir şeydi onlar için. Gerçi bu fantastic düşüncem İskenderiye Kütüphanesindeki 900.000 civarı el yazması kitabın varlığı ile yıkılabilir gayet. O kadar çok kitaba ev sahipliği yapan; Öklid, Arşimet, Batlamyus gibi devlerin içinde çalıştığı kütüphaneyi bile kurmuşlarsa kesinlikle bir yerlerde de o sayıya ihtiyaç duyup kullanmışlardır.

Öğrendiğim algoritmaları hobi olarak sadece javascript ile programlamayı ya da işin içine görsellik katıp HTML ve CSS ile de zenginleştirebilirim. Ama bunlar ana görev değil sadece hobi amaçlı yapılabilecek şeyler olmalı.

Ülke gündemi, olumsuz “enformasyonlar” gibi bunaltıcı konuların ötesinde “hobi” gibi yaptığım (ve yapacağıma inandığım) bir işim olduğundan dolayı mutluyum.

83. Gün

Bugün kendimi biraz kötü hissettiğim için (sanırım üşüttüm) çalışırken biraz zorlandım. Kafamın içi çok dolu ve ağırmış gibi bir his gün boyu hakimdi. Gün sonunda ortaya çıkan tasarımımı beğenmedim. Evet yerine göre responsive bir tasarım oldu. Evet her şey yerli yerinde oldu fakat o kadar karışıktı ki sonuca baktığım zaman gözüm kanadı. Daha iyi nasıl hale getirebilirim onu düşünmeliyim. Açıkçası birinci tasarımın sadeliği hoşuma gittiği için bu kadar karışık birçok kutunun dip dibe olması hiç hoşuma gitmedi. Bardağa çok boş tarafından baktım sanırım fakat içimden gelen düşünceler bunlardı. Çok daha iyisi yapılabilir inanıyorum.

84. Gün

Dün yaptığım tasarıma bugün ne kattım? Parallax kullanılan fotoğrafın genişliğini azaltıp, bayi sistemi ve yayıncı sistemi aynı sayfa içinde olduğu için onlara sayfa içinde erişimi sağlayan iki tane navigator düğme ekleyip, gördüğüm eksik kısımları düzelttim. Açıkçası çok bir yenilik katamadım. O yüzden hep farklı siteleri inceleyip neler yapabilirim onu düşündüm. CSS'in bilmediğim özellikleri nelermiş onları araştırıp öğrenmeye çalıştım. Bol bol Codepen ve kaynakça niteliğindeki sitelerden tasarım konusundaki örneklere ve araştırmalara baktım.

Güneş battıktan bir süre sonra yapılanlar üzerine

Algorima kitabına tekrar baktım. Kitaptaki çarpım algoritmalarını kavradım. Karatsuba algoritması özetle 14 hane ve üstü sayıların çarpımında daha etkili çünkü işlem sayısını oldukça kısaltıyor. Ama daha az hanesi bulunan sayılar için elverişli değil. Sonrasında bilgisayar çarpma işlemi için hangi algoritmaları kullanıyor diye baktım fakat mikroişlemcilerin kullandığı Booth’un algoritmasını öğrenmek biraz vaktimi alabilir diye sadece göz gezdirdim. Detaylara ve ALU gibi konulara girmedim. Öğrendiklerim biraz arttıktan sonra koda dökmeye çalışacağım. Kitapta sadece bugün eski konuları tekrar edip biraz da roma rakamları ile ilgili algoritmaların başlangıcına baktım.

Sonrasında biraz Pi sayısı üstüne biraz okumalar yaptım. Daha da yapacağım fakat tahminimce modern fizik konularına da bakmam gerekecek. Bu kendim için de faydalı olabileceğinden (spor gibi, sadece tek kas sistemini çalıştırmak yerine vücuttaki tüm kas sistemlerini dengeyle çalıştırıp hepsini güçlendirmek gibi belki) bakarım diye düşünüyorum.

Dün olan zihin yorgunluğu bugün çok şükür yoktu ve verimli geçti gibi hissettim, ürün olarak çok verimli sonuçlar olmasa da.

85. gün

Günlük rapor tutmaya başlayalı 3 ay olmuş neredeyse. Aslında bunu severek yapıyorum. Mühendislik okumak ile bir alakası olduğunu sanmıyorum fakat kendimi hep bir mecrada ifade etmeyi, anonym olarak günlük tutmayı çok severdim. Şimdi de günlük tutma kısmını teknik bir dille harmanlamaya çalışıyorum.

Bugün CSS’e baktım tabii ki. Farklı şeyler deneyebilir miyim diye düşündüm. Bazı denediklerimi beğenmeyip sildim. Bugün, dün gördüğüm en büyük iki soruna (firma fotoğrafları ve websitemiz hakkındaki metin içeriği) çözüm üretmeye çalıştım genel olarak.

86. Gün

Bugün biraz karışık ilerledim. Sabah sadece algoritma kitabına baktım. Veri yapıları kısmına kadar geldim. Sonrasında sizin görev için düşünmeye başlamamızı söylemenizle çok farklı konulara girdim biraz. Scrum, agile, extreme programming gibi konularda okumalar yaptım. Günün sonlarına doğru OOP ve e-ticaret sitesi oluşturmakla ilgili farklı kaynaklar buldum. Yarın sabah ilk işim onlara bakıp farklı fikirler edinmek olacak.

Bugün biraz ateşimin çıktığını hissettim ve çok kırgındı vücudum o yüzden pek verim alamadım. Acilen kendimi toplamam gerekiyor. Sabah erken uyanabilirsem eczaneden C vitamini olan bir şey alabilirim (ne kadar çok işe yaramayacağını bilsem de).

87. Gün

Sitede neler olması gerektiği üstüne kullanıcı, site admini, ve satıcı gözünden hikayeler oluşturup gerekli modülleri ve alt sınıfları, metodları belirlemeyi düşünüyordum. Toplantı sonrası ise sadece bize telefon satmak için e-ticaret sitesi kurmak isteyen bir müşteri ile iletişim, onun benimle iş yapması için ikna edebilmem, işin detaylandırılması, projenin fiyatlandırılması ve süresi gibi konularda nasıl bir yol izleyeceğim, nasıl bir rapor oluşturacağım onu düşündüm. Bol bol araştırdım. Tam istenilen yapıyı bulamadım açıkçası. Ama bana yardımcı olabileceğini düşündüğüm yapılar buldum. Onlar üstünden giderek pazartesi günü raporu istenen şekilde teslim etmeye çalışacağım.

88. Gün

Bugün müşteriyle iletişimimin ve bilgi alışverişinin en temelini inceleyip, buna göre bir doküman hazırlamaya çalıştım. Benden bir websitesi tasarlamamı isteyen bir müşteriden hangi bilgileri temel seviyede almam gerektiğini öğrendim. Bir web sitesi hazırlanırken sunulan seçeneklerin ne olduğunu gördüm. Fiyatlara ve süreye sadece tahminle ulaşabildim. İnternette hazır paketlerle sunulan website tasarımları ve “iş yaptırmanın” bedelleri her ne kadar olsa da spesifik bir iş için ne kadar ücret alınır bunu tam bilmiyordum. Süre olarak çeşitli zaman aralıklarını görmüş olsam da genelde 4-16 hafta arasında biteceği söyleniyordu bulduğum farklı kaynaklarda. Bu tamamen gelecek olan iş ve yapacak ekip ile alakalıydı. Yarın tam olarak ne yapacağımı tam olarak bilmiyorum fakat Cuma günü üzerine çalıştığım konu ilerideydi ve yarın ona bakabilirim diye düşünüyorum. İlk işi teslim alma aşamasından sonra (eğer alabildiysem) sistemi tasarlama aşamasına yaklaşıyorum gibi hissediyorum.

Akşam olduğunda Algoritmalar kitabını kaldığım yerden okumaya devam ettim. Özyinelemeler konusuna geldim. Temellerin anlatıldığı bölümü bu hafta bitirebileceğimi düşünüyorum. Temel olarak veri yapılarından kısaca bahsedildi ve bahsedildiği kadarıyla anladım. Özyinelemelerden sonra rastgele sayı üretme algoritmaları karşıma çıkacak. Bu hafta tamamlamam gerektiğini kendime şart koştum. Üstüne de kendim problemleri tekrar ele almaya çalışacağım 2. bölüm tamamlanınca. Hem gün içi görevleri, hem de bunu halledebilirim diye düşünüyorum.

89. Gün

Bugün tamamen araştırma, yapılan örnekleri inceleme, ve kendi raporum için oluşturacağım outline’ı düşünmekle geçti. Evet elde somut bir sonuç şu an yok ama birçok örneği inceleme fırsatım oldu. Ve bu yüzden geçen zamanın değersizleştirildiğini düşünmüyorum. Buna da ihtiyaç olduğunu düşünüyorum. Yarın somut olarak bazı çıktıları ele almaya başlayacağım. Verilen süre içerisinde tamamlayacağıma inanıyorum görebildiğim her ayrıntıyı raporuma ekleyerek.

90. Gün

Neden Agile?

Waterfall modelinin sorunu, problemi ele alış ve çözüm biçiminde. Neydi bu?
  • Tüm gereksinimler müşteriden toplanır.
  • Bir ekip bu gereksinimleri ve dokümanları analiz eder ve dizayn ekibi için spesifikasyonları, özellikleri hazırlar.
  • Dizayn ekibi bu spesifikasyonları kullanarak dizaynlarını gerçekleştirirler ve ve uygulamaları için yazılım geliştirme ekibine verirler. Geliştiriciler de bu dizayna göre kodlarını yazıp son halini test ekibine gönderirler ve işlem tamamlanır. Ürün müşteriye teslim edilir.
İstatistiklerin genel olarak söylediği şey de, waterfall modeliyle çıkarılan işin genel olarak müşteri tarafından kabul edilmediği ya da beğenilmediğidir. Ve müşteri her zaman haklıdır bilindiği üzere.Bu yüzden projeye verilen tüm emek, zaman, para boşa gitmiş olur böyle bir sonuçla karşılaşılırsa.

Bu soruna başka bir felsefi yaklaşım daha vardır: yinelemeli ve evrimsel (iterative and evolutionary) geliştirme. Scrum, XP, Rational Unified Process bu felsefi yaklaşımla yazılım geliştirmeye örnektir. Agile development process olarak da geçerler.

Yinelemeli (iterative) geliştirme kavramı basittir.Yazılım geliştirme, yineleme (iteration) adı verilen bir dizi küçük proje halinde düzenlenir. Her yinelemenin kendi analizi, tasarımı, uygulaması, ve testi vardır. Her yinelemenin (iteration) sonunda müşteri girdisi alınır. Yani müşteriye de o iterasyon izah edilerek dönüşü sağlanır. Eğer müşteri beğenmediyse ya da kabul etmediyse o iterasyonu, sadece o kısım tekrar düzeltilir. Bu sayede waterfall modeline kıyasla çok daha az kayıpla süreç tamamlanabilir.

Kısacası Agile geliştirme yöntemlerinin varoluş sebebi, kutsal dinlerin (kutsal olmayanlar ne diyor pek bilmesem de) de söylediği gibi "israfı en aza indirgemek"tir.

Bunları yazma sebebim: hem benim için notlarıma geri döndüğümde elimde kısa ve öz olarak anlayabileceğim bilgilerin olması hem de başlamış olduğumuz çalışmanın özündeki mihenk taşlarından biri olması.

Benim yazılım geliştirmeden anladığım şuydu: Her şeyi en baştan kusursuz bir şekilde tasarlayacağım. Sonrasında kodlayıp bu mükemmelliği izleyeceğim.

Oysa bu iterasyonlu modelde bahsedilen bu değildi: Tasarımımı değiştirmem gerekebilir. Başta kusursuz gibi görünen analizim ve dizaynım berbatsa bunu düzeltebilmeliyim. Sil baştan her şeye başlamamalıyım. Ve dedikleri gibi kusursuz bir tasarım sadece bir efsanedir belki. Ki öyleymiş.

Bilgiler edindiğim kaynaklarda ayrıca şunlara ulaştım: Başlangıçta tüm gereksinimler için tasarım yapılmamalı. Üzerinde çalışılan yineleme için ayrıntılı bir tasarım yapılmalıdır. Büyük resme bakmadan küçük detayları bu şekilde tasarlamak şu aşamada bana pek mantıklı gelmedi ama bu bakış açısını da beynimde bir yerlere kazımaya çalışacağım. Ama onların dediklerine de katılıyorum: "Tasarladığınız her şey mükemmel değildir ve projenin yaşam döngüsü boyunca değişecek veya gelişecektir."

Şimdi neden Agile bir yöntem kullanılması gerektiği anlaşıldı. Peki neden nesne yönelimli analiz, dizayn, ve programlama kullanılıyor ve kullanacağız?

Neden Object Oriented?

Yapacağımız projeye, programlama diline çok hakim olabiliriz. Gerçekten de çalışan ve müşterinin beğeneceği bir ürün de çıkarabiliriz nesne yönelimli programlama olmadan. Ama kodun küçük bir bölümden yapılacak ufak bir değişimle her şey çok zorlaşabilir ve ürünün sürdürülebilirliği kaybolur. Nesne yönelimli dizayn ve programlamada bize sunulan "modülerlik"tir. Modülerlik bize kodu güncellemede, okumakta büyük kolaylık sağlar.

Nasıl Bir Analiz ve Dizayn?

Nesne yönelimli analizde ilk adım müşteriyi dinlemek. Müşterinin problemlerini dinlemeliyiz ki çözüm üretebilelim. Bir iteration da bir veya iki kullanıcı hikayesi ele alınmalı. Tüm hikayenin yüzde 10'undan fazlasını tek bir iteration da ele almamamız tavsiye edilir genelde. Sebebi Agile'ın varoluşuna aykırılığı içermesi aslında.

Müşteri hikayesini dinledikten sonraki adım, bu hikaye ile domain model'i dizayn etmektir. Bunun basit bir yolu şu: kullanıcı hikayesini dinle ve isimlerin altını çiz. Bu isimler, gelecekteki potansiyel sınıflarımızı gösterir ve domain model'e eklenir. Domain model' de basitçe sınıfların isimleri ve attribute'leri (nitelikleri) tanımlanır. Sınıfların davranışları (behavior'ları) domain model' e dahil değildir.

Bu kısmın özeti:

  1. Müşteri/kullanıcı hikayesini dinle.
  2. Domain model'i tasarla.
Yani analizin amacı, müşteri/kullanıcı hikayesinden domain class'ları elde etmek; dizaynın amacı ise kullanıcı hikayesine dayanan domain model'deki objeler arasındaki ilişkiyi kurmaktır. Dizayna ek olarak, nesne yönelimli programlama için oluşturulmuş bazı prensipler (SOLID gibi) ve tasarım kalıpları (Gang of Four'un yazdığı) bulunur. Bunları da sınıflarımızı oluştururken göz önünde bulundurmalıyız.

Nesne yönelimli analizin 3 aşaması:

  1. Sınıf isimlerini tanımla
  2. Sınıf niteliklerini (attributes) tanımla
  3. Sınıflar arası ilişkiyi (association) tanımla

Nesne yönelimli dizaynın 3 aşaması:

  1. Her senaryo için sequence diyagramı oluştur
  2. Sınıf diyagramı dizaynını oluştur
  3. Tasarım kalıplarını ve SOLID (bunu öğrendiğim için, yoksa farklı prensiplerden de faydalanılabilir) prensiplerini uygula
Pazartesi sabah son teslimi olan görevi 4 parçaya ayırdım:
  1. Use case'leri belirle, kullanıcı/müşteri hikayesine göre
  2. Domain model'i oluştur
  3. Interactions(sequence) diyagramlarını oluştur
  4. Sınıf diyagramlarını oluştur
Bugün birinci aşamadaydım. Aklıma gelen her kullanım durumunu kullanıcı ve admin için oluşturmaya çalıştım. Bazı yerlerde üçüncü bir aktör olarak sisteme de ihtiyaç duydum. Bazı kullanım durumları çok temelken, bazıları çok daha spesifikti. Benim bu birkaç günde öğrendiğim en büyük şey "modülerliği sağlamanın ve nesneler arası ilişkileri iyi bir şekilde oluşturmanın en temel amaçlar olduğunu öğrenmek ya da bu bilgileri tekrar etmek" oldu. Sadece aklıma 1 günde gelen kullanım durumlarını not aldım ve bunlar bile bir hâyli fazlayken aralarındaki ilişkileri nasıl düzenleyeceğim henüz bilmiyorum. Ama yarın her kullanım durumuna göre domain model'ler oluşturmaya çalışacağım. Birbiriyle bağlantılı kısımlarda neye göre modüller veya "modüler bir yapı" oluşturacağımı henüz hiç bilmiyorum. Bilindiği üzere de asıl problem ve çözmem gereken de bu. Tek istediğim yarın oldukça çok ilerleme kaydetmek yoksa proje teslim tarihine kadar zorlanacağımı hissettim.

Biraz daha işin kitabını okuyup, sonrasında uyuyacağım.