\section{Úvod}
\label{sec:uvod}

\secpreview{V~úvodu naleznete základní přehled systému, stanovení konkrétního
  cíle a způsoby jeho dosažení.  Je představena struktura práce.}

Jak již bylo řečeno, práce se zabývá systémem \tts{}, jeho návrhem a
implementací.


\subsection{Krátké představení systému \tts{}}
\label{sec:kratke}

\nientrya{\tts}, \cite{ttsweb} a \cite{ttssfweb}, je informační systém vyvíjený
a šířený Gero Kohnertem a několika dalšími vývojáři pod licencí GPL,
\cite{GPL}.

Jedná se o silný nástroj, vhodný zejména pro menší až střední firmy v~oblasti
služeb, který vedle jiného poskytuje:

\begin{enumerate}

\item \emph{Řízení projektů} s~možností utvářet různé vztahy mezi projekty
  (hierarchie a časové návaznosti).
  
\item Kompletní \emph{správu kontaktů} a \emph{schůzek}.
  
\item \emph{Sledování chyb} u implementovaných projektů u zákazníka, včetně
  ohlášení chyby zákazníkem a sledování jejího stavu.

\item Úplnou \emph{správu dokumentů} s~verzováním a uzamykáním.

\item Nabízí \emph{evidenci odpracovaných hodin}.
  
\item Díky vhodnému návrhu databázových struktur umožňuje navzájem velmi dobře
  provázat všechny \leftnote{objekty}{Můžete například navázat dokument na
    projekt, schůzku ke kontaktu apod.} systému --- nejste omezeni téměř ničím.

\end{enumerate}

\ientrya{\tts} je implementován jako klient/server aplikace, která jako klienta
používá internetový prohlížeč a ke komunikaci se serverem používá protokol
HTTP.  Na straně serveru je využit buďto (1) webový server s~podporou PHP a SQL
databáze nebo (2) webový kontejner (Java) a SQL databáze.


\subsection{Cíl a smysl práce}
\label{sec:cil}

Hlavní přínosy této práce by měly být:

\begin{itemize}
\item Identifikace problémových částí \tts{}u, resp. jeho návrhu.
\item Konkrétní doporučení, jak danou část zlepšit.
\item Dokumentace, na které lze dále stavět.
\end{itemize}

S~těmito body je ztotožněn cíl práce a její smysl.  Než bude cíl podrobněji
rozebrán, je vhodné říci pár slov o historii projektu \tts{}.

\subsubsection{Historie projektu}
\label{sec:historie}

\ientrya{\tts} byl na \sfnet{} zaregistrován v~červenci 2000 jako groupwarová
aplikace pro správu týmů a projektů, napsaná v~PHP.  V~červnu 2003 byl
registrován \nientrya{\jtts} --- snaha re--implementovat \tts{} do Javy.
Zatímco původní PHP verze se dočkala řady aktualizací, implementace v~Javě
ustrnula.

Aktuální stabilní verze \tts{}u je 1.2, jež byla uvolněna 18.~října 2004.
Aktuální vývojová verze je 1.3, která bude uvolněna někdy během příštího roku.
Vedle toho existuje ještě verze 2.0, kde se testují některé zásadní nové
přístupy.

V~roce 2000 bylo aktuální PHP verze 3 a verze 4 byla žhavá novinka.  Obě verze
nabízejí základní podporu objektového programování.  V~současné době PHP verze
5 je zdrojový kód aplikace připraven k~přechodu na tuto verzi, ale rozhodně
nevyužívá všech jejích možností.

Již v~prvních fázích vývoje systému byl dobře rozmyšlen systém rozšíření
(plug-in) skrze moduly, nezávislost na databázi a časem byl dobře propracován
systém oprávnění.

Bohužel si \tts{} vedle těchto vhodně navržených částí nese i známky toho, že
řada vlastností byla implementována bez vážnějšího rozmyšlení --- prostě takový
způsob \uv{\emph{chci tuto vlastnost a chci ji hned}} --- způsob, který je pro
některé open source projekty typický (blíže viz~\cite{opensource}).

