Dil öğrenme (Programlama dili)

Bir programlama dilini neden öğrenmek isterim? Bunun çeşitli cevapları var tabii ki. Örneğin çalıştığım projede kullanılan bir dil olabilir ve bu nedenle o dili öğrenmem gerekiyordur. İleride bu dil işime yarayabilir diye düşünüyor olabilirim. Aklımdaki projelere uygun araçlar olduğu için öğrenmek isteyebilirim. Belki de sadece yeni bir şey öğrenmek için.

Programlama dili öğrenmek için kullandığım üç temel yöntem var:

  1. Programlama dilini bilgisayarıma kurup dil ile ilgili dökümanları ya da bir kitabı sırayla okuyup denemek.
  2. İlgilendiğim bir alanda bir proje seçmek ve o projeyi öğrenmek istediğim dil ile programlamak.
  3. Hackerrank gibi sitelerdeki soruları çözmek.

Birinci yöntemde vurgulamak istediğim nokta dökümanlar ya da kitaplar değil tabii ki. Bu kaynaklara her yöntemde ihtiyacım var. Yöntemlerdeki farklar öğrenme yolculuğunda kullandığım araçlar değil de daha çok bu sırada izlediğim rotalar.

İlk programlama dillerimi kitaplardan öğrendim. Üniversitede öğrendiğim dilleri de bu yöntem altında değerlendiriyorum. Kaynaklar yardımıyla bir dili öğrenmek ve bu bilgileri denemek o dilin inceliklerini öğrenmek için iyi bir yöntem olabilir. En azından bu şekilde büyük olasılıkla dili doğru kaynaklardan, dilin hangi fikirlere önem verdiğini de anlayarak doğru şekilde öğrenebiliriz.

Birkaç dil öğrendikten sonra bu yöntem bana verimsiz gelmeye başladı. Verimsizliği biraz açıklamam lazım tabii. Örneğin her dilde ilk kısımlar, değişkenler, döngüler, fonksiyonlar gibi aynı kavramlar üzerine oluyor. Bu kadar tekrar hoşuma gitmemeye başladı haliyle. Oraları hızla geçince de başka bir sorunla karşı karşıya kaldım. Kavramlar ne kadar aynı olsa da buralarda kullanılan isimler farklı olabiliyor. Bir dilin değişken dediğine diğeri değer ya da nesne diyebiliyor. İlerdeki konularda bu kavramlarla karşılaşınca nasıl olsa biliyorum bunları diye hızla geçtiğimde bir süre sonra bazı çelişkilerle karşılaştığım oldu. Çelişkilerin nedeni tabii ki o sıkıcı ilk üniteleri atladığımdan kavramların tanımlarının kafamdaki tanımlardan farklı olduğunu fark edememiştim.

Demek ki yeni bir dili kaynaklardan öğrenmek için de yine kaynaklardaki sırayı takip etmem gerekiyordu. Tabii ki her istasyonda aynı süre duraklamama gerek yoktu ama yol haritası hemen hemen tamamen benim kontrolüm dışındaydı.

Eğer bir dili o an çok iyi öğrenmeme gerek yoksa ama ilerisi için yatırım yapmak istiyorsam o zaman elimdeki bazı projeleri o dilde yapmayı deniyorum. Bu projeler kişisel, hobi projeleri olabildiği gibi şirket içinde de olabiliyor. Bu şekilde dili öğrenme yolculuğunu gerçek bir hikayenin üzerine oturtmuş oluyorum ve motivasyon açısından da faydalı oluyor ama profesyönel işlerde biraz dikkatli olmak gerekiyor. Örneğin yöneticilere ya da arkadaşlara o proje için neden o dili seçtiğimi açıklamam gerekebiliyor. Kişisel projelerde böyle bir sorun yok ama. İşin geri kalan kısmında yine kaynakları okumam gerekiyor ama bu sefer kendimi motive etmem daha kolay oluyor. Belli bir hedefim var ve yarım yamalak da olsa dil öğrenmenin getirisini hemen alıyorum.

Üçüncü yöntemi, hackerrank ve benzeri siteleri yeni yeni kullanmaya başladım. Bunu da daha çok bildiğim dilleri unutmamak ya da yeni özelliklerini deneyerek öğrenmek için yapıyorum. Bu şekilde bir dil gerçekten öğrenilemez sanırım ama boş zamanlarda kısa antrenmanlar için iyi olabilir.

Bu kullandığım yöntemlerin doğru kombinlendiği zaman iyi sonuçlar vereceğine inanıyorum. İlk diller bence birinci yöntemle daha iyi öğrenilebilir, çünkü hiçbir dil bilmeden bir projeyi, hobi projesi bile olsa yapmaya kalkmak bu sırada verilecek bir sürü yanlış karar yüzünden hem zorlaştırır hem de dile karşı yalancı bir güvensizlik yaratabilir. Bir dili ve program geliştirmeyi iyi öğrendikten sonra yeni dillerde ikinci yöntem daha iyi sonuç verebilir. Bu sırada hem bir projenin başarılı olmasına şahit olmanın heyecanı da öğrenmeyi destekleyici bir etki yapabilir. Son olarak da eski bilgileri unutmamak için üçüncü yöntem kullanılabilir.

ChatGPT ile deneyler

Bilim tarihiyle azıcık ilgilenen herkes deney tasarlamanın ne kadar zor olduğunu bilir. Bundan daha da zor olanı bu deneyin sonuçlarını yorumlamak olabilir.

Benim de herkes gibi kafamda bir ChatGPT tasviri var. Internetteki bilgileri bir şekilde harmanlamış ve bunları iyi cümlelerle paketleyip sunan bir yardımcı. Yalnız kendisiyle yazışırken arada kendimi onunla tartışırken bulduğum da çok oldu. Demek ki içten içe onu düşünen bir varlık olarak da hayal etmek istiyorum. Öyle olmadığını bilsem de. Düşünmenin tanımı ya da sınırları bizim için de çok zor olmalı ama, bu durumda hiç düşünemiyor da diyemem heralde.

Bugün şirketteki işlerim biraz iyi gidince dinlenmek için onunla bir deney yapayım dedim. Standard sorulara çok iyi cevaplar verdiğini biliyordum. Daha geçenlerde yazdığım bir oyun programı için bir algoritma sormuştum ve önerdiği şeyi programlayıp çalıştırınca istediğim gibi çalıştığını görmüştüm. Sorduğum şey de standard bir algoritmaydı ama bu durumda iyi bir yardımcı olduğunu inkar edemem şimdi.

