Pohovor u Yahoo – odpovědi
Školení, která pořádám
Minulý týden jsem zveřejnil otázky, které pokládá Yahoo uchazečům o zaměstnání. Nyní přináším své odpovědi:
- Co z následujících příkazů nepřidá Johna do pole uživatelů?
<?php
$users[] = 'john';
array_add($users, 'john');
array_push($users, 'john');
$users ||= 'john';
?>
Do pole uživatelů Johna určitě nepřidá syntakticky nesprávná konstrukce $users ||= 'john'
a pokud si nevytvořím uživatelsky definovanou funkci, tak ani array_add($users, 'john')
.
- Jaký je rozdíl mezi funkcemi sort, asort a ksort? Za jakých okolností použijete každou z nich?
Funkce sort nezachová indexy (použití: array("pořadí" => "cena")
chci setřídit podle ceny), asort ano (použití: array("id" => "cena")
chci setřídit podle ceny), ksort setřídí podle klíče (použití: array("id" => "cena")
chci setřídit podle ID).
- Co vypíše následující kód do prohlížeče? Proč?
<?php
$num = 10;
function multiply() {
$num = $num * 10;
}
multiply();
echo $num;
?>
Kód vypíše 10
, protože proměnná $num
není ve funkci multiply
definovaná jako globální.
- Jaký je rozdíl mezi referencí a běžnou proměnnou? Jak předáte proměnnou referencí a proč byste to chtěli udělat?
Změnou proměnné s referencí se změní i hodnota referencované proměnné. Do funkce předám proměnnou referencí uvedením znaku &
v seznamu parametrů u definice funkce. Udělám to tehdy, když chci, aby se změny parametru uvnitř funkce projevily i do předané proměnné.
- Jaké funkce můžete použít pro přidání knihovního kódu do právě spuštěného skriptu?
Funkce include, require, include_once, require_once.
- Jaký je rozdíl mezi
foo()
a @foo()
?Operátor @
potlačí informování o chybách.
- Jak ladíte PHP aplikace?
Naučil jsem se programovat tak, abych ladit pokud možno nepotřeboval. Proto ladím obvykle jen pomocí print_r. Pokročilejší ladění zvládne např. PHP DBG s napojením na několik editorů.
- Co dělá
===
? Jaký je příklad něčeho, co vrátí true pro ==
ale ne pro ===
?Operátor ===
porovná hodnotu a typ. Např. false == 0
, ale false !== 0
.
- Jak deklarujete třídu
myclass
bez jakýchkoliv metod a vlastností?Pomocí class myclass { }
.
- Jak vytvoříte objekt, který je instancí třídy
myclass
?Pomocí new myclass
.
- Jak přistupujete a nastavujete vlastnosti třídy zevnitř třídy?
Vlastnosti objektů se nastavují pomocí $this->x
, statické vlastnosti tříd pomocí self::$x
.
- Jaký je rozdíl mezi include a include_once? A include a require?
Konstrukce include_once se postará o to, že soubor bude vložen jenom jednou, require při chybě přeruší další zpracování.
- Jakou funkci použijete pro přesměrování prohlížeče na novou stránku?
<?php
redir();
header();
location();
redirect();
?>
Funkci header s hlavičkou Location
.
- Jakou funkci můžete použít k otevření souboru pro čtení a psaní?
<?php
fget();
file_open();
fopen();
open_file();
?>
Funkci fopen.
- Jaký je rozdíl mezi mysql_fetch_row a mysql_fetch_array?
Funkce mysql_fetch_row načte prvky do číslovaného pole, mysql_fetch_array přidá i řetězcové indexy.
- Co dělá následující kód? Vysvětlete, co se v něm děje.
<?php
$date = '08/26/2003';
print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)", '\\2/\\1/\\3', $date);
?>
Kód vypíše datum s prohozeným měsícem a dnem. Regulární výraz najde tři posloupnosti čísel oddělených lomítkem a prohodí první a druhou posloupnost.
- Když dostanete řádek textu v proměnné
$string
, jak byste napsali regulární výraz, který z něj odstraní HTML značky?Vzhledem k tomu, že znak >
se může neošetřený nacházet uvnitř hodnoty atributu, tak by to bylo poměrně složité, nicméně asi by stačila odpověď <(!--.*--\s*|.*)>
v nehladovém režimu.
- Jaký je rozdíl mezi tím, jak rozlišuje Perl a PHP pole a asociativní pole?
PHP pole a asociativní pole nerozlišuje, Perl ano (třeba jiným znakem používaným při přístupu k prvkům každého z nich).
- Jak můžete obejít bezstavovost protokolu HTTP s využitím PHP?
Pomocí cookies (setcookie, $_COOKIE) nebo sessions (session_start, $_SESSION).
- Co dělá knihovna GD?
Umožňuje manipulaci s obrázky.
- Uveďte několik způsobů, jak vypsat blok HTML kódu v PHP.
Konstrukce echo, print, printf, přerušení PHP kódu.
- Je PHP lepší než Perl? Rozeberte.
PHP považuji za lepší než Perl především proto, že má čitelnější zápis. V Perlu je velice snadné (a běžné) vytvořit obtížně čitelný kus kódu.
Diskuse
a jak treba hodnotis samotnou uroven testu. jestli mas moznost porovnat s jinymi nabirajicimi firmami, jak ceskymi tak zahranicnimi.
diky
o.
Pro firmy, na které zaměstnanci stojí fronty, je takovýto jednoduchý předpohovorový test myslím dobrý - rychle to vyloučí lidi bez základních znalostí, snadno se to kontroluje a není velké riziko, že bude vyloučen někdo, koho by byla škoda.
Z českého prostředí mám spíš tu zkušenost, že firmám dá velkou práci, aby našli někoho s alespoň základním programátorským myšlením a investici do vzdělání zaměstnance na úrovni syntaxe klidně podstoupí.
Vstupní test pro uchazeče, který jsem kdysi připravoval já, byl prakticky zaměřený - zadání na dva řádky, časový limit dvě hodiny a podle výsledku se dá usoudit, co je člověk zač - zda píše kód lineárně, ve funkcích nebo objektech, jestli má pojem o bezpečnosti, jestli si je schopen dohledat informace, když něco neví, jak při řešení problému postupuje, jestli dbá na štábní kulturu, ... Na vyhodnocení to je samozřejmě mnohem pracnější.
Jonge:
To je na výsněch, je mi 16 a všechno jsem věděl kromě 2 :o)
lacop:
no to mas akurat 2 roky na to aby si sa to doucil :)
a:
Na tom nie je nič zvláštne, je to predsa len test pred pohovorom. Na svete je kopec ludi, ktori si myslia, ze by mohli robit programatora a nepresli by tymto testom. Iny si myslia ze aky su hackeri a nevedia ani co je IP adresa. Potom su aj taky, ktori sa nikam nehrabu, nechce sa im programovat, ale vedeli by sami za dva mesiace spravit redakcny system a pritom su mozno este iba koncia zakladnu skolu.
mě je 14 a zrobil sem redakční sys. ale umi jen to co je potreba (vkladat/upravovat/mazat) :)
(ale ten sys. sem psal minuly rok)
Musim souhlasit, ze tento test opravdu neni moc tezky.
Hoky:
Tak v tom případě musí mít v Yahoo docela velkou frontu zájemců o zaměstnání, protože si myslím že to jsou docela základy
qwe:
Jde pouze vstupní filtraci zájemců, Yahoo vybírá až z těch co projdou tímto jednoduchým testem, aby rychle vyloučilo úplné neználky.
U otazky cislo 10. by mozna bylo lepsi napsat: new MyClass();
Pouzit spravne pojmenovani: nazev tridy zacina velkym pismenem a pokracuje velbloudi notaci, stejne jako v otazce cislo 9.
U otazky cislo 11. bych jeste doplnil parent:: k pristupu atributu rodicovske tridy.
Jako vstupni test spise beru, nechat uchazece neco vytvorit podle zadaneho ukolu a pak s nim jednotlive casti rozebrat (pokud to za to ovsem stoji) :)
Ja osobne bych vyhorel u otazky cislo 2, 13 (castecne), 14 (castecne), 18, 22 :)
Otazka cislo 7 je pro phpckare docela drsna :) Kdo pouziva debugger? Nebo programovani rizene testy? To by me skutecne zajimalo :)
Pokud je zadání "deklarujete třídu myclass", tak je lepší zadání vyhovět. Za řeči o "správném pojmenování" bych hned bodík strhl ;) Stejne tak za parent:: pro přístup k atributům rodičovské třídy, pokud bys nedodal, že se to týká pouze statických atributů. Někdy je lepší nadměrnou aktivitu krotit.
ivan_d:
'spravne pojmenovani' - tzn. dat firmě hnede na vědomí: Naučil jsem se svoje konvence a ty u vás zaběhnuté neberu?
'programovani rizene testy' - třeba já a kolega? I někteří javaři prasí - to není závislé na jazyku.
No tak to uz bych ten test nesplnil vubec :)
Pokud ma nekdo zabehnute: myclass, Getname, statickyatribut, atd.. tak to bych vazne nebral :) Navic ja si zadne svoje nevymyslel. Podivej se do jakehokoli objektoveho jazyka a mam pocit, ze v 90% najdes tu samou konvenci. Proc ma byt PHP vyjimkou? To se budeme divit, az bude jednou v PHP defaultne nastaveno case-sensitive :)
Ptal jsem se na PHP, nevim o moc lidech, kteri by to pouzivali, alespon o tom nedavaji vedet.
ivan_d:
'Podivej se do jakehokoli objektoveho jazyka' - python, ruby, mám za to, že i C# píše GetName :) .... Taky jsem přejal javovskou konvenci (protože mi vyhovuje), ale jsem ochoten nechat se přesvědčit, když zjistím, že je to pro mě lepší :)
'Ptal jsem se na PHP' - ale já to psal o PHP :). To, že to není můj jediný ani nejoblíbenější jazyk je druhá věc.
Mam pocit, ze nemluvis uplne pravdu. Navic u C# je to uplne jinak, tam se setry a getry definuji vlastnim zpusobem. Ve finale z toho vyleza to same setNeco, getNeco.
ivan_d:
'Mam pocit, ze nemluvis uplne pravdu' - v čem nemluvím pravdu (kromě možná C# - viz. níž)? Python: (class)datetime, ruby (metoda)to_s
'Navic u C# je to uplne jinak' - C# jsem viděl z letadla (psal jsem v něm 1 metodu :) - může být - jen se mi tak matně vybavuje, že jsem se právě nad tím pozastavil (a nejednalo se o properties).
Andrew:
Právě pro Tvoji 'konvenci' by Tě třeba nevzali. U nás ve firmě je určitý styl práce a už se tu vystřídalo několik programátorů, kteří říkali: "Tohle je hrozné, takhle to psát nebudu, to je zastaralé atd." Jenže zapomněli, že už si nelepí svoje kusy kódu, ale že dělají v týmu a je tedy třeba dodržovat týmová pravidla, aby se pak v kódu vůbec někdo vyznal. Ty se dají samozřejmě změnit, ale zase po diskusi s týmem. Ti, co to nechápou pak pro tým moc velkým přínosem nejsou.
S tim naprosto souhlasim. Na druhou stranu, ta konvence by mela byt co nejblizsi vseobecne pouzivanemu doporuceni, ktere vychazelo z C, C++, Javy, atd. Proste kdyz si nekdo zacne tvorit neco sveho, vetsinou to dopada spatne.
Ono uz jen samotne zvoleni nazvu trid a jejich struktura je pekna magie :)
Farin:
a pokud mozno se drzet pouze jednoho jazyka a ne vsech 3 najednou jinak z toho vyleze PHP :)
anode:
Programování řízené testy. Ano :) A jak to souvisí s PHP? Tohle není moc otázka jazyka, jako spíš způsobu programování.
Když programuju novou funkci/třídu, většinou napíšu napřed test (proč je to dobré snad ani nemá cenu psát, zeptej se pana Becka).
Michaels:
Otazka 3 by je teoreticky trochu zaludnejsi. Protoze sice se vypise "10", ale zaroven se muze (v zavislosti na nastaveni urovne hlasenych chyb a vypisu chyb) jeste pred tim take vypsat notice. Toho by si dobry programator urcite mohl vsimnout. A podle otazky by se melo zduvodnit "proc".
Ale chapu, ze spoustu programatoru zajimaji az warningy :(.
LesTR:
error_reporting(E_ALL); zacinaji vsechny moje skripty a mnohokrat uz mi to zachranilo spoustu ztraceneho casu hledani chyby.
> 5. Jaké funkce můžete použít ...
Myslel jsem jaký že to nebude chyták, protože o zahrnovacích příkazech jsem četl jako o speciálních kontruktech jazyka jako např. echo, a přitom asi ani nic jiného nevyhovuje otázce lépe než popsaná odpověď. :(
Tomas:
mam jednu otazocku - co znamena "bezstavovost protokolu HTTP" ? potom by som mozno na odpoved prisiel aj sam ...
Znamená to, že každé dva požadavky na webový server (byť od téhož uživatele) jsou zpracovány nezávisle na sobě.
Já bych ještě doplnil odpověď na 4. otázku. Referencí je také dobré předávat všechny "objemnější" parametry - kvůli rychlosti. Při předávání parametrů hodnotou se vytváří jejich kopie a v případě rozsáhlejších dat tak dochází ke zpomalení.
Miloš:
Překvapila mě poslední otázka, která je spíše ideologická a navíc předpokládá odpoveď ANO. Já bych asi odpověděl "Jak kdy a jak k čemu". Dostatečně zdůvodnitelná je odpověď kladná i záporná, nicméně dobře víme, co chce autor testu slyšet. A právě to se mi na této otázce vůbec nelíbí.
Jakub Vrána :
Tak si otázku přeformuluj na „Vybral by sis pro programování PHP nebo Perl? Proč?“
Bilbo:
Jak na co. Je dost veci co delam v PHP a je dost veci co delam v Perlu. Pouzivam oboji, v cem to budu delat zalezi na tom, co chci vyplodit a v cem usoudim ze to budu mit rychleji/lepe/prehledneji ...
kozotoč:
To není zrovna moc konkrétní odpověď... ;)
Bilbo:
Ad 17) Co se tyce neosetrene ">" v atributu tak to je prasarna co by tam by nemela. Uplne korektni regexp by pak byl .. celkem dlouhy. Otazkou pak je co z HTML komentari - taky vystipat, nebo nahradit tagy uvnitr nich a komentare nechat? A brat komentare striktne dle SGML standardu, nebo od "<!--" do "-->"? (vetsinou je to jedno, ale je par "trikovych" komentaru kde neni, treba "<!-- ---->bla bla <!-->" je jeden komentar)
Jakub Vrána :
">" je sice možná prasárna, ale zakázané to nikde není a regulární výraz by s tím měl počítat: <([^>"']+|"[^"]*"|'[^']')*>
HTML dokumentace podle mě hovoří celkem jasně: http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.2.4
Komentář začíná <!-- a končí --> s volitelnými bílými znaky před >. Posloupnosti pomlček nejsou uvnitř komentáře dovolené.
Bilbo:
Co jsem na to koukal naposled v sopuvislosti s ACID testem, tak mam dojem ze to bylo jinak ... ale mozna si to pletu se SGML obecne. Jen vim ze v tom ACID bylo i par triku s komentari, kde pokud to browser neparsoval striktne dle standardu tak to ten ksichtik dost rozhodilo :)
dgx:
od toho nakonec ustoupili, protože uznali, že HTML je aplikací SGML už skutečně jen papírově.
dgx:
Neošetřené > není prasárna, ale standard. A je jedno, jestli v atributu nebo kdekoliv jinde.
Jirka:
I v Perlu lze psat citelne. Jako vetsi rozdil bych vybral lepsi implmentaci OOP v PHP. To snad ale napravi Perl6.
Mira:
Pokud se vytvari slozitejsi aplikace tak uz je php debugger nezbytnost. Zejmena pokud to neni jednoducha plocha aplikace, kde se na kazdy pozadavek znovu nacte cela stranka.
Pokud se vystup nevypisuje primo ale prijde jako vysledek pozadavku poslaneho pres xmlhttprequest, tak jedina rozumna moznost je php debugger.
Sam v praci pouzivam php dbg pripojeny do phpeditu od waterproof.
Jakub Vrána :
Stejně dobře se dá použít i Firebug, který výsledný dokument také zobrazuje nebo prosté alert(xmlhttp.responseText).
A debugger není nezbytnost, záleží jen na tom, jakým způsobem se k psaní kódu přistupuje :-).
D1ce:
Nebylo by na škodu se o tom přístupu rozepsat... Děkuji pěkně. Nebo jsem to na php.vrana.cz přehlédl? ;)
Jakub Vrána :
Dřív jsem programoval tak, že jsem napsal nějaký kód, spustil ho a podíval se, jestli funguje. Když ne, tak jsem ho trasoval a koukal se, co se děje na jednotlivých řádcích. Někdy jsem ho po napsání ani nespouštěl a pustil trasování rovnou.
Pak jsme na škole měli napsat něco v Prologu, kde se programuje trošku odlišným způsobem a pro který jsme žádný debugger neměli. Jediný způsob ladění bylo představit si, jak bude kód probíhat, v hlavě. No a to už mi zůstalo - když napíšu kód, tak si ho po sobě přečtu, odladím ho v hlavě a pak si můžu být téměř jist, že bude dělat to, co má. Samozřejmě to nefunguje stoprocentně, ale když už v kódu nějaká chyba je, tak se obvykle dá snadno najít i pomocí pár dobře mířených echo.
Mira:
Slozitejsi aplikace se bez debuggeru pisi opravdu podstatne hur nez s debuggerem. Sam jsem hodne dlouho delal oboji takze muzu srovnavat. Vypsat responseText pres alert zdaleka nedostacuje zejmena tehdy pokud je vystup dlouhy nebo se dale interpretuje.
Firebug pouzivam take ale pro nahled do DOM struktury dokumentu a pro ladeni javascriptu.
Debugger se hodi zejmena pro slozitejsi skripty, kde je mozne skript krokovat po prikazech, zobrazovat obsahy promennych apod. Dale pri vyskytu chyby je velice dobra moznost kdy je ve vyvojovem prostredi oznacen radek, ktery chybu zpusobil.
Mene zavazne udalosti (napr. notice) se daji pouze evidovat a pote se pres klikaci seznam dostat primo do mista kde jsou hlaseny.
Dalsi a rozhodne ne posledni vyuziti je moznost pouziti profileru, ktery zmeri dobu behu jednotlivych funkci a muze upozornit na zrouty casu.
Secteno a podtrzeno:
Debegger v php (a samozrejme i Javascriptu) posktuje nesrovnatelne vetsi komfort a moznosti pro ladeni kodu, zejmena pro velke aplikace.
Uvedene skutecnosti nejsou vycucane z prstu ale jsou vysledkem nekolikaletych zkusenosti s vyvojem webovych aplikaci.
P.S.: Pisu to bez hacku a carek, protoze na pda ceskou klavesnici nemam.
mj41:
Presne tak. Taky to bylo prvni co jsem napsal kdyz jsem nastoupil do prace.
Rikame tomu debug_lista. Naklikam si co chci sledovat: debug_oracle, error_reporting, error_reporting_notice, ... (nastaveni se ulozi do cookie). Pak mam na zacatku kazde stranky debug listu do ktere javascript (funkce t() ) uvnitr html pridava jednotlive radky.
Dal jsem priklad na https://ent.ro.vutbr . cz/vyvoj-dalsi/debug_lista/ (mezery v url si odstrante).
Je to omezeno podle IP, a taky tam zvyraznujem na jak instanci (ostra, test, vyvoj/...) a na jake databazi (ostra, vyvojtest) zrovna jsme.
Asi to jednou uvolnime jako open source. Teda pokud se to nekomu libi. Par vylepseni by to jeste sneslo: napojeni na editor, na ladeni sql, ...
wutter:
jednoduchy "debugger" je IE u kteryho staci jedina chyba A uz krici :D (+ma nastroje pro vyvojare) ale zaroven rikam ze ie nepouzivam (kdyz nepotrebuju neco ladit)
mj41:
Az na tu odpoved 22, je to dobry. U 22 bych si vas trochu proklepnul.
Nemel jste odpovedet spise "Perl skoro neznam, proto nemuzu porovnavat."? Jaky necitelny kousek kodu jste naposledy videl?
Ja se treba trochu hrabal v Joomle a v MediaWiki a pripadalo mi to jako mnohem vetsi zpatlanina, nez cokoliv vetsiho co jsem videl v Perlu.
Mozna jeste pridam odkaz, ktery to tak trochu rekne za mne:
http://www.paulgraham.com/avg.html
Llaik:
k otazce cislo 12:
chybi to imo dulezitejsi:
"require() and include() are identical in every way except how they handle failure. They both produce a Warning, but require() results in a Fatal Error."
Jakub Vrána :
A co podle tebe znamená "require při chybě přeruší další zpracování"?
Llaik:
aha.. přehlédl jsem, takže z poloviny se omlouvám :)
z druhé poloviny zkusím tedy aspoň vytknout trošku nejasnou odpověď, jinak si nedovedu vysvětlit, že jsem to přehlédl :)
Ales Zoulek:
Test sice neni nejak moc narocny, ale prijde mi, ze vylouci hodne dobrych programatoru, kteri by byli pro firmu velkym prinosem, ale neznaji zpameti, jestli PHP umi array_add(), jak se jmenuje knihovna na manipulaci s obrazky..
Zdalo by se mi rozumnejsi rozdelit test do dvou sekci, kde druha by se zamerovala spis na obecnejsi otazky o webu a programovani.
elha:
Ahoj, souhlasím s Alešem. Nemyslím si, že jsem nějak extra špatný programátor, ale testem bych neprošel. Kdybych ale mohl sedět u netu, myslím, že bych testem prošel a dokonce i v časovém limitu.
Kuba:
No sice máte pravdu, že řadu věcí si musí programátor vyhledat na netu, ale spíše to bývá pořadí argumentů, nebo méně známé a používané funkce. Např. s knihovnou GD jsem nikdy nepracoval, ale vím, že slouží pro práci s obrázky. Je to tak nějak základ. A to jsem, musím podotknout, začátečník, který ještě nikde ve firmě neprogramoval.
Marty:
Kuba: Je to základ, proto že to říkáš? Základ je to, co se za něj určí, proto také tak nepřijemná věta zkoušejícího u zkoušky, že jeho otázka je ELEMENTÁRNÍ :-))
Osobně bych podobný test dával v případě, že bych potřeboval někoho, kdo dokonale ovládá PHP a nebude se pořád zdržovat tím, že bude hledat v manuálu, pokud je to člověk, který má pouze dobrou paměť, tak by ho mělo vyřadit interview (tento test je pouze první část přijímání zaměstnance)
honza:
Souhlas, jsa zhýčkán našeptávačem v ZDE bych si taky odpověďmi na některé otázky nebyl příliš jistý.
Dalibor:
Na otázku č. 17 bych radši použil strip_tags - odstraní všechny tagy
Dalibor
Diskuse je zrušena z důvodu spamu.