İçeriğe geç
academia.sh

Ders 11 / 11

Elektronik Tablonun Sınırları

Kursun on bir dersinde alınan 32 karar taranıyor ve yaygın yazımda yalnız 7'si sayfadan geri okunuyor: 6'sı bir adımda, 1'i iki adımda, 25'i hiçbir hücrede yok. Kararların tamamını yazmak 32 hücre eder, yani 9.385 veri hücreli sayfanın binde 3,4 kadarı. Sayfa büyüdükçe aralık okuyan bir sütun sabit işli sütundan 626 kat pahalıya çıkıyor ve satır iki katına çıkınca dört katına; aynı sırada bir satırlık aralık hatası 60 satırlık sayfada dört özetten ikisinde görünürken 1.877 satırlık sayfada hiçbirinde görünmüyor. İki formül metni 7.508 hücreyi dolduruyor: aracın ucuza yaptığı iş de budur.

İçindekiler

Bir önceki ders grafiğin iki kararını saydı ve dördünden üçünün sayfada hiç durmadığını gösterdi. Aynı sonuç on bir dersin hepsinde çıktı: hesap doğru yapıldı, sayı üretildi, karar kayboldu. Bu ders o kayboluşu tek bir sayıya indirir ve aracın sınırını üç yerde ölçer — kaç karar geri okunabiliyor, sayfa büyüdükçe ne büyüyor, bir hata ne zaman görünmez olur.

Sınır bir kusur değildir. Elektronik tablo on bir derste hiçbir kurulum istemeden on bir soruyu cevapladı ve bu dersin son sayısı o ucuzluğu da ölçer. Ölçülen şey aracın kötü olduğu değil, hangi işi ucuza, hangi işi hiç yapmadığıdır.

  • TO23. Bu ders yeni bir veri kümesi kurmaz. On bir dersin sayıları kaynak derslerden okunur; koşan bölüm bu sayıları döküm olarak tutar ve üzerinde sayar. Sayfa modeli yine node ile kurulur ve model olduğu yazılır.
  • TO24. Döküm her dersin yaygın yazımını ölçer. Aynı derslerde kurulan izli sürümlerde kararların hepsi bir adımda okunur; ölçülen fark yazım biçiminin farkıdır, aracın yeteneğinin değil.
  • TO25. Boyut süreyle ölçülmez. Sayılan şey tek bir yeniden hesapta değerlendirilen hücre sayısıdır; bu sayı donanımdan bağımsızdır ve sayfanın biçiminden çıkar.
  • TO26. Bir değişimin görünür sayılması için eşik yüzde 1’dir, çünkü bu kursun özetleri iki anlamlı basamakla raporlanıyor.

Kaç Karar Geri Okunabiliyor

// kapanis.mjs — kursun on bir dersinde alinan kararlarin dokumu. Her satir bir
// dersin kararlarini ve o kararin YAYGIN YAZIMDA sayfadan kac adimda geri
// okundugunu tutar: 1 adim formulde ya da baslik satirinda yazili, 2 adim ayri
// bir not hucresinde, null hicbir hucrede yok. Sayilar kaynak derslerden okundu.
export const DERS = [
  ["temeller/01 calisma sayfasi", ["basvuru turu", "birim ucret kaynagi"], [2, null]],
  ["temeller/02 temel islevler",
    ["sayma isleminin secimi", "ortalamanin paydasi", "metin sayilarin atlanmasi"],
    [1, null, null]],
  ["temeller/03 mantiksal islevler",
    ["sinir karsilastirmasi", "kosullarin sirasi", "basamak esikleri"], [null, null, null]],
  ["temeller/04 metin islevleri",
    ["kirpma duzeyi", "harf donusumunun dili", "duzeltmenin yeri"], [1, 1, null]],
  ["temeller/05 tarih islevleri",
    ["gun sayma kurali", "ay sonu kurali", "tarihin turu"], [null, null, null]],
  ["temeller/06 arama islevleri",
    ["sutun numarasinin turu", "eslesme turu"], [null, null]],
  ["ozet/01 yinelenen kayitlar",
    ["olcut sutunlari", "metin kirpma", "tutulan satir", "silinen sayisi"],
    [null, null, null, null]],
  ["ozet/02 eksik veri",
    ["hangi hucre bostu", "doldurma yontemi", "sifirin anlami", "hesaba giren satir"],
    [null, null, null, null]],
  ["ozet/03 ozet tablolar",
    ["kirilim alani", "olcu islevi", "filtrenin yeri", "hesaplanan alanin duzeyi"],
    [1, 1, null, null]],
  ["ozet/04 temel grafikler",
    ["grafik turu", "eksen baslangici", "cizilen aralik", "dilimler butun veriyor mu"],
    [null, null, 1, null]],
];
// Kursun sayfasi: tekillestirmeden sonra kalan satirlar ve tasidigi sutunlar.
export const SATIR = 1877, SUTUN = 5;
export const y = (w) => (h) => h.map((v, j) => (j ? String(v).padStart(w[j])
  : String(v).padEnd(w[0]))).join("");

