Spustit prezentaci

Doporučené postupy v programování

Úvod, vývoj software

Lubomír Bulej

KDSS MFF UK

Otázka na úvod

Kam zařadit vývoj software?

Otázka na úvod

Kam zařadit vývoj software?


Věda?

Otázka na úvod

Kam zařadit vývoj software?


Věda?

Řemeslo?

Otázka na úvod

Kam zařadit vývoj software?


Věda?

Řemeslo?

Umění?

  • Věda, zvlášť v našem oboru, to je algebra, logika, diskrétní matematika, ..., teorie informace, atd. Věda, to je čistý svět jasných (jak pro koho) pravd, nevyvratitelných důkazů a (v našem případě) turingových strojů.
  • Cožpak věda nestačí? Zdá se že ne - jedna věc je něco vymyslet, druhá věc je něco realizovat. Matematická formule se nedá spustit ani nenajde článek na webu, stejně jako v projektu na barák se nedá bydlet. Takže vývoj software je také proces, jehož výsledkem je něco hmatatelného.
  • Cožpak věda a řemeslo nestačí? Co je to umění? Zajímavá je definice umění jako "dokumentace tisíce zajímavých rozhodnutí".
    dokumentace
    ... dá se to sdílet s ostatními ...
    tisíce
    ... mělo by v tom být vidět úsilí ...
    zajímavých rozhodnutí
    ... sada rozhodnutí, které stojí za to zaznamenat ...
  • "The creation of art is not the fulfillment of a need but the creation of a need. The world never needed Beethoven's Fifth Symphony until he created it. Now we could not live without it." ~ Louis Kahn.
  • Umění poskytuje prostor pro kreativitu, intuici, estetiku, nápady přicházející znenadání a odnikud, nadšení a zápal. Existuje snaha některé aspekty formalizovat a přesunout je do kategorie "řemeslo". Na některé typy projektů to funguje, ale eliminovat esenci umění z programování asi nejde.
  • Rands in Repose: Signs of Art
  • David Majda: Malá noční úvaha nad programováním

Vývoj implikuje proces

Vývoj software je jako...

  • Psaní knihy je většinou individuální záležitost, kniha když se dopíše tak je hotová, při psaní knihy je důraz kladen na originalitu.
  • Při pěstování plodin se zasadí semena, vyrostou rostlinky, o ty se člověk stará až nakonec přinesou zasloužené plody.
  • Pěstování ústřic zachycuje růst a vývoj softwaru jako proces nabalování tenkých vrstev na nějaké malé jádro.
  • Představa "stavby" software se zdá užitečnější než představa jeho "psaní" nebo "pěstování". Je kompatibilní s tím, co naznačuje metafora "ústřičné farmy", ale navíc poměrně intuitivně implikuje potřebu různých fází plánování, příprav, vlastní stavby, konečných úprav, inspekcí v průběhu a na závěr stavby, a koneckonců i údržby.
  • Další podobnosti: projekt, schválení projektu, příprava stavby, základy, hrubá stavba, zastřešení, vnitřní rozvody, omítky, malování, vnitřní vybavení, zahrada. Ale také např. náročnost a cena změn prováděných během stavby, jako třeba posunutí zdi.
  • Stavební metafora navíc škáluje s velikostí projektů. Jinak se připravuje stavba rodinného domu, stadionu pro 50000 lidí, katedrály, nebo psí boudy. S rostoucí složitostí vyniká potřeba vyšší míry organizace a roste závažnost důsledků špatného plánování. A konečně, u stavby je prostor i pro umění.

Metafora jako cesta...

... k pochopení procesu vývoje software

  • Síla analogie. Přirovnáním něčeho složitého a těžko pochopitelného k něčemu co je dobře známé a pochopitelné je možné získat určitý vhled, který v důsledku umožňuje pochopit složité. Dá se tomu říkat modelování.
  • Pozor! Metafora je pouze heuristika a jako taková nedává přesný návod jak najít odpověď, ale jak ji hledat. Kdybychom znali přesný postup, tak by byl vývoj software o mnoho jednodušší, ale tak daleko zatím nejsme a asi nikdy nebudeme. Největší problém při vývoji softwaru je konceptualizace problému a mnoho chyb při programování jsou ve skutečnosti konceptuální chyby.

O čem bude tento předmět?

O vývoji software...

Činnosti při tvorbě softwaru - obecně

O čem bude tento předmět?