\subsubsection{Současný stav}
\label{sec:soucasny}

Současný stav (konec roku 2004) je, bohužel, úzce spjat s~implementačním
prostředím.  To, že je systém primárně implementován v~PHP je jeho požehnáním a
prokletím zároveň.

\paragraph{Použití komponentních knihoven}

Na mnoha místech \tts{}u je použito komponentních knihoven.  Začlenění
některých z~nich do kódu aplikace by se však mělo věnovat více pozornosti.

Při použití komponentní knihovny je nutné zamyslet se nad:

\begin{enumerate}
  
\item \emph{Použít tuto knihovnu}, čímž sice bude ušetřen čas implementací
  (a~analýzou), ale může dojít ke ztrátě rychlosti běhu aplikace a musí být
  dobře rozmyšleno její začlenění do aplikace.
  
\item \emph{Použít vlastní kód}, čímž bude vytvořen kód přesně na míru, ale
  neušetří se čas analýzou a implementací.

\end{enumerate}

Obecně se lze konstatovat, že téměř ve všech případech se vyplatí použít
komponentní knihovnu, což potvrzuje například i~\cite{perl}\footnote{Cituji:
  \cq{19}{Pro běžnou praxi zpravidla bývá mnohem významnější, zda program
    vyvíjíte dva dny nebo týden, než zda jeho běh trvá 5 nebo 15 sekund.}}
a~\cite{CORBA}.

\paragraph{Použití PHP}

PHP je mladý programovací jazyk, který se lze velmi rychle naučit, snadno v~něm
lze udělat relativně složitější úlohy díky množství \leftnote{knihoven}{Řada
  knihoven PHP je navržena po vzoru Javy a poskytují řadu užitečných
  komponent.} a právě díky tomu se stal velmi populární pro dynamické webové
aplikace.

Jeho podpora objektového programování však není ideální a v~každé verzi se
navíc tato mění\footnote{Ačkoli je dodržována zpětná kompatibilita se staršími
  verzemi mnohem lépe než například u Visual Basicu.}.

Na rozdíl například od Javy záleží na programátorovi, zda a jak bude dodržovat
zásady \emph{správného stylu}\footnote{(1) přidělení zdrojů, (2) použití a
  ošetření chyb (3) uvolnění zdrojů.}.

Snadno dostupné komponentní knihovny ve spojení se snadno použitelným PHP
znamenají rychlý vývoj, ale pokud je prováděn bez rozmyslu a
návrhář/programátor nemá sám dost disciplíny, snadno se sklouzává ke špatnému
návrhu/implementaci.

\paragraph{Rozsáhlost systému}

Pokud aplikace doroste určitých rozměrů, prokážou se výhody aplikačního
serveru, který může poskytovat řadu vhodných služeb, které mohou být ihned
využity (adresářová služba, repository pro globální objekty a zdroje aj.).
Avšak PHP kód \tts{}u není pro žádný takový server
uzpůsoben\footnote{V~současné době se objevují první implementace PHP
  aplikačních serverů, např.~\cite{phpappserver1} a \cite{phpappserver2}.}.

Zároveň se v~systému takového rozsahu (a~bez dokumentace) může provést určité
provizorní řešení (\uv{jen protentokrát, pak se to upraví}), které se však
postupem doby stane nedílnou součástí kódu.  Postupně se tak mohou vytratit
dobré zásady původního návrhu, pokud nejsou vynuceny jazykem či nějakou
autoritou.

\paragraph{Kritická hranice}

Systém dosáhl podle mnohých vývojářů určité kritické hranice, kdy je vhodné,
zamyslet se nad dalším vývojem.  Objevila se řada nových vlastností (podpora
XML, zlepšení perzistence, řada nových modulů) a ukazuje se, že by bylo
záhodno, aby v~určitých oblastech byl systém koncepčněji navržen.

Panuje všeobecný konsensus mezi vývojáři, že nyní je ten správný okamžik
probrat a zpracovat všechny možné návrhy změn, aby verze 2.0 byla po stránce
designu pokud možno bezchybná.

\paragraph{Shrnutí}

