3

Mõni aeg tagasi jõudsin veendumusele, et programmeerijakandidaadilt otse intervjuul koodi kirjutamise nõudmine on absoluutselt vajalik. Nüüd otsikski ülesandeid, mida kandidaatidele esitada.

Loomulikult on olemas vana-hea Fizz-Buzz, aga otsiks veel sarnaseid, mis kogenud programmeerijale on käkitegu, aga oskamatu nurka suruvad.

Huvi pakuksid ka ülesanded, mis testiksid mingi teatud programmeerimiskeele oskust. Seda eeskätt sellel otstarbel, et kui keegi kirjutab oma CV-s et on ekspert keeles X, siis testida, kas see ka tegelikult nõnda on.

Ülesanne peaks mõistagi olema piisavalt väike, et vastuse saaks väheste ridadega paberile kirjutada.

flag

9 Answers

5

See ehk ei puutu tööintervjuud, kuid koolis on küll üli lihtne testida, kes saab asjast aru ja kes mitte. Võib näidata näiteks suvalist kohta koodist ja lasta seda selgitada. Kood on tööandja poolt. Ma olen küll algaja alles, aga kui vaatan klassikaaslaste koode, siis saan täpselt aru, mis koodiridadel toimub. Kokkuvõttes, kui väidad, et oled X keele spetsialist, siis suudad kellegi teise koodist aru saada. Isegi siis, kui täpselt aru ei saa, siis oled suuteline oma teadmiste põhjal vastust tuletama.

Ma ei suuda praeguse taseme juures alati lambist ilma abimaterjalita korrektseid koode kirjutada. Pea ei ole prügikast, et kõik parameetrite arvud ja komad õiges kohas meelde jääksid. Kui saan abimaterjale kasutada, siis tuleb ka kood õige.

Kuidas kogenud programmeerijad teevad? Kas kõik asjad on tõesti peas? Ma saan aru, et teooria on selge, aga kõike funktsioone ikka pähe ei õpi ju, või õpite?

Nii palju, kui ma õppinud olen, suudan ka paberil asja valmis kirjutada, kuid seda meil koolis ei pooldata. Kui ma vahel alustan paberil koodi kirjutamist, siis õpetaja küsib, et miks ma arvutis ei kirjuta. Mulle lihtsalt meeldib paberil mõelda. Ma olen koodi kirjutades nii enesekindel, et ma ei pea seda alati testimagi, sest tean, et on õige. Seda kõike muidugi ainult õpitud osa piires.

link|flag
Jah, koodist arusaamise testimine tundub hea mõttena. Samas päris enda koodi kasutamine tundub mõneti ebaausa võttena... ja kandidaat võib ju alati selle peale vastata: "sitt kood, muidugi ma ei saa aru!" Kas just päris nii, aga midagi mind häirib. Ma vist suhtun sellesse intervjueerimisprotsessi kui mingisse teaduslikku eksperimenti. Märksa "õiglasem" variant tundub mulle kasutada hoopis koodi mõnest vaba tarkvara projektist. – Rene Saarsoo Apr 24 at 8:56
Kõiki funktsioone ei õpi tavaliselt pähe ka kogenuimad programmeerijad. Kuid olulisimad lihtsalt kuluvad pähe. Isiklikult leian, et kui ma pean mingit funktsiooni pidevalt manuaalist järgi vaatama, siis on probleem keele disainis. PHP-st ma ei hakka üldse rääkimagi, aga näiteks JavaScriptis on massiividel meetodid .shift() ja .unshift() ning mul on raskusi meelde jätmisega kumb neist lisab elemente massiivi ja kumb eemaldab. Probleemi põhjus on mu meelest see, et un-eesliite järgi võiks nagu oletada, et unshift võtab midagi ära, kuid tegelikult on vastupidi. – Rene Saarsoo Apr 24 at 9:14
1 
PS. Oskus kirjutada koodi nõnda, et sa oled kindel selle töötamises ilma testimatagi, ongi vast üks olulisemaid asju. See on hiiglaslik samm ülespoole nendest "programmeerijatest", kes katse-eksitus meetodil koodi tööle saavad ning hiljem seda enam torkida ei julge, sest nad ise ka ei tea, kuidas see töötab. Neid viimaseid tahakski intervjuu käigus rangelt välja sõeluda. – Rene Saarsoo Apr 24 at 9:25
Samas koodi kirjutamine ilma testimiseta on selline kahe otsaga asi. Ühelt poolt räägivad paljud arendajad, et automaattestid on vajalikud vaid arendajale, kes ei tea täpselt, mida ta kirjutab. Teisalt on väga palju maailma tipptasemel arendajaid, kes väidavad, et automaattestid (või lausa testipõhine arendus) on kasulik olenemata arendaja tasemest, kuna aitab rakendust paremini (testitavalt) disainida ning teeb lihtsamaks hilisemad muudatused koodis. Aga eks see ole juba pigem eraldi arutlusteema. – Samuel Paal Apr 26 at 13:01
2