Deney için bilinen bir bilmeceyi aldım ve parametreleri biraz değiştirdim. Böylece sorunun şekli ve çözüm algoritması dışında tam bu sorunun çözümüyle eğitilmiş olamayacaktı. Acaba bu çözüm yolunu bu yeni parametrelere uydurabilecek miydi? Ya da en azından deneyecek miydi?

Şimdi yazışmamıza bir bakalım:

Sorduğum soruyu doğru anladığını düşünüyorum. Yani anlamaktan kastım, kurallarını çözdü ve eğitildiği verilerdeki bazı yöntemlerle benzerlikler bulabildi. Kullandığı algoritmanın sonuçlarını yanlış buldu ama. Bunun çok değişik nedenleri olabilir. Mesela soruyu çözmekten çok giriş, gelişme ve sonuç kısımları olan kısa bir yazı yazma eğilimi olması nedeniyle hemen ilk bir iki sonucu genellemiş olabilir.

Burada ikili arama yöntemini kullanarak bir sonuç buluyor ama tabii ki soruda istenen en iyi çözüm değil bu. Bunu da aramıyor. Yine de bu çözüm denemesi hiç de fena değildi. Çözümleri sonuna kadar getirmediğinden yaptığı çıkarımlar da haliyle hatalı oluyor. Bunun nedenlerini bilemiyorum ama.

Buradaki cevabın ilk paragrafında soruyu çözdü heralde dedim. Cevap doğruydu, ilk adım da doğru ama ondan sonra mantığı uygulamayı beceremedi. Becerememekten de öte, sonraki adımlarda iyice saçmalamaya başladı. Acaba soruyla ilgili bazı şeyleri yanlış mı anladı, yoksa göz ardı etmeye mi başladı bilemiyorum ama beklediğim çözümden birden uzaklaşmaya başladık.

Neyse ki, adımları tek tek deneyince daha iyi bir sonuç bulabildik.

Bu sefer bir önceki çözümde kullandığı yöntemlerin birini (katların artırma kuralını) genellerken diğerini (başlangıç katının önemi) tamamen unuttu. Bunun yanında problemi de iyice unuttu. Birden binaya yeni katlar eklemeye başladı. Binanın kat sayısını hatırlattığımda ise diğer yöntemleri de iyice unuttu ama kafasındaki çözüme uymayan sayıları güzel cümlelerle pazarlamaya kalktı.

Bu kısımda ise daha önceki kısımlarda katettiğimiz her aşamayı kaybettik gibi gözükse de çözümle ilgili bir pırıltıya dikkat çekmek istiyorum. Başlangıç katı olarak 4. katı seçti ve sonra önce 3 sonra iki kat artırdı. Bunlar yanlıs sayılar olsa da doğru çözüm için gerekli mantığa ulaştık. Tabii program bunu mantık olarak gördü mü yoksa sadece bir sürü parametreden birinin rastlantısal bir etkisi miydi bilemiyorum.

Tam belki de doğru yoldayız diye düşünüyordum ki, yine ikili arama yönteminin ününe aldanıp çözümden iyice uzaklaştı.

Son kısımda da demin dediğim şeyi onaylar gibiydi. İkili arama birçok sınırsız sayıda yumurtamız olsa en iyi arama performansını verebilir ama bu problemde sadece iki yumurtamız var. Bu tür mantık yürütmesini beklemiyordum tabii ki ama eğer biraz mantık yürütüyorsa bunu arka arkaya tekrarlayabilir belki diye umuyordum. Yanılıyormuşum. En sonunda ilginç olmayan bir şekilde insani bir tepki verdi ve soruyu çözemeyince çoğunlukla işe yarayacak bir şey önerdi. Bu tür çözümler problemden sıkılan, daha fazla arama yapmak istemeyen insanların en sık başvurduğu çözümler oluyor. Bütün parçaları tek tek bulmuş olsa da hepsini birleştirerek 6 denemelik çözümü yine de bulamadı.

Bu durumda düşünemiyor diyebilir miyim? Çok genel anlamda düşünüyor olabilir ama bizim soyutlama, genelleme yeteneğimizden tabii ki hala çok uzak. Ayrıca bu ChatGPT programının böyle bir amacı var mıydı onu bile bilmiyorum.

Bir olasılık sorusu

Bundan çok uzun yıllar önce ben üniversite sınavına hazırlanırken sorular çok daha sıradandı diye hatırlıyorum. Belki de yapabildiğim için öyle hatırlıyorumdur. Şimdi değişik sosyal medya gruplarında sorulan test sorularına bakınca seviye sanki biraz yükselmiş gibi geliyor bana ama bu sorular sınav soruları değil, çeşitli test kitaplarından alınmış sorular. Hatta aralarında yanlış sorular da oluyor.

Geçen haftalarda iki kere karşılaştığım ama bizim zamanımızda hiç sorulmayan bir olasılık sorusu türünden bahsetmek istiyorum.

Ahmet ve Ayşe akşam 7 ile 8 arasında buluşmak istiyorlar. Buluşma yerine tam kaçta gelecekleri belli değil ama her birinin 7 ile 8 arasında herhangi bir zamanda buluşma yerine gelme şansı eşit. Buluşma yerine erken gelen diğerini en fazla 15 dakika bekleyecek ve bu süre içinde diğeri gelmezse buluşma yerinden ayrılıp eve dönecek. Ahmet ve Ayşe'nin buluşma ihtimali nedir?

Bütün buluşma zamanını 60 dakikaya böleyim ve Ahmet’in buluşma yerine geliş zamanını x ekseninde, Ayşe’nin gelişini de y ekseniyle göstereyim.

x ekseni Ahmet’in gelebileceği dakikalar, y ekseni de Ayşe’nin gelebileceği dakikaları gösteriyor.

Yukarıdaki şekilde iki tane doğru çizdim. Bunlar sorunun çözümü için çok önemli denklemler, daha doğrusu eşitsizlikler. Yukarıdaki doğru y – x < 15 eşitsizliğinin sınırını oluşturan doğru. Bu eşitsizlik Ayşe’nin Ahmet’ten en fazla 15 dakika daha sonra geldiği noktaları gösteriyor ve yukarıda kalan doğrunun altındaki bütün noktaları içeriyor. Alttaki doğru da x – y < 15 eşitsizliğinin sınırı oluyor. Bu eşitsizliği sağlayan noktalar da doğrunun yukarısındaki noktalar. Bu eşitsizliğin anlamı da Ahmet’in Ayşe’den en fazla 15 dakika sonra geldiği durumlardır.

