Ce ar trebui să știe un dezvoltator de backend. De la frontend la backend

Post vacant:
dezvoltator web backend

Una dintre specialitățile la cerere în domeniul dezvoltării web este crearea unui backend, adică a back-end-ului unei aplicații web. Pentru angajarea cu succes a profesioniștilor, este necesar un anumit depozit de cunoștințe și abilități. Reprezentanții companiei spun ce fel de specialiști ar dori să vadă în echipa lor

  1. Ce cunoștințe și abilități ar trebui să aibă un dezvoltator web backend?
  2. Ce este setul de instrumente pentru dezvoltatori web backend?
  3. Care sunt cerințele companiei pentru nivelul de educație al potențialilor angajați?
  4. Care sunt cerințele pentru experiența profesională?
  5. Există cerințe speciale datorită specificului activităților companiei?

Arthur Bozhenov, programator principal, Departamentul de automatizare internă, Tehnologii pozitive

Timur Gimullin, inginer senior în automatizarea testelor, departamentul de tehnologii de dezvoltare, tehnologii pozitive

1. Arthur Bozhenov: Un dezvoltator web backend trebuie să aibă următoarele abilități și cunoștințe:

  • programare cu mai multe fire;
  • Principiile ACID (atomicitate, consistență, izolare, fiabilitate) și aplicarea lor în practică;
  • principiile generale ale arhitecturii și protocoalelor de rețea;
  • ciclul de viață al cererii / răspunsului HTTP, calea cererii;
  • protecția conexiunilor de rețea (HTTPS). Autorizare. Stabilirea drepturilor de acces la resurse;
  • REST, ODATA, WebAPI, SOAP;
  • servicii web;
  • găzduirea aplicațiilor web (IIS, Nginx, Lighttpd, Node.js, Apache);
  • scalabilitatea soluției, echilibrarea / direcționarea cererilor;
  • Logare;
  • stocarea în cache a datelor;
  • stocarea datelor (alegerea adecvată a metodei de stocare în funcție de sarcină);
  • lucrați cu cantități mari de date.

2. Arthur Bozhenov: Set de instrumente de bază pentru dezvoltatori web:

  • IDE convenabil (Visual Studio, NetBeans etc.);
  • servicii sau utilitare pentru crearea / vizualizarea / modificarea expresiilor regEx, JSON, XML, text în codificare greșită;
  • Google și Stackoverflow;
  • MongoDb / Redis / memcached;
  • Elasticsearch / Kibana;
  • RabbitMQ / ZeroMQ / MSMQ și alte MQ.

Timur Gimullin:În ceea ce privește IDE, aceasta este o chestiune de gust, deși un notebook (sublim, npp), dar aș prefera să privesc produsele JetBrain și altele care se integrează bine unul cu celălalt.

3. Arthur Bozhenov: Tehnic superior (opțional) (obligatoriu). Experienţă munca practica mai important.

Timur Gimullin:În ceea ce privește educația, este mai bine tehnică sau matematică.

4. Arthur Bozhenov: 3-5 ani de dezvoltare non-frontend.

Timur Gimullin: Pentru dezvoltatorii de backend, nu pot elabora.

5. Arthur Bozhenov: Mintea analitică.

Timur Gimullin: Abilitatea reală de a lucra în echipă și capacitatea de a negocia. Un dezvoltator care nu știe să modeleze și începe să lucreze imediat, fără să mă gândesc la arhitectura generală și la interacțiunea tuturor modulelor de aplicație, nu aș duce deloc nicăieri. Lasă-i să se bazeze pe externalizare!

Evgeny Kuzin, șeful departamentului de proiecte de rețea,Doctor Web LLC

1. În primul rând, un dezvoltator web back-end trebuie să aibă un bagaj comun pentru toți dezvoltatorii - gândirea inginerească, capacitatea de a pătrunde esența problemei, de a o descompune în componentele sale și de a alege instrumentele potrivite pentru a o rezolva.

Arhitectura aplicațiilor web diferă semnificativ de arhitectura programelor convenționale de aplicații, în primul rând prin faptul că zeci și uneori sute de utilizatori pot (și lucrează) să lucreze cu aplicații web în același timp. Izolarea clienților unii de alții, securitatea sistemului, așteptarea creșterii productivității prin scalarea sistemului și soluțiile arhitecturale și tehnice asociate sunt în întregime pe umerii dezvoltatorului web.

În al doilea rând, este important ca un dezvoltator web să fie sensibil la dezvoltarea internetului, să analizeze tehnologiile și instrumentele utilizate.

Un dezvoltator web nu ar trebui să se teamă să stăpânească noile tehnologii, ar trebui să fie ușor (în comparație cu colegii - programatori de aplicații) și să poată acționa rapid.

2. Nu denumesc programe specifice, deoarece pentru fiecare aspect sunt posibile opțiuni echivalente.

Desigur, un browser, cu toate extensiile necesare pentru a analiza, verifica și manipula elemente și scripturi pe o pagină web. Apoi utilitare care vă permit să trimiteți o varietate de cereri HTTP personalizate (deoarece 95% din dezvoltarea web este protocolul HTTP) și să analizați în detaliu traficul și schimbul de date între client și server. De asemenea, are nevoie un dezvoltator web backend editor de text, de preferință cu suport pentru limbajele de programare utilizate, instrumentele de depanare, profilarea și controlul versiunilor.

De asemenea, ar trebui să menționăm instrumentele pentru scrierea sau generarea documentației tehnice. Documentarea este bună, documentația bună este, de asemenea, bună.

Și, desigur, instrumentele principale sunt capul și brațele drepte.

3. Este absolut necesar să cunoașteți limba rusă, pentru a putea să vă expuneți clar și clar gândurile în comunicarea cu colegii, atât în ​​scris, cât și oral. În rest, nu avem nevoie de învățământ tehnic superior obligatoriu sau de prezența unor certificate de la solicitanți - calitatea muncii și cunoștințele practice decid.

4. Principiul este același cu cel al educației. Experiența profesională, vechimea în muncă sunt avantaje necondiționate, dar considerăm fiecare candidat individual.

5. Dacă vorbim despre dezvoltarea specifică pentru Internet, atunci dezvoltarea web însăși creează deja o aplicație care funcționează într-un mediu public pentru un utilizator ale cărui adevărate intenții sunt necunoscute. Când programați orice acțiune, trebuie să vă puneți întrebări: ce se întâmplă dacă utilizatorul (atacatorul) automatizează executarea nesfârșită a acestei acțiuni? Ce se întâmplă dacă intrarea în aplicație este editată în mod arbitrar? Ce se întâmplă dacă linkul către acest serviciu ajunge acces deschis, va fi transferat prin chat către alt utilizator? Etc.

Datorită specificului activității noastre, traversăm adesea calea criminalilor cibernetici, iar datele cu care lucrăm sunt de mare interes în anumite cercuri, astfel încât unele dintre aplicațiile noastre web necesită o protecție deosebit de atentă.

Nikolay Krapivny, șeful departamentului de dezvoltare nouă, Badoo

1. Un dezvoltator web back-end la Badoo, ca orice bun inginer, trebuie să fie capabil să înțeleagă sarcina la îndemână și să fie capabil să o rezolve în mod eficient în cadrul tehnologiilor și instrumentelor disponibile. Folosim PHP + MySQL, deci dezvoltatorul nostru web trebuie să fie mai întâi fluent în PHP și SQL. Trebuie să fie responsabil și să se străduiască să-și facă treaba bine - respectă termenele, să înțeleagă valoarea produsului / tehnic al sarcinii, să fie responsabil pentru calitatea finală.

2. Setul de bază constă din PHP, MySQL, nginx, Git, JIRA, IDE, browserul preferat și Linie de comanda... În plus, în compania noastră au fost scrise un număr mare de instrumente, sisteme, biblioteci diferite, pe care dezvoltatorii de pretutindeni le folosesc pentru a rezolva anumite probleme. Unele dintre aceste instrumente sunt disponibile în Open Source, de exemplu, Pinba - un instrument de monitorizare PHP în timp real, instrumentul nostru de formatare a codului - phpcf, legare PHP pentru biblioteca Leptonica.

3. Dacă o persoană îndeplinește cerințele noastre de competențe și cunoștințe, atunci suntem gata să îi oferim un loc de muncă, indiferent de educația sa.

4. Situația este similară situației din educație: nu există cerințe rigide și formale.

5. Proiectele noastre au un public mare și backend-uri PHP destul de încărcate. La vârf, procesează până la 50 de mii de cereri pe secundă. În acest sens, acordăm o atenție specială subiectului performanței. Trebuie să înțelegeți principiile de bază ale memorării în cache, replicării, gestionării optime a datelor, optimizării consumului de resurse și alocării. Să puteți vedea și izola o problemă de performanță la orice nivel.

Denis Silakov, șeful departamentului de dezvoltare tehnologică și suport, STC IT ROSA

1. Un candidat pentru o astfel de funcție în STC IT ROSA va avea nevoie de următoarele abilități:

  • bună cunoaștere a Ruby on Rails 4.x;
  • familiaritate cu dezvoltarea condusă de comportament;
  • familiarizarea cu principiile dezvoltării colective - sisteme de control al versiunilor, trackere de sarcini și așa mai departe;
  • experiență cu baze de date (atât relaționale, cât și NoSQL);
  • experiență cu SLIM / HAML;
  • cunoștințe și experiență cu JavaScript / CoffeeScript;
  • cunoașterea CSS / SCSS.

