Put do PHP developera
Ovaj vodič za učenje PHP programiranja namijenjen svima onima koji počinju učiti programirati te onima koji već imaju programerskog iskustva i smatraju se potencijalnim developerom za Inchoo. Ako želite graditi karijeru u web developmentu, uz učenje programskih jezika svakako je bitno poznavati osnove baza podataka te imati razumijevanja kako web funkcionira. Česte su prijave kandidata koji su proveli određeno vrijeme radeći u nekom frameworku (npr. Laravel, Symfony), ali ne razumiju osnove baza podataka i weba jer se framework pobrine za low-level stvari.
Zato smo sastavili ovaj Starter Kit kako bismo vam pokazali odakle početi, ali i pomogli razlučiti bitno od nebitnog. Svrha pitanja u tekstu koji slijedi je da usmjeri kandidata prema znanjima koje je potrebno steći kako bi bio kandidat za programersku poziciju u našoj tvrtki.
Web
Brojni kandidati mjesecima ili čak godinama rade na učenju nekog od web programskih jezika, a ne pokažu razumijevanje kako web funkcionira. Smatramo kako takva osoba onda uđe u začarani krug gdje daljnje učenje samog programskog jezika ne vodi prema povećanju sposobnosti rješavanja programerskih izazova u web okolini.
Koliko god vam sljedeća pitanja bila banalna, zapitajte se znate li ih uistinu odgovoriti:
- Što je to Internet i kako funkcionira?
- Što je server, a što klijent?
- Što je URL? Što je domena? Čemu služi DNS?
- Što je web preglednik (browser) i čemu služi?
- Što se događa kad upišemo URL u browser (recimo: http://www.osijek.hr)? Ne morate znati svaki detalj, ali morate na jednostavan način, kao da objašnjavate svojoj tetki, ispričati što se sve događa.
- Što je HTTP, a što HTTPS protokol i koja je razlika?
- Što je “HTTP Request”, a što “HTTP Response” i od čega se sastoje?
- Koje HTTP Request metode postoje i kako ih identificirati?
- Što su HTTP Status Codes? Nabroji par najčešćih.
- Kako možemo pogledati HTTP Request i Response detalje unutar web preglednika (browsera)?
- Što su i čemu služe kolačići (Cookies)? Gdje se spremaju i kako rade?
- Što je i čemu služi Session? Gdje se sprema i kako radi?
- Što je API i kako funkcionira?
- Što je REST arhitektura i kako funkcikonira REST API?
Linkovi:
- https://developer.mozilla.org/en-US/docs/Learn/Getting_started_with_the_web/How_the_Web_works
- https://www.mkyong.com/computer-tips/how-to-view-http-headers-in-google-chrome/
- https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#record
- https://www.tutorialspoint.com/http/http_overview.htm
- https://stackoverflow.com/questions/11142882/how-do-cookies-and-sessions-work?#answer-11143263
HTML & CSS
Iako posao backend developera primarno uključuje rad na server strani, potrebno je bar osnovno znanje HTML-a i CSS-a. Pitanja za samoprovjeru:
- Koja je struktura HTML dokumenta?
- Nabrojiti barem 10 HTML tagova i znati čemu služe.
- Što su meta tagovi?
- Koji form input tipovi postoje?
- Što je novo u HTML 5?
- Što je CSS i čemu služi?
- Koji CSS selektori postoje?
- Kako dodajemo CSS u HTML dokument?
- Koja je razlika između block i inline elemenata?
- Što je RWD (Responsive Web Design) i kako radi?
- Znate li “iz glave” izdiktirati HTML konstrukciju za 3×3 tablicu gdje je prvi red zaglavlje, a ćelije su u zadnjem redu spojene?
Ukratko, PHP developer mora poznavati osnove HTML-a. Osnove se usvoje za tjedan dana kroz većinu dostupnih HTML tutoriala na webu.
Razvojno okruženje
Nakon prethodno navedenih pitanja vezanih uz opće znanje weba, možemo krenuti u namještanje radnog okruženja za učenje.
Svakom developeru treba razvojno okruženje. To je skup alata za razvoj, testiranje i debugiranje vašeg softwarea. Za razvoj PHP aplikacija prije svega nam je potreban web server (Apache) koji može izvršavati PHP kod te server baza podataka (MySQL). Ako ste početnik u PHP programiranju, od pomoći će vam biti aplikativna rješenja poput AMPPS (Mac/Windows) – Apache, Mysql, PHP/Perl/Python, ili LAMP (Linux) – Linux, Mysql, PHP/Perl/Python koji u jednom instalacijskom paketu podešavaju kompletan server za vas. Iako je dovoljno za početak učenja koristiti Windows/Mac operativni sustav, backend developeri u našem radnom okružju koriste proizvoljnu distribuciju Linuxa za development zbog lakšeg snalaženja na produkcijskim serverima.
U nastavku su nabrojani neki od preporučenih alata za početnike i alati za naprednije.
Početno | Napredno |
---|---|
ampps | xdebug |
IDE (Visual Studio Code, Sublime, Atom) | MySQL console |
GIT & GitHub | Docker |
phpMyAdmin |
PHP
Idući korak su samostalne sistematske edukacije s materijalima dostupnim putem interneta ili putem tečajeva. Portali poput codecademy.com, w3schools.com, tizag.com i freecodecamp.com poznati su u programerskoj zajednici kao dobar primjer početne edukacije i usmjeravanja u određenu tehnologiju (PHP, MySQL, XML). Također, neki će odabrati tečaj u nekoj od postojećih obrazovnih ustanova poput Edunove ili Algebre.
Jednom kada usvojite osnove PHP-a i tehnologije s kojom se isprepliće, slijedi detaljnije upoznavanje sa samim PHP programskim jezikom. Language References je dio službenog PHP priručnika koji je obavezno štivo za sve koji misle ozbiljno. Strings, Arrays, Sessions, Cookies skupa s par ostalih nabrojanih tematskih cjelina čine neizostavan dio vašeg budućeg koda. Kada ste svladali sam programski jezik, vrijeme je da podignete vaše znanje na novu razinu i pređete među naprednije programere upoznavajući se s Design Patternima kao što su Factory, Singleton, Observer, Adapter i Dependency Injection.
Primjeri pitanja za samoprovjeru:
- Koje superglobalne varijable postoje i čemu služe?
- Kako kontroliramo Session i Cookies kroz PHP? Gdje se spremaju? Kako ih možemo pročitati ili izmijeniti?
- Kako funkcionira autentifikacija (login) usera u nekoj aplikaciji? Objasnite cijeli process.
- Kako se pohranjuju osjetljivi podaci kao što su lozinke u bazu podataka?
- Kako funkcionira upload datoteka na server preko forme? Objasnite cijeli proces.
- Što je klasa, a što objekt?
- Koja je razlika između public, protected i private metode?
- Što je static metoda ili property?
- Što je $this, a što static/self?
- Što je Abstract class, a što Interface i koja je razlika?
- Što je Inheritance i koje su razlike korištenja Dependency Injection u odnosu na Inheritance (composition over inheritance)?
- Objasnite zašto i kako koristimo Interface u PHP-u.
- Koje magične metode postoje, koja im je svrha i u kojem se trenutku izvršavaju?
- Što je PDO?
- Što su “design patterni” i koje poznaješ u PHP-u?
Tijekom učenja ćete steći iskustvo izrade neke vlastite web aplikacije. Ona je ogledalo vašeg pristupa programiranju. Nas ne zanima jeste li tu aplikaciju napravili za klijenta ili ste je radili za svoju dušu. Ne zanima ni nas je li vam to prva, druga ili petnaesta aplikacija. Mi ćemo procjenjivati kako je napisana i kako je organizirana.
Ako u ovom trenutku još nemate nešto za pokazati, odvojite si vremena da napravite rad koji će biti slika vašeg znanja i pristupa programiranju.
MySQL
Često se dogodi da kandidati preskoče učenje osnova baza podataka i prerano krenu u PHP frameworke. Kandidat mora steći znanje da “iz glave” zna postaviti upite gdje povezuje 2-3 tablice. Toplo predlažemo svima da u procesu edukacije odvoje 2-3 tjedna fokusiranih vježbi za MySQL i da u tom periodu ne koriste programski jezik. Predlažemo nabavku neke MYSQL knjige s primjerima i vježbama.
Primjeri pitanja za samoprovjeru:
- Koji tipovi podataka postoje?
- Zašto sva tekstualna polja ne snimamo pod TEXT data tip?
- Koja je razlika između CHAR (16) i VARCHAR (16). Kad pripremiš prvi odgovor, istraži dubinsku razliku i ponovo odgovori na pitanje.
- Što su Primary, Foreign i Unique keyevi i čemu služe?
- Za što služi escapanje HTML-a?
- Što je MySQL injection?
- Što su Cascade i kakve veze imaju s Foreign key?
- Koji JOINovi postoje i što rade?
- Nabrojite par tipova relacija.
- Koje agregatne funkcije postoje i što koja radi?
- Što radi GROUP BY?
- Što je Index i kad se koristi?
- Što je trigger i u kojim slučajevima se koristi?
JavaScript
Primjeri pitanja za samoprovjeru:
- Osnove JavaScripta
- Što je DOM API?
- Kad se izvršava DOM ready event?
- Kad se JavaScript učitava i kada se izvodi?
- Što je JavaScript scope?
- Što je AJAX poziv i kako ga napraviti?
- Što su event listeneri i kako i kada se koriste?
Ostalo
Upoznati se sa sljedećim tehnologijama:
- Git – instalirati i isprobati čemu služi, napraviti account na Githubu ili Bitbucketu
- Što je composer, instalirati ga i isprobati
Važna je i web prisutnost!
Osim samog znanja programiranja, svaki programer bi trebao poraditi i na svojoj vidljivosti na internetu. Više je razloga za to. Jedan od njih je community koji dijeli vaše interese prema tehnologiji s kojim biste kasnije stupili u kontakt ako naiđete na nekakve poteškoće u razvoju vašeg softwarea ili ako želite podijeliti znanje s drugima. Drugi razlog je vidljivost prema potencijalnim budućim poslodavcima. Primjerice, ako imate par projekata dignutih na GitHub oni vam mogu poslužiti kao dio vašeg budućeg CV-a.
U nastavku su nabrojani samo neki od portala na kojima vam preporučujemo da otvorite profil ako sebe vidite kao budućeg PHP developera.
Zadatak
Pripremili smo ovaj zadatak kako bi primarno početnici dobili uvid u funkcioniranje jedne moderne PHP aplikacije i funkcionalnosti vezane za tu aplikaciju. Rješavanje ovog zadatka uvelike povećava vašu šansu za zapošljavanjem jer upućuje u fundamentalna znanja potrebna za uključivanje u web.
Za koga je zadatak:
- krećete s programiranjem te nemate još nikakav projekt iza sebe
- imate projekt iza sebe, ali ne razumijete neke od stavki navedenih u zadatku
Zahtjevi (kako izraditi aplikaciju):
- Mora biti napisana objektno u “čistom” PHP-u tj. ne smije se koristiti gotovi PHP framework.
- Mora pratiti MVC pattern i imati jedan entry point:
https://en.wikipedia.org/wiki/Model-view-controller
https://www.zenofcoding.com/2009/01/06/another-way-to-think-about-mvc - Mora raditi u PHP 8.2 i koristiti MySQL bazu podataka.
- Za učitavanje klasa potrebno je koristiti autoloader i namespaces:
https://www.php.net/manual/en/language.oop5.autoload.php
https://www.php.net/manual/en/language.namespaces.php - Za komunikaciju s bazom potrebno je koristiti PDO:
https://www.php.net/manual/en/book.pdo.php - Potrebno je koristiti Git version control system i redovito commitati:
https://git-scm.com - Kod mora biti objavljen na nekom Git repository hosting servisu:
https://github.com - Sva imena varijabli, klasa, funkcija, komentari u kodu, commit poruke i sl. moraju biti na engleskom jeziku.
- Za instanciranje objekata koristiti Singleton design pattern gdje je potrebno
https://refactoring.guru/design-patterns/singleton/php/example - Po potrebi koristiti i ostale design patterne https://refactoring.guru/design-patterns
Neobavezno:
- Frontend framework:
http://getbootstrap.com
https://foundation.zurb.com
Obratiti pažnju na:
- Password hashing.
- Tipove podataka, primary/foreign/unique keys, kaskade i indexe u bazi podataka.
- Cross-Site Scripting (XSS).
- Coding standard:
https://www.php-fig.org/psr/psr-1
https://www.php-fig.org/psr/psr-12
Shared gallery
Napraviti web aplikaciju koja će sadržavati 3 stranice nelogirane korisnike :
1. home
- proizvoljno uređena naslovna stranica + button koji na klik pokazuje ukupan broj slika (ne prikazuje same slike) od svih korisnika zajedno bez refresha stranice (Ajax request) za sve korisnike (ulogirane i nelogirane)
2. login
- tu će se odvijati registracija korisnika i login već postojećih korisnika
- remember me (use cookies)
3. registration (staviti poveznicu na login koja vodi ovdje)
- gdje će korisnik napraviti account (potrebna polja, username, email, password, ponovi password)
i dodatne 2 stranice za logirane korisnike :
1. Management
- gdje će logirani korisnik moći uploadati slike (isključivo formata .png i .jpg)
- gdje će se prikazivati već uploadane slike od svih korisnika u tablici zajedno sa username-om korisnika koji ih je uploadao, njegovim emailom i adresom. Moguće je prikazivati više uploadanih slika po korisniku. U tablici mora postojati “remove” button koji će obrisati sliku, ali sliku može obrisati samo korisnik koji ju je i stavio, ostali korisnici ne smiju imati mogućnost brisanja slike, i ne smije im se prikazivati “remove” button. Podatci potrebni za tablicu moraju biti dohvaćeni u samo jednom MySQL upitu.
2. My account
- gdje će korisnik moći mijenjati svoje podatke (password)
- gdje će korisnik moći obrisati svoj account pritiskom na “Remove Account” button i time sve vezano za njega (pa i slike)
Baza podataka:
Potrebno je sam odrediti broj tablica, najlogičnije tipove podataka za polja, naći primjenu i koristiti primary/unique/foreign keys gdje je potrebno, kaskade (brisanje korisnika mora obrisati sve podatke vezane za njega, također i slike uploadane na server od strane korisnika).
Opcionalno: potrebno je napraviti PHP skriptu koja pri pokretanju odredi da li postoje tablice u bazi. Ako ne postoje skripta ih treba napraviti i pripremiti bazu za rad sa podatcima (napraviti tablice, potrebna polja i njihove relacije).
Napomena
Molimo da rješavanju ovog zadatka pristupite s razumijevanjem. Na kasnijem interviewu ćemo ispitati razumijevanje toga što je napravljeno, pa bilo kakvo kopiranje koda od treće osobe neće pomoći u zapošljavanju.
Kako se prijaviti za posao u Inchoou?
Kao što smo već spomenuli, u Inchoou gotovo polovinu zaposlenika čine PHP developeri. S obzirom na velik broj projekata na kojima radimo, u stalnoj smo potrazi za kvalitetnim programerima, bilo da su oni iskusni senior developeri ili perspektivni početnici.
Neovisno o tome imamo li raspisan natječaj za posao backend developera ili ne, ukoliko ste prošli većinu onoga što je nabrojano u prijašnjim koracima, a željni ste novih izazova kroz timski rad, pošaljite nam na posao[at]inchoo.net primjere koda projekata na kojima ste radili i CV. Rješavanje zadatka koji smo postavili iznad, bit će bonus u vašoj prijavi!
Na svaku prijavu odgovaramo bilo pozivom na razgovor, praksu ili praćenjem napretka i usmjeravanjem u daljnju edukaciju sa željom da nam se ponovno javite kada još malo poradite na svom znanju.
U testu smo naveli neka područja i pitanja koja prolazimo. Ovo ne znači da ispitujemo točno i isključivo ta pitanja ukoliko budete pozvani na interview. Ona su ovdje navedena da posluže kao primjeri koji će vam pokazati što nam je bitno.
Ne zaboravite, i profesionalci su nekoć bili amateri u svom području. Zato je važno početi!