Bu iki doğru arasında kalan koyu mavi alan da Ahmet’in ve Ayşe’nin buluşma yerine en fazla 15 dakika farkla geldiği durumlardır.

Ahmet’le Ayşe’nin buluşma ihtimali böylece koyu mavi alanın bütün alana oranı şeklinde hesaplanabilir.

\(P(buluşma) = \frac{60^2 – 45^2}{60^2} = \frac{7}{16} \)

Başta da dediğim gibi bu tür sorular benim zamanımda sadece bilmece olarak soruluyordu ve sınav seviyesi için zor bir teknik olarak görülüyordu. Anlaşılan artık biraz daha standard bir soru türü olmuş.

Kısaca, bu tür sorularda aktörler için eksenler seçilip o alanda soruda aranan eşitsizlikler yazılır ve istenen alanın tüm alana oranı hesaplanır. Problemin geometrik alanlara dönüştürülmesi olasılıkta sık sık görülen yöntemlerden biridir ve sonunda bizim eğitim sisteminde de beklenen bir şey olmuş ama bunun anlaşılması için derste daha deneysel bir yaklaşım gütmek gerekebilir.

Grup teorisi diye hobi mi olurmuş?

Hobi olarak matematik öğreniyorum. Acele etmeden. İşime yarar mı diye kaygılarım olmadan. Şu an ilgilendiğim alanı ise grup teorisi. Nedir, ne değildir diye anlatmaya kalkmayacağım. Bilgisayarıma indirdiğim kitaplardan arada bir okuyorum ve kitaptaki alıştırmaları kağıt kalemle çözmeye çalışıyorum. Hafta sonu yazmaya çalıştığım Hackenbush programı iyi gidince takılıp kaldığım probleme bir daha baktım.

\(p \) bir tek asal sayı olsun. \(U(p^n) \) grubunda derecesi 2 olan tek elemanın \(p^n – 1 \) olduğunu gösterin.

Bu soruyla uzun zamandır uğraşıyordum. Uğraşıyordumdan kastım arada bir bakıp hiçbir ilerleme kaydedemiyordum. Yapabildiğim tek şey, eğer bu grupta derecesi ikinci bir eleman daha varsa, başka bir üçüncü eleman daha olmalıdır sonucuna ulaşmak olmuştu.

\(a \) ve \(b \) dereceleri 2 olan iki değişik eleman olsun dedim. O zaman \(a \cdot a = e \) ve \(b \cdot b = e \) demektir. Bu ikisi de birbirinden farklı olduğuna göre ve ikisinin de dereceleri 2 olduğuna göre birbirlerinin tersi değillerdi. Eğer biri diğerinin tersi olsa o zaman

\(a \cdot b = e \)

\(a \cdot a \cdot b = a \cdot e = a \)

\(e \cdot b = b = a \) sonucu çıkacaktır. Ama a ve b birbirlerinden farklıydı. Demek ki çarpımları da etkisiz eleman olamazdı.

Peki çarpımlarının derecesi kaç olurdu?

\(a \cdot b \cdot a \cdot b = a^2 \cdot b^2 \) çünkü grubumuz değişmeli grup.

\(a^2 \cdot b^2 = e \cdot e = e \)

Bu çarpımın etkisiz eleman olmadığını biliyordum. Demek ki çarpımın derecesi 2 imiş. Böylece bu grupta derecesi 2 olan en az üçüncü bir elemanın olacağını gösterdim ve bir aptallık yapıp burada durdum.

Neyse daha fazla ilerleme kaydedemediğimden hafta sonu matematikçi bir arkadaşımı arayıp soruyu anlattım ve bana verebileceği bir ipucu olup olmadığını sordum.

Bana ilk dediği şeylerden biri bu grupta eleman sayısı 4 olan bir alt grup bulmuşsun oldu. Benim aklıma bunun bir altgrup olup olmadığını araştırmak gelmemişti. Sonra hemen denedim tabii.

Derecesi 2 olan üçüncü sayı \(c = a \cdot b \) olsun. Bu elemanlar çarpma altında kapalı mı diye baksam yeter diye düşündüm.

\(a \cdot c = a \cdot a \cdot b = e \cdot b = b \)

\(b \cdot c = b \cdot a \cdot b = b\cdot b \cdot a = e \cdot a = a \)

Gerçekten de kapalıydılar. Yani \(e \), \(a \), \(b\) ve \(c \) elemanları ve modulo \(p^n \)’e göre çarpma işlemi bir altgruptu.

Ondan sonra bana şunu örnek olarak \(U(9) \) grubunu verdi ve bu grubun 4 elemanlı bir altgrubu olabilir mi diye sordu. Olamaz dedim. \(U(9) \) 6 elemana sahipti ve 4, 6’yı bölmez.

Peki bunu genelleyebilir misin diye sordu. Yani \(U(p^n) \) grubunun eleman sayısı dörde bölünür mü diye sordu.

Bu noktada bana yeterince fikir verdiğini düşünüp teşekkür ettim ve iyi akşamlar diledim. Hemen elime kağıt kalemi alıp \(U(p^n) \) grubunun eleman sayısını hesaplamaya başladım. Aslında bunun förmülünü daha önce bulmuştum ama yine bir kontrol ettim. Bu grubun \(p^n – p^{n-1} \) elemanı vardı.

Bunu da çarpanlara ayırdığımda \(p^{n-1} \cdot (p – 1 )\) çıkıyordu. \(p^{n-1}\) her zaman tek sayı olduğundan dörde bölünemez ama \(p \) asal sayısı \(4k + 1\) formundaysa bu grubun eleman sayısı dördün bir katı olacaktı. Gerçekten de 13, 17, 37 gibi asal sayılar için grubun eleman sayıları 12, 16 ve 36 oluyordu. Demek ki bu şekilde bir genelleme olmuyordu ve aklıma daha başka bir şey de gelmediğinden yatıp uyudum.

