Postup zkrášlení kódu M&Mího webu

Obecně o webu

  • Python, Django, spousta nějakých rozšíření, frontend HTML + CSS + trocha JS

  • Velké břímě historie, kterou nejspíš nechceme zahodit

    • Změny v M&M někdy dost zamotají potřebný kód (tituly)

  • Občas je potřeba dělat opravy rychle

Aktuální stav

  • Zběsile zbastlený kód

    • „Co je to ‚single responsibility principle‘?“ ☺

  • Dost netriviální množství objektů a jejich vazeb

    • Dost možná do velké míry inherentní složitost

  • Webaři aktuálně relativně zběhlí v programování (ale je potřeba myslet na to, že to tak být nemusí)

  • Webaři stárnou (Jethro, Kristý, Anet) a mizí (Pavel, Káťa), je potřeba web připravit na předání

  • Kód je rozdělený mezi orgy a jeden „nerozumí“ tomu, co druhý napsal (musí to vyčíst z kódu, nezná souvislosti, …)

    • Noví orgové se aktuálně musí ptát, což je jim nepříjemné a nutí je umět formulovat dotazy

Invarianty

  • Není to práce, ale zábava-ish → libovolný proces nesmí být (moc) na obtíž.

    • I malé nepohodlí je potřeba vyvážit relativně velkým přínosem

      • nebo dostatečně zřejmou vidinou budoucího pohodlí / minimalizace nepohodlí

  • Nejsme programátoři, spíš jsme bastlíři kódu (kteří znají rozumnou podmnožinu syntaxe Pythonu)

    • Zvlášť noví orgové

    • Nechceme cílit na mega-profi kód, je to nedosažitelný cíl

      • Nejspíš to do nějaké míry ubastlené bude pořád, ta míra závisí na zkušenosti aktuálních webařů

    • Nástroje nás nesmí moc mást.

  • Děláme to zadarmo jeden večer v týdnu

    • Vývoj jde pomalu, často pomaleji než vývoj knihoven

      • → kód se rozbíjí i sám

  • Běží to na Gimlim

    • Debian (old)stable → nemůžeme používat moc nové featury Pythonu

      • Aktuálně Python 3.7.3

  • Webaři jsou náhodně vzniklá skupina lidí.

    • Různé nástroje, různé operační systémy

    • Nechceme vynucovat konkrétní metody, multiplatformní nástroje asi požadovat můžeme

    • Na serveru může běžet cokoliv, co tam jde rozběhnout

    • Kód by neměl být moc složitý / matoucí / kompaktní (?)

      • případně fakt hodně okomentovaný

O co se snažíme

  • Zpřístupnit vývoj novým webařům

  • Umožnit chápání i cizího kódu co nejjednodušeji

  • Nevzít si s sebou implementační tajemství ~~do hrobu~~ pryč z M&Mka

digraph "Závislosti věcí" {
    ss -> sdil -> doku -> cs;
    ss -> cit ->ref -> cs;
    ref -> nrt -> tst -> cs;
    sdil -> cr -> cs
    ss -> nrt;
    ss[label="Současný stav",shape=box];
    cit[label="čitelný kód"];
    cs[label="Cílový stav",shape=box];
    ref[label="refactoring"];
    nrt[label="nerozbít to"];
    tst[label="testy"];
    doku[label="dokumentace (vývojářská)"];
    sdil[label="chápání kódu ostatních / stávajícího"];
    cr[label="code review"];
    nrt,sdil,cit[shape=hexagon];
    tst,doku,cr[color=blue];
}

Code review

Aktuálně: Pavel občas z rozmaru čte diffy; párkrát jsme zkoušeli programovat v páru, je to relativně časově náročné.

  • Nevynucovat

  • Primární motivace je umožnit nějak vidět změny a případně k nim dávat komentáře, jak stylu „tohle mi není jasné“, tak i „tohle by chtělo přepsat“.

  • Chceme hlavně vytvořit příležitost ke čtení cizího kódu a seznamování se s ním (i v zájmu zaučování nových webařů)

Názory

  • spíš post-hoc

  • Možná code-review toho, co jde na produkci

  • Chceme umět komentovat konkrétní řádky kódu

  • Gitea/gitlab?

    • Klikátko a barevný řádky a vyhledávání jsou fajn (gitlab, gitea)

      • Jethro: je fajn umět skočit na definici

    • Kombinace s CI

    • Pokud bude gitea v něčem nedostatečná, tak hrozí, že bude potřeba migrovat znovu, což je nepraktické

    • Gitlab je asi častější než gitea → je lepší názor si na to zvyknout

Závěr: Zkusíme to hodit do GitLabu (nejspíš veřejného*), zavedeme pull-requesty do master větve, náhodně se budeme přiřazovat a používat ho nějak intuitivně.

*: Ve fakultním neumíme přidávat další uživatele, v KAMím zas možná není CI.

Testy

Aktuálně: pár testů na dohromady řádově 4 funkce, drobný pokus o TDD, jenž narazil na úskalí reálného světa. Lokální spuštění testů trvá relativně dlouho, nejspíš kvůli spoustě migrací.

  • Potřebujeme ověřit, že to funguje a že to pořád funguje

  • CI? Coverage?

