Po ósme: programista nie nabiera się na spam

… (prawie nigdy!) ponieważ rozumie, jak i po co działają spamerzy. Miało być siedem powodów, żeby zostać programistą, ale dodaję ósmy.

Oto krótka sesja Q&A (pytań i odpowiedzi, a raczej wykrzykników i odkrzykników) dla fejsbukowych niewiniątek:*

Q: Samo się pojawiło! Ja tego nie wrzucałem / nie polubiłem / nie rozsyłałem!
A: Nie, zrobiła to za Ciebie aplikacja, którą własnoręcznie zainstalowałeś na swoim koncie.

 

Q: Nic nie instalowałem!
A: Ależ tak. Za każdym razem, kiedy po kliknięciu w „interesujący” link (z reguły o puszczalskich gimnazjalistkach – serdecznie gratuluję wyboru) musisz zatwierdzić coś w dodatkowym okienku dialogowym („Czy na pewno masz 18 lat?”), ryzykujesz, że w rzeczywistości wyrazisz zgodę na instalację złośliwej aplikacji.

 

Q: Czy to znaczy, że nie należy akceptować komunikatów o ciasteczkach w przeglądarce? Jak je odróżnić?
A: Podstawowa różnica w przypadku komunikatu o ciasteczkach jest taka, że nie uniemożliwia on odczytu treści na stronie.

 

Q: No dobra, może i kliknęłam. Kichając! Co teraz?
A: Teraz odinstaluj aplikację. Wygląda to mniej więcej tak:

  1. Przejdź do Ustawień.
  2. Wybierz Aplikacje.fb2
  3. Przejrzyj listę aplikacji i zastanów się, czy wiesz, dlaczego zainstalowałeś każdą z nich.
  4. Usuń niechciane aplikacje przy użyciu krzyżyka, widocznego po przesunięciu myszką nad logo aplikacji.fb3
  5. Możesz dodatkowo zablokować wybrane aplikacje (np. te, z których nieustannie dostajesz zaproszenia) w menu Blokowanie.fb4

 

Q: Po co spamerzy to robią?
A: Motywacji jest wiele, na przykład takie:

  1. Bezinteresowny trolling.
  2. Chęć pozyskania prywatnych danych użytkowników. Instalując aplikację udostępniasz jej twórcy nie tylko swoje dane, ale także niektóre dane swoich znajomych (szczegółowe ustawienia dotyczące udostępnianych danych znajdziesz również w sekcji Aplikacje).
  3. Bardzo źle pojęta promocja marki.

*a przy okazji ostatnie ostrzeżenie przed usunięciem ze znajomych

7 powodów, dla których warto zostać programist(k)ą

… albo „co lubię w mojej pracy”.

Nie mówcie tego mojemu szefowi, ale… informatyka nie jest moją życiową pasją. To zawód, którego podjęcia ani przez chwilę nie żałuję i do którego wyboru zachęcam, mimo że wieczory wolę poświęcać na rozrywki inne niż czytanie branżowej prasy. Poniżej siedem powodów, dla których moim zdaniem warto zostać programistą.

1. Programowanie jest łamigłówką.

To powód główny i wystarczający. Programowanie, kiedy przedrzesz się już przez techniczne podstawy, sprowadza się do szukania odpowiedzi na następujące pytania:

  • „Jak poukładać elementy, żeby wszystko razem zagrało”?
  • „Dlaczego ten kod nie działa”?
  • „Jakim cudem działa?!”
  • „O co, u licha, chodziło autorowi?”

Jak przy Sudoku, jak Sherlock Holmes 🙂 Ciągła intelektualna stymulacja i ogromna satysfakcja ze znalezienia rozwiązania.

2. Twoi współpracownicy grzeszą inteligencją.

Nie wszyscy programiści są fajni, oj nie. Jak w każdej grupie zawodowej, w tej także znajdziesz emocjonalnych popaprańców, twardogłowych szowinistów, fanów zatrważająco złej muzyki upierających się tą muzyką dzielić. Spotkasz też sporo altruistów, ludzi kreatywnych, prawdziwych pasjonatów. Różni ich wiele, ale możesz mieć pewność co do jednego: nie spotkasz wśród nich kompletnych idiotów. Inteligencja wiedzie prym wśród nie tak znowu licznych warunków koniecznych do wykonywania tego zawodu.

Kiedy słyszę opowieści o biurowych konfrontacjach znajomych z innych branż, często gratuluję sobie wyboru środowiska. Może być niemiło, ale rzadko kiedy jest naprawdę głupio.

Oczywiście spotkania z klientami to zupełnie inna para kaloszy 🙂

3. Java to nowa lingua franca.

Języki programowania są międzynarodowe. Kod w Javie, Haskellu, C++ wygląda tak samo niezależnie od tego, w jakim kraju powstał.

No dobra, powinien wyglądać tak samo… Czasami zdarzają się kwiatki w postaci komentarzy pisanych cyrylicą. Wiemy też, że jedne kraje bardziej niż inne słyną z produkowania tzw. spaghetti code.

Tak czy inaczej, wiedza programistyczna – znajomość języków, wzorców projektowych, dobrych praktyk – jest całkowicie uniwersalna. Zadziała w każdym kraju, w którym zamarzy Ci się podjąć pracę.

Dodatkowo, informatycy w różnych miejscach świata napotykają dokładnie te same problemy, dzięki czemu w większości przypadków można założyć, że ktoś gdzieś (czyli w Internecie) już opisał działające rozwiązanie. A to z kolei przypomina mi czarny dzień, w którym portal Stack Overflow zablokował dostęp pracownikom z mojego biura, mylnie interpretując liczbę wejść z tego samego adresu IP jako atak DoS. Ręka w górę, kto dziś potrafi  programować bez wsparcia tej strony.

4. Ekstrawertyk czy mizantrop: każdy znajdzie dla siebie miejsce.

Rynek pracy dla programistów jest bardzo elastyczny. Nie znosisz ludzi – możesz pracować zdalnie i uniknąć oglądania znienawidzonych obcych gąb. Podoba Ci się biurowe życie – proszę bardzo, nic łatwiejszego. Potrzebujesz dużo interakcji – odnajdziesz się na przykład w roli Scrum Mastera (tutaj Publiczność zagląda mi przez ramię i marudzi, że Scrum Master to nie programista). Jesteś ekstrawertykiem – wiele firm gorąco zachęca pracowników do występowania na branżowych konferencjach i krzewienia pomysłów oraz misji pracodawcy („ewangelizacja”).

5. Zarobki są przyzwoite.

Taka prawda. Vide raport pracuj.pl.

6. Informatyka wykończy wszystkie zawody, zanim zabraknie pracy dla nas.

To stosunkowo niezręczny temat. Czasami czuję się przez to jak czarny charakter z pozytywistycznej powieści. Tak jak przemysłowe linie produkcyjne doprowadziły do bankructwa drobnych rzemieślników, tak postęp algorytmiczno-wydajnościowy zaczyna zagrażać zawodom zaliczanym do umysłowych czy wręcz inteligenckich. Nie wiem, dokąd to nas zaprowadzi – może wreszcie do utopijnej rzeczywistości pracy po 3 godziny dziennie? Jedno wiem na pewno – najpierw wykończymy wszystkich innych, dopiero potem to my zostaniemy bez pracy.

7. Koszula w kratę i kapcie na nogach.

Programistów bardzo rzadko obowiązuje dress code! Co oczywiście ma swoje dobre (wygoda) i złe (cudze owłosione palce u stóp) strony. Wśród moich znajomych znam tylko jeden egzemplarz zobowiązany do chodzenia do pracy w garniturze, w reprezentacyjnej siedzibie międzynarodowego banku. Zresztą całkiem mu w nim do twarzy.

===

Dla równowagi (i zabawy), w przyszłym tygodniu przestawię również siedem kontrpowodów 😉

Wieża Babel. Skąd tyle języków programowania? (część 3 z 3)

Tekst jest oparty na mojej prezentacji z konferencji Kariera IT. Poprzednia część wpisu jest dostępna tutaj.

To ostatnia (po 1 i 2) część mojego krótkiego przewodnika po językach programowania. Zaczynam ją dwoma dość ekstrawaganckimi przykładami, by wreszcie przejść do podsumowań: który język do czego się nadaje i który może uczynić z Ciebie milionera! Na samym końcu znajdziesz quiz 🙂 – a także listę lektur, na wypadek, gdybyś chciał dalej zgłębiać wiedzę na ten temat.

Języki wyspecjalizowane – R

Do tej pory – w poprzednich dwóch wpisach – koncentrowałam się na językach ogólnego przeznaczenia. Dla równowagi chcę pokazać przynajmniej jeden język programowania z innej, bardziej specjalistycznej grupy.

R to język programowania i środowisko przeznaczone do obliczeń statystycznych i wizualizacji wyników. Oferuje zaawansowane wsparcie w dziedzinach takich jak analiza danych i uczenie maszynowe. R jest interpretowanym językiem proceduralnym. Ma pewne ograniczenia wydajnościowe (np. wszystkie dane przetwarzane przez program są w całości ładowane do pamięci podręcznej komputera). Kod R można łączyć z kodem napisanym w innych językach, takich jak C++.

