Archiwa kategorii: Ogólnie o programowaniu

Artykuły na temat programowania, które mogą być czytane przez nieinformatyków

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.