if (import.meta.url === `file://${process.argv[1]}`) {
  const y1 = y([30, 8, 9, 9, 11]);
  console.log(y1(["ders", "karar", "1 adim", "2 adim", "okunamaz"]));
  let t = 0, bir = 0, iki = 0;
  for (const [ad, kararlar, adim] of DERS) {
    const a = adim.filter((x) => x === 1).length, b = adim.filter((x) => x === 2).length;
    t += kararlar.length; bir += a; iki += b;
    console.log(y1([ad, kararlar.length, a, b, kararlar.length - a - b]));
  }
  const okunur = bir + iki;
  console.log(y1(["TOPLAM", t, bir, iki, t - okunur]));
  console.log(`\non bir dersin ilk onunda ${t} karar alindi; yaygin yazimda ${okunur} tanesi ` +
    `sayfadan geri okunuyor, ${t - okunur} tanesi hicbir hucrede yok`);
  console.log(`geri okunanlarin ${bir} tanesi bir adimda, ${iki} tanesi iki adimda okunuyor; ` +
    `oran yuzde ${(100 * okunur / t).toFixed(0)}`);
  // Kararin yazilmasinin bedeli: karar basina bir hucre.
  const veri = SATIR * SUTUN;
  console.log(`${t} kararin tamamini yazmak ${t} hucre eder; sayfanin ${SATIR} satir ve ` +
    `${SUTUN} sutunu ${veri} veri hucresi tutuyor, kaydin bedeli sayfanin binde ` +
    `${(1000 * t / veri).toFixed(1)} kadari`);
  // Kararin gomulu oldugu yerler, konuya gore.
  const konu = (p) => DERS.filter(([a]) => a.startsWith(p))
    .reduce((s, [, k, d]) => [s[0] + k.length, s[1] + d.filter(Boolean).length], [0, 0]);
  const [tt, to] = [konu("temeller"), konu("ozet")];
  console.log(`hucre islevleriyle calisan alti derste ${tt[1]}/${tt[0]} karar okunuyor, ` +
    `sayfanin butunune bakan dort derste ${to[1]}/${to[0]}`);
}
ders                             karar   1 adim   2 adim   okunamaz
temeller/01 calisma sayfasi          2        0        1          1
temeller/02 temel islevler           3        1        0          2
temeller/03 mantiksal islevler       3        0        0          3
temeller/04 metin islevleri          3        2        0          1
temeller/05 tarih islevleri          3        0        0          3
temeller/06 arama islevleri          2        0        0          2
ozet/01 yinelenen kayitlar           4        0        0          4
ozet/02 eksik veri                   4        0        0          4
ozet/03 ozet tablolar                4        2        0          2
ozet/04 temel grafikler              4        1        0          3
TOPLAM                              32        6        1         25

on bir dersin ilk onunda 32 karar alindi; yaygin yazimda 7 tanesi sayfadan geri okunuyor, 25 tanesi hicbir hucrede yok
geri okunanlarin 6 tanesi bir adimda, 1 tanesi iki adimda okunuyor; oran yuzde 22
32 kararin tamamini yazmak 32 hucre eder; sayfanin 1877 satir ve 5 sutunu 9385 veri hucresi tutuyor, kaydin bedeli sayfanin binde 3.4 kadari
hucre islevleriyle calisan alti derste 4/16 karar okunuyor, sayfanin butunune bakan dort derste 3/16

