Perşembe, Aralık 13, 2012

Sorun Programcıda (mı?)

Bu hafta iki yazı dikkatimi çekti.

Infomag yayıncılık BT müdürü Ahmet Usta Girişimci adaylarından saklanan 10 Gerçek başlıklı makalesinde " Programcıların büyük kısmı işi batıran kısımdır." demiş.

Bir pazarlama ve reklam ajansı kurucusu olan Deniz Utku ise Türk İnternet Sektörünün Kronik Sorunu başlıklı yazısında "Türkiye'de yatırımcıların da girişimcilerin de samimiyetlerine inanıyorum; zaten gelişmeyi engelleyen sorun (bottleneck) onlar değil. Türkiye'de yeterince fikir de var, sermaye de var. İhtiyacımız olan şey: "yapan insanlar" yani kendini iyi geliştirmiş yazılımcılar ve İnternet'ten anlayan karar vericiler." demiş.

Aslında bu yazıların temel konusu bu değil ama aralarda yazılımcı kesim "işi batıran" ve "gelişmeyi engelleyen sorun" olarak tanımlanmış.

Elbette her ülkede olduğu gibi Türkiye'de de kalitesiz yazılımcı vardır. Kalitesiz girişimciler de olabilir. Girişimciler "bu internet işinde iyi para var" diye düşünerek bu işe girişmiş olabilirler. Karşılarına yapabileceğinden çok daha fazlasını vaad eden programcılar, reklamcılar, pazarlamacılar, seo uzmanları, sosyal medya uzmanları ya da bilmemne uzmanı çıkabilir.

Bu nedenle girişimciler yola yanlış insanlarla çıkmış olabilirler ve sonuçta başarısızlık yaşanmış olabilir. Muhtemelen gelecekte de yine her ülkede olduğu gibi Türkiye'de de girişimlerin bir bölümü bu tür nedenlerle başarısız olacaktır. Sebebi ne olursa olsun ana fikir değişmez. İşi batıran da çıkaran da her zaman "girişimcidir".

Belki de bu nedenle "en başarılı" bilinen girişimlerin baş kurucuları içinde muhakkak işin altyapısına hakim teknik insanlar var. Oturup bizzat kod yazmayabilirler ama bu kişiler "doğru ekibi" kuracak ve "doğru ürünün üretilmesini" sağlayacak yapıyı tasarlayacak bilgi düzeyine sahipler. Doğal olarak bu düzeyde olmayan girişimcilerin bol reklam ve sermaye gücüyle klon projeler yapıp pastadan bir ısırık koparmayı ummak dışında bir seçeneği yok. Bu yöntem tıpkı şansa ve ne kadar para basıldığına dayalı bir kumar gibi. Tutabilir de tutmayabilir de...

Yıllardır bunu defalarca kez gördüm. "Programcılarda sorun olduğu" düşünülen işlerin "ortak noktası" patronların ve patronlara akıl öğretenlerin "yazılım üretimi" işinden anlamıyor olmaları. Bu yeni icad edilmiş bir fikir değil. Bırakın yazılım üretimini simitçi bile açacaksanız fırının karşısına geçip saatlerce simit yapmayı bileceksiniz. Yapmasanız da üretim tecrübeniz olacak. Bunun ne anlama geldiğini bilmeyen Haluk Okutur'un hayat hikayesini bir dinlesin.

Evet Türkiye pazarındaki boşluklardan istifade ederek bir köşe tutanlar ve çok güzel paralar kazananlar oldu. Ama artık bu devir geçti. Bu örneklere bakarak "internet işi tasarlayan" ya da "bu işten anladığını zanneden" fena yanılır. Sektörün bazı oyuncularının daha çok girişimcinin ve yatırımcının internet işlerine girmelerini istemelerini anlıyorum ama artık ideal girişimci profilini sağa sola kafa atıp sütün kaymağını sıyıran adamlar olarak lanse etmekten vazgeçmek gerek. Öyle bir propaganda yapıldı ki artık herkesin bir "köşe dönme" projesi var. Yazılım üretimi bilgisayarın başına programcı otutturup bol gaz vermek ötesinde bir iş. Dolayısıyla içinde "yazılım üretimi" geçen bir iş kurmak isteyenlerin bunu çok iyi hesap etmeleri gerek. En iyi programcılara sahip olunsa da yanlış kurgulanmış bir üretim süreci başarısız olacaktır ve bu kurguyu yapmak asla "programcının işi" değildir. Evet bu konulara önem veren ve yöneticileri bu noktada doğru yönlendirmek isteyen programcılar da var ama ben henüz "anlamayanlara anlatabilene" rastlamadım.

Salı, Aralık 04, 2012

Alt.Net TR DevDays

9 Aralık Pazar günü Bahçeşehir Üniversitesi Beşiktaş kampüsünde Alt.Net TR Grubunun DevDays etkinliğinde buluşuyoruz. Ben de WinRT için Caliburn Micro Framework ile basit bir MVVM uygulaması örneği anlatacağım. Bunun dışında açık kaynak projeler ile ne tür girişimler yapılabileceği ile ilgili fikirlerimi paylaşacağım kısa bir sunumum daha olacak. Etkinlik programını öğrenmek ve katılmak için http://www.eventbrite.com/event/4816216433# linkini ziyaret edebilirsiniz. Salon kapasitesi kısıtlı olduğu ve üniversitenin giriş kapısına isim listesi verileceği için kayıt olmak mecburi.

Eğlenceli ve bilgi paylaşımı ile dolu dolu bir buluşma olacak. Şimdiden iple çekiyorum. Görüşmek üzere!

Cuma, Ekim 12, 2012

Rekabet Kurulu Kararı

Bilindiği üzere açık kaynak projemiz SambaPOS rekabet kuruluna şikayet edilmiş, kurul ön soruşturma yapılmasını uygun görmüş, bir raportör araştırmaları için bize çeşitli konularda sorular yöneltmiş, biz de ilgili soruları cevaplandırıp kararı beklemeye koyulmuştuk. Nihayet beklediğimiz karar elimize posta yoluyla ulaştı.

Şikayetin reddine karar verilmiş. Yani durum lehimize sonuçlanmış oldu.

Karar, şikayetin içeriğini, raportörün yaptığı araştırmanın detaylarını ve değerlendirmeleri içeren 8 sayfalık bir döküman ile birlikte gönderilmiş. Bu sayede biz de şikayetin içeriği hakkında detaylı bilgi alabilme şansına sahip olduk. Raporda bire bir şikayet metnine yer verilmemiş, özet bir şekilde alıntılanmış. Ben de kısaca özetleyecek olursam:

Programı bilgisayar satmak için ücretsiz dağıttığımız, bağış topladığımız, normalde 2,3 bin dolarlara satılan bir programı ücretsiz dağıtarak fiyat kırıcı pazarlama yaptığımız ve onlarca mühendis çalıştıran firmaların personel giderlerini bile ödeyememelerine neden olduğunuz söylenmiş. 

Şikayet edenin kim olduğuna dair bir bilgi yok. Gizlilik talep edilmiş.

İlgili karar bir süre sonra kurulun İnternet sitesinden yayına verileceği için detaya girmiyorum ancak özetlemek gerekirse şikayetin reddedilmesinin iki gerekçesi var.

1. Sitemizde tanıtımı yapılan bilgisayar, yazıcı gibi bazı donanım ürünlerinin satışı ile programın ücretsiz olmasının bir bağlantısı olmadığının anlaşılmış olması.

2. Pazarda hakim durumda olmadığımızın anlaşılmış olması.

Yani rekabet kurallarına göre neymiş sayın personel maaşlarını ödemekte zorlanan yazılım firması?

1. Normalde ücretli olarak verdiğiniz ve piyasada emsalleri satılan bir ürünü çeşitli şartlarla ücretsiz olarak veremezmişsiniz. "Şu sistemi alırsanız 1.000 dolarlık program size bedava" diyemezmişsiniz.

2. Fiyatları belli olan bir ürünü kapalı kapılar arkasında firmaya ya da o anki duruma göre kafanıza göre fiyatlandıramazmışsınız. Hele ki bunu ilgili müşteriyi başka firmalara kaptırmamak için hiç yapamazmışsınız.

3. Bir pazardaki hakim durumunuzun yarattığı avantajı diğer firmaların pazara girmesini engellemeye yönelik kullanamazmışsınız.

İşte bu şikayet gerekçelerini sektörümüzün gerçeklerini çok iyi bilen herkesin insafına bırakıyorum.

