460 likes | 579 Views
Jak se dělá software. FIT VUT Brno 14. 5. 2002 Pavel Cagaš (pc @ mii.cz) Moravské přístroje a.s. Kapitola 1: Jak se dělá Control Web. Co vlastně děláme?. Co vlastně děláme?. Programové systémy pro rychlý vývoj aplikací v oblasti vizualizace a řízení technologických procesů: Analýza“
E N D
Jak se dělá software FIT VUT Brno 14. 5. 2002 Pavel Cagaš (pc@mii.cz) Moravské přístroje a.s.
Kapitola 1:Jak se dělá Control Web Co vlastně děláme?
Co vlastně děláme? • Programové systémy pro rychlý vývoj aplikací v oblasti vizualizace a řízení technologických procesů: • Analýza“ • Návrh funkčnosti (architektury) systému. • Návrh uživatelského rozhraní. • Interoperabilita (COM/ActiveX, SQL/ODBC, HTTP, OPC, …). • Kódování a ladění. • Testování: • Základní funkčnost. • Použitelnost, přehlednost, ovladatelnost. • Dlouhodobá stabilita, paměťová stabilita. • Testovací aplikace. • Obcházení chyb Win32 API.
Co vlastně děláme? (pokračování) • Údržba jazykových mutací, spolupráce s partnery: • Čeština a angličtina v průběhu vývoje. • Japonština (UNICODE, Win32 IME). • Němčina. • Instalace a distribuční systém: • Instalační CD-ROM. • Prodej přes WWW. • Systém licencí a registrace. • Dokumentace: • Asi 1000 stran základní dokumentace. • Ukázkové aplikace, tipy a příklady.
Co vlastně děláme? (pokračování) • Školení a technická podpora: • Telefonická, e-mail podpora. • Školení začátečníci/pokročilí, nové verze produktů. • Údržba stávajících verzí (Service Packs): • Testování kompatibility. • Podpora průmyslového HW: • Ovladače pro PLC, I/O, standardní sběrnice. • Podpora ovladačů třetích stran. • Marketing: • WWW prezentace. • Propagační materiály, prospekty. • Inzeráty, PR články. • Veletrhy, výstavy a prezentace.
Trocha statistiky • Prakticky veškerý kód je psán v jazyce Modula-2. (spíše Modula-2++ ) • 12 MB DLL a EXE modulů (optimalizovaný kód). • 22 MB binárního neoptimalizovaného kódu. • 752 .DEF souborů, 11 MB textu. • 695 .MOD souborů, 40 MB textu. • 1696 ikon, 12 MB dat. • 205 binárních souborů, 3 MB dat. • 218 make souborů, 0,5 MB textu. • 223 resource skriptů, 0,4 MB textu.
Statistika pokračuje • Zdrojové kódy (*.DEF, *.MOD) mají 1 402 189 řádků textu. • V kódu je implementováno 2 525 tříd (classes). • Počet procedur a metod je 32 281. (Statistika systému CW verze 5 k začátku května 2002)
Zdrojové kódy a binární verze • Z jedné sady zdrojových textů se generuje řada binárních verzí: • Vývojová a runtime verze, Cluster Server verze, … • ANSI a UNICODE verze. • Různé jazykové mutace. • Verze pro „desktopová“ Windows a Windows CE. • Windows CE verze pro různé platformy (CEPC, PocketPC, H/PC, …). • Windows CE verze pro různé procesory (x86, ARM, MIPS, SH3/4 …). • Build jedné verze systému trvá asi 50 minut. (AMD Athlon 1,2 GHz, 256 MB DDR266 paměti)
Výjimečnost software • Předešlá čísla nezahrnují historické verze systému pro Extended DOS (Control Panel) a „odumřelé“ vývojové větve, které byly opuštěny nebo nahrazeny novým kódem. • Množství kódu (ale i dokumentace, aplikací, …), které nám „prošlo rukama“ je tak výrazně větší. • Jak je možné tento objem práce vykonat v relativně malém týmu? Vývoj software má oproti jiným produktům řadu výjimečných atributů. • Pokusím se je zobecnit ve druhé části přednášky.
Jak vypadá Control Web uvnitř? • Veškerý kód v jazyce Modula-2. • Nutná rozšíření standardní definice jazyka vzhledem k jazykově závislé povaze Win32 API (zřejmě se programátorům obtížně brání použití např. výčtů s určeným ordinálním číslem apod.). • Control Web vychází z architektury svého předchůdce, systému Control Panel, který pracoval nad systémem DOS.
Stručně o Control Panel • Systém Control Panel vznikal v první polovině 90. let (minulého století ). • Procesory 486 byly revoluční novinkou, 386 vzácností a 286 ve velmi solidních PC. • MS Windows ve verzi 3.0 byly krásnou hračkou do kanceláří, ale pro průmyslové použití téměř nepoužitelnou. • Proto Control Panel implementoval řadu vlastností operačního systému, ze systému DOS se jen spouštěl.
Control Panel OS • Jádro chráněného módu procesorů 286: • 16-bitový režim, bez limitu 640 KB systému DOS. • Segmentace paměti po 64KB velkých segmentech (x86). • Ochrana paměti na úrovni segmentů. • Virtualizace paměti, možnost relokace segmentů ve fyzické paměti. • Odkládací soubor pro datové segmenty (kódové segmenty zaváděny z původních EXE a DLL). • Podpora DLL (dynamicky linkovaný kód). • Duální obsluha přerušení (real mode/protected mode). • Tunelování požadavků na souborový systém do reálného módu systému DOS.
Control Panel OS (pokračování) • Aplikační objektově-orientované API: • Grafika nezávislá na zařízení: • Ovladače grafiky jako dynamicky linkované binární moduly. • Grafická primitiva v systému. • Bitmapové fonty pro obrazovku i tiskárny. • Systém oken, dialogů, GUI prvků. • Událostní subsystém: • Poziční, selektované a „broadcast“ šíření událostí. • Časovače a „Event Idle“ události.
Control Panel OS (pokračování) • Abstraktní objektový dokumentový model DataView: • DataView coby abstraktní kontejner na data. • Mechanismy správy životního cyklu DataView. • Podpora drag-and-drop, zabudovávání, editace na místě. • Obecný kontejner pro DataView. • Standardní sada uživatelských nástrojů: • Nastavení vlastností, barev a metrik GUI. • Volby rozložení klávesnice. • Nastavení vlastností myši, volby kursorů. • …
Architektura systému Control Panel • Uvnitř objektově-orientovaný návrh. • Navenek komponentová architektura. • Malé jádro systému zajišťující: • Alokaci komponent „virtuálních přístrojů“ tvořících aplikaci. • Alokaci I/O ovladačů. • Komunikace mezi přístroji a ovladači, správa kanálů a proměnných. • Funkčnost systému je tak dána především dynamicky konfigurovanou sadou komponent (např. databázové funkce, skriptování, apod.).
Limity vývoje systému Control Panel • Veškerý současný vývoj se týká jen systému Control Web. • Malá firma nemůže zajišťovat veškerou podporu pro rozvoj OS (i velmi velké firmy s tím mají velké problémy): • TCP/IP stack nedokončen, zůstal asi v polovině vývoje. • Nelze sledovat překotný vývoj grafických karet a doplňovat ovladače. • V souborových službách a síťování odkázán na služby DOS. • Implementace použité objektové technologie způsobuje problémy s udržením binární kompatibility mezi verzemi.
Změna operačního systému (Control Panel pro DOS -> Control Web pro Windows) • Přechod 16 -> 32 bitů (rušení kódu ošetřujícího přechody mezi segmenty). • Díky vrstevnaté architektuře „stačí jen přepsat“ nejnižší vrstvy. • Některé prvky architektury sémanticky nekompatibilní (Windows GDI a USER poplatné době vzniku, s řadou omezení a nedokonalostí): • Rozdílné šíření událostí. • Rozdílný způsob překladu znakových událostí. • Nesymetrie Windows (Overlapped, Popup, Child window, …). • Chybná implementace překreslovacích mechanismů Windows. • Rozdílné chování Win32 API v 9X a NT verzích Windows.
Změna vnitřní architektury • Control Panel implementoval kooperativní multitasking: • Objekty reagovaly na události. • „Souvislá“ činnost byla vykonávána v rámci zpracování „Event Idle“ událostí. • Změna stavu detekována dotazováním. • Control Web pracuje v preemptivním multitaskingu: • „Souvislá“ činnost v samostatných prováděcích tocích. • Změna stavu signalizována prostřednictvím synchronizačních objektů Win32 API.
Runtime knihovny jazyka Modula-2 • Nejprve bylo nutno implementovat základní runtime knihovnu (moduly Str, Lib, FIO, …). • Některé funkce implementovány kompletně (např. Str, část Lib), jiné navázány na runtime podporu C/C++ (např. FIO, Storage). • Řada modulů runtime knihovny postupně přibyla (např. modul „dstr“ pro dynamické řetězce nebo modul „os“ obsahující systémově závislé funkce, třeba práci s 64 bitovým časem).
Views pro Windows – zase další GUI knihovna • Na rozdíl od podobných objektových knihoven (Borland OWL nebo Microsoft MFC), které byly tvořeny se sémantikou Win32 API na mysli, sémantika knihovny Views byla dána. • Nutnost dodržet kompatibilitu s existujícím kódem: • Události jsou distribuovány výhradně v režii Views, ať již je Windows pošlou kamkoliv. • Mechanismy překreslování (okamžitého, zpožděného, vynuceného) jsou implementovány pomocí Windows API. • Nově bylo zapotřebí implementovat (poněkud nešťastné) rozlišení mezi client a non-client area Windows.
Abstraktní datové struktury • Vše je seznam (pokud na rychlosti moc nezáleží)… • … nebo vyvažovaný binární (AVL) strom (pokud je rychlé hledání kritické). • Všechny abstraktní datové struktury jsou implementovány pomocí objektů. • Řada struktur je implicitně obsažena v např. v hierarchii GUI tříd (Views): • Každé View (Window) je v seznamu svých sousedů. • NodeView mohou obsahovat celý seznam pod-Views. • Hierarchie Views tak tvoří tak obecný strom, který definuje vizuální podobu i šíření událostí.
Další datové struktury • V některých případech nevyhoví ani seznam ani strom: • Dynamická alokace elementů může být z výkonnostních důvodů neúnosná. Pak je nahrazena např. dynamickým polem (složitost hledání 1) nebo seznamem navazovaným v již alokovaných strukturách (třeba ve stromu). • Pro několik instancí zpravidla vyhoví jakákoliv konstrukce. Problémy se objeví, pokud algoritmus nepracuje s několika instancemi, ale několika desítkami tisíc instancí (tzv. „množstevní rabat“ ).
A trochu diskrétní matematiky… • Skriptovací jazyk popsán LL(1) gramatikou. • Parser implementován technikou rekurzívního sestupu. • Zotavení po chybě spíše empirické (dává lepší výsledky než důsledné dodržování pravidel). • Dramatická většina konstrukcí je ale „řemeslně-programátorská“. • Třeba syntakticky závislé obarvení textu v editoru. • Undo-Redo. • A prakticky všechno ostatní mimo překladače.
Kapitola 2:Pokus o abstrakci Program nikdy nedělá to, co chceme, ale jen to, co naprogramujeme. (Murphy)
Převod algoritmu do strojové podoby • První ENIAC i dnešní procesory Pentium či Athlon v podstatě jen vykonávají více či méně triviální instrukce (jen s každou novou generací procesorů se rychlost vykonávání instrukcí dramaticky zvyšuje). • Přesto, že základní principy práce počítačů se mnoho let nemění, disciplína jejich programování zaznamenala nesmírný pokrok.
Začalo to strojovou instrukcí • Instrukční soubor procesoru (počítače) je definován mikroarchitekturou procesorů. • Kód instrukce (přečtený z paměti programu) je zpracován řadičem mikroinstrukcí nebo přímo obvody procesoru. • V moderních procesorech je zpracování instrukcí mnohem složitější, principy ale zůstávají stejné. • První programy vznikaly jako soubory kódů instrukcí, zapisované přímo do paměti počítače (např. přes tzv. switch register).
Boj o efektivitu • S rozšířením používání počítačů rostly požadavky na jejich efektivnější programování. • Práce se strojovými instrukcemi vyžadovala expertní znalosti celého systému. • Assembler (jazyk symbolických adres) využívá skutečnosti, že k programu samotnému lze přistupovat jako k datům, a lze ho tedy zpracovávat jiným programem. • Část tíhy tvorby programu (např. výpočty cílových adres skoků) tedy na sebe bere jiný program.
Mezníky ve vývoji informačních technologií • Operační systém: • Aplikace nepracují přímo na „holém železe“. V paměti je neustále přítomen kód, který aplikace mohou používat a který řeší přístup k periferiím a přidělování zdrojů. • Funkce operačních systémů s časem narůstaly, jak se rozšiřovalo množství jimi poskytovaných služeb – virtualizace paměti, souborový systém, multiprocesing, apod. • Vyšší programovací jazyk: • Formulace algoritmu je výrazně usnadněna díky symbolickému zápisu.
A máme tu krizi software • Software se objevuje ve stále větším množství produktů a musí jej vytvářet stále větší okruh lidí, jejichž znalosti informačních technologií se relativně zmenšují. • Přesto že software prostupuje náš každodenní život, současně se jej nedostává a také způsobuje řadu potíží. • Často se tak hovoří o „krizi software“. Nelze přesně říci, kdy „krize“ začala, ani kdy a za jakých podmínek skončí. Spíše jen označení „krize software“ permanentně označuje problémy s tvorbou software spojené.
Příčiny „krize“? • Proč hovoříme o „krizi“? • Software se velmi obtížně vytváří a udržuje. • Nestíhají se slíbené termíny vývoje. • Programy mají nízkou kvalitu (jsou i výjimky ). • Velké množství projektů nebylo vůbec realizováno nebo bylo dodáno a nebylo možné je použít nebo si alespoň vyžádalo úpravy. • Proč nemáme podobnou krizi např. v automobilovém průmyslu?
Zvláštnosti software • Software se od ostatních oblastí průmyslu dosti liší. • Počítače jsou naprosto nejuniverzálnější stroje – dokáží zpracovat „jakoukoliv“ informaci. • Prakticky neexistují hranice – často nelze stanovit co program dělat může a co už ne. • Počítače dokáží s informacemi zacházet naprosto virtuózně: • Např. chyba na desce plošných spojů znamená úpravu návrhu, zaslání do výroby, výrobou nové desky, osazení novými součástkami, hledání další chyby (spousta času a peněz, lidé se proto drží zkrátka). • U software se doplní IF a jede se dál (meze se nekladou).
Jak dál? • Často proklamovaný „návrat ke kořenům“ – omezení funkčnosti, ořezání vlastností (hlavně když to bude fungovat!) asi není cesta. • Bobtnání software není vina jen programátorů. Většinu bobtnání mají na svědomí požadavky zákazníků a je tedy diktováno trhem: • Lidé nemají času a energie nazbyt a tak zcela zásadní vlastnost je automatičnost – ať to nějak software udělá, jen ať po mě nechce abych něco studoval, něco rozhodoval… • K tomu je zapotřebí efektní a atraktivní vzhled. • Řešení je asi v pozvolném učení se z chyb a evolučním zdokonalování softwarové technologie.
Jak posoudit kvalitu software? • Zřejmě neexistují obecně platná kritéria. Volba kritérií velmi záleží na cílové skupině uživatelů: • Software pro osobní použití je psán, pokud autor má čas a chuť. Neexistují pravidla pro posuzování takového software (každému autorovi se jeho programy samozřejmě líbí nejvíce :-). • Software pro omezenou skupinu je psán, pokud jej skupina akceptuje. • Software komerční musí poskytnout dostatek prostředků pro financování vývojového týmu, hardware, propagace a režií firmy.
Kritéria přežití software • Různé skupiny uživatelů hodnotí software podle rozdílných kritérií Obecně ale platí, že uživatel potřebuje udělat svoji práci. V tom je mu bráněno důmyslnými způsoby: • Nedostatečná spolehlivost software (aplikace padá). • Aplikace není dokončena (zastará dříve, než je dokončena, dojdou peníze). • Nedostatečná srozumitelnost (uživatel tomu nerozumí). • Žádné z těchto kritérií nelze brát absolutně. Například s padací aplikací lze dobře pracovat, pokud často ukládáte (mnohé aplikace raději automaticky ukládají samy ).
Srozumitelnost uživatelského rozhraní • Srozumitelnosti nelze docílit žádnou obecnou technikou. Návrh srozumitelného uživatelského rozhraní je téměř výhradně záležitostí jeho tvůrců, neboť kritéria srozumitelnosti silně závisí na cílové skupině uživatelů (uživatelské rozhraní software pro ženy v domácnosti se asi bude lišit od software pro správce informačních systémů). • Na pomoc mohou přijít obecné směrnice publikované firmami produkujícími operační systémy (Microsoft, Apple).
Spolehlivost a včasné dokončení • Spolehlivost a včasné (rychlé) dokončení jsou protichůdné požadavky. • Naprogramovat jde všechno, pokud je dost času a peněz. Dost času a peněz není nikdy. (Murphy) • Přesto oba požadavky bývají plněny podobnými prostředky: • Použití vhodných programovacích technologií. • Použití vhodných vývojových nástrojů.
Technologie programování • Pokusů zefektivnit programování zavedením různých technologií byla celá řada. Týkají se samotné tvorby programu (kódování): • Strukturované programování. • Objektově-orientované programování. • Skriptování komponent. • Ale také dalších technologií, nesouvisejících přímo se způsoby zápisu kódu. • Abstraktní datové struktury. • Teorie grafů a automatů. • A řada dalších.
Strukturované programování • Jazyk Pascal on N. Wirtha (ETH) přináší programovací techniky označované jako strukturované. Jejich použití spolu s vlastnostmi Pascalu dokáže zefektivnit a zbezpečnit vývoj software. • Zamezuje se chybám, které např. stály stovky mil. USD při havárii sondy Mariner-2. DO100I=1.10 ... 100 CONTINUE
Objektově orientované programování… • Poprvé se objevuje u jazyka Smalltalk v polovině 80. let. Principy OOP jsou ale použity i v řadě jiných jazyků. • Masového rozšíření dosáhlo OOP s příchodem C++ a také překladače Turbo Pascal, který od verze 5.5 podporoval třídy.
…není pro všechny? • Objektovému programování byla připisována velká budoucnost. Přesto ale Úspěšnost dokončení softwarových projektů využívajících OOP v roce 1991 byla 92%. V roce 1993 jen 66%. Jak je to možné? OOP prokázalo své výhody v oblasti znovupoužití kódu, nikoliv však jako prostředek vystihující přirozené vlastnosti systémů a jako snadný a lehce pochopitelný model. Snižování úspěšnosti dokončení OO projektů je dáno zapojením méně kvalitních programátorů do těchto projektů, kteří již nejsou schopni kvalitní analýzy.
Objekt • Objekt jako programová entita má tři základní charakteristiky: • Zapouzdření (encapsulation). Data (stavová informace) a metody jež tímto stavem manipulují jsou součástí jediné struktury - třídy objektu. Tyto struktury lze libovolně deklarovat nebo dynamicky tvořit v paměti - instance objektu. Metody pak manipulují jen se svými vlastními daty. • Dědičnost (inheritance). Novou třídu lze vytvořit jako potomka jiné třídy. Obecně platí, že datové položky lze jen přidávat, zatímco metody lze přidávat i měnit stávající. • Mnohotvarost (polymorphism). Mnohotvarost bývá realizována dynamickou vazbou na metody. Volání metody tedy není volání kódu na pevné adrese, ale volání nepřímé. Dvě instance objektů z hlediska volajícího stejného typu (stejné třídy) tak mohou mít různé implementace jediné metody - mohou se chovat různě.
Skriptování komponent • Stále více se prosazuje model vývoje software, který se dosti liší od tradiční představy programu, psaného v programovacím jazyce, který bude přeložen a spuštěn jako proces. Tento způsob přestává stačit nárokům na rychlý a efektivní vývoj, znovupoužití existujícího kódu, integraci s jinými systémy (databázemi, systémy přenosu zpráv, systémy autentizace apod.). • Relativně malé množství kódu využívající existujících komponent dokáže vykonat velké množství práce.
Jaký vývojový nástroj zvolit pro nejefektivnější dosažení cíle? • Každý projekt má své specifické požadavky. Při volbě nástroje je nutno zvážit řadu věcí. • Jaké nástroje jsou na trhu k dispozici? • Jaký nejefektivnější nástroj lze pro daný projekt použít? Nemá význam programovat v C kreslení grafů a analýzu dat, pokud totéž s použitím tabulkového kalkulátoru zabere jen zlomek času. Na druhé straně nelze použít tabulkový kalkulátor pro programování ovladače periferního zařízení. • Jaké jsou schopnosti (znalosti, zkušenosti) týmu lidí, který je k dispozici? • Existují nástroje speciálně navrhované pro danou třídu úloh?