8. 1. 2017

Testy znalostí programování

Na webech jako startupjobs.cz atd.

Zažil jsem jedno z největších znechucení za poslední dobu. Na webech jako je upwork nebo startupjobs si lze spustit testy různých znalostí a vypadá to tak, že dostanete pár desítek otázek na čas. Podle toho jak odpovíte, takové dostanete skóre a kdybyste chtěli test opakovat, tak můžete, ale asi tak až za 2 měsíce.

Co je na tom špatně?

Řekněme si, co je cílem těch testů? Cílem je, aby lidé, kteří hledají zaměstnance, měli nějak ověřené, že člověk opravdu umí to, co tvrdí. A to právě tyto testy nedělají. Proč? Protože jsou špatně navrhnuté.

Vezměme si třeba test na znalosti PHP programátora. Jaké otázky tam můžeme čekat? Nějaké, které prozradí, jak člověk myslí? Jak nad problémem uvažuje? Jak by danou situaci řešil a co by použil? Jakým by šel směrem a co by bral v potaz?

Ani omylem!

Já už jsem chvíli ze školy pryč, z té školy, kde se učily blbosti jen kvůli papíru a potom se mohli vesele zapomenout, kde se vtloukali vědomosti do hlav násilím a tak jsem předpokládal, že dnes už to bude někde jinde, alespoň na těch moderních startup webech. A čeho jsem se dočkal? Úplně toho samého.

Testy vás budou zkoušet z toho, jak znáte PHP manuál nazpaměť. Jaké pořadí parametrů mají funkce (například funkce mail(), kterou stejně nikdo nepoužívá) a něco vám na sebe prozradím - já pořadí parametrů funkce mail neznám! Ó jak je to možné? Jak jsem mohl naprogramovat hromady webů a pár portálů, to vše ještě kompletně sám a neznat pořadí argumentů ve funkci mail? Řeknu vám to: protože zaprvé, když chci poslat mail, tak použiji phpmailer a zadruhé, když chci použít funkci mail, což nechci, tak se podívám do manuálu, jak se používá. A proč? Protože se neživím skladováním mrtvejch negrů, tak proto! Tedy, protože nenosím celý manuál v hlavě, ale vyhledávám v něm to, co potřebuji. Kvalita programátora se totiž nepozná podle toho, jak velkou část manuálu zná z paměti.

Čili odpovídej na nesmysly, máš na to omezený čas a jak se překlikneš, spleteš, nebudeš něco vědět, nebo to nestihneš, hned dostaneš pár facek, špatné skóre a možná za dva měsíce, když budeš hodný, si to můžeš vyzkoušet znovu a třeba to opravit.

Další testy vás budou zkoušet z toho, jaký výstup bude mít nějaký kód, který tam pro vás připravili. Takže musíte rychle kód přečíst, pochopit a bez testování zjistit, jaký bude výsledek. Nechme stranou, že i když vše víte nejlépe, tak při normálním programování se neustále setkáváte se syntax errory a bugy, ale tady musíte simulovat PHP, musíte být tím PHP programem a vyplivnout správný výsledek. A někde vás chtějí nachytat i na tom, že někde je nebo není středník.

A kód může mít i jiný výstup, například chybu na některém řádku. A máte napsat na kterém. Ale aby vám řádky očíslovali, to ne, musíte si je spočítat sami. Ptám se - při programování jste někdy počítali řádky? Myslím, že ne. Tak co je tohle?

Co mne dál naprosto znechutilo, byly nesmyslné odpovědi. V kódu byla definována konstanta s číslem 5 a poté z ní byla odečtena jednička pomocí --. Což samozřejmě nejde, ale doprčic co to je zase za otázku? Tak buď víte co je to konstanta a tím pádem víte, že nelze měnit nebo vůbec nevíte co to je konstanta a tak celá otázka pozbývá smyslu. Ale co sakra měly znamenat dvě možné odpovědi, které vypadaly asi takhle: 1) 12345, 2) 54321 To jako z čísla 5 se nějakým kouzlem mohlo stát tohle hausnumero, že by to mohl někdo být schopen si myslet?

No a jako poslední věc bych uvedl třeba chytáky typu jestli se paměť pro PHP nastavuje jako memory_limit nebo limit_memory (nastavoval jsem to naposledy před pár lety, ale kvůli testu to musím znát jinak jsem asi špatný programátor), jestli se hodnoty v php.ini souboru přiřazují pomocí dvojtečky nebo rovná se (když to budu dělat, tak všude okolo vidím, jak se to přiřazuje a ani nad tím nepřemýšlím) a co se stane, když se limit paměti nastaví na -1 (to jsem nikdy nepoužil a pokud vy také ne, tak jste rázem špatní programátoři).

A když jsme u těch chytáků, tak vynikající věc je, když můžete zvolit více správných odpovědí a nejste na to nijak upozorněni, to je fakt super.

Na upworku jsem třeba vůbec nepochopil jednu otázku, kde se ptali na to, který kód vypíše nějaký výstup. Byly tam čtyři asi desetiřádkové kódy (na dvě minuty času) a první echoval nesmyslnou proměnnou z třídy, ale mimo třídu a zbylé tři pouze vraceli string. Čili žádný kód nic nevypsal. A to se stalo několikrát, že člověk nejenže musel řešit kód, ale i to, jak to ten zadavatel vlastně mohl myslet, když už to nedokázal jasně napsat.

