Vă începeți ziua verificându-vă notificările pe Facebook unde primiți recomandări generate automat prin metode Machine Learning despre produsele pe care ați vrea să le cumpărați sau despre oamenii pe care poate îi cunoașteți, toate special customizate pentru voi. Ieșind din casă, faceți o poză unei flori proaspăt înflorite, în timp ce algoritmii Deep Learning de la Apple augmentează floarea cu culori mai vii și cu contraste de lumină mai bine decât o poate face camera fizică a telefonului vostru. Apoi, vă urcați în mașină, unde sistemele Deep Learning de conducere automată dezvoltate de Bosch vă țin în siguranță în timp ce conduceți și vă grăbiți la birou.
Nu există niciun dubiu. Machine Learning a cucerit lumea tehnologiei încet, dar sigur. A reușit însă să cucerească și domeniul dezvoltării software?
Cum diferă dezvoltarea unei soluții bazate pe Machine Learning de dezvoltarea unei soluții software clasice? Este necesar ca fiecare programator să fie concomitent și programator Machine Learning? Poate orice programator să devină programator Machine Learning dacă își dorește?
Haideți să aflăm împreună.
Dezvoltarea software, fie că vorbim de C/C++ pentru sisteme embedded, Java/JavaScript pentru aplicații web, C# pentru aplicații și jocuri sau altele necesită câteva abilități și activități cheie. Un programator experimentat știe:
Să lucreze cu subtilitățile și funcțiile avansate ale limbajului de programare folosit pe care trebuie să îl stăpânească la perfecție. Iată câteva exemple: utilizarea de șabloane (templates) C++ sau automatic return types, aritmetică C pointer, Java overloading și overriding, și nu numai.
Să lucreze cu un volum mare de cod, de exemplu cu zeci de mii de linii de cod. Acest lucru presupune înțelegerea și aplicarea unor concepte precum cod modular (cod scris astfel încât fiecare modul software să fie independent, ușor de înlocuit și actualizat) sau extensibilitatea/ scalabilitatea unui sistem (modalitatea prin care un sistem poate fi extins, astfel încât să îndeplinească fie o gamă mai mare de funcții sau același număr de funcții, dar pentru un număr mai mare de utilizatori). Programatorul trebuie să înțeleagă cum se integrează codul nou adăugat cu alte bucăți de cod. Prin urmare, programatorul trebuie să înțeleagă ce face codul scris. De asemenea, programatorul trebuie să înțeleagă și să folosească tipare de design (design patterns) precum Observer, Factory, și nu numai, dar și să adere la principiile SOLID.
Să lucreze cu librării existente sau terțe, cu paradigme diverse (de exemplu, Conan package manager pentru C++, Spring sau Hibernate în Java pentru dezvoltare web etc.). Nu trebuie să construiți totul de la zero.
Să înțeleagă și să respecte reguli de scriere a codului, dar și să scrie cod "curat" ("clean" code). Aderarea la standardele specifice limbajului de programare și proiectului (un exemplu simplu dar eficient este denumirea standard a variabilelor sau adăugarea de comentarii în cod) este obligatorie, deoarece acest fapt face ca întregul cod să fie mai ușor de interpretat/ înțeles, fără a neglija utilizarea de tooluri mai avansate de analiză de cod static (de exemplu, Helix QAC++) pentru a preveni defectele.
Accentul cade pe scrierea corectă de cod (modular, extensibil, curat) care să se potrivească în sistemul curent de cod și care să respecte toate standardele, aspecte pentru care este nevoie de foarte multă experiență. Un punct esențial este ca scopul funcțional al codului să fie cunoscut de la început (adică ce face codul din punct de vedere logic sau funcțional). De exemplu, trebuie să scriem cod pentru a crea un site web care să afișeze niște știri. Logic, pare destul de evident ce este de făcut. Ai un text (scris de cineva) și trebuie să îl afișezi pe ecran astfel încât să fie navigabil, de exemplu un articol după altul. Chiar și o persoană care nu este programator poate înțelege acest lucru, dar nu va putea să îl transpună în cod. De fapt, această nouă funcționalitate (care trebuie transpusă în cod) este o cerință a clientului care nu are de obicei cunoștințe tehnice complexe pentru a înțelege sistemul logic și funcțional.
Astfel, programatorul software este preocupat să scrie cod potrivit care să poată îndeplini o funcție cunoscută sau o acțiune cunoscută.
Pe de altă parte, pentru programatorul Machine Learning, accentul este cu totul diferit de la bun început, deoarece programatorul nu cunoaște funcția sau acțiunea pe care codul trebuie să le îndeplinească. Prin urmare, accentul cade pe modul în care este gândită și formalizată funcția sau acțiunea pe care codul trebuie le efectueze. Iată un exemplu. Să presupunem că vrem să construim un sistem care să învețe să identifice vehiculele dintr-o imagine, marcând vehiculul cu un chenar. Neluând în calcul implementarea efectivă a codului, cum am putea face acest lucru în mod logic? Cum poți determina un calculator "să înțeleagă" care pixeli din imagine reprezintă o mașină și care reprezintă alte entități precum drumul, pietonii, semaforul și altele? Cum poți scrie cod pentru acest lucru dacă nu știi ce ar trebui să facă acel cod? Nu este la fel de banal sau logic precum construirea unui site web pentru știri.
Aici intervine Machine Learning. Pe scurt, Machine Learning (și ramura sa celebră "Deep Learning") descrie cum se implementează un algoritm care estimează o funcție necunoscută, în cazul exemplului nostru fiind vorba de cum putem transforma o listă de pixeli într-o imagine și de cum putem încadra vehiculele identificate.
Astfel, programatorul ML este preocupat să dezvolte algoritmul potrivit prin care să efectueze o funcție sau o acțiune, ca ulterior să o transpună pe aceasta în cod.
Transpunerea efectivă în cod este la fel de provocatoare precum scrierea de cod a unui programator clasic, deoarece se aplică aceleași principii de calitate și integritate. Dezvoltarea algoritmului (ceea ce codul ar trebui să facă funcțional) adaugă un nivel suplimentar de complexitate care nu există în dezvoltarea clasică de software. În plus, manipularea unor seturi mari de date (găzduire, pre-procesare, filtrare, generarea statisticilor, identificarea tendințelor, pe scurt "big data") necesare pentru antrenarea algoritmilor adaugă încă un nivel de complexitate la cele menționate deja.
Prin urmare, programatorul ML are nevoie de abilități suplimentare în completarea celor deținute de un programator clasic. Acesta trebuie:
Să înțeleagă o serie de concepte matematice avansate ( de exemplu, derivate, integrale), algoritmi ( precum, propagarea inversă/backpropagation din Deep Learning, algoritmii cei mai populari în Machine Learning - support vector machines, random forests, regresie lineară etc.). Este esențial să existe o înțelegere a pașilor algoritmilor pentru a-i putea transpune în cod propriu-zis.
În acest punct, ar trebui deja să fie evident unde se întâlnesc cele două domenii. Ambele domenii (dezvoltare software clasică și dezvoltare Machine Learning) necesită abilități excelente de scriere de cod pentru a transforma o funcție știută sau neștiută (pentru care trebuie implementat un algoritm) în cod propriu-zis. Statistic vorbind, programatorii clasici vor fi mai abili în această privință, deoarece acesta este obiectivul lor principal. Cu toate acestea, le vor lipsi experiența și informația necesare pentru a implementa soluții Machine Learning care nu sunt specificate funcțional (pas cu pas).
Pentru a progresa în carieră și a ieși din zona de confort, este de așteptat ca:
Programatorii clasici să aprofundeze noțiuni de matematică și algoritmică. Puteți începe cu lucruri simple (concepte și algoritmi din programa de liceu), ca apoi, gradual, să avansați spre literatura de specialitate. Acești algoritmi trebuie înțeleși în esența lor. Nu trebuie folosiți pe post de librărie terța deja disponibilă undeva.
Lucrul în echipă între un programator clasic și unul specializat în Machine Learning este soluția cea mai bună, deoarece pot învăța unul de la altul, dobândind experiență în fiecare domeniu. În cele din urmă, totul se rezumă la dorința de a învăța și la capacitățile fiecărui individ.
Dezvoltarea clasică de software este asimilată din ce în ce mai mult în cadrul domeniului Machine Learning, așteptarea fiind ca din ce în ce mai mulți programatori să se orienteze spre Machine Learning. Identificarea codului potrivit va fi direct legată de identificarea algoritmului de Machine Learning potrivit pentru a atinge un obiectiv specific.