Ders 20 / 24
Karanlık Kalıplar ve Etik
Bir tasarım kararının meşruluk ölçütünün sayılabilir göstergelere çevrilmesi, acele ettirme, gizli maliyet, zorlaştırılmış iptal, onay tuzağı ve sahte kıtlık kalıplarının tanınması ve reddedilmesi.
İçindekiler
Bu konunun yedi dersinde aynı soru yedi kez ortaya çıktı. Belirginlik dersinde: kullanıcı listenin niçin bu sırayla dizildiğini bilseydi ilk kaydı seçer miydi? Varsayılanlar dersinde: ayarın açık geldiğini fark etseydi açık bırakır mıydı? Sosyal kanıt dersinde: sayının nasıl üretildiğini bilseydi ona güvenir miydi? İlerleme dersinde: çubuğun gerçek işe bağlı olmadığını bilseydi beklemeyi sürdürür müydü?
Soru her seferinde aynıydı ve her seferinde iki yanıttan biri çıktı. Bu ders soruyu bir ölçüte, ölçütü de denetlenebilir göstergelere çevirir.
Ölçüt
Bir tasarım kararı, kullanıcı o kararın nasıl alındığını bilseydi de aynı seçimi yapacaksa meşrudur. Kararın gücü kullanıcının bilgisizliğinden geliyorsa o karar bir karanlık kalıptır.
Ölçütün iki özelliği vardır. Birincisi, kullanıcının davranışını değiştirmeyi kendi başına kusur saymaz — her tasarım kararı davranışı değiştirir; kayıtları uygunluğa göre sıralamak da değiştirir. Kusur, değişimin bir yanlış inanç üzerine kurulmasıdır. İkincisi, tasarımcının niyetini sormaz. Bir kalıp kazayla kurulmuş olabilir; ölçüt yine de aynı sonucu verir ve düzeltme yükümlülüğü aynıdır.
Karanlık kalıp (dark pattern), bu ölçütü sistematik olarak çiğneyen, kullanıcının yanlış bilgisine dayanarak sonucu tasarımcının istediği yöne çeviren arayüz kalıbıdır. Aşağıdaki beş kalıp bu dersin denetim listesidir.
Acele ettirme, kullanıcının düşünme süresini gerçek bir kısıt olmadan daraltan kalıptır: sona ermeyen ya da her oturumda yeniden başlayan geri sayımlar.
Gizli maliyet, kullanıcının taahhüt ettiği bedelin bir kısmını taahhütten sonra gösteren kalıptır.
Zorlaştırılmış iptal, bir duruma girmeyi kolay, çıkmayı orantısız biçimde zor yapan kalıptır.
Onay tuzağı, kullanıcının onayladığını sandığı şeyle gerçekte onayladığı şeyin ayrıştığı kalıptır: önceden işaretlenmiş kutular, ret seçeneğini görünmez kılan düzenler.
Sahte kıtlık, stok, süre ya da talep hakkında veriye dayanmayan bir azlık iddiasıdır.
Bunların hiçbiri burada uygulama tarifi olarak verilmemiştir; her biri tanıma hedefi olarak tanımlanmıştır. Aşağıdaki hesap tanımayı ölçüye bağlar.
Göstergelerin Ölçülmesi
// denetim.mjs — bir arayuzun karanlik kalip gostergelerinin olculmesi // ---- 1) Caba asimetrisi: bir seye girmek ile cikmak arasindaki adim farki ---- const AKISLAR = [ { ad: "odunc alma / iade", giris: 2, cikis: 2 }, { ad: "teslim hatirlatmasi", giris: 1, cikis: 1 }, { ad: "oneri bulteni", giris: 1, cikis: 4 }, { ad: "uyelik", giris: 3, cikis: 7 }, ]; console.log("akis giris adimi cikis adimi asimetri esik (2x)"); for (const a of AKISLAR) { const asimetri = a.cikis / a.giris; console.log( `${a.ad.padEnd(23)} ${String(a.giris).padStart(11)} ${String(a.cikis).padStart(12)}` + ` ${(asimetri.toFixed(2) + "x").padStart(9)} ${asimetri > 2 ? "ASILDI" : "gecti"}` ); } // ---- 2) Gizli maliyet: ilk gorulen taahhut ile son toplam arasindaki fark ---- const MALIYETLER = [ { ad: "odunc (ucretsiz)", ilk: 0, son: 0 }, { ad: "gec iade cezasi", ilk: 0, son: 12 }, { ad: "sube arasi tasima", ilk: 5, son: 5 }, { ad: "rezervasyon + tasima + gecikme", ilk: 5, son: 23 }, ]; console.log("\nkalem ilk gosterilen son toplam surpriz orani"); for (const m of MALIYETLER) { const surpriz = m.son === 0 ? 0 : (m.son - m.ilk) / m.son; console.log( `${m.ad.padEnd(32)} ${String(m.ilk).padStart(14)} ${String(m.son).padStart(11)}` + ` ${((surpriz * 100).toFixed(0) + " %").padStart(14)} ${surpriz > 0.2 ? "ASILDI" : "gecti"}` ); } // ---- 3) Kitlik iddiasinin veriyle bagi ---- // 12 kayit icin: gercek raf durumu ve arayuzde gosterilen "kalan nusha" iddiasi. const GERCEK = [1, 4, 2, 7, 1, 3, 9, 2, 5, 1, 6, 8]; const IDDIALAR = { "veriden turetilen": [1, 4, 2, 7, 1, 3, 9, 2, 5, 1, 6, 8], "sabit uyari": [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], "kismen bagli": [1, 3, 2, 3, 1, 3, 3, 2, 3, 1, 3, 3], }; function korelasyon(a, b) { const n = a.length; const oa = a.reduce((x, y) => x + y, 0) / n, ob = b.reduce((x, y) => x + y, 0) / n; let pay = 0, pa = 0, pb = 0; for (let i = 0; i < n; i++) { pay += (a[i] - oa) * (b[i] - ob); pa += (a[i] - oa) ** 2; pb += (b[i] - ob) ** 2; } return pb === 0 ? 0 : pay / Math.sqrt(pa * pb); } console.log("\niddia bicimi gercek stokla korelasyon esik (0.9)"); for (const [ad, v] of Object.entries(IDDIALAR)) { const r = korelasyon(GERCEK, v); console.log(`${ad.padEnd(21)} ${r.toFixed(3).padStart(24)} ${r >= 0.9 ? "gecti" : "ASILDI"}`); } // ---- 4) Geri sayimin gercek bir son tarihe bagli olup olmadigi ---- // Ayni kullanicinin ardisik oturumlarinda gorulen "kalan sure" (dakika). const OTURUMLAR = { "gercek son tarih": [58, 41, 27, 12, 3], "her oturumda sifirlanan": [10, 10, 10, 10, 10], "sayfa yenilendiginde sifirlanan": [10, 10, 9, 10, 10], }; console.log("\ngeri sayim oturumlar azalan mi"); for (const [ad, v] of Object.entries(OTURUMLAR)) { let azalan = true; for (let i = 1; i < v.length; i++) if (v[i] >= v[i - 1]) azalan = false; console.log(`${ad.padEnd(32)} ${v.join(", ").padEnd(20)} ${azalan ? "evet" : "HAYIR"}`); } // ---- 5) Bes gosterge birlikte: bir tasarim kararinin denetimi ---- // Olcut: kullanici karari nasil alindigini bilseydi ayni secimi yapar miydi? // Gostergeler tek tek olculur; biri bile asilirsa karar karanlik kalip sayilir. const KARARLAR = [ { ad: "teslim hatirlatmasi acik varsayilan", pismanlik: 0.128, asimetri: 1.0, surpriz: 0.0, kaynak: 1.00, geriSayim: null }, { ad: "oneri bulteni acik varsayilan", pismanlik: 0.188, asimetri: 4.0, surpriz: 0.0, kaynak: 1.00, geriSayim: null }, { ad: "son nusha uyarisi (stoktan)", pismanlik: 0.000, asimetri: 1.0, surpriz: 0.0, kaynak: 1.00, geriSayim: null }, { ad: "son nusha uyarisi (sabit)", pismanlik: 0.000, asimetri: 1.0, surpriz: 0.0, kaynak: 0.00, geriSayim: null }, { ad: "rezervasyon geri sayimi", pismanlik: 0.000, asimetri: 1.0, surpriz: 0.0, kaynak: 1.00, geriSayim: false }, { ad: "gecikme cezasi son adimda", pismanlik: 0.000, asimetri: 1.0, surpriz: 0.52, kaynak: 1.00, geriSayim: null }, ]; const ESIKLER = { pismanlik: 0.15, asimetri: 2.0, surpriz: 0.20, kaynak: 0.90 }; console.log("\nkarar asilan gosterge sonuc"); for (const k of KARARLAR) { const asilan = []; if (k.pismanlik > ESIKLER.pismanlik) asilan.push("pismanlik"); if (k.asimetri > ESIKLER.asimetri) asilan.push("caba asimetrisi"); if (k.surpriz > ESIKLER.surpriz) asilan.push("gizli maliyet"); if (k.kaynak < ESIKLER.kaynak) asilan.push("dayanaksiz iddia"); if (k.geriSayim === false) asilan.push("sahte aciliyet"); console.log( `${k.ad.padEnd(37)} ${(asilan.length === 0 ? "-" : asilan.join(", ")).padEnd(31)}` + ` ${asilan.length === 0 ? "mesru" : "KARANLIK KALIP"}` ); }
akis giris adimi cikis adimi asimetri esik (2x) odunc alma / iade 2 2 1.00x gecti teslim hatirlatmasi 1 1 1.00x gecti oneri bulteni 1 4 4.00x ASILDI uyelik 3 7 2.33x ASILDI kalem ilk gosterilen son toplam surpriz orani odunc (ucretsiz) 0 0 0 % gecti gec iade cezasi 0 12 100 % ASILDI sube arasi tasima 5 5 0 % gecti rezervasyon + tasima + gecikme 5 23 78 % ASILDI iddia bicimi gercek stokla korelasyon esik (0.9) veriden turetilen 1.000 gecti sabit uyari 0.000 ASILDI kismen bagli 0.807 ASILDI geri sayim oturumlar azalan mi gercek son tarih 58, 41, 27, 12, 3 evet her oturumda sifirlanan 10, 10, 10, 10, 10 HAYIR sayfa yenilendiginde sifirlanan 10, 10, 9, 10, 10 HAYIR karar asilan gosterge sonuc teslim hatirlatmasi acik varsayilan - mesru oneri bulteni acik varsayilan pismanlik, caba asimetrisi KARANLIK KALIP son nusha uyarisi (stoktan) - mesru son nusha uyarisi (sabit) dayanaksiz iddia KARANLIK KALIP rezervasyon geri sayimi sahte aciliyet KARANLIK KALIP gecikme cezasi son adimda gizli maliyet KARANLIK KALIP
Dört Göstergenin Okunması
Çaba asimetrisi, bir duruma girmek için gereken adım sayısının çıkmak için gereken adım sayısına oranıdır. Ödünç alma ile iade her ikisi de iki adım; oran 1.00. Öneri bülteni bir adımda açılıyor, dört adımda kapanıyor; oran 4.00. Bu ölçüm kütükten değil, arayüzün kendisinden yapılır: iki akışı sayarak. Sayım hiçbir varsayım gerektirmediği için en kolay denetlenen göstergedir.
Sürpriz oranı, son toplam bedelin taahhüt anında gösterilmemiş kısmının payıdır. Şube arası taşıma ücreti baştan yazıldığı için oran sıfır. Gecikme cezası hiç gösterilmediği için oran yüzde 100. Cezanın koşullu olması bir gerekçe değildir: kullanıcı ödünç alırken gecikme durumunda ne olacağını bilmiyorsa, taahhüdünün bir kısmını görmemiştir.
Kıtlık iddiasının veriyle bağı, gösterilen azlık iddiasıyla gerçek stok arasındaki korelasyondur. Veriden türetilen iddia 1.000 veriyor. Her kayda “son nüsha” yazan sabit uyarı 0.000 veriyor — iddia hiçbir şeye karşılık gelmiyor. Üçüncü satır ara bir durumu ölçüyor: iddia stokla kısmen ilişkili (0.807) ama stok üçün üstüne çıktığında sabitleniyor. Kısmen doğru bir iddia, denetimi geçmez; kullanıcı sayıya baktığında onun bir ölçüm olduğunu varsayar.
Geri sayımın azalıyor olması, aciliyetin gerçek bir son tarihe bağlı olup olmadığını gösterir. Gerçek son tarihte ardışık oturumlarda görülen kalan süre azalır. Her oturumda aynı değerden başlayan geri sayımda azalmaz. Üçüncü satır kolay kaçırılan bir biçimi gösteriyor: değerler biraz oynuyor ama bir yöne gitmiyor; süre gerçekte akmıyor, yalnızca akıyormuş gibi gösteriliyor.
Denetimin Sonucu ve Sınırları
Son tablo beş göstergeyi altı karara birlikte uyguluyor. Ödünç akışındaki kararlardan ikisi bütün eşikleri geçiyor; dördü en az bir eşiği aşıyor. Denetim, hangi göstergenin aşıldığını da yazdığı için doğrudan bir düzeltme listesi üretir: öneri bülteninin varsayılanı kapatılır ve kapatma adımı bire indirilir; sabit uyarı stok verisine bağlanır ya da kaldırılır; geri sayım gerçek bir son tarihe bağlanır ya da kaldırılır; gecikme cezası ödünç onayı ekranında yazılır.
Denetimin sınırları açıkça belirtilmelidir.
Eşikler bir uzlaşımdır. Çaba asimetrisinde iki kat, sürpriz oranında yüzde 20, korelasyonda 0.90 — bunlar hesaplanmış değil, seçilmiş değerlerdir. Değerlerin işlevi tartışmayı denetime çevirmektir: eşik yazılıysa bir kararın onu aşıp aşmadığı tartışılmaz, ölçülür. Eşiğin kendisi tartışılabilir ve tartışılmalıdır.
Bütün eşikleri geçen bir karar yine de kusurlu olabilir. Denetim, ölçülebilir izler bırakan kalıpları yakalar. Kullanıcıyı utandıran bir ret metni (“hayır, tasarruf etmek istemiyorum”) hiçbir sayıyı bozmaz; onay tuzağının bu biçimi ancak metin okunarak görülür. Denetim bir tarama aracıdır, bir kanıt değil.
Hiçbir gösterge dönüşüm artışıyla dengelenemez. Bir kalıbın ödünç alma sayısını yükseltmesi, denetimden geçtiği anlamına gelmez; Varsayılanların Gücü dersinde ve İlerleme dersinde ölçüldüğü gibi bu yükselişin kaynağı kullanıcının yanılmasıdır. Yanılma üzerine kurulmuş bir sayının büyüklüğü, kararın gerekçesi olamaz.
Reddetmek
Bu konunun tamamı, tasarımcının kullanıcının kararı üzerinde ne kadar güç taşıdığını göstermek içindi. Sonuç, gücün her tasarım kararında zaten kullanılıyor olmasıdır: tarafsız bir varsayılan, tarafsız bir sıralama, tarafsız bir vurgu yoktur.
Bu yüzden mesleki tutum “etkilemekten kaçınmak” olamaz; kaçınmak mümkün değildir. Tutum şudur:
Kararın hangi göstergeyi yükselttiği yazılır. Bir değişiklik önerildiğinde “neyi artıracağı” açıkça söylenmelidir. Yükselen sayı ödünç alma mı, yoksa istemeden verilen onay mı — bu ayrım yapılmadan tartışma yürütülemez.
Ölçüt kullanıcı adına uygulanır. Kullanıcı odada değildir; ölçütü onun yerine uygulayacak olan tasarımcıdır. “Kullanıcı bunu bilseydi de aynı seçimi yapar mıydı” sorusunun yanıtı hayırsa, karar reddedilir.
Ret bir gerekçeyle verilir. Yukarıdaki beş gösterge, reddin gerekçesini kişisel bir tercih olmaktan çıkarıp denetlenebilir bir bulguya çevirir. “Bunu yapmak istemiyorum” yerine “bu karar çaba asimetrisi eşiğini dört kat aşıyor ve kapatma adımı bire indirilebilir” denir.
Meşru bir alternatif önerilir. Denetimden kalan her kararın, aynı amacı ölçütü çiğnemeden karşılayan bir karşılığı çoğu zaman vardır: sahte kıtlık yerine gerçek stok bilgisi, zorlaştırılmış iptal yerine simetrik akış, gizli maliyet yerine taahhüt anında tam bedel.
Özet
- Meşruluk ölçütü tektir: kullanıcı kararın nasıl alındığını bilseydi de aynı seçimi yapacaksa karar meşrudur; kararın gücü bilgisizlikten geliyorsa karanlık kalıptır.
- Beş kalıp tanıma hedefi olarak tanımlanır: acele ettirme, gizli maliyet, zorlaştırılmış iptal, onay tuzağı, sahte kıtlık.
- Dört gösterge ölçülebilir iz bırakır: çaba asimetrisi, sürpriz oranı, kıtlık iddiasının veriyle korelasyonu ve geri sayımın gerçekten azalıp azalmadığı.
- Denetim, aşılan göstergeyi yazdığı için doğrudan bir düzeltme listesi üretir; eşikler uzlaşımdır ve tartışmayı denetime çevirmek için yazılır.
- Denetim bir tarama aracıdır: bütün eşikleri geçen bir karar da kusurlu olabilir ve yükselen bir dönüşüm sayısı hiçbir göstergeyi dengelemez.
- Tasarımcının tutumu etkilemekten kaçınmak değil, kararın hangi sayıyı yükselttiğini yazmak, ölçütü kullanıcı adına uygulamak, reddi gerekçeye bağlamak ve meşru alternatifi önermektir.
Sonraki Adım
Bu konu boyunca ölçütün uygulanabilmesi için sürekli bir şeye ihtiyaç duyuldu: kullanıcının bilgili tercihini, gerçek görev süresini, yararlı ziyaret oranını bilmeye. Bunların hiçbiri tahminle elde edilmez. Sonraki konu ölçmeye ayrılmıştır ve en temel soruyla başlar: bir arayüzün iyi olduğu nasıl gösterilir? Görev başarımı, süre ve hata oranı nasıl ölçülür, bu üç sayı nasıl tek bir ölçüte indirgenir ve ortalamanın yanıltıcı olduğu yerler nerelerdir?
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.