Amatorom wstęp wzbroniony

Wśród pracodawców ścierają się dwa poglądy na temat kwalifikacji koniecznych na stanowiskach informatycznych. Jeden z nich mówi, że w informatyce liczy się przede wszystkim praktyka nabyta w konkretnych produktach i technologiach. W myśl tego poglądu lepszym pracownikiem będzie ten, kto np. od lat pracuje z konkretnym językiem programowania, niż ten, kto teorię języków formalnych zna dobrze, ale ma skromny bagaż doświadczeń. Pogląd przeciwny skłania do stwierdzenia, że wyższe wykształcenie informatyczne jest koniecznym fundamentem, a znajomość konkretnych systemów jest wtórna i pracownik może ją nabyć z literatury albo na kursach. A jak jest naprawdę?

Wśród pracodawców ścierają się dwa poglądy na temat kwalifikacji koniecznych na stanowiskach informatycznych. Jeden z nich mówi, że w informatyce liczy się przede wszystkim praktyka nabyta w konkretnych produktach i technologiach. W myśl tego poglądu lepszym pracownikiem będzie ten, kto np. od lat pracuje z konkretnym językiem programowania, niż ten, kto teorię języków formalnych zna dobrze, ale ma skromny bagaż doświadczeń. Pogląd przeciwny skłania do stwierdzenia, że wyższe wykształcenie informatyczne jest koniecznym fundamentem, a znajomość konkretnych systemów jest wtórna i pracownik może ją nabyć z literatury albo na kursach. A jak jest naprawdę?

Wyobraźmy sobie, że ktoś postanawia nauczyć się programowania. Na domowym komputerze, obok edytora tekstów, oprogramowania pozwalającego odtwarzać pliki MP3, kilku programów do obróbki grafiki, zainstalował zintegrowane środowisko programistyczne. Po kilku nieśmiałych próbach "połyka haczyk" i postanawia poszerzyć wiedzę, tak aby móc konstruować poważne programy. Wybiera Visual Basica, jako język zintegrowany w popularnych aplikacjach biurowych i stworzony z myślą o "normalnych ludziach", nieinformatykach.

Wizyta w księgarni specjalizującej się w wydawnictwach informatycznych przekonuje go, że nie ma nic prostszego. W tytułach można przebierać jak w ulęgałkach - są dzieła polskich autorów, tłumaczenia, a także książki oficjalnie rekomendowane przez Microsoft do nauki tego języka. Za kilkadziesiąt złotych zaopatruje się w kurs wraz z zestawem ćwiczeń na płycie CD. Kilka tygodni później zamyka ostatnią stronę podręcznika i rozwiązuje ostatnie ćwiczenie, ze zdziwieniem myśląc: "Ależ to proste!". Jeżeli ma dość samozaparcia i wolną gotówkę, potwierdza swoją wiedzę egzaminem, dzięki któremu zdobywa stosowny certyfikat. Następnie otwiera edytor tekstów (edytor pełni tu rolę zasadniczą) i modyfikuje swoje CV, dodając w rubryce "Umiejętności" dodatkowy punkt: w języku Visual Basic.

Proste porównanie

W tej sytuacji pracodawca, który szuka pracowników ze znajomością tego języka programowania, ma prawo przypuszczać, że ktoś taki posiada kwalifikacje do tworzenia systemów informatycznych. Spróbujmy więc zastanowić się, czy tak jest w istocie.

Chlebem powszednim informatyków jest poszukiwanie wzorca w tekście. Cóż może być prostszego od sprawdzenia, czy dwa teksty są jednakowe, np. czy podana nazwa miasta (zmienna) to Chęciny, miejscowość koło Kielc znana z malowniczych ruin zamku. To tak typowa czynność, że z pewnością nikt nawet nie zastanawia się, jak ją wykonać. Stosowna linia w "języku programowania dla ekonomistów i inżynierów", jakim jest Basic, wygląda następująco:

If miasto = "Checiny" Then

Wydaje się, że dalszy ciąg tej linii zostanie wykonany, jeżeli zmienna miasto będzie zawierać tekst "Chęciny". Ale czy porównanie odbywa się z uwzględnieniem wielkich i małych liter? W przytoczonej instrukcji tego nie widać. W istocie odpowiedź na to pytanie wcale nie jest prosta i wymaga zajrzenia w zupełnie inne miejsce. Ta sama linia wykonana w różnych fragmentach programu może raz dokonać sprawdzenia z uwzględnieniem wielkości liter, a innym razem bez.

Oczywiście, pewność tę można uzyskać stosunkowo szybko. Niestety, nasza linia programu może nadal nie spełniać swojej funkcji i nie wyłowić Chęcin. Tak się bowiem składa, że nazwa ta zawiera polski znak. Czy możemy mieć pewność, że zmienna miasto na pewno została napełniona tekstem, do którego stosowany był ten sam zestaw znaków? Czy może raczej jest tak, że w zmiennej litera "ę" jest przechowywana w standardzie Unicode, podczas gdy w programie jest stosowane CP1250?

Zestaw znaków to nie wszystko. Zastąpmy teraz znak równości znakiem mniejszości. W alfabetyczne porównanie dwóch tekstów angażowane są informacje o kraju i języku (locale). Informacje te pozwalają właściwie "rozumieć" tekst, na przykład sortować go według reguł danego języka, dokonywać poprawnej konwersji do wielkich i małych liter itp. Mogłoby się wydawać, że na liście uszeregowanej alfabetycznie miejscowość Chęciny powinna się znaleźć przed nazwą Grodzisk. Tymczasem w języku czeskim "ch" stanowi osobną literę występującą w alfabecie za literą "h". Gdyby więc porównanie działało według reguł obowiązujących u naszych południowych sąsiadów, byłoby na odwrót.

W nowocześnie skonstruowanej aplikacji występują co najmniej trzy warstwy - bazy danych: biznesowa i prezentacji. Zwykle na każdej z nich zachodzi część przetwarzania. Zanim więc uznalibyśmy przytoczoną linię programu za poprawną, musielibyśmy się upewnić, na której z warstw będzie ona wykonywana. Może w bazie danych, jako tzw. procedura wbudowana (stored procedure)? Może w obiektach określających logikę aplikacji, działających na warstwie biznesowej? A może w przeglądarce internetowej na stacji roboczej klienta, który potencjalnie znajduje się w innym kraju (także w Czechach)? To samo porównanie może dać inny wynik na każdej z tych warstw i autor programu musi o tym myśleć w trakcie jego pisania.

Jak widać, nazwa malowniczego miasteczka w Górach Świętokrzyskich przysporzyła nam wiele wątpliwości. Zostawmy ją więc na chwilę i zajmijmy się zmienną miasto. Rzecz wydaje się prosta, ale czy jest taka rzeczywiście? Na przykład zmienna ta może wskazywać miejsce w bazie danych. W chwili gdy nasz klient chce odczytać zawartość bazy, inny klient może tam zapisywać. System zarządzania bazą danych wstrzyma żądanie odczytu do momentu, gdy tamten zapis się zakończy. Nastąpi więc istotne opóźnienie w działaniu programu. A co stanie się, jeżeli my jednocześnie zapisujemy do miejsca, które tamten program czyta? Nastąpi zakleszczenie, czyli deadlock, i wtedy nasza aplikacja znajdzie się w prawdziwych opałach.