•  175

Zagadnienia do rozmowy o pracę

Strona zawiera listę zagadnień wraz z opisami, których można się spodziewać na rozmowie o pracę. Co jakiś czas będę się starał dodawać kolejne zagadnienia oraz odpowiedzi do nich.

Zagadnienia związane bardziej z PHP i Frameworkami:

  1. PHP:
    1. Jakie są różnice między PHP a innymi językami programowania?
    2. Czym jest interpeter?
    3. Co to są "magiczne" metody PHP? Opisz 5 z nich.
    4. Jakie są rodzaje klas i do czego służą?
    5. Kiedy klasa może być finalna?
    6. Czym się różnia zmienne w klasie: private, public i protected?
    7. Co oznacza znak "?" przy argumencie metody/funkcji?
  2. Wzorce projektowe:
    1. Co to są wzorce projektowe?
    2. Jakie znasz wzorce projektowe?
    3. Jakie wyróżniamy rodzaje wzorców?
    4. Opisz SOLID.
  3. Zagrożenia i bezpieczeństwo:
    1. Jakie znasz rodzaje zagrożeń?
    2. Jakie znasz sposoby zabezpieczenia się przed powrzechnymi zagrożeniami?
    3. Co to jest XSS?
  4. Ogólne:
    1. Czym jest dla ciebie czysty kod?
    2. Czym jest przesilanie metod?
    3. Co to jest PSR?
    4. Co to jest hermatyzacja?
    5. O czym mówi prawo Demeter?
  5. Metodyki programowania:
    1. Co to jest programowanie obiektowe?
      1. Enkapsulacja
      2. Dziedziczenie
      3. Polimorfizm
    2. Co to jest programowanie strukturalne?
    3. Czym jest programowanie proceduralne?
  6. Inne:
    1. Agile
    2. Scrum

Co to są wzorce projektowe?

Wzorce programistyczne są sposobem wytwarzania oprogramowania, mającym na celu osiągnięcie założonego celu w sposób minimalizujący popełnienie błędów poprzez zachowanie ustandaryzowanego stylu programowania. Nie pozwolą one w pełni wyeliminować ów błędów, ale przy stosowaniu się do ogólno przyjętych zasad pozwalają na łatwiejsze usunięcie "usterek". Prawidłowe stosowanie się do wzorców ułatwia także późniejszą przebudowę kodu oraz poprawia jego czytelność. Ogólnie rzecz biorąc jest to rozpowrzechnione rozwiązanie powszechnego problemu, sytuacji z którą możemy się spotkać w czasie realizacji projektu. Wzorce wykorzystuje się w programowaniu obiektowym.

Źródło: https://4programmers.net/PHP/Wzorce_Projektowe#wzorce-projektowe

Jakie wyróżniamy rodzaje wzorców?

Dzielimy je na kreacyjne (konstrukcyjne) - opisujące proces tworzenia obiektów, strukturalne - opisujące struktury powiązanych ze sobą obiektów oraz czynnościowe (behawioralne) -opisujące zachowanie i odpowiedzialność współpracujących ze sobą obiektów.

Co oznacza znak "?" przy argumencie metody/funkcji?

Jest to nowość wprowadzona w PHP 7.1 oznaczająca możliwość wprowadzenia typowanego argumentu z wartością null np:

    public function __construct(
        string $notificationTypeField,
        bool $isSuccess = true,
        ?Gallery $gallery = null,
        ?GalleryItem $galleryItem = null,
        ?User $user = null,
        ?string $value = null,
        ?string $ip = null,
        ?string $referrer = null
    )

Czym jest dla ciebie czysty kod?

Jest stosowaniem się do ustalonych zasad programowania, nazewnictwa oraz formatowania.

Komentarze

W dobrym kodzie nie powinno być za dużo komentarzy. Elementy muszą być tak nazwane i skomponowane, aby po spojrzeniu na kod od razu było wiadomo, co która metoda robi, albo dana zmienna przechowuje. Zbyt szczegółowe opisywanie w formie komentarzy, często sprowadza się do próby opisania błędnego kodu, co jest niewłaściwym podejściem, gdyż powinno się raczej poprawić kod, aby był przejrzysty niż go zbędnie opisywać. Poza tym kod często się zmienia, ewoluuje - a przy tym rzadko pamiętamy o zaaktualizowaniu zawartości komentarza.

Kiedy nie stosować komentarzy
  1. "Nie używaj komentarzy jeśli można użyć funkcji lub zmiennej".
  2. Znaczniki pozycji - tj wcięcia typu: "-------------- ACTION //////////////". Ich zbyt duża ilość może zaśmiecić kod, ale czasami użycie takiego rozwiązania może być uzasadnione.
  3. Komentarze w klamrach zamykających. Są dozwolone jedynie w wyrażeniach wieloktronie zagnieżdżonych.
  4. Zakomentowany kod - jest wielkim złem! Często kolejni programiści nie mają odwagi na usunięcie takiego kodu, który może być już od dawna nieaktualny przez co może być ona powielany przez lata i tym samym brudzić nasz kod.
Kiedy warto stosować komentarze?

Np jeśli operujemy na bibliotekach zewnętrznych i nie do końca rozumiemy znaczenie niejasnych argumentów lub zwracanych wartości. Wskazane wtedy jest skomentowanie fragmentu kodu, aby bardziej precyzyjnie nakierował nas na to co się dzieje.