Samozřejmě je mylné se domnívat na základě těchto faktů, že \tts{} je
\uv{slepenina} neumělého kódu s~řadou špatně integrovaných knihoven ---
přesvědčit se o tom koneckonců může kdokoli díky otevřenému zdrojovému kódu,
jež je dostupný na~\cite{ttssfweb} --- spíše lze říci:

{\it{}\tts{} je v~hlavních aspektech dobře navržen, používá řadu vhodných
  komponentních knihoven a díky PHP je snadno rozšiřitelný, přístupný pro
  každého (vývojáře) a o jeho užitečnosti svědčí i jeho rozšíření mezi
  uživateli.  Avšak na několika místech se projevila jistá
  \emph{živelnost}\footnote{Typickým představitelem této kategorie je snaha,
    aby jistá služba či vlastnost byla rychle dostupná.} a nevhodná
  implementace, ačkoli návrh a zamýšlené použití jsou v~pořádku.\footnote{PHP
    umožňuje porušit řadu \emph{správných zásad}, protože si je neumí vynutit
    na úrovni jazyka.}}


\subsubsection{Přínosy práce}
\label{sec:prinosy}

Výše definovaný cíl a smysl práce zahrnuje tyto body:

\begin{itemize}
\item Identifikace problémových částí \tts{}u, resp. jeho návrhu.
\item Konkrétní doporučení, jak danou část zlepšit.
\item Dokumentace, na které lze dále stavět.
\end{itemize}

Po přečtení předchozích odstavců je zřejmé, že není bezúčelný.

Přínosy práce jsou evidentní --- pokud se podaří zde navrhované změny
prodiskutovat a prosadit v~komunitě vývojářů (byť modifikované), povede to ke
zkvalitnění návrhu systému, jeho větší modularitě a zároveň k~vypracování
kvalitní dokumentace, což může mít ten příjemný vedlejší efekt, že se do vývoje
ochotně zapojí další lidé.

\subsubsection{Způsob dosažení cíle}
\label{sec:zpusob}

Jedná se o velmi prakticky zaměřenou práci (i proto bylo toto téma zvoleno),
jež přináší analýzu (chápanou nyní v~širším slova smyslu jako \emph{popis a
  diskusi}) k~již existujícímu systému.  Této skutečnosti a osobním preferencím
autora je uzpůsoben výběr metodiky, pomocí které bude systém představen ---
jedná se o \leftnote{OMT}{OMT --- Objektově orientované metodiky a
  technologie}, viz~\cite{OMT}.

S~metodikou OMT má autor největší zkušenosti a je třeba na ní ocenit její
praktický přístup.  Sama metodika neklade žádný konkrétní striktní předpis, ale
nabízí sadu několika nástrojů a do jisté míry ponechává na samotných
návrhářích, které nástroje zvolí --- ti by samozřejmě měli svoji volbu
odůvodnit.

Jak je naznačeno na straně~\pageref{sloc}, systém je vcelku rozsáhlý a podat
jeho vyčerpávající popis by si vyžádalo mnoho prostoru.  Není cílem práce do
všech podrobností popsat celý systém --- spíše by tento dokument měl poskytnout
ucelený náhled bez toho, aniž by se utápěl v~nepodstatných detailech.

Systém je představen v~mnoha modelech s~různou úrovní podrobnosti a abstrakce.
Některé modely cíleně zanedbávají některé prvky systému tak, aby do popředí
vystoupily jiné a čtenář nebyl zavalen množstvím nepodstatných detailů.  Cílem
popisu je postup od nepodrobného a obecného k~podrobnému a konkrétnímu.  Snahou
autora je vhodným způsobem abstrahovat od detailů, jež nejsou v~daný okamžik
podstatné (proto postupné zpodrobňování modelů).

Některé prvky systému budou rozebírány několikrát na různých úrovních
podrobnosti, některé prvky budou pouze zmíněny a dále jim nebude věnována
pozornost.  Upřednostnění některých částí před jinými se bude dít na základě
(jistě nijak překvapivě):

\begin{enumerate}

