Specifikace: Samorozvrh

Samorozvrh bude program na tvorbu rozvrhu pro studenty UK. Uživatel zadá
předměty, na které chce chodit, a Samorozvrh mu vrátí, které paralelky má
zvolit. To je praktické, pokud si toho člověk chce zapsat hodně, nebo pokud
má nějaké speciální požadavky: chce mít jeden den volný, chce někdy končit
brzy nebo naopak začínat pozdě a podobně.

Pro uživatelské rozhraní implementuji webovou aplikaci, kde uživatel zadá
požadované předměty (pravděpodobně jejich kódy), zmáčkne tlačítko a na
serveru se spočítá rozvrh.

Program má tedy dvě takřka nezávislé části, frontend (webapp) a backend
(solver, který rozvrhy bude tvořit).

Použité technologie:

- frontend
    - Go: hlavně proto, že si ho chci vyzkoušet, a na servery je vhodné
      (často se chlubí svou concurrency)
    - blíže nespecifikovaný template engine na zobrazování

- backend
    - Google Optimization Tools: https://developers.google.com/optimization/
        - konkrétně její "constraint programming solver"
        - knihovna umí řešit problém nalezení rozvrhu, když jej popíšeme
          jako sadu rovnic a nerovnic
    - Python 3: Optimization Tools jsou sice v C++, ale mají mimo jiné
      Python bindingy. V Pythonu se vyvíjí velmi snadno a výkon nás moc nezajímá,
      protože vše výpočetně náročné zařizuje optimalizovaná knihovna.

Výhodou je, že se s programem dá hodně vyhrát - udělat minimální funkcionalitu
je jednoduché, ale dá se vymyslet velká spousta vychytávek, které se dají
přidat, zejména různé parametry na upřesnění toho, jak má vypadat ten
"nejlepší" rozvrh.