Názory

  • PyTest je fajn

  • Testovat frontend?

    • Jethro: při nasazení by se mohly dělat screenshoty celých vybraných stránek přes Selenium (nebo obdobné) a hlásit rozdíly

Závěr: Backend testujeme PyTestem (./manage.py test), u frontendu výhledově zkusíme ty vizuální diffy a pak se uvidí, CI podle webového klikátka na code review. Bylo by dobré mít rozumná testdata, ať se nemusí mockovat moc věcí.

Formát kódu

Aktuálně: Jakýsi coding style zhruba existuje, není popsaný, šíří se lidovou slovesností.

  • Nesmí být striktně vynucovaný

  • Musel by být hodně nastavitelný

    • Nechceme mít kód plný #NOQA: WTF42

  • Nejspíš vždycky bude mít false positives (seminar.utils.roman_numerals) i false negatives (seminar.models.tvorba.Cislo.posli_cislo_mailem)

    • Možná dobrý sluha, ale určitě špatný pán (also: špatná zkušenost ☺)

  • Důsledek: Hrozí, že těch falešných varování bude moc, čímž to ztratí smysl úplně

    • Potenciálně by šlo aplikovat jen lokálně na změny?

Názory

  • P: nemyslím si, že zvládneme mít „průhledný kód“ (dostatečně konzistentní kód, aby ho člověk přestal vnímat a spíš viděl myšlenky).

  • P: Kecadla do kódu trochu zavání větším peklem než užitkem (takže black a flake8 jsou ze hry); isort možná dává smysl; je otázka, jestli použít mypy, ale typové značky v kódu spíš chceme (zvlášť u věcí, které nejsou prostě django view – typicky utils.)

    • J: Divné (=Pavlovo) groupování importů je spíš matoucí, spíš moc nepomáhalo

  • P (doplněno zpětně): pydocstyle vynucuje PEP-257, který se možná tluče se sphinxem…

  • P (též zpětně): Možná by se mohl dát použít pylint, tomu jde aspoň vysvětlit coding style a nerazí tupě PEP-8, ale nastavovat ho je asi větší porod, než jak moc pomůže…

Závěr: Kecadla na formát spíš nechceme; isort by mohl být fajn, ale bylo by dobré mít rozdělené bloky „náš kód“, „standardní knihovna“ a „Django a další balíčky z PyPA“; u našeho kódu (utils, obecně ne-Django věci) chceme držet záměr (na úrovni dohody) psát signatury funkcí a v případě jejich přítomnosti se nechat varovat při porušení signatury.

  • P (večerní prokrastinace): Bandit vypadá, že hlásí jen strašně obvious věci by default, nepřijde mi jako moc úžasné vylepšení. Do CI možná dobrý

Dokumentace

Aktuálně: něco málo je na wiki (/Web/), občas má nějaká funkce docstring, obecně je toho málo

Požadavky

  • Jedno autoritativní místo a dá se najít

  • Dostatečně „blízko“ kódu

    • nastavit mindset na psaní dokumentace „rovnou“?

  • Umožnit i obecný text, ne jen komentáře kódu (modulů, funkcí)

Bonusy

  • Zajišťování konzistence s uživatelskou dokumentací

    • aktuálně wiki

  • Podpora i dalších jazyků (Vue, Javascript, CSS, možná django-templates)

Názory

  • Jde to dělat sphinxem

    • Stínovlas by mohl vědět v CZ.NICu se sphinx jede. Případně zkusit zjistit, co umí jejich Akademie

  • Free-textová dokumentace (architektura ap.) má být nezávislá na dokumentaci konkrétního kódu, ale je fajn, když se to pak spojí dohromady, jde-li to.

    • Lepší, když se obojí dá dělat stejným nástrojem

  • Káťa má někdy pocit, že tráví spoustu času tím, že hledá který soubor vůbec upravit; to má v naší dokumentaci být.

Závěr: Zkusíme použít sphinx (z nedostatku vlastních zkušeností a kvůli jeho popularitě), když se nám to nebude líbit, tak budeme řešit dál. Bylo by fajn najít nějaký workshop, bude to rychlejší nalejvárna než číst dokumentaci. V krátkodobém výhledu stáhneme vývojovou dokumentaci z webu do repozitáře a zprovozníme někde automatické buildy (aby se dala číst jako člověk a ne jako stroj).

Uživatelská dokumentace

  • K: Dělat ji ve spolupráci s těma uživatelema

  • P: Dávný Hedgedoc může případně sloužit jako základ osnovy

  • K: Dost možná nevíme, co bolí víc a co míň

  • Jethro: Musí být na wiki, jinak tím zmateme oržstvo

Závěr: Dokumentace bude na wiki (https://mam.mff.cuni.cz/wiki/Web_user/Dokumentace, výhledově možná ve stejné složce v dalších souborech), bude vznikat podle našich pocitů a dotazů od ostatních; výhledově bude schůzka na ukázání featur nového webu a tam se dosbírají náměty na to, co sepsat.