Ostrzeżenia o konsekwencjach - czasami uzasadnione wydaje się dodanie dodatkowe opisu, kiedy z góry nasuwa się zastosowanie prostrzego rozwiązania, a nie jest ono w danym przypadku odpowiednie np ze względu na bezpieczeństwo lub wydajność. W momencie pisania kodu pamiętamy o tym, ale za jakiś czas inny programista lub my sami, możemy zrefaktoryzować kod, uznając to za oczywiste, zapominając o negatywnych konsekwencjach.

Komentarze todo - są użyteczne jeśli np potrzebujemy dodać notatkę o usunięciu lub przebudowaniu fragmentu kodu, ale z jakiś powodów nie możemy zrobić tego w danym momencie. Należy pamiętać, aby projekt nie był nafaszerowany zbyt dużą ilością takich zapisów. Aby tego uniknąć powinno na bieżąco rozwiązywać problemy z tym oznaczeniem.

Komentarze wymagane - "wymaganie, aby każda funkcja posiadała "docs opisy" jest po prostu głupie. Tego Typu komentarze tylko zaciemniają kod". Źródło: "Czysty kod - podręcznik dobrego programisty", strona 85.

O czym mówi prawo Demeter?

Programując obiektowo, możesz zauważyć, że często odpytujesz obiekt, a następnie na na podstawie odpowiedzi podejmujesz odpowiednie akcje. Nie jest to do końca zgodne z "teorią czystego kodu".

"Kod proceduralny dostaje informacje, a następnie podejmuje decyzje. Kod obiektowy mówi obiektom co mają robić."

Ogólnie rzecz biorąc zgodnie z prawem Demeter, powinno się mówić obiektom co mają robić, zamiast odpytywać je i na tej podstawie kazać im coś zrobić.

Niedobrze:

class Post {
 
    public function send($user, $content)
    {
        if ($user instanceof FacebookUser) {
            $user->sendMessage($content);
        } else if ($user instanceof EmailUser) {
            $user->sendEmail($content);
        }
    }
 
}

Lepiej:

class Post {
 
    public function send($user, $content)
    {
        $user->send($content);
    }
 
}
 
class FacebookUser {
 
    public function send($content)
    {
        $this->sendMessage($content);
    }
 
}
 
class EmailUser {
 
    public function send($content)
    {
        $this->sendEmail($content);
    }
 
}
4 zasady:

Prawo Demeter mówi, że metoda danego obiektu może odwoływać się jedynie do metod należących do:

  1. tego samego obiektu
  2. dowolnego parametru przekazanego do niej
  3. dowolnego obiektu przez nią stworzonego
  4. dowolnego składnika, klasy do której należy dana metoda

Częstą sytuacją, która może sugerować, że Twój kod łamie powyższe punkty, jest otrzymywanie błędu typu: Trying to get property of non-object.

Źródła: "Czysty kod - podręcznik dobrego programisty", strona 117, http://itcraftsman.pl/powiedz-nie-pytaj-czyli-prawo-demeter/

Czym jest programowanie proceduralne?

Metodyka ta jest oparta na założeniu o potrzebie dekompozycji problemów i tworzeniu programów w taki sposób, że blok główny programu stanowi szkielet, przez co określa kolejność toku prowadzonych operacji, natomiast za poszczególne operacje odpowiadają bloki podprogramów w postaci procedur oraz funkcji.

Zalety:

  • możliwość dekompozycji kodu
  • podobieństwo formy kodu maszynowego i źródłowego.

Wady:

  • duża ilość zmiennych
  • rozdzielenie danych i operacji na nich wykonywanych
  • brak grupowania danych w sposób logiczny

Źródło: https://4programmers.net/Z_pogranicza/FAQ/Metodyki_programowania#programowanie-proceduralne

Czym jest programowanie obiektowe?

Metodyka wiąże się z analizą obiektową, jednak nie jest z nią tożsama. Do podstawowych pojęć paradygmatu należą:

  • klasa,
  • obiekt,
  • metoda,
  • pole,
  • enkapsulacja,
  • dziedziczenie,
  • polimorfizm.

Program obiektowy składa się z bloku głównego (który często jest metodą określonej klasy lub obiektu). W ramach tego bloku mogą być tworzone obiekty pewnych klas. Podejście obiektowe pozwala na łączenie danych oraz funkcji, które na nich operują, w jedną całość. Pozwala również na łatwe rozdzielenie fragmentów kodu, odpowiadających za opis osobnych elementów wycinka rzeczywistości, przedstawianych przez kod programu. Znamiennym jest przekazywanie całych obiektów do wywoływanych metod i operowanie na nich, zamiast wykonywania bezpośredniego dostępu do danych, co często jest ograniczone przez określenie zakresu widoczności pola lub metody (enkapsulacja).

Zalety:

  • możliwość łatwej dekompozycji kodu
  • powiązanie danych i operacji na nich wykonywanych
  • możliwość ograniczenia dostępu do danych lub operacji w określonych miejscach kodu

Wady:

  • częsta potrzeba wykorzystania dużej ilości nadmiarowego kodu do zdefiniowania klas
  • potrzeba przeprowadzenia szczegółowej analizy i projektowania budowy klas z uwzględnieniem widoczności metod

Źródło: https://4programmers.net/Z_pogranicza/FAQ/Metodyki_programowania#programowanie-obiektowe