Jak se píší programy

V rámci cvičení předmětu ZOS budete nuceni vytvořit program. Zdá se, že mnoho lidí neví, odkud by měli při psaní vlastních programů začít - proto zde zveřejňuji několik "rad začínajícím programátorům".

Při psaní větších programů je obvykle výhodné postupovat v následujících krocích:

  1. získání představy o problému,
  2. hrubý návrh programu (shora dolů),
  3. vytváření funkčních částí (zdola nahoru),
  4. sestavení prvotního programu (shora dolů),
  5. ladění a testování,
  6. vytváření dokumentace.

Zkušení programátoři někdy mohou některé kroky vynechat, protože si je díky svému cviku již umí představit ("provést v hlavě"). Navenek to pak může vypadat, jako by se takový programátor zabýval pouze kódováním - není ovšem dobré, aby to napodobovali lidé, kteří v progrmování takový cvik ještě nemají.

Výše uvedený postup může být postačující, píšete-li program sami. Pro týmovou tvorbu větších softwarových celků existují postupy, se kterými se můžete seznámit v rámci předmětu PSWI Přemka Brady.

Získání představy o problému

V této fázi se zabýváme studiem problému. Je výhodné vrátit se ke starým a osvědčeným prostředkům, jako je papír a tužka a nakreslit si např.:

Výsledkem této fáze je obecná představa, jak budeme problém řešit.

Hrubý návrh programu

V této fázi se snažíme vytvářený program (problém) rozdělit do tak malých částí, abychom je dokázali postupně naprogramovat (vyřešit).

Program můžeme na části rozdělit tak, že nejprve v nějakém pseudokódu napíšeme kostru hlavního programu. Nezabýváme se přitom detaily - ty ponecháváme na budoucích potenciálních podprogramech a funkcích.

Máme-li napsanou kostru hlavního programu, probereme v něm použité podprogramy a rozepíšeme je podobným způsobem. Tak postupně rozepisujeme strukturu programu až do úrovně, kdy si dokážeme přibližně představit, jak by bylo možné příslušný podprogram asi napsat.

Postupným rozepisováním vytváříme strom struktury programu - kořenem stromu je hlavní program a listy stromu popisují nejnižší (tj. vnější) úroveň podprogramů. Místo psaní podprogramů v pseudokódu je někdy výhodné kreslit si tento strom.

Ve fázi hrubého návrhu programu nepíšeme žádné funkční podprogramy a místo toho předpokládáme, že daný podprogram příslušnou činnost nějak vykoná. Podprogramy definujeme také pro činnosti, které se v programu opakují na více místech (výsledná struktura pak už není strom).

Vytváření funkčních částí

V tomto kroku začneme psát skutečný kód námi vytvářeného programu. Postupujeme při tom v opačném pořadí oproti kroku předchozímu - začínáme s podprogramy nejnižší úrovně, které ihned testujeme.

Pro testování podprogramu můžeme vytvořit jednoduchý hlavní program, který bude pouze volat testovaný podprogram s příslušnými parametry. Jakmile je podprogram funkční, je třeba ho zdokumentovat - v této fázi postačí v komentáři k podprogramu uvést co podprogram dělá, význam vstupních a výstupních argumentů a případné návratové hodnoty.

Po vytvoření všech potřebných podprogramů nižší úrovně můžeme napsat podprogram vyšší úrovně a otestovat ho. Nakonec napíšeme vlastní hlavní program.

Vytvářením programu zdola nahoru postupně zvětšujeme vyjadřovací sílu jazyka, který pro psaní programu používáme. Ve chvíli kdy nám začnou velké části programu pracovat, stane se to pro nás také motivací k dalšímu programátorskému úsilí.

Sestavení prvotního programu

Výsledkem předcházejícího kroku je téměř funkční program, který je většinou možné ještě podstatně vylepšit.

Ladění a testování

Cílem tohoto kroku je zjistit, zda program vykonává to, co měl programátor na mysli při jeho vytváření.

Programátoři obvykle zkusí program krokovat, aby zjistili, jak program ve skutečnosti pracuje. Tam, kde je krokování obtížné, je vhodné do programu začlenit volitelné výpisy ladících informací (výpisy relevantních datových struktur apod.).

Dále je vhodné pro program vytvořit testovací data, která vyzkoušejí pokud možno všechny "zákruty" programu (meze podmínek apod.).

Narazíme-li na chybu, jejíž příčina není zřejmá, snažíme se nalézt nejmenší program a vstupní data, na kterých se chyba ještě projevuje. Z programu tedy vynecháváme kód (i na úkor funkčnosti) dokud není nalezen úsek, ve kterém se chyba skrývá.

Vytváření dokumentace

Součástí každého programu je (resp. měla by být) také uživatelská dokumentace. Ta by měla popisovat:

Pro tvorbu dokumentace je výhodné používat standardní postupy, které se učí na středních školách při hodinách češtiny. Nejprve si vytvořte osnovu - její jednotlivé body mohou složit také jako nadpisy budoucích kapitol a oddílů. Pak je třeba jednotlivé body osnovy "vyplnit" textem.

Při psaní dokumentace mějte na zřeteli staré dobré heslo: "Piš aby ses vyjádřil, nikoli abys imponoval. (Write to express, not to impress.)

Na závěr ještě drobná poznámka: Tento text se snaží pouze naznačit cestu, jak se v klasickém programovacím jazyce dobrat k vytvoření funkčního programu. Dobrý program má ovšem ještě jednu podstatnou vlastnost, nazývanou "kvalita". Kvalitu programu poznáme už na úrovni zdrojového textu programu podle jeho jisté elegance a srozumitelnosti. Na uživatelské úrovni poznáme kvalitu podle toho, že program nevstupuje rušivě do cesty našim záměrům. Obojím se programování podobá jiným odvětvím užitého umění, např. architektuře nebo typografii.

(Pokus o definici kvality můžete najít např. v knize [Robert M. Pirsig: Zen a umění údržby motocyklu. Volvox Globator, Praha 1996].)


Lukáš Petrlík
luki@kiv.zcu.cz