Sabahleyin arkadaşımı tekrar arayıp bazı asal sayılar için grup eleman sayısının dörde bölünebildiğini söyledim. Bana ilk söylediği şey, bu durumda başka bir çelişkiye ulaşacağım oldu. Bu çelişki bir türlü aklıma gelmiyordu. Sonra dedi ki, mesela \(U(37) \) grubunun 4 elemanlı cyclic olmayan bir altgrubu olabilir mi? O an her şey yerine oturdu. Ben bulduğum dört elemanlı altgrubun cyclic olup olmadığına bakmamıştım bile. Bu altgrup tabii ki cyclic değildi ama ilk başta verilen grup (\(U(p^n)\) ) cyclic idi. Cyclic bir grubun altgrupları da cyclic olmalıydı. Uğraştığım soru birden çözülmiştü.

Arkadaşımın bu kadar basit bir soruyu aklında tutmuş olmasına mı şaşırayım, yoksa bana bunu kolayca çözdürebilmesine şaşırayım bilemedim gerçekten de. Heralde bu sorular uzmanlar için üçle beşi toplamak gibi bir şeydir. Belki de her satranç ustasının çok iyi bildiği standart bir pozisyon gibidir. Böyle süper arkadaşlarım olduğu için çok şanslıyım.

Karton deyip geçmemeli

Şu sıralar grup teorisi üzerine bir matematik kitabı okuyorum. Daha en başlardayım. İlk örnekler geometrik şekillerin simetrileri ile ilgili. Yani kısaca, bir geometrik şekli bozmadan onu nasıl dönüştürebiliriz ki aynı başlangıçtaki pozisyonu alsın? Evet biliyorum, anlatmayı beceremedim. Şöyle bir örnekle tekrar deneyeyim.

Mesela elimizde bir kare var. Bu kareyi merkezi etrafında doksan derece döndürürsek yine aynı pozisyondaki bir kare elde ederiz, çünkü köşeler yine köşelerin üzerine gelir. Evet, her bir köşe bir sonrakinin üzerine gelir ama bu bizi rahatsız etmesin. Bu harekete döndürme diyelim. Peki bundan başka hangi simetrilerimiz var?

Bir kare köşegenleri çevresinde de simetrik gözükür değil mi? Yani köşegen üzerindeki köşeleri sabit tutup diğer iki köşeyi yer değiştirirsek yine bütün köşeler üstüste gelir. Bu harekete de çevirmek diyelim, yani şekli o köşegen etrafında çevirmek. Buna benzer iki simetri eksenimiz daha var ama. Onlar da karşılıklı kenarların orta noktalarını birleştiren doğrular oluyor. Karemizi bu eksenler etrafında çevirdiğimizde yine aynı kareyi elde ediyoruz.

O zaman bu iki temel işlemi yukarıdaki gibi genelce kullanabiliriz artık. Döndürme şekli bir nokta etrafında belli bir derece döndürme olsun. Çevirme de bu şekli bir doğru etrafında köşeler yine üstüste gelecek şekilde döndürmek olsun. Evet, hala aynı kelimeleri değişik şeylerde kullandığımın farkındayım ama artık nokta etrafında döndürmeye kısaca döndürme, doğru etrafında döndürmeye de çevirme diyeceğim.

Dün kitapta birkaç tane soruyla karşılaştım:

Düzgün bir çokgende (yani her kenarı aynı uzunlukta olan) arka arkaya iki kere çevirmenin neden bir döndürme olduğunu geometrik olarak açıklayınız.

Düzgün bir çokgende arka arkaya iki kere döndürmenin neden bir döndürme olduğunu geometrik olarak açıklayınız.

Düzgün bir çokgende önce döndürme ve ardından çevirmenin ya da önce çevirme ve ardından döndürmenin neden bir çevirme olduğunu geometrik olarak açıklayınız.

Geometrik şeyleri kafamda canlandırmayı pek beceremem. Kağıt kalemle de aklıma hemen bir şey gelmedi. Sonra zaten canım sıkkın, bari evde bir yerlere tıkıştırdığım malzemeleri kullanayım dedim. Kartonlardan düzgün çokgenler kesmeye başladım. Sonra bu kestiğim şekillerin köşelerini fotoğraftaki gibi numaralandırmaya başladığımda birden soruların çözümü kucağıma düştü.

Eşkenar üçgen, kare, eşkenar beşgen ve eşkenar altıgen

Fotoğrafta da görüldüğü gibi kartonların A yüzünde köşeleri saat yönünün tersinde artacak şekilde işaretlerim. Kartonun diğer yüzüne B dedim ve aynı köşeleri aynı sayılarla işaretledim. Bu durumda B yüzünde köşelerin numaraları saat yönünde artmakta.

Şimdi herhangi bir kartonu alalım ve döndürme işlemine bakalım. Örneğin B yüzü yukarıda olan eşkenar üçgen şeklini alalım. Eşkenar üçgende her bir döndürme altmış derecedir. Bu şekli hangi yönde altmış derece döndürürsek döndürelim köşe numaraları saat yönünde artıyor olacak. Aynı özellik diğer şekillerde de korunur sadece döndürme açısı farklı olacak. Karede doksan derece, eşkenar beşgende yüzsekiz derece ve düzgün altıgende de yüzyirmi derece döndürmek gerekecek.

Bir eksen etrafında çevirme işleminde ise kartonların yüzleri değişeceğinden köşelerin dizilimi de değişecek, yani çevirmeden önce saat yönünde artıyorduysalar çevirdikten sonra saat yönünün tersinde artacaklar. Aynı şekilde çevirmeden önce köşe numaraları saat yönünün tersi yönünde artıyorduysalar çevirdikten sonra saat yönünde artacaklar.

Bu bilgiler eşliğinde kitaptakı sorulara bakıncakitaptaki soruları çok kolay çözebildim ve de nedenini de anladım.

Düzgün bir çokgende (yani her kenarı aynı uzunlukta olan) arka arkaya iki kere çevirmenin neden bir döndürme olduğunu geometrik olarak açıklayınız.

Varsayalım çevirmeden önce A yüzü yukarıda olsun. Demek ki çevirmeden önce köşe numaraları saat yönünün tersi yönünde artmaktaymış. Bir kere çevirdikten sonra köşeler saat yönünde artıyor olacak ve bir daha çevirince yine A yüzü yukarı gelecek ve köşe numaraları eskisi gibi saat yönünün tersi yönünde artıyor olacak. Köşelerin hangi konuma geldiklerinin bir önemi yok, bildiğimiz şey bu son şekil her durumda köşeler birbirlerine göre aynı dizilimi koruyacaklar. Sadece köşelerin ilk konuma göre bulundukları yerler farklı olabilir ama dizilimleri aynı olacak ve bu dizilim de başlangıçtaki konumdan bir döndürmeyle elde edilebilir.

Düzgün bir çokgende arka arkaya iki kere döndürmenin neden bir döndürme olduğunu geometrik olarak açıklayınız.

Döndürme işlemleri köşe numaralarının artış yönlerini değiştirmemekte. Şekil de ayrıca deforme olmadığından her köşenin komşu köşeleri de aynı kalır. Dolayısıyla bir köşe döndürme yönünde başlangıçtan ne kadar uzaklaşmışsa diğer bütün köşeler de aynı yönde o kadar uzaklaşmış olur. Bu da toplamda başka bir döndürmeye eşdeğerdir.

Düzgün bir çokgende önce döndürme ve ardından çevirmenin ya da önce çevirme ve ardından döndürmenin neden bir çevirme olduğunu geometrik olarak açıklayınız.

Bu işlemlerde sadece bir çevirme olduğuna göre köşelerin numaralarının artış yönü tersine dönecek. Bu da ancak çevirme işlemi ile sağlanabilir. Peki bu iki işlem sonucunda oluşan her dizilim için bir çevirme var mı? Yukarıda da gördüğümüz gibi döndürme ve çevirme işlemleri köşelerin birbirlerine göre konumlarını hiç değiştirmiyor, yani şekilde bir deformasyon olmuyor. Köşelerin birbirlerine göre konumlarında bir değişiklik olmuyorsa toplamda köşe sayısı kadar olası dizilim vardır. Düzgün çokgenlerde de köşe sayısı kadar çevirme için simetri ekseni vardır. Her eksen farklı bir dizilim yaratıyorsa sorunumuz çözülmüş olur. Örneğin 1 numaralı köşeyi alalım ve sırayla bu çevirmelerin bu köşeyi farklı köşelere gönderdiğini görelim. Elimde kartonlar varken bunu görmek benim için daha da kolay. Eğer seçilen bir köşeyi herhangi bir köşeye gönderebiliyorsam, sıralamalar da korunduğuna göre her dizilim için bir çevirmek bulabiliriz demektir.

Pragmatizmin elli tonu

İki gün önce şef diğer ekipten M’ın, planladığımız güncelleme ile ilgili benimle konuşmak istediğini söyledi. Anladığım kadarıyla bazı endişeleri varmış. M da dün aradı ve konuştuk. Önce kısaca problemden bahsedeyim ama. Üretim hattında birbiriyle konuşan iki adet makinemiz var. Benim programladığım makine ürünleri optik inceliyor, M’ın programladığı da tartıyor. Sonunda ürün bilgileri M’ın programladığı makinede gösteriliyor. Bu gösterilen bilgilerin bir kısmı da ürünün değişik görüntüleri. Aynı ürün için biri röntgen ikisi optik olmak üzere üç değişik görüntümüz var. Bu görüntüleri göndermeden önce ham verileri JPG’e dönüştürüyorum ve bu işlem üretim hızına oranla çok uzun sürüyor. Diğer program bu verileri topluyor ve eğer ürün hala üretim hattındaysa ağırlık bilgisiyle beraber gösteriyor. Şimdi burada karşılaştığımız sorun şu: Sık sık görüntü güncellemesi olmuyor çünkü veriler zamanında diğer sisteme ulaşmıyor. Bu da kullanıcıyı rahatsız ediyor.

Bu sorunu gidermek için iki değişiklik yaptık. Birinci değişiklikte M bana hangi ürünü göstermek istediğini önceden söylüyor ve bu sayede JPG dönüştürmesine daha önce başlayabiliyorum. İkinci değişiklikte de diğer sistemlere gönderdiğimiz verileri kısıtlayarak sistemdeki yükü biraz hafiflettik. Bu iki çözüm testlerimizde durumu epey iyileştirdi. Tabii ki kesin çözüm değildi bunlar ve arada problem yine olacaktı ama eskisi kadar uzun sürmemesi hedefimizdi.

Yaptığımız ikinci değişiklik için program güncellemesine gerek yoktu. İki parametreyle o işi halledebiliyorduk. Bunu müşterideki sistemde uyguladık ve sonuçlar geçen gün geldi. Bir iyileşme yoktu. M da bu sonuçlar üzerine endişelenmeye başlamıştı. Bana telefonda eğer bu değişiklik bir sonuç vermediyse diğer değişiklik de işe yaramayabilir, o zaman müşteriye ne cevap veririz diye sordu.

Kendi testlerimiz için bir ölçüm metodu tanımlamıştık. Bu testler sonunda iki şey gördük. İki çözüm beraberken sistemde iyileşme görebiliyorduk ve bu yöntemler ölçülebilir bir iyileşme de getiriyordu. Fakat müşteride bu testleri yapan kişi hiç tanımadığımız bir ölçüm aletiydi. Evet, her insan bir ölçüm aletidir ve standartları da yoktur. Ben de M’a, o zaman diğer ölçüm aletini öğrenelim ve testlerimizi ona göre uygulayalım dedim. Belki müştriyle konuşursak beklentilerini ölçülebilir bir hale getirebilirdik. O zaman sürprizlere de ihtiyacımız kalmazdı.

Sonra bu görüşmeyi şefe de anlattım. Şef her zamanki gibi pragmatik yolları tercihten yanaydı. Ölçümlerimizi müşteriye sunabilirdik ve kötüleşme de gözlemlenmemişti. Müşteriyle konuşarak zaman kaybetmeye ne gerek vardı ki? Bakalım şef önce M ile konuşsun da ne yapacağımız bir belli olsun.

0 Comments

Doğallık

Söz konusu siyaset, savaş olunca her şey çok doğal oluyor. Siyasiler seçim kazanmak için bize rahat rahat söyleyebilirler. Muhalefet yetersiz, yanlış işler yapmasına rağmen sırf iktidar partisini yenmek için onu desteklememiz gerek. Savaşlar tarihimizin önemli parçalarıdır. Onlar olmasa biz olmazdık.