... a zejména o aktivitách, které se týkají programování ...

Činnosti při tvorbě softwaru - obecně

O čem bude tento předmět?

... tedy o psaní kódu a souvisejících činnostech.


Činnosti při tvorbě softwaru - jak je budeme probírat

Proč právě programování?

Co je na psaní kódu zvláštního?

Proč právě programování?

Co je na psaní kódu zvláštního?



Kód = nejdůležitější část software!

Kód = nejdůležitější část software!

V čem spočívá důležitost kódu?

Kód = nejdůležitější část software!

V čem spočívá důležitost kódu?

Ale kód je to, co ...

Jak to souvisí s vámi?

Programování ve škole

Programování ve firmě

Důsledkem jsou

  • Umělecký aspekt si musí najít každý sám.
  • Problémy např. na OS – semestrálky přes 5KLOC, neznámé prostředí, velký rozsah abstrakcí.
  • Jedním z důsledků je také vznik tohoto (a jiných) předmětů.
  • Za výstižný postřeh ohledně rozdílu mezi programováním ve škole a v průmyslu vděčím T. Pochovi.

Jak má tento předmět situaci zlepšit?

Náplň předmětu

Cíle předmětu

Tématická osnova

Úvod

Návrh tříd

Návrh metod

Tématická osnova

Dokumentace

Psaní kódu

Zlepšování kódu

Pro koho je předmět určen?

Ideálně

Méně ideálně

  • Ideální cílovou skupinou jsou studenti, kteří už mají nějaké programování za sebou, ale zatím např. neprogramovali v týmu nebo nemuseli udržovat nějaký software funkční.
  • Méně ideální je předmět pro studenty z nižších ročníků, kteří si sice předmět mohou zapsat, ale motivace může být těžko pochopitelná, protože si ještě neprošli svým programátorským peklem.
  • Méně ideální je předmět rovněž pro studenty z vyšších ročníků, kterým (v závislosti na zkušenostech) mohou věci zde předkládané přijít samozřejmé (i když pravděpodobně ne všechny).

Organizace předmětu

Formát 2/2, KZ

Hodnocení

Organizace předmětu

Cvičení – Lubomír Bulej (Yours Truly)

Web předmětu

http://d3s.mff.cuni.cz/teaching/nprg043

GitLab issue tracker

https://gitlab.mff.cuni.cz/teaching/nprg043/2024-summer/forum

Programovací jazyky

Přednášky: primárně Java

Nicméně...

Úkoly: C++, C#, Java (Scala)

Literatura

McConnel, S. "Code Complete", 2nd Edition, Microsoft Press, 2004

Bloch, J. "Effective Java", 2nd Edition, Addison-Wesley, 2008

Freeman, E., Robson, E., Sierra, K., and Bates, B. "Head First Design Patterns", 2nd edition, O’Reilly, 2014

+ odkazy roztroušené po slajdech





Dotazy?

Motivační příklad...

Jak vypadá špatný kód?

"Routine from hell"

void HandleStuff( CORP_DATA & inputRec, int crntQtr,
   EMP_DATA empRec, double & estimRevenue, double ytdRevenue,
   int screenX, int screenY, COLOR_TYPE & newColor,
   COLOR_TYPE & prevColor, StatusType & status, int expenseType )
{

int i;
for ( i = 0; i < 100; i++ ) {
   inputRec.revenue[i] = 0;
   inputRec.expense[i] = corpExpense[ crntQtr ][ i ];
   }
UpdateCorpDatabase( empRec );
estimRevenue = ytdRevenue * 4.0 / (double) crntQtr;
newColor = prevColor;
status = SUCCESS;

if ( expenseType == 1 ) {
     for ( i = 0; i < 12; i++ )
           profit[i] = revenue[i] - expense.type1[i];
     }
else if ( expenseType == 2 ) {
          profit[i] = revenue[i] - expense.type2[i];
          }

else if ( expenseType == 3 )
          profit[i] = revenue[i] - expense.type3[i];
          }

"Routine from hell"

Jak na vás příklad působí?

"Routine from hell"

Jak na vás příklad působí?

Jak špatný ten kód byl?

Proč vlastně psát kvalitní kód?

Obecně se to vyplatí

Technologický dluh

Proč také psát kvalitní kód?

Individuální motivace

Tlak okolí

  • Zkušenost: u jednorázových prací je na místě důsledná kontrola.

Ale proč hlavně psát kvalitní kód?