Skoro zadania wykonywane w R można wykonać w C++, do tego kod w innym języku może działać szybciej, po co w ogóle dotykać R? W poprzednim wpisie z tej serii pojawił się punkt „Wydajność języka a wydajność programisty”. W R implementacja zadań związanych ze statystyką i analizą danych jest nieporównywalnie szybsza niż w językach ogólnego przeznaczenia. Programista nie musi pisać wielu linii, a wszystkie tradycyjnie używane w tej dziedzinie algorytmy (np. regresja liniowa) są od ręki dostępne w postaci funkcji.

Poniższy fragment kodu pochodzi z artykułu Producing Simple Graphs with R. Zobacz, jak łatwo można wyświetlić dane i ocenić, czy zachodzi między nimi korelacja.

Co dostaniemy po uruchomieniu programu (np. w środowisku R Studio)? RJeśli nie podoba Ci się myląca etykietac „samochody” przy osi y, na stronie z oryginalnym przykładem dowiesz się, jak go zmienić.

Nie tylko dla dzieci – programowanie graficzne

Istnieją języki programowania, które bardziej niż tekst w obcym języku przypominają… hieroglify. Programowanie polega nie na wpisywaniu poleceń, ale na przeciąganiu i upuszczaniu na planszy bloków symbolizujących poszczególne instrukcje.

Naturalnym odbiorcą tego typu przyjaznych środowisk są dzieci, co jakiś czas jednak powraca temat „rewolucji” w tworzeniu aplikacji przez (pół)profesjonalnych programistów – ostatnio za sprawą projektu Eve.

Przykład tego typu programu pojawił się w opublikowanym przeze mnie w międzyczasie (pomiędzy kolejnymi częściami serii o językach programowania) wpisie Kup swojemu dziecku sobie robota Lego Mindstorms. Znajdziesz tam kompletny opis „najtańszego programowalnego robota”, którego możesz zbudować z klocków Lego.

Poniżej „fragment kodu” dla takiego robota, którego w akcji możesz zobaczyć tutaj:

nxt-codeCo widać na rysunku? Nieskończoną pętlę, w której raz po raz odczytujemy kolor przesyłany przez czujnik światła (bądź koloru). W zależności od tego, czy robot znajduje się na linii (odczyt czarny) czy nie (odczyt biały) albo jedziemy prosto (obrót obu kół o tyle samo stopni), albo skręcamy w prawo.

Wydaje się to banalne, ale w taki sposób można tworzyć zaskakująco złożone programy, o czym przekonałam się kiedyś podczas zawodów programistycznych dla gimnazjalistów.

Który do czego?

Poniższa tabela zawiera wpisy dla tylko kilku spośród najpopularniejszych języków. Zdecydowanie nie wyczerpuje tematu – spójrz, ile pozycji ma lista języków programowania w Wikipedii.

Język Przeznaczenie (najsilniejsze strony) Paradygmat
C System
Operacje niskopoziomowe
Imperatywny
 C++ System Imperatywny
Obiektowy
Funkcyjny
 C# Szybkie tworzenie aplikacji okienkowych
Aplikacje klient-serwer
Aplikacje internetowe
Imperatywny
Obiektowy
Funkcyjny
 Erlang Aplikacje rozproszone
Telekomunikacja
Funkcyjny
 Haskell Aplikacje desktopowe i internetowe Funkcyjny
 Java Aplikacje serwerowe
Aplikacje mobilne (w tym Android)
Imperatywny
Obiektowy
Funkcyjny
JavaScript Aplikacje internetowe w przeglądarce, po stronie klienta Imperatywny
Obiektowy (prototypy!)
Funkcyjny
 Perl Skrypty
Przetwarzanie tekstu i dokumentów
Imperatywny
Obiektowy
Funkcyjny
 PHP  Aplikacje internetowe Imperatywny
Obiektowy
Proceduralny
 Prolog  Sztuczna inteligencja  Logiczny
 Python  Aplikacje internetowe
Skrypty
Imperatywny
Obiektowy
Funkcyjny
 R  Statystyka Imperatywny
Obiektowy
Funkcyjny
Proceduralny

Który da mi pracę?

Jeśli dopiero zaczynasz programować, jeśli myślisz o przekwalifikowaniu się, jeśli nudzi Cię Twoja obecna (może nawet informatyczna) praca, to pewnie zastanawiasz się, który z języków wybrać. O tym, który język najlepiej nadaje się jak pierwszy dla osoby, która nigdy wcześniej nie programowała, pisałam tutaj (tl;dr: Python).

Co z ofertami pracy? Gdybym miała odpowiedzieć bez namysłu, obserwując ruch na rynku pracy i wśród moich znajomych, powiedziałabym, że w Polsce dominują oferty dla programistów Javy (głównie serwerowej, czyli JEE) i, od niedawna, Pythona.

Na wszelki wypadek sprawdźmy też kilka poważnych źródeł.

A. Ranking RedMonk, oparty na popularności poszczególnych języków w repozytorium GitHub oraz na społecznościowej stronie z pomocą techniczną Stack Overflow (uwaga – prawdopodobnie zaniżona popularność języków używanych w firmach z zamkniętą bazą kodu).

Ranking RedMonk, oparty na danych z GitHub i Stack Overflow

1. JavaScript
2. Java
3. PHP
4. Python
5. C#
5. C++
5. Ruby
8. CSS
9. C
10. Objective-C
11. Perl
11. Shell
13. R
14. Scala
15. Haskell

B. Ranking zarobków programistów poszczególnych języków według Business Insider:

  1. Ruby on Rails
  2. Objective C
  3. Python
  4. JAVA
  5. C++
  6. JavaScript
  7. C
  8. R
  9. C#
  10. Visual Basic
  11. SQL
  12. PERL

C. Ranking na rok 2015 ze strony z konkursami programistycznymi CodeEval, oparty w dużej mierze na informacjach od pracodawców:

  1. Python
  2. Java
  3. C++
  4. C#
  5. Ruby
  6. JavaScript
  7. C
  8. PHP
  9. Go
  10. Perl

Bonus: Quiz!

Dla każdego z poniższych czterech fragmentów kodu spróbuj odpowiedzieć na następujące dwa pytania:

  • Jaki to język?
  • Co robi kod?

1. Na rozgrzewkę:

2. Dla spostrzegawczych:

 3. Na logikę:

4. Przypadek beznadziejny:

Poprawne odpowiedzi znajdziesz na dole strony.

PS.

