IB113 Radek Pelánek 2019 1/90 Dnešní témata mnoho témat, rychlý průchod, „pro predstavu" • vývoj programů, dokumentace, testování • dělení projektu do souborů • styl, PEP8 • vývojová prostředí, správa verzí • přehled programovacích jazyků Návrh a vývoj softwaru „softwarové inženýrství" vývoj rozsáhlého softwaru nejen o zvládnutí „programování" • specifikace, ujasnění požadavků • návrh • dokumentace • testování • integrace, údržba mnoho metodik celého procesu: vodopád, spirála, agilní přístupy, ... koho: pro sebe (pri vývoji i později) pro ostatní názvy (modulů, funkcí, proměnných) dokumentace funkcí, tříd, rozhraní komentáře v kódu Dokumentace: obecné postrehy • neaktuální dokumentace je často horší než žádná dokumentace • sebe-dokumentující se kód Nejlepší kód je takový, který se dokumentuje sám. názvy funkcí, parametrů, dodržování konvencí, ... • u rozsáhlých projektů dokumentace nezbytnost • psaní dobré dokumentace - trochu umění, nezbytnost empatie Dokumentace v Pythonu • dokumentační řetězec (docstring) 9 první řetězec funkce (třídy, metody, modulu) • konvenčně zapisován pomocí „trojitých uvozovek' (povolují víceřádkové řetězce) def add(a, b): """Add two numbers and return the resu return a + b Dokumentační řetězec víceřádkový def complex(real=0.0, imag=0.0): """Form a complex number. Keyword arguments: real — the real part (default 0.0) imag — the imaginary part (default 0.0) n n a if imag ==0.0 and real == 0.0: return complex_zero 7/90 Dokumentační řetězce: ukázky This string, being the first statement in the file, will become the module's docstring when the file is imported. class MyClass(object): """The class's docstring""" def my.method(self) : """The method's docstring""" def my_function(): """The function 's docstring""" it it n n n n 8/90 Dokumentace vs. komentáre dokumentační řetězec • co kód dělá, jak se používá (volá), ... • brán v potaz při zpracování, dá se s ním dále pracovat __doc__ atribut, nástroje pro automatické zpracování, . komentáře (#) • jak kód funguje, jak se udržuje, ... • při zpracování ignorovány Testování: obecný postreh Přístupy k testování: • nevhodný: „přesvědčit se, že program je v pořádku" • vhodný: „najít chyby v kódu" obecný kontext: „konfirmační zkreslení" (confirmation bias) 10/90 Testová n ř rozsáhlé téma: • testování vs formální verifikace • různé úrovně testování: unit, integration, component, system, ... • různé styly testování: black box, white box, ... • různé typy testování: regression, functional, usability, ... • metodiky (test-driven development), automatizované unit testing (jednotkové testování) - testování samostatných „jednotek" (např. funkce, metoda, třída) nástroje 11/90 Testování: dílčí tipy • cíleně testujte okrajové podmínky, netypické příklady • prázdný seznam (řetězec) • záporná čísla, desetinná čísla • pravoúhlý trojúhelník, rovnoběžné přímky • přechodný rok • „pokrytí kódu testem" (code coverage) • Jsou pomocí testu „vyzkoušeny" všechny části kódu (funkce, příkazy, podmínky)? 12/90 assert expression • pokud expression není splněn, program „spadne" (přesněji: je vyvolána výjimka, kterou lze odchytit) • pomůcka pro ladění, testování • explicitní kontrola implicitních předpokladů 13/90 Assert: príklad def factorial(n): assert n == int(n) and n > f = 1 for i in ranged, n+1) : f = f * i return f print(factorial(-2)) Traceback (most recent call last): File "/home/xpelanek/temp/test.py", line 8, in print(factorial(-2)) File "/home/xpelanek/temp/test.py", line 2, in factorial assert n == int(n) and n >= 0 AssertionError Refaktorovánŕ • složitější kód nikdy nenapíšeme ideálně na poprvé • refaktorování (code refactoring) - úprava kódu bez změny funkčnosti • dobře napsané testy usnadňují refaktorování 15/90 Dělení projektu do souborů • univerzální princip: velký projekt nechceme mít v jednom souboru a důvody: jako dělení programu na funkce, o úroveň abstrakce výš 16/90 enŕ projektu do souborů • jazykově specifické o programovací jazyky se liší technickými požadavky i konvencemi • hlavičkové soubory v C • „hodně malých souborů" v Javě • terminologie: knihovny, moduly, balíčky, frameworky, rminologie v kontextu Pythonu pojmy s přesným významem: • modul (module): soubor s příponou .py, funkce/třídy s příbuznou funkcionalitou • balík (package): kolekce příbuzných modulů, společná inicializace, ... související pojmy používané volněji: • knihovna (library) • framework (framework) • modul poskytuje rozšiřující funkcionalitu • zdroje modulů: • standardní distribuce (např. math, turtle) • separátní instalace (např. numpy, Image) • vlastní implementace (základ: „.py soubor ve stejném d/V (1 \ resari ) • použití: • import module - následná volání module. f unctionO • import module as m • from module import function • from module import * (nedoporučeno) < [s? ► < i ► < ^ ► i •o^o 19/90 jmenný prostor (namespace) ^ mapování jmen na objekty • jmenné prostory umožňují použití stejného jména v různých kontextech bez toho, aby to způsobilo problémy o jmenné prostory mají funkce, moduly, třídy... • moduly - tečková notace (podobně jako objekty) • random.randint • math.log 20/90 Proč nepoužívat „import from X import * V malém programu nemusí vadit, ale ve větších projektech považováno za velmi špatnou praxi. • „nepořádek" v jmenném prostoru • kolize, přepis • překlepy se mohou chovat magicky o složitější interpretace chybových hlášek • Python Zen: Explicit is better than implicit, (import this) oduly - praktický príklad želví grafika, vykreslování obrázků do SVG (pro následnou manipulaci) a mymath.py - trigonometrické funkce počítající ve stupních • svg.py - generování SVG kódu, funkce typu: • svgJieader (), svg_line(), svg_circle() • manipulace s celkovým obrázkem (posun, rámeček), uložení do souboru • turtle .py - třída reprezentující želvu, podpora pro více želv Moduly - praktický příklad run turtle.py trigonometry.py basic shapes.py fractals.py turtle.py další projekty mymath.py svg.py 23/90 PEP8 - stylistická doporučení pro Python https://www.python.org/dev/peps/pep-0008/ • výběr vybraných bodů • obecný „duch" doporučení celkem univerzální • částečně však specifické pro Python (pojmenování, bílá místa, ...) 24/90 PEP8: Styl a konzistence konzistence (rostoucí důležitost) • s doporučeními • v rámci projektu • v rámci modulu či funkce 25/90 PEP8: Odsazování a délka řádků o standardní odsazení: 4 mezery • nepoužívat tabulátor • maximální délka řádku 79 znaků 9 rady k zalomení dlouhých řádků oddělení funkcí a tříd: 2 prázdné řádky oddělení metod: 1 prázdný řádek uvnitř funkce: 1 prázdný řádek pro oddělení logických celků (výjimečně) PEP8: Bílé znaky ve výrazech 9 mezera za čárkou • mezera kolem přiřazení a binárních operátorů • zachování čitelnosti celkového výrazu • ne okolo = v definici defaultní hodnoty argumentu • nepoužívat přebytečné mezery uvnitř závorek 28/90 Ano: spam(ham[1], {eggs: 2}) Ne: spam( ham[ 1 ], { eggs: 2 } ) Ano: if x == 4: print x, y; x, y = y, x Ne: if x == 4 : print x , y ; x , y = y , x Yes: spam(l) No: spam (1) Yes: dct['key'] = 1st [index] No: dct ['key'] = 1st [index] 29/90 Ano: x = 1 y = 2 long_variable = 3 Ne: x = 1 Y =2 long_variable = 3 30/90 PEP8: Bílé znaky - příklady Ano: i = i + 1 submitted += 1 x = x*2 - 1 hypot2 = x*x + y*y c = (a+b) * (a-b) Ne: i=i+l submitted +=1 x = x * 2 - 1 hypot2 =x*x+y*y c = (a + b) * (a - b) 31/90 PEP8: Pojmenování - přehled stylů lowercase lower_case_with_underscores (snake_case) UPPERCASE UPPER_CASE_WITH_UNDERSCORES CapitalizedWords (CapWords, CamelCase, StudlyCaps) mixedCase Capitalized_Words_With_Underscores _single_leading_underscore single_trailing_underscore_ __double_leading_underscore __double_leading_and_trailing_underscore__ PEP8: Pojmenování - základní doporučen • proměnné, funkce, moduly: lowercase, příp lower_case_with_underscores • konstanty: UPPERCASE • třídy: CapitalizedWords 33/90 Pojmenování: další rady • jednopísmenné proměnné - jen lokální pomocné proměnné, nejlépe s konvenčním významem: • n - počet prvků (např. délka seznamu) • i, j - index v cyklu • x, y - souřadnice • nikdy nepoužívat: 1, 0, I (snadná záměna s jinými znaky) • angličtina, ASCII kompatibilita 34/90 PEP8: Komentáre Komentář, který protiřečí kódu, je horší než žádný komentář. • „inline" komentáře používat výjimečně, nekomentovat zřejmé věci • Ne: x = x + 1 # Increment x • doporučení ke stylu psaní komentářů (# následované jednou mezerou) Vývojová prostředí, editory IDLE dostatečný pro jednoduché příklady, do budoucna chcete něco lepšího... žádoucí vlastnosti editoru: • syntax highlighting • odsazování, párování závorek • autocomplete, suggest • PEP8 kontrola • podpora ladění • podpora refaktorizace • ... 36/90 Vývojová prostredí, editory příklady různých typů editorů: • IDLE základní editor používaný v tomto kurzu • emacs, vi (+příkazová řádka) obecné editory, příp. se specifickou konfigurací • pyCharm „silný" editor speciálně pro Python, vhodné obzvlášť pro velké projekty • ipython, jupyter interaktivní použití (prolínání programu a výsledků), v prohlížeči 37/90 In [14]: rnd.seed(33) dicethrow = rnd.randint(l, 6+1, lae) side = np.zerDs(6, dtype='int') for i in range(6): side[i] = np.count_nonzero(dicethrow == i + 1) print('number of times', i + 1, 'is', side[i]) print('total number of throws ', sum(side)) number of times 1 is 17 number of times 2 is 17 number of times 3 is 15 number of times 4 is 24 number of times 5 is 19 number of times 6 is 8 total number of throws 19S Back to Exercise 1 Answers to Exercise 2 In [15]: N = 1000 tails = np.sum(rnd.randint(0, 1 + 1, (5, 1000)), axis=0) counttails = np.zeros(6) for i in range(6): counttails[i] = np.count_nonzero(tails == i) plt.plot(range(0, 6), counttails / N, 'bo') pit.xlabel('number of tails in five flips') pit.ylabel('probability'); c 3C n 25 J 0.20 - f 0.15 C LC D 05 0 12 3 4 5 number of tails in five flips http://nbviewer.jupyter.org/github/mbakker7/exploratory_computing_with_python/blob/niaster/ notebook9_discrete_random_variables/py_exploratory_conip_9_sol.ipynb 38/90 xkcd: Real Programmers nano? REAL PROGRAMMERS USE emocs \ HEY REAL USE vin- tke^open their hands m>letthe i well, REAL no, PRQGRW1EI5S pROGRAnri£ft& USE ed- USE art. 1 REAL FflOGRAnrERS USE A MAGNETIZED NEEDLE AND A STEADV HAND. / THE DISTURBANCE rifple5 O/TWARD, CHANGING THE ELOU OFTHFEPEtf CLIENTS IN THE UPPER ATMOSPHERE► 1 ULi JU WHICH ACT AS LEASES THAT DEFLECT INCOMING C0$WC RAY& FOCUSING THEn ID STRIKE THE DRIVE PLATTER AND FLIP THE DESIRED BFT. THESE CAUSE TWEMflRf ROCKETS OF HIGHER-PRESSURE AlRTOKJftrl, excise he But real programmers u5e butterflies- \ mice. 'course there& aw et1ac5 command to do that, oh yeah! Good ql c^n-c n-bt-tttrfL)... DTOlT EF1ACS. https://xkcd.com/378/ 39/90 Správa verzí • naivní přístup: • myprogram.py, myprogram2.py, myprogram_oct_24. py • myprogram_zaloha.py, myprogram_pokus.py • myprogram_f inal. py, myprogram_really_f inal. py • sofistikovanější přístup - „version controľ' o automatizavaná správa verzí • podpora týmové práce • mnoho různých řešení: git, cvs, svn, ... 40/90 • současné populární řešení 9 distributed revision control • GitHub - repozitár, (primárně) veřejné projekty 41/90 další témata pro praktické použití: • funkcionální prvky: map, filter, lambda funkce, ... • obecnější předávání parametrů, indexování, využití objektů, práce se soubory, ... • iterátory, výjimky, ... • využívání modulů Python moduly užitečné moduly v základní distribuci • math: matematické funkce • random: náhodná čísla • sys: „systémové" funkce a proměnné • os: spolupráce s operačním systémem • re: regulární výrazy • datetime: práce s časem • json: práce se soubory ve formátu JSON Python knihovny, frameworky Příklady známých „externích" knihoven: • Django: webový framework • NumPy, SymPy, SciPy: efektivní numerické výpočty, symbolické výpočty, vědecké výpočty, statistika 9 Pandas: práce s daty (především „tabulkovými"), SQL-like operace • matplotlib: tvorba grafů, vizualizace • pygarne: vývoj her • scrapy: „scrapování" dat z webu • Tensorflow: strojové učení, deep learning • přehled • klasifikace, vlastnosti • historie • způsoby užití • neseriózní postřehy 45/90 nterpretace, kompilace kompilovaný program zdrojový kód (program) překladač /-\ strojový kód f-N vstupy ^ -i (--> bezici /-\ výstupy ^ -i program ^ -i interpretovaný program zdrojový kód (program) interpret ^ -i výstupy vstupy 46/90 Programovací jazyky: klasifikace I nízko-úrovňové • kompilované • nutnost řešit specifika konkrétního systému • explicitní práce s pamětí • náročnější vývoj (nízká efektivita práce) • vysoká efektivita programu • interpretované • nezávislé na konkrétním systému • využití abstraktních datových typů • snadnější vývoj (vysoká efektivita práce) • nižší efektivita programu nikoliv dvě kategorie, ale plynulý přechod; zjednodušeno vysoko-úrovňové 47/90 movacŕ jazyky: klasifikace II zjednodušená klasifikace a použití nízko-úrovňové C, FORTRAN, ... vestavěné systémy, rychlé výpočty objektové C++, Java, C#, ... klasické aplikace, rozsáhlé systémy skriptovací Python, PHP, JavaScript, Perl, ... programování pro web, skriptování, prototypy deklarativní Prolog, LISP, Haskell, ... umělá inteligence Jazyky se liší v práci s typy MV NEW LAMGUftK- ř&GREríf I3ur IT => v KJ> 'M] => Tfl* cs {1/6} tfl> (2/0)+2 = > NflP _ > ''+'" Oo] > +2 = > 12 [lfl> 2+2 = > DOME > RANIGEO, 5) [13] > FL00R(!0.5) = > I = > I = > I = > I___!0,5___ https://xkcd.com/1537/ < □ ► < rn? ► < ^ ► < ^ ► 1 O 0,0 49/90 Programming Language Family Tree 3 H 1950 1955 19Ö0 1965 1970 1975 1980 1935 1990 1995 Assembler Algol-W Pascal M o dula-£ Modula-3 -—-__ Obefon-2 |C omp orient Pascal 2000 1 November, 2000 APL ML 1 I'.'Iiüitl'il 1 Has ksll Fortran 90 (C) Fachhochschule Aargau Fir Technic, Wirtschaft und Gestaltung ■] Q Nord westschwei! 50/90 A family tree of languages Some of the 2400 + programming languages Fortran LISP 51/90 Historie programovacích jazyků prapočátky: • 19. století: Charles Babbage, Ada Lovelace, děrné štítky, • 30. léta: teoretické základy programování, Turingův stroj, lambda kalkul (Alonzo Church) • 40. léta: první počítače, strojový kód, asembler 52/90 Historie programovacích jazyků 50. a 60. léta: první vysokourovňové jazyky (v některých aplikacích přežívají dodnes) • ALGOL • COBOL • FORTRAN - vědecko-technické výpočty (užíván stále) • BASIC • „jazyk pro začátečníky" • Beginner's All-purpose Symbolic Instruction Code • rozšířen v 70. a 80. letech na „mikropočítačích" • výborný jazyk pro vytvoření špatných programátorských návyků 54/90 INPUT "What is your name: "; U$ 20 PRINT "Hello 11; US 30 INPUT "How many stars do you want: "; N 40 S$ = " 50 FOR I = 1 TO N 60 S$ = S$ + "*" 70 NEXT I 80 PRINT S$ 90 INPUT "Do you want more stars? "; A$ 100 IF LEN(AS) = O THEN GOTO 90 110 A$ = LEFT$(A$, 1) 120 IF A$ = "Y" OR AS = "y" THEN GOTO 30 130 PRINT "Goodbye U$ 140 END https://en.wikipedia.org/wiki/BASIC Historie programovacích jazyků • 70. léta • rozvoj základních paradigmat (imperativní, objektové, funkcionální, logické) • C, Pascal, Prolog • 80. a 90. léta • další rozvoj jazyků, specializace, nové prvky související např. s nástupem internetu • C++, Perl, Haskell, Ruby, R, Java, JavaScript, PHP • současnost • nové verze jazyků 9 vznik nových jazyků: Go, Dart, Kotlin, Julia • rosettacode.org • stejné problémy řešené v mnoha programovacích jazycích 57/90 programming languages were • weapons https : //9gag. com/gag/anXEbeO/if-programming-languages-were-weapons • religions http: //blog. aegisub. org/2008/12/if-programming-languages-were-religions . html • boats http: //compsci . ca/blog/if-a-programming-language-was-a-boat/ • vehicles http://crashworks.org/if_programming_languages_were_vehicles/ killing a dragon: https : //blogs . oracle. com/roumen/how-to-kill-a-dragon-with-various-programming-languages 58/90 důležitý aspekt přehledu: různé jazyky mají různé rysy, (ne)výhody a aplikační domény nedůležitý aspekt přehledu: volba citátů a přirovnání (značně subjektivní, pro zpestření, ...) 3 *T) c\ (y 59/90 C would be Judaism - it's old and restrictive, but most of the world is familiar with its laws and respects them. The catch is, you can't convert into it - you're either into it from the start, or you will think that it's insanity Also, when things go wrong, many people are willing to blame the problems of the world on it. C is a nuclear submarine. The instructions are probably in a foreign language, but all of the hardware itself is optimized for performance. 60/90 • nízko úrovňové programování • „blízko hardwaru" o optimalizace rychlosti výpočtu 61/90 mnoho jazyků staví na syntaxi C základní rozdíly oproti Pythonu: • vyznačování bloků kódu, (ne)významnost bílých znaků • explicitně typovaný jazyk 62/90 C syntax: ukázka ciferný součet #include int SumDigits(unsigned long long n, const int base) { int sum = 0; for (; n; n /= base) sum += n °/0 base; return sum; } int main() { printf (,,0/0d °/0d °/0d\nM, SumDigits(1, 10), SumDigits(12345, 10), SumDigits(123045, 10)); return 0; } 63/90 Objektové jazyky odvozené od C Ch—h, C^, Java, ... 9 kompilované (Java - bytecode) • (většinou) explicitně typované • typicky „silně objektové" • vhodné pro „velké projekty" C++ is a set of nunchuks, powerful and impressive when wielded but takes many years of pain to master and often you probably wish you were using something else. 65/90 Java is a cargo ship. It's very bulky. It's very enterprise^y. Though it can also carry a lot of weight. Will carry a project, but not very fun to drive. 66/90 Java: Hello World public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } 67/90 interpretované, „skriptovací" jazyky • JavaScript • Python • Perl • PHP • Ruby typické užití: vývoj webu (front-end, back-end), zpracování dat, skriptování, prototypová ní, ... 68/90 interpretované jazyky flexibilnější než kompilované typická ukázka: príkaz eval • „vyhodnocení výrazu v řetězci" • může usnadnit práci • ale nebezpečné (zejména nad uživatelským vstupem) 69/90 JavaScript is a sword without a hilt. 70/90 a i přes podobnost názvu nemá s Javou mnoho společného • interpretovaný jazyk • „jazyk webového front-endu" 71/90 PHP is a bamboo raft. A series of hacks held together by string. Still keeps afloat though. Ruby is difficult to describe. It's sleek, sexy, and very fun to drive. Here's a picture. Very trendy. 73/90 Perl would be Voodoo - An incomprehensible series of arcane incantations that involve the blood of goats and permanently corrupt your soul. Often used when your boss requires you to do an urgent task at 21:00 on friday night. Perl used to serve the same purpose as Python, but now only bearded ex-hippies use it. 74/90 Deklarativní jazyky imperativní programování: program je posloupnost instrukcí („jak" má počítač počítat) deklarativní programování: program je popis toho, co se má udělat 75/90 Deklarativní jazyky • logické programování: Prolog • funkcionální programování: Lisp, Haskell typické užití: umělá inteligence, výpočty, „výuka principů, které využijete jinde" (funkcionální prvky dnes v mnoha dalších jazycích) Prolog is an Al weapon, you tell it what to do, which it does but then it also builds some terminators to go back in time and kill your mom. •<□► 4 Si ► < *■ 4 s ► 77/90 mother_child(trude, sally). father_child(tom, sally). father_child(tom, erica). father_child(mike, torn). sibling(X, Y) :- parent_child(Z, X), parent_child(Z, Y). parent_child(X, Y) :- father_child(X, Y). parent_child(X, Y) :- mother_child(X, Y). 78/90 Lisp is a shiv which comes in many forms. Anyone who uses this is probably crazy and dangerous. •<□► 4 ^ t 4 ± k 4 S ► 79/90 Lisp: ideální jazyk pro milovníky závorek. (defun factorial (n) (if (= n 0) 1 (* n (factorial (- n 1))))) 80/90 code urittem iw hpřvbl IS GÜARPMTEED Tb HAVE no Side EfFßrra https://xkcd.com/1312/ 81/90 bsort :: Ord a => [a] -> [a] bsort s = case _bsort s of t I t == s -> t I otherwise -> bsort t where _bsort (x:x2:xs) I x > x2 = x2:(_bsort (x:xs)) I otherwise = x:(_bsort (x2:xs)) bsort s = s 82/90 nástroje vyvinuté primárně jako „matematický software", ale obsahují obecný programovací jazyk • Mathematica • MATLAB o R 83/90 Mathematica Mathematica is a low earth orbit projectile cannon, it could probably do amazing things if only anyone could actually afford one. 84/90 Esoterické programovací jazyky „karikatury" programovacích jazyků - dobrá karikatura umožňuje uvědomit si důležité aspekty originálu • Brainfuck • AsciiDots • Whitespace • LOLCODE • OSTRAJava ++++++++++i «+++++++++++++++. >. +++, /#$<. *-w \#i/ HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE :-] >++.>+ banik pyco tryda Ostrava{ rynek(){ Konzola.pravit("Toz vitaj") pyco fajront pyco Jaký jazyk je nejlepší? •<□► 4 ^ >■ < -Ž ► 4 -E > 86/90 Jaký jazyk je nejlepšŕ? • neexistuje „univerzální" jazyk, každý má své (ne)výhody • lepší otázka: „Jaký jazyk je nejlepší pro danou situaci?" • problém, který řešíme • tým, který problém řeší • „legacy code" • vyplatí se umět různé jazyky 86/90 Popularita jazyků těžko měřitelné, existuje řada pokusů různými metrikami • vyhledávání na webu • počty knížek o jazyku • výskyty v inzerátech • dotazy na StackOverflow (a podobných stránkách) • projekty na GitHubu (a podobných repozitářích) Popularita jazyků na vršku se vesměs vyskytují (abecedně): C, C++, Java, JavaScript, Python konkrétní příklad indexu popularity: TIOBE Programming Community Index Soli r; e: mvw.tio íe. cc n 3; 25 2: 15 1: ^™ Java Python C++ — Visual Basic NET — C# JavaScript — PHP — SQL Objective-C 2002 2;;- 200S 2003 2010 2012 2014 2016 201B 88/90 Co dál? navazující předměty na Fl: • algoritmy, datové struktury (Python): IB002 • objektově orientované programování (Java, C PB161, PB162 • nízko úrovňové programování (C): PB071 vás programování baví! 90/90