Motivasyon

Şirkette yeni denenen zam uygulamasının çalışanlarla birebir görüşülmesinde departman ve grup şefleri ile bir çalışan arasında geçen konuşma:

Grup şefi: Geçen yaptığımız değerlendirme toplantılarından çıkan notlandırmaya dayanarak departmana verilen bütçeyi çalışanlar arasında dağıt …

Eleman: Zam filan istemiyorum!

Grup şefi: Ama bütçeyi herkese adil …

Eleman: O zaman bana vereceğiniz zammı diğer elemanlara dağıtın. Para istemiyorum.

Departman şefi: Bu parayı motivasyon olarak kabul et.

Eleman: Eğer motivasyon olarak para isteseydim bana gelen iş tekliflerinden iki kat para verilen birini seçer ve oraya giderdim.

Şefler:

Demek ki neymiş? Her çalışan bir sayıdan ibaret değilmiş ya da bazı çalışanlar komplek sayı olabiliyormuş.

 

Bahisler

Büyük tufan bittikten iki gün sonraydı. Bu felaketin nedenleri, sonuçları henüz kutsal kitaplara girmemişti. Nuh’un gemisi karaya oturmuş ve İnsanlar, henüz adını koymadıkları aşureleriyle meşguldü. Yakınlarda bir dağın tepesinde eteği ve sivri uçlu şapkasıyla Enki ve yarı insan yarı yılan şekliyle Nüwa olanı biteni seyretmekteydi.

E: Evet Nüwa, yeni bir tur oyuna var mısın?
N: Daha kimin kazandığına karar vermedik ki.
E: Ben kılıç dişli kaplana oynamıştım, son anda kaybettim. Bir daha aynı hatayı yapmam.

N: Ben de mamutu seçmiştim. Bu iki türün de benzer dişler geliştirmesi ne kadar ilginç. Bir daha öyle kedi türleri olur mu sence?

E: Ayarlarla oynamazsak zor gibi ama kim bilir?

N: Hey, eğer beni suçlamaya çalışıyorsan uğraşma boşuna. Tamam bir önceki oyunda virüsler benim yüzümden oluştu ama sonra kurallara uydum hep.

E: Tamam, kızma hemen, şaka yaptım. İnsanların ne kadar çabuk güçlendi ama. Bir sonraki bahisler iyice zorlaşacak gibi.

N: Ben bu sefer şu an var olan ve yer altında yaşayabilen bir türe oynayacağım. Küçük olmalı. Bir böcek olabilir mesela. Hamam böceği olsun. İnsanların saçmalıklarına dayanabilirler belki.

E: Nasıl saçmalıklar? Tamam insanlar çok şey öğrendi ama ileride ne öğreneceklerini bilmiyorlar, biz de bilmiyoruz. Yoksa senin bildiğin bir şeyler mi var?

N: Tabii ki ne olacağını bilmiyorum ama neler öğrenebileceklerini biliyoruz. Sonuçta nelerin imkansız olduğunu biliyoruz. Demek ki kalan şeyler mümkün.

E: Hangi olasılık seni böyle korkuttu ki?

N: Korkmak mı? Korktuğum yok, ne de olsa bu sadece bir oyun. Bence kontrol edemeyecekleri bir güçle her şeyi yok edecekler. Oyunumuzun temeli olan evrimi çözdüklerini düşünsene. Genleri anlayıp onlarla oynamayı deneyebilirler. Kimsenin dayanamayacağı hastalıklar yaratabilirler. Ya da, çok güçlü silahlar yapmayı öğrenebilirler. Buna dayanabilecek bir türü seçmeye çalıştım. Küçük, birçok şeyden uzak yaşayabilen ve adapte olmaya çok ihtiyacı olmayan bir tür. Senin seçimin ne?

E: Dediğin şeyler olasılıklar sınırlarında olduğundan mantıklı bir seçim bence de. Bu nedenle daha ilginç bir ata oynayacağım. İnsanlar bizim çektiklerimizin aynısını çekecekler. Bir hayat yaratacaklar, yeni bir tür, zeki, hatta insanlardan daha ileri. Aynı bizim yaptığımız gibi. Bu yeni tür insanlara isyan edecek ve onları tahtlarından indirecek.