Wróciłam ostatnio do grania na gitarze i doznałam nieoczekiwanego olśnienia informatycznego. C Sharp (zgodnie z zapisem C#) to po angielsku cis, czyli dźwięk o pół tonu wyższy od c 🙂

Polecane lektury

  1. Siedem języków w siedem tygodni. Praktyczny przewodnik nauki języków programowania (polskie wydanie Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages, polecam z całego serca!)
  2. Seven More Languages in Seven Weeks: Languages That Are Shaping the Future (kontynuacja poprzedniej pozycji, niestety na razie niedostępna w języku polskim)
  3. Programming Languages (kurs w portalu Coursera)
  4. Practical Foundations for Programming Languages (dla zaawansowanych)

Odpowiedzi do quizu

  1. Java, wypisze „dzień dobry”.
  2. C, wypisze liczbę Eulera (e), źródło: International Obfuscated C Code Contest.
  3. Prolog, rozwiązuje Sudoku, źródło: Programmable Life.
  4. Brainfuck, wypisze „Hello World”, źródło: Wikipedia.

Kup swojemu dziecku sobie robota Lego Mindstorms

To prawda, mojej sadze o językach programowania ciągle brakuje zakończenia. Jeszcze chwilka! W międzyczasie dzielę się ciągle aktualnym tekstem z poprzedniego bloga.

Pamiętasz swoje pierwsze spotkanie z klockami Lego?

Pierwsze spotkanie

Mnie od pierwszego wejrzenia zachwyciły czyste kolory, przemyślane projekty oraz możliwości, jakie dawała ta zabawka dziecku chętnemu do używania wyobraźni. Oszczędzałam kieszonkowe i na każde urodziny zamawiałam statki pirackie i zamki na morzu.

Natychmiastową niechęcią zapałałam natomiast do modeli Paradiso, reklamowanych jako „Lego dla dziewczynek”. Na szczęście projektanci z Lego wiele się nauczyli od tego czasu.

Niestety nie mam żyłki inwestora – wyrzucałam pudełka i instrukcje, przez co po latach jestem posiadaczką dwóch koszy mieszanki Lego o wszystkich smakach. Nie uda mi się odsprzedać historycznych zestawów z dziesięciokrotnym przebiciem.

Po latach namiętność (finansowana już w pełni z własnej kieszeni) wróciła ze zdwojoną siłą. Nasz stryszek obecnie wygląda tak:

stryszek
Stryszek

Dla zaawansowanych: Lego Technic

Jeśli masz smykałkę konstruktorską, być może masz doświadczenia z Lego Technic – serią bardziej skomplikowanych zestawów z ruchomymi częściami, a nawet silniczkami. Sama długo ich unikałam – wydawały mi się koszmarnie brzydkie! 🙂

2potwór
Zdalnie sterowany potwór Dawida

Tymczasem na szczycie…

Lego Technic nie jest jeszcze szczytem ewolucyjnej drabiny duńskiej firmy. Już 1998 roku, dzięki współpracy Lego z MIT, narodził się nowatorski pomysł stworzenia i wprowadzenia do (w miarę) masowej produkcji programowalnego robota Lego Mindstorms. Opracowany wtedy zestaw składał się z programowalnej kostki oraz zbioru sensorów i silniczków.

Na zdjęciach w dalszej części wpisu widać robota w wersji NXT 2.0 – takiego mam w domu. Od września 2013 dostępna jest nowsza wersja, EV3. Napiszę o niej, jak tylko ktoś mi takiego robota wypożyczy!

Robot Lego Mindstorms wygląda mniej więcej tak:

Udomowiony Mindstorms (przynosi drinki)

Jak zbudować robota?

W skład zestawu wchodzą następujące elementy:

  • Programowalna kostka: na zdjęciu to duży biały element z ekranem.
  • Cztery sensory:
    1. Czujnik ultradźwięków. To „oczy” robota na zdjęciu. Używa ultradźwięków do określenia odległości (w centymetrach lub calach) do przedmiotu znajdującego się przed nim.
    2. Czujnik dźwięku. Mikrofon określający (za pomocą decybeli lub procentów) natężenie dźwięku w otoczeniu. Na zdjęciu widać go po lewej stronie ekranu.
    3. Czujnik dotyku. Na zdjęciu nie widać go zbyt dobrze – to “ogonek” z tyłu robota. Jest wyposażony w pomarańczowy przycisk. Czujnik ma tylko dwa stany: wciśnięty i zwolniony.
    4. Czujnik światła bądź koloru. Na zdjęciu niewidoczny, ponieważ znajduje się na spodzie robota. W zależności od wersji  jest to albo czujnik światła (określa natężenie światła) lub kolorów. Czujnik światła pozwala odróżnić od siebie podstawowe kolory (np. czerwony od niebieskiego), ale może to wymagać kalibracji w zależności np. od pory dnia.
  • Trzy silniczki krokowe. Robot na zdjęciu ma dwa niezależnie działające koła, z których każde “zużywa” jeden silnik, oraz łapę, która otwiera się i zamyka dzięki pracy trzeciego silnika i kilku zębatek.
  • Pewien podzbiór tradycyjnych elementów Lego i Lego Technic – różny w zależności od wydania.

Co można zrobić z zestawem Mindstorms? Po pierwsze, można zbudować robota: według własnego projektu, projektu znalezionego w Internecie (np. tutaj), lub dowolnego projektu Lego Technic, w którym będzie upchnąć niezbyt poręczną kostkę.

A potem… Potem robota można zaprogramować.

Programowanie zabawki, czyli co dokładnie?

Istnieją trzy sposoby programowania robotów Mindstorms. Najprostsze, ale też dające najmniejsze możliwości, jest programowanie z użyciem samej kostki. W menu można znaleźć opcje takie jak „idź do przodu”, „poczekaj na wciśnięcie przycisku”, „powtórz”. Nawet małe dziecko zdoła w ten sposób wpłynąć na zachowanie robota. Warunkiem sukcesu jest podłączenie czujników i silniczków do odpowiednich portów, by „do przodu” powodowało ruch obu kół, a nie, na przykład, jednego z kół i chwytnej łapki.

4kostka
Programowalna kostka i jej menu

Kolejny poziom wtajemniczenia to programowanie z użyciem interfejsu graficznego. Jest intuicyjne i przyjemne. Oferuje przy tym większe możliwości, niż początkowo mogłoby się wydawać (przynajmniej ja byłam zaskoczona). Jeśli chcesz zaprogramować coś w tym środowisku, musisz przeciągnąć wybrane elementy z menu i upuścić je na planszę, a następnie połączyć je w odpowiedniej kolejności. Dostępne są ikonki reprezentujące odczyty sensorów i ruch silników, a także instrukcje sterujące, takie jak pętle czy warunki.

„Kod” widoczny na rysunku poniżej to prosty program robota jadącego po linii zamkniętej w okrąg. Łatwo zauważyć zewnętrzną pętlę i wewnętrzną instrukcję „jeśli – to”, sprawdzającą odczyt z czujnika koloru.

5bloki
Programowanie przy użyciu interfejsu graficznego (“bloków”)

Wreszcie, można programować robota „normalnie”, czyli pisząc kod. Programy napisane w niektórych językach (np. NXC: Not eXactly C) można uruchamiać w fabrycznie instalowanym środowisku kostki Mindstorms, inne natomiast (np. oparty o Javę leJOS NXJ) wymagają wymiany tzw. firmware.

Zabawa procentuje

Że Mindstorms to świetna zabawa – o tym nikogo chyba nie trzeba przekonywać? Nie sposób także przecenić walorów edukacyjnych tej zabawki (u dzieci i nie tylko). Wrócę na chwilę do tematu poruszonego już w pierwszym wpisie na tym blogu. To, co jeszcze 10 lat temu było uznawane za biegłość w obsłudze komputera, dzisiaj stanowi absolutną podstawę. Znajomość podstaw programowania ułatwia życie.

Na najbardziej elementarnym poziomie programowanie = logiczne myślenie. Programowanie zmusza twórcę kodu do planowania swoich działań i przewidywania ich wyników. Programowanie to konieczność poświęcenia czasu i cierpliwości na znalezienie poprawnego (lub wystarczająco dobrego!) rozwiązania praktycznego problemu.

Na pewno chciałabym, żeby moje dziecko wcześnie posiadło taki zestaw umiejętności.

Film!

Na zakończenie polecam filmik przedstawiający robota, który dzięki żyroskopowi (niestandardowy sensor, spoza zestawu) potrafi balansować kubkiem pełnym kawy… No prawie.

 

Wieża Babel. Skąd tyle języków programowania? (część 2 z 3)

Tekst jest oparty na mojej prezentacji z konferencji Kariera IT. Pierwsza część wpisu jest dostępna tutaj.

Świat staje się coraz mniejszy. Wszyscy uczymy się angielskiego, a lokalne dialekty odchodzą w zapomnienie. Dlaczego wciąż upieramy się, by z komputerem rozmawiać na tyle różnych sposobów? Ile języków powinien znać programista? Od którego zacząć?

To druga część wpisu na temat współczesnych języków programowania i różnic pomiędzy nimi (pierwsza jest dostępna tutaj). W tej części mówię o różnicy pomiędzy językami kompilowanymi i interpretowanymi i tłumaczę, czym są maszyny wirtualne. Na końcu pokazuję, że języki programowania – tak samo jak języki, za pomocą których ludzie komunikują się między sobą – żyją i zmieniają się z czasem.

Kompilować czy interpretować?

Kolejny podział języków programowania opiera się na sposobie przetwarzania napisanego w nich kodu. Języki bywają dzielone na:

  • kompilowane, czyli przed uruchomieniem tłumaczone na kod maszynowy właściwy danej architekturze, zapisywany w osobnym pliku, np. C++, Pascal,
  • interpretowane, czyli uruchamiane bezpośrednio w oparciu o kod źródłowy, często wyposażone w interaktywne konsole, np. Perl, Ruby,
  • interpretowane przez maszynę wirtualną, tj. kompilowane do kodu bajtowego, jak Java, C#.

Warto wiedzieć:

Ten sam język, w zależności od środowiska, może być kompilowany lub uruchamiany.

Potrzeba kompilacji jest nie tyle cechą języka, co środowiska, z którego korzystamy, choć w praktyce konkretne języki są z reguły konsekwentnie przetwarzane w ten sam sposób.

Oba podejścia mają swoje zalety. Kod skompilowany do postaci maszynowej będzie działał optymalnie w architekturze, dla której jest przeznaczony. Kompilator bywa sprzymierzeńcem programisty – potrafi wytknąć błędy (czasami dość złożone), zanim jeszcze uruchomisz program. Z kolei w środowisku interpretowanym (w którym de facto kolejne instrukcje są kompilowane „w locie”) możesz pozwolić sobie na więcej improwizacji i beztroskich prób bez konieczności tworzenia kompletnego, zamkniętego programu.

Skompilowana wersja tego samego programu będzie wyglądała inaczej w systemie o innej architekturze. Program interpretowany wygląda tak samo niezależnie od tego, gdzie chcemy go uruchomić (o ile celowo nie odwołujemy się elementów istniejących jedynie w konkretnym systemie operacyjnym) – to środowisko (interpreter) musi być w stanie porozumieć się z procesorem.

Jeśli popełnisz poważny błąd w linii numer 100, kompilator w ogóle nie utworzy wykonywalnej wersji programu. Środowisko interpretowane prawdopodobnie bez szemrania wykona linie 1-99 i elegancko wyłoży się na linii 100. Zdecyduj sam, która opcja jest lepsza?

Kompromis pomiędzy wspomnianymi dwoma podejściami stanowią maszyny wirtualne.

Maszyny wirtualne

Poniższy rysunek przedstawia schemat działania maszyny wirtualnej (ang. Virtual Machine, VM).

VM
Zasada działania maszyny wirtualnej (na przykładzie JVM)

W przypadku języków z maszyną wirtualną (jak Java, C#) kod jest co prawda kompilowany, ale nie do postaci kodu maszynowego, tylko tzw. kodu bajtowego (ang. bytecode), przeznaczonego dla VM. Dzięki temu skompilowany kod zawsze wygląda tak samo i może być wdrażany w różnych systemach. Maszyna wirtualna właściwa danej architekturze (czyli np. działająca w systemie Windows) jest w stanie w locie tłumaczyć kod bajtowy do postaci kodu maszynowego – instrukcji dla procesora.

Warto wspomnieć, że niektóre maszyny wirtualne (np. JVM, czyli Maszyna Wirtualna Javy) są obecnie tak dojrzałe i wydajne, że twórcy nowych języków (jak w tym wypadku Scala, Clojure) decydują się na kompilowanie tych języków do kodu bajtowego, by skorzystać z optymalizacji wprowadzanych przez daną maszynę wirtualną.

Wydajność języka a wydajność programisty

Być może zwróciłeś uwagę na to, że kilka razy w tym wpisie pojawiły się słowa „wydajny” lub „optymalny”. Języki programowania można porównywać i w ten sposób. Ruby (czytaj: kod napisany w Ruby, uruchomiony w odpowiednim środowisku) działa wolniej niż Java, Java jest wolniejsza od C.

Skoro tak, to dlaczego więc wszyscy nie piszemy w C? Nie wolno zapomnieć o tym, że wydajności języka i wydajność programisty to dwie różne rzeczy.

Program powinien działać szybko, to jasne. Programy są jednak pisane i poprawiane przez ludzi. Ogromne znaczenie mają więc także:

  1. czas potrzebny do stworzenia działającego programu,
  2. czas potrzebny do naprawienia błędu przez autora kodu,
  3. czas potrzebny do naprawienia błędu przez innego programistę.

Jeśli chodzi o szybkość tworzenia programu od zera (1) – w ekstremalnej sytuacji prototyp tworzy się w jednym języku, a – jeśli pomysł chwyci – później w tle przepisuje się kod na inny, wydajniejszy język.

W kwestii naprawiania błędów (2), ale też szybkości kodowania, rozważ proszę następujące dwa fragmenty kodu.

C++

Java

Oba przykłady robią to samo: tworzą tablicę przechowującą 10 elementów typu całkowitego. W przypadku C++ musisz ręcznie zwolnić przydzieloną pamięć. Można uznać to za zaletę – masz pełną kontrolę nad pamięcią. Jeśli wiesz, że obiekt nie będzie już potrzebny, możesz się go natychmiast pozbyć. W Javie pamięć zwolni Odśmiecacz (ang. Garbage Collector) po wykryciu, że do zmiennej nie ma już odwołań. Tyle tylko, że zrobi to, kiedy będzie mu wygodnie… Może wcale.

Z ogromną dozą pewności pozwolę sobie napisać to:

Każdemu programiście języka C++ zdarzyło się co najmniej raz zapomnieć operatora delete.

Przykłady kodu są zabawkowe. Gdyby jednak taki kod znajdował się w pętli, gdyby tablica zawierała obiekty zamiast wartości int – mielibyśmy poważny problem.

Co do poprawiania błędów przez innych developerów (3): znana maksyma głosi, że kod jest czytany dużo częściej niż pisany. Warto zadbać o jego przejrzystość i strukturę. To, czy kod jest czytelny czy nie, nie zależy jedynie od wyboru języka, ale także od stosowania konwencji (nazw, formatu kodu) i abstrakcji (jak wzorce projektowe).

Języki programowania ewoluują!

Wiesz już (niekoniecznie ode mnie), że to, czy język się kompiluje czy interpretuje nie jest rdzenną cechą samego języka, ale środowiska, w którym ma działać Twój kod.

Wiesz, co jeszcze może ulegać zmianom? Sama składnia!

Język naturalny, czyli język, którym ludzie porozumiewają się między sobą, ewoluuje. Pojawiają się nowe słowa, stare zyskują nowe znaczenia. Uparcie powtarzane błędy w końcu wchodzą do kanonu (czy zastanawiałeś się kiedyś, dlaczego w wielu językach najczęściej używane czasowniki odmieniają się nieregularnie?)

Nie inaczej jest w przypadku języków programowania. W nowych wydaniach pojawiają się konstrukcje pozwalające w bardziej zwięzły sposób wyrazić te same treści. Dopuszczane są elementy innych paradygmatów (np. popularne ostatnio wyrażenia lambda, związane z programowaniem funkcyjnym).

Dla ilustracji, dwa fragmenty kodu w języku Java:

Obie wersje tworzą mapę (tablicę asocjacyjną), w której kluczami są łańcuchy znaków, a wartościami – listy zawierające łańcuchy znaków. Czyli, na przykład, na podstawie nazwiska mogę pobrać listę numerów telefonu przypisanych do danej osoby.

Druga, nowsza wersja jest wyraźnie krótsza. Dlaczego? Otóż dlatego, że programiści Javy od lat dostawali białej gorączki przez ostrzeżenia kompilatora na temat nieznanego typu podczas tworzenia kolekcji, mimo że typ można było jednoznacznie wywnioskować na podstawie deklaracji zmiennej. Ich skargi wreszcie dotarły gdzie trzeba, i oto efekt.

Dlaczego podałam numery wersji od 5 w górę? Ponieważ w wersji 4 nie można jeszcze było stosować uogólnień (ang. generics) – w efekcie nie mogłabym w ten sposób określić typu danych przechowywanych w kolekcji.

W następnej części

  • Języki wyspecjalizowane – R
  • Nie tylko dla dzieci – programowanie graficzne
  • Który do czego?
  • Który da mi pracę?
  • Quiz!
  • Polecane lektury

PS. Link dla odważnych

CINT, interpreter kodu C i C++.

Wieża Babel. Skąd tyle języków programowania? (część 1 z 3)

Tekst jest oparty na mojej prezentacji z konferencji Kariera IT

Świat staje się coraz mniejszy. Wszyscy uczymy się angielskiego, a lokalne dialekty odchodzą w zapomnienie. Dlaczego wciąż upieramy się, by z komputerem rozmawiać na tyle różnych sposobów? Ile języków powinien znać programista? Od którego zacząć?

Postaram się krótko opowiedzieć o współczesnych językach programowania i różnicach pomiędzy nimi. Dla porządku zacznę od (króciutkiego!) rysu historycznego. Dalej będzie z górki! 🙂

Pierwszy programista (nie róbmy z tego tajemnicy: chodził w spódnicy)

Jako pierwszego na świecie programistę często wymienia się Adę Lovelace. Ada była córką poety, Lorda Byrona. W latach 1842-1843 (!) przetłumaczyła z francuskiego rozprawę poświęconą „maszynie analitycznej” Charlesa Babbage’a. Tłumaczenie opatrzyła notatkami, w których znalazł się pierwszy na świecie opis algorytmu przeznaczonego do wykonania przez maszynę (algorytm wyznaczał kolejne liczby Bernoulliego). Działający egzemplarz takiej maszyny udało się zbudować dopiero w 1991 roku. Dokonało tego Muzeum Nauki w Londynie, przy użyciu materiałów dostępnych w czasach Babbage’a.

Ada Lovelace: portret

Wyrazami uznania dla pracy Ady Lovelace są między innymi język programowania Ada stworzony na początku lat osiemdziesiątych oraz nagroda Ada Award przyznawana „wybitnym dziewczętom i kobietom w sektorach cyfrowych”.

Odrobina kontekstu: kamienie milowe historii programowania

To nie jest wpis o historii programowania, dlatego wypunktuję tylko kilka przełomowych wydarzeń:

  • 1936: Alan Turing opisuje Maszynę Turinga, hipotetyczny „komputer” złożony z głowicy oraz nieskończonej taśmy, który może wykonywać algorytmy i stanowi teoretyczny model obliczeń.
  • 1943-1945: Powstaje ENIAC, powszechnie uważany za pierwszy komputer.
  • 1940-1960: Dominują języki niskopoziomowe. Na ich tle wWyróżnia się FORTRAN, język wyższego poziomu z własnym kompilatorem.
  • 1960-1970: Powstają stosowane do dzisiaj języki i paradygmaty: język C, Smalltalk (obiektowy), Prolog.
  • 1990-…: Internet staje się ogólnodostępny. Dominuje paradygmat obiektowy. Pojawia się sporo języków funkcyjnych i skryptowych.
  • 2010-…: Zwrot w stronę programowania funkcyjnego, metaprogramowanie i mechanizm refleksji, nacisk na wielowątkowość.

Z głową w chmurach: języki niskiego i wysokiego poziomu

Jeśli – chcąc nauczyć się nowego języka programowania – zaczniesz szukać informacji na jego temat w Internecie, prawie na pewno natkniesz się na informację o tym, że „X to język programowania wysokiego poziomu, który …”. Jeden za drugim, którego byś nie sprawdził, wszystkie są wysokopoziomowe. Co to znaczy?

Spójrz na fragmenty kodu w poniższej tabelce.

Kod maszynowy Asembler C

 

 

Każdy z przedstawionych fragmentów kodu (wzięłam je z Wikipedii; wystarczył mi jeden semestr z Asemblerem żeby wiedzieć, że nigdy więcej nie chcę go dotykać) robi to samo: wyznacza n-ty wyraz ciągu Fibonacciego.

Po lewej mamy kod maszynowy – kolejne liczby (zapisane szesnastkowo) to rozkazy procesora i ich argumenty. Kod taki jest nieprzenośny, tj. zależny od architektury. Przykładowy kod jest przeznaczony dla 32-bitowej maszyny x86. Programowanie w tym języku wymaga zapamiętania numerów poszczególnych instrukcji, lub korzystania z rozbudowanej ściągi (słownika). Jest to kod absolutnie niskopoziomowy.

Środkowa kolumna to Asembler (ang. Assembly language). To również język niskopoziomowy. Wygląda inaczej niż kod maszynowy, jednak w rzeczywistości stanowi odwzorowanie „jeden do jeden” instrukcji procesora, tyle że w sposób łatwiejszy do zrozumienia i zapamiętania przez człowieka. W przykładowym kodzie widać odwołania do rejestrów procesora x86 oraz do stosu.

Po prawej stronie język C. Kod różni się od przykładów po lewej stronie brakiem odwołań do architektury maszyny, na której działa. Wartości będą w końcu pobierane ze stosu, ale nigdzie nie oznaczamy, w jaki sposób ma się to odbyć. Funkcja ma zwrócić wartość, ale nigdzie w kodzie nie określamy mechanizmu jej przekazania. Wprowadzamy własne abstrakcje – zmienne lokalne wewnątrz instrukcji warunkowych oraz pętli – i nie przejmujemy się sposobem ich obsługi na docelowej maszynie.

Na podstawie powyższego możesz logicznie wywnioskować, że C jest językiem wysokiego poziomu. Jednak gdy podzielisz się tą opinią z zaprzyjaźnionymi programistami, większość z nich z niedowierzaniem pokręci głową. Dzisiaj C jest uznawany za, w najlepszym razie, język „średniego poziomu”. Wprowadza sporo użytecznych abstrakcji, ale jednocześnie (czego w naszym przykładzie akurat nie widać) pozwala na bezpośrednie odwołania do pamięci – nie do pomyślenia w większości języków wysokopoziomowych.

Możesz jeszcze natknąć się na określenie super high level language, czyli język bardzo wysokiego poziomu. Tym terminem określa się najczęściej języki dziedzinowe, zwiększające produktywność programisty poruszającego się na co dzień po specyficznym, zamkniętym obszarze. Z reguły są tą jednak tylko (?) nakładki na istniejące języki programowania wysokiego poziomu.

Rozkazuję ci… Języki imperatywne i deklaratywne

Kolejny ważny podział wśród języków programowania to rozróżnienie na paradygmat imperatywny i deklaratywny.

  • Program imperatywny zawiera ciąg instrukcji, zmieniających stan programu. Wydajemy komputerowi „rozkazy”: zwiększ wartość x o 5, zwróć wynik. Przykłady języków imperatywnych to Perl, Python, Java oraz wszystkie języki przedstawione w tabelce w poprzednim podrozdziale.
  • Program deklaratywny nie mówi komputerowi, jakie kroki ten ma wykonać. Zamiast tego, programista opisuje warunki, jakie musi spełniać rozwiązanie. Ważne i pożądane cechy języka deklaratywnego to bezstanowość i determinizm. Te same dane wejściowe zawsze prowadzą do uzyskania tego samego wyniku, nie wpływa na nie żaden wewnętrzny „stan”. Przykłady języków deklaratywnych to Haskell, Erlang i Prolog.

Świat imperatywny: klasy i prototypy

Jeśli chodzi o programowanie imperatywne, od dawna już (co najmniej od początku obecnego wieku) dominuje programowanie obiektowe, które wyparło mniej ustrukturyzowane programowanie proceduralne. W ścisłym ujęciu program obiektowy to program, którego wykonanie sprowadza się do przesyłania komunikatów pomiędzy obiektami. Nie wszyscy jednak wiedzą, że programować obiektowo można w dwóch „smakach”: przy użyciu klas lub paradygmatów.

Sytuację dobrze ilustruje ten oto obrazek (mojego autorstwa, wreszcie mogę się popisać!), inspirowany slajdem z prezentacji na temat zaskakujących elementów języka JavaScript:

Prototypy kontra klasy, ujęcie biologiczne i gratka dla fanów mojej kreski (są tacy!).
Prototypy kontra klasy, ujęcie biologiczne, Gratka dla fanów mojej kreski (są tacy!)

W podejściu klasycznym (nazwa jest tym bardziej odpowiednia, że to podejście dominuje – np. Java, C++) opisujemy świat za pomocą klas. W praktyce klasą może być „Okno Przeglądarki” albo „Ramka”, jednak w zastosowaniu edukacyjnym lepszym przykładem będzie nieśmiertelna klasa „Zwierzę”. Klasa Zwierzę ma pewne atrybuty: liczbę nóg lub umiejętność wydawania pewnego dźwięku. Klasa ta może mieć podklasę, na przykład Słoń. Słoń ma wszystkie atrybuty klasy Zwierzę, ale może definiować własne – na przykład trąba i jej długość 😉

W oparciu o klasy tworzymy obiekty, czyli konkretne instancje (egzemplarze) poszczególnych klas. I tak DumboMamaDumbo to dwa różne obiekty tej samej klasy Słoń. Klasy możemy podzielić na konkretne (które mogą mieć instancje) i abstrakcyjne (bardziej ogólne, pełniące tylko rolę szablonów).

Alternatywą jest podejście prototypowe, dostępne na przykład we wspomnianym już tutaj języku JavaScript. Jeśli programujemy z prototypami, całkowicie wyzbywamy się klas. Wszystko jest obiektem. Zwierzę to obiekt. Słoń to obiekt, dla którego obiekt Zwierzę jest prototypem. Dumbo to kolejny obiekt, wzorowany na Słoniu. Koneserzy tej wersji przekonują, że dopiero przy takim podejściu, gdzie wszystko jest obiektem, możemy mówić o programach prawdziwie obiektowych.

Jaka jest praktyczna różnica? Prototypy, jako obiekty, można modyfikować w czasie wykonania. Klasy są usztywnione – jeśli powiemy, że słoń ma cztery nogi, nie będziemy gotowi do obsłużenia egzemplarza z pięcioma. Ma to jednak swoją cenę. Większość języków prototypowych jest typowana dynamicznie. Oznacza to, że typ obiektu jest określany dopiero w czasie wykonania. Dla takich języków o wiele trudniej jest tworzyć dobre IDE (zintegrowane środowisko programistyczne). W przypadku statycznie definiowanych klas, edytor może nam sporo pomóc: np. podpowiedzieć, jakie funkcje da się wywołać na danym obiekcie.

Ograniczenia wprowadzane przez stosowanie klas stają się jednak coraz mniej uciążliwe z powodu rozbudowanych mechanizmów refleksji (zmiany istniejącego kodu w czasie wykonania) w nowoczesnych językach programowania.

Świat deklaratywny: języki funkcyjne i programowanie w logice

Języki funkcyjne przeżywają obecnie prawdziwy boom popularności. Główną przyczyną tego stanu (sic!) rzeczy jest ich bezstanowość i brak skutków ubocznych – cechy te ułatwiają programowanie współbieżne. Jest to istotne, ponieważ w roku 2014 dobiegamy do kresu prawa Moore’a, wieszczące (w uproszczeniu) wykładniczy wzrost szybkości układów scalonych. Zamiast coraz szybszych procesorów mamy teraz procesory z większą liczbą rdzeni i coś z tym fantem trzeba zrobić.

Program napisany w języku funkcyjnym sprowadza się do wartościowania (ewaluacji) funkcji matematycznych. Unikamy przy tym przechowywania i modyfikowania stanu. Do dyspozycji mamy języki czysto funkcyjne, jak Haskell (z dość dużym progiem wejścia, uwielbiane przez snobistycznych doświadczonych developerów), oraz nieco bardziej przystępne (acz kojarzące się z potworem Frankensteina) języki mieszane, jak Scala, które pozwalają na łamanie części zasad, przy jednoczesnej praktycznej dostępności pewnych silnych stron tego paradygmatu (jak wygodne wykonywanie funkcji na wszystkich elementach kolekcji).

Programowanie funkcyjne to duży temat, któremu zamierzam w przyszłości poświęcić osobny wpis.

Inny rodzaj programowania deklaratywnego to programowanie w logice, szczególnie przydatne przy problemach zahaczających o zagadnienia sztucznej inteligencji (rozumienie języka naturalnego, rozwiązywanie łamigłówek). W tym podejściu, zamiast szukać algorytmów,, musimy zdefiniować zależności i ograniczenia (ang. constraints) obowiązujące w danej dziedzinie. Interpreter języka logicznego, takiego jak Prolog, podejmie następnie próbę rozwiązania problemu „za nas” w oparciu np. o rachunek predykatów pierwszego rzędu.

Pierwsze doświadczenia z programowaniem w logice bywają bolesne. O ile w większości języków możemy napisać coś w stylu

X = 1; X = X + 1;

i spodziewać się odpowiedzi 2, o tyle Prolog w podobnych okolicznościach może zaskoczyć nas krótką i konstruktywną odpowiedzią NIE (X nigdy nie będzie równe X+1). Po co w ogóle pchać się w te cudaczne rejony?

Ano chociażby dlatego, że w Prolog pozwala na rozwiązanie bardzo skomplikowanych problemów (kostka Rubika, Sudoku) w zaskakująco niewielkiej liczbie linii kodu.

Poniżej kompletny kod rozwiązujący Sudoku o rozmiarach 9×9, napisany w Prologu. Program pochodzi z bloga Programmable Life, tam też znajdziesz kompletne objaśnienie.

W następnych częściach

PS. Zdjęcie w nagłówku

Zdjęcie przedstawia kartę perforowaną z zapisem kodu w języku Fortran. Kart perforowanych po raz pierwszy użyto w roku 1725 do sterowania pracą krosna.

W 1889 roku Herman Hollerith opatentował nowoczesną postać karty (oraz taśmy) dziurkowanej do zapisu danych. Zainspirował go system stosowany przez konduktorów amerykańskich kolei, którzy za pomocą dziurek kodowali na biletach wygląd pasażera („wysoki, niebieskie oczy”), który się danym biletem posługuje (żeby pasażerowie nie wymieniali się biletami).

Karty perforowane były szeroko stosowane do zapisu danych i programów aż do lat osiemdziesiątych XX wieku. Ich ostateczny upadek miał miejsce w roku 2000, gdy przez resztki papieru pozostałe w otworach kart nie wszystkie głosy zostały policzone poprawnie i w efekcie trzeba je było zliczyć ręcznie.

Co łączy Matta T. z Polą D.

Mam w przygotowaniu dwa większe, informatyczne teksty. Pierwszy to „Wieża Babel. Skąd tyle języków programowania?”, oparty na mojej prezentacji z targów Kariera IT. Drugi, „Ciągła integracja: anioł stróż dobrego programisty” jest związany z wykładem, który mam wygłosić w przyszłym tygodniu na UAM. W międzyczasie, zgodnie z zasadą, że dzień bez narzekania jest dniem straconym, dzielę się krótką, prywatną refleksją okołofeministyczną.

Jestem feministką. Złoszczą mnie kobiety, które na samym starcie odżegnują się od tego ruchu, mimo że na co dzień korzystają z praw, które wywalczyły dla nich feministki, sufrażystki, emancypantki. Nie raz słyszałam że przesadzam, że dopatruję się seksizmu tam, gdzie go nie ma. Nawet, że histeryzuję.

Tym bardziej zaskakuje fakt, że natknęłam się ostatnio na aż dwie sytuacje, w których „feminizm” został bezprawnie przywołany jako broń w niesłusznej sprawie.

O co mi chodzi?

Po pierwsze (i mniej ważne): Pola D. w Wyborczej

Zdarza mi się czytać Wyborczą. Bardzo lubię dodatki – Wysokie Obcasy i Duży Format. Wiem, że wydawnictwo bywa stronnicze, ale przekonuje mnie stopień dopracowania artykułów oraz jakość polszczyzny, lepsza niż w większości polskich gazet.

Stosunkowo niedawno wrocławskie wydanie Wyborczej rozpoczęło publikację felietonów malarki Poli Dwurnik, której wiele osób (bez sensu) wypomina bycie córką bardziej znanego polskiego malarza. Felietony są dostępne w Internecie, można przeczytać je tutaj: Śniadanie na Oranienstrasse, czyli czemu Pola wybiera Berlin i tutaj: Noc w Monarch – [POLA DWURNIK Z BERLINA].

Samo założenie tych tekstów jest dość dziwne. Polę zapowiedziano jako Polkę na emigracji, ekspatka. Dla osoby mieszkającej w Poznaniu to nieporozumienie – do Berlina jedzie się stąd nie dłużej niż do Warszawy. W swoich tekstach pisze o tym, dlaczego wybrała Berlin. Pierwszy jest o śniadaniu (które w Poznaniu też można zjeść przez cały dzień, na przykład w Dąbrowskiego 42), drugi o imprezie (na imprezie DJ puszcza Izabelę Trojanowską… w Berlinie).

Nie brzmi groźnie, prawda? Ale groźnie jest.

Felietony są zwyczajnie niedobre. Egzaltowane i banalne. Trudno zrozumieć, jak redaktor z Wyborczej mógł przepuścić je do druku.

Na reakcję czytelników nie trzeba było czekać długo. Najpierw pojawił się tekst Wojciecha Engelkinga Tak żyją artyści, albo beka z Poli Dwurnik. Uderza mocno i bez skrupułów, ale trafnie (zresztą, największą siłę rażenia mają same cytaty ze źródła). Nie dziwię mu się, bo po lekturze mnie również ogarnął lęk o kondycję polskiej prasy. W komentarzach kilka osób się z nim zgodziło, mniej opowiedziało się po stronie artystki (która malować wszakże potrafi!). Ktoś zasugerował, że to prowokacja, literacka wariacja na temat Jersey Shore, do której ludzie mają wracać, by się pośmiać, przy okazji nabijając kieszeń producentom.

Sprawa być może rozeszłaby się po kościach, gdyby nie to, że… Wyborcza wydała oświadczenie, sięgając od razu po największą armatę, czyli feminizm na pohybel seksizmowi. Beka z Poli Dwurnik? Raczej zbiorowa przemoc, głosi tytuł artykułu, w którym autorzy sugerują, że Pola spotkała się z falą „hejtu” za to, że opisała swoje rozwiązłe życie erotyczne. Gdzieś, chociaż albo nie w tym artykule, albo w jego starszej wersji, pojawiło się porównanie do Bukowskiego (sic!), który podobno też opisywał bezeceństwa, ale „zyskał uznanie, bo był facetem”.

Co myślą o Bukowskim i kolegach bohaterowie jednego z moich ulubionych seriali :)
Co myślą o Bukowskim i kolegach bohaterowie jednego z moich ulubionych seriali 🙂

Po drugie (i przełomowe): Matt T. kontra Internet

12 listopada miało miejsce historyczne wydarzenie: po raz pierwszy udało się posadzić sondę kosmiczną na komecie. Co więcej, dokonali tego nie Amerykanie, tylko Europejska Agencja Kosmiczna! Jednym z ojców sukcesu jest doktor Matt Taylor. Niestety, jego moment triumfu został kompletnie przyćmiony przez… koszulę. W telewizji pokazał się, wyglądając tak:

web-dr-taylor
Dr Taylor

Na naukowca posypały się gromy, a jego koszula przez grono pyskatych użytkowników Twittera została okrzyknięta obraźliwą i seksistowską. Jakim cudem w takiej chwili można patrzeć na koszulę – nie wiem. Może po obejrzeniu „Armageddonu” części widzów wydawało się, że lądowanie na komecie już było?

Co właściwie widać na koszuli? Trochę wyprężone, ale bynajmniej nie rozebrane komiksowe bohaterki. W ogromnej liczbie i jaskrawych barwach, które sprawiają, że trzeba mocno wytężyć wzrok, by zobaczyć tam cokolwiek poza samą pstrokatością. Na dodatek, koszulę ręcznie namalowała i podarowała Mattowi… koleżanka.

Internetowe oburzenie było tak gwałtowne, że Matt przeprosił, po czym zniknął z sieci (Twitter nieaktywny od 12 listopada). Przeprosił w chwili życiowego triumfu, zupełnie złamany. Nie linkuję do wideo, bo każde wyświetlenie łamie mi serce. Wszystko to działo się mniej więcej w tym samym czasie, gdy Kim K. w ramach emancypacji pokazała na okładce gołą pupę. Pozwolę sobie pominąć również ten odnośnik.

==========

Piszę o tym, bo w moim odczuciu ani jedna, ani druga sprawa nie ma nic wspólnego z feminizmem (bądź seksizmem). Martwi mnie nadużywanie tego słowa. Widzę tu manipulację, zawiść i zwykłe wciskanie kitu. Niniejszym protestuję 🙂

A Mattowi ciągle jeszcze możecie postawić obiad.

PS. Link do pełnej historii afery koszulowej, po angielsku, podpatrzony na FB mojego kolegi Adama.
PS2. Pełna grafika z nagłówka

Czy każdy musi (na)uczyć się programowania?

Tekst jest oparty na mojej prezentacji z konferencji Polyconf

Zastanawiałam się ostatnio nad tym, kim jest dzisiaj programista. Czy umiejętność programowania przydaje się na co dzień, w normalnym życiu? Czy wszyscy powinni ją w jakimś stopniu opanować?

Mam trochę doświadczenia w uczeniu informatyki. Prowadziłam zajęcia z dziećmi, ze studentami i z seniorami. Ci ostatni co prawda nie zostali programistami, ale część z nich nauczyła się wysyłania grających maili ze slajdami w załącznikach (jeśli dostajecie coś takiego od Waszej babci – z całego serca przepraszam).

W pracy miałam okazję zetknąć się z bardzo dobrymi programistami, którzy skończyli zupełnie nietechniczne studia.

A jednak kroplą, która przepełniła czarę i skłoniła mnie do przygotowania tekstu, było coś zupełnie innego…

Popsuty komputer

Parę tygodni temu popsuł się mój komputer. Pracowałam w domu, nad głową miałam termin. Wyszłam do kuchni po kawę, a po powrocie zastałam w pokoju martwą ciszę – brakowało bzyczenia wentylatora. Komputer nie reagował na nerwowe wciskanie wszystkich po kolei guzików. Sprawdziłam korki, listwę zasilającą i psa (ruszał się, czyli nie przegryzł żadnego kabla), po czym skierowałam podejrzenia na zasilacz. Rozważałam wycieczkę do sklepu po nowy, ale co, jeśli przyczyna jednak tkwi gdzie indziej? Skonsultowałam się z mężem – również programistą („na 90% to zasilacz”). Nie podjęłam ryzyka zmarnowania kilku godzin i zadzwoniłam po profesjonalną pomoc.

Pomoc przybyła po godzinie, w osobie, jak się okazało, studenta Uniwersytetu Przyrodniczego (nie dajcie się zwieść – do niedawna była to Akademia Rolnicza!). Kiedy zawstydzona wyznałam swoją profesję, chłopak podniósł spojrzenie znad sterty śrubek i powiedział: „to mnie nie dziwi, co chwilę naprawiam komputery programistów”.

I to natchnęło mnie do rozważań.

A winowajcą faktycznie był zasilacz.

„Za dziesięć lat programiści nie będą już potrzebni”

Na początek przypomniałam sobie przepowiednie wykładowców z czasów, kiedy byłam studentką. Wtedy nie zdawałam sobie z tego sprawy, ale zaczęłam studia chwilę po tym, jak pękła słynna „bańka internetowa” (dot-com bubble). Nastroje nie były tak dobre, jak teraz, firmy nie wpraszały się na uczelnię, by rekrutować świeży narybek, a część profesorów głosiła nasz rychły koniec. Twierdzili, że narzędzia do wytwarzania programów stają się tak proste w obsłudze i tak dużo robią za nas, że za parę lat programować będzie mógł każdy. Miało to położyć kres zawodowi programisty.

Jakie narzędzia mieli na myśli? Nic innego niż narzędzia typu RAD (Rapid Application Development, czyli „szybkie tworzenie aplikacji”), w których pracę zaczyna się od rozmieszczenia przycisków na formatce. W dalszej kolejności programujemy ich obsługę.

Borland C++ Builder, przykład środowiska typu RAD

Kilkanaście lat później ciągle wiążemy koniec z końcem. Sytuacja na rynku pracy dawno nie była tak korzystna dla programistów. Do tego stopnia, że firmy są gotowe zatrudniać nawet osoby bez studiów, gotowe się przekwalifikować. Pracy jest dużo: w korporacjach, rodzinnych biznesach, start-upach, R&D. Nie brakuje możliwości pracy zdalnej.

Wiedza techniczna nigdy nie była tak łatwo dostępna

Większy popyt na rynku pracy zbiegł się w czasie z udostępnieniem szerszej publiczności zasobów wiedzy, o jakich jeszcze parę lat temu można było jedynie pomarzyć.

Po pierwsze, pojawiły się (i szybko zyskały ogromną popularność) kursy typu MOOC (massive open online courses, czyli masowe otwarte kursy online) . Najpopularniejsze to CourseraedX. Dają możliwość uczestniczenia w zajęciach prowadzonych przez najlepsze światowe uniwersytety i najsłynniejszych profesorów (często autorów znanych podręczników). Kursy najczęściej składają się z zestawu wykładów oraz pytań do nich. W kursach informatycznych często dochodzą jeszcze zadania programistyczne, sprawdzane automatycznie lub na zasadzie peer-review (każdy uczestnik musi ocenić zadania domowe kilku innych osób, żeby otrzymać komplet punktów za dany tydzień).

Po drugie, istnieje kilka ciekawych produktów kierowanych przede wszystkim do dzieci. Jednym z nich są roboty Lego Mindstorms. Napisałam artykuł na ich temat na poprzednim blogu, zamierzam zaktualizować go i wrzucić także tutaj. Mindstorms to zestaw klocków Lego zawierający prosty komputer („kostkę”), kilka silniczków, czujniki (odległości, dźwięku, dotyku, koloru) oraz typowe klocki z serii Lego Technic. Robota można programować na kilka sposobów – za pomocą prostych obrazków wyświetlanych na samej kostce („do przodu”, „wydaj dźwięk”, „powtórz”), w rozbudowanym środowisku graficznym na komputerze (czynności i odczyty robota układamy na dużej planszy, możemy dodawać warunki logiczne oraz pętle) lub w tradycyjnym języku programowania (natywny język zbliżony do C lub, po wymianie oprogramowania, Java). Inny przykład z tej kategorii to KANO – projekt sfinansowany ze środków zgromadzonych przez platformę Kickstarter. Pierwsza partia komputerków opartych na Raspberry Pi oraz Linuksie Ubuntu została już dostarczona do inwestorów. Dzieci najpierw budują komputer z dostarczonych (dużych) elementów. a następnie krok po kroku, przez zabawę, uczą się modyfikować i tworzyć programy.

Warto wspomnieć także o inicjatywach społecznościowych. W większych miastach działają liczne grupy takie jak PyLadies, zachęcające do nauki programowania i prowadzące warsztaty. Często, ale nie zawsze, kierują swoją ofertę do osób reprezentujących mniejszości w świecie IT.

Naprawdę mam się tego uczyć?

Czy każdy powinien nauczyć się programować? Opinie na ten temat są podzielone. Zdaniem twórcy Linuksa, Linusa Torvaldsa:

Nie uważam, że każdy koniecznie powinien podjąć naukę programowania. To dość wyspecjalizowana umiejętność, której nie oczekuje się od większości osób. To nie to samo, co umiejętność czytania i pisania czy wykonywanie prostych rachunków.

Dla kontrastu, oto opinia Marka Guzdiala, profesora na Georgia Tech:

Jesli ktoś planuje karierę pracownika umysłowego, lub zamierza podjąć pracę wymagającą stopnia licenjata, to powinien być w stanie czytać przydatne mu fragmenty kodu i wprowadzać w nich zmiany.

Zdecydowanie bliżej mi do drugiej opinii. Uważam, że każdy powinien nauczyć się programowania – ale w różnym stopniu! Programowanie wymaga określonego zestawu umiejętności, które przy okazji wzmacnia:

  • myślenie logiczne,
  • algorytmika i strukturyzacja,
  • planowanie.

Jest to zestaw bardzo przydatny w „normalnym” życiu. Przygotowując ten tekst przepytywałam znajomych, którzy zajęli się programowaniem na późniejszym etapie życia. Jeden z nich powiedział mi, że frustruje go obserwacja znajomych ze studiów, którzy do ważnych życiowych problemów i decyzji podchodzą w sposób chaotyczny (tzw. algorytm gołębia – jeden krok do przodu, dwa w bok, trzy do tyłu). Jako przykład podał szukanie pracy. Można potraktować to jako problem algorytmiczny: zebranie danych, przygotowanie CV, rozesłanie CV, przygotowanie do rozmowy, wybór najlepszej oferty… A można na oślep wysyłać coraz to inne CV, gdy akurat między prysznicem a zakupami przypomni nam się, że nie mamy pracy.

Dodatkowym plusem nauki programowania jest to, że osoby, które rozumieją, jak działa program komputerowy, automatycznie stają się mniej podatne na różne brzydkie internetowe sztuczki. Być może staranniej zastanowią się, zanim klikną w link w mailu i wprowadzą dane logowania na stronie tylko pozornie należącej do zaufanego banku.

Jestem głęboko przekonana, że pierwsze lekcje programowania należy przeprowadzać jeszcze w szkole podstawowej.

Nauka programowania to nauka myślenia. Oczywiście, w pierwszej fazie powinna odbywać się przez zabawę, jak modyfikowanie kolorów w prostej, zabawnej grze komputerowej. Wczesne wprowadzenie takich zajęć pozwoli dodatkowo na wczesnym etapie wykryć utalentowane osoby, które w innym wypadku mogłyby nigdy nie mieć okazji przekonania się o swoich predyspozycjach do tej dziedziny. Myślę tu głównie o dziewczynkach, często zniechęcanych komentarzami nauczycieli i rodziców do zainteresowania przedmiotami ścisłymi. Być może podczas pierwszych lekcji programowania warto byłoby powstrzymać się od ocen, lub oceniać głównie zaangażowanie (nie próbuje – próbuje – wybitny).

Przy okazji, ostatnio ktoś podesłał mi bardzo ciekawe wystąpienie Stephena Wolframa, który przekonuje, że na wczesnym etapie należy połączyć nauczanie matematyki i informatyki – na czym zyskają obie dziedziny.

Kiedy jest za późno?

Czy na naukę programowania może być za późno? Posłużę się kolejnym cytatem. Jens Skou jest laureatem Nagrody Nobla z chemii. Urodził się w roku 1918, a w roku 1997 powiedział:

W roku 1988 przeszedłem na emeryturę (…) i zacząłem badać za pomocą komputera modele kinetyczne pompy sodowo-potasowej. W tym celu musiałem nauczyć się programować. To ciekawe i wprost niewiarygodne, co można uzyskać przy pomocy komputera, jeśli chodzi o przetwarzanie nawet bardzo złożonych modeli. 

Łatwo policzyć, że w chwili rozpoczęcia nauki programowania profesor miał 70 lat!

Moim zdaniem, nigdy nie jest za późno na naukę programowania. Jeśli jednak myślisz o przekwalifikowaniu się na zawodowego programistę, najpierw odpowiedz sobie na kilka pytań:

  • Czy próbowałeś już programować? Czy sprawiło Ci to przyjemność?
  • Czy jesteś gotów dokształcać się w swoim wolnym czasie?
  • W pracy możesz spotkać osoby znacznie od Ciebie młodsze. Czy jesteś gotów:
    • Pracować z nimi w zespole?
    • Uczyć się od nich?
    • Przyjmować od nich polecenia?
  • Czym się ostatnio zajmowałeś? Jak wygimnastykowany jest Twój mózg? Jak u Ciebie z koncentracją?
  • Czy jesteś w stanie przeżyć parę lat z wynagrodzeniem młodszego programisty?
  • (nieobowiązkowe) Czy znalazłeś sobie mentora?

Od polonisty do programisty – jak i czego uczyć?

Istnieją dziesiątki języków programowania. Niektóre są bardzo ogólne, inne wykorzystuje się tylko w ściśle określonych sytuacjach. Jedne da się zastąpić innymi, inne są obowiązkowe, jeśli chcemy rozwiązać problem z danej dziedziny. Od którego zacząć?

Postuluję, żeby pierwszy język programowania spełniał następujące warunki:

  1. Oferował natychmiastową informację zwrotną. A więc powinien to być język interpretowany, a nie kompilowany. Najlepiej wyposażony w interaktywną konsolę, w której można przetestować proste operacje (np. mnożenie liczb) zanim jeszcze uczeń zda sobie sprawę z tego, że to, co robi, to już programowanie.
  2. Był obiektowy. Programowanie proceduralne jest dobre na sam początek, ale nie wymusza przemyślanej struktury i dobrych praktyk. Programowanie funkcyjne przeżywa dzisiaj renesans, ale może tylko odstraszyć większość początkujących. Kilka osób próbowało mnie przekonać, że wybieram programowanie obiektowe jedynie dlatego, że sama byłam tak uczona (co zresztą nie jest nawet zgodne z prawdą). Jedna z tych osób powiedziała mi „Ja też sądziłem, że programowanie funkcyjne to jakiś koszmar, ale po sześciu miesiącach nauki wiem bez wątpienia, że to najlepszy wybór”. Hm, początkujący programista raczej nie da nam takiego kredytu zaufania. Widziałam również kurs programowania dla początkujących oparty o programowanie sterowane zdarzeniami (zgodnie ze słuszną poniekąd ideą, że dobrze jest szybko pokazywać wyniki nauki, kurs opierał się na programowaniu gier). Zapewniam, że uczestnicy kursu nie mieli bladego pojęcia, kto, skąd i dlaczego do nich strzelają. Programowanie obiektowe ma tę ogromną zaletę, że łatwo przełożyć je na język otaczającego nas świata. Zwierzę to klasa. Pies to podklasa zwierzęcia. Pralka w Twoim domu to obiekt, który ma atrybuty i funkcje. To naprawdę działa.
  3. Pozwalał na programowanie bardzo różnych rzeczy. Kiedy uczysz kogoś programowania, nie masz pewności, czy nie poprzestanie na pierwszym języku, jaki pozna. Dlatego warto pokazać mu język, który daje duże możliwości. Dobrze, żeby pozwalał na tworzenie następujących typów aplikacji:
    • praca w konsoli i operacje na plikach,
    • proste okienka,
    • aplikacje internetowe.

Przykładem języka, który spełnia wymienione tu kryteria, jest Python. Uważam, że to cudowny pierwszy język.

Bonus: czego się spodziewać w pracy z neoprogramistami? Przecież oni imprezowali, kiedy ja liczyłam całki!

Na swojej drodze zawodowej spotkałam kilka osób, które zostały programistami, mimo że skończyły studia humanistyczne. W tej części chciałabym podzielić się z Wami obserwacjami na temat mocnych i słabszych stron takich inżynierów.

Plusy

  • Ogromny entuzjazm! Sama po pracy w miarę możliwości staram się trzymać z daleka od informatyki. Dla osób z tej grupy informatyka to cudowne nowe hobby, które chcą uprawiać i którym chcą się dzielić.
  • Znajomość najnowszych frameworków. Zapytana, deklaruję, że znam C++. Prawda jest jednak taka, że ostatni raz napisałam coś większego w tym języku jeszcze na studiach. Tymczasem jeśli ktoś przychodzi „na świeżo” i nauczył się języka z pasji, to z dużym prawdopodobieństwem będzie miał aktualną wiedzę na temat tego, co dzieje się w języku, jakie panują mody i w którym kierunku dany język zmierza.
  • Wiedza dziedzinowa. Większość programistów nie działa w oderwaniu od rzeczywistego świata. Piszemy aplikacje dla kogoś. Jeśli klientem są księgowi, musimy albo zatrudnić eksperta dziedzinowego, albo ktoś z nas musi nauczyć się podstaw księgowości. Zatrudniając neo-informatyka, w pakiecie dostajemy jego wiedzę z dziedziny, z której wyrósł. To bardzo cenne.
  • Gotowość do wykonywania zadań, którymi starzy wyjadacze gardzą. Trochę powtarzalne, mało rozwojowe? Bezpieczne? Jak najbardziej.

Minusy

  • Brak dobrych praktyk, zwłaszcza w dziedzinie testowania. Oznaczanie jako „zrobionych” zadań, które nie zostały poddane  podstawowym testom. W których nie sprawdzono przewidywalnych warunków brzegowych. Które, co prawda, zapaliły wszystkie lampki w ciągłej integracji na czerwono, ale programista spieszył się do domu, więc nie poczekał na wyniki. Tego obszaru trzeba po prostu starannie dopilnować.
  • Luki w wiedzy matematycznej. To nie koniec świata – większość programowania i tak opiera się na stosowaniu rozwiązań wymyślonych przez kogoś innego (Zajmujesz się uczeniem maszynowym? Rozumiesz dogłębnie zasadę działania SVM?). Największe niebezpieczeństwa czyhają w obszarze złożoności obliczeniowej – tę wiedzę koniecznie należy uzupełnić.

Krótkie podsumowanie

Jeszcze nigdy w (niedługiej, przyznaję) historii zostanie programistą nie było tak proste jak dzisiaj. Mamy dostęp do nieograniczonych zasobów wiedzy technicznej: kursy online, ciekawe produkty uczące przez zabawę, wsparcie lokalnych społeczności. Rynek obfituje w oferty pracy dla programistów.

Początkujący programiści i osoby pochodzące z innych dziedzin nie powinny mieć wielkich kompleksów. Dzisiejsze czasy wymagają specjalizacji. Większość programistów i tak zna na wylot tylko najbliższe sobie działki – tę opinię chciałam przekazać moją przydługą opowieścią o popsutym komputerze.

Czy tak dobra sytuacja się utrzyma? Nie wiadomo…

Patrząc na indeks NASDAQ, nie sposób nie zauważyć, że znajdujemy się w obszarze niebezpiecznie zbliżonym do bańki internetowej z 2000 roku. Globalizacja i centralizacja usług sprawiają, że osoba z dobrym pomysłem może w krótkim czasie zarobić miliony. Z drugiej strony, raz rozwiązany problem jest rozwiązany na dobre, co może pozbawić pracy mnóstwo mniejszych, lokalnych firm.

Pełna historia indeksu NASDAQ

Mimo wszystko, Internet i informatyka odgrywają coraz większą rolę w naszych życiach, więc należy się spodziewać, że ten sektor będzie zatrudniał więcej i więcej osób. Na pewno warto dodać programowanie do programu nauczania szkoły podstawowej – gdzieś obok matematyki i techniki.

Gdybym miała wskazać pierwszy język programowania dla dorosłej osoby, która chce sprawdzić swoje siły w tej dziedzinie, wybrałabym język Python: interaktywny, obiektowy, uniwersalny. Łatwo wyszukać w Internecie kursy dla początkujących – na przykład ten, oferowany przez Uniwersytet Michigan.

 

Milsza strona programowania