Yedi. Otuz iki karardan yedisi sayfadan geri okunuyor, yirmi beşi hiçbir hücrede durmuyor; oran yüzde 22. Geri okunan yedinin altısı bir adımda okunuyor ve bunun bir nedeni var: o altısında kararı taşıyan şey ayrı bir açıklama değil, işlevin ya da başlığın kendi adı. Kırpma işlevi kırptığını söyler, harf dönüşümü hangi dilin kuralını uyguladığını söyler, özet tablonun başlığı kırılım alanını yazar. Kendi adını taşıyan karar kurtulur.

Kalan yirmi beşi kaybeden şey ortak bir biçimdir: karar bir sayıya dönüşüp bir formülün içine girmiştir. Sütun numarası bir sabit, sınır karşılaştırması bir işleç, eşleşme türü bir sıfır, doldurma değeri bir ondalık sayı olur. Sayı hesabı doğru yapar ve hangi soruya cevap verdiğini söylemez.

Dökümün alt satırı bir beklentiyi bozuyor. Hücre işlevleriyle çalışan altı derste 16 karardan 4’ü okunuyor, sayfanın bütününe bakan dört derste 16 karardan 3’ü. Tablonun bütününe geçmek durumu düzeltmiyor: tekilleştirme ve doldurma kararlarının hiçbirini bırakmıyor, çünkü ikisi de sayfayı değiştirip kendini siliyor.

Son satır bedeli veriyor. Otuz iki kararın tamamını yazmak 32 hücre eder. Sayfanın kendisi 1.877 satır ve 5 sütunla 9.385 veri hücresi tutuyor, yani kaydın bedeli sayfanın binde 3,4 kadarı. Kararların yazılmamasının nedeni maliyet değildir.

Sayfa Büyüdükçe Ne Büyüyor

// boyut.mjs — sayfa buyudukce ne buyuyor. Sure olculmez; sayilan sey tek bir
// yeniden hesapta degerlendirilen hucre sayisi ve bir satirlik hatanin ozette
// gorunur olup olmadigidir. MODELDIR: hucre bir eslemede durur.
import { y } from "./kapanis.mjs";
const HARF = (j) => String.fromCharCode(65 + j);
const DEGER = (i) => 10 + ((i * 7) % 40) * 0.5;

// Iki formul turu. Sabit isli formul yalnizca kendi satirini ve bir parametre
// hucresini okur. Aralik okuyan formul her satirda butun sutunu tarar --
// kosullu toplama ve arama islevleri boyle davranir.
const kur = (n, aralikli) => {
  const h = new Map(); let sayac = 0;
  h.set("P1", 8.4);
  for (let i = 0; i < n; i++) h.set(`A${i + 2}`, DEGER(i));
  const oku = (ad) => { sayac++; const v = h.get(ad);
    return typeof v === "function" ? v() : v; };
  for (let i = 0; i < n; i++) h.set(`B${i + 2}`, aralikli
    ? () => { let t = 0;
        for (let j = 0; j < n; j++) { const v = oku(`A${j + 2}`); if (v > 20) t += v; }
        return t; }
    : () => oku(`A${i + 2}`) * oku("P1"));
  return () => { sayac = 0;
    for (let i = 0; i < n; i++) oku(`B${i + 2}`); return sayac; };
};

const y1 = y([10, 16, 20, 12]);
console.log("tek yeniden hesapta degerlendirilen hucre sayisi");
console.log(y1(["satir", "sabit isli sutun", "aralik okuyan sutun", "oran"]));
let onceki = null;
for (const n of [1877, 3754, 7508]) {
  const [a, b] = [kur(n, false)(), kur(n, true)()];
  console.log(y1([n, a, b, (b / a).toFixed(0)]));
  if (onceki) console.log(`  satir iki katina cikinca sabit isli sutun ` +
    `${(a / onceki[0]).toFixed(1)} katina, aralik okuyan sutun ` +
    `${(b / onceki[1]).toFixed(1)} katina cikti`);
  onceki = [a, b];
}
console.log(`iki sutunun her biri tek bir formul metniyle yazildi ve 7508 hucreye ` +
  `kopyalandi; sayfanin ucuza yaptigi is budur`);

// Bir satirlik hata: aralik son satiri disarida birakiyor. Degisimin gorunur
// sayilmasi icin esik yuzde 1'dir, cunku ozetler iki anlamli basamakla okunuyor.
const ESIK = 1.0;
const OZET = [["toplam", (a) => a.reduce((x, z) => x + z, 0)],
  ["ortalama", (a) => a.reduce((x, z) => x + z, 0) / a.length],
  ["en buyuk", (a) => Math.max(...a)], ["sayim", (a) => a.length]];
const y2 = y([10, 12, 12, 12, 12, 14]);
console.log(`\naralik bir satir kisa alinirsa ozet yuzde kac degisir (esik ${ESIK})`);
console.log(y2(["satir", ...OZET.map((o) => o[0]), "gorunur"]));
for (const n of [60, 1877]) {
  const tam = Array.from({ length: n }, (_, i) => DEGER(i)), eksik = tam.slice(0, n - 1);
  const fark = OZET.map(([, f]) => 100 * Math.abs(f(tam) - f(eksik)) / f(tam));
  console.log(y2([n, ...fark.map((v) => v.toFixed(2)),
    `${fark.filter((v) => v > ESIK).length}/${OZET.length}`]));
}
console.log(`ayni hata 60 satirlik sayfada iki ozette gorunur, 1877 satirlik sayfada ` +
  `hicbirinde gorunmez: sayfa buyudukce hatanin kendisi degil gorunurlugu kuculur`);
tek yeniden hesapta degerlendirilen hucre sayisi
satir     sabit isli sutun aralik okuyan sutun        oran
1877                  5631             3525006         626
3754                 11262            14096270        1252
  satir iki katina cikinca sabit isli sutun 2.0 katina, aralik okuyan sutun 4.0 katina cikti
7508                 22524            56377572        2503
  satir iki katina cikinca sabit isli sutun 2.0 katina, aralik okuyan sutun 4.0 katina cikti
iki sutunun her biri tek bir formul metniyle yazildi ve 7508 hucreye kopyalandi; sayfanin ucuza yaptigi is budur

aralik bir satir kisa alinirsa ozet yuzde kac degisir (esik 1)
satir           toplam    ortalama    en buyuk       sayim       gorunur
60                1.40        0.27        0.00        1.67           2/4
1877              0.04        0.01        0.00        0.05           0/4
ayni hata 60 satirlik sayfada iki ozette gorunur, 1877 satirlik sayfada hicbirinde gorunmez: sayfa buyudukce hatanin kendisi degil gorunurlugu kuculur

İlk tablo iki formül türünü yan yana koyuyor. Sabit işli bir sütun her satırda yalnız kendi satırını ve bir parametre hücresini okur; 1.877 satırda tek bir yeniden hesap 5.631 hücre değerlendirmesi ister ve satır iki katına çıkınca sayı iki katına çıkar. Aralık okuyan bir sütun — koşullu toplama, dikey arama, eşleşme–dizin bu türdendir — her satırda bütün sütunu tarar; aynı sayfada 3.525.006 değerlendirme ister, yani 626 kat, ve satır iki katına çıkınca sayı dört katına çıkar.

Sınır buradadır ve donanımla ilgisi yoktur: sayfa on kat büyüdüğünde sabit işli sütun on kat, aralık okuyan sütun yüz kat ağırlaşır. Aynı tablonun son satırı aracın öbür yüzünü gösteriyor: iki sütunun her biri tek bir formül metniyle yazıldı ve 7.508 hücreye kopyalandı. Bir soruyu bir kez yazıp binlerce satıra yaymak elektronik tablonun ucuza yaptığı iştir.

İkinci tablo boyutun ikinci yüzünü ölçüyor. Bir aralık son satırı dışarıda bırakırsa 60 satırlık bir sayfada toplam yüzde 1,40, sayım yüzde 1,67 oynar ve dört özetten ikisi görünür biçimde değişir. Aynı hata 1.877 satırlık sayfada toplamı yüzde 0,04 oynatır ve dört özetin hiçbirinde görünmez. Hata küçülmedi, sayfa büyüdü. Her satırın özet üzerindeki payı düştükçe gözle denetim işe yaramaz hale gelir — oysa o, kararların yazılmadığı bir sayfada elde kalan tek denetimdir.