Kahtlen sügavalt, kas mingi süntaksi korrektsuse kontrollimine midagi arendaja tasemest räägib. Mingi keele süntaks on õpitav paari nädalaga, see on pigem tehniline nüanss. Pigem oleks kasu ülesandest, mis kontrollib mingite ülesannete lahenduskäikude loogikat ja lahenduste disaini. Mingite algoritmide puhul võiks kasutada ka pseudokoodi ja OOP disaini võiks esitada näiteks UML-is vms. Tehnoloogiatest peaks aru saama, aga tehniliste detailide pähe tuupimine on natuke totter. Selleks on olemas manuaalid. Üks näide tööintervjuust: http://www.catonmat.net/blog/my-job-interview-at-google. See on muidugi natuke hardcore, aga äkki leiad sealt mingeid ideid, mida intervjuu käigus võiks küsida.

link|flag
Jah, täpne süntaks kindlasti pole oluline. Samas kui kandidaat väidab oma CV-s et on keeles X kõrgel tasemel, kuid ei suuda kirjutada korrektse süntaksiga näiteks for-tsüklit vms, siis see on mu meelest selge ohu märk. – Rene Saarsoo Apr 21 at 8:40
2

Isiklikult olen kasutanud JavaScripti teadmiste testimiseks sellist ülesannet:

Defineeri funktsioon liida nõnda, et:

liida(2)(3) === 5;
liida(1)(2) === 3;
jne...

Selle lahendamine näitab kas kandidaat mõistab kõrgemat järku funktsioone ja sulundeid, mis JavaScripti puhul on küllaltki tähtis.

link|flag
2

Mul oli paar aastat tagasi "au" olla kutsutud töövestlusele Skype'i. Läksingi, räägiti siit ja sealt, kõik oli tore, aga siis selgus, et oleks vaja teha ka mingi väike kodutöö. Meilile saadeti siis ülesanne ja see... see oli terve süsteem, mille pidid valmis kirjutama, kusjuures tuli kasutada just neid raamistikke ja andmebaase ja metoodikaid, mida nemadki. Mind häiris siis selle asja juures see, et seal olid tõesti asjad, mida nad ise kasutavad ja mida ma võib-olla ei olnud varem kasutanud. Ja häiris seepärast, et kui ma oleks ülesande täies mahus ära teinud, siis oleks mul vaja olnud paar nädalat kogu selle raamistiku, andmebaasi omapärade jmt õppimiseks. JA MA OLEKS SEDA TEINUD JU TASUTA!!! Ehk siis, ma teen tasuta endale asjad selgeks, siis ei pea firma vaeva nägema mu koolitusega.

Olin siis ja olen praegugi piisavalt hõivatud, et mitte oma aega raisata. Niiet, Skype'i ma ei läind.

