Wierzymy w generowanie kodu wspomagane przez AI

Grafika wyróżniająca dotycząca generowania kodu wspomaganego przez AI

We wrześniu 2018 roku teleportHQ opublikowało ten 30-sekundowy film prezentujący wstępne wyniki działania naszego silnika automatycznego generowania kodu.

Automatic code generation example

W ciągu kilku dni film stał się viralem i osiągnął ponad 2 miliony wyświetleń. Widzowie publikowali entuzjastyczne komentarze w naszych mediach społecznościowych (na Facebooku, LinkedInie i Twitterze). Reakcja rynku przerosła nasze najśmielsze oczekiwania. Była wspaniałą i bardzo docenianą nagrodą dla naszego zespołu.

Ale szczerze mówiąc, nasza droga nie była usłana różami. Poprzednie miesiące badań i rozwoju były naprawdę wyboiste. Często mieliśmy wątpliwości i nieraz czuliśmy się osamotnieni w ciemności. To zewnętrzne potwierdzenie przyniosło ogromną ulgę: w końcu wiedzieliśmy, że jesteśmy na właściwym tropie.

Prowadząc prace badawczo-rozwojowe, trzeba być gotowym, by w razie potrzeby wszystko porzucić i zacząć od nowa — tyle razy, ile będzie trzeba. Byliśmy na to gotowi. Nauczyliśmy się jednak, że jest coś, na co nie byliśmy przygotowani: radzenie sobie z niepewnością.

Programiści wiedzą, że każda linijka kodu daje natychmiastowe i przewidywalne rezultaty. Albo działa, albo nie. Nie ma stanu pośredniego. A kiedy działa, przynosi natychmiastową satysfakcję. Zawsze uważałem ten aspekt programowania za bardzo satysfakcjonujący.

Logika rozmyta

Jednak w przypadku uczenia maszynowego sprawy wyglądają zupełnie inaczej. Trzeba pracować z logiką rozmytą i wskaźnikami pewności.

- Ale zaraz!... Działa czy nie?

- Cóż, tak, przez większość czasu...

Brak precyzji takiej odpowiedzi działa programistom na nerwy. Po prostu nie ma sensu używać nieprecyzyjnych wyników uczenia maszynowego do generowania precyzyjnego kodu.

Początkowo rzeczywiście wydaje się to bardzo sprzeczne z intuicją. Dużo czasu zajęło nam włączenie uczenia maszynowego do naszej kultury wytwarzania oprogramowania (i myślenia w kategoriach binarnych). Gdy jednak połączysz perspektywy programisty i analityka danych oraz nauczysz się dodawać niezbędne warstwy algorytmiczne, by radzić sobie z niepewnością, nie ma już odwrotu. Otwiera się droga do tworzenia nieograniczonej wartości.

Dlatego postanowiliśmy podzielić się przemyśleniami na temat początków naszej przygody. Chcemy zachęcić inne zespoły tworzące oprogramowanie, by włączyły uczenie maszynowe do swojej kultury pracy. Mimo wielu wyzwań na końcu tunelu widać jasne światło!

Początki

Jak można się domyślić, nikt nie budzi się pewnego ranka z pomysłem, by automatycznie generować kod za pomocą uczenia maszynowego. Do tego potrzeba kilku zderzeń pomysłów.

W naszym przypadku był to dość długi proces. Zapoczątkowały go przypadkowe prace nad chatbotami i interfejsami konwersacyjnymi. W tamtym czasie, w 2015 roku, większość z nas pracowała jeszcze w dziale JavaScript firmy Evozon. Projekt nigdy nie trafił do produkcji, ale wszyscy pozostaliśmy podekscytowani — otworzył przed nami wiele nowych perspektyw na to, jak możemy tworzyć nowe doświadczenia użytkowników.

Z czasem nasza sytuacja zawodowa skłoniła nas do rozważenia możliwości stworzenia środowiska VDE (Visual Development Environment) w modelu SaaS. Wiedzieliśmy, że jeśli się tego podejmiemy, musimy stworzyć coś wyjątkowego. Budowanie nowego produktu bez unikalnej i przekonującej propozycji wartości byłoby stratą czasu i pieniędzy.

Zadając sobie te pytania, wpadliśmy na ciekawy pomysł. A gdyby nasza platforma mogła zawierać agenta konwersacyjnego opartego na sztucznej inteligencji, który w czasie rzeczywistym projektowałby i kodował naszą stronę internetową?

Postanowiliśmy zbudować prototyp, który symulowałby wszystkie wymarzone przez nas funkcje. Pozwolił nam zwizualizować i dopracować to doświadczenie. Wszyscy zaczęliśmy marzyć i uśmiechać się!

Powrót do rzeczywistości

Taki produkt wydawał się jednak całkowicie poza naszym zasięgiem. Oprócz złożoności samego projektu nikt z nas nie potrafił dostrzec całej drogi do jego realizacji. Wtedy zdaliśmy sobie sprawę, jak bardzo programiści przypominają budowniczych. Dobry budowniczy wie, że każda konstrukcja wymaga dobrego planu oraz ustalonej, logicznej kolejności prac. Jak więc podejść do zadania, gdy końcowy projekt jest jedynie ideą, a jego skala jest tak ogromna?

Wiara i małe kroki

Jeśli nie masz niezbędnej wiedzy wstępnej o tym, jak osiągnąć swój cel, będziesz musiał próbować różnych rzeczy. Nowych rzeczy. Gdy na tych nowych ścieżkach pojawią się problemy — a pojawią się — bardzo łatwo ulegniesz pokusie, by ze wszystkiego zrezygnować. Każdy problem stanie się dobrym powodem, by to zrobić. Jedynym sposobem, by oprzeć się tej pokusie, jest wiara w to, że ostatecznie pokonasz wszelkie trudności.

