Autor Zpráva
PHPaddict
Profil *
Ahoj, na konci titulku k tématu mi chybí otazník, ale to proto, že se prostě nevešel. Co s tím nadělám, no :-)
Moderátor Chamurappi: Opraveno :-)

OK, takže k věci. Otázka se může zdát zvláštní, ale mě by to prostě zajímalo a ta hodně. Situace je taková, že jsem mladý programátor, 24 let, programování ani jiné IT jsem nestudoval, ale věnuji se tom již několik let (dalo by se spočítat na prstech jedné ruky, ale je to rozhodně více jak polovina těch prstů :-) ) a asi tak +- půl roku dělaám pro jednu malou pražskou firmu zakázkové projekty, takové maličkosti. Jednají se mnou f=r a vždy zaplatí, takže mě netahají za nos, ale poblém je ten, že pro mě nemají tolik práce, aby mě vzali na HPP a nebo aby se mi vyplatilo dělat pro ně na ŽL, protože tak jao tak si měsíčně nevydělám ani 10 tis. Využil jsem ale toho, abych si nadělal nějaké ty projekty (některé byly pro tuto firmu, jiné moje vlastní či pro známé) a se svolením jsem je použil jako referenční materiály. Už asi tak 2 měsíce se ucházím o různá místa typu "PHP junior", "PHP vývojář", "PHP backend developer", PHP na měko" a dokonce i "PHP natvrdo" :-), ale už jsem z toho všeho doopravdy fakt naměko, protože mě pokaždé zatím odmítli. A tam, kde se ještě neozvali už ani nečekám, že by to mohlo být jinak. Takže se tak sám sebe ptám, jestli to za to vůbec stojí. Myslel jsem si, že tyhle věci zvládám. Nejsem sice žádnej Zuckerberg, ale každej někde musí začít. No a mě se to pořát nějak nechce dařit. Takže bych se rád zeptal na váš názor, jak to vidíte. Jak dlouho to asi tak trvá, než se člověku co si o sobě myslí, že je programátor, podaří se uplatnit? Není čas si příjmout prohru a vykašlat se na to?

Díky všem :-)
jenikkozak
Profil
Chápu, že dvouměsíční hledání práce je nepříjemné. Ale průměrná doba hledání zaměstnání může být v závislosti na místě a oboru až půl roku. V IT to je jistě méně, avšak i tak je zbytečné házet flintu do žita. Pochybovat o sobě je v takové situaci to nejhorší, co můžeš udělat.
quatzael
Profil
PHPaddict:
No tak se zkus hlavně zamyslet na čem to vždycky hasne.. Nenapsal jsi, jestli Ti jen odepisují, že Tě nechtějí už podle životopisu nebo jdeš na pohovor a končí to tam..

2 měsíce hledat v dnešní době není vůbec nic neobvyklýho. Ale spíš, když nemůžeš najít práci tak to zkus jinak. Vytvoř si vlastní web, o kterej se budeš starat a kterej Ti bude vydělávat peníze.
Jan Tvrdík
Profil
PHPaddict:
Nenapsal jsi v čem je problém, jak už podotkl quatzael. Každopádně doba, kdy nemáš práci, je ideální čas na to se dále vzdělávat, a tak si ještě zvýšit svoji cenu na trhu práce. Netuším, jak jsi na tom třeba se znalostí objektového programování nebo nějakého frameworku, ale rozhodně je vždycky, co se učit.


To mi připomnělo výborný web od Yuhůprace.rovnou.cz.
PHPaddict
Profil *
Díky za odpovědi. Je to vlastně tak, že asi tak z 90% mě vždy pozvali na pohovor a tam to taky skončilo. Na jednom z těch pohovorů se mnou byli opravdu hodně spokojení. Seděli jsme tam asi tak 2 hodinky a povídali jsme si o všem možné (co se programování týče). Sám jsem až koukal, jak mi to jde pěkně od ruky a hodně si pochvalovali mojí teoretickou zásobu znalostí. Ale na tom to právě pohořelo. Kvůli tomu, že nemám dostatečnou praxi mě nevzali. Jinak učím se samozřejmě dál. Neskutečně mě to baví.
anonymníí
Profil *
PHPaddict:
Měl bys k dispozici nějaké referenční projekty? Třeba bude chyba v nich, sice máš teoretické znalosti, ale jejich převedení od praxe pokulhává.