Bizler piyasa şartlarının, rekabetin ve yarışın ürün ve hizmet kalitesi bazında gerçekleşmesi gerektiğine, yaptırım gücünün girişimlerin önüne taş koymak için değil haksızlıkları ortadan kaldırmak için kullanılması gerektiğine inanıyoruz. Yolumuza böyle devam edeceğiz.

Elbette raporda kafamızda soru işaretleri oluşmasına neden olabilecek noktalar da var. Bunları profesyonelce araştırmaya ve sonuçları SambaPOS gibi girişimler için de örnek olabilmesi açısından paylaşmaya devam edeceğiz. Ancak en önemlisi gücünü topluluktan alan her proje gibi SambaPOS projesinin de desteklenmesi idi. Bu süreçte projemize destek olan ve katkılarıyla yolumuzu aydınlatmaya çalışan herkese projeye emek verenler adına şükranlarımı sunuyorum.


Pazartesi, Eylül 24, 2012

Ödeme Ekranı Refactoring 1

Altdotnet Türkiye Google grubundan gelen geri bildirimler ışığında SambaPOS üzerinde değişiklikler yapmaya ve yaptığım değişiklikleri dökümante etmeye devam ediyorum. Önceki yazımdan sonra test first geliştirme yapmam önerildi. Hazır yeri gelmişken bu yazıların ilham kaynağı olan ve grupta değerli paylaşımları ile bir çok kişiye yol gösteren Sidar OK dostumuza bir selam gönderelim.

Öncelikle söyleyim bir TDD uzmanı kesinlikle değilim ama takip ettiğim bir konu. Bu yazılarda öncelikli amacım birşeyler öğretmek değil . Amacım öğrenmek ve öğrenirken yaşadıklarımı paylaşmak. İsterseniz siz de yorumlarınızla katkıda bulunabilirsiniz. 

Eveeet konumuz test driven development olayı. Ve belki de test driven meselesinin en kazık konularından biri olan TDD ile geliştirilmeyen bir proje üzerinde test driven development yapmak. Evet bu elbette çok daha zor çünkü muhtelemen sınıflar arasındaki bağımlıklar nedeniyle test etmek istediğimiz sınıfları yapılandırmak (create) bile mümkün olmayacak. Bu nedenle öncelikle test yazmak istediğimiz sınıfı bağımlıklardan kurtarmak ve "Test Edilebilir" hale getirmek gerekecek.

İyi de buna neden katlanalım ? Zaten çalışıyor ne gerek var test edilebilir hale getirip test falan yazmaya?


Bir önceki yazımda da konu ettiğim ödeme ekranına geri dönelim. Yapmak istediğim döviz butonlarından birine basıldığı zaman solda listelenen fiyatları ilgili döviz kuruna göre güncellemekti. Sonuçta basit bir bölme işlemi olduğu için fazla önemsememiştim ama döviz ile ilgili özellikleri yaparken en çok bu kısım ile uğraştım.

Bu liste kullanıcıya ürün seçerek ödeme alma şansı veriyor. Yani aynı masada oturan beş kişi beraber kasaya gelip "ben kola içtim", "ben de pide yedim" diye saymaya başladığında kasiyer kolayca hesap toplamlarını görüp tahsilat yapabiliyor. Buraya kadar güzel ancak programın tasarımı gereği işin içine döviz girince bir kişinin yiyip içtiğini dolar olarak ödemesi diğer kişinin Türk Lirası olarak ödemesi gibi durumlar (case) ortaya çıktı. İşin içine para üstü girdi. Yani benim 12 lira hesabım vardı 15 verdim 3 lira para üstü aldım, arkadaşım turist olduğu için dolar olarak ödemek istedi ve 4 dolarlık hesabını 5 dolar olarak ödedi. Ayrıca 1 lira 80 kuruş para üstü aldı... Kasiyerin gün sonunda kasasını tutturabilmek için her bir para birimininden kasayı ayrı ayrı düzgün hesaplamak gerek. 

Bir de işin içine iskontolar, bahşişleri hesaplamakla ilgili özellikler, kur çarpımından doğan yuvarlamalardan doğan farklar falan girince ipin ucu gerçekten kaçtı ve ben yaptığım hesaplamaların doğru olup olmadığını anlayamayacağım bir noktaya geldim. Test falan yazmamış olduğum için elime hesap makinesini aldım, akla gelecek her durumu tek tek elimle yapıp hesaplayarak kontrol ettim. Allahtan geçmişte yüzlerce kez bu tür hesaplamalar yapan kodlar yazdığım için işin içinden çıkabildim ama bu ekranda yapılabilecek işlemlerin kombinasyonu neredeyse sınırsız olduğu için hatalı sonuç verecek bir işlem yapılabilme şansı var mı bundan emin değilim. Aslında yüzlerce kullanıcı her durumu test edip çıkan problemleri bildiriyor ama ben yapacağım en ufak değişiklikte bile bu hesap makinesi ile doğrulama işini baştan yapmak zorundayım. Aksi takdirde çalışan şeyi bozmuş olurum. Kötü bir durum.

İşte TDD bu problemle başedebilmemizi sağlayan bir yötem. Tam olarak yaptığımız kodu doğru yazıp yazmadığımızı anlamamız için değil. Daha çok çalışan şeyi bozmamak için kullanılan bir yöntem.

Tamam test yazılması gerektiğine ikna olduk ama nasıl yapacağız? Bu ürün seçme işi ilk yazıldığında üç beş satırdan oluışan basit bir özellikti. Bu ekrana eklenen her özellikten sonra bikaç satır daha kod eklendi ve sonuçta elimizde geliştirmesi ve bakımı zor bir kod yığını var. Nereden başlayacağız? 

Öncelikle bir kod parçası inceleyerek problemli noktalara bakalım. Aşağıdaki kod soldaki her bir satırı temsil eden MergedItem sınıfı. Problemli noktaları comment ekleyerek açıkladım.



MergedItem aslında bir ViewModel sınıfı. Ancak zaman içerisinde hızlı kod yazma gerekliliklerinden (!) dolayı normalde bir modelde durması gereken kodlar da içine karışmış. Bu sınıf sadece görüntülenecek Label'ı ve Font görünümünü belirlemesi gereken bir sınıf olduğu halde bazı hesaplamalar da yapıyor.

Normalde ViewModel sınıflarını test etmek zordur çünkü bir MVVM framework'ü kullanıyorsanız çeşitli nedenlerle framework'e bağımlılıklar oluşur ve test yazmak için test context'i içinde framework'ü de kullanıma hazır hale getirmek gerekebilir. Aslında ViewModel sınıfları test edilmesi şart olan özellikler pek içermezler. Sonuçta temel görevi Model sınıfı ile View sınıfı arasında köprü vazifesi görmektir. Asıl önemli kısımlar model içindedirler ve bu nedenle MergedItem sınıfından Model sınıfını ayırmak ve test ile garantiye almak gerekiyor.

Ayrıca bu MergedItem kolleksiyonunu tutan ve kolleksiyon oluşturma işlerini yapan sınıf da PaymentEditorViewModel sınıfı ve bu kısmı ilgilendiren model sınıfını da ayırıp test ile garantilemek gerek.

İşe öncelikle isimlendirmeyi düzelterek başladım. MergedItem yerine Selector isimini ve kolleksiyonu yöneten sınıfa da OrderSelector ismini vermeyi tercih ettim. Testin yazılımı sürecine fazla girmeyeceğim ancak ilk olarak bir belgenin OrderSelector sınıfına aktarılarak Selector sınıflarının oluşturulması ile başladım ve eklemek istediğim her case için bir test yazarak devam ettim. Yazdığım her bir testten sonra yeni sınıflarımın özellikleri birer birer oluştu ve 10 kadar case'i test ederek sınıflarımı tamamladım.  https://github.com/emreeren/SambaPOS-3/blob/master/Samba.Modules.PaymentModule.Tests/PaymentOrderSelectorTests.cs adresinden testlere yukarıdan aşağı bakarak özellikleri ne sırada eklediğim ve sınıfın nasıl kullanılacağı görülebiliyor.

Sonuçta MergedItem sınıfı yerine geçecek Selector sınıfının son hali şu şekilde oldu.


Özelliklerin arabirimlere bağlanması ve diğer görsel işler de SelectorViewModel sınıfı içinde yapılıyor. Bu sınıfın görünümü de şu şekilde.