Doğallık konusunu çok iyi anladığımı sanmıyorum. Sözlükteki tanımlarla bir deneme yapayım.

  1. Doğada olan, doğada bulunan: Evet bunların hepsi doğada bulunmakta. Bunun yanında doğada çok daha fazlası var ama onlara karşı tamamen karşı olabiliyoruz, ya da kabullenmiyoruz.
  2. Doğada rastlandığı gibi, doğaya uygun olan, doğa güçlerine, kurallarına uyan, tabii, natürel: Doğaya uygun olamayacak bir şey bilmiyorum. Plastik gibi bir şey mi acaba? Bu tanım girişteki konuyla çok ilgili değil sanki.
  3. Kendiliğinden olan, insan eliyle yapılmamış, yapay karşıtı: Bu da olmamalı, yukarıda dediklerimin hepsi insan yapımı.
  4. Yapmacık olmayan: Bu da değil.
  5. Olağan, alışılmış, her zamanki gibi olan, beklenildiği gibi: Bu biraz yakın gibi. Bunu not alayım.
  6. Sağduyuya, mantığa, olağan düzene uygun olan: Yukarıdaki noktaların mantığa, olağan düzene uygun olduğunu sanmıyorum.
  7. Katıksız, saf: Bunun da alakalı değil gibi.

TDK bu kadar tanım vermiş. O zaman beş numaralı tanım üzerine düşüneyim biraz. Alışılmış, beklenildiği gibi olan şeyleri doğal karşılayabilirim gerçekten de ama bu şeylere alışmak zorunda mıyım? Sanırım alışmak için çaresizlik önemli bir kıstas olabilir. Örneğin ölümün doğallığı gibi. Ben de öleceğim ve buna karşı bir çözümüm yok. Belki de bunu engellemek için çok büyük bir motivasyonum da yok. Gerçekten de beklediğim, alıştığım bir şey. Ya savaş? Savaşa karşı da yapabilecek çok bir şeyim yok sanırım. Tarihte de birçok insan buna karşı bir şey yapamadı. Bir kısmı yapabildi ama. Savaştan kaçanlar oldu. Hatta savaşı önleyenler de oldu. Belki sadece geciktirdiler ya da başka bir şekilde sahnelenmesine yol açtılar ama engellenen savaşlar oldu. Siyaset soruları bu kadar bile kesin ya da çaresiz değil. Eğer iktidarın gitmesini istiyorsam muhalefetin bana göre hatalarını eleştirebilirim. O hatlar düzeltilirse daha iyi bir muhalefet olacaktır. Bunu istemiyor olamazlar. Ha, benim bahsettiğim şeyleri hata olarak görmüyor olabilirler. Bu bana yazılım dünyasını hatırlatıyor. Bir programda bir şey yapmaya çalışırız ve program bizim beklediğimiz gibi çalışmaz. Sonra o programa küfrederiz, şikayetler yazarız filan. Programcı da çıkar ve bu programın hatası değil, kullanıcı hatası der. Eminim bu durum kullanıcıya o kadar da doğal gelmez. Ben bir program kullanırken kafamda bir model vardır, programın da o modele göre çalıştığını varsayarım. Eğer uyumsuzluk varsa o programın yerini alabilecek başka programlar ararım. Eğer becerebileceğime inanırsam bu programı kendim yazmayı bile düşünebilirim. Siyaset işini de sanırım böyle düşünüyorum. Kafamda bir dünya, devlet modeli var. Beklentilerim var. Bu beklentiler karşılanmadığı zaman rahatsız oluyorum ve başka seçeneklere bakıyorum. Neden otomatikman kullanıcı hatası diye düşüneyim ki? Büyük ihtimalle kimse bu durumlarda kullanıcı hatası olduğunu düşünmez. Sadece yapacak bir şey olmadığına inanıp kabul edebilir. Olağanlaştırabilir. Önce kötünün iyisini seçiyoruz deriz, sonra bu işin normali bu noktasına geliyoruz. İyileşme arzumuz da bu esnada köreliyor sanırım. Neyse, bugünlük de bu kadar yeter. Gidip başka şeyler öğreneyim. Hem o sırada bu düşüncelerden de kaçabilirim biraz.

Olaylar

Projelerde geçmişte verdiğimiz yanlış kararlar asla peşimizi bırakmıyor. Özellikle yazılım alanında verilen kararların uzun yıllar boyunca aynı şekilde geçerli kalması pek yaşadığım bir durum değildi zaten. Hala da değil. Bu günlerde tek değişiklik bu yanlışlamanın çok daha sık olması. Müşteriler artık daha yenilikçi adımlar atmaya meyilli. Teknoloji hızla gelişiyor. Rakipler de artıyor.

Bu ortamda uzun zaman önce şöyle harika bir tasarım yapayım da her müşterinin istediği olsun beklentisini terk etmiştim. Bu yönde tek sıkıntım o değişiklikleri hızla uygulayabilecek teknikleri henüz kullanmıyordum. Son zamanlarda biraz bu tekniklere yatırım yaptım. Bu sayede aynı anda birçok değişikliği programın mevcut müşterilerini rahatsız etmeden yapabiliyorum.

Önümüzdeki fuar nedeniyle yeni bir projeye de başladık. Bu proje sayesinde değişik bir alan için makineler üretebileceğiz. Uğraştığımız temel konu makinenin kendi kendine doğru parametreleri öğrenmesi üzerine. Teknik olarak nispeten kolay bir sorun. Sadece matematik. Zor olan kısmı ise bu matematiği çok değişik müşteri yelpazesini memnun edecek şekilde paketlemek. Çoğu müşteriler hiçbir şey yapmadan makinenin öğrenmesini isteyecektir. Bunların da çoğu belki tek bir tuşa basmaya razı olacaktır. Çok daha teknik müşteriler ise daha teknik verileri görüp kararlarını ona göre vermek isteyecektir. Bu kullanım senaryolarını belirlemek için toplantılar yaptık. Bu senaryolar aynı zamanda işlemin hangi modülde, nasıl yapılması gerektiğini ve de hangi arabirimlere ihtiyacımız olacağını da belirleyecek.

Sonunda uzun tartışmalar sonunda veri toplamanın ve işlemleri yürütmenin benim programladığım kısımda yapılmasına karar verildi. Ben de ihtiyacım olan arabirimlerin sunulması karşılığında bir sorun görmediğimi söyledim. Bunun yanında ileride ihityaçlara göre bu algoritmanın başka modüllere kayabileceği uyarısını da yaptım. Büyük ihtimalle bu uyarım çoktan unutulmuştur ama ben görevimi yaptım.