Může se stát (a neber si to osobně), že firma, pro kterou pracuješ a která je s tebou spokojená, má nízké nároky a nevadí ji/nepozná, že pro ni pracuje "patlal"- Zní to hnusně, ale není to tak myšleno. Třeba bude problém tam.
juriad
Profil
PHPaddict:
Pokud nemáš prokazatelnou praxi, ale chceš předvést, že programovat umíš, zkus si vytvořit svůj demonstrační netriviální projekt, který uvedeš v životopisu.
Umísti jej někam veřejně, třeba na Github, tak aby šlo snadno procházet jeho zdrojový kód.
Při pohovoru se pak můžete bavit nejen o technologiích, které údajné znáš/ovládáš, ale i o jejich konkrétním použití.
Zároveň i druhá strana bude mít jistotu, že takový rozsah, který uvádíš skutečně zvládneš.
Joker
Profil
PHPaddict:
Na jednom z těch pohovorů se mnou byli opravdu hodně spokojení.
To je u pohovorů někdy taktika, že nechají uchazeče mluvit a všechno mu odkývají. Asi to jednak nedrobí ten pohovor, jednak uchazeč právě získá sebevědomí „jak mu to hezky jde“ a přestane se tolik hlídat a jednak když uchazeče nikdo nezastavuje a neopravuje, má menší šanci věrohodně okecat i věci, kterým ve skutečnosti vůbec nerozumí.