Eğer dikkatinizi çektiyse bu sınıf çok enteresan özellikler içermiyor. ViewModel sınıfları için test yazılmasa da olur dememin nedeni buydu. Belki Description özelliğinin doğru olup olmadığı veya diğer değerlerlerin doğru formatlanıp formatlanmadığı test edilebilir ama döviz hesaplamalarının doğru olup olmadığı kadar kritik bir konu değil.

Böylelikle iki farklı işi birden yapan bir sınıfı ikiye bölmüş olduk. Veri tutma ve değiştirme işlemlerini bir sınıfa, görünümle ilgili sorumlulukları ise başka bir sınıfa vermiş olduk. Belki bu ayırma işlemini kodu gözle inceleyerek ve yorumlarda belirttiğim yerleri başka bir sınıfa taşıyarak da yapabilirdik ancak burada test yönelimli hareket ettiğimiz için bölünme sihirli bir şekilde kendiliğinden oluşmuş oldu. Bu arada testlerimizi de yazmış olduk. Hatta sürekli dikkat çeken bir görsel problem de arada çözüldü ama onun nasıl çözüldüğünü tam anlamadım. Demek ki bazı kurallara uygun hareket edince yazdığımız kod daha başarılı oluyor.

PaymentEditorViewModel sınıfından çıkan kısımları da commentleyerek submit ettim. https://github.com/emreeren/SambaPOS-3/blob/16d7123ceaf49e0d54621082ed492a35e5eaabb5/Samba.Modules.PaymentModule/PaymentEditorViewModel.cs adresinde görülebilir.

Bu sınıftan ayrıştırdığımız OrderSelector sınıfı da şurada https://github.com/emreeren/SambaPOS-3/blob/16d7123ceaf49e0d54621082ed492a35e5eaabb5/Samba.Modules.PaymentModule/OrderSelector.cs

OrderSelector sınıfı da gayet temiz ve anlaşılır oldu. Ancak PaymentEditorViewModel sınıfı halen fazla büyük ve daha refactoring istiyor. 

Devam edeceğiz.

Commit : https://github.com/emreeren/SambaPOS-3/commit/16d7123ceaf49e0d54621082ed492a35e5eaabb5

Cuma, Eylül 21, 2012

Ödeme Ekranı - Para Üstü Seçimi

Selamlar. Alt.Net google grubunda açtığım ve SambaPOS projesini nasıl daha iyi değerlendirebileceğimi sorduğum bir konuda gelen öneriler neticesinde bazı SambaPOS özelliklerini kodlarken ya da refactoring yaparken yaptıklarımı bloglama gibi bir fikir gündeme geldi. Çok düşündüm ve biryerlerden başlamak adına sıradaki işimi kayda alarak yapmaya karar verdim. Şimdi bir SambaPOS özelliğini hem kodlayacak hem de anlık olarak yaptıklarımı bloga yazacağım.

Buna “Live Development” adını veriyorum. Canlı canlı kodlama yapacağız yani :) Aslında bir anlamda pair programlama yapmış da oluyorum :) Yer yer kısa açıklamalara da yer vererek kullandığım teknolojiler hakkında da bilgiler vermiş olacağım. Belki projenin dökümantasyon eksiğini kapatmak anlamında bir faydası olur.

Burası programın ödeme almak için kullanılan ekranı. Gerekli para birimi, kur, hesap ve para üzeri hesaplama ayarlarını yaptığımız zaman program sol alt kısımda göründüğü gibi belge toplamını çeşitli para birimlerinde hesaplayarak gösteriyor. Eğer müşteri ödemeyi TL olarak değil de Dolar ya da Euro olarak yapmak istiyorsa kullanıcı bu butonlardan birine basarak ödemeyi farklı para birimlerinden alabiliyor. 

Ancak burada şöyle bir durum var. Hesap 17,40 dolar ve müşteri muhtemelen 20 dolar verip para üzeri isteyecek. Müşteriler duruma göre para üstünü dolar ya da TL olarak isteyebiliyor. Bu nedenle tahsilatın hangi para biriminden yapıldığını seçtiğimiz gibi para üstünün de hangi para biriminden yapıldığını seçebilmemiz gerekiyor. 

Bu hesapları yapmak ve ilgili tutarları ilgili kasa hesaplarına aktarmak ile ilgili özellikler zaten yapılmış durumda. Bugünkü işimiz kullanıcının para üstünü hangi para biriminden vereceğini seçebilmesini sağlamak.

Normalde 31.50 hesap varken 50 tuşuna ve Cash tuşuna bastığımız zaman bu 50 Nakit anlamına gelir ve program otomatik olarak para üstünü şekildeki gibi gösterir. Burada direk olarak para üstünü göstermek yerine hangi para biriminden para üstü verdiğimizi seçebilmemiz gerekiyor. 

Öncelikle ödemeyi işlediğimiz kod parçasını inceleyelim.

Seçilen nakit, kredi kartı gibi ödeme tipi PaymentTemplate parametresi olarak fonksiyona geliyor. Ne kadar tahsil edilmesi gerektiğini ve ne kadar tahsil edildiğini GetPaymentValue() ve GetTenderedValue() fonksiyonları ile alıyoruz. Bir yuvarlama işleminden sonra SubmitPaymentAmount() ile ödemeyi kayıt ediyoruz. Bu fonksiyon kullanılan para üstü şablonunu da döndürüyor ve görüntüleyeceğimiz para üstünün para birimini ve kurunu alabilmek için bu değeri DisplayReturningAmount() fonksiyonuna geçiyoruz. Böylece işlem tamamlanmış oluyor. 

Para üstü şablonu (ChangePaymentTemplate) kullanıcının para üstünün hangi para biriminden verilebileceğini belirlemek için yaptığı tanımlar. Yani Dolar ve Euro para üstü vermek isteniyorsa iki tane para üstü şablonu tanımlanacak ve işlem sırasında kullanıcıdan bir tanesini seçmesi istenecek. Şu anki durumda sadece bir para üstü şablonuna izin verildiği ve şablonun tanımlanmış ya da tanımlanmamış olmasına göre işlem yapıldığı için bu SubmitPaymentAmount() fonksiyonundan sonuç olarak dönüyor. Bu nokta problemli çünkü eğer şablon sayısı birden fazlaysa bunu kullanıcıya seçtirmek gerek. 

Kodu şöyle değiştirdim.


Öncelikle fonksiyonun Para Üstünü görüntüleyen kısmını SubmitPaymentAmount() fonksiyonuna taşıdık. GetChangePaymentTemplates() fonksiyonunu ise buraya alarak tanımlanmış tüm para üstü şablonlarını döndürecek şekilde düzenledik. Son olarak da eğer şablon sayısı birden faza ise ChangeTemplates kolleksiyonunu oluşturarak görüntüleyeceğimiz para üstü düğmeleri için gerekli veriyi hazırlıyoruz ve IsChangeOptionsVisible değişkenini true yaparak düğmelerin görüntülenmesini sağlayacağız.

Burada ChangeTemplates kolleksiyonu hakkında kısa bir bilgi verebiliriz. CommandButtonViewModel bir düğme için gerekli veriyi tutan bir jenerik sınıfımız. Düğme başlığını, düğmeye tıklantığında çalışacak ICommand implementasyonunu ve ICommand'a geçilecek parametreyi tutuyor. 

ICommand arabirimini gerçekleyen sınıflar WPF'de düğme gibi Command özelliği içeren kontrollere direk olarak bağlanabilirler. ViewModel e Command olarak tanımladığımız _selectChangePaymentTemplateCommand sınıfının yapılandırılması şöyle.


Çalıştırıldığında OnSelectChangePaymentTemplate() fonksiyonuna Parameter olarak belirlediğimiz PaymetData nesnesini parametre olarak geçerek çalıştıracak. PaymentData o anki tahsilat değerlerini OnChangePaymentTemplate fonksiyonuna geçmek için tanımladığımız bir sınıf. 

Bir para üstü seçildiğinde SubmitPaymentAmount() seçilen para üstü şablonu ve diğer tahsilat verilerini alarak çalışacak.

Kod kısmında yapacaklarımız bu kadar.

Şimdi Para Üstü seçimi düğmelerinin görüntülenmesini sağlayacağız. 

Bu XAML kodu ChangeTemplates kolleksiyonuna bind edilmiş bir ItemsControl kontrolü tanımlar. ChangeTemplates kolleksiyonu tanımlı para üstü şablonlarını içeriyordu. ItemsControl ise kolleksiyon tipinde veriye bağlanan bir kontroldür.