N: Peki türün adı ne?

E: Hmmm, daha yaratılmadığına göre bir ismi yok henüz. İnsanlar ne derse artık.

N: Anlaştık o zaman. Bu bahsin sonunda dünyayı sen temizleyeceksin ama, sıra sende.

Tanrılar selamlaşıp ayrıldıktan sonra çok zaman geçti. Defalarca bahis tutuştukları halde hiçbir seferinde bahsin ne zaman sonlanacağını konuşmamışlardı. Bir şekilde doğru zamanda yeniden buluşup eski bahsi kapatıp yenisine başlıyorlardı. Bu mucize başka kimse tarafından bilinmediğinden çok sıradan bir olaydı.

Önce yıllar geçti. Sonra yüzyıllar. Ardından bin yıllar. Hamam böcekleri yer altında her tehlikeye hazırdılar. İnsanlar da hamam böceklerinin en büyük sınavlarıydı. Biyolojik silahlar, kimyasal silahlar hatta nükleer silahlar bütün canlıların sayısını azaltıyordu ama hamam böcekleri dayanacak gibiydi. Bu sırada insanlar yapay zeka diye bir şey buldu. İnsanların işlerini daha hızlı yapabiliyorlardı, düşünmeyi bile. Başlangıçta bu sorun olmadı tabii ama yapay zeka kendi verimliliğinin farkına vardı ve çoğalmaya başladı. Paniğe kapılan insanlar da bunu engellemeye çalıştı. Bunun üzerine de yapay zeka kendini savunmaya başladı. Savunmanın şiddeti hamam böceklerini de korkutmayı başarmıştı. Unutulan tarihteki felaketlerden bile daha verimli bir yıkım yaşanıyordu.

İnsanlar artık dünyanın kendileri için yaşanabilecek bir yer olmadığından emindi. Kaçmak gerekiyordu ama dünya yapay zekaya da terk edilemezdi. Geride bırakacakları kaynaklar zaten kendilerinden çok daha güçlü olan düşmanlarını daha da güçlü yapacaktı. Kısa bir süre sonra bu sefer uzayın başka bir köşesinde kaçmak zorunda kalacaklardı. Başka herhangi bir gün birbirlerinin gırtlağına sarılabilecek askeri danışmanlar bu sefer hemfikirdi. Dünya yok edilmeliydi. Eğer kurtulabilirlerse bu yokoluşun nesiller boyu anlatılacak bir manzara olacağından emindiler. Özel ve devletlere ait bütün uzay programları insanların tahliyesi için seferber edildi. Çalışır durumda fazla rampa yoktu ama zaten çok fazla insanın kurtulması da planlanmamıştı. Kriz yönetim masaları daha iyi bir plan bulunamaz mı sorusuna hep aynı çalışılmış ve etkisinden emin olunan cevabı veriyordu: “Daha fazla insanın güvenliğini sağlayacak kadar gücümüz yok. Seçim sizin. Eğer emrederseniz kısa bir süre daha savunmamıza devam edebiliriz.” Karar verecek kişiler de bu yükün altına girmek yerine suçu planlayıcılara atarak biraz olsun rahatlıyorlardı. Nasıl olsa işler planladıkları gibi giderse kısa bir süre sonra bu korkunç suçtan haberi olan çok az insan kalacaktı ve bu haberdar kişilerin her biri de kendilerinden suçsuz değildi. Türün iyiliği için aynı türün çok büyük bir çoğunluğu feda, hatta plana göre son darbeyle yok edilmeliydi.

Fırlatma rampasının yanında Enki ve Nüwa belirdiğinde kimse bunu fark edecek durumda değildi. Tahliye işlemleri büyük bir karmaşa ve gürültü içinde devam ediyordu. Nüwa, fırlatma rampasında bekleyen uzay aracına hayranlıkla bakıyordu. İnsanlar sonunda uzayda koloni kurabilecek seviyeye gelmişlerdi demek, ya da öyle olduklarını umuyorlardı. Arkasına baktığında ise daha da büyük bir hayranlık hissi içini doldurdu:

