Useful Idioms (for Developers and Startups)

Lists for technical terminology exists on the net. However I couldn’t find one which is curated for startup or software development perspective. My best example is “technical debt”. Please suggest your favorite idioms!

Technical Debt: It is like financial debt. Used for technical solutions that are fast and easy now. But you have to pay later(maybe with interest) http://stackoverflow.com/questions/1258775/what-is-technical-debt

Hype:  Something that is overrated by media or people when in fact it isn’t beneficial that much.
FUD: Fear,Uncertainty and Doubt. “By spreading questionable information about the drawbacks of less well known products, an established company can discourage decision-makers from choosing those products over its own, regardless of the relative technical merits.””
http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt

Bus factor: “A measurement of the concentration of information in individual team members”
“The number of key developers who would need to be incapacitated to make a project unable to proceed”. (Higher is better)
http://en.wikipedia.org/wiki/Bus_factor

Dunning–Kruger effect: “It is a psychological effect in which people don’t realize their level of knowledge on a subject. People who know little about a subject think that they know more than they actually know.”
http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect

Developer happiness: When you are deciding which language to use etc. you should also consider happiness of developers and optimize for that also. (I am studying Industrial engineering, the word “optimization” makes me cringe…)

Yazılım, “hype” ve “FUD”

Bloga, Güray dostum yorumunu yazdıktan 1 sene sonra devam ediyorum :) Son yazıda PHP’den bahsetmişim. Aslında PHP’yi çok kullandığım söylenemez. Benim için PHP’yi ilginç kılan şey yazılımla ilgili verilecek kararlarda üretkenliği önemseyenler için güzel bir örnek olması. Bu konuyu biraz açmak istiyorum öncelikle bakınız: http://blog.mailchimp.com/ewww-you-use-php/

Bir dilin Silikon Vadisi’nde ne kadar konuşulduğu, övüldüğü veya yerildiği, o dilin Silikon Vadisi’nde bile ne kadar kullanıldığının göstergesi değildir. Kod yazmaktan tartışmalara katılamayanlar vardır belki de… Bir projede kullanılacak dil veya ekosistem seçilirken bir çok mantıklı kriter göze alınabilir:

  • Örneğin projenin halihazırda bir ekosistemi olabilir. Bu sizin seçeneklerinizi doğrudan kısıtlar: iOS için Obj-C/Swift, enterprise çözümler için sadece Java veya sadece C# istenen projeler.
  • Örneğin projenin önceden geliştirilen kodlar ile uyumlu çalışması gerekebilir. Bu sebeple aynı dili veya birbiriyle anlaşabilen dilleri seçmek mantıklı olabilir. C ile yazılmışsa C/C++ veya mesela Pythondan C çağırmak gibi. Veya tamamen C kodunu ayrı tutup bir protokol ile diğer kodlara bağlanması haberleşmesi sağlanabilir.
  • Kriterler değerlendirildiğinde her dilin ön plana çıktığı alanlar vardır ve bu alanlarla ilgili bir çok kütüphane yazılmıştır. Bir alanda güzel kütüphanelerin olması o dilin aynı alanda kullanılmasına ve yine aynı dilde kütüphenelerin yazılmasına sebep olmuştur(Tavuk yumurta.). Bu kriter için örnekler: İstatistik ve bilimsel çalışmalar için R, hızlıca kolay host edilebilir web siteleri yapmak için PHP, hızlıca web siteleri yapmak için Python-Flask, Python-Django, Ruby-on-Rails, Ruby-Sinatra vb. , XML standartları ile çalışmak için Java (Microsoft açık kaynak yapmasaydı görmezden geleceğim C# de bu konularda öne çıkar), gömülü sistem türü adını-bilmediğim işlemci mimarilerinde az kaynakla çalışacak sistemler için C, oyunlar için C++, istisna olarak her şey için Python… Böyle bir kütüphane ekosistemi sizin projenizi hangi dille yazacağınızı seçerken önemli bir kriterdir.

Sonuçta, geçerli ve mantıklı kriterler için örnekler çoğaltılabilir. Aklınıza gelenleri yorumlarda ekleyin lütfen. Ancak “Şöyle yeni bir şey çıkmış süpermiş” lafını söylediğinizde veya duyduğunuzda alarm zillerini çalmanızı öneriyorum. Bende böyle bir refleks, yenilikleri takip etmeyi seven ve heyecan duyan birisi olarak tecrübeler sonucu oluştu. Yeniliklerden vazgeçemeyiz. Amaç heyecanın vakit ve enerji kaybına dönüşmesini engellemeye çalışmak. Çözüm olarak ise hobi projeleri görüyorum. Yeni bir teknolojiyi yan bir projede denerseniz, hem teknolojinin faydası konusunda daha hızlı sonuca varabilirsiniz hem de riske girmemiş olursunuz.

Ek olarak, İngilizce “hype” ve “FUD” kelimelerine bir teknolojinin gerçeklere dayanmadan övüldüğü/yerildiği belirtililen yazılarda rastlayabilirsiniz.

“Hype”: Bir şeyin olduğundan daha önemli, değerli görülmesi, hak ettiğinden daha çok konuşulması. Ör: “Don’t believe X hype”, “Y hype will fade”.

“FUD”: “Fear,Uncertainty and Doubt”. Korku, belirsizlik ve şüphe. “Hype” ‘ın tersi diyebiliriz. Genelde “spreading FUD about X” olarak kullanılır ve şüphe yayan kişide art niyet olduğunu da belirtir.

PHP’nin geleceği?

PHP ekosisteminde kütüphane/paket sistemi 2011’de packagist ile başlayabildi. Ruby’de bu tür bir sistemin(gems) 2003’de başladığı düşünülürse hayli geriden başladı.

Ancak:
-PHP dilinde ve ekosisteminin yavaş da olsa gelişmesi
-Devasa kullanıcı sayısı,
-PHP ile site yapmaya başlamanın örneğin Ruby’ye, Python’a göre aşırı kolay olması,
-Wordpress gibi kemikleşmiş projeler,
PHP’nin hiç bitmeyeceğini düşündürüyor bana.

packagist stats

Resim kaynağı: https://packagist.org/statistics

Design Then Code

“…it is easier to make changes to a design document than it is to the code.”

This quote is from an interview with lavabit founder Ladar Levison (1). There is a very important dynamic in software engineering. Ambiguous, ever-changing scope and functionality make coding a lot harder and time-consuming.

Personally, in my most effective coding sessions I can remember, I had a clear design and objective and I was only writing code to comply my own rules & API, at least  between specific versions.

However there are also times which you can’t design in advance or effectiveness isn’t the first priority. :)

 

