Konstanty a entropie

Každý programátor ví, že má při programování používat konstanty místo "magických čísel". Obvykle se pro to uvádějí dva důvody:

  1. Lepší srozumitelnost kódu. Zápis

    strlen(s) < MAX_FILENAME_LENGTH

    zkrátka říká více než

    strlen(s) < 255
  2. Omezení duplicit. Když bude potřeba hodnotu čísla změnit, stačí to udělat jen na jednom místě.

Dnes při úpravě jednoho kousku kódu jsem si uvědomil třetí důvod: Různá magická čísla se totiž mohou plést do sebe. Pokud někde uvidíte kód

strncpy(dest, src, 255)

jak poznáte, že je to stejných 255 jako v předchozí ukázce? Strojově nijak, musíte se podívat na okolní kód a udělat úsudek. A lidský úsudek je náchylný k chybám.

Přemýšlel jsem nad tímto tématem ještě trochu dál a pak mi něco došlo. Všechny tři důvody se totiž dají vysvětlit pomocí jednoho "vyššího" pravidla. To pravidlo zní: Minimalizujte entropii svého programu.

Pojem entropie pochází z termodynamiky, kde se používá k charakterizování uspořádanosti systému. Malá entropie = systém je uspořádán, velká entropie = v systému je chaos. To je samozřejmě jen intuitivní a nepřesné vymezení, ale nyní nám postačuje (pokud ne, pomůže wikipedie).

Entropie se dá aplikovat i v rámci teorie informací. V systému s nízkou entropií je informací skryto mnoho (systém je uspořádaný, někde musí být řečeno jakým způsobem), v systému s vysokou entropií je jich naopak málo. Kvantoví fyzici dodnes přemýšlejí o tom, jak je to s informacemi nesenými částicemi, které spadnou do černé díry; lidé pohybující se okolo šifrování nebo komprimování se zas baví o entropii zpracovávaných dat.

Nyní už máme připravenou půdu pro vysvětlení, jak jsou uvedené tři důvody odvoditelné z pravidla o minimalizaci entropie. Toto pravidlo totiž v podstatě říká: Zvyšujte množství informací obsažených ve vašem programu. V případě prvního důvodu (srozumitelnost) jde o přidání informace o významu daného čísla pro programátora. Omezení duplicit pak znamená svázání jednotlivých výskytů čísla k sobě – další přidaná informace. A třetí důvod neříká nic jiného, než že použití konstant také do programu přidává informaci o tom, že některá čísla se stejnou hodnotou mají ve skutečnosti různý význam.

To, že používání konstant je ve skutečnosti snižování entropie, jsem si uvědomil teprve před pár desítkami minut. Ale už v tomto "raném stadiu myšlenky" mám pocit, že pomocí entropie půjde vysvětlit spousta dalších pravidel a programátorských zásad. Budu nad tím vším ještě přemýšlet. Každopádně už mi ale nikdo nevymluví, že programování a fyzika nemají nic společného.


Poznámka pro pečlivé čtenáře: Sice mluvím jen o konstantách pro čísla, samozřejmě ale vím, že konstanty se neomezují jen na ně. Jen se mi tak text lépe psal.