În ultima vreme s-a vorbit mult pe twitter despre inginerul de 10x, ceea ce a declanșat o mare dezbatere despre ceea ce face un inginer bun. Au fost menționate unele lucruri cu adevărat stupide, cum ar fi „inginerii 10x urăsc întâlnirile” și „inginerii 10x vin târziu la birou” și „fundalul laptopului inginerilor 10x este de obicei negru”. În general, se pare că unii oameni cred că, dacă ești suficient de deștept, este în regulă să fii un nemernic.
În Wix încercăm să lăsăm nemernicii în afara ușii. Credem că inginerii 10x nu sunt doar oameni care pot produce de 10 ori mai repede decât majoritatea oamenilor, ba chiar mai mult, aceia sunt oameni care pot face o întreagă echipă de 10 ori mai bună, având o influență pozitivă asupra tuturor celor cu care lucrează.
Mulți oameni își petrec o mare parte din carieră pentru a deveni ceea ce noi considerăm a fi un inginer decent. Înseamnă că ești un bun programator, care poate rezolva probleme și care știe să folosească fluent instrumentele pe care le ai la dispoziție, cum ar fi IDE, debugger, servicii și framework-uri. Acest articol încearcă să descrie ceea ce noi, în Wix Engineering, credem că transformă un inginer decent într-un inginer de 10x.
Una dintre cele mai importante capacități ale unui inginer este să fie capabil să lucreze independent. Pe scurt, acest lucru înseamnă să știi întotdeauna ce trebuie să faci și să te afli rareori într-o situație în care aștepți ca cineva să-ți spună ce să faci. Nu înseamnă că ești capabil să faci totul de unul singur, ci doar că știi cum să te deblochezi pe tine însuți și cum să îi deblochezi pe ceilalți din echipa ta într-un mod curat, care să creeze o datorie tehnică minimă. De exemplu, dacă ești blocat de o anumită problemă, vei găsi o soluție pentru aceasta, fie că este vorba de a obține asistență de la colegii tăi sau de a o rezolva singur. Inginerii independenți au capacitatea de a duce un proiect de la idee la producție prin toate fazele sale. Ei sunt capabili să definească care sunt lucrurile de care au nevoie pentru a putea îndeplini o sarcină și știu când să ridice un semnal de alarmă dacă au nevoie de asistență.
Planificare
Cel mai dificil lucru cu care vezi ingineri mai puțin experimentați luptându-se este să fii capabil să iei o sarcină mare și să o împarți în pași mai mici. Acest lucru este important nu numai pentru a fi capabili să estimăm cât timp durează ceva, ci este, de asemenea, o parte critică a construirii unui software de înaltă calitate. Planificarea corectă înseamnă că dezvoltatorul poate lansa versiunea inițială a produsului cât mai devreme posibil și poate începe să primească feedback mai repede. Planificarea corectă înseamnă că aveți un design al sistemului din timp și că aveți o imagine bună a ceea ce veți face înainte de a vă arunca în apă. Planificarea corectă înseamnă că nu există surprize mari care să vă strice proiectul în timpul dezvoltării. Un inginer bun ar trebui să fie capabil să descompună o sarcină, să definească proiectarea și fazele de lansare și să furnizeze documente de proiectare și estimări pentru a arăta planul său.
Humilitate
Aceasta este o întrebare dificilă. Chiar și cei mai puternici ingineri de multe ori au loc să crească atunci când vine vorba de umilință. Aceasta înseamnă să nu fii îndrăgostit de propriile soluții. Să fii capabil să asculți și să accepți soluțiile altora. Să presupui ce e mai bun de la colegii tăi și, atunci când vezi ceva ce pare a fi o greșeală, să încerci să înțelegi raționamentul din spatele ei. Să deschizi lucrurile la discuții. Să-i lăsați pe oameni să-și sugereze propriile soluții. Să vă împărtășiți ideile și să nu vă faceți niciodată griji cu privire la obținerea creditului pentru ele. Este mai important ca toată lumea să se simtă confortabil cu o idee și să simtă că a fost un efort de echipă decât ca toată lumea să știe că a fost ideea dumneavoastră. Fiți sinceri. Dați-le credit oamenilor. Nu vă fie niciodată teamă să spuneți că ați greșit sau să recunoașteți că altcineva are dreptate. Oamenii îi respectă pe cei care își pot schimba părerea.
Reutilizare
Poate părea banal, dar majoritatea oamenilor nu înțeleg că cel mai bun mod de a progresa este să construiești pe baza muncii anterioare. Inginerii mai puțin experimentați au întotdeauna prostul obicei de a crede că cel mai bun mod de a avansa rapid este să ignore tot ceea ce există deja și să o ia de la capăt. Inginerii buni vor căuta întotdeauna cu atenție, vor învăța, vor întreba și vor înțelege toate soluțiile existente deja disponibile. Chiar dacă soluția existentă este deficitară, ei vor încerca să vadă cum să o îmbunătățească înainte de a decide să o înlocuiască. Ei nu vor respinge niciodată o soluție existentă fără să o analizeze în profunzime și fără să vorbească cu proprietarul soluției existente.
Modalitatea de gândire a infrastructurii
După cum am descris mai sus, reutilizarea muncii anterioare poate avea un impact uriaș asupra oamenilor. Acest lucru înseamnă că inginerii ar trebui să fie mereu în alertă pentru a vedea dacă au ocazia de a crea ceva reutilizabil. Cel mai simplu lucru pe care îl puteți face atunci când aveți o astfel de oportunitate este să o ignorați. Realizarea unor lucruri reutilizabile îl costă întotdeauna mai mult pe „creator” decât realizarea unor lucruri ne-reutilizabile, așa că mulți oameni cu viziune scurtă ignoră beneficiile pe care ei și alte echipe le vor culege pe parcurs. Un dezvoltator bun va identifica oportunitățile de a crea lucruri reutilizabile, va ști cum să le facă reutilizabile în cel mai bun mod și va investi efortul pentru a face acest lucru.
Controlați-vă domeniul
Singura modalitate de a veni cu soluții bune este să înțelegeți temeinic produsul la care lucrați. Inginerii buni nu numai că au o înțelegere profundă a produsului pe care îl dezvoltă. Ei înțeleg, de asemenea, toate cazurile de utilizare, înțeleg motivația produsului și pot purta cu ușurință conversații semnificative cu managerul de produs, pot contesta deciziile și pot oferi alternative. Ei știu care sunt caracteristicile importante și care sunt lucrurile mai puțin importante și știu cum să prioritizeze în funcție de acestea și să ofere soluții alternative atunci când este necesar. Acest lucru este important nu numai pentru produsul la care lucrați, ci și pentru orice produs cu care vă integrați.
Curiozitate
Bunii dezvoltatori trebuie să aibă o curiozitate sănătoasă care se extinde mult dincolo de granițele domeniului lor. Acest lucru este valabil în special pentru a învăța cum funcționează de fapt tehnologiile de bază, dar este la fel de important să înțelegi produsele la care lucrează alte echipe, arhitectura lor și modul în care se conectează ca sistem complet. A avea acest context mai larg poate fi neprețuit atunci când se rezolvă probleme complexe și poate fi o sursă de inspirație.
Fără limite
Vezi adesea că sursa soluțiilor proaste și a arhitecturii proaste își are rădăcinile în faptul că oamenilor le este teamă să schimbe lucruri care se află în afara limitelor cutiei lor. Dezvoltatorul de client va avea tendința de a rezolva lucrurile pe client, chiar dacă este mai bine să le rezolve pe server. Dezvoltatorul de aplicații va avea tendința de a rezolva problema la nivel local, chiar dacă soluția aparține platformei sau infrastructurii. Motivul pentru aceasta este simplu. Este mai ușor să nu creezi discuții cu o altă echipă, este mai ușor să tratezi lumea care nu este la îndemâna ta ca pe o cutie neagră, este mai ușor să tratezi cu diavolul pe care îl cunoști. Dar inginerii buni trebuie să știe că fac parte dintr-un sistem mare și că nicio parte a sistemului nu este cu adevărat dincolo de raza lor de acțiune. Discutarea schimbării arhitecturii cu o altă echipă este sănătoasă și utilă și ar putea să vă aducă un plus de perspectivă. Să vă oferiți să contribuiți la schimbarea pe care o solicitați este excelent pentru a crea încredere între echipe. Atingerea unui domeniu nou este o experiență de care nu puteți decât să beneficiați. Cel mai important, atunci când limitele tale devin mai flexibile, înseamnă că impactul tău crește. Ori de câte ori evitați să ajungeți în afara limitelor dumneavoastră, realizați că ceea ce faceți de fapt este să vă împiedicați să aveți un impact mai mare.
Responsabilitate / responsabilitate
Deși nu este imediat evident, foarte des, dacă săpați în cauza principală a motivului pentru care un anumit proiect a fost întârziat sau a eșuat, veți descoperi că se reduce la proprietate și responsabilitate. Oamenii vor avea întotdeauna tendința de a da vina pe cei din jur: „A trebuit să aștept ca o altă echipă să finalizeze ceva”, „Am avut o problemă de sistem și nimeni nu a avut timp să mă ajute”, „Am primit definițiile prea târziu”. Un bun inginer știe că aceste lucruri sunt aproape întotdeauna scuze. Atunci când sunteți proprietarul sarcinii și responsabilitatea de a o realiza vă revine, mentalitatea dvs. ar trebui să fie aceea că fiecare problemă pe care o întâmpinați este ceva ce trebuie să rezolvați. Dacă sunteți blocat de o altă echipă, mergeți și discutați cu ei. Oferiți-vă să lucrați în pereche la problemă și nu „aruncați” responsabilitatea asupra altcuiva. Dacă nu ați primit încă definiții, faceți unele presupuneri cu privire la ceea ce vor fi definițiile. Este mai bine să faceți unele progrese și mai târziu să faceți ajustări, decât să stați și să așteptați. Dacă ceva important vă întârzie, știți când să ridicați steagul și să știți cum să ocoliți problema pentru ca măcar să puteți face progrese pe un alt front. Nu vă aflați niciodată în situația în care altcineva este responsabil să vă rezolve problema, ci invers – dumneavoastră sunteți responsabil pentru a ajunge la linia de sosire și trebuie să vă ocupați de obstacolele de pe drum.
Comunicare
Acesta este un adevărat schimbător de joc și adesea cel mai critic lucru pe care trebuie să îl aibă un inginer pentru a putea avea un impact uriaș asupra întregii echipe. A fi capabil să comunici este cel mai important lucru care a permis omenirii să devină ceea ce este, evident că același lucru este la fel de critic pentru orice aspect al vieții, inclusiv pentru ingineria software. Inginerii buni trebuie să fie capabili să își explice elocvent ideile și opiniile. Ei trebuie să fie capabili să dezbată în mod inteligent și respectuos cu colegii lor. Comunicarea nu înseamnă doar a vorbi, ci este și mai important să fii capabil să asculți. Nu toată lumea din echipă va fi capabilă să își exprime ideile la fel de bine, iar un bun inginer trebuie să aibă răbdare și să pună întrebările potrivite pentru a înțelege ce gândesc ceilalți și pentru a-i ajuta să se facă auziți. Toate acestea sunt la fel de importante atât pentru comunicarea verbală, cât și pentru cea scrisă și, mai important, nu este vorba doar de conversație – viața dezvoltatorilor este plină de tone de forme de comunicare: documente, prezentări, documentație, comentarii de cod, mesaje de confirmare. Chiar și scrierea unui cod lizibil și alegerea unor nume bune de variabile este o formă de comunicare.
Teamwork
Acesta este unul dintre locurile în care chiar și inginerii experimentați eșuează foarte des și nici măcar nu știu că se întâmplă. Gândiți-vă la toate momentele în care ați spus „este prea complicat, lăsați-mă pe mine”. Gândiți-vă la momentele în care ați spus „această sarcină este o treabă pentru o singură persoană, adăugarea de mai mulți oameni nu o va face mai ușoară”. Gândește-te la toate momentele în care nu ai avut timp să ajuți pe altcineva și nu ai urmărit niciodată acest lucru, sau ai reparat/refactorizat codul cuiva fără să-i ceri o revizuire, sau ai făcut o schimbare importantă fără să te consulți cu echipa ta. Există o mulțime de exemple. Și chestiunea este că, chiar și pentru inginerii experimentați, acest lucru pare pe moment ca fiind cel mai corect. Dar aceasta este o gândire tactică care dă roade doar pe termen scurt. Dacă dorim să realizăm lucruri mărețe, trebuie să ne asigurăm că putem colabora ca echipă. Nu este o coincidență faptul că munca în echipă a venit imediat după comunicare. Acestea sunt lucrurile care ne fac cei mai eficienți, este o biologie de bază. Marii ingineri nu numai că colaborează, se consultă, învață de la, asistă, formează perechi și își respectă colegii, ci sunt și mentori, semnalează problemele, găsesc interes și învață din tot ceea ce se întâmplă în echipă și încearcă în mod proactiv să fie de ajutor chiar și pentru lucruri care nu îi privesc în mod direct. Inginerii extraordinari știu când și cum să vină cu proiecte care vor facilita colaborarea mai multor persoane pentru lucruri în care se așteaptă multă muncă.
Păstrați lucrurile simple
Complexitatea unei soluții poate fi unul dintre ucigașii tăcuți ai capacității echipei de a avansa și de a se adapta. Este ca și tensiunea arterială ridicată. Pentru ochiul neexperimentat pare că totul este în regulă și că totul funcționează conform așteptărilor, dar, de fapt, în adâncul sufletului, ceva care nu afectează în mod direct nicio funcționalitate principală vă ucide încet. Inginerii buni creează soluții pragmatice și cod lizibil, chiar dacă scrieți mai multe linii de cod. Nu arătați cât de „deștept” sunteți folosind toate capacitățile limbajului, creând niveluri redundante de abstractizare sau scriind o funcție pe o singură linie pe care nimeni altcineva nu o poate înțelege sau depana. Nu fiți purist, nu suprarealizați soluțiile acolo unde nu este absolut necesar și nu vă temeți niciodată să luați ceva care este deja complex și să încercați să îl simplificați.
Prioritizarea
Nu putem face totul. Nu putem rezolva toate problemele. Nu putem câștiga toate dezbaterile. Nu putem face totul perfect. Avem timp limitat și resurse limitate și trebuie să le folosim cu înțelepciune. Acest lucru înseamnă că trebuie să fim capabili să distingem între ceea ce trebuie să insistăm să facem, ceea ce putem amâna și ceea ce ar trebui să ignorăm. Dezvoltatorii iau aceste decizii de zeci de ori în fiecare zi. Când ne gândim dacă să investigăm un bug, când ne gândim să facem o anumită refactorizare, când ne gândim să gestionăm un caz de utilizare sau un caz limită, când ne gândim să facem un ocol de la sarcina planificată și chiar când investim timp pentru a convinge pe cineva în opinia noastră. Bunii ingineri știu să fie neobosiți în remedierea, investigarea, cercetarea sau insistența de a se face înțeleși pentru lucrurile care sunt cu adevărat importante. Ei știu să ia o notă și să revină la ceva mai târziu dacă este important, dar nu urgent. Și știu să lase ceva în pace sau să accepte părerea altcuiva chiar dacă sunt nemulțumiți de ea atunci când nu este chiar atât de important.
Managementul timpului
După cum am menționat mai sus, tristul adevăr al existenței noastre este că suntem legați de timp. Produsele pe care le dezvoltăm trebuie în cele din urmă să intre în funcțiune, avem termene limită, estimări și obiective de atins. Dezvoltatorii buni trebuie să dezvolte nu numai o intuiție pentru a estima cât timp durează sarcinile lor, dar trebuie, de asemenea, să fie inteligenți în ceea ce privește modul în care își descompun și își ordonează sarcinile în părți și mai mici. Ei trebuie să gestioneze cu înțelepciune întreruperile și schimbarea contextului. Această intuiție a estimării timpului este o parte inseparabilă de capacitatea de a stabili priorități, așa cum s-a descris mai sus. De exemplu, Dacă ceva este suficient de scurt, s-ar putea să merite să fie făcut chiar dacă nu este super important. Iar dacă este prea lung, ar putea fi mai bine să amânați un pic sau să vă consultați cu colegii sau cu managerul.
Concluzie
Cum am menționat mai devreme, credem că inginerii care sunt experți în toate cele de mai sus pot face echipa de 10 ori mai bună prin influențarea și inspirarea colegilor lor. Marii ingineri trebuie să-și amintească întotdeauna că acest lucru face parte din munca lor de zi cu zi: să influențeze și să inspire. Aceasta înseamnă că trebuie să vă găsiți timp nu numai pentru a vă face treaba, ci și pentru a-i ajuta pe ceilalți să își facă treaba. Acest lucru vine sub mai multe forme: îndrumarea oamenilor din echipa ta, crearea de resurse pentru a-i educa pe oameni, asigurați-vă că totul este bine documentat, fiți întotdeauna deschis să explicați și să faceți pereche cu oamenii și multe altele. A fi un bun mentor și educator înseamnă că nu doar îi ajuți pe membrii echipei tale să se dezvolte, ci îți aprofundează înțelegerea a tot ceea ce faci și îți oferă o nouă perspectivă asupra clarității lucrurilor, a complexității sistemului și a locurilor în care lucrurile pot fi îmbunătățite.
Acestea sunt trăsăturile inginerilor de 10x, nu doar în ceea ce privește impactul lor individual, ci și în ceea ce privește impactul lor asupra tuturor celorlalți. Întrebați-vă întotdeauna ce puteți face pentru ca impactul vostru să fie mai mare, există întotdeauna mai mult loc de creștere.
.