Sources:
(1) http://highscalability.com/blog/2013/8/13/in-memoriam-lavabit-architecture-creating-a-scalable-email-s.html

OAuth2: The standard that isn’t

For the technologies I built on, I try to find the most decent thing with promises for today and the future. So if you are like me and want to create an API, you will come across with OAuth2. OAuth2 had seemed to me a great innovation given the fact that Google, Facebook, Github etc. uses OAuth2.

I was wrong.

Yes standards are beautiful, but OAuth2 isn’t really a standard. Google and Facebook uses different implementations and OAuth2 specification permits this. So you can’t write a client library once, and communicate with every OAuth2 API because everyone is using a different implementation of their own. So this vagueness breaks the promise of standard.

People on the internet comments that this hurts smaller API providers. Imagine a ecosystem of open-source API servers and clients around a well defined spec. However people need to ask questions on Stackoverflow about “client that works on x API”.  Seems like a great opportunity for web is missed.

BTW, for my use case so far the best alternative is to design a simple API that uses https and token authentication. And you can crypt token for improved security if you want. I’m open to suggestions.

OAuth author and former OAuth2 lead author who left the project: http://hueniverse.com/2012/07/oauth-2-0-and-the-road-to-hell/

More criticism on OAuth: http://insanecoding.blogspot.com/2013/03/oauth-great-way-to-cripple-your-api.html

 

Strategy for rolling out a new feature

Quote:

1-Write code that can write to Cassandra in parallel to Mysql, but keep it disabled by the tool I mentioned above
2-Slowly turn up the writes to Cassandra (we can do this by user groups “turn this feature on for employees only” or by percentages “turn this feature on for 1.2% of users”)
3-Find a bug :)
4-Turn the feature off
5-Fix the bug and deploy
6-GOTO #2

