Čo by mal každý vedieť pred kúpou informačného systému

Prakticky žiadna firma, vrátane najmenších živnostníkov, už dnes nemôže existovať bez nejakého informačného systému, minimálne na účtovníctvo. Firiem ponúkajúcich takýto softvér je ako maku a podľa reklamy nie je možné posúdiť, ktorý je naozaj dobrý. Väčšina používateľov dokáže ohodnotiť akurát jeho rozhranie (okienka, ikonky, a podobne), ale to v praxi nie sú tie najdôležitejšie kritériá.

Informačný systém možno prirovnať k automobilu. Je samozrejme dobré, ak pekne vyzerá, ale ak sa každú chvíľu pokazí, na väčšom hrbole mu odpadne koleso a v prípade havárie hoci aj v malej rýchlosti spôsobí posádke ťažké zranenia, asi by ho chcel iba málokto. Tak ako pri predvádzacej jazde ani pri krátkej skúške softvéru väčšinou nemôžete odhaliť závažné chyby, tie sa prejavia až pri dlhšom používaní. Avšak tak ako v prípade áut vám isté záruky dávajú niektoré položky v jeho špecifikácii, rovnako aj pri softvéri vám špecifikácia môže mnohé napovedať.

Pri bežnom používaní softvéru hlavne zo začiatku iba málokedy narazíte na problémy. Tie sa prejavia až po dlhej dobe alebo v neočakávaných prípadoch. Napríklad program po nejakom čase začne pracovať výrazne pomalšie alebo začne viac „mrznúť“. Zmena nejakého parametra (typickým je sadzba DPH) vyžaduje časovo a finančne náročné prerábanie, neraz spojené aj s nemožnosťou upravovať záznamy so starou DPH. Výmena údajov s nejakým iným programom nie je vôbec možná alebo je veľmi prácna. Keď už je nutné prejsť na iný program (napríklad z dôvodu neúnosných obmedzení súčasného), presun existujúcich dát je náročný a objaví sa v ňom veľa chýb.

Dalo by sa ešte dlho pokračovať, ale zrejme to nie je potrebné. Najhoršie na celej veci je, že keď už raz používate nejaký softvér, ste naň do značnej miery odkázaný a radšej zaplatíte za jeho úpravy ako by ste mali kupovať nový. Toto žiaľ mnohé firmy zneužívajú a ponúkajú svoje programy za smiešne nízke ceny. Náklady na nutné úpravy však potom túto cenu mnohonásobne prekročia.

Niekoho to možno prekvapí, ale základným predpokladom dobrého softvéru je to, že umožňuje ľahký prechod na iný. Aj keď ste s vaším programom i jeho dodávateľom maximálne spokojný, nič to na veci nemení. Po čase môžete napríklad potrebovať nejakú funkciu, ktorú nebude schopný implementovať. Alebo narazíte na obmedzenia daného programu. Váš dodávateľ môže byť taktiež odkúpený nejakou veľkou firmou, ktorá výrazne zvýši ceny. Takýchto „katastrofických“ scenárov je veľa a v praxi sú oveľa častejšie, než sa by sa vám mohlo zdať. Navyše ak je dodávateľ naozaj dobrý, nepotrebuje si zákazníkov držať tým, že im znemožní prechod na iný softvér; to je skôr znakom neserióznych firiem.

Nasledovný zoznam obsahuje základné vlastnosti, ktoré by ste mali od dobrého softvéru očakávať. Nie všetky samozrejme platia pre každý typ programov, preto je všade uvedené aj krátke vysvetlenie.

  • Otvorené dátové formáty - všetky dáta ukladané programom, či už sa jedná o súbory alebo databázu, by mali byť vo formátoch použiteľných aj inými programami. Hlavným dôvodom je ľahký prevod dát do iného systému. Uľahčuje to aj opravu dát v prípade závažnej chyby informačného systému. Navyše ak sa na ukladanie dát používa nejaký známy a štandardizovaný systém (napríklad nejaký známy SQL databázový systém), je pri tom oveľa nižšia pravdepodobnosť chýb. V najhoršom prípade by mal mať aspoň možnosť exportu do otvorených formátov (ale pozor: všetkých dát, nie len výstupov!).
  • Zálohovanie - mimoriadne dôležitá vec, na ktorú sa v praxi žiaľ začne myslieť až keď už dôjde k strate dát (či už chybou programu, používateľa alebo technickou závadou). Čím ťažšie je dáta znovu získať, tým viac by sa malo myslieť na ich zálohovanie.
  • Časové premenné - parametre, ktoré majú okrem hodnoty určenú aj platnosť od-do. Niektoré informačné systémy ich nepotrebujú, ale pre väčšinu sú dôležité, najmä ak sa týkajú účtovníckych operácií. Ako časové premenné by malo byť implementované všetko, čo sa hoci len teoreticky môže zmeniť; sadzby daní, ciel, poplatkov a mnoho ďalších. Pokiaľ totiž dôjde k zmene hodnoty, ktorá nie je časovou premennou, potrebná úprava programu je vždy náročná a často spojená s problémami.
  • Modulárna a viacvrstvová architektúra - kupujete iba to, čo potrebujete a pri zmene „okolia“ netreba prepisovať celý systém (viac sa dočítate po kliknutí na linky).
  • Sieťová verzia - hoci sa to môže zdať zbytočné, hlavne pre malé firmy, treba myslieť do budúcnosti. Skôr či neskôr sa môže stať, že niekoľko pracovníkov bude musieť pracovať s jedným systémom alebo minimálne s tými istými údajmi. Prerábať klasické aplikácie na sieťové je vždy veľmi náročné, preto aj väčšinou zdĺhavé a drahé. Pre mnohé systémy je výhodná implementácia formou intranetu (viď link), minimálne vo forme doplnkového rozhrania.
  • Platformová nezávislosť je veľmi zriedkavou vlastnosťou. Väčšina programov je vytvorená iba pre jednu platformu, ktorou je takmer vždy Windows. Ak používate iba tento operačný systém, môže sa vám táto vlastnosť zdať zbytočná. V skutočnosti je ale veľmi výhodná, pretože naviazanie na jeden systém môže byť veľmi nebezpečné (napríklad v súvislosti s množstvom bezpečnostných chýb vo Windows). Programy napísané v multiplatformových jazykoch a prostrediach (napríklad PHP, Tcl/Tk, Python, Perl), pobežia prakticky bez zmien na Windows, Linuxe, Mac OS i väčšine variantov BSD a Unixu. V tejto súvislosti sa prejavuje výhoda intranetových systémov - na klientskych počítačoch môže byť ľubovoľný operačný systém, stačí ak v ňom existuje nejaký internetový prehliadač.
  • Programová nezávislosť môže byť výhodou aj nevýhodou. Ak by mal byť informačný systém úplne nezávislý od iných programov, musel by mať implementovaných množstvo funkcií, ktoré sú už v týchto programoch dávno vyriešené; bol by preto zbytočne rozsiahly a zrejme aj drahý. Na druhej strane program vyžadujúci pre svoj beh zakúpenie nejakého iného programu väčšinou tiež nie je výhodný. Vo všeobecnosti platí, že základná funkčnosť programu by nemala byť závislá od iného, špeciálne funkcie môžu (ako „externý modul“). Taktiež je veľký rozdiel, či je vyžadovaný program zadarmo alebo dokonca slobodný softvér, alebo či je to drahý komerčný produkt.

Na záver ešte uvádzame niekoľko závažných nedostatkov, ktoré by sa rozhodne nemali v žiadnom informačnom systéme nachádzať.

  • Chýbajúci import/export - ak systém používa otvorené formáty, nemusí byť implementovaný priamo ako funkcia. Ak ale používa nejaký vlastný formát, bez tejto funkcie nebude možné jednoducho preniesť dáta na iný počítač, o inom systéme ani nehovoriac. Okrem toho značne komplikuje, alebo až znemožňuje zálohovanie. V prípade programov pre DOS je síce možné skopírovať celý program aj dátami, ale nie je to príliš vhodné riešenie. U väčšiny programov pre Windows a iné operačné systémy navyše tento postup nemožno vôbec použiť.
  • Neopodstatnená závislosť na nejakom softvéri či hardvéri je prekvapujúco častým nedostatkom. Niektoré programy napríklad umožňujú tlač iba na vybraných modeloch tlačiarní, hoci by mali na tento účel používať funkcie operačného systému (výnimkou je samozrejme DOS). Iné vyžadujú mať nainštalovaný nejaký program, hoci jeho funkcie priamo nepoužívajú. Dosť častým prípadom je taktiež intranetový systém, ktorý vyžaduje konkrétny prehliadač. V prípade, že takáto závislosť nemá nejaký závažný dôvod, je značne nebezpečná.

Pri kupovaní informačného systému vždy myslite na to, že sa mu chystáte zveriť množstvo dôležitých dát a že budete často závislý na jeho správnej funkčnosti. Nenechajte sa preto zlákať „úžasnými“ ponukami bez toho, aby ste si ten systém naozaj preverili. Každá minúta strávená testovaním a overovaním vám môže ušetriť celé hodiny až dni premrhané riešením problémov počas ostrej prevádzky.

Pbatenghyngvbaf Lbh ner n bofreinag jro unpxre Vs Lbh jnag n wbo va bhe pbzcnal cyrnfr znvy gb gbhtuthl ng ci2p qbg fx Unir n avpr qnl
/===========================================================================\
                              Trpícím průtrží

   nejlépe poslouží masť G. Stuzeneggera v Herisau (Švýcary). Táž
   neobsahuje látek škodlivých a zhojí i nejtěžší toho druhu nemoce
   úplně. -- Koupiti lze i v hrnečkách po 5 markách (3 zl.) spolu
   s návodem o jejím upotřebení i vysvědčeními o její účinnosti
   u G. Stuzeneggera samého, a zvláště v  H a a s o v ě  lékárně
   v Budějovicích a  F u r s t o v ě  lékárně v Praze.
   Vysvědčení. S radostí oznamuji vám, že bohudíky vaše mast moji 16 let
   trvající nemoci mne zbavila a úplně vyléčila. Tisíceré díky. Bůh Vám
   to odplatí. Všem lidem budiž známo, již podobně trpí a zhojení své
   nabýti mohou. V  K o n s t a n c i  dne 29. června 1877.
                                                                    F. H.
\===========================================================================/
                                         -- Týdeník Tábor, 1926
    function perr($msg, $level)
    {
        echo $msg;
    }

    function readcsv_get_entity($fh, $sep = ';')
    {
        $entity = array();
        $attr = '';
        $eoe = false;

        while((! feof($fh)) && (! $eoe))
        {
            $ch = fgetc($fh);
            switch($ch)
            {
                case "\r":
                    break;
                case "\n":
                    $eoe = true;
                case $sep:
                    array_push($entity, $attr);
                    $attr = '';
                    break;
                case '"':
                    $ch = '';
                    while((! feof($fh)) && $ch != '"')
                    {
                        $ch = fgetc($fh);
                        $attr .= $ch;
                    }
                    $attr = rtrim($attr, '"');
                    break;
                default:
                    $attr .= $ch;
            }
        }

        if(feof($fh) && ($entity || $attr))
        {
            array_push($entity, $attr);
        }
        elseif(feof($fh))
        {
            $entity = false;
        }

        return $entity;
    }

    function readcsv_parsecsv($filename)
    {
        $ret = false;
        $sep = ';';
        $line = '';
        $line_num = 0;
        $cells = array();
        $names = array();

        $fh = fopen($filename, 'r');
        if(! $fh)
        {
            perr('Failed to open file \''
                . $file . "'\n", 8);
        }
        else
        {
        $line = '';
        while(! feof($fh))
        {
        $entity = readcsv_get_entity($fh, $sep);

        if($entity)
        {
        if($line_num == 0)
        {
        foreach($entity as $name)
        {
            array_push($names, trim($name, '"'));
        }
        }
        else
        {
        foreach($entity as $index => $val)
        {
        if(isset($names[$index]))
        {
            $cells[$line_num][$names[$index]]
                = trim($val, '"');
        }
        else
        {
            array_push($cells[$line_num],
                trim($val, '"'));
        }                            
        }
        }
        $line_num ++;
        }
        }
        fclose($fh);
        }

        return $ret;
    }
        
    function perr($msg, $level)
    {
        echo $msg;
    }

    function readcsv_get_entity($fh, $sep = ';')
    {
        $entity = array();
        $attr = '';
        $eoe = false;

        while((! feof($fh)) && (! $eoe))
        {
            $ch = fgetc($fh);
            switch($ch)
            {
                case "\r":
                    break;
                case "\n":
                    $eoe = true;
                case $sep:
                    array_push($entity, $attr);
                    $attr = '';
                    break;
                case '"':
                    $ch = '';
                    while((! feof($fh)) && $ch != '"')
                    {
                        $ch = fgetc($fh);
                        $attr .= $ch;
                    }
                    $attr = rtrim($attr, '"');
                    break;
                default:
                    $attr .= $ch;
            }
        }

        if(feof($fh) && ($entity || $attr))
        {
            array_push($entity, $attr);
        }
        elseif(feof($fh))
        {
            $entity = false;
        }

        return $entity;
    }

    function readcsv_parsecsv($filename)
    {
        $ret = false;
        $sep = ';';
        $line = '';
        $line_num = 0;
        $cells = array();
        $names = array();

        $fh = fopen($filename, 'r');
        if(! $fh)
        {
            perr('Failed to open file \''
                . $file . "'\n", 8);
        }
        else
        {
        $line = '';
        while(! feof($fh))
        {
        $entity = readcsv_get_entity($fh, $sep);

        if($entity)
        {
        if($line_num == 0)
        {
        foreach($entity as $name)
        {
            array_push($names, trim($name, '"'));
        }
        }
        else
        {
        foreach($entity as $index => $val)
        {
        if(isset($names[$index]))
        {
            $cells[$line_num][$names[$index]]
                = trim($val, '"');
        }
        else
        {
            array_push($cells[$line_num],
                trim($val, '"'));
        }                            
        }
        }
        $line_num ++;
        }
        }
        fclose($fh);
        }

        return $ret;
    }