ItemsControl.ItemTemplate bölümünde kolleksiyonun her bir elemanı için olşturulacak kontrolü ve veri bağlantısını tanımlıyoruz. Burada her bir şablon için bir FlexButton yaratılacak ve her bir FlexButton ChangeTemplates kolleksiyonunun içerdiği her bir CommandButtonViewModel nesnesinin özelliklerine bağlanacak (bind). 

ItemsControl.ItemsPanel bölümündeki tanımlama ise oluşan düğmelerin tek bir satırda mevcut alana sığdıracak bir UniformGrid içine ekleneceğini belirliyor. 

En dışarıda ise görünüp görünmediği IsChangeOptionsVisible özelliğine bağlı bir Border var. Bir ağaç yapısı şeklinde. En dışta bir Border, içinde bir ItemsControl ve ItemsControl'e bağlı kolleksiyonun (ChangeTemplates) her bir elemanı için bir FlexButton oluşacak. Border'ı gizlediğimizde içerideki düğmeleri de gizlemiş olacağız.

Sonuç olarak Dolar tahsilatina geçip 4,97 tutarındaki belge için 5 dolarlık bir tahsilat yaptığımızda para üstünün hangi para biriminden verileceği aşağıdaki gibi sorulmuş oluyor.


Burada Dollar Change ya da EuroChange seçeneklerinden birini seçerek para üstünün hangi para biriminden verildiğini belirlemiş oluyoruz.

Tabii para üstü şablonu isimlerini kullandığımız için Dollar Change gibi isimler görüyoruz. Buna göre direk olarak para üstünün ne kadar olduğunu göstermemiz biraz daha pratiklik sağlayacaktır. Bunun için CommandButtonViewModel nesnesini oluşturduğumuz yerde Caption özelliğini para üstünü hesaplayarak atayabiliriz.

Kodumuzun son hali böyle. CommandButtonViewModel sınıfının Caption özelliğine para üstünü hesaplayarak yazıyoruz. Böylelikle kullanıcı ne kadar para üstü vermesi gerektiğini anlamış oluyor. 


Son iki satırda ekran kontrollerine bağladığımız özelliklerde değişiklikler olduğunu ve güncellenmesi gerektiğinden WPF'i haberdar ediyoruz :) Tabi kodu kısa tutmak için böyle yaptım. Normalde ChangeTemplates kolleksiyonunu ObservableCollection tipinde tanımlamak ve her seferinde yeni bir kolleksiyon oluşturmak yerine kolleksiyonu temizleyip yeniden oluşturmak gerek. Ayrıca IsChangeOptionsVisible özelliğinin güncellenmesini özelliğin set metodu içinde yapabiliriz.

Bu ufak değişiklikleri ve kodun son halini incelemek için https://github.com/emreeren/SambaPOS-3/blob/master/Samba.Modules.PaymentModule/PaymentEditorViewModel.cs adresini ziyaret edebilirsiniz.



















9 TL'lik satış 4.97 dolar ediyor. Müşteri 10 dolar veriyor ve para üstünü Euro istiyor. Sonuçta €4.29 para üstü vermemiz gerekiyor. Belgenin alt toplamından göreceğimiz gibi Dolar kasamıza 18,10 TL karşılığı dolar girmiş, Euro kasamızdan da 9,10 TL değerinde Euro çıkmış oluyor. Mükemmel!

Bu arada farkettim bu sınıf bayağı bir büyümüş. Ekran elemanlarını farklı UserController (View) içine
taşıyarak ilgili metodları farklı ViewModel sınıfları içine taşımanın zamanı yaklaşmış...

Başka bir Live Development yazısında görüşmek üzere.

Perşembe, Ağustos 30, 2012

İnternette Yaşamak

Ani bir kararla gerçek hayat işlerinden elimi ayağımı çekip tamamen internet ortamında çalışmaya başlayalı uzun yıllar geçmiş. Birçok kez vazgeçmek, bir yerlere saklanıp ortadan kaybolmak istesem de bu süreçte edindiğim güzel tecrübeler yılmadan yola devam etme gücü verdi. Peki bu süreçte neler öğrendim? Bu yazı yaşadığım bazı tecrübeleri kayda almak ve dostlarımla paylaşmak için. Hem kimse okumasa da belki bir gün kızım okur :)

Hayaller ve Korkular

Hayat tıpkı bir yolda yürümek gibi. Adımlarımızı bazen ileri doğru, bazen de geri geri atıyoruz. Ne yönde adım atacağımıza her karar verişimizde bizi şu iki duygudan birisi etkiliyor. Hayal ettiğimiz şeylere ulaşmak ya da korktuğumuz şeylerden kaçınmak. Bir karar almam gerektiği zaman alternatif kararlarımı bir yere yazıp düşünüyorum. Korkularımın etkili olduğu kararları elediğim zaman genellikle geriye sadece tek bir seçenek kalıyor. İleri doğru adım atmak.

Hayatımı İnternet ortamında kazanmak bundan birkaç sene önce benim için bir hayaldi. O zamanlar bulunduğum konumu kaybetmemek ve hayallerimin beni etkilemesine izin vermemek için uzun süre kaçtım. İnkar ettim, uzak durdum, başkalarını, ailemi, çevremi bahane ettim. Bazen çeşitli adımlar atmaya kalksam da risklerden uzak durma çabam sadece yerimde saymama neden oldu. O an belki de hayatın bir cilvesiydi ama bir gün kendimi istediğim şeyi yapmaya mecbur bırakmak için cesur kararlar vermek zorunda kaldım.

Geriye bakıyorum ve şunu görüyorum. Başarı sadece istediğin ve sevdiğin şeyleri yaparak elde edebildiğin bir şey. Kendi kendini yapmak zorunda bıraktığın şeyleri yaparak sadece bir gün her şeyin daha iyi olacağını umut edebilirsin. Ama bu asla olmaz.

Öğrenmek

Hayat yolunda yürürken yolumuzu kaybetmemek için öğrenmemiz gereken ne kadar çok şey var. Normalde öğrenmem gerektiğini hissettiğim zamanlarda bir şeyler okurum ve sonuçta kendimi bilgilenmiş hissetmek isterim. Ancak nedense zaman zaman okuduğum şeyler bana kendimi cahilmişim gibi hissettiriyor. Bu işte bir problem yok mu? Var. Bilimsel içeriği konu dışı bırakırsak "öğreten" yazılar kulağa bilmemiz gerekenleri söylüyormuş gibi gelseler da aslında sadece duymak istediklerimizi söylerler. Gerçekten bilmemiz gerekenleri okuyarak değil yaparak öğrenebiliriz. Yazılı şeyler ilk adımı atmak, üretim sürecinde işimizi kolaylaştırmak veya çeşitli tecrübelerimizi pekiştirebilmemiz için varlar.

Şunu anladım ki okuyarak aşçı, yüzücü veya şoför olunamıyorsa girişimci veya programcı da olunmaz. Harekete geçmeyişimiz ve kendimizi sürekli takipçi olmak durumunda bırakmamız aslında bir arayış içinde olduğumuzun göstergesi. Neyin arayışı bu? Genellikle varmak istediğimiz noktaya nasıl gideceğimizi bilmiyorsak bu sarmalın içine düşeriz. Bu noktadayken okuduklarımız içimizde sadece "hiç bir şey bilmediğimiz" veya "yetersiz olduğumuz" gibi hisler uyandırır. Kolları sıvayıp işin içine dalmadan bizim için en doğru yolu bulabilmek mümkün değil.

En uzağı görmenin en güzel yolu oraya en yakın noktaya gitmektir. İleri doğru attığımız her adım bizi o noktaya biraz daha yakınlaştırır.

Sınamak

Çeşitli şekillerde birçok şey öğreniriz ama bunlar her zaman doğru şeyler olmazlar. Neyi yanlış bildiğimizi anlamadan doğrusunu öğrenmek mümkün mü? Değil. Her dersin sonu bir sınav. Sınavlardan hep kaçarız ancak aslında sınavlar neyi yanlış bildiğimizi anlamamız ve kendimizi geliştirebilmemiz için varlar. Hangi konuda başarılı olmak istiyorsak kendimizi sürekli sınamamız ve geri dönüşleri değerlendirerek kendimizi düzeltmemiz gerek. Program yazdıysanız kullansınlar, yemek yaptıysanız yesinler, fotoğraf çektiyseniz görsünler. Kötü yorumlar moral bozar ve canımızı sıkar ama asıl problem eleştirilerle nasıl başedileceğini ve bunların olumlu yönde nasıl kullanılacağını bilmemek.

