Obhajoba projektu Guido
Po dlouhých dvou letech práce jsme konečně odevzdali softwarový projekt Guido a úspěšně obhájili. Pokusím se sepsat své dojmy z práce na projektu a ponaučení, která jsem si z něj odnesl.
O projektu
Guido byl na poměry softwarových projektů na MFF poměrně neobvyklý tím, že se jednalo o projekt náročnější hlavně z teoretického hlediska. Konkrétně šlo o implementaci relativně nové teorie z oboru umělé inteligence založené na práci s pravděpodobností. To s sebou přináší několik vlastností, se kterými je dobré počítat předem (my jsme si je ze začátku neuvědomovali úplně do důsledků)
- Množství kódu v takovém projektu je ve srovnání s jinými malé. Pro nezůčastněného člověka to může znamenat, že jste na takovém projektu odvedli málo práce. Vy víte, že to není pravda, bohužel čas strávený studiem a optimalizacemi se na výsledku projeví jen nepřímo.
- Je možné, že komise a oponent projekt nepochopí a nebude ho chtít nechat obhájit. To se nám (alespoń z té druhé části) nestalo.
- Vývoj takového projektu se těžko odhaduje dopředu. Nevíte, kdy narazíte na zádrhel, který vás zdrží nebo donutí část projektu přepracovat.
Na druhou stranu je nutné dodat, že takový projekt pravděpodobně nebude jenom o datlování kódu v co největším množství, ale půjde hlavně o experimentování, hledání nových postupů a optimalizace těch starých. Tím se projekt stává zajímavější a můžou se tím vyvážit i výše uvedené nepříjemnosti. Možná Vás i bude bavit
O týmu
Tým jsme sestavili ještě před začátkem projektu, náš cíl byl co nejmenší tým (a z toho plynoucí menší projekt a jednodušší organizace práce), dohromady tedy čtyři řešitelé (přesněji tři řešitelé, jedna řešitelka a vedoucí). Všichni jsme se znali předem alespoń od vidění z přednášek o umělé inteligenci a díky tomu jsme minimálně vzájemně tušili, co je kdo zač.
V mnoha soupisech zkušeností z obhájených projektů se píše "neberte do týmu své přátele, protože po dokončení projektu už to přátelé nebudou." Myslím, že takové doporučení není úplně správné, v kažédm případě byste měli předem vědět, s kým budete pracovat, protože se svými kolegy s projektu budete muset vydržet rok nebo dva a šance na změnu jsou (zvlášť ve chvíli, kdy je větší část projektu hotová) mizivé.
Je dobré si předem zjistit, kdo z týmu se chystá odjet studovat do zahraničí, kdy a na jak dlouho. Půlka našeho týmu po roce vycestovala na rok do Amsterdamu, naštěstí ale oba ve stejný čas do stejného města, proto jsme mohli pokračovat v práci jenom s drobnou změnou v dělení práce.
O vývoji
Stejně jako zadání nepatřilo mezi úplně typická, tak ani vývoj neprobíhal tak, jak je u softwarových projektů obvyklé. Alespoń podle zkušeností z obhájených projektů jsem pochopil, že práce na projektu se obvykle v úvodní fázi rozdělí do několika částí podle počtu účastníků a ti pak samostatně pracují na svých částech a jen čas od času se sejdou, aby probrali noviky a určili směr dalšího vývoje.
To v případě Guida nebylo úplně možné, protože ani po začátku vývoje nebylo úplně jasné jaká bude náročnost jednotlivých částí projektu. Navíc se nám před zahájením projektu dostala do ruky kniha Extrémní programování od Kenta Becka. Popisované výhody některých postupů byly natolik inspirativní, že jsme se rozhodli je adaptovat.
Základem bylo párové programování, které se nám dařilo udržet téměř po celou dobu vývoje (a to i ve chvíli, kdy polovina týmu odjela za Erasmem do Amsterdamu). Díky tomu odpadla nutnost pravidelných týmových schůzek, protože při vývoji byl obvykle celý tým pohromadě v labu a díky tomu jsme mohli sdílet informace a klást dotazy hned na místě, stačilo jen otočit hlavu. Alespoń z části jsme dodrželi pravidlo o sřídání vývojářů na kódu tak, aby pravidelně procházel (implicitně) revizemi i od dalších vývojářů.
Vývoj tímto způsobem sice probíhá na pohled o něco pomaleji, ale na druhou stranu si myslím, že výskyt chyb v kódu a rychlost jejich odstrańování byly proti individuálnímu vývoji nesrovnatelné.
Díky způsobu vývoje odpadla i nutnost explicitně stanovit vedoucího týmu, protože tým byl v době vývoje celý na jednom místě, bylo možné důležitá rozhodnutí dělat okamžitě a velice efektivně.
Pro vývoj libovolného projektu je vhodné používat systém pro správu verzí, u týmových projektů se jedná o věc naprosto nutnou. My jsme díky nezkušenosti použili CVS, které zvlášť pro projekty v Javě vřele nedoporučujeme, jeho věk je na něm dost znát. Ale libovolný systém je lepší než žádný a nakonec jsme se rozhodli, že si nebudeme přidělávat starosti s přenášením repository na jinam a doklepali jsme to s ním až do konce.
Užitečnou pomůckou při vývoji byly automatické (unit) testy, které díky povaze projektu bylo možné aplikovat ve skutečně velké míře. Testované byly prakticky všechny třídy s výjimkou GUI, kde automatické testování není tak jednoduché a účinné. Možnost kdykoliv kompletně otestovat kód je k nezaplacení – a navíc nám díky testům množství kódu dost narostlo
Spolu s automatickými testy jsme zavedli pravidlo, že projekt v CVS musí být vždy kompilovatelný a všechny testy musí na kódu z CVS uspět (a které jsme dokonce až na pár výjimek dodrželi). To opět velkou měrou přispělo k soudržnosti a nízké chybovosti našeho kódu, protože každý člen týmu měl možnost po celou dobu vývoje testovat projekt jako kompletní aplikaci a každý se radší zamyslel, než něco commitoval do CVS.
Další absolutní nutností je buď e-mailová konference s vyhledáváním, nebo vlastní diskusní fórum. Obojí je poměrně jednoduché zařídit a vždy se vyplatí mít někde archiv všekeré důležité komunikace ohledně produktu. Osobně dávám přednost diskusnímu fóru, které umožńuje lepší organizaci diskusních threadů, jejich další třídění do kategorií a případně i další finesy (například aktuální TODO list vyvěšený na titulní straně).
O závěrečném týdnu
Asi u všech softwarových projektů začne pracovní tempo měsíc až dva před odevzdáním rapidně stoupat, s vyvrcholením v posledním týdnu. Je dobré počítat s tím, že v tomto týdnu už nestihnete nic nového naprogramovat, protože budete číst a přepisovat dokumentaci, zajišťovat její tisk, vyrábět instalační CD a do toho opravovat poslední bugy, které se najednou začnou projevovat v nečekané míře.
Pro poslední týden nebo dva je vhodné si udělat TODO list včetně priorit a věnovat se jenom položkám s nejvyšší prioritou (a těm, které můžete dokončit hodně rychle). Nemá smysl se pouštět do úkolů, které zaberou více jak den, pokud nejsou pro odevzdání naproso nepostradatelné. Byl by problém je dokončit a otestovat v rámci celé aplikace, a nestabilní nebo neotestovaná odevzdaná verze určitě není něco co byste chtěli.
Hned po odevzdání je dobré si zjistit, kdo bude projekt oponovat a nabídnout mu předvedení projektu. Oponent bude mít lepší pocit a vy budete poměrně rychle vědět, jak si s projektem stojíte a co můžete čekat na obhajobě. Navíc to je šance, jak si vyslechnout nepříjemné připomínky k projektu ještě před obhajobou a případně je do té doby vyřešit.
O dokumentaci
Dokumentace se odevzdává jednak uživatelská a jednak programátorská. K uživatelské není asi co dodat, snad jen že by měla popisovat skutečně všechny funkce, protože co není v dokumentaci, o tom se nikdo nedozví. Nevím, jaká je situace u jiných projektů, ale v tom našem se uživatelské rozhraní stabilizovalo až ke konci a předtím jaksi nebylo uživatelskou dokumentaci o čem psát.
Programátorskou dokumentaci je možné rozložit do dvou částí – na jedné straně komentáře v kódu (JavaDoc, resp. Doxygen) a na druhé dokumentace psaná jako souvislý text, která popisuje kód z nadhledu a usnadńuje orientaci. Obě části mají svoje místo a ani jedna nemůže úplně nahradit tu druhou. A obě je dobré psát hned od začátku. Opět se vyplatí pravidlo, že nekomentovaný kód do CVS nesmí, které jsme bohužel zas tolik nedoržovali.
Při psaní JavaDoc komentářů je dobré už od začátku dbát na kvalitu a výmluvnost, pokud je u funkce setScale popisek Sets scale, tak to asi nikomu nepomůže. Je vhodné se při psaní inspirovat strukturou a způsobem vyjadřování v dokumentaci k JDK (resp. inspirovat se MSDN).
K tisku jsme měli připravených cca 50 stran povídací programátorské dokumentace, do které jsme chtěli doplnit JavaDoc dokumentaci důležitých tříd (převedenou pomocí Doxygenu do latex formátu). Nechali jsme to na poslední večer před tiskem s tím, že vygenerované soubory jednoduše upravíme a přiložime. Co k tomu říct… po shlédnutí vygenerovaných souborů bylo jasné, že neupravíme a přiložíme jen v html podobě na odevzdaném CD. Proto bych rád upozornil všechny, kteří počítají s tím, že poslední den vygenerují programátorskou dokumentaci z komentářů v kódu, aby si to raději napřed vyzkoušeli a pak počítali ještě jednou.
O prezentaci
K prezentaci je nejdůležitejší vědět, že 30 minut včetně proslovu oponenta, vedoucí a diskuse je strašně krátká doba. Je dobré počítat s tím, že na proslovy a diskusi minimálně 10 minut padne, proto je lepší prezentaci plánovat na 15 minut (s tím, že před komisí se vaše prezentace možná mírně protáhne).
Cílem prezentace není předvést všechna okna v projektu a kompletně popsat jeho API, ale ukázat, co jste vlastně udělali a čím to je zajímavé, na technické detaily je programátorská dokumentace. Cílem je porotu zaujmout a přesvědčit ji, že váš projekt je super, ne ji ze začátku uspat a doufat, že se jí bude zdát něco pěkného a nechá projekt obhájit.
Před odevzdáním projektu si zajděte alespoń na jedny obhajoby a sledujte, co týmy při prezentaci dělají a jak na to komise reaguje, snažte se pochytit, co se komisi nelíbilo, proč a takového jednání se při vlastní prezentaci vyvarovat.
Také se zkuste předem zamyslet nad tím, na jaké dotazy by se vás komise a ostatní účastníci obhajob mohli ptát a připravte si na tyhle dotazy odpovědi. Schopnost pohotově odpovědět určitě udělá na všechny dobrý dojem.
O projektech obecně
Softwarový projekt pro mě byl zajímavá zkušenost,ale myslím si, že svůj hlavní cíl – totiž naučit studenty týmové práci na větším softwarovém díle neplní. O tom, jak (ne)má probíhat vývoj projektu ve více lidech jsem se během několika měsíců zaměstnání v nejmenované softwarové firmě dozvěděl mnohem víc. Na druhou stranu práce na projektu dobře posloužila pro vyzkoušení si některých extrémních programovacích praktik a praktické ověření jejich oprávněnosti.
Souvisejícím problémem projektů je, že zajímavé a bohaté na zkušenosti jsou maximální první dva měsíce a potom až poslední měsíc (první dva jsou pro ty, kteří ještě nic podobného nedělali a v posledním se naučí se pracovat ve stresu a organizovat si práci podle priorit a zbývajícího času). Zbylý čas se jen datluje kód s vyjímečně nízkou bodovou dotací, aby se splnily požadavky na velikost díla, ale nic nového tím nezískává. Čas, který to zabere by šel strávit mnohem lepším způsobem na jiných přednáškách, nebo praxí v nějaké firmě, která je jednak poučnější a jednak mnohem lépe ohodnocená.
Dost často u projektů totiž chybí vedení, který by tým směrovalo ke správným postupům a díky kterému by týmy nemusely hledat vhodná řešení organizace práce metodou pokus-omyl. A z obhajob různých minulých projektů jsem míval pocit, že některé týmu zůstaly u omylu až do úplného konce.
Pokud by projekt měl skutečně sloužit k výuce týmové práce, myslím, že by bohatě stačilo, kdyby se na něm pracovalo jen jeden semestr, ale o něco intenzivněji a pod větším dohledem ze strany lektorů (vedoucích projektů), kteří by byli schopni do projektů zasahovat a včas upozorńovali na chyby. To se v současném systému neděje a stává se, že první skutečnou zpětnou vazbu tým dostane až při obhajobě – a to není to nejlepší místo na zjištění, že něco je špatně. Pak je jasné, že není něco špatně jen v projektu, ale v celém systému, který nechá takový projekt rok nebo dva bez zásahu probíhat.
Druhou možností jsou softwarové projekty zadávané firmami, za které by byli studenti placeni a měli tak alespoń nějakou motivaci k tomu, aby se věnovali i těm méně zajímavým aspektům projektu. O zpětné vazbě zadavatele, kterému skutečně záleží na výsledku ani nemluvě.
Závěrem
Nemyslím si, že by softwarové projekty byly zbytečné a nebo že by se měly rušit, na druhou stranu jejich současná koncepce vede k velkému plýtvání časem řešitelů, a že by lépe motivovaný (finančně/bodově/…), nebo kratší – ale o to intenzivnější – zážitek pro budoucí praxi posloužil mnohem lépe.
October 5th, 2006 at 14:08
Komentování funkcí
Ono se poměrně snadno řekne, že funkce se mají komentovat přehledně, ale hůř se to udělá. Co napsat k
setWidth()nějakého grafického prvku, než že nastaví šířku?Nízká bodová dotace
Rád bych tu rozvedl jeden výpočet, který se s projekty obvykle nedělá a Ondra ho radši nechce vidět. Jedná se o “ztracené peníze”.
Jak probíhají projekty v Amsterdamu?
Něco jako Softwarový projekt Universiteit van Amsterdam nevede. Naprosto obvyklé ale je, že studenti v rámci předmětu vyvíjí ve skupinách či malých týmech závěrečný projekt. Zadání pak, zjednodušeně, zní: “Vyrobte vyhledávací engine pro wikipedii, který využije znalosti struktury článků ve Wikipedii. Výsledek by měl být publikovatelný na konferenci.” Zadání je tedy jak poměrně konkrétní (je vcelku jasné, co se bude dělat), tak poměrně volné (v tomto případě dostaly stejný úkol dva týmy, výsledky však byly úplně odlišné). Požadavek konference stanovuje požadovanou úroveń. Na tomto projektu pak pracovalo osm lidí, kteří se neznali a museli dokončit před koncem semestru (poslední přednáška byla presentace výsledků).
Režim práce je pak úplně jiný, než na MFF UK: “Hele, lidi, pojďte dělat projekt.” “A kdy to dokončíme?” “Až to bude hotový, tak to odevzdáme.”
Ve zmíněném wiki projektu pak v okamžiku odevzdání zbylo pět členů z původních osmi (oficiálně šest, ale stejně tak oficiálně jeden neudělal nic). Opakované “příští týden to bude hotové” prostě v takové situaci nelze tolerovat.
Rovněž nasazení vyučujících je jiné. V okamžiku, kdy bylo v polovině semestru jasné, že tímto způsobem nedokončíme, začal vyučující ochotně sledovat průběh práce a stal se oním pověstným bičem.
Osobně se domnívám, že na tomto wiki projektu a ostatních podobných (ano, opravdu není student běhěm jednoho semestru členem pouze jedhoho takového týmu) jsem se naučil o organizaci projektu, řízení práce, dokončení v termínu a spolupráci s ostatními mnohem víc, než za dva a půl roku nad Guidem.
Návrh pro studenty zahajující softwarový projekt
Vykašlete se na velké oči. Hledejte minimální zadání, které komise uzná. Hledejte zadání, za které vám někdo zaplatí (komise to rozhodně nebude). Hledejte zadání, na které je potřeba minimum času (jeden semestr, šest až osm hodin týdně). Jako bič sami na sebe to zařiďte tak, abyste po onom semestru práce skutečně museli mít projekt hotový.
Návrh pro komisi softwarových projektů
Stávající náročnost projektů a přeneseně doba trvání projektů je neúnosná. Podle mého by stačily projekty rozsahu zápočťáku z Unixu (v době výuky pana Berana – současnou úroveń neznám), omezené na jeden semestr délky. Však ona už ta čtyřčlenná spolupráce to ztíží dostatečně. Jako student bych také uvítal doprovodné přednášky k tématu. Např. Systémy správy verzí, jejich výhody a nevýhody, Způsoby řízení spolupráce a dostupné nástroje, Jak má vypadat softwarová dokumentace (tohle jsme prostě nikde nenašli, takže jsme prostě plavali, ale kraul je přece jenom dokonalejší, než čubička, když vás někdo hodí do vody, není?) a pod..
Nabídka?
Nemáte nekdo zájem o koupi unikátního systému pro rozhodování za nejistoty? Máme v ruce jeden, jemuž není ve světě obdoby, a jsme ochotni jednat o prodeji.
October 23rd, 2006 at 16:36
Mozna vas potesi, ze sepisovani techto “zkusenosti” neni jen dalsi ztrata casu bez realneho uzitku. Prave tento text byl poslednim impulsem, ktery vedl k vyznamne zmene pravidel pro vedeni projektu. Projekty se sice nestaly povinne jednosemstralnimi, ale snad se po dlouhe dobe fakticke ctyrsemestralnosti vrati alespon k puvodne zamyslene dvousemestralnosti. To je ale maximalni cas – podle novych pravidel je navrh terminu dokonceni soucasti zadani a v zasade nic nebrani tomu navrhnout projekt jako jednosemestralni (s objemem prace odpovidajicim tomuto casu a poctu clenu) a po schvaleni ho take tak vypracovat, odevzdat a obhajit. Nicmene, i kdyby vsichni do zadani psali tech devet bezne maximalne povolovanych mesicu pujde o zkraceni prumerne doby. A kratsi projekty pak znamenaji mene projektu probihajicich v jeden okamzik, tedy mensi naroky na potrebny pocet vedoucich i jejich cas, coz by snad mohlo prinest pozadovane zlepseni pece.
Take by nemelo byt napriste mozne vami zminene “dokoncime, az to bude hotove”. Predem domluveny termin dokonceni, ktery lze protahnout jen mirne (maximalne “o obhajoby pozdeji”) po jehoz prekroceni nasleduje zruseni projektu a tedy jeho absolutni neobhajeni vsemi cleny by melo vytvorit zadouci tlak at uz na jednotlive cleny tak na cely kolektiv, ktery bude mit, proti drivejsku, zajem vice se navzajem hlidat a pripadne se zbavovat se tech, kteri na spolecnem projektu dostatecne nepracuji.
Snad tedy (i) tento vas komentar prispeje k tomu, ze budoucim projektovym teamum tento predmet vice da a mene vezme.
Zdravi
Dan Lukes
October 26th, 2006 at 11:42
To je výborná zpráva pro budoucí zpracovatele Softwarových projektů. Byť ji nejspíše neocení a proklejí nás.
Z nových pravidel nám při jejich čtení nijak nevyplývá, že jednosemestrální projekt (s odpovídající obtížností), je také uznávaný postup.
Nyní nejspíš bude hodně záležet na prvních, průkopnických, projektech, jak nastaví laťku. Následující projekty je budou používat jako referenční bod (jak tomu bylo běžně doposud). Možná by pomohlo několik vzorových zadání?
Každopádně snížení délky vypracování vnímám jako přínos, a za ostatní studenty doufám, že současně klesne technická obtížnost projektů a vzroste “péče” o jejich zpracovatele.
S pozdravem,
Jiří Iša
October 30th, 2006 at 02:37
Ja sa ta len chcem spytat, ci si myslis, ze je to (to = kazdy pribeh ma nejake poucenie
) aplikovatelne aj na bakalarsku/diplomovu pracu (samozrejme ale samostatnu) a tym padom, do akej miery…
Dik za spisanie niecoho takehoto, myslim, ze viacerym ludom by to mohlo aspon trosku pomoct…
November 29th, 2006 at 10:13
Jak moc je to aplikovatelne na bakalarku/diplomku, to netusim. Nejspis dost zalezi na tom, co si clovek od diplomky slibuje. Kdo chce navazovat doktoratem, nejspis by to mel vzit vazneji a obtizneji, nez kdo chce “prolezt”, nebo ne?
V obou pripadech (jak se ted nejen ja presvedcuji) ale asi jde cekat, ze diplomka bude tezsi a pomalejsi, nez clovek doufa
Neni to projev nejakeho vrozeneho lidskeho optimismu?
Aspon ze je za ni ten diplom
(no jo, jeste statnice …)
January 9th, 2008 at 12:35
Malý update: Guido byl prezentován na Nineteenth International Conference on Tools with Artificial Intelligence (ICTAI 2007 – IEEE Computer Society), Patras, Recko. V příslušném recenzovaném sborníku vyšel odpovídající článek.