Cynefin Framework ile Karmaşık Problemleri Anlamak ve Yönetmek
Karar alma süreçlerinin hem algoritması hem reçetesi!
Hepimiz mutlaka kompleks bir problemle karşı karşıya kalmışızdır. Ya da kompleks kişiliklerle yaşamak veya çalışmak zorunda kalmışızdır. Peki, kompleks sistemler desem?
Yazılımda en büyük hedeflerimizden biri, sistemdeki karmaşıklığı (complexity) azaltmak ve basit sistemler kurmaktır. Bildiğiniz bir dilde yazılmış olsa bile, okuduğunuzda anlamakta zorlandığınız ya da hiç anlayamadığınız kodlarla karşılaşmışsınızdır. Hatta bazen sorunun kendinizde olduğunu bile düşünmüş olabilirsiniz. Çünkü bir zamanlar, karmaşık ve kimsenin anlayamadığı kodlar yazmanın “havalı” olduğu gibi bir inanış vardı. 🙂 (Bir de bu sürede hoodie giyip karanlıkta çalışmanız gerekiyordu 😄) Neyse ki artık basitliği kovalamamız gerektiği konusunda hepimiz hemfikiriz. Ancak, karmaşıklıkla mücadele edebilmek için öncelikle onu çok iyi anlamamız gerektiğini düşünüyorum. Hazırsanız, başlayalım!
Complexity Nedir?
“Kompleks” kelimesi, neredeyse Türkçe olacak kadar dilimize yerleşmiş bir kelime. Hatta “complex” ve “complicated” kelimelerinin eş anlamlı olduğunu düşünebilirsiniz. Ben de böyle düşünüyordum, ta ki Vlad Khononov’un 1Balancing Coupling in Software Design kitabını okuyana kadar. Bu kitap, coupling üzerine felsefi düzeye ulaşmış ama bir o kadar da net bir anlatım sunan şahane bir eser. Kitaptan ilham alarak yazdığım ve coupling kavramını açıklamaya çalıştığım makalemi henüz okumadıysanız, göz atmanızı tavsiye ederim!
Complexity, soyut ve sezgisel bir konu. Kabaca, kavraması zor olan her şeye “kompleks” diyebiliriz. Yani, zihinsel bir yük oluşturan sistemler bizim için komplekstir. Yazılım dünyasına bakacak olursak, bir geliştiricinin değişiklik yapmak için kodu okurken harcadığı zaman, karmaşıklığın bir ölçütü olabilir. Ya da değişiklik yapılacak kod parçasını bulmak için harcanan süre. Robert Martin’in 2Clean Architecture kitabında bu durum spelunking yani “mağaracılık” olarak tanımlanır. Bu terimi ilk okuduğumda çok etkilenmiştim. 🙂
Kompleks sistemlerde değişiklik yapmak oldukça zordur. Çünkü sistemin herhangi bir bileşeninin (component) bireysel görevini veya işlevini anlayamazsınız. Yani, bütünün tamamını görmeye ihtiyaç duyarsınız. Dahası, sistemin bir bileşeninde yaptığınız bir değişikliğin, sistemin geri kalanında ne gibi sonuçlara yol açacağını kestiremezsiniz. Bu da sizi korkunç bir huzursuzluğa sürükler. Bu duygu tanıdık geldi, değil mi? İşte bu, bir kompleks sistemin en önemli işaretlerinden biridir.
Complexity Sezgisel ve Dolayısıyla Kişiseldir
Complexity’nin görece genel tanımı kişi üzerindeki bilişsel yüke dayanır. Her kişinin bilişsel kapasitesi ve deneyimi değişeceğinden birine göre complex olan bir sistem/konu başlasına göre kompleks olmayabilir. Saat tamiratı kimine göre çok zordur bir saat tamiratçısı için ise 1 saat bile sürmez. Tam olarak bu gibi kişiye göre değişebilecek belirsiz durumları tanımlamak için ortaya çıkmış Cynefin Framework’e bir göz atalım.
Cynefin Framework
Cynefin, Galce bir terimdir. Çevremizdeki olaylar içinde bizi, yani davranışlarımızı ve yaklaşımlarımızı etkileyen faktörlerin biçimi olarak tanımlanabilir. Daha basit bir ifadeyle, bir durum karşısında verdiğimiz tepkinin algoritması olarak düşünebiliriz.
Bu Galce terim, 2007 yılında David Snowden tarafından bir framework (çerçeve) haline getirilmiş ve sistematik bir yapıya kavuşturulmuştur. Cynefin Framework’ün asıl motivasyonu, liderlere karar alma süreçlerinde bir yol haritası sunmaktır. Ancak, framework oldukça genel bir yapıya sahip olduğundan hemen hemen her sektöre uygulanabilir.
Bir product manager olarak ürün geliştirme süreçlerinizde Cynefin Framework’ten faydalanabilirsiniz; bir lider olarak stratejik kararlar almak için bu çerçeveyi kullanabilirsiniz; bir yazılım geliştirici olarak kompleks problemleri çözmek için bu yaklaşımı uygulayabilirsiniz. Hatta günlük hayatınızda bir problemle karşılaştığınızda bile çözüm yolu bulmak için bu framework’ten yararlanabilirsiniz.
Cynefin Framework, karar alma süreçlerinde farklı durumları anlamlandırmak için 5 temel alandan oluşur:
1. Clear (Açık)
2. Complicated (Karmaşık)
3. Complex (Kompleks)
4. Chaos (Kaotik)
5. Disorder (Düzensizlik)
Bu framework sayesinde, kompleks olarak nitelendirdiğimiz sistemlerin veya sorunların gerçekten “kompleks” olup olmadığını sorgulayabilir ve uygun çözüm yaklaşımlarını belirleyebiliriz. Her alan, farklı bir bağlamı ve çözüm yöntemini temsil eder, bu da karmaşık problemlere daha etkili bir şekilde yaklaşmamızı sağlar.
1. Clear (Açık)
Bu alanın anahtar kelimesi “obvious” yani açık, hatta besbelli olan durumlardır. Bir eylemin etkilerinin sonuçları çok nettir ve kolayca öngörülebilir. Bu nedenle, Clear alanlarda karar almak kolay ve basittir.
Cynefin Framework’e göre Clear alanlarda karar alırken sense–categorize–respond yaklaşımını izleyebiliriz:
Sense (Algıla): Bilgiyi topla ve bu doğrultuda gerçekleri ortaya koy.
Categorize (Sınıflandır): Elde edilen gerçekleri kullanarak kuralları veya en uygun yöntemi belirle.
Respond (Tepki Ver): Belirlenen kural ve yöntemi uygula.
Bu tür soyut ifadeler bazen zor anlaşılabilir. Bu nedenle bir örnek üzerinden ilerleyelim:
Örnek: Yaya Geçidi
Bir yaya geçidine yaklaşan bir araç sürücüsü olduğumuzu düşünelim. Karar vermek oldukça basittir: Yaya varsa dur, yaya yoksa devam et.
Aslında bu süreç, sense-categorize-respond yaklaşımının bir uygulamasıdır:
Sense (Algıla):
Yaya geçidini ve çevresindeki durumu gözlemle.
Categorize (Sınıflandır):
Yaya geçidinde bir yaya olup olmadığını belirle.
Kurala göre; yaya varsa dur, yoksa geç.
Respond (Tepki Ver):
Sınıflandırmadan çıkan karara göre dur ya da geç.
Günlük hayatta refleks olarak aldığımız birçok karar, aslında Clear alanlarda aldığımız kararlardır. Bu kararlar basit ve öngörülebilirdir; doğru bir tepki için sadece kuralları uygulamak yeterlidir.
2. Complicated (Karmaşık)
Bu alanın anahtar kelimesi “known unknowns” yani bilinen bilinmeyenlerdir. Başka bir ifadeyle, karar almak için eksik bilgilerimizin olduğunu fark ettiğimiz durumlardır. Karmaşık kelimesi kulağa olumsuz gelse de, bu eksik bilgilerin farkında olmak bizi bir uzmana danışmaya ve onun uzmanlığından faydalanmaya iter. İşte Complicated alanlarda karar alma süreci de bu şekilde işler.
Complicated alanlarda kullanılan karar alma yaklaşımı, sense–analyse–respond yöntemidir:
Sense (Algıla): Bilgiyi topla ve bu doğrultuda gerçekleri ortaya koy.
Analyse (Analiz Et): Eksik bilgiyi tanımla ve bir uzmana danış.
Respond (Tepki Ver): Uzmandan gelen bilgi doğrultusunda hareket et.
Örnek: Ev İnternetinin Kesilmesi
Evde internet bağlantınızın kesildiğini fark ettiğiniz bir durumu ele alalım. Bu durum, Complicated bir alanı temsil eder. Karar alma süreci şu şekilde işler:
Sense (Algıla):
İnternetin gerçekten kesildiğinden emin olun.
Web sayfalarının yüklenmediğini ve evdeki birden fazla cihazın internete bağlanamadığını gözlemleyin.
2. Analyse (Analiz Et):
İnternet sağlayıcınızı arayarak bir uzmana danışın.
Uzmandan kesintinin nedeni ve çözüm için uygulanması gereken adımlar hakkında bilgi alın.
3. Respond (Tepki Ver):
Uzmanın önerdiği modem ayarlarını veya yönlendirmeleri uygulayın.
Complicated alanlarda karar almak, Clear alanlara göre daha zordur çünkü ek bilgi toplamak ve uzman desteğine ihtiyaç duyarız. Ancak, bu alanın en önemli kilit noktası, eksik bilgilerimizin farkında olmaktır. Bu farkındalık, doğru soruları sormamıza ve çözüm yolunda ilerlememize olanak tanır.
Şimdi işler daha da karmaşıklaşıyor: Complex alanlara bir göz atalım.
3. Complex (Kompleks)
Kompleks alanlar, Complicated alanlara benzese de önemli bir fark vardır: Karar almak için ihtiyaç duyduğunuz bilgiye sahip değilsiniz ve bu bilgiyi size sağlayabilecek bir uzman da yok. Bu nedenle anahtar kelimesi “unknown unknowns” yani bilinmeyenleri bilmemek. Başka bir ifadeyle, hangi bilgiye ihtiyaç duyduğunuzu bile bilmiyorsunuz veya bilmediğiniz bu bilgiyi bilen kimse de yok. Dolayısıyla, bir uzmana danışma seçeneğiniz bulunmuyor.
Kompleks alanlardaki senaryolar bağlama (context) bağımlıdır. Yani, Clear alandaki gibi “kırmızı ışıkta dur, yeşil ışıkta geç” gibi genel geçer çözümler veya yaygın kullanım yöntemleri kompleks durumlarda işe yaramaz.
Bu nedenle, kompleks alanlarda karar almak için öncelikle bir veya birden fazla deney (probe) yapmanız gerekir. Bu deneylerin sonuçları analiz edilerek bir eylem planına karar verilir.
Kompleks Alanlarda Karar Alma Yaklaşımı: Probe–Sense–Respond
Kompleks alanlarda kullanılan karar alma yaklaşımı şunları içerir:
Probe (Keşfet):
Farklı kararların sonuçlarını gözlemlemek için güvenli deneyler yapın.
Sense (Algıla):
Deneylerden elde edilen mevcut bilgileri toplayın ve sonuçlardan desenleri (patterns) belirleyin.
Respond (Tepki Ver):
Deneylerin sonuçlarına göre bir eylem planı oluşturun ve uygulayın.
Kompleks Alanlarda Karar Vermek
Kompleks alanlarda karar verme süreci, iteratif yani tekrarlayan bir süreçtir. Çoğu zaman, tek bir deneyin sonucuna bakarak kesin bir karar almak mümkün değildir. Deney sayısı arttıkça, deney sonuçlarına dayalı alınacak kararların başarıya ulaşma ihtimali de artar.
Çünkü açık (clear) ve karmaşık (complicated) alanların aksine, kompleks bir alanda bir kararın etkilerini tam olarak öngörmek mümkün değildir; bu etkileri ancak geriye dönük olarak çıkarım yapabilirsiniz. İlk adımda, güvenli bir deney yapmalı ve sonuçlarını gözlemlemelisiniz. Ancak bu şekilde, eylemin olası sonuçlarına dair bir fikir edinebilirsiniz.
Örnek: Bir Şirketin Satışlarının Düşüşü
Bir şirketin satışları düşüyor ve bu düşüşün neden kaynaklandığı belirsiz. Farklı eylemlerin sonuçlarını tahmin etmek zordur çünkü müşterilerin davranışları, piyasa dinamikleri ve diğer dış faktörler bu durumu etkileyebilir. Bu, kompleks bir alanı temsil eder.
Bu tür bir durumda karar alma süreci şu şekilde ilerler:
Probe (Keşfet):
Satışları artırmaya yönelik küçük, güvenli deneyler yapın. Örneğin:
Yeni bir pazarlama kampanyası başlatın.
Ürün fiyatlarında bir indirim deneyin.
Ücretsiz deneme veya özel bir bonus sunun.
Sense (Algıla):
Her bir deneyin sonuçlarını gözlemleyin.
Hangi stratejinin müşteri ilgisini artırdığına ve satışları etkilediğine dair verileri toplayın.
Respond (Tepki Ver):
Deneylerden elde edilen verilere göre en iyi performansı gösteren stratejiyi uygulayın.
Örneğin, indirimlerin etkili olduğunu gözlemliyorsanız, bu yaklaşımı yaygınlaştırın.
Kompleks Alanlarda Karar Vermenin Zorlukları
Kompleks alanlarda karar vermek zordur çünkü farklı eylem planlarının sonuçlarını öngörmek mümkün değildir. Ancak, deneyler ve öğrenme süreci sayesinde bu zorluk aşılabilir ve etkili çözümler bulunabilir.
Bu noktada işler daha karmaşık bir hal alır çünkü bir sonraki durak kaotik alanlardır ve bu alanlarda karar verme çok daha zorlu bir süreçtir.
4. Chaotic (Kaotik)
Kompleks bir alanda, bir eylem planının sonuçlarını öngöremeyeceğimizi öğrendik. Ancak kaotik alan, kontrolün tamamen kaybolduğu bir durumu ifade eder. Bu alanda, bir eylemin sonucunu hiçbir şekilde öngöremezsiniz.
Kaotik alanlarda eylem sonuçları öngörülemez, çünkü bu durum doğası gereği tahmin edilemezdir. Bu tür problemleri rulet veya zar oyunlarına benzetebiliriz. Oyunun kuralları veya yapısı değiştirilmediği sürece, bir sonraki hamlenin sonucunu bilmek imkansızdır.
Ayrıca, kaotik alanlarda yaptığınız deneylerin sayısı da sonuç üzerinde bir fark yaratmaz. Yani, güvenli deneyler yaparak durumu analiz etmek bu alanlarda mümkün değildir. Bu da kaotik alanları, diğer tüm alanlardan daha zorlu ve belirsiz bir hale getirir.
Cynefin çerçevesine göre kaotik alanlar, bilgiye dayalı tepkiler için fazlasıyla karmaşık ve tahmin edilemezdir. Bu nedenle, kaotik bir durumda içgüdülerinize güvenmeli ve o an mantıklı gelen herhangi bir eylemi gerçekleştirmelisiniz.
Kaotik alanlarda gerçekleştirilen bu tür eylemlerin amacı, durumu kaotik alandan karmaşık bir alana dönüştürmektir. Ancak, tehlike tamamen geçtikten sonra durumu değerlendirebilir ve sonraki adımları planlayabilirsiniz.
Kaotik alanlarda izlenen karar alma yaklaşımı ise act–sense–respond yöntemidir:
Act (Eylem):
O an mantıklı gelen ve sizi tehlikeden kurtarabilecek herhangi bir eylemi gerçekleştirin.
Sense (Algıla):
Yaptığınız eylemin sonuçları hakkında bilgi toplayın ve durumu değerlendirin.
Respond (Tepki Ver):
Eğer hâlâ tehlikedeyseniz, başka bir eylem gerçekleştirin.
Tehlikeden tamamen çıktıktan sonra bilgiye dayalı yanıtları planlamaya başlayın.
Örnek: Kaotik Bir Durumda Karar Verme
Yoğun trafikte araba kullanırken, önünüzdeki araç aniden fren yapıyor. Bu, tamamen kaotik bir durumdur; duruma hemen tepki vermezseniz bir kaza meydana gelebilir. Bu tür bir durumda karar alma süreci şu şekilde işler:
Act (Eylem):
İçgüdüsel olarak frene basın veya direksiyonu güvenli bir yöne çevirin.
O anda mantıklı gelen en hızlı ve güvenli hareketi yapın.
Sense (Algıla):
Eyleminizin sonucunu değerlendirin:
Aracınız durdu mu?
Kazadan kaçındınız mı?
Çevredeki diğer araçların hareketlerini gözlemleyin (örneğin, arkadan çarpma riski var mı).
Respond (Tepki Ver):
Eğer hâlâ tehlikedeyseniz (örneğin, başka bir araç üzerinize doğru geliyorsa), başka bir hızlı hareket yaparak tehlikeden uzaklaşmaya çalışın.
Ancak durum kontrol altına alındığında, yeniden dikkatli bir şekilde sürüşe odaklanabilirsiniz.
Kaotik alanlarda karar alma süreci, reflekslere ve içgüdülere dayanır. Durumu kontrol altına almanın tek yolu, hızlı hareket ederek tehlikeyi bertaraf etmek ve ardından durumu değerlendirmektir. Bu süreç, diğer alanlardan farklı olarak planlama yerine hızlı aksiyon almayı gerektirir.
5. Disorder (Düzensizlik)
Cynefin çerçevesinin beşinci alanı olan disorder (düzensizlik) alanı, çerçevede tanımlı olan dört alanın hiçbirine uymayan durumları kapsar. Yani, karşı karşıya kaldığınız problemi veya karar almanız gereken durumu Cynefin çerçevesindeki herhangi bir alana yerleştiremiyorsanız, disorder alanındasınız demektir.
Ayrıca, bir durumu sınıflandırdığınızı düşünseniz bile, bu sınıflandırmanın doğru olmadığını veya elinizdeki bilginin yetersiz olduğunu fark ediyorsanız, yine disorder alanında bulunuyorsunuz demektir.
Disorder Alanına Bir Örnek: Elektrik Kesintisi
Bir akşam evde otururken birden elektrikler kesiliyor ve nedenini bilmiyorsunuz. Bu durum disorder alanına girer çünkü:
Sorunun kaynağı belirsizdir.
Durumu hangi alana yerleştireceğinize dair yeterli bilginiz yoktur.
Bu durumda yapılması gereken ilk adım, durumu anlamaya ve hangi alana girdiğini kategorize etmeye çalışmaktır.
Durumu Kategorize Etmek
Elektrik kesintisi gibi bir problemi çözmek için ilk adım, durumu anlamaya çalışarak doğru bir şekilde kategorize etmektir. İşte olası senaryolar:
Açık (Clear) Durum:
Eğer elektrik faturasını ödemeyi unuttuğunuzu fark ederseniz, bu açık bir durumdur. Çözüm bellidir: Faturayı ödemek.
Karmaşık (Complicated) Durum:
Eğer apartmanınızda veya mahallenizde elektriklerin genellikle belirli bir sebepten kesildiğini (örneğin, bakım çalışması) biliyorsanız, bu karmaşık bir durum olabilir. Elektrik dağıtım şirketiyle iletişim kurarak durumu netleştirebilirsiniz.
Kompleks (Complex) Durum:
Eğer sorunun kaynağı belirsizse (örneğin, yalnızca sizin evinizin elektriği kesilmiş ve sebebi bilinmiyor), bu kompleks bir durumdur. Sigortaları kontrol ederek veya deneme-yanılma yöntemleriyle sorunu anlamaya çalışabilirsiniz.
Kaotik (Chaotic) Durum:
Eğer elektrik kesintisi bir tehlike yaratıyorsa (örneğin, evde bir yangın çıkmışsa veya elektrik sisteminden kıvılcımlar geliyorsa), bu kaotik bir durumdur. Hemen acil servisleri aramalı ve güvenli bir yere geçmelisiniz.
Eksik Bilgiyi Toplamak:
Disorder alanındaki elektrik kesintisini anlamlandırmak için aşağıdaki adımları takip edebilirsiniz:
Sigortaları ve elektrik kutusunu kontrol edin.
Diğer apartman sakinlerine veya komşulara sorun; sorun yalnızca sizin evinizde mi yoksa genelde mi?
Elektrik dağıtım şirketini arayarak planlı bir kesinti olup olmadığını öğrenin.
Doğru Alanı Belirleyip Hareket Etmek:
Durumu kategorize ettikten sonra doğru alanı belirleyip buna uygun şekilde hareket etmelisiniz:
Açık Durum:
Eğer sigortalardan birinin atmış olduğunu fark ederseniz, bunu düzelterek elektriği geri getirebilirsiniz.
Karmaşık Durum:
Eğer elektrik dağıtım şirketi genel bir kesinti olduğunu belirtirse, yapılacak şey beklemektir.
Kompleks Durum:
Eğer kesintinin nedeni bulunamazsa ve bir elektrikçi çağırmanız gerekiyorsa, bu kompleks bir duruma geçiş yapar.
Kaotik Durum:
Eğer durum acil bir tehlike oluşturuyorsa (örneğin, bir yangın riski), öncelikle güvenliğinizi sağlayarak kaotik bir durumdan çıkmaya çalışmalısınız.
Karmaşıklığı Anlamak, Doğru Kararı Vermek Demektir
Hayatın ve iş dünyasının belirsizliklerle dolu yapısı, hepimizi karmaşık ve kaotik durumlarla başa çıkmaya zorlar. İster bir yazılımcı, ister bir lider, ister bir ürün yöneticisi olun, karar alma süreçlerinde doğru yaklaşımı benimsemek, sadece problemi çözmekle kalmaz, aynı zamanda sizi bir adım öne taşır.
Cynefin Çerçevesi, problemleri doğru bir şekilde kategorize etmenize ve her durum için en uygun çözüm yollarını seçmenize yardımcı olan güçlü bir araçtır. Bu makalede, Cynefin’in farklı alanlarını anlamanızı ve karar alma süreçlerinde nasıl kullanabileceğinizi keşfettik.
Bir sonraki makalemde ise, Cynefin Framework’ün alanlarını yazılım dünyasıyla ve coupling kavramıyla nasıl ilişkilendirebileceğimizi detaylı bir şekilde ele alacağım. Yazılım tasarımındaki karmaşıklığı yönetmek ve daha sağlam sistemler inşa etmek için bu çerçevenin nasıl bir yol gösterici olabileceğini birlikte inceleyeceğiz.
Karmaşıklık her zaman bir zorluk gibi görünse de, onu anlamak ve doğru yönetmek işleri kolaylaştırabilir. Cynefin’i, karar alma süreçlerinizi daha bilinçli bir hale getirmek için bir rehber olarak düşünebilirsiniz.
https://learning.oreilly.com/library/view/balancing-coupling-in/9780137353514/
https://learning.oreilly.com/library/view/clean-architecture-a/9780134494272/
Geri bildirimlerin benim için kıymetli. Bana mesaj atarak hem geri bildirim verebilir hem de okumak istediğin konuları iletebilirsin!