
Тарҷума
Тачрибаи мо нишон медихад, ки кор-кунони гайритехникй ва худомузй аксар вакт на ба принципхои назариявй, балки ба усулхои эвристикй такья мекунанд.
Эвристика намунаҳо ва қоидаҳои собитшудаест, ки таҳиякунанда аз амалия омӯхтааст. Онҳо метавонанд ба таври комил ё ба андозаи маҳдуд кор накунанд, аммо онҳо ба қадри кофӣ хуб кор мекунанд ва андешаи ҷиддиро талаб намекунанд. Инҳоянд чанд намунаи эвристика:
- "Истифода баред
$(document).ready(function(){})барои оғоз кардани код дар сайтҳои jQuery" - «Дизайн
var self = thisбарои занг задан ба усул дар функсияи бозпас занг задан лозим аст" - "Функсияҳои тирчаҳо оператор надоранд
return»
Дар айни замой принципи назариявиро барои чустучуи роххои халли проблемахои дигар истифода бурдан мумкин аст. Он ҳамеша дуруст аст ва аксар вақт сохтори кори як унсури мушаххасро муайян мекунад. Принсипҳои назариявӣ, масалан:
Лутфан таваҷҷӯҳ намоед, ки мо танҳо мисолҳои эвристикаро дар нохунак мегузорем, то хусусияти ҳунарии эвристикаро дар муқоиса бо сахтгирии чаҳорчӯбаи назариявӣ таъкид кунем. Ҳеҷ яке аз мисолҳои эвристикӣ ба таври умум қобили татбиқ нестанд, аммо онҳо дар ҳолатҳои кофӣ кор мекунанд, ки таҳиягароне, ки онҳоро истифода мебаранд, коди кориро бидуни фаҳмидани пурраи он чӣ тавр кор мекунанд, мегиранд.
Далелҳо ба тарафдории равиши назариявӣ
Мо аксар вакт пай бурдем, ки кор-кунони гайритехникй ба халли масъалахо бо истифода аз принципхои назариявй майл надоранд. Ин одатан аз он сабаб аст, ки онҳо дар ибтидои касби худ имкони омӯхтани онҳоро надоштанд ва азбаски эвристика қаноатбахш кор мекунад, онҳо аз онҳо истифода мебаранд.
Аммо, сарфи назар аз мураккабии намоён, омӯзиши назария метавонад хеле муфид бошад. Барои чӣ? Зеро назария ба шумо имкон медиҳад, ки боварӣ ҳосил кунед, ки ҳалли шумо кор мекунад ва инчунин мустақилона ба саволҳои нав бидуни ҷустуҷӯи роҳи ҳалли ягон каси дигар ҷавоб гиред. Дар кӯтоҳмуддат, алгоритмҳои эвристикӣ метавонанд як ҳалли оддӣ ва зуд ба назар расанд, аммо аксар вақт ба ҳалли камтар аз идеалҳо оварда мерасонанд - агар умуман вуҷуд дошта бошанд.
Гузашта аз ин, бо такя ба эвристика, шумо ҳеҷ гоҳ ҳалли воқеан мушкилотро намеомӯзед. Эҳтимол аксар вақт шумо метавонед як роҳи ҳалли корро пайдо кунед, аммо дер ё зуд шумо ба нуқтаи сарбастае хоҳед расид, ки шумо роҳи берунро намебинед. Барномасозони C&P дар кори худ ба эвристика такя мекунанд.
Меъёри сатҳи маҳорати таҳиякунанда
Ҳангоми мусоҳиба бо таҳиягарони frontend, мо ба онҳо мушкилоти барномасозӣ медиҳем ва ба онҳо мегӯем, ки онҳо метавонанд аз ҳама гуна манбаъҳо, хоҳ Google ё Stack Overflow истифода баранд. Бо ин роҳ шумо метавонед ба осонӣ муайян кунед, ки таҳиякунанда пайрави эвристикӣ ё назария аст.
Аввалинҳо, бидуни истисно, кодро аз мисолҳои бештар ё камтар мувофиқ аз Stack Overflow нусхабардорӣ мекунанд. Танҳо вақте ки код тавре ки ба нақша гирифта шудааст, кор накунад, онҳо онро барои мувофиқ кардани худ оғоз мекунанд. Аксар вақт онҳо ин корро намекунанд.
Охирин майл ба ҷустуҷӯи ҷавобҳо дар ҳуҷҷатҳои API. Дар он ҷо онҳо маълумотро дар бораи чанд параметрҳои функсияи мушаххас ё синтаксиси мушаххаси шакли васеъшудаи амволи дилхоҳ CSS пайдо мекунанд.
Аллакай дар панҷ дақиқаи аввали мусоҳиба шумо метавонед дақиқ муайян кунед, ки номзад кадом барномасоз аст.
Мисол
Биёед таҳиягар Биллро мисол гирем. Вай якчанд курсҳои омӯзишӣ гирифт, як қатор мушкилоти JavaScript-ро ҳал кард ва дар вақти холӣ вебсайтҳо менавишт, аммо JavaScript-ро "воқеан" намеомӯзад.
Рӯзе Билл бо чунин объект дучор меояд:
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 }
}
Чунин объект метавонад рӯйхати корбаронро нишон диҳад ва оё онҳо барои як чорабинии мушаххас сабти ном шудаанд ё не.
Биёед бигӯем, ки Билл бояд рӯйхати корбарони сабтиномшударо дарёфт кунад. Ба ибораи дигар, онҳоро филтр кунед. Ӯ дар саросари код омад, ки дар он усули .filter() барои филтр кардани рӯйхат истифода мешавад. Аз ин рӯ, ӯ чунин кӯшиш мекунад:
const attendees = usersById.filter(user => user.registered);Ва ин аст он чизе ки ӯ ба даст меорад:
TypeError: usersById.filter is not a function "Ин як навъ сафсата аст" фикр мекунад Билл, зеро ӯ кодеро дид, ки дар он .filter() ҳамчун филтр амал мекард.
Масъала дар он аст, ки Билл ба усули эвристикӣ такя мекард. Ӯ инро намефаҳмад filter усулест, ки дар массивҳо муайян карда шудааст, дар ҳоле ки usersById - объекти оддие, ки усул надорад filter.
Билл Гуглс ошуфтааст "филтри JavaScript" Ӯ бисёр зикри массивҳоро пайдо мекунад ва дарк мекунад, ки ӯ бояд рӯй гардонад usersById ба массив. Сипас бо дархости "Javascript объектро ба массив табдил медиҳад» ӯ мисолҳоро дар бораи Stack Overflow истифода мебарад Object.keys(). Пас аз ин ӯ кӯшиш мекунад:
const attendees = Object.keys(usersById).filter(user => user.registered); Ин дафъа ягон хатогӣ нишон дода намешавад, аммо ба ҳайрат Билл, майдон attendees холй мемонад.
Пойнт аст, ки Object.keys() калидҳои объектро бармегардонад, аммо арзишҳои онро не. Аслан, номи тағирёбанда user ба осонӣ гумроҳкунанда аст, зеро он объект нест user, ва идентификатор, яъне сатр. Азбаски атрибут registered барои сатрҳо муайян нашудааст, filter ҳар як вурудро бардурӯғ арзёбӣ мекунад ва массив холӣ мебарояд.
Билл ба ҷавобҳо дар бораи Stack Overflow бодиққат назар мекунад ва тағироти зеринро ба амал меорад:
const attendees = Object.keys(usersById).filter(id => usersById[id].registered); Ин дафъа натиҷа беҳтар аст: ["5", "27", "39"]. Аммо Билл мехост, ки ашёи меҳмононро гирад, на шахсияти онҳоро.
Барои фаҳмидани он ки чӣ гуна меҳмононро филтр кардан мумкин аст, Билл хашмгинро ҷустуҷӯ мекунад "филтри объекти JavaScript", натиҷаҳои ҷустуҷӯро дар Stack Overflow тафтиш мекунад ва пайдо мекунад бо рамзи зерин:
Object.filter = (obj, predicate) =>
Object.keys(obj)
.filter( key => predicate(obj[key]) )
.reduce( (res, key) => (res[key] = obj[key], res), {} );Билл ин сатрҳоро нусхабардорӣ мекунад ва кӯшиш мекунад:
const attendees = Object.filter(usersById, user => user.registered); Ҳама чиз кор мекунад - гарчанде ки чаро маълум нест. Билл намефаҳмад, ки ин барои чӣ аст reduce ва чӣ тавр истифода бурда мешавад. Гузашта аз ин, Билл намефаҳмад, ки вай танҳо барои объекти глобалӣ муайян кардааст Object усули нави гайристандартй.
Аммо Билл парво надорад - ин кор мекунад! Ӯ ҳанӯз ба оқибатҳои он таваҷҷӯҳ намекунад.
Билл чӣ хато кард?
Билл барои ҳалли мушкилот усули эвристикиро санҷида, бо мушкилоти зерин дучор омад:
- Истифодаи
.filter()дар бораи тағирёбанда, Билл гирифтTypeError. Ӯ инро намефаҳмидfilterдар объектхои мукаррарй ошкор карда намешавад. - У мурочиат кард
Object.keys()«объектро ба массив табдил додан», аммо ин худ аз худ ягон натичае набахшид. Ба ӯ лозим буд, ки массиви арзишҳои объектиро эҷод кунад. - Ҳатто пас аз гирифтани арзишҳо ва истифодаи онҳо ҳамчун шарти филтр, ӯ ба ҷои объектҳои корбаре, ки бо ин идентификаторҳо алоқаманданд, танҳо идентификаторҳоро гирифт. Сабаб дар он аст, ки массиви филтршуда ID-ҳоро дар бар мегирад, на объектҳои корбар.
- Бо гузашти вақт, Билл аз ин равиш даст кашид ва дар Интернет роҳи ҳалли корро ёфт. Бо вуҷуди ин, ӯ то ҳол намефаҳмад, ки ин чӣ гуна кор мекунад - ва ӯ барои фаҳмидани он вақтро сарф намекунад, зеро ӯ корҳои дигар дорад.
Ин як мисоли сунъӣ аст, аммо мо дидаем, ки таҳиягарон мушкилотро бо ҳамон тарз ҳал мекунанд. Барои ҳалли самараноки онҳо, шумо бояд аз усулҳои эвристикӣ дур шавед ва назарияро омӯзед.
Биёед ба асосҳо гузарем
Агар Билл тарафдори равиши назариявӣ мебуд, раванд чунин хоҳад буд:
- Воридҳои додашударо муайян кунед ва натиҷаҳои дилхоҳро аз рӯи хосиятҳои онҳо муайян кунед: "Ман объекте дорам, ки калидҳои он сатрҳо мебошанд, ки ID-ро ифода мекунанд ва арзишҳояшон объектҳои истифодабарандагон мебошанд. Ман мехоҳам массиверо гирам, ки арзишҳояш объектҳои корбар бошанд, аммо танҳо объектҳои корбари ба қайд гирифташуда"
- Бифаҳмед, ки чӣ тавр ба воситаи объект такрор кардан мумкин аст: "Ман медонам, ки ман метавонам массиви калидҳоро дар объект тавассути занг занам
Object.keys(). Ман мехоҳам массив гирам, зеро массивҳо итератсияро дастгирӣ мекунанд". - Дарк кунед, ки ин усул барои ба даст овардани калидҳо кӯмак мекунад ва шумо бояд калидҳоро ба арзишҳо табдил диҳед ва дар хотир доред
mapусули возеҳи эҷоди массиви нав тавассути тағир додани арзишҳои массиви дигар аст:Object.keys(usersById).map(id => usersById[id]) - Бубинед, ки шумо ҳоло массиви филтршавандаи объектҳои фармоишӣ доред, ки дорои арзишҳои воқеии шумо филтр кардан мехоҳед:
Object.keys(usersById).map(id => usersById[id]).filter(user => user.registered)
Агар Билл ин роҳро тай мекард, ӯ метавонист барои мо кор кунад.
Чаро одамон бештар ба назария мурочиат намекунанд?
Баъзан онҳо танҳо ӯро намешиносанд. Аксар вақт, онҳо хеле банд ҳастанд, ки барои омӯхтани ин роҳи ҳалли мушкилот вақт ҷудо мекунанд - онҳо танҳо бояд корҳоро дуруст кунанд. Онҳо таваккал мекунанд, ки ин равишро ба одат табдил диҳанд, ки монеаи рушди маҳораташон мегардад.
Барои роҳ надодан ба чунин хатогиҳо, ҳамеша аз назария оғоз кунед. Дар ҳар як марҳилаи раванд фикр кунед, ки шумо бо кадом маълумот кор мекунед. Ба ҷои он ки ҳама вақт ба намунаҳои шинос такя кунед, намудҳои ибтидоии додаҳоро баррасӣ кунед: массив, объект, сатр ва ғайра. Вақте ки шумо функсия ё усулро истифода мебаред, ҳуҷҷатҳоро тафтиш кунед, то боварӣ ҳосил кунед, ки шумо аниқ медонед, ки кадом намуди маълумотро дастгирӣ мекунад, кадом далелҳоро мегирад ва натиҷаи он чист.
Бо ин равиш, шумо метавонед дар кӯшиши аввал роҳи ҳалли кориро пайдо кунед. Шумо метавонед ба дурустии он боварӣ ҳосил кунед, зеро шумо амалҳои худро дар асоси воридот ва маълумоти дилхоҳи баромад интихоб кардаед. Ба асосҳои ҳар як амалиёт (намудҳои додаҳо ва арзишҳои баргардонидан) дохил шавед, на забони норавшани тиҷорӣ (ба мисли “корбарони сабтиномшуда”).
Манбаъ: www.habr.com
