středa 1. dubna 2015

2. semestr na FELu

Už jsem tu docela dlouho nic nevyblil, tak budu zase chvíli nudně datlovat o tom, jak se mi studuje. Když jsem ještě na gymplu googlil nějaké informace k předmětům co mě na otevřené informatice čekají, blogy studentů a tak, kromě oficiálních sylabů jsem toho moc nenašel, tak třeba to tu najde nějaký budoucí otevřený informatik, a bude mu to k dobru.
První semestr byl vyloženě flákárna, jediný předmět, který se aspoň tvářil že by mohl dělat problémy, byla lineární algebra (když nepočítám hnusnou ekonomii, ale za to si přecejenom můžu sám). S druhým je to trochu horší a už se nás přecijen pokoušejí trochu zabít.

Mám tedy zase 4 povinné předměty:

Programování 2

Programování 2 velmi nečekaně navazuje na Programování 1 v Javě. V jedničce jsme probrali jakési základy algoritmizace, podmínky, cykly a takové věci, pak se přesunuli trochu do objektovosti a končili jsme dědičností. Dvojka navázala polymorfismem, pokračovala prací se soubory, výjimkami, lehkým úvodem do grafiky, vlákny a zrovna včera jsme dělali testování a logování. Tím jsme bohužel dokončili Javu, a od příště nás čeká Céčko. Na jednu stranu se docela těším, protože to je přecijen dobré umět, na druhou stranu se bojím, že budu z Javy, Pythonu a spol. rozmazlený a budu si na C pracně zvykat. Zatím jsem totiž všechno probírané uměl z dřívějška, snad kromě vláken, tak to bude trochu změna. Zase bych si ale časem rád zapsal nějaké programování grafiky kvůli počítačovým hrám, a k tomu je C/C++ potřeba, takže se budu hezky učit.

Oproti PR1 skoro nedostáváme domácí úkoly, jen teď jeden na testování, a pak budou asi 4 v Céčku. Místo toho děláme semestrální práci. Dostali jsme nějaká vzorová témata, ale nijak mě nezaujala, takže jsem se s panem cvičícím dohodl, že udělám vlastní. Tvořím tedy "program na programování", textový editor s automatickým obarvováním syntaxe, odsazováním, nápovědou a dalšími fičurami k programování v závislosti na zvoleném programovacím jazyce. Kvůli tomu se vyplatí chodit na programovací přednášky - jsou tam zásuvky a nuda, tak se aspoň dokopu naprogramovat kus semestrálky.

Algoritmizace

Největší zabiják celého semestru, ale taky asi nejužitečnější předmět. Přednášky pokrývají všechny možné datové struktury - fronty, grafy, stromy, mapy a sety, pak nějaké typické algoritmy jako je průchod do hloubky/šířky stromem/grafem, třídící algoritmy a tak. Přednášky jsou moc zajímavé, protože je to spousta věcí o kterých jsem třeba jen slyšel, a tady je dostaneme hezky pořádně i s typickými aplikacemi a odvozením. Člověk si hned připadá jako computer scientist.

Na cvičeních moc nealgoritmizujeme, spíš počítáme časovou složitost algoritmů, k čemuž se hodí právě diskrétní matematika z 1. semestru, nebo zkoumáme vlastnosti datových struktur, jako je hloubka vyváženého stromu nebo efektivní průchod grafem. Když už vyloženě vymýšlíme algoritmy, tak jen nějaké jednoduché na ukázku nějakého principu, jako jak z dvojce (inorder, preorder) výpisů rekonstruovat tvar binárního stromu, jak rychle seřadit posloupnost čísel, z nichž většina má stejnou hodnotu, a podobně.