A ještě přidám zkušenost z HTML osnovy z upworku, tam jsem jen viděl canvas a radši jsem to ani nezapínal. Proč? Sice jsem například naprogramoval detektor pozice kočky snímané kamerou a vykreslení probíhalo právě do canvasu, ale jinak o něm nic dalšího nevím. Protože jsem to nepotřeboval. Až to potřebovat budu, tak se to naučím. A není to zrovna věc, bez které nelze úspěšně dělat běžné weby.

Pro koho je to dobré?

Pro nikoho. Původně jsem chtěl napsat, že pro headhuntery, kteří kouknou na skóre a vidí nějaký ukazatel umu. Ale ne, není to totiž ukazatel umu, je to ukazatel k ničemu (což je ale zřejmě headhunterům jedno).

Kdo tedy dosáhne vysokého skóre? Člověk, který si založí fiktivní účty, na těch si natrénuje všechny nesmyslné otázky, najde správné odpovědi - v manuálech nebo je vygooglí, nebo najde weby, kde jsou všechna řešení už napsána a na otázky typu "jaký je výstup z tohoto kódu" použije online php/js/cokoliv tester. A nebo pokud má fotografickou paměť a je ochotný simulovat PHP. Potom má maximální skóre a rychle hotový test a je tedy údajně nejlepší.

Co to tedy říká o kvalitě programátora? Nic. Nevíte, jestli to vše věděl, nebo si to někde našel.

Mimochodem, na upworku jsem to dotáhl na 4/5 v PHP a na startupjobs kolem 80 %. Ale tak mne to špatné řešení znechutilo, že už to nikdy nechci vidět.

Správné řešení

A jako vždy, kritizovat umí každý, ale navrhnout správné řešení už málokdo. A já se o to snažím. Takže jak by to podle mne (slovo "mne", dělal jsem si test z češtiny a protože jsem si nevšiml, že lze zaškrtnou více odpovědí, tak u otázky na mne, mě, mně se mi to nejspíš počítalo jako chyba) mělo vypadat, aby to mělo smysl?

Když uděláte sebelepší test, ve kterém nebudou nesmyslné otázky na manuál, nesmyslné simulování PHP a žádání o napsání toho, co kód udělá, stejně stále zůstanou ty problémy, které jsem popsal. Vygooglení řešení, nalezení někde zveřejněných odpovědí atd.

Takže žádné testy, ale pouze otázky na řešení situací. Na tyto otázky člověk napíše řešení vlastními slovy a rozepíše se o postupu, důvodech zvoleného řešení, výhodách a nevýhodách. Pokud si to řešení někde vygooglí, tak je to v pořádku, přece jde jen o to, aby to řešení našel. Navíc, každý zaměstnavatel bude mít vlastní otázky, tedy jiné a nebude moct existovat web, kde budou správné odpovědi.

Přesně takhle by to mělo fungovat a mělo by to smysl. Kdybych dostal otázku, jak vykreslím čtverec do canvasu v html, tak já to nevím, ale znamená to, že by mne zaměstnavatel neměl vzít? Vůbec ne. Přece mi stačí půl hodiny a já zjistím jak se to dělá a řešení za chvíli mám. A pokud zaměstnavatel uvidí, že všechny otázky dokážu vyřešit, tak to je důležité. Nebo si snad myslíte, že když oslovíte běžného automechanika a zeptáte se ho, jak by vyměnil startér u Bentley, že vám z rukávu vysype přesný postup? Těžko, ale to neznamená, že to nedokáže.

A popis řešení vlastními slovy je to důležité. Lze z toho poznat, jak člověk uvažuje a navíc to lze použít i při pohovoru a dále to rozvést. Sice neuvidíte krásné číslo v profilu "uchazeč umí PHP na 83,5 %", ale zato získáte cenné informace.

Ukázková správná otázka

A dám vám rovnou jednu startovní otázku pro otestování PHP programátora: "Jak byste řešil optimalizované menu s nekonečno podkategoriemi".

Mít menu navržené tak, aby ve smyčče nejely databázové dotazy, aby se nemuselo menu kompletně vybírat z databáze, aby podporovalo automatické rozbalení do cílové podkategorie (například během stránkování) a aby umožňovalo v administraci snadno menu přesouvat kamkoliv a vše bylo skutečně provedeno rychle a optimalizovaně i při milionu kategorií, tak TO je otázka, která vám dá spousty informací o daném programátorovi. A myslím, že ani dnes na tento problém nevygooglíte ideální řešení, ale budete ho muset sami vymyslet.

Řada začátečníků na to jistě odpoví jednoduše a použijí rekurzi, čili provedou na jedné stránce stovky databázových dotazů pro jednoho uživatele, pro jeden klik a ani je nenapadne, že by to nemuselo být správné. A hned víte, na jaké úrovni programátor je.

Ano, uchazeče budete vybírat komplikovaněji, budete muset číst co napsali a jak přemýšleli. Bude to složitější, než jen kouknout na číslo. Ale chcete programátora kvůli číslu a potom ho třeba vyhodit, protože po půl roce stále nic nepředvedl? Nebo chcete programátora, který opravdu něco dokáže?

Žádné komentáře:

Okomentovat