Obecná rada asi je podle minulých pohovorů identifikovat slabá místa („co jim asi tak mohlo vadit“) a snažit se je odstranit.
Jestli jim vadí nedostatek praxe, udělat nějaký další projekt (viz [#7] juriad), nebo lépe prezentovat svou stávající praxi.
PHPaddict
Profil *
Jestli vám to nebude vadit, postnu sem kousek kódu z jedné PHP třídy (využívá Nette). Ta třída není úplná, ale je to určitě dost na to, aby se z toho dalo vyčíst, jestli je ten kód dobře napsaný (čitelně, hezky) a jestli je pochopitelný. Mohl bych vás požádat o jeho zhodnocení? Byl bych moc vděčný.

    public function startup()
    {
        parent::startup();

        if (!$this->user->isLoggedIn()) {
            $this->redirect('Sign:in');
        }
    }
    /**
     * @return void
     */
    public function actionCustomers()
    {
        $ur = $this->context->userRepository;
        $this->customers = $ur->findBy(array('role' => 'customer'))
            ->order('surname ASC, forename ASC');
    }
    /**
     * @return void
     */
    public function renderCustomers()
    {
        $this->template->customers = $this->customers;
    }
    /**
     * @return void
     */
    public function actionEmployees()
    {
        $ur = $this->context->userRepository;
        $this->employees = $ur->findBy(array('role' => 'employee'))
            ->order('surname ASC, forename ASC');
    }
    /**
     * @return void
     */
    public function renderEmployees()
    {
        $this->template->employees = $this->employees;
    }
    /**
     * @param  int $customerId
     * @return void
     */
    public function actionCustomerHistory($customerId)
    {
        $this->customerSessions = $this->context->sessionRepository
            ->findBy(array('customer_id' => $customerId))
            ->order('datetime DESC');

        $procedures = $this->context->procedureRepository
            ->findAll();

        foreach ($this->customerSessions as $session) {

            foreach ($procedures as $procedure) {

                if ($session->procedure_id === $procedure->id) {
                    $session->procedure = $procedure->procedure;
                }
            }

            $files = $this->context->fileRepository
                ->findBy(array('session_id' => $session->id));

            if ($files->fetchPairs('id')) {
                $session->files = $files;

            } else {
                $session->files = FALSE;
            }

            $images = $this->context->imageRepository
                ->findBy(array('session_id' => $session->id));

            if ($images->fetchPairs('id')) {
                $session->images = $images;

            } else {
                $session->images = FALSE;
            }

            if (\strtotime($session->date) > \strtotime(\date('Y-m-d'))) {
                $session->active = TRUE;

            } else {
                $session->active = FALSE;
            }
        }

        $ur = $this->context->userRepository;
        $this->customer = $ur->findBy(array('id' => $customerId))->fetch();
    }
    /**
     * @return void
     */
    public function renderCustomerHistory()
    {
        $this->template->sessions = $this->customerSessions;
        $this->template->customer = $this->customer;
    }
    /**
     * @param  int $employeeId
     * @return void
     */
    public function actionEmployeeSettings($employeeId)
    {
        $ur = $this->context->userRepository;
        $this->employee = $ur->findBy(array('id' => $employeeId))->fetch();
    }
    /**
     * @return void
     */
    public function renderEmployeeSettings()
    {
        $this->template->employee = $this->employee;
    }
    /**
     * @param  int $customerId
     * @return void
     */
    public function actionCustomerSettings($customerId)
    {
        $ur = $this->context->userRepository;
        $this->customer = $ur->findBy(array('id' => $customerId))->fetch();
    }
    /**
     * @return void
     */
    public function renderCustomerSettings()
    {
        $this->template->customer = $this->customer;
    }
    /**
     * @return void
     */
    public function actionProcedures()
    {
        $pr = $this->context->procedureRepository;
        $this->procedures = $pr->findAll()->order('id ASC');
    }
    /**
     * @return void
     */
    public function renderProcedures()
    {
        $this->template->procedures = $this->procedures;
    }
    /**
     * @return void
     */
    public function actionSessions()
    {
        $parameters = $this->getRequest()->getParameters();

        if (isset($parameters['sessionsCalendar-day'])) {
            // Selected date
            $year  = $parameters['sessionsCalendar-year'];
            $month = $parameters['sessionsCalendar-month'];
            $day   = $parameters['sessionsCalendar-day'];

            $date  = $year . '-' . $month . '-' . $day;

        } elseif (isset($parameters['sessionsCalendar-year'])) {
            // First day of selected month
            $year  = $parameters['sessionsCalendar-year'];
            $month = $parameters['sessionsCalendar-month'];
            $day   = '01';

            $date  = $year . '-' . $month . '-' . $day;

        } else {
            // Today
            $year  = \date('Y');
            $month = \date('m');
            $day   = \date('j');

            $date  = $year . '-' . $month . '-' . $day;
        }

        $sr = $this->context->sessionRepository;
        $this->registeredSessions = $sr->findBy(array('date' => $date))
            ->order('time ASC');

        $pr = $this->context->procedureRepository;
        $procedures = $pr->findAll();

        $ur = $this->context->userRepository;
        $users = $ur->findAll();

        foreach ($this->registeredSessions as $session) {

            foreach ($procedures as $procedure) {

                if ($session->procedure_id == $procedure->id) {
                    $session->procedure = $procedure->procedure;
                }
            }

            foreach ($users as $user) {

                if ($session->customer_id == $user->id) {
                    $session->customer = $user->forename . ' ' . $user->surname;
                }
            }

            foreach ($users as $user) {

                if ($session->employee_id == $user->id) {
                    $session->employee = $user->forename . ' ' . $user->surname;
                }
            }
        }
    }
    /**
     * @return void
     */
    public function renderSessions()
    {
        $this->template->sessions = $this->registeredSessions;
    }
    /**
     * @return void
     */
    public function renderMe()
    {
        $this->template->me = $this->context->userRepository
            ->findBy(array('id' => $this->user->getIdentity()->id))
            ->fetch();
    }
    /**
     * @param  int $customerId
     * @return void
     */
    public function handleDeleteCustomer($customerId)
    {
        $ur = $this->context->userRepository;
        $customer = $ur->findBy(array('id' => $customerId))->fetch();

        if ($customer->photo) {
            \unlink(WWW_DIR . '/images/photos/' . $customer->photo);
        }

        $customer->delete();

        $this->flashMessage('Zákazník byl smazán.');
        $this->redirect('this');
    }
    /**
     * @param  int $employeeId
     * @return void
     */
    public function handleDeleteEmployee($employeeId)
    {
        $ur = $this->context->userRepository;
        $employee = $ur->findBy(array('id' => $employeeId))->fetch();

        if ($employee->photo) {
            \unlink(WWW_DIR . '/images/photos/' . $employee->photo);
        }

        $employee->delete();

        $this->flashMessage('Zaměstnanec byl smazán.');
        $this->redirect('this');
    }
    /**
     * @param  int $procedureId
     * @return void
     */
    public function handleDeactivateProcedure($procedureId)
    {
        $pr = $this->context->procedureRepository;
        $pr->findBy(array('id' => $procedureId))->update(array('activated' => FALSE));

        $this->flashMessage('Procedura byla odebrána z nabídky.');
        $this->redirect('this');
    }
    /**
     * @param  int $procedureId
     * @return void
     */
    public function handleActivateProcedure($procedureId)
    {
        $pr = $this->context->procedureRepository;
        $pr->findBy(array('id' => $procedureId))->update(array('activated' => TRUE));

        $this->flashMessage('Procedura byla navrácena zpět do nabídky.');
        $this->redirect('this');
    }
    /**
     * @param  int $procedureId
     * @return void
     */
    public function handleDeleteProcedure($procedureId)
    {
        $pr = $this->context->procedureRepository;
        $pr->findBy(array('id' => $procedureId))->delete();

        $this->flashMessage('Procedura byla smazána.');
        $this->redirect('this');
    }
    /**
     * @param  int $sessionId
     * @return void
     */
    public function handleCancelSession($sessionId)
    {
        $sr = $this->context->sessionRepository;
        $sr->findBy(array('id' => $sessionId))->delete();

        $this->flashMessage('Rezervace byla zrušena.');
        $this->redirect('this');
    }
Jan Tvrdík
Profil
PHPaddict:
Vezmu to odshora:

1. Metoda startup by měla být protected
2. Psát @return void anotace k action/render metodám je zbytečné
3. Místo $this->context je lepší použít DI
4. Pro názvy rolí by bylo zřejmě vhodnější použít konstanty
5. U vestavěných funkcí PHP (např. strtotime) není zvykem používat fully-qualified function name
6. Některé konstrukce by se daly dost zkrátit, ale zase na druhou stranu se to po tobě docela dobře čte, což může být v určitých situacích výhodnější.
7. handle* metody obsahují CSRF zranitelnost

Celkově je ten kód ale na velmi dobré úrovni. Vzhledem k tomu, že děláš v Nette, tak jestli do soboty neseženeš práci, tak doraz na Poslední sobotu, tam skoro vždycky řada firem shání programátory.

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: