Table of Contents

Psaní a ladění programů

Nejdříve motivace:

Výňatek z e-mailove korespondence, do které adresát nijak nezasahoval, poslední mail přišel 4 hodiny po prvním:

Hotovo. Jsem trubka.
Už mi běhá první řádek, síla je pořád špatně, tak už to nechte já to
snad nějak doklepu.
Sin a cos v dJqz jsou prohozené, ale pořád tam něco nesedí … .
dobrý den,

mám zásadní problém dokončit úlohu X. Už nemůžu najít další
chybu. Našel jsem jich snad na desítky, ale teď už fakt netuším.
Vzhledem k tomu, že už jsem nad úlohou strávil více než 20 hodin času,
kterého nemám zrovna nazbyt, neboť DRR není jediný předmět, nemám už
sílu ani čas se v tom dál vrtat. Navíc nepředpokládám, že by mi
šťourání v programu a hledání chyb ve znaménkách apod. k něčemu bylo.
Zkoušel jsem už snad úplně všechno, co mě napadlo (ploty, numerické
výpočty, …) a netuším, kde může být chyba.

Můžete se prosím podívat na můj kód, co je špatně ?

Poučení

Jak tedy na to

  1. Pojmenovávat pěkně proměnné, delší smysluplné názvy pomáhají neplést jednotlivé proměnné.
  2. Zavádět proměnné pro konstanty: jestliže mám jedno rameno délky 2 a druhé rameno délky 3, ve vzorci y= cos(alfa) + 5*sin(alfa) už nejsem schopen rozpoznat, ze koeficient 1 u cosinu je rozdíl délek ramen a koeficient 5 je součet.
  3. Zavádět funkce, drobné funkce mohou být v Matlabu uvnitř funkce, která je používá. Například jsem byl svědkem mnoha “zázračných” rozchození programu, kdy se opakované ruční vypisování D-H matice nahradilo voláním funkce. Cílem není (ve většině kybernetických předmětů) napsat co nejúspornější kód, ale napsat co nejrychleji plně funkční kód. Kratší kód se ale většinou lépe ladí.
  4. Kontrolovat a ladit každý řádek či malou skupinu řádků zvlášť (platí pro Matlab) či každou funkci zvlášť (pro většinu ostatních procedurálních jazyků). Napsat celou úlohu najednou a pak zjistit, že to nefunguje, k ničemu nevede.
  5. Úlohy z robotiky a počítačového vidění nejsou triviální, a proto je nelze vyřešit slepým tápáním typu: zde změním znaménko, zde vyměním sinus za cosinus, zkusím přičíst pi/2. Zkuste si ve Vašem i triviálním programu (i třeba jen na dvou řádcich, kde máte podezření, že by mohla být chyba) spočítat všechna podobná binární rozhodnutí (počet znamének, počet goniometrických funkcí,…) a pak si spočtěte 2 na tento počet. Výsledek dělený dvěma dává průměrný počet (různých!) pokusů, které musíte vyzkoužet, než se trefíte do správného řešení v případě, že na žádnou kombinaci nezapomenete.
Drobné rady

Ještě jiný pohled

  1. To, že jsou v programu chyby, je normální. Inženýr s tím musí umět zápasit a žít. Je to náročné, ale když se to nenaučíme na škole, tak kdy?
  2. Nejprve si dobře rozmyslete strukturu problému. Papír, tužka, jazyk matematických vzorců a pohodlné křeslo daleko od klávesnice jsou základní nástroje.
  3. Pro každý podproblém si sestrojte (syntetický) testovací příklad.
  4. Budujte řešení zespoda, nejprve vyřešte menší podproblémy, udělejte z nich funkce (procedury) s jasné definovaným rozhraním (argumenty), a pak to postupně spojujte dohromady, každé dílčí řešení nebo jejich spojení ihned testujte a výsledky si vizualizujte. Matlab je na to skvělý nástroj. Jakmile něco nesedí, je třeba vrátit se zpět, často až ke křeslu a papírů se vzorečky. Pro složitější věci si neváhejte v Matlabu udělat interaktivní nástroj, úsilí se bohatě vyplatí. Testovací a verifikační kódy si vždy schovejte, aspoň do doby odevzdání výsledného díla.
  5. Při psaní kódu vždy používejte assert na všechny předpoklady, i na ty, o kterých si stoprocentně myslíte, že přeci musí vždy platit. Není větší žrout ladícího času než nenápadná chyba na jednom místě, která se bez zjevné souvislosti fatálně projeví na úplně jiném místě.
  6. Strávit na nepoddajném problémů 20 nebo více hodin není žádná ostuda, ani pro ostříleného borce. Borec se od neborce liší jenom tím, na které hladině složitosti začínají nepoddajné problémy.
  7. Špílec na závěr: Po odladění je vždy nejlepší celý program zahodit a napsat ho od začátku znovu, ale to si může dovolit jen málokdo.

Role automatického hodnocení

Automatické hodnocení také není zamýšleno ani prezentováno jako nástroj k odladění Vašeho programu, natož pak jediný nástroj.

Při vývoji programu byste měli postupovat asi takto:

  1. Úlohu si pořádně rozmyslet, napsat na papír v jazyce matematiky.
  2. Promyšleně implementovat algoritmus.
  3. Ladit malé části programu, teprve poté celek.
  4. Ladit celý program na datech, spočítaných na papíře.
  5. Ladit přímou a inverzní úlohu proti sobě (to je už postup specifický pro úlohy z Robotiky, povšimněte si, že všechny úlohy v Robotice jsou “tam a zase zpátky”. Za normálních okolností si protikus vývojář musí napsat často sám.
  6. Ladit pomoci dodané funkce checker_XXX. To platí pro úlohy 4, 5, 6.
  7. Na závěr si zkontrolovat výsledek pomoci automatického hodnocení.

Další odkazy

Automatické hodnocení - rady
Geometrie - rady, strana 2,3 a další.
Rounding errors