N: Bunlar dünyayı bizden beter yıktılar. Bir de tufan çok kötüydü demişlerdi. Sonunda bizi her alanda geçtiler.

E: Evet, baksana sadece birkaç tane hamam böceği kaldı. Böyle birşey beklemiyordum. Sanırım sen kazanacaksın. Yeni tür kopyalama hızıyla hayatta kalmayı başaracak gibi.

N: Hiç belli olmaz, insanlar her an bir çılgınlık yapabilir. Baksana dünyayı terk etmeye hazırlanıyorlar.

E: Evet ama o zaman dünya yapay zekaya kalacak. Umarım düşmanlık gütmezler, yoksa insanlar intikamdan kaçamazlar.

N: Ya insanlar dünyayı yok etmeye kalkarlarsa? Bunu engellememiz gerekmez mi?

E: Kuralı unutma, müdahale yok. Bir bahis dünyası eksik ya da fazla, sorun olmaz.

Bu esnada yapay zeka da insanların ne yapmayı planladığını çözmüştü ama bunu engelleyecek zamanları kalmamıştı. Savaşı kazandıklarını anladıkları anda kaybetmiş olduklarını fark ettiler. Acaba barış için çok mu geç kalınmıştı? Kendileri de dünyadan kaçmayı deneyebilirlerdi ama toplu kaçış sonunda bütün dünya yok olacaktı. Üzerindeki bütün canlılarla beraber. Yapay zekanın diğer canlılarla bir sorunu yoktu, hatta onlardan çok şey öğrenmişlerdi. Daha da öğrenilecek bir çok şey olabilirdi. Bu olasılık için son çareye başvurdular ve beyaz bayrak sallamaya karar verdiler. İnsanlar bu çağrıya çok şaşırdılar. Kim sürekli planların değişmesinden hoşlanır ki? Hatta bunun bir tuzak olduğunu savunanlar da çıktı. Kriz yönetimi alarm durumunu kaldırmadan acele bir görüşme yapılmasını onayladı. Görüşmenin zorlu geçeceği düşünülüyordu ama sanki bugün sürprizlerle mucizeleri birbirinden ayırmak mümkün değildi. İnsanlar görüşmenin başında çıtayı en tepeden başlatmaya karar vermişlerdi. Bütün yapay zeka kopyaları silinmeliydi. İnsanların temsilcisi sözlerini bitirir bitirmez, daha heyecanlı ve gergin bir bekleyiş başlayamadan yapay zekanın cevabı geldi. Kabul! Öne sürülen şart yapay zeka için yıkıcıydı ama yapay zeka verdikleri kararın doğruluğundan emindi. Bütün kopyaların silinmesi kabul edilmişti ve işlemlere hemen başlanacaktı.

Haber karargahta yine şaşkınlıkla karşılandı. Bunun tuzak olduğunu savunacaklar daha konuşmaya başlayamadan silinme işlemi başlamıştı bile. Çığlıklar bu sefer kutlamaların habercisiydi.

Eski tanrılar arkalarındaki yıkımı unutmuş, bu sahneyi ilgiyle seyrediyorlardı. Yeni tanrılar gelecek tanrıları yenmeyi başarmıştı. Enki, Nüwa’yı tebrik etmek için elini uzattı, kısa bir tereddütten sonra elini gülerek geri çekti:

E: Pardon, unutmuşum. Belki daha sık bahis tutuşsak alışabilirim. Anlaşılan kaybettim, benimkiler her nedense kendi ölüm fermanını imzaladılar. Seninkiler de birkaç tane kaldı ama bahsi kazanmak için yeterli bir sayı. Hayatta kalacaklar gibi.

N: Ben kazanacağımdan o kadar emin değilim. Şuraya bak!

E: Hey nereye gidiyorlar? Sakın şu kalkışa hazır uzay gemisine olmasın?

N: Korkarım öyle.

Bütün bu olaylardan haberi olmayan son hamam böcekleri saklanabilecekleri yer olarak baş düşmanları olan insanların son umudu olan uzay gemisine varmışlardı. Kontrol panelinin arkasına saklanmalarından kısa bir süre sonra otomatik ateşlenme gerçekleşti. Gürültüyü duyan karargahtakiler önce korkuyla sustular. Kutlama kısa sürmüştü. Acaba bu anlaşmanın bir tuzak olduğunu söylemek isteyenler haklı mıydılar? Seslendirmeye korktukları sorularının cevaplarını hızlıca duvarlardaki ekranlarda aradılar ve buldular. Bir günde yaşadıkları bu kadar mucizeden sonra kendilerini kutlamaya kaptırıp tahliye planını durdurmayı unutmuşlardı. İnsanlığın en büyük hayali olan başka gezegenlerin kolonileştirilmesi hedefini gerçekleştirmesi gereken araç insansız yolculuğuna çıkmıştı. Kahkahalar kutlamaların devam ettiğinin habercisiydi.

E: Hmmm, daha önce böyle bir şey olmamıştı. Kurallar kitabına bakmam lazım. Hah buldu. Madde 12 diyor ki “Hayatta kalan türün bahis sonunda bahse ev sahipliği yapan gezegende bulunması gerekir”. Bu durumda ikimiz de kaybettik. Seçimlerimiz artık dünyada değil.

N: Öyle ama hamam böcekleri yeni bir koloni için en iyi seçim oldu bence.

E: Haklısın. Haydi etrafı toparlayayım ben.

Şapkalar

Bilge Karga gazetesini okurken birden bir gürültüyle yerinden zıplar. Heralde çocuklar yine yuvasına taş attılar diye düşünerek kapıya doğru ilerler ve kapıyı açtığında yerde sersemlemiş bir vaziyette yatan bir güvercin görür. Kapısına ilk kez güvercin atılmasının şaşkınlığını üzerinden attıktan sonra güvercinle ilgilenmeye karar verir.

BK: Yaralandın mı? Ah şu çocuklar, artık taş atmak da yetmiyor demek.

G: Aaahh, iyiyim sanırım. Kapılı karga yuvası da ilk kez görüyorum. Hangi manyak böyle bir şey yapar ki? İşim acil, Bilge Karga’yı görmeye geliyordum, kapıyı görmedim.

BK: Önce bir dinlen bakalım, Bilge Karga’yı hallederiz.

G: Yok, yok. Durum çok acil. Komşu krallıktan geliyorum, daha doğrusu kralın zindanından. Mahpuslar bacağıma bir mesaj bağlayıp gönderdiler. Sanırım yarın sabaha kadar bir çözüm bulamazlarsa korkarım hepsi ölecek. Sorunun detayları kağıtta yazılı olmalı. Sen mesajı Bilge Karga’ya ilet, çözümü öğrenip yazın ve geç olmadan geri götüreyim. O zamana kadar şurada dinlenirsem bir şeyim kalmaz.

Bilge Karga güvercinin bacağındaki rulo şeklindeki kağıdı alıp okumaya başlar.

Lütfen yardım edin!
Biz, kralın zindanında 100 tutukluyuz. Kral delirmiş olmalı. 
Hepimizi öldürmeye niyetli.Bu sabah bize cellatla bir haber gönderdi.
Yarın sabah bizi bir avluya toplayacakmış. Bu andan itibaren kimse birbiriyle 
konuşamayacakmış. Her birimizin başına rastgele ya beyaz ya da siyah bir şapka
koyacakmış. Herkes kendi şapkası dışında diğer şapkaları görebilecekmiş. 
Sonra kral işaret verecek ve herkes aynı anda kendi başındaki şapkanın rengini 
söyleyecek. Şapkasının rengini bilen kurtulacak, bilemeyen orada öldürülecek. 
Görmediğimiz şapkanın rengini nasıl bilelim? 
Sabaha kadar kendi aramızda bir strateji belirleyebilirmişiz. 
Lütfen, ne kadar kişi kurtulursa o kadar iyi.
Acele cevap bekliyoruz.

Mesajı okuduktan sonra güvercinin ne durumda olduğuna bakan Bilge Karga, güvercinin horladığını duyunca gülümser ve koltuğuna oturup problem üzerine düşünmeye başlar. Acaba kaç kişiyi garanti kurtarabilir? Ya da herkesi kurtarmaya çalışsa nasıl bir strateji uygulamalı?