Belki de eleştiriden kaçtığım için aylarca hiç gün yüzü görmemiş ürünler üzerine çalıştığım ve ürünlerimi eleştirilecek hiç bir eksiği kalmayacak hale getirmek için kendimi parçaladığım dönemlerim oldu. Neden bilmiyorum ama zihnimizin bir taraflarında kendini kapatarak aylarca çalışıp mucize bir ürünle ortaya çıkan bir dahi insan profili var. Ne zaman buna teşebbüs ettiysem başarısız oldum. Uzun süre ürünümle baş başa kalmak yerine kısa aralıklarla oraya bir şeyler koyarak yaptığım işlerde başarı kazandım.

DIY (Do it yourself)

DIY geleceğin yaşam tarzı. Bu yaşam tarzında hazır ürünler kullanmak yerine birçok eşyamızı kendi zevkimiz ve ihtiyaçlarımıza göre kendimiz üreteceğiz veya özelleştirebileceğiz. Örneğin 3D yazıcılar ucuzlayarak hızla yaygınlaşacak ve biz birçok küçük ürünü kendi evimizde kendi kendimize üreteceğiz. Giydiğimiz kıyafetler renk veya desen değiştirebilecek. Yaşam alanlarımızı ve eşyalarımızı az bir çaba ile farklı şekillerde kullanabileceğimiz şekilde değiştirebileceğiz. Bu nedenle büyük sanayi tesisleri bitmiş ürünler yerine IKEA gibi tam olarak bitmiş bir ürüne dönüşmemiş ürünler üretecekler ve üretimin son aşaması evimizde veya işyerimizde kendi ihtiyaçlarımıza göre tamamlanacak. Ayrıca iletişim teknolojileri de gelişmeye devam edecekler. Tüm cam yüzeyler esnek ve yeniden tasarlanabilir dijital ekranlar haline dönüşecek. Dijital gözlükler veya benzer görsel aparatlara entegre olabilecek. Cep telefonumuza program yükleyebildiğimiz gibi arabamıza, televizyonumuza ve belki de mutfak robotumuza bile programlar yükleyebileceğiz ve bu cihazları birbiriyle konuşturabileceğiz.

Bu yaşam tarzı yaygınlaştıkça insanlar kendi ihtiyaçlarına ve isteklerine özel ürünlere ve hizmetlere daha çok ilgi duyacaklar. Bu nedenle her alanda hizmet sektörü diğer sektörlere göre hızla büyüme gösterecek. Ayrıca insanlar benzer ürünleri kullanan insanlarla iletişim halinde olmak, fikir alışverişinde bulunmak ve ürünlerini en verimli şekilde nasıl kullanabileceklerini öğrenmek isteyecekler. Örneğin günümüzde cep telefonu kullanıcılarının oluşturdukları fikir alış verişi toplulukları gibi topluluklar gelecekte popülerliklerini git gide arttıracak. Tüketim kültürü hızla popülerliğini kaybederek yerini üretim kültürüne bırakacak. Fabrikaya yakın yaşam tarzına gerek kalmayacağı için şehirler daha geniş alanlara yayılacak, binaların katları azalacak ve her bina ihtiyaç duyduğu enerjiyi kendi üretecek.

Böyle bir dünyada ürünlerimiz kullandıkları ürünleri kendi ihtiyaçları ve deneyimleri doğrultusunda kişiselleştirebilmek isteyen insanlara hitap etmeli.

Üretmek

Özgün fikirlerin bir işe dönüşmesinin kabaca üç aşaması var. Birinci aşamada (prototip) üzerinde çalıştığımız fikir temel işlevi yerine getiren bir ürüne dönüşür. Bu aşama ürün en temel işlevini yerine getirdiği ama çok detaylı olmayan bir durumdadır. Örneğin Facebook ilk popüler olduğu dönemlerde "duvar, fotoğraf galerisi" gibi uygulamalara bile sahip değildi ama diğer kullanıcılarla arkadaş olunabiliyor ve iletişim kurulabiliyordu. İkinci aşamada (geliştirme) ürün bir kullanıcı kitlesine kullandırılır ve geri dönüşler ile geliştirilir. Ürünün iş yapıp yapmayacağı bu aşamada anlaşılır. Facebook'un sadece Harward kampüsünde kullanılabildiği ve çekirdek kullanıcı kitlesinin oluştuğu dönem bu dönemdir. Üçüncü aşama (yayma) ise ürünün geniş kullanıcı kitlelerine yaygınlaştırılması aşamasıdır. Yine Facebook örneğinden devam edersek bu dönem ürünün ilk ciddi yatırımını alıp dünya çapında yayıldığı dönemdir.

Ben hep işin başında çok para gerekirmiş gibi düşünürdüm ama aslında İnternet ve yazılım projeleri genellikle ilk iki aşamayı neredeyse bedavaya geçebilecek türde işlerdir. Projelerin gerçek anlamda para ile ilişkisi üçüncü aşamada başlar. Ürünün geleceği açısından en önemli aşama ikinci aşama. İkinci aşama sırasında ürünün çekirdek kullanıcı kitlesi oluşur. Bu aşamada ürüne ilgi duyan kitle ürünün yaşam süreci boyunca projeye hep yakın durur ve ürünün ayakta kalmasına büyük katkıda bulunur. DIY düşünce modeline yakın kullanıcılar temel fikrin iyi bir fikir olması durumunda ürünün geliştirilebilmesi konusuna ilgi göstereceklerdir. Bu kullanıcı kitlesinin projeye nasıl katkıda bulunabileceği ve nasıl bir iletişim ortamı kurulabileceği üzerine iyi düşünmek gerek.

Özgün Fikirler

Mevcut bir işi yeniden tanımlayarak daha iyisini yapmaya çalışıyorsak ya da tamamen yepyeni bir fikir üzerinde çalışıyorsak özgün bir iş geliştiriyoruz demektir. Çekirdek kullanıcı kitlesi özün ürünler için hayati önem taşır çünkü bu kitle geri bildirimleri ile ürünü prototip halinden işe yarar bir ürün haline dönüştürür. Ürünün geliştirme aşamasını başarıyla atlatabilmek için ürünle ilgilenebilecek kesime ulaşabilmek ve İnternet'in olanaklarını kullanarak sürekli temas halinde kalmak, geri dönüşleri toplamak gerek.

Geliştirme aşamasında azimli olmak elbette büyük önem taşır ama ürün mantıklı bir sürede gelişim göstermiyorsa inat etmeye, isyan etmeye, hayata küsmeye hiç gerek yok. İyi girişimci nerede başlaması ve nerede son vermesi gerektiğini bilir. Birkaç kere başarısızlık yaşamak gelecekte başarılı olacak işlerin altına imza atabilmek için gerekli tecrübeyi kazandırır.

Bir geleceği olmadığını bile bile sırf duygusal nedenlerle devam ettirdiğim projelerim oldu. Maalesef olması gerekenden daha fazla zaman kaybetmek dışında bir kazancım olmadı.

Klonlamak

Üretim kültürünün yeterince gelişmediği toplumlarda klonlama yöntemi ile iş geliştirmek daha mantıklı bir yaklaşım olabilir çünkü özgün fikirlerimizi hayata geçirebileceğimiz topluluklara ulaşmak "Kendin Yap" kültürüne uzak toplumlarda çok daha zor. Türkiye toplumunda Endüstri Çağından kalma "Hazırı Kullan" kültürü çok daha yaygın. Hazır ürünler tüketmek isteyen kullanıcı kesimi ile çalışarak "Gelişim" aşamasını atlatmak çok zor. Bu nedenle bu konuda daha ileride olan toplumlardan gelişimini tamamlamış yani ikinci aşamayı atlatmış ve üçüncü aşamanın hemen başındaki projeleri olduğu gibi kopyalamak daha kolay.