link|flag
Minu kogemus oli küll hoopis vastupidine. Kodutöö oli tõesti parasjagu keerukas, raamistik ja andmebaas minu jaoks uued ning omamoodi takistus oli ka see, et üsna palju seni omandatud harjumustest tuli kõrvale jätta. Aga see tegigi kogu asja huvitavaks, väljakutsuvaks. Sain kodutööga hakkama, sain ka tööle ja võin öelda, et siiamaani on see töö huvitav :) – Anti Veeranna Apr 26 at 19:30
Ega siis inimesed on erinevd, sulle see sobis, mulle selline asi ei sobinud. – Muidumeez May 2 at 11:32
2

Kordan sama mõtet, mis oivik juba ütles - koodi lugemine on raskem kui kirjutamine.

Mul ei ole olnud võimalust seda veel testida, aga olen mõelnud anda ette mingi lihtne algoritmike ja paluda esiteks kandidaadil selgitada, mida see algoritm teeb, ning teiseks paluda tal arvutada peast vastused paari parameetrikomplekti kohta. Minu arvates võiks see testida:

  • kandidaadi võimet konstrueerida oma peas lihtsustatud mudel selle algoritmi kohta (programmeerijana peame me iga päev looma oma peas mudeleid - kuidas mingi API käitub, millist käitumist kasutaja UI-lt ootab jne);
  • võimet seda mudelit seletada teistele (töötades meeskonnas pead sa pidevalt kommunikeerima oma ideid teistele);
  • võimet simuleerida peas algoritmi või selle lihtsustatud mudelit (see on minu arust kõige tähtsam - programmeerijana pead sa kõigepealt oma peas veenduma, et algoritm töötab õigesti, ühiktestid jms on lihtsalt selle veendumuse kinnistamiseks. kui kandidaat on algoritmi ideele pihta saanud, siis ta suudab parameetrikomplektile vastava tagastatava väärtuse välja öelda peaaegu momentaalselt, ilma muutujate väärtusi ükshaaval väljaarvutamata ja mustandpaberit kasutamata).
link|flag
1

Parim programmeerimisülesanne on keelespetsiifiline ülesanne, mis koheselt näitab programmeerija taset. Ntx kuna enamus keeli on OOP, siis anda ülesanne teha klass, mis ntx korrutab ja teine klass, mis on selle järglane ntx jagab jne.

Sest elu näidanud, kui tase oli nõrk ei saadud OOP stiilis programmeerimises hakkama.

Soovitan selle näite teha paberi peale, kui kohapeal testimine, see muudab paljudki. Ei ole helpi ega Googlet

Igasugune algoritmidega testimine täiesti mõttetu, sest värskelt ülikooli lõpetaja mäletab neid veel, vanemad tegijad ei mäleta neid nii hästi enam. Boyer-Moore, Taylori rida jne

Koju võib anda ülesande, see oleks optimaalne, aga mitte nii, et ülesanne võtaks üle 2 päeva, siis see tõesti tasuta tööjõu kasutamine. Kui keegi teine ära teeb, selleks ongi küsimuste voor, sest kui inimene ei oska soravalt vastata, mida siin või siin tehakse, siis koheselt see näha.

Mina ntx kui Delphi programmeerimiskeele esindaja andsin ühe ülesande inimestele, programmi lähtetekstid tegin eelnevalt valmis. Oli vorm, kus peal 50 labelit ja palusin paaritud punaseks värvida. Reaalselt oli lahendus 4 koodirida, aga paljud hakkasid ükshaaval neid värvima label1.color:= .... jne

Siis istusin kõrvale ja palusin teha ühe ülilihtsa andmebaasi rakenduse, mis ühest tabelist andmed loeb ning ekraanile kuvab.

Viimaseks oligi eelpool kirjeldatud ülesanne, kus palusin nö klasside ülesande lahendada, kus pärimised sees, abstraktsionism jne

3 lihtsast testist piisas, et nõrgad lülid välja selekteerida

