Programowanie i web development po nowemu. Czy da się wyrazić nowe rzeczy za pomocą starego języka?
Założona przez Elona Muska firma OpenAI zaprezentowała niedawno algorytm o nazwie Codex (1), który potrafi interpretować polecenia pisane po angielsku i zamieniać je we fragmenty użytecznego kodu, przekształcając je w oprogramowanie dla prostych gier lub stron internetowych. Jak donosił "The Verge", użytkownik może opisać "swoimi słowami" podstawowy wygląd lub funkcjonalność strony internetowej, którą chce zbudować, w zwykłym języku angielskim, a Codex generuje prosty projekt oparty na swojej interpretacji opisu. Codex wykorzystuje GPT-3, osławiony algorytm do generowania tekstu również autorstwa OpenAI. Działa jak asystent lub zastępca programisty. Przyjmuje koncepcje i pomysły, tworząc następnie kod.
"Widzimy to jako narzędzie do wspomagania programistów", wyjaśniał Greg Brockman, współzałożyciel OpenAI, w rozmowie z "The Verge". "Na programowanie składają się dwa elementy - analiza problemu z dążeniem do zrozumienia go i mapowanie kodu. To "właśnie ta druga część", dodał Brockman, "którą ludzie uważają za monotonną, bierze na siebie Codex".
Pomysł wykorzystania GPT-3 do generowania kodu mieli wcześniej inni. Sharif Shameem poinformował w lipcu 2020 r., że użył GPT-3 do ułożenia strony internetowej poprzez wprowadzenie opisów. GPT-3 przekształcił je w kod JSX, będący rozszerzeniem składni JavaScript, która produkuje strony internetowe z użyciem Reacta, open source’owej biblioteki javascriptowej służącej do budowania interfejsów użytkownika lub komponentów stron.
W 2020 r. na konferencji Build dyrektor technologiczny Microsoftu Kevin Scott opowiedział o eksperymentalnym projekcie, w którym sztuczna inteligencja, wytrenowana na kodzie zmagazynowanym w GitHubie, tworzy programy, generując funkcje na podstawie opisowego komentarza. Scott akcentował głównie oszczędności czasu traconego przez programistów na nudne, powtarzalne zadania. Choć demo Microsoftu może wskazywać, że programiści mogą w końcu zostać uwolnieni od pracy przy kodowaniu prostych funkcji, silnik generujący kod został z pewnością zbudowany przez zespół programistów, i to prawdopodobnie duży.
Przykładem dążenia do odciążenia programistów, choć nieco innego rodzaju niż opisywane wyżej rozwiązania AI, jest udostępniony znów przez Microsoft w marcu 2021 r. Power Fx, nowy język typu tzw. niskokodowego, który czerpie inspiracje z popularnych formuł Excela (2). Jest dostępny na zasadzie open source. Firma ma nadzieję, że pomoże w rozwoju oferowanych przez nią platform Power, takich jak Power Automate czy Power Virtual Agents i stanie się standardem dla tego rodzaju zastosowań.
Nowy język kierowany ma być przede wszystkim do użytkowników programu Excel i Power Platform. Oparty przede wszystkim na wykorzystaniu formuł, ma być użytkowany głównie przez ludzi o niewielkim doświadczeniu w kodowaniu.
Umiejętności związane z obsługą Excela są w świecie biznesu rozpowszechnione w dużo większym stopniu niż biegła znajomość języków programowania. Platforma niskokodowa (ang. low-code development platform, LCDP) jest oprogramowaniem umożliwiającym budowę aplikacji w sposób wizualny, za pomocą diagramów, grafów, formuł czy formularzy bez znajomości języków programowania.
Automatyzacja, choć nieuchronna, to jednak niestraszna
Według badań firmy Evans Data Corp, na świecie są 23 miliony programistów. Do 2023 roku liczba ta ma wzrosnąć do 27,7 miliona, choć według wielu opinii zawód ten jest zagrożony w dużym stopniu przez AI (3) i automatyzację. Obawy te są do pewnego stopnia zrozumiałe, jeśli uświadomimy sobie konsekwencje rozwoju technik opisanych wyżej lub inne, dostępne już od lat narzędzia dla twórców stron internetowych, np. Wix i SquareSpace, które pozwalają każdemu zaprojektować i "zbudować" stronę internetową bez konieczności uczenia się HTML i CSS.
Jednak dane z ostatnich lat oraz cytowane badania wskazują na co innego. Choć już od dawna automatyzujemy mnóstwo prac i zadań, zapotrzebowanie na inżynierów oprogramowania nieustannie wzrasta. Ponadto AI, mimo różnych fantazji, nie programuje się sama. AI byłaby niczym bez ludzi pracujących nad algorytmami, wymyślających je, ulepszających, dopracowujących. Samo Google zatrudnia obecnie około 30 tysięcy osób, które pracują nad różnymi platformami AI.
Wreszcie, pojawienie się nowych technologii, takich jak IoT, autonomiczne pojazdy, wirtualna rzeczywistość, itp. stawia nowy zestaw wyzwań, które wymagają nowych inżynierów oprogramowania, specjalistów IT, inżynierów systemowych i wielu innych specjalistów z nowymi umiejętnościami do pracy nad nimi.
Chociaż narzędzia AI, które potrafią pisać prosty kod, już istnieją, wciąż nie umieją określić, którym funkcjom nadać priorytet lub jaki problem miałby rozwiązać tworzony fragment oprogramowania. Wcześniej uważano, że rola programistów może się zmienić dopiero w miarę dalszego doskonalenia systemów AI i to pozostaje prawdą. W przyszłości być może zamiast pisania kodu, programiści będą odpowiedzialni za analizowanie i gromadzenie danych wejściowych do algorytmów AI, które następnie będą samodzielnie tworzyć oprogramowanie. Ale to jeszcze nie teraz.
Sztuczna inteligencja niewątpliwie jednak już potrafi tworzyć kod i z pewnością będzie stopniowo zastępować prozaiczne i uciążliwe zadania związane z programowaniem. Jednak po to, aby "programiści przestali być potrzebni", potrzebna byłaby o wiele bardziej zaawansowana sztuczna inteligencja. Ale wtedy, na tym hipotetycznym etapie w przyszłości będziemy zadawać to samo pytanie na temat każdego zawodu, jaki znamy.
Koniec języków obiektowych?
Większość języków programowania (i technologii internetowych) używanych dzisiaj została stworzona kilkadziesiąt lat temu. Dawni projektanci języków nie posiadali takiej wiedzy, jaką posiadamy dzisiaj. Stare języki programowania były tworzone z myślą o starych komputerach, w szczególności o jednordzeniowych procesorach. Stare języki programowania nie zostały zaprojektowane do korzystania z możliwości wielordzeniowych procesorów. Stare języki programowania nie zostały zaprojektowane z myślą o niezmienności, która okazała się kluczowa dla niezawodnego oprogramowania wielordzeniowego. Niezmienność skutkuje mniejszą liczbą błędów, mniejszą złożonością i ogólnie lepszym doświadczeniem programistycznym.
A największym problemem jest to, że języki te muszą być wstecznie kompatybilne. Oznacza to, że nowa wersja Javy zawsze będzie musiała być wstecznie kompatybilna z Javą 1.0. Porównajmy te software’owe problemy z hardware’em. Sprzęt nie musi być wstecznie kompatybilny i nie musi obsługiwać 20-letnich modułów pamięci RAM. Języki programowania muszą zachować cały swój bagaż.
Dzisiejsza Java to tak naprawdę ta sama Java sprzed 25 lat, choć z pewnymi nowymi funkcjami. Duże programy zorientowane obiektowo zmagają się z rosnącą złożonością. Coraz bardziej popularne staje się programowanie z wartościami niezmiennymi. Nie jest przypadkiem, że nawet nowoczesne biblioteki UI, takie jak React, są przeznaczone do używania w stanach niemutowalnych (niezmiennych).
Czym jest ów niezmienny stan? Mówiąc najprościej, są to dane, które się nie zmieniają. Funkcje, które nie mutują (nie zmieniają) stanu, nazywane są czystymi i są znacznie łatwiejsze w przetwarzaniu i testowaniu. Kiedy pracujemy z czystymi funkcjami, nigdy nie musimy się martwić o nic poza funkcją. W przeciwieństwie do obiektów w starszych językach, o których stan zawsze trzeba się martwić.
Według radykalnych ocen niektórych, szczególnie silnie dążących do zmian programistów, jesteśmy świadkami końca ery języków zorientowanych obiektowo. Dlaczego? Choćby dlatego, że jako stara koncepcja nie zostały one zaprojektowane do pracy z nowoczesnymi wielordzeniowymi procesorami i systemami rozproszonymi.
Jeden z twórców programowania obiektowego Alan Kay (4), legendarny programista zatrudniony w Xerox PARC w latach siedemdziesiątych, powiedział nie tak dawno, że niestety, współczesne programowanie obiektowe tak naprawdę skupia się na złym pomyśle, zajmuje się budowaniem złożonych hierarchii obiektów, zamiast zajmować się przesyłaniem informacji. Języki obiektowe zostały stworzone, aby zarządzać złożonością kodu, jednak, jak na ironię, nie udaje im się osiągnąć nawet tego celu.
Większość innych języków programowania nie została zaprojektowana z myślą o współbieżności. Oznacza to, że pisanie kodu, który wykorzystuje wiele wątków/rdzeni procesora, jest dalekie od prostego.
Witaj świecie, w którym wszystko jest kodem
W jakim kierunku pójdzie zawód programisty, jeśli nie musi (na razie) obawiać się AI? W latach 60. i 70. ubiegłego wieku programistów nazywano "analitykami". W książce Tima O’Reilly’ego pt. "Software Architecture Fundamentals Superstream", Rebecca Parsons z firmy Thoughtworks przypomniała, że "analitycy" zasadniczo zajmują się architekturą software’u, podejmują decyzje dotyczące tego, co oprogramowanie powinno robić i jak powinno być zbudowane.
Analitycy analizują problem, zastanawiają się, na czym on polega i jak go skutecznie rozwiązać. Myślą o tym, jak go rozłożyć na części. Mogą nawet myśleć o tym, czy problem powinien w ogóle być rozwiązany, jak powinien być rozwiązany, jakie kwestie etyczne się z tym wiążą i jak te kwestie powinny być rozwiązane. Analitycy muszą też myśleć o tym, jak ludzie będą korzystać z oprogramowania, jaki jest interfejs użytkownika, jakie są wrażenia użytkownika, czy mogą z niego korzystać osoby niepełnosprawne itd.?
Najważniejszym nurtem w programowaniu w najbliższej dekadzie będzie wykorzystanie uczenia maszynowego i sztucznej inteligencji do zautomatyzowania większości czynności związanych z kodowaniem. O tym już była mowa. Inną wielką zmianą będzie 5G.
Zwiększona przepustowość sieci i mocy obliczeniowej doprowadzi do zmian w językach programowania i powstania nowych języków programowania, które mogą wykorzystać moc obliczeniową sieci 5G i budować aplikacje programistyczne z wykorzystaniem sieci, w tym dla projektów transformacyjnych. Sieć 5G będzie wystarczająco szybka i wydajna, aby wprowadzić na rynek masowy technologie rzeczywistości rozszerzonej, wirtualnej i mieszanej.
Obecnie znanych jest na świecie wiele języków programowania, ponad siedemset, jak podaje Wikipedia. Lata temu języki programowania podzieliły się na deklaratywne (funkcyjne), takie jak Lisp, i imperatywne, czyli np. C. Podczas gdy te ostatnie dominowały przez dziesięciolecia, języki deklaratywne powracają, powiedział w mediach Jared Rosoff, znany programista, który współpracował m.in. z VMware, MongoDB i innymi firmami. "Języki imperatywne były lepiej przystosowane do kodowania logiki biznesowej dla aplikacji", zauważył Rosoff. "Ale w infrastrukturze jako kodzie świat nie jest imperatywny. Jest sterowany regułami".
Wciąż używamy starego języka COBOL i innych archaicznych języków programowania, wciąż wymyślamy nowe języki, z których każdy ma swoje wady i zalety. Na przykład korzystamy z Rust i C++ do programowania niskopoziomowego, wrażliwego na wydajność systemów (przy czym Rust dodaje korzyść w postaci bezpieczeństwa). Mamy Python i R do uczenia maszynowego, manipulacji danymi i wielu pokrewnych zadań. Różne narzędzia dla różnych potrzeb. Ale w miarę jak przenosimy się do świata Everything-as-Code (ang. "Wszystko-jako-kod"), coraz częściej pytamy, czy używanie tych samych języków ma sens?
Odpowiedź brzmi "nie" - mówią eksperci. Dlaczego? Ponieważ zbyt często występuje niedopasowanie pomiędzy językiem a celem, który chcemy osiągnąć. Imperatywne języki ogólnego przeznaczenia zostały zaprojektowane do budowania aplikacji i skryptów od podstaw, a nie do definiowania konfiguracji, polityk, itp. Języki deklaratywne, których odmianą jest programowanie funkcyjne, takie jak Polar i HCL, są świetne dla zastosowań takich jak konfiguracja, ponieważ pozwalają po prostu zadeklarować, jak ma wyglądać świat i nie martwić o to, co należy zrobić, aby tak się stało.
Minusem jest to, że są to rozwiązania nowe, wymagają pozyskania wiedzy i ludzi, którzy pozyskali tę wiedzę, ekosystemu narzędzi itp. Skoro jest nieco za wcześnie na upowszechnienie języków deklaratywnych, to jest za wcześnie na świat Everything-as-Code, ale, prawdopodobnie nowe nadejdzie szybciej, niż myślimy.
Internet w pierwszym rzędzie - mobilny
Na koniec warto pokusić się jeszcze o mały przegląd nowych technik i tendencji (a nawet, właściwie, mód) w programowaniu i projektowaniu stron i aplikacji internetowych, gdyż obecnie jest to jeden z najbardziej widocznych i dynamicznych obszarów w szeroko pojętej informatyce.
Zacznijmy od czegoś, co jest nazywane progressive web apps (lub PWA), techniki skupionej na doskonaleniu doświadczeń użytkownika , do czego wykorzystuje się zarówno starsze techniki HTML, CSS i JavaScript jak też nowsze narzędzia, jak React lub Angular.
Rozwój AI i technologii uczenia maszynowego spowodował zapotrzebowanie na projekty wirtualnych asystentów nazywanych także chatbotami, zarówno do komunikacji, jak też obsługi klienta, konsultacji itp.
Głównym celem wprowadzenia Accelerated Mobile Pages (lub AMP) jest przyspieszenie działania strony i zmniejszenie ryzyka jej opuszczenia przez użytkownika. Technologia AMP jest nieco podobna do PWA. Różnica polega na tym, że strony AMP ulegają przyspieszeniu dzięki open source’owemu pluginowi opracowanemu przez Twittera i Google. Z techniką tą wiążą się kontrowersje opisywane już w MT, obawy przed nadmiernym uzależnieniem wydawców stron od Google’a.
Aplikacja jednostronicowa (SPA) to jeden z tych prądów w tworzeniu stron internetowych, który zmierza do zwiększenia wydajności i poziomu ochrony danych. SPA zyskują swoją popularność dzięki rozwojowi frameworków JavaScript. Do tego typu aplikacji należą strony Google, takie jak Gmail, Google Drive czy Google Maps, a także platformy społecznościowe, takie jak Facebook. Są opinie, że w przyszłości większość funkcjonalnych stron internetowych będzie budowana jako SPA. Zapewniają użytkownikom natychmiastową informację zwrotną i zużywają również mniej energii i mogą działać bez kodu po stronie serwera (technologia API).
Przyszłość rozwoju stron internetowych wydaje się także w malejącym stopniu tekstowa, a w rosnącym - obrazkowa i… głosowa. Wiele firm zastanawia się obecnie nad tym, jak zoptymalizować swoje fizyczne i cyfrowe produkty pod kątem wyszukiwania głosowego i komend głosowych. Przewiduje się, że do końca 2022 roku 55% wszystkich gospodarstw domowych na świecie będzie mieć asystenta głosowego. Wzmocniona przez AI, optymalizacja wyszukiwania głosowego oszczędza czas i jest wielozadaniowa.
Choć motion user interface design jest modny od 2018 roku, to dopiero teraz dzięki technologii bibliotek SASS staje się szeroko dostępny dla użytkowników dowolnych urządzeń. Podejście to polega na niestandardowej integracji animacji i stylów zasilanych przez samodzielne biblioteki z licznymi klasami animowanych elementów. Z ich pomocą programiści spędzają mniej czasu na budowaniu produktu cyfrowego i oszczędzają na kosztach. Motion UI to także sprawdzony sposób na przyciągnięcie uwagi użytkowników.
Serverless, inaczej algorytmy bezserwerowe, to koncepcja, w której serwery mogą zostać zastąpione przez chmury, które zarządzają zużyciem zasobów. Najczęstsze zadania, które mogą być wykonywane bezserwerowo, to pobieranie kopii zapasowych plików, dostarczanie powiadomień i eksport obiektów.
Inna, nie tylko modna, ale mająca praktyczne konsekwencje koncepcja w projektowaniu stron i aplikacji, to "mobile-first development". Polega ona w skrócie na projektowaniu strony, która nie jest zorientowana na desktop, lecz na tworzenie lekkiego, zazwyczaj minimalistycznego produktu, z którym łatwo jest wejść w interakcję za pomocą telefonu komórkowego. I to, a nie tradycyjnie rozumiany design, jest tu punktem wyjścia.
Od 2018 roku Google stosuje oddzielne algorytmy w rankingu wyszukiwania dla telefonów, w których witryny mobile-first są traktowane priorytetowo. Z nurtem tym ściśle powiązana jest koncepcja responsywnych stron internetowych (5). Narodziła się kilka lat temu, kiedy urządzenia mobilne zawładnęły rynkiem.
Sprowadza się do zalecenia, by deweloperzy i projektanci dopracowywali swoje produkty tak, by były wygodne dla użytkowników w dwóch formatach, desktopowym i mobilnym. Jedną z możliwości jest stworzenie strony mobile-first i dostosowanie jej do desktopu, wykorzystanie tego samego kodu HTML z CSS, który może automatycznie zmieniać wyświetlanie na stronie.
Podsumowując - nadszedł również czas, aby zapomnieć o rozdzieleniu wersji desktopowych i mobilnych i pracować nad uniwersalnym kodem dla wszystkich typów urządzeń.
Mirosław Usidus