2. În „STC IT ROSA” pentru dezvoltarea web, este utilizat în prezent cadrul Bootstrap, precum și cadrul JavaScript AngularJS. PostgreSQL și Redis sunt utilizate pentru stocarea datelor. Dezvoltarea Ruby on Rails urmează o abordare de dezvoltare bazată pe comportament, folosind instrumentele RSpec.

3. A avea un învățământ tehnic superior va fi un plus, dar în primul rând nu ne vom uita la o diplomă, ci la abilitățile și experiența unui potențial candidat.

4. Este de dorit un an sau mai multă experiență în proiectele în care au fost utilizate tehnologiile menționate în primul paragraf (cel puțin Ruby on Rails).

5. Dezvoltatorii web backend de la STC IT ROSA lucrează în principal la sistemul de dezvoltare și asamblare ABF utilizat pentru a crea principalele noastre produse - o linie de distribuții Linux și produse pentru acest sistem de operare. Prin urmare, va fi un mare plus dacă candidatul pentru această poziție este familiarizat cu Linux și cu construirea pachetelor pentru acest sistem. Nu va fi inutil să vă familiarizați cu alte tehnologii utilizate în ABF - virtualizare (în special, LXC), sisteme de gestionare a configurației (de exemplu, Ansible) și sisteme de stocare a codului (în principal Git).

Sergey Kazantsev, Senior Developer, Kaspersky Lab

1. Dezvoltatorii de backend sunt responsabili pentru codul care rulează pe serverele web.

Astfel, dezvoltatorii de backend trebuie să înțeleagă nu numai limbajele de programare, ci și arhitectura serverului, bazele de date și protocoalele de rețea.

2. Dezvoltatorul trebuie să cunoască cel puțin un limbaj de programare la nivel înalt, un cadru pentru o dezvoltare web eficientă și un server web.

Pachetele populare pot fi:

  • C # + ASP.NET + IIS;
  • Java + Spring MVC + Apache Tomcat;
  • Ruby on Rails + Nginx;
  • Python + Django + Apache;
  • PHP + Apache;
  • ... sau o combinație a ambelor.

Multe servicii web ale companiei sunt construite pe baza tehnologiilor Microsoft și a platformei .NET, dar Ruby on Rails, Perl, PHP sunt, de asemenea, adesea folosite.

În arsenalul unui dezvoltator de backend bun, există întotdeauna instrumente:

  • monitorizarea traficului: Fiddler, Wireshark;
  • interogări de performanță, memorie și baze de date;
  • căutare rapidă în jurnale: grep.

3. Sunt necesare abilități de lucru cu baze de date, cozi de mesaje și abilități de utilizare a unei cache distribuite pentru proiecte mari.

4. Experiența profesională necesară poate depinde de funcția pentru care solicită candidatul:

  • 1 an - dezvoltator web junior;
  • 2-5 ani - dezvoltator web;
  • 5-7 + - Senior / Lead Developer.

5. Cerințele specifice ale Kaspersky Lab includ cunoștințe despre criptografie, potențiale amenințări la adresa aplicațiilor web și modalități de prevenire a acestora.

Ilya Kutukov, Senior Programmer, Web Engineering Specialist la Parallels

1. Avem două posturi vacante la Parallels pentru astfel de specialiști - un dezvoltator principal de backend web (http://hh.ru/vacancy/12586616?query=parallels) și un dezvoltator și arhitect de backend web principal (Python) (http: // hh.ru/vacancy/12599030?query=parallels), deci înțelegem exact ce vrem de la astfel de specialiști. Se înțelege că persoana care vine la noi are suficiente cunoștințe despre limbajele de programare și tehnologiile necesare muncii. În plus față de verificarea abilităților de codare și a erudiției generale, oferim un test de arhitect - un text care este scris în mod liber și specificații tehnice deliberat incomplete pentru dezvoltarea unui sistem. Mai mult, îi cerem candidatului să clarifice faptul că nu înțelege ce întrebări suplimentare are și cum vede componentele principale ale sistemului, schema de date, cum se va schimba totul cu o creștere a încărcăturii, cantitatea de date și unde acest lucru poate fi neglijat.

2. Principalul set de instrumente este IDE (voi clarifica faptul că noi din echipă preferăm PyCharm), mediul dezvoltatorului, adică un set de programe care îl face cât mai asemănător cu umplerea serverelor de luptă, dar în același timp timp cu capacitatea de a înțelege rapid ce se întâmplă, VCS, scripturi la îndemână. Dintre instrumentele, tehnologiile și abordările interesante, relativ noi, aș dori să menționez și abordarea „reactivă” (Akka, Rx. *, Apache Storm etc.), care cere dezvoltatorului să gândească la nivelul fluxurilor de mesaje, evenimente și modificarea lor. Și, de asemenea, arhitecturi de microservicii care completează bine limbajele lor de descriere a interfeței (schema Thrift, Avro, Protobufs, JSON), care vă permit să creați convenabil contracte pentru schimbul de date.

3. Educația nu joacă un rol fundamental pentru noi.

5. Avem dezvoltatori de backend care lucrează la funcționalități precum Parallels MyAccount, Access Portal, Desktop Portal, în soluții precum Parallels Access (soluție acces de la distanță) și Parallels Desktop pentru Mac (care rulează diferite sisteme de operare și aplicațiile acestora pe Mac fără repornire), cu diverse soluții de infrastructură. Prin urmare, avem o astfel de specificitate ca timpul de oprire zero și este bine dacă o persoană nu numai că înțelege ce modificări trebuie făcute, ci și cum să o facă fără a afecta utilizatorii.

Konstantin Kichinsky, expert în tehnologii strategice, Microsoft Rusia

1. Cunoștințe și abilități necesare pentru un dezvoltator web back-end:

  • Arhitectură de rețea, protocoale, canale de comunicații.
  • Stivă tehnologică specifică proiectului (de exemplu, C #, .NET, ASP.NET sau JavaScript / TypeScript + NodeJS) + control al sistemului de operare subiacent (de exemplu, Windows / Azure + PowerShell).
  • Automatizarea implementării și testării (inclusiv testarea sarcinii).
  • Înţelegere capacități cloud furnizori majori (Microsoft Azure, AWS), inclusiv scalabilitatea serviciilor.
  • SDL și probleme generale de securitate (inclusiv criptarea și autentificarea).

2. Instrumente: Visual Studio, Git + restul depinde de procese și stivă tehnologică.

3. Educație: specializată (IT) + experiență practică, cunoștințe de înaltă calitate în domenii specifice sunt binevenite (de asemenea, securitate sau asigurarea toleranței la defecțiunea site-ului).

4. Experiență: experiență practică în proiecte reale, inclusiv participarea la proiecte OS.

5. Cerințe specifice: Azure.

Alexander Gorny, director al tehnologia de informație Mail.Ru Group

1. În primul rând, trebuie să cunoască backend-ul - principalul său limbaj de programare de lucru, baze de date, principiile organizării aplicațiilor server. În plus, are nevoie de cunoștințe pe web: structura protocolului HTTP, capacitățile CSS, cel puțin cunoștințe de bază despre HTML și JavaScript. Și în cele din urmă, ar trebui să fie bun dezvoltator- să poți depana codul tău și al altcuiva, să folosești corect algoritmi clasici, să alegi structuri de date adecvate.

2. Instrumentul principal este, desigur, limbajul de programare. Limbajul definește al doilea nivel de instrumentare: cadre și seturi de biblioteci standard pentru acest limbaj. Apoi, există baze de date: cel mai adesea MySQL sau PostgreSQL - și stocări NoSQL, cum ar fi Tarantool sau Redis.

3. Nu există cerințe formale pentru o diplomă atunci când aplicați pentru un loc de muncă la Mail.Ru Group. Mult mai importante sunt abilitățile și proiectele reale la care a participat. Grupul Mail.Ru are două mari proiecte educaționale: Technopark-ul bazat pe Universitatea Tehnică de Stat Bauman din Moscova și Technosphere bazat pe Universitatea de Stat din Moscova VMK, al cărui scop este de a oferi studenților abilități specifice în domeniul dezvoltării web.

4. Din nou, nu există cerințe formale, dar, în general, putem spune că dezvoltatorul devine complet independent undeva după doi sau trei ani de experiență de lucru „numărul doi”.

5. Dezvoltarea backend-ului a fost în mod tradițional inima companiei noastre. Dezvoltatorul de backend ar trebui să fie într-adevăr cel mai bun din toate - inteligent, creativ, responsabil, ordonat, precum și un jucător de echipă bun și, de preferință, cu un halou în jurul capului. Din punct de vedere tehnic, specificitatea noastră este că cea mai mare parte a backend-ului este scrisă în C ++ și nu în limbaje de scriptare - acest lucru este forțat de sarcini mari.

Alexander Nedzelsky, șeful studioului web ITSOFT

1. Dacă vorbim despre o anumită imagine colectivă a unui dezvoltator back-end, atunci:

  • înțelegerea POO, modelele de proiectare, cunoașterea algoritmilor de bază și a structurilor de date;
  • cunoașterea unuia dintre limbajele de programare (sau mai multe);
  • experiență cu SGBD, cunoștințe de SQL;
  • înțelegerea principiilor de proiectare a bazelor de date relaționale;
  • experiență cu cadre populare;
  • experiență cu sistemele de control al versiunilor;
  • cunoștințe de bază în HTML, CSS, JavaScript;
  • capacitatea de a configura un mediu de testare.

2. „Notepad” și capul pe umeri. Dar, serios, orice IDE / editor și platformă de testare. De obicei, instrumentele sunt selectate în funcție de preferință / sarcină / capacități.

3. Tehnic strict superior.

4. Disponibilitatea proiectelor comerciale finalizate și funcționale.

5. Dezvoltăm aplicații web, site-uri și servicii în principal în PHP / MySQL. În același timp, folosim Yii / Symfony și 1C-Bitrix pentru soluții standard. Prin urmare, experiența și cunoștințele relevante sunt importante pentru noi.

Eduard Gursky, șef tehnic în echipa de dezvoltare internă, JetBrains

1. Un dezvoltator web back-end este, de fapt, o persoană care dezvoltă logică pe partea serverului și înțelege în ce context va fi executat - în contextul aplicațiilor web. Dacă aplicațiile web backend sunt implementate în limbajul Java și, în majoritatea cazurilor, așa este, atunci, de fapt, toate aceleași cerințe pentru cunoștințe și abilități se aplică unui astfel de specialist ca unui dezvoltator Java obișnuit: cunoașterea limbii, înțelegere de lucru, și dispozitivele componente ale bibliotecii de bază Java SDK etc. Cu toate acestea, sunt adăugate experiența cu diverse cadre web (simplificarea implementării injecției de dependență, mvc etc.), capacitatea de a evalua și îmbunătăți performanța aplicației și scalabilitatea acesteia. Este necesar să se țină seama și să se înțeleagă cât de repede va primi utilizatorul aplicației rezultatul executării codului serverului, precum și cât de sigur și rațional este să puneți la dispoziție una sau alta funcționalitate a serverului prin browserul utilizatorului.

Adesea, o aplicație web backend necesită integrarea cu servicii terțe sau exportul funcționalității sale ca API extern. Dezvoltatorul trebuie să înțeleagă modul în care sunt implementate astfel de sarcini, ce protocoale și mecanisme sunt utilizate pentru aceasta.

În ciuda faptului că o astfel de persoană este implicată în principal în dezvoltarea logicii de pe partea serverului a aplicației, devine necesară depanarea sau prototipul utilizând partea client a aplicației. Acest lucru implică necesitatea de a înțelege funcționarea TCP / IP, stiva de protocol HTTP, principiile interacțiunii dintre browser și o aplicație web, cunoștințe de bază despre aspect, stiluri CSS, capabilități JavaScript.

2. Acesta este de obicei un IDE pentru dezvoltare. De asemenea, uneori, trebuie să utilizați un profilator pentru a rezolva probleme de performanță, consum excesiv de resurse etc. În echipa noastră, folosim IntelliJ IDEA.

3. Nu impunem cerințe formale la nivelul de educație al candidaților. Experiența, înțelegerea și inteligența sunt mai importante și, desigur, motivația umană.

4. Orice experiență în dezvoltarea de aplicații web de producție este, desigur, un plus. Cunoștințele și abilitățile descrise mai sus nu pot fi prezente la un specialist în absența unei experiențe relevante. În timpul interviurilor, întrebăm de obicei despre detaliile participării la diferite proiecte indicate în CV, pentru a evalua experiența pe care candidatul ar fi putut să o câștige prin finalizarea unor astfel de sarcini. Un candidat foarte interesant este un specialist care a încercat abordări și tehnologii diferite pentru a rezolva probleme similare în dezvoltarea aplicațiilor web, care este capabil să analizeze avantajele și dezavantajele fiecărei abordări.

5. Experiența în dezvoltarea aplicațiilor folosind produsele JetBrains este un plus. Toți cei din companie încercăm să ne folosim produsele pentru că sunt convenabile și pentru că vrem să le facem și mai convenabile!

De asemenea, recent am practicat dezvoltarea de aplicații web în limba Kotlin. Acest lucru oferă o serie de avantaje semnificative și, de asemenea, face procesul de scriere a codului în acesta mai plăcut. Dorința candidaților de a învăța noi limbi și noi abordări pentru implementarea aplicațiilor web este încurajată.

Dmitry Ovchinnikov, dezvoltator web
Natalya Zhuk, recrutor la Game Stream JLLC la centrul de dezvoltare Wargaming din Minsk

1. Dezvoltatorul de backend are nevoie de o înțelegere profundă a web-ului: de la formarea unei cereri HTTP din partea browserului până la implementarea comunicațiilor de la server la server folosind diverse protocoale. Web-ul la Wargaming nu este doar „ Zona personală»Jucător, dar și multe servicii care oferă o singură autentificare, înregistrare, participare la programul de recomandare etc.

De asemenea, este important să aveți o mentalitate inginerească. În combinație cu o perspectivă tehnică largă, acest lucru ne permite să oferim soluții eficiente.

Și, desigur, este imperativ să scrieți cod de calitate. Chipul programatorului este codul său. Cunoașterea arhitecturilor de bază și a modelelor moderne de programare este adesea o necesitate atunci când lucrați într-o echipă mare la un proiect complex.

2. În Wargaming, stiva de tehnologii utilizate este destul de standardă: cea mai mare parte a proiectelor web sunt dezvoltate în Python, unele servicii sunt scrise în PHP, iar altele, critice pentru calculul rapid și paralel, în Erlang. MySQL este utilizat pentru stocarea datelor, memcached pentru cache. RabbitMQ a fost ales ca autobuz de mesagerie în companie. Din cadre - Django și Twisted. Dacă vorbim despre partea front-end, atunci acesta este un pachet comun Backbone / Underscore / jQuery.

Când vine vorba de instrumente de dezvoltare, la Wargaming suntem dedicați poziției „ce este mai bun pentru dezvoltator”. Cineva folosește IDE-uri moderne, cineva se simte mai confortabil cu Vim sau Emacs. Nu contează ce instrumente folosim pentru a ne face treaba, dacă rezultatul este convenabil și servicii utile folosit de milioane de jucători din întreaga lume în fiecare zi.

3. Nu avem cerințe formalizate pentru nivelul de educație. O educație specializată (tehnică, matematică) va fi un plus, deoarece indică prezența unei pregătiri teoretice fundamentale a candidatului, dar este puțin probabil să devină un factor decisiv în angajare. Înțelegem că cunoștințele din domeniul matematicii, POO, algoritmi clasici și structuri de date pot fi obținute independent. Se acordă preferință candidaților cu experiență profesională. De asemenea, importantă pentru noi este capacitatea candidatului de a rezolva probleme de inginerie și de a lua decizii de inginerie, și nu doar de a scrie cod.

4. Cerințele pentru experiența în muncă depind de postul vacant. Dacă invităm tânăr specialist, apoi în primul rând ne vom uita la „proiectele sale de acasă” și la evoluțiile universitare. Trebuie să fim siguri că o persoană nu a venit la noi întâmplător, a fost o alegere deliberată care poate fi confirmată exemple reale chiar și proiecte mici, dar finalizate. Când vine vorba de un specialist cu experiență, cerințele sunt mai specifice. Experiența în mai multe domenii este importantă pentru noi: baze de date, Linux, servere web (Apache, Nginx), cunoștințe și înțelegere a sistemelor de cache (Memcached), sisteme de mesagerie (RabbitMQ), precum și experiență cu framework-uri (Django, Twisted). Experiența în optimizarea proiectelor cu sarcini mari va fi foarte utilă și vă va permite să vă alăturați rapid procesului de dezvoltare și să lucrați cu eficiență maximă pentru dvs. și echipa dumneavoastră. Pentru specialiști și experți de vârf, pe lângă cele de mai sus, sunt importante un orizont tehnic larg și o experiență cu o serie de tehnologii diverse.

5. Suportul infrastructurii web pentru un număr mare de jucători din universul Wargaming.net implică abilitatea de a lucra cu sarcini mari și de a pune în arhitectura aplicației capacitatea de a opera cantitate mare solicitări.

Pe lângă faptul că sunteți gata pentru Highload, este important să țineți cont de siguranță. Prin urmare, un dezvoltator web de la Wargaming trebuie să fie conștient de mecanismele de combatere a principalelor amenințări și să asigure fiabilitatea codului lor.

Preparat de Igor Shtompel

Centrul de cercetare al portalului Superjob.ru special pentru " Administrator de sistem»Am studiat ofertele angajatorilor. În ceea ce privește poziția unui dezvoltator web back-end, cerințele speciale nu au fost încă stabilite, ele sunt practic aceleași cu cele impuse programatorilor.

Programator Java

ACEASTA
Telecomunicații
Industrie
Producție
Clădire
Managementul proprietatii
Servicii B2B Vânzări B2B Vânzări B2C
Eu 65 000 – 80 000 54 000 – 71 000 50 000 – 67 000 60 000 – 75 000 50 000 – 65 000 50 000 – 64 000
50 000 – 64 000 42 000 – 57 000 40 000 – 53 000 45 000 – 60 000 40 000 – 52 000 40 000 – 51 000
II 80 000 – 90 000 71 000 – 87 000 67 000 – 85 000 75 000 – 90 000 65 000 – 83 000 64 000 – 87 000
64 000 – 72 000 57 000 – 70 000 53 000 – 68 000 60 000 – 70 000 52 000 – 66 000 51 000 – 70 000
III 90 000 – 150 000 87 000 – 125 000 85 000 – 115 000 90 000 – 130 000 83 000 – 120 000 87 000 – 125 000
72 000 – 120 000 70 000 – 100 000 68 000 – 92 000 70 000 – 100 000 66 000 – 96 000 70 000 – 100 000
IV 150 000 – 200 000 125 000 – 150 000 115 000 – 150 000 130 000 – 180 000 120 000 – 170 000 125 000 – 160 000
120 000 – 160 000 100 000 – 120 000 92 000 – 120 000 100 000 – 145 000 96 000 – 140 000 100 000 – 130 000
Miercuri 125 000 110 000 100 000 115 000 115 000 110 000
100 000 88 000 80 000 92 000 90 000 90 000

Linii salariale impare - medie la ora Moscovei, chiar - la Sankt Petersburg

Nivel de salarizare Cerințe și dorințe pentru competențe profesionale
Gama I
  • Învățământul superior incomplet (tehnic / IT)
  • Cunostinte excelente de HTML, CSS, Java, XML
  • Cunoașterea principiilor programării orientate pe obiecte
  • Cunoașterea bazelor teoretice ale dezvoltării bazelor de date
  • Cunoştinţe de limba engleză la nivelul citirii documentației tehnice
  • Experiență în programarea Java de la jumătate de an
Gama II
  • Experiență cu servere web și servere de aplicații
  • Experiență în programare Java cel puțin 1 an
Banda a III-a
  • Învățământ superior (tehnic / IT)
  • Cunoașterea modelelor de proiectare Java și J2EE
  • Experiență în utilizarea instrumentelor speciale (Hibernate, Spring, Struts etc.)
  • Experiență într-o echipă de dezvoltare
  • Experiență cu sistemele de control al versiunilor
  • Experiență cu SGBD (MS SQL Server sau Oracle)
  • 2+ ani de experiență în programare Java
Gama IV
  • Disponibilitatea certificatelor de calificare
  • Experiență de proiectare sisteme de informareși pregătirea documentației proiectului
  • Experiență cu soluții de integrare (IBM WebSphere, Oracle Fusion Middleware)
  • Experiență în dezvoltarea de aplicații pe mai multe niveluri
  • 3+ ani de experiență în programare Java
Dorințe posibile:
  • cunoașterea limbii engleze la un nivel conversațional sau fluent
  • abilități de conducere a echipei de dezvoltare

Pregătit de Valeria Chernetsova, șefa analizei SuperJob


În contact cu

  • Transfer

Această listă a apărut ca o notă personală pe subiecte pe care le-am discutat cu colegii și prietenii și în care am vrut să înțeleg mai profund ...

Nu sunt un mare fan al întrebărilor tehnice în interviuri: pentru mine, este mai bine să stau cu un candidat (sau candidat) la tastatură peste un cod real, o problemă reală - și să programez în pereche toată ziua, de preferință alternând cu restul echipei. Dar cred că unele întrebări tehnice pot fi un bun punct de plecare pentru conversații atractive și plăcute și vă vor permite să vă cunoașteți mai profund.

Acest depozit conține o serie de întrebări back-end pe care le puteți utiliza atunci când selectați potențialii candidați. În niciun caz nu se recomandă setarea Totîntrebări către un candidat: va dura câteva ore și nu are sens deloc, deoarece acoperă o gamă prea largă de subiecte. Nimeni nu poate ști totul. Selectați cea mai relevantă secțiune și cele mai interesante întrebări pentru a extinde conversația.

Un avertisment

Majoritatea întrebărilor sunt deschise, unele pur și simplu nu. corect sau gresit Răspuns. Dimpotrivă, acestea ar trebui să fie punctul de plecare al unei conversații, care, teoretic, ar trebui să arate mai bine abilitățile persoanei decât un răspuns simplu. Personal, în general aș prefera să pun întrebări, răspunsurile la care nu mă cunosc.

Din nou, subliniez că simpla punere a întrebărilor nu este suficientă. Încheiați interviul cu o sesiune lungă de programare în perechi: aceasta este una dintre cele mai bune opțiuni să ne înțelegem stilul și abordarea reciprocă - și să îi facem pe candidați să înțeleagă la ce să se aștepte de la munca lor viitoare.

Acest proiect este modelat după „Întrebări de interviuri front-end” de la @ darcyclarke.

Unde sunt răspunsurile?

Mai devreme sau mai târziu, voi completa articolul cu răspunsuri adecvate. Aș fi recunoscător pentru orice ajutor!

Întrebări despre modelele de proiectare:

De ce sunt răi globalii și statica? Îl puteți arăta cu un exemplu de cod?

Explicați despre inversarea controlului și cum îmbunătățește organizarea codului dvs.

Legea lui Demeter (Principiul conștientizării minime) prevede că fiecare modul software trebuie să aibă cunoștințe limitate despre alte module și trebuie să interacționeze numai cu „prietenii” direcți (uneori formulat ca „Nu vorbi cu străinii”). Puteți scrie cod care încalcă acest principiu? De ce are o organizație proastă și cum să o remedieze?

Active-Record este un model de proiectare care încurajează introducerea în obiectul însuși a unor funcții precum Inserare, Actualizare și Ștergere și proprietăți care corespund coloanelor unor tabele subiacente din baza de date. După părerea și experiența dvs., care sunt limitările și roci subacvatice aveți acest șablon?

Data-Mapper este un model de proiectare care încurajează utilizarea unui strat mapper care mută datele între obiecte și baza de date păstrându-le în același timp independente una de cealaltă și de transformatorul în sine. Spre deosebire de acest model, obiectele Active-Record includ direct operațiuni de stocare în baza de date și proprietăți care corespund tabelelor subiacente din baza de date. Aveți o părere despre aceste șabloane? Când ați prefera unul dintre ei decât celălalt?

De ce este adesea menționată „greșeala în miliarde de dolari” atunci când introduceți NULL? Doriți să discutați despre tehnici pentru a preveni acest lucru, cum ar fi modelul Null Object introdus în cartea GOF sau tipurile opționale?

De ce este compoziția de multe ori mai bună decât moștenirea?

Ce este Stratul anticorupție?

Singleton este un model de proiectare care creează o instanță a unei clase pentru un singur obiect. Nu este ușor să scrii un Singleton sigur. Vrei să încerci?

Abilitatea de a schimba implementarea fără a afecta partea clientului se numește Data Abstraction. Scrieți un exemplu care încalcă această proprietate, apoi remediați-o.

Scrieți un fragment de cod care încalcă principiul Don 't Repeat Yourself (DRY) (DRY). Apoi remediați-l.

Cum te vei descurca cu Dependency Hell?

De ce este rău?

Principiul fiabilității este o regulă generală de organizare a codului care recomandă „Fii conservator în ceea ce trimiți și liber în ceea ce primești”... Este adesea formulat ca „Fii un cititor tolerant și un scriitor atent”... Doriți să discutați semnificația acestui principiu?

Separarea responsabilităților - Principiul de proiectare pentru separare program de calculatorîn zone separate, fiecare dintre ele fiind responsabil pentru propria sa sarcină. Există multe mecanisme diferite de separare a preocupărilor (folosind obiecte, funcții, module sau șabloane precum MVC și altele asemenea). Doriți să discutați acest subiect?

Întrebări despre proiectarea codului:

Se spune adesea că una dintre cele mai importante sarcini ale proiectării orientate pe obiecte (și organizarea codului în general) este coeziunea puternică și cuplarea slabă. Ce înseamnă? De ce sunt atât de importante și cum să le realizăm?

De ce indexul matricei începe de la zero în majoritatea limbilor?

Cum afectează testele și TDD organizarea codului?

Scrieți un fragment de cod care încalcă Nu vă repetați (DRY). Explicați de ce este slab organizat și corect.

Care este diferența dintre coeziune și coeziune?

Pentru ce este utilă refactorizarea?

Sunt utile comentariile din cod? Cineva spune că trebuie evitate ori de câte ori este posibil și, în mod ideal, nu sunt deloc necesare. Ești de acord?

Care este diferența dintre organizarea codului și arhitectura?

De ce sunt scrise testele înainte de cod în TDD?

C ++ acceptă moștenirea multiplă, în timp ce Java permite unei clase să implementeze mai multe interfețe. Ce efect are utilizarea acestor instrumente asupra ortogonalității? Există o diferență de impact între utilizarea mai multor moșteniri și mai multe interfețe? Există vreo diferență între utilizarea delegării și moștenirea? [Aceasta este o întrebare din The Pragmatic Programmer de Andrew Hunt și David Thomas]

Avantaje și dezavantaje ale stocării logicii domeniului în procedurile stocate.

După părerea dvs., de ce o organizație orientată obiect a dominat piața atât de mulți ani?

Dacă codul dvs. este slab organizat, cum vă dați seama?

Întrebări despre limbaje de programare:

Spune despre trei principale neajunsurile limbajului de programare preferat.

De ce există un interes tot mai mare pentru programarea funcțională?

Ce este o închidere și pentru ce este utilă? Ce au în comun închiderile și cursurile?

Când este convenabil să folosiți generice?

Ce sunt funcțiile de ordin superior? Pentru ce sunt necesare? Scrieți o astfel de funcție în orice limbă.

Scrieți o buclă, apoi convertiți-o într-o funcție recursivă folosind doar structuri imuabile (adică fără variabile). Descrie-l.

Ce înseamnă atunci când un limbaj tratează funcțiile ca obiecte de primă clasă?

Afișați un exemplu de când o funcție anonimă poate fi utilă.

Pentru ce este un spațiu de nume? Vino cu o alternativă.

Spuneți-ne despre compatibilitatea Java și C # (sau alegeți alte două limbi arbitrare).

De ce urăsc mulți dezvoltatori Java?

Ce face limbaj bun limbaj bun și rău - rău?

Scrieți două funcții, una referențial transparentă și cealaltă referențial opacă. Să le discutăm.

Ce este o stivă și ce este o grămadă? Ce este un overflow de stivă?

De ce este important ca funcțiile să fie obiecte de primă clasă în limbaj?

Unele limbi, în special cele cu o abordare funcțională, permit o tehnică numită potrivire de tipare. Ți-e familiară? În ce diferență potrivirea de modele este diferită de constructele Switch?

De ce excepțiile nu sunt implementate în unele limbaje de programare? Care sunt avantajele și dezavantajele acestei abordări?

Dacă Pisica este Animală, este adevărat că TakeCare este TakeCare ?

De ce constructorii nu fac parte din interfața în Java, C # și multe alte limbi?

În ultimii ani a existat o mulțime de hype în jurul Node.js. Ce părere aveți despre utilizarea unei limbi în backend care a fost concepută inițial să funcționeze într-un browser?

Imaginați-vă că aveți o mașină a timpului și că aveți ocazia să vă întoarceți la un anumit moment al istoriei Java (C #, Python, Go sau orice altceva) și să discutați cu unii dintre creatorii JDK. De ce ai încerca să-i convingi? Eliminați excepțiile bifate? Adăugați tipuri primitive nesemnate? Moștenire multiplă?

Întrebări de dezvoltare web:

De ce sunt tratate atât de diferit cookie-urile native și cookie-urile terților?

Cum ați gestiona numerotarea versiunii API a serviciilor web?

Dintr-o perspectivă backend, există dezavantaje sau obstacole în implementarea aplicațiilor cu o singură pagină?

De ce ne străduim de obicei atât de mult ca serviciul să fie apatrid? Ce este atât de grozav la codul apatrid? De ce și când este rea starea de stare?

Odihnă și săpun: în ce situații ați alege una dintre aceste abordări și în ce alta?

În dezvoltarea web, abordările Model-View Controller și Model-View-View-Model sunt foarte similare atât în ​​backend, cât și în frontend. Ce sunt acestea și de ce este recomandabil să le folosiți?

Întrebări despre baza de date:

Cum transferați o aplicație de la o bază de date la alta, de exemplu de la MySQL la PostgreSQL? Dacă trebuie să gestionezi un astfel de proiect, la ce fel de probleme te aștepți?

De ce bazele de date tratează NULL ca un astfel de caz special? De exemplu, de ce nu SELECT * FROM tabel WHERE field = null returnează înregistrări cu un câmp nul în SQL?

ACID este un acronim pentru atomicitate, consistență, izolare, durabilitate. Majoritatea motoarelor de baze de date garantează aceste patru proprietăți pentru tranzacțiile bazei de date. Ce știi despre asta? Vrei să ne spui mai multe?

Cum ați face față migrării schemei bazei de date, adică cum automatizați modificările schemei bazei de date pe măsură ce aplicația dvs. evoluează de la versiune la versiune?

Cum implementez încărcarea leneșă? Când este util? Care sunt capcanele?

Așa-numita „problemă N + 1” apare atunci când codul trebuie să încarce copiii din relațiile părinte-copil într-un ORM de încărcare leneșă și, prin urmare, să trimită o cerere pentru înregistrarea părinte și apoi o cerere pentru fiecare înregistrare copil. Cum se rezolvă problema?

Cum găsiți cele mai scumpe interogări în aplicația dvs.?

În opinia dumneavoastră, este întotdeauna necesar să normalizați baza de date? Când este recomandabil să folosiți baze de date denormalizate?

Una dintre metodele de integrare continuă se numește implementare albastru-verde. Acesta constă în utilizarea a două medii de producție care sunt cât se poate de similare - și implementarea pe una dintre ele în timp ce cealaltă rulează, apoi comutarea sigură a traficului dintr-un mediu în al doilea după testarea într-un mediu convenabil. Această metodă devine mai complicată dacă implementarea implică modificarea structurii sau conținutului bazei de date. Aș dori să discut despre acest subiect cu tine.

Întrebări NoSQL:

Ce este eventuala consistență?

Pentru teorema CAP, dați exemple de sisteme CP, AP și CA.

Cum explicați creșterea recentă a interesului pentru NoSQL?

Cum rezolvă NoSQL problemele de scalabilitate?

Când ați prefera un SGBD bazat pe documente, cum ar fi MongoDB, decât un SGBD relațional, cum ar fi MySQL sau PostgreSQL?

Întrebări despre versiunea de cod:

De ce ramificarea este mai ușoară în Mercurial sau Git decât în ​​SVN?

Care sunt avantajele și dezavantajele sistemelor distribuite de control al reviziilor precum Git față de VCS centralizat precum SVN?

Puteți descrie fluxul de lucru pentru GitHub Flow și GitFlow?

Ce este rebase?

De ce fuzionarea este mai ușoară în Mercurial sau Git decât în ​​SVN și CVS?

Întrebări despre concurență:

De ce concurența deloc? Explica.

De ce este atât de greu să testezi codul multithread / paralelizat?

Ce este o condiție de cursă? Scrieți un exemplu într-un limbaj arbitrar.

Ce este impasul? Puteți scrie un cod care suferă de blocaje?

Ce este foamea proceselor? Dacă este necesar, să ne uităm la definiția acestuia.

Care este algoritmul fără așteptare pentru sincronizarea fără blocare?

Întrebări despre sistemele distribuite:

Cum se testează un sistem distribuit?

Când ați utiliza comunicarea asincronă între două sisteme?

Care sunt principalele capcane ale RPC?

Dacă construiți un sistem distribuit de dragul scalabilității și fiabilității, ce probleme diferite pot apărea într-un mediu de rețea închis și sigur - și într-un sistem public distribuit geografic?

Cum se asigură toleranța la erori pentru o aplicație web? O aplicație desktop?

Cum să faceți față erorilor din sistemele distribuite?

Să vorbim despre diferite abordări ale reconcilierii după eșecul conectivității la rețea.

Care sunt concepțiile greșite despre calculul distribuit?

Când veți utiliza Solicitare / Răspuns și când veți utiliza Publicați / Abonați-vă?

Să presupunem că sistemul cu care lucrați nu acceptă tranzacționalitatea. Cum l-ați implementa de la zero?

Întrebări despre ciclul de viață al software-ului și conducerea echipei:

Ce este agilitatea?

Cum veți lucra cu codul vechi?

Să presupunem că sunt managerul dvs. de proiect și nu un expert în programare. Încercați să-mi explicați ce este vechiul cod și de ce trebuie să vă preocupați de calitatea codului.

Sunt CEO-ul companiei dumneavoastră. Explică-mi Kanban și convinge-mă să investesc în ea.

Care este principala diferență între metodologia de dezvoltare agilă și modelul cascadei?

Ca lider de echipă, cum te descurci cu prea multe întâlniri?

Cum veți face față unui proiect care este foarte târziu?

„Oamenii și comunicarea sunt mai importante decât procesele și instrumentele” și „Colaborarea cu un client este mai importantă decât negocierea unui contract” reprezintă jumătate din valorile proclamate în Manifestul Agil. Să le discutăm.

Spuneți-ne ce decizii ați lua dacă ați fi CTO-ul companiei dvs.

Sunt utili managerii de programe?

Programați programul de lucru al echipei dvs. utilizând un program flexibil (adică fără ore stabilite) și o politică „Take When You Need”.

Cum ați face față unei cifre de afaceri foarte mari și ați convinge dezvoltatorii să nu părăsească echipa fără o majorare salarială? La ce bun poate face compania pentru a le păstra?

Care sunt primele trei calități pe care le prețuiți la colegii dvs., în afară de programare?

Care sunt cele trei lucruri principale pe care credeți că trebuie să le știe științele umaniste despre programare?

Imaginați-vă că o companie vă oferă o lună și un buget pentru a îmbunătăți calitatea vieții de zi cu zi a dvs. și a colegilor dvs. Ce ai face?

Întrebări despre logică și algoritmi:

Scrieți o coadă FIFO folosind doar stive LIFO. Apoi creați o stivă LIFO folosind doar cozi FIFO.

Scrieți o bucată de cod afectată de o depășire a bufferului.

Scrieți un factorial cu recursivitate finală.

În orice limbă, scrieți un REPL care afișează imediat valorile introduse. Actualizați-l la un calculator RPN.

Cum ați proiecta un utilitar de defragmentare?

Scrieți un program care generează labirinturi aleatorii.

Scrieți un exemplu de cod care creează o scurgere de memorie.

Generați o succesiune de numere aleatorii unice.

Scrieți un exemplu de sistem simplu de colectare a gunoiului.

Scrieți un simplu broker de mesaje în orice limbă.

Scrieți un server web foarte simplu. Faceți un plan pentru caracteristicile care urmează să fie implementate în viitor.

Cum sortezi un fișier de 10 GB? Cum ați face modificările unui fișier de 10 TB?

Cum găsiți programat fișiere duplicate?

Întrebări despre arhitectura software:

Când nu este necesară memoria cache și chiar dăunătoare?

De ce arhitectura bazată pe evenimente îmbunătățește scalabilitatea?

Ce face lizibil codul?

Care este diferența dintre designul emergent și arhitectura evolutivă?

Scalare orizontală și verticală: în ce fel sunt ele diferite? Când să folosești unul și când să folosești altul?

Cum să faceți față sesiunilor de failover și de utilizator?

Ce este CQRS (Segregarea responsabilității interogării comenzilor)? Cum diferă de vechiul principiu de separare comandă-interogare?

Ce este arhitectura pe 3 niveluri?

Cum veți proiecta un sistem software pentru scalabilitate?

Care sunt strategiile pentru rezolvarea problemei C10k?

Cum ați proiecta un sistem P2P descentralizat (adică fără server central)?

De ce nu este scalabil CGI?

Cum vă asigurați sistemele de blocarea furnizorului?

Care sunt dezavantajele modelului de proiectare Publisher-Subscriber la redimensionare?

Ce este nou în dezvoltarea procesorilor din anii 80, de ce este important pentru programare?

În ce moment al ciclului de viață ar trebui luată în considerare performanța și cum?

Cum poate apărea o problemă de refuz de serviciu nu din cauza unui atac DoS, ci din cauza unui design defect sau din cauza unei probleme arhitecturale?

Care este relația dintre performanță și scalabilitate?

Când este acceptată cuplarea strânsă?

Ce caracteristici ar trebui să aibă un sistem pentru a trece în cloud?

Unitatea designului înseamnă elitismul arhitecților? Simplu spus: poate rezulta un design bun din efortul colectiv al tuturor dezvoltatorilor?

Care este diferența dintre design, arhitectură, funcționalitate și calități estetice? Să discutăm despre asta.

Întrebări despre arhitectura orientată spre servicii și microservicii:

De ce SOA descurajează tranzacțiile lungi și, în schimb, sugerează utilizarea Saga?

Care este diferența dintre SOA și microservicii?

Să vorbim despre numerotarea versiunilor serviciilor web, despre compatibilitatea versiunilor și despre modificările care întrerup compatibilitatea înapoi.

Care este diferența dintre o tranzacție și o operațiune compensatoare în Saga, în SOA?

Când sunt microserviciile prea micro?

Care sunt avantajele și dezavantajele unei arhitecturi de microservicii?

Intrebari de securitate:

Cum scriu cod securizat? În opinia dumneavoastră, aceasta este responsabilitatea dezvoltatorului sau ar trebui să existe un specialist separat în companie pentru acest lucru? Și de ce?

De ce se spune că nu ar trebui să încercați să inventați sau să vă proiectați propriile reguli criptografice?

Ce este autentificarea cu doi factori? Cum îl implementați într-o aplicație web existentă?

Dacă nu gestionați jurnalele cu atenție, există întotdeauna riscul ca informațiile confidențiale, inclusiv parolele, să ajungă acolo. Cum preveniți această problemă?

Scrieți un fragment de cod predispus la injecție SQL și remediați-l.

Cum puteți detecta o vulnerabilitate a injecției SQL utilizând analiza statică a codului? Nu mă aștept să scrieți un algoritm gata făcut, deoarece acesta este un subiect prea mare, dar să discutăm o abordare generală.

Ce știți despre scripturile între site-uri? Dacă nu vă amintiți, să ne uităm la descrierea acestuia pe Internet și să vorbim despre aceasta.

Ce știți despre falsificarea cererilor între site-uri? Dacă nu vă amintiți, să ne uităm la descrierea acestuia pe Internet și să vorbim despre aceasta.

Cum funcționează HTTPS?

Ce este un atac om-în-mijloc? Și de ce HTTPS ajută la protejarea împotriva acestuia?

Cum puteți preveni furtul sesiunii utilizatorului? Cel mai probabil, vă amintiți ce este sesiunea sau furtul de cookie-uri, altfel vom citi împreună pagina Wikipedia pe acest subiect.

Probleme generale:

De ce contează programarea funcțională? Când ar trebui să utilizați un limbaj de programare funcțional?

Cum câștigă companii din Microsoft, Google, Opera și Mozilla bani din browserele lor?

De ce deschiderea unui socket TCP are o mulțime de cheltuieli generale?

De ce este important să folosiți încapsularea?

Ce este un sistem în timp real și în ce fel este diferit de un sistem convențional?

Care este relația dintre limbajele de programare în timp real și alocarea memoriei heap?

Imuabilitatea este practica setării valorilor o dată în momentul creării obiectului, iar aceste valori nu se schimbă niciodată după aceea. Cum vă ajută imuabilitatea să scrieți un cod mai sigur?

Pro și contra unor valori mutabile și imuabile.

Ce este o nepotrivire a impedanței relaționale obiect?

Ce principii veți utiliza pentru a determina dimensiunea cache-ului?

Care este diferența dintre TCP și HTTP?

Care sunt compromisurile dintre opțiunile de redare pe partea de client și pe partea de server?

Cum se dezvoltă un protocol de comunicare de încredere bazat pe unul necredibil?

Inventatorul indicatorului nul, Tony Hoare, a spus odată: „Pot să numesc asta greșeala mea de miliarde de dolari”, întrucât implică „nenumărate erori, vulnerabilități și eșecuri ale sistemului care au cauzat probabil un miliard de dolari suferințe și daune în trecut patruzeci de ani. " Să presupunem că doriți să eliminați posibilitatea de a utiliza indicatori nul în limbajul dvs. de programare: cum rezolvați o astfel de problemă? Ce consecințe poate avea acest lucru?

Întrebări deschise:

De ce oamenii rezistă schimbării?

Explicați conceptului de fire bunicii voastre.

În calitate de dezvoltator, doriți să fiți atât inovatori, cât și previzibili în același timp. Cum pot coexista aceste două obiective în aceeași strategie?

Ce face bun codul bun?

Explicați cum se face streaming și cum îl veți implementa.

Să presupunem că compania dvs. vă oferă o săptămână pentru a îmbunătăți viața dvs. și a colegilor dvs.: cum folosiți săptămâna respectivă?

Ce ai învățat în ultima săptămână?

Există un element estetic în orice design. Întrebarea este, este această estetică prietenul sau dușmanul tău?

Care sunt cele mai recente cinci cărți pe care le-ați citit?

Cum implementați o abordare continuă de livrare de software într-o companie mare, de succes, care nu este banală pentru trecerea de la un model de cascadă la o abordare de livrare continuă datorită dimensiunii și complexității sale de afaceri?

Când are sens să reinventăm roata?

Să vorbim despre reinventarea roții, sindromul respingerii dezvoltării altcuiva și practica utilizării unei companii sau a unei echipe de dezvoltatori ai propriilor servicii și produse (Eating Your Own Food).

Ce automatizați în primul rând în fluxul dvs. de lucru actual?

Care sunt dificultățile în scris software? Ce face software-ul dificil de întreținut?

Preferați să lucrați la proiecte complet noi (greenfield) sau să continuați cu cele existente (brownfield)? De ce?

Ce face sistemul de operare atunci când nu există nicio comandă pentru a executa un anumit cod și pare inactiv? Aș dori să încep o conversație despre întreruperi, demoni, servicii de fundal, votare, gestionarea evenimentelor etc.

Explicați tranzacțiile Unicode sau DBMS unui copil de cinci ani.

Faceți un caz pentru o arhitectură monolitică.

Ce înseamnă să fii „dezvoltator profesionist”?

Programarea este o artă, meșteșug sau inginerie? Opinia ta.

De ce este mai puțin probabil ca corporațiile să inoveze decât startup-urile?

Care este ultima ta realizare de care ești mândru?

Întrebări despre fragmentele de cod:

Care este rezultatul acestei funcții JavaScript?

Funcția hookupevents () (pentru (var i = 0; i< 3; i++) { document.getElementById("button" + i) .addEventListener("click", function() { alert(i); }); } }
Ce zici de ștergerea tipului, ce produce acest cod Java și de ce?

ArrayList li = new ArrayList (); ArrayList lf = ArrayList nou (); if (li.getClass () == lf.getClass ()) // evaluează la System.out.println adevărat ("Equal");
Puteți observa o scurgere de memorie?

Clasa publică Stack (private Object elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack () (elements = new Object;) public void push (Object e) (assureCapacity (); elements = e;) public Object pop () (dacă (mărime == 0) aruncă EmptyStackException nou (); returnează elemente [- mărime];) / ** * Asigură spațiu pentru cel puțin încă un element, aproximativ * dublând capacitatea de fiecare dată când matricea are nevoie a crește. * / private void assureCapacity () (if (elements.length == size) elements = Arrays.copyOf (elements, 2 * size + 1);))
Puteți scăpa de comutator și puteți scrie mai multe coduri orientate obiect?

Clasa publică Formatter (privat Serviciu de service; public Formatter (Service service) (this.service = service;) public String doTheJob (String theInput) (String response = service.askForPermission (); switch (response) (case "FAIL": return "error"; case "OK" : return String.format ("% s% s", theInput, theInput); implicit: return null;)))
Puteți scăpa de instrucțiunile if și puteți scrie mai multe coduri orientate obiect?

Clasa publică TheService (private FileHandler fileHandler; private final FooRepository fooRepository; public TheService (FileHandler fileHandler, FooRepository fooRepository) (this.fileHandler = fileHandler; this.fooRepository = fooRepository;) (fișier); șir final de executareId = fileHandler.getExecutionIdFromFileName (fișier); if ((executionId == "") || (rewrittenUrl == "")) (return "";) Foo knownFoo = fooRepository.getFooByX rewrittenUrl); if (knownFoo == null) (return "";) returnează knownFoo.DoThat (fișier);))
Cum refactorizați acest cod?

Function () (HRESULT error = S_OK; if (SUCCEEDED (Operation1 ())) (if (SUCCEEDED (Operation2 ())) (if (SUCCEEDED (Operation3 ())) (if (SUCCEEDED (Operation4 ())) () else (eroare = OPERATION4FAILED;)) else (eroare = OPERATION3FAILED;)) else (eroare = OPERATION2FAILED;)) else (eroare = OPERATION1FAILED;) returnare eroare;)

Dezvoltator back-end(din dezvoltatorul englez back-end (revers)) Acesta este un specialist care se ocupă cu partea software și administrativă a unei aplicații web, conținutul intern al sistemului, tehnologiile serverului - o bază de date, arhitectură, logica programului. Profesia este potrivită pentru cei care sunt interesați de informatică (vezi alegerea profesiei după interesul pentru materiile școlare).

Dezvoltatorul back-end este un luptător frontal invizibil.

Site-urile moderne, aplicațiile web și jocurile au devenit foarte complexe, așa că o echipă întreagă de specialiști lucrează la ele. Pentru a crea un site web complet, frumos, funcțional și ușor de utilizat, este nevoie de o muncă coordonată a dezvoltatorilor front-end și back-end. Acest lucru accelerează activitatea de creare a unui site web sau a unei aplicații web și facilitează întreținerea acestuia.

Figurativ vorbind, dezvoltarea back-end-ului este despre crearea motorului unei mașini, în timp ce dezvoltarea front-end-ului este despre crearea funcțiilor de proiectare și control ale unei mașini. Dezvoltatorul back-end lucrează îndeaproape cu dezvoltatorul front-end, primind de la acesta informații despre utilizator și returnându-i rezultatul procesat.

Principalele instrumente de dezvoltare back-end sunt limbaje de programare de pe server, cum ar fi PHP, Python, Ruby, Java, Perl, Node JS (platformă software). Pe lângă Node JS, este util să învățați Express (o bibliotecă pentru comunicarea platformei Node JS cu serverul) și Mongo DB (o bază de date pentru recuperarea și stocarea informațiilor).

La fel de fonduri suplimentare sunt utilizate framework-urile Symfony, Codeigniter, Yii, Zend Framework, Kohana etc. MySQL / SQLite sunt utilizate pentru stocarea datelor.

Caracteristicile profesiei

Pentru dezvoltatorii moderni, nu este suficient doar să scrieți cod pentru programe. Așa au funcționat programatorii acum 10-15 ani. În zilele noastre, un astfel de termen este inadecvat, deoarece în lucru este adesea posibil să se facă fără scrierea codului, pur și simplu prin conectarea pieselor gata făcute împreună într-o singură configurație. Iar programatorii sunt acum numiți „dezvoltator” sau „inginer”.

Odată cu dezvoltarea sferei IT, proiectele devin din ce în ce mai complexe și reprezintă un constructor care poate fi asamblat folosind soluții gata pregătite (cadre) pentru aproape orice sarcină.

Astfel, funcționalitatea back-end a dezvoltatorului arată astfel:

  • proiectarea arhitecturii serviciilor;
  • crearea nucleului site-ului;
  • dezvoltarea platformei și funcționalitatea de bază;
  • lucrul cu arhitectura de cod;
  • dezvoltarea de aplicații care susțin interfața utilizatorului și securitatea;
  • control asupra stării serverelor (luptă, test și producție);
  • control versiune, bază de date, integrare continuă.

Pro și contra ale profesiei

Profesie foarte plătită și foarte solicitată.

Loc de munca

Companii pentru dezvoltarea de site-uri, aplicații web, aplicatii mobile.

Calități importante

  • mintea analitică
  • gandire logica
  • inițiativă
  • capacitatea de a planifica și urma planurile
  • Abilitați de lucru în echipă
  • flexibilitatea gândirii
  • responsabilitate, perseverență, dăruire
  • accent pe rezultate și calitate
  • dorința de a învăța în mod constant lucruri noi și de a le aplica în munca lor

Cunoștințe și abilități profesionale

Cunoașterea a cel puțin unui limbaj de programare: Go, C, C ++, Perl, Python, PHP, Ruby, Java.

  • capacitatea de a scrie cod rapid, frumos și corect;
  • cunoașterea cadrelor web populare (Django, Flask, Spring);
  • capacitatea de a proiecta baze de date și de a optimiza interogările;
  • cunoașterea paradigmelor moderne de programare;
  • cunoașterea modelelor de proiectare;
  • înțelegerea dispozitivelor, interfețelor serviciilor web;
  • Engleză pentru citirea documentației tehnice.

Unde să studiezi pentru dezvoltatorul Back-end

Predă (în persoană, Moscova). Internaţional instituție educațională specializată în educația informatică. Lucrează din 1999. 42 de sucursale în 16 țări. Cel mai mare centru de instruire autorizat pentru Microsoft, Cisco, Autodesk. Studenții primesc certificate internaționale și o diplomă internațională. Scopul principal este angajarea fiecărui absolvent.

Educatie inalta:

Pentru a deveni un adevărat profesionist în domeniul dezvoltării back-end, trebuie să aveți o educație de bază de specialitate, care poate fi obținută în următoarele universități:

Dar, în același timp, este important să ne amintim că educația fundamentală universitară pune bazele educației, dar nu este suficientă pentru cunoștințele reale despre tehnologii moderne... Prin urmare, în acest domeniu, autoeducarea este importantă pentru a fi la curent cu toate noile tehnologii și instrumente. Dar, la rândul său, lipsa educației specializate afectează momentul în care ceva nu mai funcționează și persoana nu înțelege - din ce motiv. Un specialist cu o educație fundamentală, desigur, nu știe totul, dar are abilitatea principală - unde să găsească și cum să folosească cunoștințele necesare.

Angajatorii moderni, de regulă, nu impun cerințe formale pentru educația superioară a candidaților la funcție. Pentru ei, cel mai important lucru este experiența, inteligența și motivația unui specialist.

Salariu (cât câștigă dezvoltatorul back-end)

Salariu începând cu 16.09.2019

Rusia 40.000-100.000 ₽

Moscova 80.000-300.000 ₽

Pași în carieră și perspective

Din punctul de vedere al unui dezvoltator back-end, după ce stăpânești abilitățile unui dezvoltator front-end, există o cale directă către un dezvoltator full-stack. Pentru o creștere ulterioară, este necesar să învățați în mod constant lucruri noi: să studiați în detaliu tehnologiile de dezvoltare produse software, configurarea și setările sistemelor de servicii.

Tranzițiile din cadrul departamentelor sunt uneori tratate diferit. Cineva este pur și simplu mai obișnuit să vadă orice schimbări de carieră în cadrul unei companii prin prisma creșterii locurilor de muncă. Cineva nu consideră posibilă schimbarea câmpului de activitate, chiar dacă este adiacent celui actual. Alții, în principiu, sunt convinși că trecerea de la departament la departament înseamnă că o persoană nu ia poziția „nici pește, nici carne” și este puțin probabil să realizeze ceva semnificativ.



În același timp, unii angajatori salută acest lucru în orice mod posibil și consideră că este ceva de genul unei măsuri de siguranță împotriva epuizării - o persoană va schimba atenția, va schimba un departament sau un departament, dar nu va schimba locul de muncă în sine întreg.


Numele meu este Kostya și lucrez la QIWI de aproape 4 ani. Astăzi vă voi spune cum am trecut cu succes de la dezvoltarea frontend la backend.

În față

Am fost la QIWI de la sfârșitul anului 2014, am început să lucrez ca dezvoltator de aplicații iOS și, în principiu, am lucrat la dezvoltarea unui portofel QIWI timp de câțiva ani. În același timp, nu pot spune că a fost plictisitor - sarcinile au fost destul de diferite și în cadrul aceleiași aplicații: am integrat portofelul cu celelalte servicii ale noastre, am remediat erori, am strâns animația. În plus, am avut o experiență interesantă în crearea unei aplicații pentru Apple Watch. Apoi și-a extins puțin atenția și a lucrat la aplicația iOS pentru Conștiință.



Și cam atunci am început să trec încet la backing. În ceea ce privește o metodologie agilă, acest lucru este chiar convenabil - am schimbat, în primul sprint aș putea face unele sarcini pe backend, iar în al doilea aș putea integra API-ul, pe care l-am scris.


Dar backend-ul din acel moment avea prea puțini dezvoltatori și un backlog prea greu, așa că am ajuns să trec complet la backend. Ceea ce fac acum sunt sarcini de backend clasice - scrierea codului în microserviciile noastre, remedierea erorilor, refactorizarea, învățarea Kotlin. Există posibilitatea de a lucra la un produs proaspăt al companiei - QIWI Investor.


Apropo, nu pot spune că în acești doi ani s-a dovedit cumva să se osifice în față, am realizat clar că și acolo există unde să ne dezvoltăm. De exemplu, pot vedea ce se întâmplă în echipă dezvoltare mobilă, și înțeleg că, dacă aș fi rămas acolo, aș fi continuat să mă dezvolt mai departe cu băieții.


Așadar, a existat o situație câștig-câștig - am vrut să ajut echipa și produsul (preponderența în dezvoltare nu era puternic în direcția backend-ului) și să dobândesc noi cunoștințe. Liderii echipei au înțeles totul și m-au lăsat să plec fără nicio reclamație, și produsul.


În plus, am vrut să-mi diversific cunoștințele pentru a nu fi legat de o singură platformă (Android este un pic neplăcut pentru mine, dar Apple încă pierde teren). Ei bine, a existat dorința, dacă se întâmplă ceva, să poți lua și să-ți faci o aplicație (atât în ​​față, cât și în spate), dacă apare brusc o idee rece. Într-adevăr nu a fost util.

Backend


Desigur, prima problemă cu care vă confruntați cu o astfel de tranziție sunt lacunele din hardware. În cazul meu, acestea au fost câteva subtilități de lucru cu baze de date, dar atât capacitatea de a învăța, cât și echipa au ajutat - băieții sunt receptivi și întotdeauna gata să ajute și să explice ceva în detaliu. În QIWI, în principiu, totul este în regulă cu antrenamentul în toate etapele, indiferent dacă ești chiar junior la începutul muncii tale, chiar decide asta și schimbă-ți domeniul câțiva ani mai târziu.


Nimeni nu s-a enervat că la început clar nu am funcționat la fel de eficient, pentru că a trebuit să intru mult (dar pe termen lung, echipa încă câștigă).


Desigur, chiar și înainte am avut puțină experiență în diferite domenii - jocuri mobile și web, dar toate acestea au fost mai degrabă încercări de a găsi ceva al meu, mai degrabă decât de a completa experiența practică serioasă.

Impresii din backend după frontend

Fără funcție UI. Deloc. Anterior, acum trebuia să omori remedierea erorilor în interfața de utilizare - nu. Dezavantajele acestei situații sunt că utilizatorul final nu vede în mod specific rezultatele muncii mele, așa cum a fost în partea din față. Am încercat să stabilesc care este mai dificil - în spate sau în față și am realizat că (pentru mine personal) a fost întotdeauna mai greu să lucrez cu multithreading și stiva de rețea. Și aici nu este atât de important dacă ești pentru față sau pentru spate. În față, tocmai m-am confruntat cu astfel de sarcini pentru prima dată, fără pregătire, și pe partea din spate cu o experiență.


Puteți câștiga experiență și puteți face ceva interesant în orice domeniu, ar exista dorință și perseverență, aici practicile converg - să faceți ceva (și să faceți bine), și astfel încât să funcționeze fiabil și să fie ușor susținut. Mai mult, prezența sau absența experienței în față nu este atât de critică pentru backend. Dacă un dezvoltator ia în considerare toate lucrurile mici, se gândește singur la cazuri de colț și în general înțelege modul în care va fi folosit API-ul său, atunci va face totul bine fără cunoștințe frontale.


Îmi este mai ușor să detectez posibile probleme tocmai pentru că știu particularitățile implementării aplicațiilor noastre mobile. Dar acesta nu este un fel de superputere - acesta este un set de cunoștințe pe care orice backend, care lucrează adesea cu fronturi, le dobândește într-un fel sau altul.

Care este linia de jos

Dezvoltarea backend-ului a devenit o altă experiență bună pentru mine - am învățat cum să scriu cod și să conduc recenzii, să mă gândesc la arhitectură. Acest lucru este de fapt interesant.


Dar, în același timp, încercând să trăiesc atât în ​​față, cât și în spate, nu voi spune că în acest caz aș alege imediat backend-ul chiar la începutul carierei mele. Este încă important pentru mine să văd și să înțeleg modul în care utilizatorii percep produsul meu. Cu backend-ul, totul este destul de fantomatic.


Cel mai probabil, alegând o zonă acum, aș merge la gamedev sau web frontend. Web-ul este încă o platformă bună pentru lansarea de noi produse, fără a fi înfiorător și greu de înțeles. Toate aceste tutoriale din codul spaghetti și callback-hell sunt departe, din fericire.

Frontend este dezvoltare interfața cu utilizatorulși funcționalitate care rulează pe partea clientului a unui site web sau a unei aplicații. Acest tip de dezvoltare include tot ceea ce vede utilizatorul atunci când deschide o pagină web. Un dezvoltator frontend colaborează cu designeri, programatori și analiști UX pentru a crea un produs ușor de utilizat și foarte căutat.

Pentru a înțelege clar ce este dezvoltarea frontend-ului, deschideți o pagină a oricărui site - veți vedea o interfață în fața dvs. Făcând clic dreapta, puteți vizualiza codul pentru această pagină în browserul dvs.

Acest cod este un exemplu de lucru al dezvoltatorului frontend, este descărcat în browserul utilizatorului și îl puteți vedea cu ochii voștri. Codul paginii descrie tot ceea ce vedeți în fața dvs.: culori, aspect, fonturi, dispunerea elementelor grafice și așa mai departe.

Dezvoltarea front-end include:

  • HTML (HyperText Markup Language)- limbajul de marcare a documentelor, cu care se formează structura paginii: titluri, paragrafe, liste și așa mai departe;
  • CSS (Foi de stil în cascadă)- un limbaj pentru descrierea și stilizarea aspectului unui document. Datorită codului CSS, browserul dvs. înțelege exact cum să afișați elementele. CSS setează culorile și parametrii fonturilor, determină modul în care vor fi poziționate diferitele blocuri ale site-ului și așa mai departe. De asemenea, vă permite să afișați același document în diferite stiluri, de exemplu, pentru tipărire (normală sau Braille), afișarea transmisiei pe ecran sau citirea prin voce;
  • JavaScript este un limbaj creat pentru a da viață paginilor web. Sarcina sa este de a răspunde la acțiunile utilizatorului, procesează clicurile mouse-ului, mișcările cursorului, apăsările tastelor. De asemenea, trimite cereri către server și încarcă date fără a reîncărca pagina, vă permite să introduceți mesaje și multe altele.

Ce este dezvoltarea backend-ului?

Dezvoltarea backend este un set de hardware și software care implementează logica site-ului. Pur și simplu, acesta este ceea ce este ascuns de ochii utilizatorului și se întâmplă în afara browserului și computerului său.

De exemplu, când introduceți o interogare pe pagina motorului de căutare și apăsați tasta introduce, frontend se termină și backend începe. Solicitarea dvs. este trimisă către server Google sau Yandex unde se află algoritmii de căutare. Aici se întâmplă toată „magia”. De îndată ce informațiile pe care le căutați apar pe monitor, vă întoarceți din nou în zona frontend.

În general, un server este același computer, doar mai puternic. Stochează date și răspunde la solicitările utilizatorilor.

Backend este procesul de conectare a serverului cu utilizatorul.

Dezvoltatorii de backend pot folosi orice instrumente disponibile pe serverul lor. El are dreptul de a alege oricare dintre limbajele de programare universale, de exemplu, Ruby, PHP, Python, Java.

De asemenea, este utilizat pentru dezvoltarea backend-ului diferite sisteme gestionarea bazei de date:

  1. MySQL;
  2. PostgreSQL;
  3. SQLite;
  4. MongoDB.

În funcție de tipul de produs, responsabilitățile unui dezvoltator de backend pot varia foarte mult. Un astfel de specialist poate crea și integra baze de date, poate asigura securitatea, poate crea tehnologii Rezervați copiași recuperare.

Cum interacționează frontendul și backend-ul?

Interacțiunea dintre frontend și backend are loc într-un cerc: frontendul trimite informații utilizatorului către backend, unde este procesat și returnat înapoi, luând o formă ușor de înțeles.

De regulă, diferiți specialiști sunt angajați în aceste tipuri de muncă, dar este de dorit ca fiecare dintre ei să înțeleagă principiile după care lucrează colegii. De exemplu, este important ca un proiectant de interfață să știe cel puțin în termeni generali care este backend-ul proiectului pe care îl face. Acest lucru îl va ajuta să evalueze în mod adecvat ce capacități tehnice ar putea avea site-ul sau aplicația.

Există mai multe opțiuni pentru interacțiunea dintre frontend și backend:

  • O cerere HTTP este trimisă direct către server, acesta caută informații, le încorporează în șablon și le returnează ca pagină HTML;
  • Opțiune de scule AJAX (JavaScript și XML asincrone)... În acest caz, cererea trimite JavaScriptîncărcat în browser și răspunsul vine Format XML sau JSON;
  • Aplicații cu o singură pagină care încarcă date fără a actualiza pagina. Acest lucru se face și atunci când Ajutor AJAX sau cadre Unghiular și Ember;
  • Ember sau bibliotecă Reacţiona ajuta la utilizarea aplicației atât pe server, cât și pe client. Frontend și backend comunică prin AJAX și HTML care sunt procesate pe server.

După cum putem vedea, dezvoltarea modernă este un proces complex și pe mai multe niveluri care este împărțit în două părți: client și server. Arsenalul programatorilor frontend și backend are o mulțime de instrumente, alegerea cărora depinde de sarcinile și complexitatea proiectului. Ambele tipuri de dezvoltare includ componente tehnice și creative.

Responsabilitățile dezvoltatorilor frontend și backend sunt de obicei separate, dar există momente în care un programator trebuie să rezolve problemele care apar atât pe partea serverului, cât și pe partea clientului. Adesea pe piață puteți găsi specialiști care se simt încrezători atât în ​​frontend, cât și în backend și care pot combina două tipuri de muncă.

Puteți începe călătoria în dezvoltarea frontend-ului și backend-ului cu un curs Skillbox de 12 luni. Este potrivit pentru începători și programatori cu puțină experiență. Pe parcursul unui an, participanții la curs vor învăța în practică principalele limbaje de programare și își vor crea propriul portofoliu care îi va ajuta să găsească un loc de muncă promițător și bine plătit.