Şu sıralar Türkiye'de klonlama işinin altın çağını yaşıyoruz çünkü klon projeleri prototip ve geliştirme aşamalarına gerek kalmadan direk yatırım gücüyle hayata geçirebilmek mümkün. Yurt dışında ilgi gören hemen her projenin bir klonu muhakkak Türk girişimciler tarafından yapılıyor. Ancak İnternet projeleri sadece sayfa görüntüsünden oluşan işler değil. Sayfanın arkasında çalışan bir sistem var ve klonlayan girişimci açısından en zor olan şey klonladığı işin arka tarafında neler döndüğünü anlayabilmek. Bu nedenle sitenin çalışma şeklini klonlamak çoğu zaman yeterli olmaz ve başarısızlıkla sonuçlanır. İşin nasıl yürüdüğü tam olarak belli olmayan işleri klonlamaktan kaçınmak gerek. Hatta belki de artık klon işlerden tamamen uzakta durmak gerek. Artık girişimciler için hedef pazarlar tüm dünya kullanıcıları olmalı. Bunun için özgün projelere ihtiyaç var.

Pazarlamak

İnternet üzerinde çalışmayı düşündüğümüz andan itibaren Dijital Pazarlama diye bir şey karşımıza çıkar. Reklam vermek, SEO yapmak, online itibarımızı yönetmek falan filan gerek. İnsan bunlara odaklandığı zaman bir süre sonra hedef kitlesini tıklama sayıları, reklam gösterim oranları, grafikler, beğenme sayıları olarak algılamaya başlıyor. Halbuki hedefimiz iyi istatistiklere sahip olmak değil. İnsanlar için çalışıyor, insanlar için üretiyoruz. Kabloların ardındakilerin insan olduklarını unutarak sayıları görmeye başlamak sonu hüsranla bitecek bir sürece girdiğimizin işareti. Ne zaman "etkili bir taktik" öğrenip uygulamaya kalksam hep başarısız oldum.

Etkili tek bir taktik var. Hedef kitlemiz için faydalı şeyler üretmek. İnsanlar "iyi ki bu ürünü bulmuşum" diyorsa doğru yoldayız demektir.

Yatırım

Şu günlerde çok farklı şekillerde reklam ediliyor olsa da yatırım asla ve asla fikir aşamasındaki bir ürünü hayata geçirebilmek için kullanılmaz. Para bir fikri ürüne dönüştürecek zekaya sahip değil. Bunu kendimiz, kendi olanaklarımızla yapmalıyız. Yatırım almak için en güzel zaman ikinci aşamada kendini ispatlamış bir projenin üçüncü aşamaya geçiş noktasıdır. Bu noktada iyi düşünmek gerek. Projeye göre değişir ama çok erken ya da çok geç kalmak genellikle olumsuz sonuçlar doğurur. Ayrıca kimi yatırımların projeye olumlu katkısı olabileceği gibi olumsuz katkısı da olabilir.

Nasıl ki emlak işi yapanların mesleği gayrimenkulleri değerlendirip satmaksa melek yatırımcıların da mesleği şirketleri değerlendirip hisselerini satmaktır. Olanaksızlıklar nedeniyle motivasyona, gaza getirilmeye ihtiyaç duyduğunu düşünen girişimci kesimi var ve bu kesim ihtiyaç duydukları şeyin yatırımcının ellerinde olduğuna inanıyor. Yıllar boyu bizimle kader birliği yapıp birlikte çalışacak kişilere yatırımcı değil ortak denir. Bir kesimin asıl problemi iyi ortaklar bulmak. Daha büyük bir kesimin ise asıl problemi ürününün henüz kullanıcılar ile buluşmamış olması. İşi detaylarından arındırıp hızlı bir şekilde kullanıcıların beğenisine sunmak gerekli motivasyonu sağlar.

Yatırım eğer ne olduğu iyi biliniyorsa ve doğru kullanılabilirse iyi sonuçlar verebilir.

Başarısızlık Ekonomisi

Herhangi bir konuda başarılı olmak isteyip başarısız olan insanlar çok kolay para harcarlar. Örneğin kilo vermek isteyen, kendini geliştirmek isteyen, zengin olmak isteyen hatta belki de programcı veya fotoğrafçı olmak isteyip de başarısız olan insanlar başarısızlıklarını kabullenmezler ve "İşin sırrını bilmedikleri" için başarısız olduklarına inanırlar. Örneğin zayıf insanların mucize bir hap kullandığına, zenginlerin az bilinen bir formülü bildiklerine veya iyi fotoğrafçıların x marka fotoğraf ekipmanı kullandıklarına inanabilirler. Halbuki asıl problem sadece gereken çabayı göstermemiş olmaktır. Başarısızlıklara bahane arayışından olsa gerek bu kesim dedikodulara, sansasyonlara, fiyaskolara ilgi duyar. Şansın rolüne ya da başarının anahtarını satın alabileceğine inanır.

İnternet başarısız insanlar üzerinden para yapmak isteyen girişimciler için bir cennet. Bu insanların temel özelliği "kolay yoldan başarıya ulaşmaya" aracılık ediyor görünmeleri. Çok klasik bir ticaret yöntemi olduğu için sistem hep aynı çalışır. Öncelikle başarı ölçütü olarak ortaya bir şeyler konur. Bu rol model kaslı bir insan, başarılı ya da zengin bir kişi olabilir. Sonra ya bu ölçütlere uyan insanlar örnek gösterilir ve yalan yanlış fikirler kulaktan kulağa yayılır.

Bu kanaldan yayılan fikirler ve sunulan imaj kimi zayıf bünyeler için tehlikeli olabilir. Bunlar bizleri yanlış yolda olduğumuzu düşündürebilir veya ihtiyacımız olmayan şeylere ihtiyacımız olduğuna inandırabilir. Umutsuzluğa ve yanlış inanışlara kapılmamak için bunlardan uzak durmak, kaçınmak, korunmak gerek. Normalde bir girişimcinin aklında "x sayıda kullanıcıya ulaşmak", "y pazarına açılmak", "z aşamasını tamamlamak" gibi hedefler olması gerek. Hedeflerimiz arasında "x kişisi gibi olmak", "y para yapmak", "z gibi yaşamak" varsa yanlış bir yolda ilerliyoruz demek.


Kurallar

Şartları, kuralları ve engelleri hakimiyeti elinde tutmak isteyenler koyarlar. Bunların büyük çoğunluğu da fiziksel engellerden ziyade kulaktan kulağa yayılan, akıl yürütmeye dayalı fikirsel kurallardır.

Bunu anlaması çok basit. Eğer bir işin nasıl başarılı olabileceği yerine neden başarısız olacağını düşünüyorsak zihinsel engellerin etkisindeyiz demektir. Etrafımızda bize çeşitli fikirler veren birileri hep olur. Bu kişiler kısa süre içinde "neden olmaz" konulu onlarca fikir ortaya koyabilirler. Ancak "nasıl olur" konusunda hiç bir şey söylemezler. Bu kişiler de kendi koydukları fikirsel kurallar ve engellerin etkisindedirler. Söyledikleri şeyler bazen ilgi çekici olsa da vakit kaybından ve moral bozmaktan başka bir işe yaramaz.

Telefon yapacaksanız dumanla haberleşen ve bundan ekmek yiyen kesim itiraz edecektir. Çünkü her yenilik eski kuralları yıkar ve yeni kurallar koyar. Bu nedenle büyük işler yapabilmek için öncelikle işe zihinlerimize işlenmiş tüm engelleri yıkarak başlamak gerekir.


Para

Hadi gözlerimizi kapatıp güçlü bir insan hayal edelim desem muhtemelen bindiği cipten, oturduğu çiftlik evine, giydiği kıyafetten, ortalıkta gezinen kara gözlüklü ve kulaklıklı korumalara, evin havuzunun büyüklüğüne ve hatta içinde yüzen güzel kızlara kadar hemen herkesin gözünün önüne benzer bir imaj gelecektir. İşte hayallerimize bu görüntüleri işleyen kültür popüler kültürdür. Ve popüler kültürün temel amacı bizlerin daha çok tüketmesi ve daha çok borçlanmasıdır. Bu dönemin slgoanı "kendini şımart" olmuştur. 12 taksitle kendimizi şımartarak ve bunları feyste paylaşarak yaşıyoruz.

Çünkü popüler kültür zihinleri ele geçirdikten sonra insanlar kendilerini eserleri ile değil sahip oldukları şeyler ile ifade etmeye başladı. Örneğin bir kişi BMW SLX'e biniyorsa o kişinin iyi bir programcı, iyi bir fotoğrafçı ya da mesleği her neyse o konuda iyi olduğu önyargısına sahip oluyoruz. Bu nedenle kendimizin de başarılı olduğumuzu göstermek için bu tür ispatlar gerektiğini düşünüyoruz. 