In an interview Twitter developer Ryan King talks about how they plan to migrate their database system. Database is a great example for a very connected part of a system so this advice is useful in a lot of scenerios. Here is the source: http://nosql.mypopescu.com/post/407159447/cassandra-twitter-an-interview-with-ryan-king

Deftere Yazmayan Bakkal (gerçek olay)

Bugün bir spotçuda duyduğum ibretlik bir olayı anlatayım. Bilginin nereden geleceği belli olmaz değil mi?

Bakkala bir gün bir teyze gelmiş. Deterjan için parası yetmeyince “deftere yaz getireceğim” demiş. Bakkal “olsun teyzecim hediye olsun” demiş. Teyze ısrar etmiş. Bakkal ısrar etmiş. En sonunda bakkal deftere yazmamış ve teyze çıkmış.

Şaşkınlıklar içinde, bakkalın arkadaşı sormuş: -“Teyze ısrar ediyordu ne güzel ödeyecekti. Neden kabul etmedin?”

Bakkal cevap vermiş: -“Siz ticarette tecrübeli değilsiniz. Ben ne paralar kaybettim. Eğer deftere yazsaydım, bu bakkal deftere yazıyor diye hep bana gelecekti. Ancak şimdi sadece parası olduğunda gelecek.”

Öğrenmek Üzerine

“Öğrenmek ağaç büyütmek gibidir.”

Hemen açıklayım:

-Çok stresli bir sürü işle uğraşıyorsanız yeni şeyler öğrenmek çok zordur. Toprakta boş alan gerekir.
-Kesinlikle zamana ihtiyacı vardır. Daha hızlı ve güçlü büyümesini sağlayabilirsiniz, belli bir dereceye kadar.
Düzenli çalışmaya(oynamaya), tekrara ihtiyacı vardır. Ağacı özellikle fidanken uzun süre sulamazsanız kurur.
-İlkin daha zor ve günlük öğrenilen bilgi çok daha azdır. Bilgi arttıkça öğrenmenin hacmi de genişler. Büyük bir ağaçta yaprak çıkabilecek daha çok nokta vardır.
-Konunun alt dalları da kendi başına ağaç gibidir. Bir alana önce bir yaprak girer, sonra dal genişler zamanla…

“Müfredat aldatmacası”

Konuların öğrenilmesi birbirinden bağımsız olabilir. Öğrenmek zaman gerektirdiği için bir ağacın büyümesini beklemeden diğerini dikmek gerekebilir.

Bu üzerinde durulması gereken bir konu çünkü “müfredat” kavramı kurumlarda ve zihinlerde yerleşmiş bir kavram. Elinize bir kitap aldığınızda ilk konudan başlama isteği duyarsınız. “A konusunu tam bitireyim sonra da B konusunu tam bitiririm”. Halbuki beyin böyle çalışmayı sevmiyor. A konusunu da B konusunu da ara ara çalışmak(oynamak) aralarında bağlantı kurup anlamlarını güçlendirmek, bu süreci uzun zamana yaymak daha verimli oluyor.

“İşime yarayan huylar”

(Bir örnek üzerinden anlatayım: Rusça grameri ve elinde sapanıyla ben)

*Sınırlarını gör, büyük resmin neye benzediğini gör
-Tüm kuralların tüm detaylarını bilemezsin ancak neye benzediğini öğrenebilirsin. Bu beni rahatlatıyor ve psikolojik olarak hazır olmamı sağlıyor. Adeta bilgilerin geleceği yeri hazırlıyorum.

*Yaşayarak Tecrübe Et
-İtiraf edeyim, dil öğrenmek bu konuda daha kolay. Sadece gramer kitabı okuma, yeter. Sesli bir şeyler dinlemek. Dizi izlemek, okumak… Rusça elma kelimesini duyduğunda aklına bir elma resmi getirmek bile yeterli(resmin arkaplanında da moskova olacak).

Halbuki çoğu zaman sadece okumak ve izlemek, yaşayarak tecrübe etmeye engel olabilir!

*Etkileşime geçeceğin yolları, kanalları artırmaya çalış, sürekli araştır
-Sadece gramer kitabı okuma, internetteki tüm kitaplara bir göz at. Belki oyun oynayabilirsin. Belki bir arkadaşınla birlikte çalışmalısın. Belki güzel hazırlanmış gramer tablolarına bakmalısın. Belki kelime kartları kullanmalısın.