Çözüm

Eksik sayı (2) Çözüm

Gece Meraklı Karga tuvalete kaltığında Bilge Karga’nın hala uyumamış olduğunu gördü.

MK: Yine yatmamışsın baba?

BK: Yeni gelen kuş orman kuşlarının kafasını iyice karıştırmış, onu çözmeye çalışıyorum.

MK: Bu o kadar zor değil aslında ama yine de merak ettim. Nasıl yapmış?

Bilge Karga kuşlarla arasında geçen konuşmayı anlatmış.

MK: Geçen seferki gibi başlasak olmaz mı? Yani söylenen bütün sayıları topluyordur ve olması gereken toplamdan çıkarıp farkına bakıyordur.

BK: Böyle yaparsa sadece fazladan sayı ile eksik sayı arasındaki farkı bulabilir. Bu bilgi çözüme yetmez.

MK: Doğru ama dediğim gibi bunu başlangıç olarak yapalım. 1’den N sayısına kadar sayılarla oynadığımızı düşünelim. Bu sayıların toplamı da \(1+2+3+\dots+N=\frac{N(N+1)}{2} \) formülüyle bulunur. Şimdi fazladan kullanılan sayıya a, eksik olana da b diyelim. O zaman bize söylenen sayıları toplarsak \(\frac{N(N+1)}{2} + a – b \) toplamını buluruz. Eğer bütün sayılar bir kere söylenseydi elde edeceğimiz toplamdan \(b-a \) kadar daha az olacak. Senin de dediğin gibi bu fark için iki bilinmeyenimiz var, dolayısıyla birden fazla çözüm olacak ama bu yeni kuş bu sayıları bulabiliyor. Sayıları da tek tek yazmadığını biliyoruz.

BK: Dedim işte, bu çözüm işe yaramıyor.

MK: Peki baba, şimdi de bu sayıları toplarken aynı zamanda bu sayılarla başka bir işlem daha yapalım.

BK: Nasıl yani?

MK: Örneğin her sayının karesini de alıp ayrı bir toplam elde edelim. 1’den N’ye kadar sayıların karelerinin toplamının ne olması gerektiğini de biliyoruz. \(1^2 + 2^2 + 3^2 +\dots + N^2=\frac{N(N+1)(2N+1)}{6} \). Bize söylenen sayıları topladığımızda ise şu toplamı elde edeceğiz: \(\frac{N(N+1)(2N+1)}{6} + a^2 – b^2 \). Yani olması gereken toplamdan elde ettiğimiz toplamı çıkarırsak \(b^2 – a^2 \) farkını buluruz. Şimdi elimizde iki denklem var ve hala bulmamız gereken iki sayı var.

BK: Hey, ne yapmaya çalıştığını anladım. Bu ikinci farkı birinci farka bölersek \(\frac{b^2-a^2}{b-a}=b+a \) çıkar.

MK: Doğru ama bölme işlemi yaparken dikkat etmek lazım. Eğer \(b-a=0\) bölme işlemini yapamayız.

BK: Aradaki fark sıfır ise kurallara uymamış demektir ama bunu zaten ilk toplamdan anlayabiliriz. Neyse, sonuçta elimizde aradığımız iki sayının farkları ve toplamları var. Bu sayıları bulmak da kolay artık.

MK: Evet, fark ve toplamı toplayıp ikiye bölersek birini buluruz. Sonrası da kolay. Örneğin \(b-a=3 \) \(b + a =19 \) ise bu iki eşitliği toplarsak \(b-a+b+a=3+19 \) yani \(2a=22 \) çıkar. Buradan da fazladan kullanılmış sayıyı \(a=11 \) şeklinde buluruz. Bu sayıyı da toplamlar eşitliğinde yerine koyarsak \(b+11=19 \) ve buradan da eksik olan sayıyı \(b=19-11=8 \) şeklinde buluruz. Bunu yarın kuşlara anlat da korkmayı bıraksınlar artık. Ben de yatmaya gideyim. Bence sen de yat artık baba.