Następnie musisz stawiać małe kroki i, miejmy nadzieję, wygrać kilka bitew. Każde drobne zwycięstwo wzmacnia twoją wiarę i przybliża cię o krok do ostatecznego celu. Każde zwycięstwo, nawet niewielkie, odsłoni nieoczekiwane nowe możliwości na kolejnych etapach. Ostatecznie wszystko sprowadza się do delikatnej równowagi między marzeniami a działaniem.

Język definicji interfejsu użytkownika (UIDL)

Dlatego postanowiliśmy rozpocząć naszą podróż od czegoś, co znaliśmy i dobrze rozumieliśmy. Od początku wiedzieliśmy, że chcemy móc generować kod w dowolnym języku. Oznaczało to, że potrzebowaliśmy pośredniej, niezależnej od języka kodowania warstwy reprezentacji naszego interfejsu użytkownika. W branży nie jest to nic nowego. Inspirując się rozwiązaniami innych, stworzyliśmy własną wersję takiej reprezentacji. Jest to w zasadzie obiekt JavaScript zgodny z formatem naszego języka definicji interfejsu użytkownika (UIDL). Każdą reprezentację można traktować jak JSON. (Nasz blog jest zbudowany przy jego użyciu — kliknij tutaj, aby zobaczyć, jak wygląda).

Generatory kodu

Po zdefiniowaniu naszego UIDL zajęliśmy się silnikami generującymi kod. Wiedzieliśmy, że powinny one umożliwiać generowanie nowoczesnego kodu na podstawie obiektu UIDL w czasie rzeczywistym, dla dowolnego języka lub frameworka.

Ze względu na nasze zawodowe doświadczenie z JavaScriptem zaczęliśmy od Reacta. Eksperyment się powiódł i dziś obsługujemy już React/Next oraz Vue/Nuxt. Do końca roku spodziewamy się dodać także obsługę React Native. O naszej pracy nad generatorami kodu opowiemy więcej w przyszłym wpisie na blogu.

Na szczęście w branży IT powszechnie wykorzystuje się makiety do prototypowania interfejsów użytkownika. Wytrenowaliśmy model wykrywania obiektów, aby rozpoznawał „jedynie” około 20 typów obiektów stanowiących podstawowe elementy interfejsów użytkownika. Po kilku miesiącach gromadzenia danych i trenowania mogliśmy stworzyć pierwszą wersję naszego Vision API. Zwraca ona listę wykrytych obiektów wraz z ich położeniem na podstawie podanego obrazu.

Gdy nasz UIDL i generatory kodu działały już razem, byliśmy gotowi przejść do kolejnego etapu: wykrywania obiektów.

Uczenie maszynowe i wykrywanie obiektów

Machine learning and object detection from paper image

Kluczowy element

Na tym etapie potrafiliśmy już wykrywać względne położenie elementów. Następnie musieliśmy zmierzyć się z trudniejszym zadaniem: przekształceniem bezwzględnego położenia elementów w reprezentację drzewiastą. To już zupełnie inna historia. Ten etap wiąże się ze złożoną wiedzą, którą programiści front-endu muszą zdobyć, by podejmować właściwe decyzje dotyczące architektury. To lata pracy.

Właśnie wtedy rozpoczęła się najpiękniejsza część tej podróży. To tutaj uczenie maszynowe i tradycyjne algorytmy łączą siły i dzieje się magia: system zaczyna podejmować właściwe decyzje dotyczące architektury interfejsu użytkownika. Właśnie na tym skupiamy wszystkie nasze wysiłki. Uważamy, że ten ostatni element technologicznej układanki jest kluczem do przyszłości rozwoju front-endu.

W tej przyszłości technologia znacząco zwiększy możliwości programistów front-endu. Będą poświęcać znacznie więcej czasu na doskonalenie doświadczeń użytkowników tworzonych produktów zamiast zajmować się ich technicznymi szczegółami. Przyniesie to wszystkim wiele korzyści, a my dokładamy wszelkich starań, by przybliżyć tę przyszłość.

Podsumowując, oto jak wygląda nasz proces pracy:

Code generation workflow explained image

Podsumowanie

Nasza podróż dopiero się zaczyna, a my intensywnie inwestujemy w badania i rozwój. Jesteśmy przekonani, że w nadchodzących latach uczenie maszynowe i sztuczna inteligencja nieodwracalnie — i na lepsze — zmienią sposób tworzenia interfejsów użytkownika. Dzięki temu odzyskamy ogromne ilości cennego czasu, który będzie można lepiej wykorzystać.

Nieustannie rozwijamy kluczowe elementy naszej technologii i z radością ogłaszamy, że do końca pierwszego kwartału 2019 roku udostępnimy naszą platformę SaaS oraz najnowsze wersje generatorów kodu typu open source. Jeśli Cię to interesuje, obserwuj nas na Twitterze.

Na koniec chcielibyśmy poznać Twoją opinię o naszych dotychczasowych postępach. Jeśli dostrzegasz potencjał w tych rozwiązaniach technologicznych, napisz do nas. Chętnie porozmawiamy z osobami ciekawymi świata i z radością rozważymy możliwości współpracy!

Produkt

Powiązane posty

Komentarze

Brak komentarzy. Podziel się swoją opinią jako pierwsza osoba.

Dodaj komentarz

Twój adres e-mail nigdy nie jest widoczny publicznie.
Komentarze są sprawdzane przed opublikowaniem.