@semicolon: jeśli robisz projekt pokroju allegro to zrozumiem, oczywiście oni tez zaczynali od czegoś szablonowego. Natomiast jeśli to mniejsze rzeczy, to nie zrozumiem. - mr_jaro
**Przykład #1 - renerowanie
**
Jak renderujesz z frameworkiem? Ja znam tylko dwa sposoby. Pierwszy to wystawienie API i renderowaniem zajmuje się klient pisany w react, a drugi sposób to statyczne renderowanie po stronie frameworka z użyciem języka szablonów typu jinja2.
Najszybciej mi się pisze statyczne renderowanie po stronie serwera, bo taka rzecz jest od razu wbudowana w framework. Z drugiej strony czasem mam dynamiczne komponenty na stronie, które są wręcz potrzebne, muszą być interaktywne - i w ich przypadku jquery to za mało. Czy to oznacza, że przechodzisz od razu na wystawianie samego REST API? Cóż.. gdybym miał kasę i 2 zespoły to nie zastanawiałbym się i podzieliłbym to na front i backend.
Jednak w przypadku trochę mniejszych nakładów lepiej iść w kierunku hybrydy. Ja robię tak, że w 1 języku mam komponenty zarówno dynamiczne jak i te statyczne. Mogę je renderować z poziomu serwera i tak robię przez dłuższy czas, bo tak szybciej mi się koduje. Natomiast tam gdzie będzie dynamiczny stan po stronie użytkownika tam wpinam się i podpinam jakiś komponent (mogę podmienić cały widok, ale też mogę podmienić wybrany komponent), który powinien być dynamicznie obsługiwany.
Co jeśli będzie coraz więcej dynamicznych elemnetów - żaden problem, po prostu kod który był renderowany po stronie serwera, od razu mogę wykorzystać bez żadnych przeróbek po stronie frontu. Czy moje podejście jest nienormalne?
Ja chętnie używałbym django, ale ono w tym przypadku jest dobre, gdy zdecyduje na wystawianie API restowo. Nie mniej takie django nie da mi: współdzielenia tych samych funkcji po obu stronach, współdzielenia stałych - i musiałbym pewne rzeczy dwa razy pisać i oczywiście pamiętać, by zmieniać wartości po obu stronach jeśli zajdzie taka konieczność.
**Przykład #2 - baza
**
Frameworkowy ORM taki jaki jest w django, pozwala budować składać rozmaite querysety stosując fluent api, do tego ma świetnie wspieracie w przypadku migracji, ma kilka narzędzia związanye z importem/eksportem, no i też takie modele fajnie się spina w adminie. To super narzędzie - o ile robisz dwutygodniowy projekt, tak na szybko.
W innych przypadkach taki ORM wnosi na pokład straty. Jakie? Przede wszystkim zakłada Ci na oczy czarną szmatę przez którą patrzysz na bazę. Baza to nie jest OOP i te dwa tematy za bardzo nie współgrają.
W django obiekt modelu jednocześnie jest kolekcją reprezentującą całą tabele do której wrzucasz sobie zmiany. Niektórzy do tych modeli dopisują biznesową logikę, co w ogóle jest szalone, bo ten obiekt to wiele nie ma wspólnego z abstrakcją - co to za obiekt skoro wszystkie pola ma publiczne?
Jak myślisz o klasach to masz też drugi problem, bo klasy w najprostszych przypadkach rzeczywiście mapują się 1 model na 1 tabelkę, ale z drugiej strony pisząc z ORM mało kto myśli o integralności. Mistrzowie ORM robią takie byty jak model, który ma pole w stylu kind, a ten kind opisuje rodzaj modelu, które obsługuje różne przypadki. Oczywiście część pół musi zostać nullable, by przeszło.
Natomiast taki ORM to nawet durnego złożonego PK pozwala zrobić, nie wspominając o tym, że upserty czy CTE to muszę na około kodować Czy mając ORM tracę? Pewnie TAAAAK, bo mam 70% zapytań, które mogę z zamkniętymi oczami napisać w surowym SQL, a te które najbardziej się dla mnie liczą piszę tak jakbym prezerwatywę nałożył sobie na głowę bo tak podobno jest bezpieczniej :D
**Przykład #3 - przepływ sterowania
**
Jak wczesnej mówiłem django jest dobre do wystawiania Restowego API. Co jeśli w projekcie pojawi się potrzeba posiadania websocketów? A no wtedy można użyć django-channels, pozwalają napisać synchroniczny kod który będzie czekał na asychroniczne zdarzenie. Inaczej mówiac piszesz blokujący kod do asynchronicznego przepływu, nie muszę tutaj tłumaczyć, że coś takiego rypnie przy większym obciążeniu, bo asynchroniczne workery same się zablokują.
Ty pewnie w PHP podzieliłbyś kod na dwie usługi. To co websocket ma robić wystawiasz w kierunku node, a resztę nadal kontynuujesz w php. Tyle, że takie rzeczy są bardziej problematyczne niż gdybyś wszystko robił w jednym języku, od teraz musisz kordynować projektem z perspektywy dwóch języków i do tego część robisz synchronicznie, a drugą część asynchronicznie.
A co zrobi taki PHP, gdy okaże się, że mieli dużo danych? Nawet jak masz node u boku to oba języki dany temat średnio wspierają. Node ułatwi Ci pukanie w API, PHP ułatwi Ci pobieranie danych z bazy, ale ogólnie kalkulacje, przetwarzanie xmli czy też kordynacją między bazą, a API od klienta zacznie Ci się powoli sypać, bo te języki nie zostały pomyślane do takich zadań. Przy większej współbieżności kod PHP wygląda tragicznie. W pythonie to nawet pamięciowo wygląda słabo, bo threading chodzi na jednym rdzeniu więc musisz mieć więcej procesów - co zjada dużo więcej pamięci niż gdybyś odpalił tłuściejszy jvm.
**Przykład #4 - złożona logika
**
Jak wygląda modelowanie logiki w takim PHP czy Pythonie? A no programiści idą w klasy, modelują sobie wymagania biznesowe, Ci lepsi to nawet SOLID stosują i też testy piszą, ale ostatecznie kod to mutowalne grafy, które zależą od baz, kolejek, api klienta. Wykonasz modyfikację w jednym miejscu, i nigdy nie wiesz czy to nie zacznie skutkować problemem w drugim miejscu. Czytając kod nie możesz się odciąć od reszty kodu, bo one ze sobą współgrają i są powiązane, a mało ostrożne zmiany będą skutkować kolejnymi problemami. Jeszcze gorzej jest gdy ciągniesz za sobą problemy z przykładów 2 i 3.
Problemy od 1 do 4 są stopniowym przejściem od najtańszej aplikacji w kierunku takiej, która będzie coś znaczyć. Jeśli framework to postawa to powinna z Ciebie zdjąć te 4 marginalne tematy, powinien dać Ci ramy, które pozwolą Ci pisać logikę. Natomiast Ty piszesz mi o jakiś jakiś core i pluginach, które rozsypią się przy ociupinkę większych wymaganiach niż miałeś na początku.
Oczywiście jeśli robisz dla kogoś projekty hurtowo to podejście frameworkowe jest spoko. Nie dość, że szybciej złapiesz więcej klientów, budujesz sobie reputacje, szybciej pokażesz im coś działającego. Natomiast jak klient wróci z większą liczbą nowych wymagań to już tym razem więcej zapłaci, bo dodawanie kolejnych rzeczy już nie będzie takie łatwe (właśnie czemu?). Nie tak jest?
semicolonsemicolon