Teoria në vend të heuristikës: duke u bërë zhvillues më të mirë frontend

Teoria në vend të heuristikës: duke u bërë zhvillues më të mirë frontend

përkthim Duke u bërë një zhvillues më i mirë i frontit duke përdorur bazat në vend të heuristikës

Përvoja jonë tregon se zhvilluesit jo teknikë dhe zhvilluesit autodidakt shpesh mbështeten jo në parime teorike, por në metoda heuristike.

Heuristikat janë modele dhe rregulla të provuara që zhvilluesi i ka mësuar nga praktika. Ata mund të mos funksionojnë në mënyrë të përsosur ose në një masë të kufizuar, por ato funksionojnë mjaft mirë dhe nuk kërkojnë mendim serioz. Këtu janë disa shembuj të heuristikës:

  • "Përdorni $(document).ready(function(){}) për inicializimin e kodit në sajtet jQuery"
  • "Dizajn var self = this kërkohet për të thirrur një metodë në një funksion të kthimit të thirrjes"
  • "Funksionet e shigjetës nuk kanë operatorë return»

Në të njëjtën kohë, parimi teorik mund të përdoret për të gjetur zgjidhje për probleme të tjera. Është pa ndryshim e vërtetë dhe shpesh përcakton vetë strukturën e funksionimit të një elementi të caktuar. Parimet teorike përfshijnë, për shembull:

Ju lutemi vini re se ne vendosim vetëm shembuj të heuristikës në thonjëza për të theksuar natyrën artizanale të heuristikës në krahasim me ashpërsinë e kornizës teorike. Asnjë nga shembujt heuristikë nuk është universalisht i zbatueshëm, por ato funksionojnë në situata të mjaftueshme që zhvilluesit që i përdorin të marrin kodin e punës pa e kuptuar plotësisht se si funksionon.

Argumente në favor të qasjes teorike

Shpesh kemi zbuluar se zhvilluesit jo-teknikë hezitojnë të zgjidhin problemet duke përdorur parime teorike. Kjo zakonisht ndodh sepse ata nuk kanë pasur mundësi t'i mësojnë ato herët në karrierën e tyre dhe për shkak se heuristikat funksionojnë në mënyrë të kënaqshme, ata vazhdojnë t'i përdorin ato.

Megjithatë, pavarësisht nga kompleksiteti i dukshëm, mësimi i teorisë mund të jetë shumë i dobishëm. Per cfare? Sepse teoria do t'ju lejojë të ndiheni të sigurt se zgjidhja juaj funksionon, dhe gjithashtu të merrni në mënyrë të pavarur përgjigje për pyetje të reja, pa pasur nevojë të kërkoni zgjidhjet e dikujt tjetër. Në afat të shkurtër, algoritmet heuristike mund të duken si një zgjidhje e thjeshtë dhe e shpejtë, por shpesh do të çojnë në zgjidhje më pak se ideale - nëse ka fare.

Për më tepër, duke u mbështetur në heuristikë, nuk do të mësoni kurrë të zgjidhni me të vërtetë problemet. Ndoshta mjaft shpesh do të jeni në gjendje të gjeni një zgjidhje funksionale, por herët a vonë do të arrini në një qorrsokak nga i cili nuk do të shihni një rrugëdalje. Programuesit C&P mbështeten në heuristikat në punën e tyre.

Kriteri i nivelit të aftësive të zhvilluesit

Kur intervistojmë zhvilluesit frontend, ne u japim atyre një sfidë programimi dhe u themi se janë të lirë të përdorin çdo burim, qoftë Google ose Stack Overflow. Në këtë mënyrë ju mund të përcaktoni lehtësisht nëse zhvilluesi është një ndjekës heuristik apo teorik.

Të parët, pa asnjë përjashtim, kopjojnë kodin nga shembuj pak a shumë të përshtatshëm nga Stack Overflow. Vetëm kur kodi nuk funksionon siç është planifikuar, ata do të fillojnë ta rregullojnë atë për t'iu përshtatur vetes. Shpesh ata nuk arrijnë ta bëjnë këtë.

Këta të fundit priren të kërkojnë përgjigje në dokumentacionin API. Aty ata gjejnë informacion se sa parametra merr një funksion i veçantë, ose sintaksën specifike të formës së zgjeruar të vetive të dëshiruar CSS.

Tashmë në pesë minutat e para të intervistës, ju mund të përcaktoni me saktësi se çfarë lloj programuesi është kandidati.

Shembull

Le të marrim si shembull zhvilluesin Bill. Ai mori disa kurse trajnimi, zgjidhi një sërë problemesh JavaScript dhe shkruante faqe interneti në kohën e tij të lirë, por ai nuk studioi "në të vërtetë" JavaScript.

Një ditë Bill has një objekt si ky:

const usersById = {
    "5": { "id": "5", "name": "Adam", "registered": true },
    "27": { "id": "27", "name": "Bobby", "registered": true },
    "32": { "id": "32", "name": "Clarence", "registered": false },
    "39": { "id": "39", "name": "Danielle", "registered": true },
    "42": { "id": "42", "name": "Ekaterina", "registered": false }
}

Një objekt i tillë mund të shfaqë një listë të përdoruesve dhe nëse ata janë regjistruar për një ngjarje të caktuar.

Le të themi se Bill duhet të marrë një listë të përdoruesve të regjistruar. Me fjalë të tjera, filtrojini ato. Ai hasi në kodin në të cilin metoda .filter() përdoret për të filtruar listën. Kështu që ai provon diçka të tillë:

const attendees = usersById.filter(user => user.registered);

Dhe kjo është ajo që ai merr:

TypeError: usersById.filter is not a function

"Kjo është një lloj marrëzie," mendon Bill, sepse ai pa kodin në të cilin .filter() ka vepruar si filtër.

Problemi është se Bill u mbështet në një metodë heuristike. Ai nuk e kupton këtë filter është një metodë e përcaktuar në vargje, ndërsa usersById - një objekt i zakonshëm që nuk ka një metodë filter.

Bill Googles i hutuar "filtri javascript" Ai gjen shumë përmendje të vargjeve dhe e kupton se duhet të kthehet usersById në një grup. Pastaj me kërkesë "javascript kthejnë objektin në grup» ai gjen shembuj në Stack Overflow duke përdorur Object.keys(). Pas kësaj ai përpiqet:

const attendees = Object.keys(usersById).filter(user => user.registered);

Këtë herë nuk shfaqet asnjë gabim, por për habinë e Bill-it, fusha attendees mbetet bosh.

Fakti është se Object.keys() kthen çelësat e objektit, por jo vlerat e tij. Në thelb, emri i ndryshores user lehtësisht mashtruese sepse nuk është objekt user, dhe identifikuesin, domethënë vargun. Që nga atributi registered nuk është përcaktuar për vargjet, filter vlerëson çdo hyrje si false, dhe grupi del bosh.

Bill hedh një vështrim më të afërt në përgjigjet në Stack Overflow dhe bën ndryshimin e mëposhtëm:

const attendees = Object.keys(usersById).filter(id => usersById[id].registered);

Këtë herë rezultati është më i mirë: ["5", "27", "39"]. Por Bill donte të merrte objektet e vizitorëve, jo ID-të e tyre.

Për të kuptuar se si të filtrohen vizitorët, Bill i mërzitur kërkon për "Filtri i objektit javascript", shqyrton rezultatet e kërkimit në Stack Overflow dhe gjen këtë përgjigje me kodin e mëposhtëm:

Object.filter = (obj, predicate) => 
    Object.keys(obj)
          .filter( key => predicate(obj[key]) )
          .reduce( (res, key) => (res[key] = obj[key], res), {} );

Bill kopjon këto rreshta dhe përpiqet:

const attendees = Object.filter(usersById, user => user.registered);

Gjithçka funksionon - megjithëse nuk është e qartë pse. Bill nuk e kupton se për çfarë është reduce dhe si përdoret. Për më tepër, Bill nuk e kupton se ai sapo përcaktoi për objektin global Object metodë e re jo standarde.

Por Bill-it nuk i intereson - funksionon! Ai ende nuk është i interesuar për pasojat.

Çfarë bëri Bill gabim?