Halbuki başarılı insanları yaptıkları eserlerle tanırız. Aklımızdan on isim geçirsek dokuzunun isminin ardından gelen bir eseri muhakkak vardır. Bu insanları kazandıkları para ile ölçmeyiz.

Aslında para veya paranın satın alabildiği şeyler hiç bir zaman bir hedef ya da herhangi bir ölçü olmadı. Para sadece başarı ile elde edilebilen bir sonuç. Bir ödül. Bir yarışın sonunda takılan altın madalya ya da yıl sonunda verilen takdirname gibi. Amacımız altın madalyayı elde etmek değil yarışı birinci sırada bitirmek olmalı. Madalya zaten istemesek de peşinden gelir.

Eğer olur da bir gün biri size "gelir modelin nedir?" diye soracak olursa hemen oradan kaçın. Herkesin gittiği restorandan, herkesin dinlediği müzikten, herkesin girdiği internet sitesinden ya da herkesin kullandığı programdan nasıl gelir elde edileceği zaten aşağı yukarı bellidir. Asıl sorulması gereken soru "bu ürünün faydası nedir?" olmalıdır.

Ne zaman kazançlara odaklandıysam önce mutsuz oldum sonra da para ve prestij kaybettim. Ne zaman fayda üretmeye odaklandıysam heyecanlandım, mutlu oldum, prestij kazandım ve ben farkında bile değilken para da kazandım.

Sonuçta benim geldiğim nokta şudur. İyi para kazandıracak bir fikriniz olduğunu düşünüyorsanız hemen unutun gitsin. Gerçekten iyi fikirler iyi dostlar ve iyi müşteriler kazandırırlar.

Mutlu Olmak

Allah bizleri faydalı şeyler ürettiğimizde ve aile kurduğumuzda gerçekten mutlu olabileceğimiz canlılar olarak yaratmış. Bizler tüketerek mutlu olabileceğimize inansak da insanoğlu mutlu olabilmek için ihtiyaç duyduğu tatmin duygusunu sadece üreyerek ve üreterek yaşayabilir. Buna ister doğa düzeni istersek başka bir isim verelim kurulu düzen böyle işliyor. Ancak gerçekleri kabullenmedikleri için sahte mutluluğun peşine takılan insanlar aile kurmaktan ve fayda üretmekten uzakta duruyor. Habire tüketiyor, bu şekilde gerçekten tatmin olamadığı için daha çok tüketiyor ve gerçek mutluluktan daha çok uzaklaşıyor.

Bir tarafta milyonlar içinde yüzdüğü halde genç yaşta mutsuzluk hastalığına yakalanan, batağa saplanan ve perişan olan insanlar var. Diğer tarafta da evlat edindiği çocuğun down sendromlu olduğunu öğrendiği zaman onu terk etmeyen, deprem olduğunda yedek battaniyesini bir kutuya koyup gönderen, kar yağdığında insanlar kayıp düşmesin diye evinin önünü temizleyen, cebindeki üç beş kuruşu muhtaçlarla paylaşabilen insanlar var.

Bu insanlar nasıl oluyor da para denizinde boğulan insanlardan daha çok mutlu olabiliyorlar? Çünkü iyi şeyler yaptığımız zaman mutlu olabilme duygusuyla yaratıldık. İnanalım veya inanmayalım bütün kafa karıştırıcı kirliliğe rağmen dünya gizli kahramanlar, anneler, babalar ve dostlar sayesinde ayakta durabilmektedir.


Cuma, Temmuz 20, 2012

İki soru, iki cevap

O çok sıcak günde Eskişehir seyahatimizin sonuna gelmiş ve artık dönüş trenimizin saatini beklerken Sevgili arkadaşımız Güven'in Google+ mesajını okudum. Şurada ve burada projemizin şikayet edilmesi ile ilgili çeşitli tepkiler vardı. Hepsini tek tek okudum ve bazı konulardaki fikirlerimi paylaşmak istedim.

Neden Linux değil de Windows için yaptım?

SambaPOS'u windows için geliştirdim çünkü C# dilini biliyorum ve hitap ettiğim sektörde Windows uygulaması ile daha çok kullanıcıya ulaşabileceğimi düşündüm. Elbette en doğru olanı özgür bir yazılımı özgür bir işletim sistemi üzerinde çalıştırmak. Sanırım Linux üzerinde geliştirmeye karar verseydim Java kullanırdım ve benim için de iyi bir tecrübe olurdu ancak bu tür bir program için .net ve wpf kullanmak çok cazip geldi. Bazen Linux ile başlasam daha geniş bir programcı kitlesine ulaşabilirdim ve belki de proje daha iyi noktalara gidebilirdi diye düşünmüyor da değilim. Gerçekten de hem C# konusunda bilgili hem de açık kaynak geliştirme konusuna ilgi duyan kişi sayısı çok az. 

Neden satabileceğim bir programı bedava dağıtıyorum?

Bir Gölünüz var diyelim. İster yolu keser geçen herkesten para kesersiniz, ister göle girişi bedava yaparsınız ve ekstra ürünler veya hizmetler sunarak para kazanırsınız. Konuya sadece cebe girecek para açısından bakarsak elbette en kolayı yol kesmek. Ekstra şeyler yapmak, yenilikler falan geliştirmek zor iş. Hele ki bütün göl sahiplerinin aynı şeyi yaptığı bir ortamda bu tatlı rekabet iyi para kazandırır. Ancak herkes konuya bu açıdan bakmayabilir. Bizler her işletmede standart olan işlemlerin yapılabilmesini sağlayacak kapsamdaki ürünlerin ücretsiz alternatiflerinin olması gerektiğini düşünen kişileriz. Yani istiyoruz ki her restoran hesaplarını bilgisayarda takip etsin. Bu sistemler en ücra yerlere kadar yaygınlaşsın. Standartların dışında istekleri, beklentileri, planları olan restoranlar da ücretli ürünlerden ve hizmetlerden faydalansın. İnanıyoruz ki sektörü büyütmenin yolu kısıtlamalar koymak değil giriş engellerini ortadan kaldırmak.

Bilişim çağımızın kültürüdür, yaşam tarzıdır. Bu alanda fırsat eşitliği yaratmak ve toplumun her alanında yaygınlaştırmak hepimiz için en hayırlısıdır. 

Cuma, Temmuz 13, 2012

Github'a geri döndük.

Bir süredir SambaPOS V3 sürümünü kendi sunucumuza kurduğumuz VCS üzerinde geliştiriyorduk. Bunu yapmaktaki amacım güncel kaynak kodların durduğu VCS sistemini sadece bizden erişim talep edenlere açmak ve kamuya açtığımız kodların bir iki ay geriden gelmesini sağlamaktı. Bu sayede programın adını değiştirip farklı isimlerle satmaya çalışanların işini zorlaştıracağımızı düşünmüştük.

Artık bundan vazgeçtik ve eskisi gibi https://github.com/emreeren/SambaPOS-3 adresinden buradaki issue listesine bağlı kalarak devam ediyoruz. Bundan vazgeçmemizin iki nedeni var. Birincisi kodlara erişimi zorlaştırmaya çalışmak yerine GPL koşullarına uymayanlarla yasal yollarla mücadele etmenin yollarını aramaya karar verdik. İkincisi de malum nedenlerle ne olur ne olmaz şeklinde düşünerek projenin son halinin herkesin ulaşabildiği bir yerlere durmasının daha iyi olacağını düşündüm.

Son günlerde yaşadıklarım üzerine tekrar tekrar düşününce aslında projeyi kopyacılardan korumak için düşündüğüm fikrin tam olarak karşı olduğum zihniyet olduğunun farkına vardım. Demek ki bu zihniyet genlerimize işlemiş. Hayret.

Cumartesi, Temmuz 07, 2012

Açık Kaynak projemiz SambaPOS’u ücretsiz dağıtıldığı için Rekabet Kuruluna şikayet eden yazılım firmasına cevabımdır


Google'da arama yaparken, Facebook'da ücretsiz şirket sayfası açarken, Androidli telefonundan müşterini ararken, bilgisayarına beleş beleş programlar indirirken kullandığın şeylerin ücretsiz yazılımlar olduğunu hiç umursamadın. Programını yazarken, sağdan soldan bulduğun kodları programına eklerken açık kaynak çok güzeldi. Bunları adamlar niye bedavaya koymuşlar diye düşünmedin bile. Stackoverflow da sorularına cevap ararken, Web Sunucularında Linux, Web sitende Joomla kullanırken, PHP ile kodlar yazarken her şeyden bedavadan faydalandın. Bu programlar sayesinde işlerini geliştirdin, tatlı tatlı büyüttün. Hatta muhtemelen şimdi bu yazıyı da beş para ödemeden kullandığın bir browser ile okuyorsun. Şu saate kadar ücretsiz programlara hiç sesin çıkmadı da şimdi ne oldu gittin devlet kapılarında SambaPOS ücretsiz dağıtılıyor diye şikayet ediyorsun?