Dün görüntü işlemeden M ile kullanabileceğim arabirimler üzerine konuştuk. İlk toplantılarda bana söz verilen arabirimlerin hiçbirini alamayacağımı öğrendim. Peki dedim, “fuara bir ay bile kalmadı ama. İşimi zorlaştırırsanız bütün makine yetişmez.” diye de ekledim. Herkesin projeye bakış açısı farklı tabii ki. Kullanıcı arabirimini yazan arkadaş tabii ki kullanıcı için doğru şeyi yapalım, bu iş bir kerede bitsin istiyor. Ben de öyle yapalım ama fuara yetişecek şeyleri buna göre belirleyelim dedim. Az ama doğru şeyleri yapmak herkes için daha iyi olabilir. M elimizdeki arabirimleri kullanmanın en iyi yol olduğunu savundu. Grup şefi fuar için son müşterinin işine yaramayacak ama bizim sistemi kolayca test edebileceğimiz bir arabirim daha iyi olur dedi.

Her zamanki gibi karma bir yol seçildi. Anlatmak istediğim olaylar bunlar değildi ama. Program içindeki olaylardan behsedecektim. Yıllar önce projede bir parametre dışarıdan bir etki olmadan değişirse bu değişikliği benim programıma bildirebilsin diye bir mesaj tanımladık. O zamanlarda bunun ileride ne büyük belalara yol açabileceğini düşünemedik.

Sorun bu mesajı aldığımda sadece parametrenin değiştiğini bildirmesiydi. Bu parametrenin hangi ürüne ait olduğu ve neden değiştiği hakkında hiçbir bilgi yoktu. Dolayısıyla bazı senaryolarda yapacak pek bir şeyim olmuyordu:

Senaryo: Bir ürün üretilmekte. O sırada arabirimde bir işlem yapılıyor ve bu işlem görüntü işleme biriminde bir parametrenin değişmesini tetikliyor. Bu değişimin mesajı gelmeden önce arabirimde başka bir ürün seçiliyor ve bu ürün üretilmeye başlanıyor. Sonra parametrenin yeni değeri merkeze ulaşıyor. Bu değişim mesajında ürün bilgisi olmadığından sistem bu yeni değeri o an aktif olan ürüne yazıyor. Bu hatayı gidermek için şimdilik ürün değişimlerinde ekstra bir bekleme süresi koyuluyor. Bu süre boyunca yeni ürün aktifleştirilmiyor. O zamana kadar eski ürünü ilgilendirebilecek değişimlerin merkeze bildirileceği umuluyor.  
Senaryo: Ürün parametrelinin görüntü işleme birimi tarafından öğrenilmesi. Bu işlemde makineden geçen ürünlerin hatasız olduğu varsayılıyor. Görüntü işleme öğrenme modu boyunca bazı ölçümleri topluyor ve öğrenme bittiği zaman bu ölçümler ile parametreleri hesaplıyor. Bu hesaplamalar bitince parametrelerdeki değişiklikler tek tek merkeze bildiriliyor. Yukarıdaki senrayoda olduğu gibi ürün bilgisi olmadığından arada yapılacak bir ürün değişimi bu parametrelerin bir kısmının önceki, kalanının da sonraki ürüne kaydedilmesine yol açıyor. Bu durumda iki ürünü de bozmuş oluyoruz. Ürün değişiminde kullandığımız ekstra bekleme süresi de burada bir işe yaramıyor çünkü sayısı belli olmayan çok fazla parametre mesajı gönderiliyor ve bunların işlenmesi kullanıcının beklemek istemeyeceği kadar uzun sürüyor.

Bunlar şimdiye kadar yaşadığımız, herkesin bildiği sorunlardı. Burada arkadaşla konuşmaya başladık. M bu mesajın doğru olduğunu, çünkü geçmişte olan bir olayı temsil ettiğini söyledi. Bu olayın olduğundan ve bu mesajın sadece bunu söylediğinden hiçbir şüphem yoktu. Sadece bu mesaj işime yaramıyordu. Şu örneği vermeye çalıştım:

Senaryo: Arabirimden iki işlem başlatalım. Bu işlemler kullanıcı açısından birbirlerinden bağımsız olabilir. Diyelim ki bu işlemler görüntü işleme biriminde aynı parametreyi değiştiriyor. Bu olay tabii ki kullanıcının varsayımını geçersiz kılıyor ama kullanıcının bunu bilmesine imkan yok. Arabirim programcısı bile bunu bilemiyor. Bu durumda merkezi birim aynı parametre için iki değişik mesaj alacak. Eğer bu mesajlar sadece gösterilecek olsa sorun yok diyebilirim ama bu mesajlarla iki değişik prosesle ilgili iki değişik güncelleme yapacaksam hangisinin kime ait olduğunu nasıl çözebilirim?

Burada zamanında vermiş olduğumuz yanlış ya da eksik bir kara yüzünden kullanıcının yaptığı proses ile bu prosesin en temel parçalara ayrılıp bunlar üzerinden haberleşilmesi bir uyumsuzluk yaratmıştı. Prosesler ve olaylar arasında bir bağ kalmamıştı. Bu prosesleri aynı anda işlememek gibi bir kural da tanımlanabilirdi ama bu durumun da kısmen otomatik tespit edilmesi lazım, yani ortak parametreler var mı ve proseslerin hangi özellikleri var sorularını her an çözebilmemiz lazım. Yoksa kullanıcı bazı durumlarda gereksizce beklemek zorunda kalacak. Ayrıca bu durum sadece arabirim üzerinden başlatılan işlemler için değil, görüntü işleme birimi içinde olan işlemler için de dikkate alınmalı.

Bence bir parametre içten bir nedenle bile değişse, nedensellik her zaman olacaktır. Mesaja en azından bu nedensellikle ilgili bilgiler eklememiz sorunu çözebilir. Ya da diğer uç noktaya giderek parametrelerin değişimini tetikleyebilecek işlemleri aynı anda çalıştırmayı engelleyebiliriz. Her işlem kendinden önceki işlemin tamamen bitmesini bekleyebilir. Bu yöntemi programımda kullandım ama bir süre sonra kullanıcılar bu işlemler birbirinden bağımsız ama neden aynı anda işletilmiyorlar diye şikayet de ediyor.

İş hayatında her gün bu basit program olayları yüzünden çok ciddi gerçek hayat olayları yaratabiliyoruz. Düzeltmeleri, iyileştirmeleri geciktirdikçe de sorunlar sadece büyüyor.

Test sistemi neyi ölçüyor?

Bugün şöyle bir test sorusu geçti elime.

\(p(x) \) polinomu \(x-1\)’e bölününce 7 kalıyor. Aynı polinom \(x+2\)’ye bölününce 1 kalıyor. \(p(x+4) \) polinomunun $x² + 9x + 18$ polinomuna bölümünden kalan nedir?