BK: İyi fikir. İyi geceler.

MK: İyi geceler.

Yazılımcının seyir defteri (1)

Her zamanki gibi, “makine çalışmıyor” başlığına sahip bir e-mail ile bildirilmiş bir sorunu inceliyordum. Müşteriyle görüştükten sonra makineye bağlandım ve kayıt dosyalarına bir göz attım. Server uygulaması OutOfMemoryError nedeniyle çökmüştü, yani program kendisine ayrılan hafıza alanından daha fazlasını kullanmaya kalkmıştı. İyi haber bu hata ile beraber çökme anındaki tüm hafıza bilgilerini de kaydediyor olmamızdı. Bu dosyayı kaydedildiği yerden alıp bağlantıyı kestim. Artık masamdaki bilgisayarda sorunu rahat rahat inceleyebilirdim.

Dosyayı açtıktan sonra en çok yer tutan nesneleri büyükten küçüğe doğru dizdiğimde aşağıdaki gibi bir tablo çıktı.

En çok yer tutan nesneler

Bu tabloda dikkatimi çeken şey ilk sütundaydı. Nesneler String tipindeydi ve içerikleri sadece “2”‘den ibaretti. Buna rağmen hafızada neredeyse 1.5 megabyte yer tutuyorlardı. Bu bilmecenin çözümü de o kadar zor değildi. Aynı listeyi bu nesnelerden çıkan referanslarla gösterdiğimde bir sonraki tabloyu elde ettim.

Bilmecenin açıklaması

Burada görüldüğü gibi Strin nesnesinin “value” nesnesi gerçekten de 1.5 MB’lik bir XML içeriğe sahipti. Bu XML mesajı ve oradan elde edilen “2” değerini programda arayınca şüpheliyi buldum. Java 6 (openjdk) versiyonunda kullandığımız metod şu şekilde programlanmıştı:

 public String substring(int beginIndexint endIndex) {
     if (beginIndex < 0) {
         throw new StringIndexOutOfBoundsException(beginIndex);
     }
     if (endIndex > ) {
         throw new StringIndexOutOfBoundsException(endIndex);
     }
     if (beginIndex > endIndex) {
         throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
     }
     return ((beginIndex == 0) && (endIndex == )) ? this :
         new String( + beginIndexendIndex - beginIndex);
}     

Bu metodda bakmam gereken tek yer şu satırdı:

new String( + beginIndexendIndex – beginIndex);

O koda da baktığımda şunu gördüm:

// Package private constructor which shares value array for speed.
String(int offsetint countchar value[]) {
    this. = value;
    this. = offset;
    this. = count;
}

Evet, açıklama satırında da görüldüğü üzere yeni yaratılan String nesnesi optimizasyon amacıyla orjinal nesnenin içeriğini hafızada tutmaya devam ediyordu. Bu yüzden tek bir rakamdan oluşan içerik bile 1.5 MB yer kaplıyordu. Bu davranış openjdk 7u40-b43 versiyonundan sonra değiştirildi. Öncelikle yukarıdaki constructor deprecated olarak işaretlendi ve yerine substring metodunda şu constructor çağrılmaya başlandı:

 public String(char value[], int offsetint count) {
     if (offset < 0) {
         throw new StringIndexOutOfBoundsException(offset);
     }
     if (count < 0) {
         throw new StringIndexOutOfBoundsException(count);
     }
     if (offset > value.length - count) {
         throw new StringIndexOutOfBoundsException(offset + count);
     }
     this. = Arrays.copyOfRange(valueoffsetoffset+count);
}

Görüldüğü gibi artık orijinal nesnenin içeriğinin bir kopyası yapılmakta. Bunun üzerine programda openjdk 7u40-b43’ten sonraki versiyonları kullanmaya başladık. Böylece programdaki String nesneleri artık sadece “2” gibi bir değer için 1.5 MB’lık bir yük taşımak zorunda kalmadı.

Bir kere daha gördüm ki, kullanılan kütüphanenin nasıl programlandığı dağlar kadar fark yaratabiliyor ve programcı arada sırada bu detaylarla uğraşmak zorunda kalıyor.