Anahtar Çıkarım
1. Harika geliştiriciler bulmak ve onları elde tutmak, aktif işe alım ve özel bir ortam gerektirir.
Harika yazılım geliştiriciler, aslında her alandaki en iyi insanlar, basitçe piyasada bulunmazlar.
İşe alım aktif olmalı. En iyi geliştiriciler nadiren açık iş ilanlarına başvurdukları için, şirketlerin onları proaktif şekilde araması gerekir. Bu, ilgili konferanslara katılmak, staj programlarıyla yeteneği erken keşfetmek ve şirket ya da ürün çevresinde benzer düşünen insanları çekmek için bir topluluk oluşturmak anlamına gelir. Sadece büyük, genel iş sitelerine güvenmek, kalitesiz çok sayıda başvuru almanıza yol açar.
Çalışma ortamı önemlidir. Ücretin ötesinde, harika geliştiriciler belirli koşulları ararlar. Odaklanmak için özel ofisler, yüksek kaliteli ekipmanlar (monitörler, sandalyeler), zeki ve saygılı sosyal bir ortam ve işlerinde önemli ölçüde bağımsızlık ve özerklik isterler. Geliştiricilere saygı göstermek ve onları “yıldız” gibi görmek, onları çekmek ve elde tutmak için kritik önemdedir.
Para ikinci plandadır. Rekabetçi maaş adalet için gereklidir ancak en iyi yetenekler için genellikle birincil motivasyon değildir. Geliştiriciler maaş konusunda şikayet ediyorsa, bu genellikle işin diğer yönlerinden memnuniyetsizliğin belirtisidir; saygısızlık, kötü çalışma koşulları veya politik sorunlar gibi. Yüksek maaş tek başına kötü bir ortamı telafi etmez.
2. Yazılımda etkili yönetim, sadece emirler veya teşvikler değil, kimlik ve paylaşılan bilgi üzerine kuruludur.
Buradaki amaç, insanları ulaşmaya çalıştığınız hedeflerle özdeşleştirmektir.
Emir-komuta başarısız olur. Askeri tarzda, liderlerin emir yağdırdığı yönetim yüksek teknoloji ekiplerinde etkisizdir. Yöneticiler genellikle bireysel katkı sağlayanların sahip olduğu teknik detaylara hakim olmadığından kötü kararlar alınır. Bu yöntem, görevlerin “neden”ini anlamak isteyen zeki ve özerk geliştiricileri de uzaklaştırır.
Ekonomi 101 ters teper. Sadece finansal teşviklerle (belirli metriklere bağlı bonuslar) yönetmek ters sonuç verir. Bu, içsel motivasyonu zayıf dışsal motivasyonla değiştirir ve insanların metriği optimize etmek için sistemi manipüle etmelerine yol açar. Bu yaklaşım, etkili sistemler kurma ve insanları eğitme sorumluluğundan kaçmaktır.
Kimlik ve bilgi güçlendirir. En etkili yöntem, kimlik yönetimidir; ekip içinde paylaşılan amaç ve bağlılık duygusu yaratmak (bir aile gibi). Yöneticiler, bireylerin değişen koşullarda bile organizasyonun hedefleriyle uyumlu kararlar alabilmesi için gerekli bilgileri (finansal hedefler, pazar durumu gibi) paylaşmalıdır.
3. Gerçekten yetkin programcılar için “zor” kavramlar da dahil güçlü bir teknik temel şarttır.
Pointerlar ve özyineleme, soyutlama yapabilme, bir problemi aynı anda farklı soyutlama seviyelerinde düşünebilme yeteneği gerektirir.
Java okulları yetersiz kalır. Sadece Java ve nesne yönelimli programlamaya odaklanan üniversiteler, öğrencileri temel becerilerle donatamayabilir. Pointerlar (genellikle C’de öğretilir) ve özyineleme (fonksiyonel programlama) gibi kavramlar, zihinsel çevikliği geliştiren ve zorlayıcı “eleme” materyalleridir. Bunlar olmadan işletim sistemleri gibi düşük seviyeli sistemleri veya paralel işlem gibi yüksek soyutlamaları anlamak zorlaşır.
Sözdiziminin ötesinde. C veya Scheme gibi dilleri öğrenmenin değeri sadece o dilleri bilmek değil, beynin nasıl çalıştığını eğitmeleridir. Bu diller, programcıları bellek yönetimi, performans ve farklı soyutlama seviyelerini aynı anda düşünmeye zorlar. Bu zihinsel esneklik, sağlam yazılım mimarisi tasarlamak ve karmaşık problemleri çözmek için hayati önemdedir.
Yenilik üzerindeki etkisi. Bu temel kavramlara maruz kalmamak yeniliği engeller. Örneğin, Google’ın ölçeklenebilirliğinin temelini oluşturan MapReduce algoritması doğrudan fonksiyonel programlama kavramlarından (Map ve Reduce) gelir. Bu altyapıya sahip olmayan geliştiriciler, bu tür paradigmaları icat etmekte veya anlamakta zorlanabilir.
4. Yazılım geliştirme, bilgisayar biliminden ayrı bir zanaattır; pratik beceriler ve net iletişim gerektirir.
Teknik konularda açık yazabilmek, sıradan bir bireysel katkı sağlayan programcı ile lider arasındaki farktır.
Bilgisayar bilimi ve geliştirme. Bilgisayar bilimi diploması teorik temeller sağlar ama otomatik olarak yazılım geliştirmeyi öğretmez. Gerçek dünyada kodlama deneyimi kazanmak için pratik, programlama ağırlıklı dersler şarttır. Birçok seçkin üniversite teoriyi önceliklendirir, pratik beceriler ise başka yerlerde öğrenilir.
Yazmanın önemi. Programcıların açık ve etkili yazabilme yeteneği çok önemlidir. Bu, Linux’un yaratıcısı Linus Torvalds gibi savunuculuk yapmayı, organizasyon içinde ikna etmeyi, net spesifikasyon ve dokümantasyon yazmayı ve etkili işbirliği kurmayı sağlar. İyi yazan programcılar daha etkili olur ve işletme için daha değerlidir.
Şirket içi tuzaklar. Birçok programlama işi, yazılım şirketi olmayan firmalar için “şirket içi yazılım” geliştirmeyi içerir. Bu roller tatmin edici olmayabilir çünkü:
- İş genellikle pratik, zarif olmayan çözümlerle yapılır.
- Projeler “yeterince iyi” olunca durur, cilalama yapılmaz.
- Programcılar, ana iş birimlerine kıyasla düşük statüde olabilir.
Yazılımın işin kendisi olduğu ürün şirketleri, zanaatkarlık gururu ve kariyer gelişimi için daha fazla fırsat sunar.
5. Başarılı yazılım tasarımı, kullanılabilirliğin ötesinde sosyal dinamikleri ve duygusal bağı kapsar.
İnsanların gerçekten yapmak istediği harika bir şey yapan uygulama, kullanımı berbat olsa bile başarılı olabilir.
Kullanılabilirlik gerekli ama yeterli değil. Yazılımı kolay kullanılır yapmak önemli olsa da başarı için tek başına yeterli değildir. Güçlü bir ihtiyacı çözen veya çekici özellikler sunan ürünler, kötü kullanılabilirliğe rağmen başarılı olabilir (örneğin, erken Napster, kısa mesajlaşma). Öte yandan, çok kullanılabilir ama problemi çözmeyen yazılım başarısız olur.
Sosyal arayüz tasarımı. İnsanlar arası etkileşimi kolaylaştıran yazılımlar (sosyal ağlar, forumlar) için “sosyal arayüz” kritik önemdedir. Bu, yazılımın kullanıcı davranışlarını ve topluluk dinamiklerini nasıl etkilediğinin tasarlanmasıdır. Bireysel kullanıcıları kısıtlamak gerekse bile toplumun başarısını desteklemek amaçlanır (örneğin, spam kabulünü sahte göstermek).
Duygusal çekicilik önemlidir. Harika yazılımlar, kullanıcıların duygularına hitap eden “yüksek notalar” yakalar. Bunlar şunları içerir:
- Estetik ve güzellik (örneğin, iPod tasarımı)
- Mizah ve kişilik (örneğin, Winamp’ın web sitesi metni)
- Kullanıcıların kontrolü ellerinde hissetmesi (örneğin, iPod kaydırma tekerleği geri bildirimi)
Bu unsurlar genellikle en yetenekli ekiplerin eseridir ve ortalama ekiplerin taklit etmesi zordur, sürdürülebilir rekabet avantajı yaratır.
6. Zor, “karmaşık” problemleri çözmek gerçek iş değeri ve rekabet avantajının kaynağıdır.
Piyasa, kolay problemlere değil, karmaşık problemlere çözüm için ödeme yapar.
Değer zorluktan gelir. Her işin zor ve tatsız bir çekirdek problemi (“çamur”) vardır. Bu zor problemleri çözme yeteneği piyasada karşılık bulur (“altın”). Kolay problemler üzerine kurulu işler düşük giriş engeline ve yoğun rekabete maruz kalır.
Basit her zaman değerli değildir. Basit ve kullanımı kolay uygulamalar cazip olsa da, kullanıcı veya iş için önemli bir karmaşıklığı çözmüyorsa derin değeri olmayabilir. Tüm “karmaşık” yönlerden kaçınan şirketler (örneğin, farklı ortamlarda kurulabilen yazılımı desteklemekten kaçınanlar) pazarlarını ve gelirlerini sınırlayabilir.
Tasarım da karmaşık bir problemdir. Zarif ve yüksek kullanılabilirlikte yazılım tasarlamak başlı başına zor bir iştir. Önemli yetenek ve çaba gerektirir, bu da yüzeyde basit görünse bile rakiplerin kopyalaması zor, sürdürülebilir rekabet avantajı sağlar. Sürekli yeni ve zor problemleri çözmek, işin büyümesini ve pazarını genişletmesini sağlar.
7. Gerçekçi planlama, veriye dayalı olarak, kapsamı yönetmek ve başarılı ürünler teslim etmek için hayati önemdedir.
Harcadığınız zamanın karşılığını en çok veren işlere odaklanmak istersiniz. Ve ne kadar zaman alacağını bilmeden, bu işin maliyetini hesaplayamazsınız.
Geliştiriciler plan yapmaya direnç gösterir. Programcılar genellikle plan yapmayı gerçekçi olmayan veya zahmetli bir iş olarak görür. Oysa planlar, özellik önceliklendirme ve kaynak tahsisi için bilinçli kararlar alınmasını sağlar. Plansız projeler genellikle sapar ve gecikir.
Kanıta Dayalı Planlama (EBS). Güvenilir bir yöntem, işi küçük görevlere (16 saatten az) bölmek, gerçek harcanan zamanı (kesintiler dahil) takip ederek bireysel “hız” (tahmin/gerçek) hesaplamak ve bu tarihçeyi Monte Carlo simülasyonunda kullanarak olası teslim tarihleri aralığını güvenle tahmin etmektir. Bu, tahmin yanlılıklarını ve öngörülemeyen faktörleri hesaba katar.
Planlar kesintiyi zorunlu kılar. Gerçekçi planlamanın önemli faydası, planlanan özelliklerin mevcut zamandan fazla olduğunu ortaya koymasıdır. Bu da gerekli özellik kesintilerini zorunlu kılar, en değerli özelliklerin önceliklendirilmesini ve ürünün daha erken teslim edilmesini sağlar. Plan baskısıyla kesilen özellikler genellikle en az önemli olanlardır.
8. Mevcut kodu yeniden düzenlemek ve iyileştirmek, sıfırdan başlamaktan genellikle üstündür.
Daha az deneyimli bir şirket, belki hızlı paket teslimatı işinden gelen bir yönetici tarafından yönetiliyorsa, kodu çöpe atıp baştan başlamaya karar verebilirdi.
Yeniden yazmak risklidir. Mevcut kod karmaşıksa veya amacına uygun tasarlanmamışsa sıfırdan başlamak cazip görünür. Ancak bu genellikle hatalıdır; birikmiş bilgi (hata düzeltmeleri dahil) kaybedilir ve tahmin edilenden çok daha uzun sürer, çoğu zaman teslim edilemez veya yeni sorunlar yaratır.
Temizlemek daha etkilidir. Daha iyi yaklaşım, mevcut kod tabanını “temizlemek” veya yeniden düzenlemektir. Bu, yeni özellik eklemeden veya mevcut işlevselliği bozmadan, iç yapıyı, okunabilirliği ve sürdürülebilirliği küçük, mantıklı dönüşümlerle iyileştirmektir. Bu süreç kademeli ve öngörülebilirdir.
Yeniden düzenlemenin faydaları. Kodun satır satır temizlenmesi, yeni özellik eklemeyi kolaylaştırır, yeni hatalar yapma olasılığını azaltır (karmaşık mantığı yeniden yazmadığınız için) ve mevcut kodda yer alan değerli, zor kazanılmış bilgiyi korur. Daha sağlıklı bir kod tabanı için daha verimli ve az riskli bir yoldur.
9. Yazılım fiyatlandırması, pazar dinamikleri, müşteri değeri ve uzun vadeli stratejiyi anlamayı gerektirir.
Yazılım şirketlerinin yaptığı en büyük hata, çok az ücret talep etmeleri, yeterince gelir elde edememeleri ve iflas etmeleridir. Daha da büyük hata ise, evet, en büyük hatadan bile büyük olan, çok fazla ücret talep etmeleri, yeterince müşteri bulamamaları ve iflas etmeleridir.
Talep eğrileri aşağı eğimlidir. Genel olarak, fiyat arttıkça müşteri sayısı azalır. Ama amaç satılan birim sayısını maksimize etmek değil,
[HATA: Yanıt tamamlanmadı]
Son güncelleme::
İncelemeler
More Joel on Software, Joel Spolsky’nin yazdığı blog yazılarından oluşan bir derlemedir ve yazılım geliştirme ile iş dünyasının çeşitli yönlerini ele alır. Okuyucular, Spolsky’nin esprili dili, derinlemesine analizleri ve anlaşılır anlatım tarzını takdir eder. Kitap, programlama, yönetim ve yazılım sektörü hakkında değerli öneriler sunar. Bazı bölümler güncelliğini yitirmiş olsa da, birçok temel ilke hâlâ geçerliliğini korumaktadır. İncelemelerde, özellikle yazılım geliştirme veya girişimcilik alanında olanlar için kitabın hem keyifli hem de bilgilendirici olduğu vurgulanmıştır. Eleştirmenler, bazı tekrarlar ve eski içeriklere dikkat çekse de, genel olarak kitap pratik bilgeliği ve sürükleyici anlatımıyla olumlu karşılanmaktadır.
Joel On Software Series
Similar Books