Sınavdan otuz yıl sonra benim problemle ilgili hatırladığım tek şey bir kalan teoremiydi ama onu da kullanmaya gerek yoktur umarım diye düşündüm. Şöyle başladım:

\(p(x) = q(x) \cdot (x-1) + 7 \)

Burada \(q(x) \) bölüm oluyor ve bunu hesaplamaya gerek olmayacaktır diye düşündüm.

İkinci veri için de şunu yazdım:

\(p(x) = t(x) \cdot (x+2) + 1 \)

Birinci denklemde \(x = 1 \) için \(p(1) = q(1) \cdot (1 – 1) + 7 = q(1) \cdot 0 + 7 = 7 \) verisini elde ederiz.

Aynı yöntemi ikinci denklem için uygularsak da \(x = -2 \) için \(p(-2) = t(-2) \cdot (-2 + 2) + 1 = t(-2) \cdot 0 + 1 = 1 \) sonucunu elde ederiz.

Bu noktada daha fazla bilgi edemeyeceğimi düşündüm ve bir sonraki adımı denemeye karar verdim. Bu verilerin o adımda bir şekilde işe yarayacağını umuyordum sadece.

\(p(x+4) = u(x)\cdot (x² + 9x + 18) + (ax + b) \)

Buradaki \(ax + b\) ifadesi bölümden kalan terim olmakta ve derecesi \(x² + 9x + 18 \) ifadesinden bir derece küçük olmalı. Bu durumda a ve b terimlerini bulmam lazım ve bunun için de iki denkleme ihtiyacım var. Şansa soruda iki denklem verilmişti. Bakalım bu denklemler işime yarayacak mı?

\(p(1) = 7\) ise son denklemde \(x \) yerine -3 koyarsak denklemi ihtiyacım olan şekle sokabilirim diye düşündüm.

\(p(-3 + 4) = u(-3) \cdot ((-3)² + 9\cdot(-3) + 18) + (a\cdot(-3) + b = 7 \)

\(p(1) = u(-3) \cdot (9 – 27 + 18) + (a\cdot(-3) + b = 7 \)

\(p(1) = u(-3) \cdot (0) + (a\cdot(-3) + b = 7 \)

\(-3a + b = 7 \)

Şansım yaver gitti. Bakalım ikinci denklem de işe yarayacak mı?

Bunun için \(x = -6 \) değerini kullanmam gerekecek.

\(p(-6 + 4) = u(-6)((-6)² + 9\cdot(-6) + 18) + (a\cdot(-6) + b) = 1 \)

\(p(-2) = u(-6)(36 -54 + 18) + (-6a + b) = 1 \)

\(p(-2) = u(-6)(0) + (-6a + b) = 1 \)

\(-6a + b = 1 \)

Bir denklem daha elde ettim. Şimdi bu iki bilinmeyeni bu denklemlerle çözebilirim.

İlk denklemden ikinci denklemi çıkarırsak:

\((-3a + 6a) + (b – b) = 7 – 1 \)

\(3a = 6 \)

\(a = 2 \) buluruz.

Bu a değerini denklemlerden birine koyarsak da b değerini buluruz.

\(-6 \cdot 2 + b = 1 \)

\(-12 + b = 1 \)

\(b = 13 \)

Demek ki bölümden kalan \(2x + 13\) ifadesiymiş.

Bu kadar işlemde matematiksel düşünme açısından yaptığım tek şey kalanların derecelerinin daha küçük olması gerektiği ve polinom bölmeyi yazıp \(p(1) \) ve \(p(-2) \) değerlerini hesaplamak oldu. Bunları polinomlarla ilgili bir teoremle de yapabilirdim. Geri kalan işlemler ise biraz da bunun test sorusu olmasının getirdiği bir iyimserlikle yapılmış işlemlerdi. Diğer taraftan soruda yapılan bu eklemeler sayesinde denklem çözümleri de kullandırılmış.

Burada kendi kendime sormaya başladım. Testlerde neyi ölçmek istiyoruz? Bilgiyi mi? Düşünmeyi mi? İyimser beklentileri mi? Ya da kişinin belli örüntüleri kolayca görüp göremediğini mi? Belki de hepsidir. Sınav test usülü olmasa da ister istemez bütün bunları ölçüyoruzdur heralde.

Projeler

Bizde projeler klasik şöyle yürür:

Müdürler bir proje yapalım diye düşünür. Sonra bir grup kurarlar ve hadi bu projeyi yapın derler. Biz de hemen bir toplantı yaparız ve projenin ne olduğunu bize anlatılır. Toplantı sonunda aslında projenin kimse tarafından anlaşılmadığı ortaya çıkar. Toplantı boşa gitmemiştir ama, bu toplantıda kesinlikle projenin ne zamana biteceği üzerinde anlaşmış oluruz. Toplantı bir sonraki toplantının tarihini tespit etmeyle biter ama bir sonraki tarihte herkesin işi olduğundan bir ara uygun bir tarih kararlaştırılacağı kararı alınır.

Aynen bu şekilde, üç grubu ilgilendiren bir projeye başladık. Proje Mayıs gibi bitecek ve bu arada iki fuar olduğundan o tarihler arası da şimdiden bloke edilmiş durumda. Şimdiye kadar iki üç toplantı bitti ve daha üzerinde anlaşılmış bir konsept kırıntısı bile yok. Bir sonraki toplantının tarihi belli değil. Bu sırada herkes başındaki on değişik projeyle boğuşuyor ve Nisan gibi proje sayısı daha da fazla olacak (aynı ekipler her hafta başka bir proje için de toplantılar yapmaya çalışıyor ve nedense bir sonraki toplantıya ben de davetliyim).

İlk toplantıdan ve önceki projelerden anladığım kadarıyla kesinlikle ihtiyacım olan bir programa başladım. Bunu duyan şef de “ooo, daha Mayıs’a çok var” dedi. Ben de “o finale son gece çalışan elemanlardan 70 alanı daha görmedim” dedim. Güldü. Ben gülmedim.

Fuarlar sırasında bana ciddi işler çıkmazsa bu işi hallederim gibi geliyor. Ondan sonra zaten çok daha önemli projeleri üzerimize bindirecekler. Benim asıl korkum, bu haftaya beni davet ettikleri projenin bir fuar projesi olma ihtimali. Öyle olursa bana da her gün final var demektir.