Zjednodušuje návrh

Patří návrh do programování?

V čem je samotný návrh tak složitý?

Při návrhu software je nutno čelit mnoha výzvám

Co je při vývoji software nejdůležitější?

Co je při vývoji software nejdůležitější?



Zvládnutí složitosti!

Inherentní vs. zavlečená složitost

Inherentní vs. zavlečená složitost

Inherentní složitost

Inherentní vs. zavlečená složitost

Inherentní složitost

Zavlečená složitost

Proč je zvládnutí složitosti tak důležité?

Velký rozsah úrovně abstrakcí

Omezené lidské možnosti

Jak udržet složitost pod kontrolou?

Vyhnout se neefektivnímu návrhu v důsledku

Počítat s tím, že inherentní složitosti se nelze vyhnout

  • Použití expresivnějšího jazyka: Ruby, Python, ...
  • Použití pokročilejší technologie: smart pointers, garbage collection
  • Použití knihoven/frameworků: generování unikátního ID, ...

Příklad: omezení zavlečené složitosti

Použití indexových proměnných...

float frubbish = 0.0;

for (int i = 0; i < foo.length; i++) {
  for (int j = 0; j < bar.length; j++) {
    for (int k = 0; k < zap.length; k++) {
      frubbish += frubbishDelta (foo[i], bar[j], zap[k]);
    }
  }
}

Příklad: omezení zavlečené složitosti

Použití indexových proměnných...

float frubbish = 0.0;

for (int i = 0; i < foo.length; i++) {
  for (int j = 0; j < bar.length; j++) {
    for (int k = 0; k < zap.length; k++) {
      frubbish += frubbishDelta (foo[i], bar[j], zap[k]);
    }
  }
}

... nahrazeno iterací s podporou v jazyce

float frubbish = 0.0;

for (float eachFoo : foo) {
  for (float eachBar : bar) {
    for (float eachZap : zap) {
      frubbish += frubbishDelta (eachFoo, eachBar, eachZap);
    }
  }
}

Příklad: omezení zavlečené složitosti

Transformace dat v cyklu...

List <FieldInsnNode> result = new ArrayList <> ();
for (AbstractInsnNode insn : Insns.asList (insns)) {
    if (!AsmHelper.isStaticFieldAccess (insn)) {
        continue;
    }

    FieldInsnNode fieldInsn = (FieldInsnNode) insn;
    String fieldName = ThreadLocalVar.fqFieldName (insn.owner, insn.name);
    if (!__tlvIds.contains (fieldName)) {
        result.add (fieldInsn);
    }
}

Příklad: omezení zavlečené složitosti

Transformace dat pomocí objektových streamů...

List <FieldInsnNode> fieldInsns = Insns.asList (insns)
    .stream ().unordered ()
    .filter (AsmHelper::isStaticFieldAccess)
    .map (insn -> (FieldInsnNode) insn)
    .filter (insn -> {
        String fieldName = ThreadLocalVar.fqFieldNameFor (insn.owner, insn.name);
        return tlvIds.contains (fieldName);
    })
    .collect (Collectors.toList ());

Vlastnosti dobrého návrhu software

Jak už to tak bývá, svět není černobílý a dobré vlastnosti jdou často jedna proti druhé. V celé řadě oblastí je nutné dělat ústupky, to je v pořádku, jen je nutné ty ústupky dělat vědomě.

Five (+1) worlds

Při vývoji je nutné zohlednit typ vyvíjeného software

Základní typy software

  1. Krabicový
  2. Interní
  3. Embedded
  4. Hry
  5. Na jedno použití

  6. Software jako služba
  • Five Worlds
  • Výčet typů nejspíš není přesný ani úplný

Krabicový software

Prostředí, kde běží, není pod kontrolou

Interní software

Prostředí, kde běží, je pod kontrolou

Embedded software

Omezené zdroje a možnost aktualizace

Opravdu je update tak obtížný? Software solutions to hardware problems

Hry

Maximální využití zdrojů, omezená životnost

Software na jedno použití

Skripty, konverze mezi datovými formáty, apod.

Software jako služba

Aplikace (typicky webové) hostované na serverech

  • Starost o servery (24/7)
  • Optimalizace typicky motivována:
    • Snížením ceny za HW (servery)
    • Snížením ceny za bandwidth
    • Zrychlením odezvy

Software jako služba

Proč psát software jako službu?

Software jako služba