Programista iluzjonista

Ostatnio coraz częściej słyszę rodziców mówiących, że ich dzieci umieją programować, coraz więcej obserwuję ludzi twierdzących, że są programistami. Prawda jest jednak inna i nie rozumiem, co tu się dzieje.
Ostatnio rozmawiałem z osobą z rodziny, która twierdzi, że jej syn jest programistą. Rozmawiałem z nim. Prawda jest taka, że C jest mu językiem obcym, coś tam wie o komputerach, jak na licealistę, nawet dużo, ale uważa się za programistę, bo napisał stronę Internetową. Inny człowiek twierdzi, że jest inżynierem oprogramowania, bo napisał w CPP aplikację, która wypisuje na ekranie napis Hello World albo oblicza sumę dwóch liczb.
Rodzice uważają, że nasze pokolenie z racji oswojenia z informatyką od najmłodszych lat rodzi samych programistów i informatyków. Trudno jest mi zaś z tym poglądem się sprzeczać, zarzuca mi się bowiem wtedy zazdrość, czego nie rozumiem w ogóle.
Zacznijmy może jednak po kolei.
Czym jest programowanie? A no jest to umiejętność czy też sztuka tworzenia aplikacji komputerowych.
W programowaniu wykorzystuje się różne techniki, biblioteki, języki, wszystko jednak sprowadza się do założenia, w którym musimy nauczyć się myśleć, jak komputer i poprzez odpowiedni ciąg cyfr i słów uzyskać efekt, którego poszukujemy.
Kim jest programista?
Powiedziałbym, że człowiekiem, który potrafi (być może z pomocą dokumentacji) stworzyć zasadniczo dowolną aplikację komputerową, mam jednak wrażenie, że słowo to ulega przedefiniowaniu.
Powiedzmy, że chcemy napisać w najczystszym kodzie, tak zwaną metodą Asemblera, program, który wyświetli napis Hello World. Metodę tą nazywamy programowaniem najniższego poziomu i była ona przyczyną wielu godzin nauki i prób zrozumienia co autor ma na myśli, jakie spędzałem po szkole w okresie gimnazjalnym.
Poniższy kod, o ile się nie pomyliłem, wyświetli na ekranie napis Hello, World!, czyli witaj świecie.
section .data
msg db "Hello, World!",0xa
len equ $-msg
section .text
global _start
_start:
mov eax,4
mov ebx,1
mov ecx,msg
mov edx,len
int 80h
mov eax,1
mov ebx,0
int 80h
end:
Nie będę tłumaczył powyższego kodu, to nie jest poradnik do programowania, a po prostu pokazanie pewnego zjawiska.
Napisanie powyższego kawałka kodu wymaga pewnych umiejętności i wiedzy o komputerach. W praktyce dziś Asemblera używa się rzadko, przede wszystkim wtedy, gdy nie ma innej opcji, powstały biblioteki upraszczające pewne zadania. I tak powyższy kod można napisać w języku C Plus Plus w następujący sposób:
#include <iostream>
int main() {
std::cout<<"Hello, World!";
return 0;
}
Widać różnicę? Myślę, że widać.
Weźmy teraz przeciętnego ucznia, który coś tam wie o komputerach i chce napisać program, który wyświetli dany napis na ekranie, powiedzmy że w Asemblerze, bo jest to dobry punkt wyjścia.
Zobaczy kod podobny do powyższego, pierwszego zaprezentowanego.
Przepisze go z sieci, nie rozumiejąc, skąd te cyfry i znaki.
Ja wam mogę opowiedzieć, że ustawiamy tutaj na odpowiednie wartości kolejne rejestry procesora, ustawiamy rejestr eax na wartość 4, co oznacza że wywołujemy interfejs służący do wyświetlania tekstu, potem ustawiamy rejestr ebx na 1, czyli informujemy system, że będziemy pisać do tak zwanego standardowego wyjścia, dalej do rejestru ecx podajemy adres pamięci, w którym znajduje się nasz napis do wyświetlenia, do rejestru edx długość tego napisu, a potem wywołujemy kernela, który zrobi, co mu kazano. I tak dalej, i tak dalej.
Tym czasem osoba, która skopiuje ten program, napisze go, owszem, ale nie zrozumie stojącej za nim filozofii, kiedy kazać jej napisać program, który zrobi coś bardziej złożonego, nie będzie umiała, bo nie zrozumie programowania.
Weźmy drugi przypadek, mamy sobie ucznia, który zrozumiał nawet podstawy programowania, potrafi stworzyć instrukcję warunkową, pętlę, powiedzmy w języku C Plus Plus. Wie do czego co służy.
Czy taki człowiek potrafiłby napisać, powiedzmy, odtwarzacz plików?
Nie, bo trzeba mu wiele wprawy i doświadczenia, poznania wielu bibliotek, nauczenia się algorytmiki, optymalizacji i tak dalej.
Nie chcę, by wpis ten był odebrany jako próba zdyskredytowania wszystkich młodych ludzi poznających tajniki inżynierii oprogramowania.
Sam kiedyś byłem takim człowiekiem, który dopiero się uczył, dla którego napisanie kalkulatora w C Plus Plusie było powodem radości do końca tygodnia, który gdy napisał prosty kernel systemu operacyjnego potrafiącego zapisać plik tekstowy na dysku i wyświetlić jego treść na ekranie, bootloader do niego, skompilował i uruchomił to dzieło na komputerze i zobaczył, że plik powstał, był tak szczęśliwy, że radości jego nie potrafiła zachwiać nawet w owym czasie prawdziwa perspektywa pisania czterech sprawdzianów w jednym tygodniu.
Rzeczy, które dziś są dla mnie banalne i które potrafię pisać z pamięci i w środku nocy, były kiedyś dla mnie poważnymi przeszkodami, a pokonanie każdej z nich dawało ogromną satysfakcję.
I dlatego trzymam kciuki za każdego człowieka, który zaczyna próbę poznania programowania, pomagam jak mogę, dzielę się doświadczeniem i wiedzą, notatkami i własnymi porażkami i ich rozwiązaniami.
Nazywajmy jednak rzeczy po imieniu. Ktoś, kto skrobnął ledwo podstawy programowania nie jest jeszcze programistą. Może nim będzie, dziś jest po prostu bardzo zdolnym człowiekiem utalentowanym w dziedzinie informatyki.
Powtarzam raz jeszcze, nie jest moim celem obrażanie czy umniejszanie zdolności jakiegokolwiek człowieka.
Jest nim apel, by nazywać rzeczy po imieniu, by potrafić szczerze ocenić to, co się potrafi.
Nie twierdzę, że nie ma programistów w gimnazjach czy liceach, chociażby tu, na Eltenie mamy żywka. Ale może jeden na stu tak zwanych programistów naprawdę jest programistą.
Nie można nauczyć się programowania w tydzień ani miesiąc, nawet nie w rok, to są lata prób, doświadczeń, błędów i poprawek.

8 komentarzy

  1. Dobre pytanie.
    O Asmie czy CPP pisałem dlatego, że są dobrym punktem odniesienia. Ktoś może naskrobać coś w CPP, a programistą nie być, bo nie zrozumie, co programuje.
    Ktoś może pisać całe życie w Javie, a być programistą świetnym.
    O ile jednak przy takim CPP czy Asmie sprawa jest dość prosta – umie, jest, o tyle Java, JS czy PHP to inna kwestia.
    Można umieć coś w takiej Javie napisać, a programistą nie być, bo nie rozumie się tego, co się robi, postępuje się jedynie wedle wyuczonych schematów.
    Taka osoba umie poruszać się w wąskiej dziedzinie tematów, ale nie umie wyjść poza tego granice.
    I taka osoba nie jest programistą.
    Myślę, że kluczem jest zrozumienie tego, jak działa to, co piszemy.
    Uważam, że programista umie lub umiałby napisać kod w Asemblerze, gdyby mu kazano.
    Wiadomo, nie musi pamiętać rejestrów i numerów wywołań, nie o to chodzi.
    Ale jak programiście, chociażby Javy, dać ściągę i wykaz poleceń Asma, napisze coś prostego.
    Jak dać komuś, kto po prostu pamięta kilka linijek, wytrzeszczy oczy i stwierdzi, że to nie dla niego.
    Kryterium nieprecyzyjne, ale najlepsze, jakie do głowy mi przyszło.

  2. Pozostaje tylko zadać sobie pytanie, na etapie którego poziomu języka programowania można mówić, że ktoś jest programistą? Bo czy programistą jest ktoś, kto zna ASM? Tu nie ma wątpliwości. Czy programistą jest ktoś, kto zna CPP, przecież tu część pracy robi za nas sam kompilator. A co z programowaniem w Javie? Tam np. mamy przecież Garbage Collectory, które za nas posprzątają, w językach niskopoziomowych trzeba o tym wszystkim pamiętać samodzielnie. Pozostaje również temat wszechobecnego programowania aplikacji webowych i różnego rodzaju technologii, które za nimi stoją. Bazy relacyjne, nierelacyjne, które przecież obsługuje się w zupełnie inny sposób, do obsługi takich baz zwykle i tak używa się stosownych bibliotek. PHP i jego frameworki, które ułatwiają pracę, tak samo z Rubym czy Pythonem. Imho o kimś, kto pisze kod w HTML nie da się powiedzieć, że jest programistą. O kimś, kto pisze w PHP czy JScript’cie owszem. Tylko znowu pytanie, czy można powiedzieć, że ktoś jest programistą o kimś, kto potrafi używać tylko Bootstrapa? Tak na prawdę myślę, że nie jest ważne to, w jakim języku ktoś programuje, ważne jest to, czy umie w nim rozwiązać dany problem. Oczywiście wiadomo, że różne języki sprawdzają się w różnych sytuacjach lepiej lub gorzej, ale prawdziwy programista to ktoś, kto potrafi rozwiązywać problemy za pomocą narzędzi, których używa. Może zająć mu to więcej, lub mniej czasu, ale jeśli przed programistą postawimy dowolny problem informatyczny, on powinien umieć go rozwiązać.

  3. Programowanie jest tak rozległą dziedziną, jak sam to z resztą przy innych okazjach podkreślasz, że nie
    wydaje mi się, że programista będzie człowiekiem, który napisze dowolną aplikację. Myślę jednak, że tu
    się zgadzamy, chodzi mi o to, że są programiści dobrzy w różnych dziedzinach. Niemniej jednak oni potrafią
    w tych dziedzinach się poruszać, robić w nich dużo rzeczy, więc ja się w stu procentach zgadzam. To taka
    sama różnica, jak uczyć się angielskiego, a po angielsku mówić. xd. Więc, tak, mnie też rozwalają ci
    „programiści”.

Dodaj komentarz

EltenLink