link|flag
Oskad ehk mõne näite tuua sellisest OOP-teadmisi testivast ülesandest? Su kirjeldatud korrutamise ja jagamise klasside loomine tundub kuidagi liiga lihtne. Teen lihtsalt klassi meetodiga korruta(a,b) ning teise klassi meetodiga jaga(a,b)? See vist pole päris see, mida mõtlesid. – Rene Saarsoo Apr 21 at 11:17
Ära seda korrutamist tõsiselt võta, enda kogemusest võin öelda, et kui OOP on nõrk, siis pole mõtet midagi head töötajalt loota. Samas Js OOP pole just parim; seal oleks Teil lihtsam lasta teha üks AJAX request ja saadud andmete kuvamine. Ülesanne võiks sisaldada: pärimist/polümorfismi/abstraktseid meetodeid/constructori ülekirjeldamist Ntx kasvõi ülesanne sõidukid sõidavad Tartu, sõidul on kestvus, sõidukil on nr jne. Ta ei peagi lõpptulemusena reaalselt midagi tegema, kui näed, et inimene järjest kirjeldab sama asja iga klassi all või tulevad glob.muutujad , siis tead, on probleem. – Ingmar Tammeväli Apr 21 at 13:02
1

Mina isiklikult olen vestluse käigus küsinud tehnilisi küsimusi huvitava programmeerimiskeele spetsiifika kohta. Java korral näiteks, mis vahe on x == y versus x.equals(y). Samuti, mis vahe on x = "foo" versus x = new String("foo"). Vajadusel saab kirjutada mingeid lühikesi koodilõike, stiilis map funktsiooni realiseerimine anonüümsete klassidega. C/C++ puhul saab küsida põnevaid asju mäluhaldusest, C++ juures veel klasside defineerimise nüansid (virtual destructor, anyone?).

OO projekteerimisest saab lihtsalt juttu ajada või siis lasta teha klassiskeemi tasemel mingi ülesanne (näit. ilmajaam koos eri tüüpi anduritega).

Kodus ülesande lahendamist olen ka proovinud, aga see ei anna IMO eriti häid tulemusi. Häid ülesandeid on väga raske välja mõelda ja tulemuste põhjal on ka sageli raske järeldada. Kohapeal inimesega rääkides saab palju paremini aru, kuidas ta tegelikult mõtleb ja mis teemad talle raskusi valmistavad.

link|flag
1

Avastasin sellise toreda asja: http://codility.com/

link|flag
Tegemist on siis teenusega mis võimaldab töölesoovijaid testida mitmetes keeltes ja tasemetel. Seal on ka väike demo, proovige järgi ;) – ptr May 15 at 1:07
0

Aga miks on see vajalik, et kohe kirjutada koodi vestlusel? Kas see peaks siis olema mingit raskemat sorti algoritm? Aga see ei näita veel midagi (vähemalt mulle tundub nii). Mõtekam oleks anda mingi ülesanne nt (2-3 nädalaks kodus lahendamiseks) ja selle aja jooksul tuleb see valmis teha ja samas peab vastama ka nõuetele.

Proovi ülesanne võiks olla seotud ka tulevase tööga.

Ma ei tea kas nii tehakse aga võiks.

Kui süntaksi teadmisi kontrollida, siis võiks siit võtta mõned ülesanded (siin on ainult Pythoni ja Java kohta) aga päris palju erinevaid võtteid jms.

link|flag
1 
Oluline on välja selgitada kas kandidaat üleüldse suudab minimaalsel arvestataval tasemel programmeerida. Kui anda ülesanne kodus lahendamiseks, siis jääb alati võimalus, et selle lahendab keegi teine või kopeeritakse lahendus kusagilt internetist. Suuremate ülesannetega on ka see häda, et nad nõuavad kandidaadilt päris suurt kõrge riskiga investeeringut - pole just tore kulutada paar nädalat koodi kirjutamisele ja seejärel saada teada, et sind ikkagi tööle ei võeta. – Rene Saarsoo Apr 20 at 20:51

Your Answer

Get an OpenID
or

Not the answer you're looking for? Browse other questions tagged or ask your own question.