Günün içinde öğreneceğin şeyle ilgileneceğin bahaneler, oyunlar bul!

Biraz ondan biraz bundan derken bir de bakmışsınız ki…

*Eğlenceli olduğu şekilde devam et
Eğlence ve motivasyon en önemli nokta. İşini zevk alarak yapan bir insanı diğerlerinden hemen ayırt edebilirsiniz. Hatta eğlence o kadar önemlidir ki mantıksız davranışlar bile işin içine eğlence katmak amacıyla mazur görülebilir.

Ben Rusçaya nasıl bir zevk kattım? Bir dili çözmek, mısır hiyerogliflerini çözmek gibi, kriptolojik bir kilidi çözmek gibi zevk veriyor bana(mantıksız). Belki kursa gitsem çok daha hızlı, verimli öğreneceğim, orada istediğim yardımı göreceğim ve gitmiyorum(pek mantıklı sayılmaz). Ancak o zaman ne tadı kalır ki? (mantıklı)

Mantıksız da olsa çalışmaya devam etmiyor muyum?

 

Sakin Flaubert’ten Dersler

Flaubert, 5 yıl uğraşıp edebiyat tarihinde önemli yeri olan “Madam Bovary” romanının yazmış. Romanı tavsiye etmekle birlikte Flaubert’ten alınacak bir ders görüyorum. Demiş ki:-“Soyez réglé dans votre vie et ordinaire comme un bourgeois, afin d’être violent et original dans vos œuvres.”

Yani, (ingilizcesinden) çevirirsek: “Hayatında sıradan ve düzenli ol, böylece işinde şiddetli ve özgün olabilirsin.”

İnsanın içindeki heyecan arayışı, adrenalin bağımlığı, savaşma ve direnme duygusu, ilerleme tutkusu, tycoon oyunu psikolojisi, insanlara bungee jumping yaptıran şey vb… bu enerji insanın bir şeyler başarması, evrende bir iz bırakması için elzem. Yoksa çok mantıklı olacak, hiç risk almayacak, “Dur bakalım olanları inceleyip en iyi yolu seçeyim…” derken hayat geçecek. En güvenli ve mantıklı yollar da aynı sona çıkacak…

Ve tabii ki her şeyin fazlası zarar. Dengeyi düşünme derdinden münezzeh yaşayamıyoruz. İnsanoğlu düşük tansiyonla yüksek tansiyon arasında yaşaması gereken aciz bir varlık. Her sorunla karşılaşmamızı “sorunu fırsata çevirme” yeteneğimizi ortaya koyacağımız bir meydan okuma olarak görürsek, yandık. Her şeye rağmen; şeker, yağ yaktıktan sonra protein yakarak devam edemeyiz.

Dengeli ve sakin olmalıyız. Enerjimizi neye harcadığımızı sorgulamalıyız. Dünya tarihine geçecek bir işi yapabilmek için bile yeri geldiğinde sütünü içip vaktinde yatman gerekiyor.

Küçük Başlamak

Varsayalım ki girişimci olmak istiyorsun. İnsanlar için değer üretecek bir sistem kurup, bu değer için para vermelerini sağlayacaksın. Hatta belki bir gün bu sistem o kadar güzel işleyecek ve o kadar çok insana hizmet sağlayacak ki (sahilde) oturduğun yerden para kazanacaksın.

Öyleyse bekleme. Değer üretmeye, hemen yakınından başla! Ailenden, arkadaşlarından, yakın çevrenden… Yeniliklerden haberdar et, onların hayatını kolaylaştır, hayatlarını daha zevkli hale getir, anlam kat, değer üret!

Öğren, bakalım onların ne gibi ihtiyaçları var?
Bakalım ihtiyaçlar mı önemli, yoksa istekler mi?
Bakalım bu işin ne gibi zorlukları var?
Bakalım senin karşılaştığın zorluklarla kimse ilgileniyor mu?
Bakalım günlük uygulamalar sistem haline nasıl geliyor?
Bakalım tek bir işi yapmak (örneğin: sadece kod yazmak) yeterli mi?
Bakalım kim, neden, nasıl sana yardımcı olabilir?
Bakalım insanlar ceplerinden parayı ne zaman çıkarıyor?

Başla!