Bill provoi një metodë heuristike për të zgjidhur problemin dhe hasi në problemet e mëposhtme:

  1. Duke përdorur .filter() në variablin, Bill mori TypeError. Ai nuk e kuptoi këtë filter nuk zbulohet në objekte të zakonshme.
  2. Ai aplikoi Object.keys()për ta "shndërruar objektin në një grup", por kjo në vetvete nuk solli asnjë rezultat. Ai duhej të krijonte një grup vlerash objektesh.
  3. Edhe pas marrjes së vlerave dhe përdorimit të tyre si kusht për filtrim, ai mori vetëm identifikues në vend të objekteve të përdoruesit të lidhur me ata identifikues. Kjo ndodh sepse grupi i filtruar përmbante ID, jo objekte të përdoruesit.
  4. Me kalimin e kohës, Bill e braktisi këtë qasje dhe gjeti një zgjidhje funksionale në internet. Megjithatë, ai ende nuk e kupton se si funksionon - dhe nuk do të humbasë kohë duke u përpjekur ta kuptojë, sepse ka gjëra të tjera për të bërë.

Ky është një shembull artificial, por ne kemi parë që zhvilluesit të zgjidhin problemet në të njëjtën mënyrë shumë herë. Për t'i zgjidhur ato në mënyrë efektive, duhet të largoheni nga metodat heuristike dhe të studioni teorinë.

Le të zbresim në bazat

Nëse Bill do të ishte një ithtar i qasjes teorike, procesi do të dukej kështu:

  1. Identifikoni hyrjet e dhëna dhe përcaktoni rezultatet e dëshiruara - për sa i përket vetive të tyre: "Unë kam një objekt, çelësat e të cilit janë vargje që përfaqësojnë ID dhe vlerat e të cilit janë objekte që përfaqësojnë përdoruesit. Unë dua të marr një grup, vlerat e të cilit do të jenë objekte të përdoruesit - por vetëm objekte të regjistruara të përdoruesit"
  2. Kuptoni se si të përsërisni përmes një objekti: "E di që mund të marr grupin e çelësave në një objekt duke telefonuar Object.keys(). Unë dua të marr një grup sepse vargjet mbështesin përsëritjen".
  3. Kuptoni se kjo metodë ndihmon për të marrë çelësat, dhe ju duhet t'i transformoni çelësat në vlera dhe mbani mend rreth map është një metodë e dukshme për krijimin e një grupi të ri duke transformuar vlerat e një grupi tjetër:
    Object.keys(usersById).map(id => usersById[id])
  4. Shihni që tani keni një grup të filtueshëm të objekteve të personalizuara që përmban vlerat aktuale që dëshironi të filtroni:
    Object.keys(usersById).map(id => usersById[id]).filter(user => user.registered)

Nëse Bill do të kishte shkuar në këtë rrugë, ai mund të kishte punuar për ne.

Pse njerëzit nuk i drejtohen më shpesh teorisë?

Ndonjëherë ata thjesht nuk e njohin atë. Më shpesh sesa jo, ata janë shumë të zënë për të gjetur kohë për të mësuar këtë mënyrë të zgjidhjes së problemeve - ata thjesht duhet t'i bëjnë gjërat të funksionojnë. Ata rrezikojnë ta kthejnë këtë qasje në një zakon që do të bëhet pengesë për zhvillimin e aftësive të tyre.

Për të shmangur gabime të tilla, gjithmonë filloni me teori. Në çdo fazë të procesit, mendoni se me cilat të dhëna keni të bëni. Në vend që të mbështeteni gjatë gjithë kohës në modelet e njohura, merrni parasysh llojet primitive të të dhënave: grup, objekt, varg, etj. Kur përdorni një funksion ose metodë, kontrolloni dokumentacionin për t'u siguruar që dini saktësisht se cilat lloje të dhënash mbështet, çfarë argumentesh merr dhe cili është rezultati i tij.

Me këtë qasje, ju do të jeni në gjendje të gjeni një zgjidhje funksionale që në provën e parë. Ju mund të jeni i sigurt për korrektësinë e tij, sepse keni zgjedhur në mënyrë specifike veprimet tuaja bazuar në të dhënat e dhëna hyrëse dhe të dëshiruara dalëse. Hyni në bazat e secilit operacion (llojet e të dhënave dhe vlerat e kthimit), në vend të gjuhës së paqartë të biznesit (si "përdoruesit e regjistruar").

Burimi: www.habr.com

Bleni një host të besueshëm për faqet me mbrojtje DDoS, serverë VPS VDS 🔥 Bleni hosting të besueshëm të faqeve të internetit me mbrojtje DDoS, servera VPS VDS | ProHoster