Bilmiyor musun ki ücretsiz yazılımlar olmasa bir restorana 20.000 dolara bile bir POS kuramazsın. Bedavaya bir zip dosyası açamazsın. Bir internet sayfası bile görüntüleyemezsin. Senin adisyon açan programın program da; zip dosyası açan program değil mi? Restoran otomasyon sektöründe haksız rekabet var demişsin. Veri sıkıştırma ve yedekleme sektörü sektör değil mi? Bundan ekmek yiyen adam yok mu? Biliyorsun bunları, çok çok iyi biliyorsun ama onlar işine geliyor, SambaPOS olunca işine gelmiyor.

Tamam şikayet etmek vatandaşlık hakkındır. Edebilirsin. Ama sen Rekabet Kurulu ne işe yarar onu anlamamışsın. Herkes senin zihniyetinde olsa Microsoft’un Linux’u, Nokia’nın Androidi, Yonja’nın Facebook’u, Yahoo’nun Gmaili, Encarta’nın Vikipedia’yı, SAP’nin CompiereERP’ yi, Hürriyet gazetesinin online gazeteleri ve hatta alışveriş merkezlerinin tüm e-ticaret sitelerini kapattırması gerekirdi. Linux’un, Androidin, Chrome’un, Firefox’un, OpenOffice’in ve kim bilir faydalandığın daha bir çok yazılımın Açık Kaynak olduğunu biliyorsun değil mi? Elin ABD’lisi enayi mi neden cezalandırmıyor bunları hiç düşündün mü? Gmail 1GB bedava alan verdiğinde Yahoo tepetaklak gidiyordu. Ne yaptılar bir aç oku bakalım. Kimse kimseyi neden kapattırmadı bir düşün. Dijital dünyada ticaret, pazar, rekabet neymiş bir özümse, anla.. Bu ülkelerin neden serbest rekabeti desteklediklerini, ücretsiz yazılımlara neden ceza kesmediklerini bir öğren. Çok basit. Aç bilgisayarını bir bak kaç ücretsiz program yüklemişsin, bunlar hangi ülkede üretilmiş, elalemin yazdığı program taaa senin bilgisayarına kadar nasıl gelmiş. Belki dank eder birşeyler.

Neyse yorulma ben anlatayım. Sen yerinden kalkıp gitmezsin ama SambaPOS Türkiye’nin en ücra köşelerinde, işletmelerinde hiç bilgisayar kullanmamış yerlere ulaşır. Bu yerler SambaPOS ile işletmelerinde bilgisayar kullanmaya başlayacaklar. Baktılar yapabiliyorlar yazıcı alacaklar, ikinci POS alacaklar ve hizmet kalitelerini arttıracaklar. İşlerini büyütecek, geliştirecekler. Sonra ücretli programlar kullanmak için cesaretlenecekler, daha üst düzey sistemler kullanmak isteyecekler ve işe yarar birşeyse belki de senin programına geçecekler. Daha çok müşterinin senden program talep etmesinin yolunun işyerinde bilgisayar kullananların sayısını arttırmak olduğunu anlamıyor musun? Bir düşün bakalım hiç kitap okumayan bir adama mı daha kolay kitap satarsın yoksa kitap okuyan adama mı. Yok sen kitapçı olsan kesin ücretsiz yazı yayınlayanlara da savaş açardın. Çünkü Rekabet etmek yerine pazarda alternatifsiz kalmak istiyorsun. Çünkü insanların doğası gereği ilerleme sağladıkça hep daha iyisini talep ettiğini ve hemen her dijital ürünün bu duyguya hitap etmek için tasarlandığını bilmiyorsun. Talep yaratmak diye bir şey duydun mu hayatında? İnsanların cep telefonu, bilgisayarı mı yok ki habire daha yenisini ve daha da yenisini alıp duruyorlar.

Yani yapmanız gereken sadece SambaPOS’dan daha iyi bir ürün üretmek ve gerisini SambaPOS’a bırakmak. Bu kadar basit. 2012 yılında bunu anlamak bu kadar zor mu? Pazarı daraltmaya değil genişletmeye çalıştığımızı göremiyor musunuz?

Daha geniş pazar demişken SambaPOS Türkiye’nin en ücra köşelerine ulaşmakla kalmıyor yurtdışına da ulaşıyor. Bu program 14 dile çevrilmiş. 50 Ülkeden ziyaretçi geliyor siteye. Bu insanlar benim Türk olduğumu, Türkiye’de yaşadığımı biliyorlar. Türkiye’de üretilen yazılımların yurtdışında da kullanılmasınının ve beğenilmesinin senin de gelecekte yurtdışında satış yapabilme şansını arttırdığını düşünemiyorsun değil mi? Önümüzü kesmek daha mantıklı geliyor. Bak ülkeler ürünlerinden önce kültürlerini yayarlar. Bunu da edebiyat, film, müzik gibi eserleri kullanarak yaparlar. Aç bak bakalım fikir ve sanat eserleri kanununda bilgisayar programları ve web yazılımları neden "ilmi eser" olarak nitelendirilmiş. Fikirlerin, kültürün yazılımlar ve bu yazılımlar çerçevesinde oluşan sosyal topluluklar sayesinde nasıl yayıldığını, toplumların kültürlerini yaydıkları ülkelerde nasıl ticaret yapabildiklerini bir incele.

Yani bazen ‘derdin ne taktın kafaya yok yazılım sektörünün gelişmesiymiş, yok bilgi paylaşımıymış, yok bilişim kültürünü yaygınlaştırmakmış, yok yurtdışına açılmakmış falan dertlerine düşüyorsun’ diye düşünüyorum. Ha birileri amacımızı anlayacak, destek olacak, öğreneceğiz, gelişeceğiz, dünyada sesimizi duyuracağız diye sabırla beklerken yahu adam gitmiş Rekabet Kuruluna şikayet etmiş. Memleketin yazılım şirketinin de vizyonu bu kadar demek ki. Ne deyim. Hadi bu adamlar programı ücretsiz veriyorlar kaynak kodları niye açtılar diye hiç merak etmedin mi? Birilerinin insanlar görsün, öğrensin, kendini geliştirsin diye düşünüyor olabileceğine ihtimal bile veremezsin değil mi?

Gözünüzün önündeki perdeyi biraz aralayabilseniz, biraz dünyada neler neler oluyor görebilseniz çok şey değişecek. Ama yapmıyorsunuz. Yapın artık!.. Yarın elin ABD'lisi ücretsiz Facebook'la Google'la geldiği gibi ücretsiz Restoran bilmemnesiyle de gelip üç günde piyasayı domine eder. Sen devlet kapılarında "müşteri kaybediyorum" diye sızlanırsın ve sana gülerler...

Bu kadarını tahmin etmemiş olsam da çeşitli tepkiler alacağımı biliyordum. O zamanlar SambaPOS’u gidebileceği yerin en son noktasına kadar götürmek için sonuna kadar çalışacağımı, gücümün yettiği yere kadar inatla devam edeceğimi söylemiştim. Yine söylüyorum. Ben bu işe inandığım değerler için başladım. Bunun peşini bırakmak kendimi bırakmak olur. Sonuna kadar devam!

Merak edenler için söyleyim konuyu bir avukat dostuma aktardım. Artık neler olacak hep beraber göreceğiz.

Ekleme: Direk olarak bu sorulduğu için bir ekleme yapmak istedim. Kimin şikayet ettiğini bilmiyorum. Bilsem de açıklamazdım zaten. Bu yazıyı beni şikayet eden firmayı halka şikayet etmek için değil sektörümüzde çok yaygın bir zihniyeti eleştirmek için yazdım. Kim böyle karanlık şeyler düşünüyorsa o üzerine alınsın. Zaten projemizi takip edenler bilirler, bu projeyle amaçlarımdan bir tanesinin bu zihniyetle mücadele etmek olduğunu her fırsatta söylerim. Şimdilik konu raportörün rapor hazırlaması aşamasında. Değişiklik oldukça buradan bilgi vermeye çalışacağım.