Özet

  • Kursun on bir dersinde alınan 32 karardan yaygın yazımda 7’si geri okunuyor, 25’i hiçbir hücrede yok; oran yüzde 22.
  • Geri okunan yedinin altısı bir adımdadır ve hepsinde kararı taşıyan şey işlevin ya da başlığın kendi adıdır; kaybolan yirmi beşi bir sabite ya da bir işlece dönüşmüştür.
  • Kararların tamamını yazmak 32 hücre eder, sayfanın 9.385 veri hücresinin binde 3,4 kadarı; yazılmamalarının nedeni maliyet değildir.
  • Aralık okuyan bir sütun 1.877 satırda sabit işli sütundan 626 kat pahalıdır ve satır iki katına çıkınca dört katına çıkar; sabit işli sütun iki katına çıkar.
  • Aynı bir satırlık aralık hatası 60 satırlık sayfada dört özetten ikisinde görünür, 1.877 satırlık sayfada hiçbirinde görünmez.
  • Aynı sayfa iki formül metniyle 7.508 hücreyi doldurur; aracın ucuza yaptığı iş budur.

Kurs Kapanışı

Ders Sayı Değişen karar Fark Karar geri okunabilir mi
temeller/01 çalışma sayfası 13 427,16 toplam başvuru türü 3 354,98, 59 hücre 1/2, iki adım
temeller/02 temel işlevler 708,5 m³ toplam metin sayıların sayılması 967,2 m³, yüzde 26,7 1/3, bir adım
temeller/03 mantıksal işlevler 26 219,52 tutar sınır karşılaştırması 26 698,32, yüzde 35,5 0/3, okunamaz
temeller/04 metin işlevleri 8 eşleşen kayıt kırpma ve harf dönüşümü 48 kayıt, 1204,8 m³ 2/3, bir adım
temeller/05 tarih işlevleri 6,33 gün ortalama gün sayma kuralı 5,20 ve 7,33 gün 0/3, okunamaz
temeller/06 arama işlevleri 1204,8 m³ toplam gömülü sütun numarası 1084,6 m³, 48 kayıt 0/2, okunamaz
özet/01 yinelenen kayıtlar 1.877 satır kalır tekilleştirme ölçütü 1.400 satır, 12 121,0 m³ 0/4, okunamaz
özet/02 eksik veri 19,23 m³ ortalama boş hücre dışlanır mı 18,04 ve 20,54 m³ 0/4, okunamaz
özet/03 özet tablolar kuzey 10.905,8 m³ kırılımın ölçüsü doğu ve merkez birinci 2/4, başlıkta
özet/04 temel grafikler 1,63 çubuk oranı eksen başlangıcı 13,00 oran, 8,0 kat 1/4, aralık
özet/05 sınırlar 7 karar okunur kararın yazıldığı yer 25 karar kayıp 7/32, yüzde 22

Kursun kuralı bu tablodan çıkıyor: elektronik tablo bir hesap aracıdır, bir kayıt aracı değildir; hücreye gömülü karar, yazılmamış karardır. On bir derste hiçbir hesap yanlış yapılmadı ve hiçbir işlem hata vermedi; kaybolan şey hesap değil, hesabın hangi soruya cevap verdiğiydi. Aynı tabloyu iki kişi açtığında aynı sayıyı bulmasını sağlayan şey tablonun kendisi değil, tablonun dışında tutulan tanımdır. Aracın ucuza yaptığı iş de aynı ölçüyle yazılabilir: tek bir formül metni 7.508 hücreye yayılır, kararların tamamını yazmak ise sayfanın binde 3,4’ü kadar yer tutar.

Bu on bir ders boyunca kararlar hücrelere gömüldü ve çoğu geri okunamadı. Ama daha temel bir soru hiç sorulmadı: bu veri tabloya nereden geldi ve gelirken ne oldu. 1.877 satırın hepsi bir saha formundan, bir okuma cihazından ya da bir başka sistemin dışa aktarımından geçti; her geçişte bir alan yeniden adlandırıldı, bir tarih biçimlendi, bir kod kırpıldı. Sonraki kurs, Veri Toplama ve Hazırlama, tablonun başladığı yerden öncesini açar ve verinin tabloya girene kadar kaç elden geçtiğini sayar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat