Czy pisanie kodu to zawodowa przyszłość wszystkich inżynierów i naukowców? Biceps programistycznej logiki
Edukacja zwykle nie nadąża za rozwojem technologii. Współcześni inżynierowie mechanicy wciąż raczej nie są programistami, a przynajmniej nie są edukowani z naciskiem na tego rodzaju umiejętności. Jednak przykłady i zachodzące zmiany sygnalizują, że znajomość programowania staje się właściwie niezbędna.
Inżynierowie z tradycyjnych dziedzin techniki np. wspomnianej mechaniki często mają do czynienia z tzw. logiką drabinkową. Język drabinkowy/logika drabinkowa (ang. Ladder logic, LD, LAD) - tak nazywany jest graficzny język programowania sterowników PLC (1). Pierwotnie był pisemną metodą dokumentacji sterowania przekaźnikowego, stosowanego w produkcji i kontroli procesów przemysłowych. Urządzenia w szafie przekaźnikowej są reprezentowane przez symbole na schemacie drabinkowym razem z połączeniami między nimi. Jako język graficzny jest prostszy i łatwiejszy do opanowania niż język programowania sterowników.
Ponieważ jednak programowanie skryptów wyższego poziomu zaczyna coraz częściej integrować się ze sterownikami i napędami, a urządzenia korzystające z języków wyższego poziomu dają konkurencyjną przewagę, coraz bardziej pożądana jest wiedza z zakresu programowania.
Inżynier może pracować w fabryce, w której maszyny działają, opierając się na logice drabinkowej, ale co się stanie, gdy firma podejmie projekt integracji jednej z linii produkcyjnych z ramionami robotycznymi (2), które działają w oparciu o język programowania wyższego poziomu? Logika drabinkowa nie znika, owszem, a wykształceni inżynierowie zawsze będą mieli pracę, pojawiają się jednak nowe wymogi, którym warto sprostać w ramach zawodowego rozwoju.
Wciąż nie ma bezwzględnego wymogu, by inżynierowie mechanicy byli programistami. Wciąż większość linii produkcyjnych to urządzenia mechaniczne. Jednak jeśli chce się rozwiązywać nowoczesne problemy, to trzeba znać nowoczesne metody rozwiązań. A rozwiązywanie problemów to niezmiennie jedno z głównym oczekiwań wobec inżynierów.
Programowanie rozwija i pozwala lepiej się zrozumieć
Wyjdźmy poza hale produkcyjne na obszary badań, projektowania, analizy danych. Współcześni naukowcy i inżynierowie coraz większą część dnia pracy spędzają przed komputerem. Reguła ta dotyczy najróżniejszych dziedzin: astronomii, biologii, fizyki, inżynierii lotniczej i kosmicznej, ekonomii, genetyki, ekologii, inżynierii środowiska, neurobiologii... lista jest długa. Współczesna nauka i inżynieria polegają na przetwarzaniu, analizowaniu i wyciąganiu wniosków z danych.
Dość banalnie brzmi dziś stwierdzenie, że pracę badawczą można przyspieszyć wielokrotnie, pisząc programy komputerowe w celu zautomatyzowania żmudnych zadań (choćby takich jak czyszczenie i integracja danych), które w przeciwnym razie trzeba wykonywać ręcznie. Można oczywiście zwrócić się do zawodowych programistów, by przygotowali software, ale w dzisiejszym wysoko wyspecjalizowanym świecie nauki i inżynierii najefektywniejszy wydaje się pomysł, aby specjalistyczne oprogramowanie przygotowywał nie programista z zewnątrz, lecz specjalista w danej dziedzinie. To on wie najlepiej, jakie są potrzeby, zadania i cele.
Ciekawym aspektem programowania jest to, że pozwala ono specjalistom odkrywać bardziej kreatywne rozwiązania niż znane dotychczas. Pozwala bowiem wyjść poza rutynę używanych zwykle narzędzi i zestawów danych, przekroczyć ograniczenia.
Każdy, kto miał do czynienia z pisaniem programów, wie, że polega ono w dużym stopniu na odkrywaniu nowych możliwości i zasobów. Istnieje mnóstwo gotowych pakietów, bibliotek, algorytmów, funkcji, programów, języków i oprogramowania do wielu różnych celów. Nie trzeba uczyć się wszystkiego, aby zostać programistą, ale trzeba określić, które z nich najlepiej pasują do celów i wyników, które chcemy osiągnąć.
Niebagatelne znaczenie ma także to, że znajomość programowania pozwala naukowcom i inżynierom skutecznie komunikować się z programistami. Nie trzeba być samemu wybitnym programistą, ale samo rozumienie, na czym polega programowanie, wybitnie zwiększa efektywność współpracy z członkami zespołu zajmującymi się software'em.
Współcześnie zarówno naukowcy, jak też inżynierowie projektanci w swojej pracy mają do czynienia w wielkimi zasobami danych. Pojawia się więc kolejna pożądana kompetencja, wybiegająca nawet poza zestaw typowych umiejętności programisty, polegająca na radzeniu sobie z big data, a najlepiej biegłym opanowaniu technik ich przetwarzania w użyteczne informacje. Trudno oczekiwać, że każdy od razu stanie się data scientist, jednak umiejętności związane z kodowaniem algorytmów tworzących modele klasyfikujące i analizujące dane są przydatne z takich samych powodów, jak wyżej wymienione w kontekście "zwykłego" programowania.
Wysoki i niski poziom
Najprościej rzecz ujmując, język programowania to zestaw instrukcji używanych do nakazania komputerowi, aby coś zrobił. Komputery "myślą" i "rozmawiają" w systemie binarnym (zbiory 1 i 0). Języki programowania są rodzajem translatora, który przekształca ludzkie polecenia na te jedynki i zera, tak aby komputer mógł je "zrozumieć" (3).
Każdy język programowania jest nieco inny pod względem sposobu, w jaki rozmawia z komputerem, używając różnych poleceń, symboli, itp. Niektóre z języków programowania są bardziej uniwersalne, inne zaprojektowane specjalnie dla konkretnych systemów operacyjnych (jak Swift dla iOS lub C# dla Windows). Można je ogólnie podzielić na dwa główne typy - pierwszy nazywany jest "językami wysokiego poziomu", a drugi "językami niskiego poziomu".
Języki wysokiego poziomu to te, które są, ogólnie rzecz biorąc, bliższe sposobom komunikacji międzyludzkiej. Używają czytelnych dla człowieka poleceń, takich jak na przykład "object", "order", "run", "class", "print", itp. Z tego powodu języki wysokiego poziomu są zwykle łatwiejsze do opanowania niż języki niskiego poziomu.
Aby komputer mógł zrozumieć polecenia napisane w językach wysokiego poziomu, muszą one jednak zostać przetłumaczone lub skompilowane na język niskiego poziomu, czyli język maszynowy. Często zdarza się, że programiści nigdy nie widzą wyniku w języku maszynowym.
Języki wysokiego poziomu działają wolniej niż języki niskiego poziomu, ponieważ potrzeba czasu na przetłumaczenie poleceń wysokiego poziomu na kod maszynowy, zanim maszyna będzie mogła je wykonać. Mowa tu o milisekundach lub nawet sekundach, jeśli są to bardzo duże programy. Szeroko znanymi przykładami języków wysokiego poziomu są PHP, Ruby i Java (4).
Języki niskiego poziomu są bliższe kodowi maszynowemu (binarnemu). Są one o wiele trudniejsze do zrozumienia dla człowieka, ale wciąż o wiele łatwiejsze niż czysty kod binarny. Można je generalnie podzielić na dwa typy: "język montażu" i "język maszynowy". Główną zaletą tego rodzaju języków jest względna szybkość ich "tłumaczenia" na kod działania maszyny. Oferują też znacznie bardziej precyzyjną kontrolę nad wykonywaniem poleceń przez maszynę. Przykłady języków niskiego poziomu to: Fortran, COBOL, x86.
Kodowanie rozwija
Panuje opinia, że znajomość języków i technik programowania staje się coraz bardziej niezbędna w pracy inżynierów i innych specjalistów w dziedzinie techniki (5). Obecnie kształcący się mechanicy, budowniczy, architekci, elektronicy i przedstawiciele wielu innych zawodów raczej na pewno i to wcześniej niż później zetkną się z potrzebą napisania jakiegoś programu, który umożliwi lub usprawni coś w ich pracy.
Dlaczego uczyć się programowania? Są argumenty odwołujące się do samorozwoju i samodoskonalenia. Nie muszą one koniecznie dotyczyć inżynierów i naukowców, bo każdemu może przydać się wzmocnienie "mięśnia logiki" przez używanie zdefiniowanych operatorów logicznych, pętli i instrukcji warunkowych.
Nauka logiki programistycznej pozwala spojrzeć na procesy i problemy do rozwiązania w sposób analityczny, układający je w uporządkowane sekwencje. Rozwija się również myślenie systemowe, w którym uświadamiamy sobie, że wszystko jest połączone wzajemnie ze sobą. Analizując problem i proponując jego rozwiązanie, trzeba w myśleniu programistycznym przeanalizować, ocenić wpływy i implikacje w większej skali niż tylko segment, w którym pracujemy. Lepiej też widać, iż całość jest czymś więcej niż sumą części.
Podczas pisania kodu lub tworzenia programu do wykonania konkretnego zadania lub rozwiązania problemu, zwykle jest potrzeba rozłożenia go na mniejsze elementy. Analizowanie problemu przez mniejsze komponenty pomaga zidentyfikować przyczyny problemów, jeśli występują. Jednocześnie zdajemy sobie sprawę, że w większości przypadków istnieje więcej niż jedno rozwiązanie danego problemu. Umiejętność programowania rozwija więc nas w sposób różnorodny i wszechstronny.
Mirosław Usidus