Kámen úrazu jsou domácí úkoly. Těch máme za semestr dohromady 8, na každý máme +/- 3 týdny (což se zdá jako dost, ale je to potřeba), ale občas se překrývají. Každý úkol řeším v průměru 20 hodin, přičemž tak čtvrtinu času mi trvá pochopit co se po mně chce a vymyslet, jak budu reprezentovat data, pak přemýšlím, nadávám a čmárám, a nakonec to nabuším do kódu, nadávám a optimalizuju. Typicky jde o nějaký problém s několika miliardami možných řešení, který by se hrubou silou počítal několik let. Míváme na to pár sekund, takže to chce přijít s nějakým trikem jak to řešit efektivně. Často se totiž stane, že se pořád dokola počítá již spočítané, takže nastoupí dynamické programování a seseká se to, nebo se nejdřív zohlední cesty, které vypadají nadějně, zahodí cesty, které vypadají beznadějně, a podobně. Naučím se pěkně v praxi používat sprostá slova, ale musí se u toho přemýšlet a to moc bolí :(

Střídají se tu dva stavy, "kam sem to proboha vlez" když už několik hodin v kuse algoritmizuju a ono to pořád není správné/efektivní/funkční, a "to je tak super předmět já miluju algoritmizaci a programování machinae supremacy!!" po úspěšném odevzdání. Kvůli tomuhle předmětu se taky dost zvyšuje spotřeba kávy.

Docela se bojím zkoušky, kde dostaneme právě takovou úlohu a 4 hodiny na její vyřešení. Po 4 hodinách jsem totiž zatím vždycky měl jen představu jak by se to asi dalo řešit, kód žádný. To je naštěstí problém pro future me, tak ať se s tím popere jak chce.

Matematická analýza

Tohle je vyloženě příjemný předmět. Přednáší ho zase pan Habala z diskrétky a cvičí pan Hroch z lingebry, což je asi nejlepší možná kombinace učitelů, jaká se dá potkat. Navíc látka je zatím jen opakování semináře z matematiky z gymplu s nějakou teorií navíc. Časem se tedy dostaneme k funkcím více proměnných, ale ani to by neměl být nějaký velký průser. Oproti nefunkčním algoritmům jsou derivace a integrály vyložená mňamka.

Je fajn že všichni chápou, že budeme inženýři (tedy, doufejme) a né matematici, takže místo těžších důkazů jen řeknou proč a kdy to platí, a jde se dál, protože to stejně budeme používat a ne s tím dělat teorii, cehož jsme si dost užili v diskrétce a lingebře. Docela mě tam ty důkazy ale bavily, je takové hezké moct se přesvědčit, že věta opravdu dělá co čekám. Asi bych ale změnil názor, kdybych viděl pořádný matematicky analytický důkaz.

Logika a grafy

Jak název napovídá, jde o matematickou logiku a teorii grafů nacpanou do jednoho předmětu. Zatím jsme zvládli výrokovou logiku, cca příští týden dobereme predikátovou logiku, a pak hurá na grafy. Trošku atypicky jsme tedy grafy už probrali na algoritmizaci, ale spíše z toho uživatelského hlediska, tady to bude hezky s teorií.

Logika mi zatím připomíná takový jednoduchý programovací jazyk. Nejde o nic zvlášť složitého, spíš je potřeba zvyknout si na pedantské lpění na správném značení. Prý se to bude hodit v logických obvodech a logickém programování, tak je dobré vědět, že to není jen tak zbytečné. Na grafy se moc těším, protože to má dost široké oblasti použití ve všech možných algoritmech a umělé inteligenci, a zrovna ty algoritmizační úlohy zaměřené na grafy mě docela bavily.

Taky jsem si zapsal Technickou angličtinu pro mírně pokročilé a Německý jazyk 2, abych pokryl další nezbytné humanitní předměty. Angličtina je spíš "angličtina pro mírně pokročilé" než "technická angličtina", ale aspoň mám klid po té hrozné ekonomii z minulého semestru. Němčina je taky jednodušší než jsem se bál, přecijen jsem německy nepromluvil od konce gymplu, ale zatím se chytám. Dokonce používáme stejnou učebnici, podle které jsme jeli první asi dva roky na gymplu.


Od druhého ročníku se dělíme do tří oborů, takže jsem se zapsal na Informatiku a počítačové vědy. Příští semestr to pro mě znamená jen jednu matematiku navíc (na bakáláři tedy dohromady 8), ale pak přijde umělá inteligence, strojové učení a rozpoznávání, což bude to pravé scifi. Zbylé dva obory, softwarové inženýrství a nějaký ošklivý hardware mě moc nezaujaly - hardwaru se bojím, a softwarové inženýrství mě neláká, přijde mi to jako takové nekonečné drcení opravdu velikých zdrojových kódů a webových aplikcí. Jednu takovou dělám v práci a živit bych se tím vážně nechtěl. Neříkám že bude snadné najít práci s umělou inteligencí, ale přijde mi, že mít vystudovanou umělou inteligenci a dělat webové aplikace je jednodušší než naopak. A počítačové hry... *slinty slinty*

Dál je škoda že už skoro nemám čas pracovat, jednak ta algoritmizace je hrozný žrout času, a druhak po všem tom programování algoritmizace a semestrálky vážně nemám chuť sednout si a programovat ještě něco dalšího, navíc v prohnilém PHPčku po celkem slušné Javě a krásném Pythonu a Haskellu, se kterými si občas hraju.