\item \emph{Významu vzhledem k~mému řešení} --- čím podstatnější, tím větší
  prostor (význam by měl vyplynout z~předkládaných faktů).

\item \emph{Složitosti} --- čím složitější, tím větší prostor.

\end{enumerate}

\paragraph{Základní charakteristiky systému}

V~pojmech OMT lze systém popsat jako \emph{transakční manažer} (databázová
aplikace) s~\emph{interakčním rozhraním} (formuláře) s~občasnými prvky
\emph{dávkového zpracování} (importy a exporty dat).

Jedná se o \emph{otevřenou architekturu}.

\emph{Paralelnost} je řešena na úrovni databáze pomocí transakcí databázového
stroje.

\label{sloc}
Aktuální stabilní PHP verze systému má přes 30 tříd aplikační logiky, více jak
40 databázových tabulek a přes úctyhodných \mbox{160 000} SLOC\footnote{SLOC =
  Source Line Of Code = Řádek zdrojového kódu}.  Nyní by se mohlo zdát, že
(hrubým odhadem) pouhých 10 tabulek připadá na vazby a vztahy \inlinecode{m:n},
avšak jak bude patrno dále (\ref{sec:asociace}, \ref{sec:databazova2}), vůbec
tomu tak není.\footnote{Budiž toto příklad, jak tyto jistě užitečné
  charakteristiky mohou mýlit.}

\paragraph{Důležité modely}

Protože jde o \nientryc{transakční manažer}{transakční manažer}{transakční
  manažer --- systém zpřístupňující informace pro více uživatelů}, vyplývá
z~\cite{OMT}, že hlavním modelem je objektový model mapovaný přímo na databázi.
Dynamické modely nejsou důležité --- operace jsou známy předem\footnote{Jedná
  se především o různé aktualizace a dotazování.}.

Hlavními modely tedy budou objektové modely.  U vybraných problémových oblastí
bude postupováno podle charakteru problému a výběr modelů tomu bude uzpůsoben.

\paragraph{Omezení}

Existuje několik omezujících předpokladů, jež je třeba respektovat:

\begin{enumerate}
  
\item \emph{Existující systém.}  Je třeba respektovat množství hotového kódu,
  kde vůle dělat změny není veliká --- vždy je třeba pečlivě zvážit, kolik
  práce se spotřebuje na implementaci doporučujících návrhů.

\item \emph{Implementace v~PHP a Javě.}  Ačkoli je hlavní větví \tts{}u jeho
  PHP implementace, je vhodné změny navrhovat i s~ohledem na Javu.  Myslím, že
  toho může být dosaženo bez většího úsilí --- čeho lze dosáhnout v~PHP, stejně
  tak jde udělat i v~Javě (a~spíše snáze v~Javě než v~PHP).

\end{enumerate}


\subsection{Struktura dokumentu}
\label{sec:struktura}

Dokument lze rozdělit na dvě samostatnější části (vedle úvodu a závěru):

\begin{enumerate}

\item \emph{Popis systému.}
  
  Kapitola~\ref{sec:zakladnipopis} představuje čtenáři základní funkčnost a
  části systému.
  
  Kapitola~\ref{sec:navrh} si podrobněji všímá částí vymezených v~předchozím
  textu a blíže popisuje problémy, které budou předmětem řešení.

\item \emph{Doporučené úpravy.}
  
  Objeveným nedostatkům jsou postupně věnovány
  kapitoly~\ref{sec:upravydatabazove}, \ref{sec:upravyaplikacni} a
  \ref{sec:upravyprezentacni}.  Dále zpodrobňují pohled na systém a do větší
  hloubky analyzují vybrané oblasti. Snaží se konkretizovat postupy vedoucí
  k~odstranění nalezených problémů.

\end{enumerate}

Všechny kapitoly, zejména pak ty, jež popisují úpravy systému, lze číst
samostatně.  Každá kapitola je uvedena krátkým výčtem toho, co od ní čtenář
může očekávat a je zakončena stručným shrnutím.  U kapitol popisujících úpravy
systému předchází shrnutí diskuze dopadů na systém.

