Wątek przeniesiony 2021-10-25 14:53 z Edukacja przez cerrato.

Dobór technologii do projektu - jak do tego poprawnie podejść.

0

Witam!

Od pewnego czasu nurtuje mnie pewna rzecz, a dokładniej w jaki sposób poprawnie dobierać technologie do projektów. Zastanawiam się w jaki sposób osoby odpowiedzialne za projekty podejmują decyzję że akurat ta, a nie inna technologia będzie odpowiednia. Rozumiem że w pewnym stopniu jest to efekt dużego doświadczenia i wielu przepracowanych godzin, aczkolwiek tak się zastanawiam co w przypadku kiedy nie mieliśmy styczności z daną technologią? Jak wybrać technologię żeby w pewnym momencie nie stanąć przed "martwym punktem" który może doprowadzić do upadku projektu lub spowodować wielkie kłopoty z których nie dało by się wyjść?

Zastanawiam się nad tym zagadnieniem, ponieważ mega mnie to ciekawi, a zarazem też zmusiły mnie tego studia. Aktualnie pracowałem w bardzo podstawowych technologiach czyli HTML, CSS, JS no i do tego PHP (framework Laravel), na tym opierałem swoje projekty na studiach, na tym pracowałem i to mi wystarczało. Aczkolwiek wiadomo trzeba się rozwijać, pojawił się nowy projekt na horyzoncie i chciałbym zaplanować go z głową, tak żeby praca nad nim była ciekawym doświadczeniem.

Mój projekt opiera się na stworzeniu prostej webowej aplikacji społecznościowej (z funkcjonalności to planuje stworzyć dodawanie użytkowników, możliwość wyszukiwania, lub losowania użytkowników oraz możliwość rozmowy poprzez prosty komunikator). Na podstawie tej aplikacji chciałbym przetestować bazy danych MySQL oraz Neo4J. Bardziej mi chodzi o przedstawienie zalet i wad każdej z bazy danych w trakcie tworzenia takiego projektu, a także przeprowadzenie małych testów wydajnościowych np. która baza będzie szybciej wyszukiwała użytkowników w trakcie filtrowania itd.

Aktualnie stoję przed wyborem niezbędnych technologii do tego właśnie projektu. Myślałem żeby po stronie Front-endu postawić na Reacta, natomiast backend postawić w Node.JS wraz z Expressem, aczkolwiek nie wiem czy jest to dobry wybór. CO do testowania wydajności baz dopiero rozpatruję się w temacie i będę szukał odpowiednich technologii, dostosowanych też do głównego stacku aplikacji. Może ktoś z was zna jakieś strony, książki albo miejsca w internecie gdzie można poczytać na temat wad i zalet danych technologii? Czy istnieje jakaś strona która opisuje w jakich zastosowaniach "codziennych" dana technologia spisuje się najlepiej (lub najgorzej)?

Gdyby ktoś miał ochotę porozmawiać na temat projektu, i doradzić coś od siebie, tak prywatnie, to jestem bardzo otwarty na rozmowę, zapraszam do pisania na "Priv".

Z góry dziękuję za pomoc.

5

Eh

Od pewnego czasu nurtuje mnie pewna rzecz, a dokładniej w jaki sposób poprawnie dobierać technologie do projektów.

eh, eh

Rozumiem że w pewnym stopniu jest to efekt dużego doświadczenia i wielu przepracowanych godzin,

Ogolnie im wiecej przepracujemy godzin w technologii X tym chetniej wybieramy technologię X. I to czesto jest bardzo dobry wybór bo najtańszy i najszybszy.

Jak wybrać technologię żeby w pewnym momencie nie stanąć przed "martwym punktem" który może doprowadzić do upadku projektu lub spowodować wielkie kłopoty z których nie dało by się wyjść?

Przed murem stanął i FB i Allegro. Ale wcześniej tyle zarobili że mieli pieniądze na pokonanie tego muru

Na podstawie tej aplikacji chciałbym przetestować bazy danych MySQL oraz Neo4J

To akurat są dwie zupełnie różne bazy do dwóch różnych celów:

  • MySQL jest bazą relacyjną i konkurencją dla niej jest PostgreSQL i Oracle (Oracle jak lubisz płacić). Co ciekawe programiście PHP częsciej wybierają MySQL, a programiści Javy - PostgreSQLa lub Oracle (tu akurat głównie starzy korpo programiści)
  • Neo4J to baza grafowa do zupełnie innych celów, nie znam konkurencji dla niej

natomiast backend postawić w Node.JS

Nigdy nie zorzumiem co ludzie widzą w tym umartwianiu się dynamicznie typowanymi językami. Dla mnie są to predyspozycje do szaleństwa :P

Czy istnieje jakaś strona która opisuje w jakich zastosowaniach "codziennych" dana technologia spisuje się najlepiej (lub najgorzej)?

Ogólnie 75%* problemów rozwiążesz w najpopularniejszych językach programowania, które mają wszystko czego potrzebujesz. No dobra, niektóre nie mają statycznego typowania

* statystyka totalnie zmyślona, ale tylko dwa razy widziałem że użyto języka do projektu na podstawie tego że miał jakieś killer feature:

  • raz był to Erlang/Elixir z pattern matchingiem dla danych binarnych
  • raz była to Scala ze Sparkiem

Co do mnie to i moich osobistych preferencji to wybierał bym tylko statycznie typowane języki funkcyjne, takie prywatne zboczenie. Mam nadzieję że pomogłem :P

7
Krispi One napisał(a):

Witam!

Od pewnego czasu nurtuje mnie pewna rzecz, a dokładniej w jaki sposób poprawnie dobierać technologie do projektów.

Zastanawiam się w jaki sposób osoby odpowiedzialne za projekty podejmują decyzję że akurat ta, a nie inna technologia będzie odpowiednia.

Są dwie najpopularniejsze metody:

  • hype driven development - wybieramy to, co jest modne i na fali. Robimy w najnowszych technologiach i jesteśmy pionierami. Czasem do tego stopnia, że używamy technologii, do których nawet dobrej dokumentacji nie ma, jednak jeśli mimo to uda nam się zrobić aplikację, to możemy napisać posta w necie z case study i zyskać sławę.

  • "choose boring technology" - czyli wybieramy te technologie, które znamy (ew. te, które istnieją już od dawna i są ciągle popularne). Żadnej podjary nie ma, ale przynajmniej będzie działać, bo zawsze działało, bo wszystkim działa.

Czyli wybór pomiędzy Rustem a C++, pomiędzy NoSQL a SQL, pomiędzy Kotlinem a Javą, między najnowszą wegańską sałatką z maka a schabowym.

ew. jeszcze trzecia opcja (którą można łączyć z poprzednimi):

  • resume/CV driven development

Czyli wybieramy takie technologie, których chcemy się nauczyć, żeby mieć co do CV później wpisać. Czyli jak nie znasz np. Angulara, to najlepiej wybrać Angulara, nauczysz się w trakcie robienia i wpiszesz sobie do CV później.

Rozumiem że w pewnym stopniu jest to efekt dużego doświadczenia i wielu przepracowanych godzin, aczkolwiek tak się zastanawiam co w przypadku kiedy nie mieliśmy styczności z daną technologią? Jak wybrać technologię żeby w pewnym momencie nie stanąć przed "martwym punktem" który może doprowadzić do upadku projektu lub spowodować wielkie kłopoty z których nie dało by się wyjść?

Jeszcze jest opcja trochę rzadziej spotykana (niestety!), a mianowicie:

  • PoC driven development - czyli jeśli chcesz sprawdzić, czy dana technologia jest dobra, to robisz "proof of concept" - sprawdzasz w praktyce np. jak się robi aplikację społecznościową używając danego stacku technologicznego, po zrobieniu prototypu dokonujesz refleksji, czy chcesz kontynuować, czy może lepiej zrobić to używając innych technologii itp. Wtedy możesz spędzić kupę czasu na robieniu tych PoCów, ale hej, przynajmniej sprawdziłeś wszystkie opcje.
2

Technologie wybierają się same. Albo przez to co już zastałeś w projekcie i mimo płaczu nie zmienisz, albo klient/firma ci każe zrobić coś w czymś, albo masz zespół C#, to nie wciśniesz tam czegoś innego. W większości przypadków nie ma żadnego znaczenia, czy projekt będzie w PHP, Javie, C#, będzie dane przechowywać w MySQL, MsSQL, PostgreSQL, jedynie Oracle podnosi zużycie środków przeciwwymiotnych i powoduje, że jak byś pięknie nie napisał kodu aplikacji, to wciąż w projekcie masz najbardziej renomowany legacy komponent na świecie.
To co ma znaczenie, to architektura aplikacji - czy to ma być OPA z jakimś backendem, czy może jakiś server side rendering z tłumem uS za nim, czy dane bardziej pasują do NoSQL, czy lepiej użyć RDBMS. Tylko akurat odpowiedź na te pytania jest mocno zależna od tego co ta aplikacja ma robić, jakie wymagania spełniać.

0

@Miang: Wpis do komentarza z poprzedniego postu:

odnośnie wyboryu bazy danych widzisz różnicę, odnośnie języka i środowiska nie, ale ta różnica jest mimo ze jej nie widzisz

Najpierw łatwiejsza część - bazy danych. Widzę różnicę pomiędzy rodzajem bazy danych. Przechowywanie danych w sposób relacyjny ma swoje bardzo duże plusy (np. elastyczność) i bardzo duże minusy (np. brak skalowalności). Nie widzę natomiast różnicy pomiędzy użyciem MsSQL lub MySQL w 99% projektów, bo to co dostajesz ekstra, to funkcje, z których nie korzystasz, typu kostki OLAP. Jeżeli chcesz zrobić narzędzie do analizy danych w tabelach przestawnych, spinające się z Excelem, to jasne, że użyjesz MsSQL, ale znowu 99% projektów tego nie potrzebuje. W przypadku NoSQL sprawa jest bardziej złożona, bo takich produktów jest od groma i jedyną wspólną ich częścią jest nie używanie SQL.

Bardziej skomplikowana część - języki programowania
Oczywiste jest, że istnieją specjalizowane języki programowania, do pewnej kategorii zadań, jak potrzebujesz pobawić się macierzami, to Matlab będzie doskonały, ale GUI raczej w nim nie zrobisz, Access też ma swoje plusy w przypadku prostych projektów bazodanowych. Czasami nie masz możliwości wyboru, bo jak bardzo by nie kombinować, to WWW bez HTML'a i JS nie zrobisz (ok, czasami może ci się wydawać, że tego nie ma, bo ktoś schował to pod dywanem).
Jeżeli chodzi o najbardziej typowe obecnie zastosowania, czyli backendy, oraz języki z mainstreamu czyli .NET, Java, PHP, Python, to już różnicy w 99% przypadków nie ma, patrząc od strony szans powodzenia projektu. Owszem, jak coś ma obsłużyć dużo żądań, to lepiej użyć np. Javy, a jak coś ma raz na ruski rok odpowiedzieć, że żyje, to PHP będzie lepsze, bo tańsze, ale w obu tych językach da się zrobić to w tym bardzo podobnym czasie i jakości. To, że mam swoje preferencje i wolę użyć narzędzia, które znam, niż narzędzia, którego nie znam to oczywistość, podobnie jak to, że ktoś inny może np. woleć PHP i zakładając, że swoje narzędzia mamy opanowane w podobnym stopniu, to wynik też będzie podobny. Oczywiście można napisać, że użycie Delphi do zastosowań serwerowych jest dziwne, podobnie jak użycie Java do pisania aplikacji desktopowych, ale to również oczywistość.

Co do frameworków, np. forntendowych - znowu, moim zdaniem wybór któregoś nie ma znaczenia, zakładając, że wybiera się z kilku popularnych, bo wiadomo, że można wybrać coś co zostało napisane dla jaj, albo ostatnia wersja wyszła 10 lat temu.

Ponieważ wydajność programistów nie zależy od wybranej technologii, a od tego jak bardzo ją opanowali, wybór czegoś co twój zespół już zna, zwykle jest lepszym pomysłem niż wybieranie czegoś, czego jeszcze nie zna. Albo wybrania doskonałej technologii, do której nie znajdziesz na rynku ludzi.

6

Zgadzam się z przedmówcami.

Trzeba pomiętać, że decyzje takie jak wybór technologii w zasadzie nigdy nie są podejmowane racjonalnie. Bo w zasadzie brak jest rozsądnych, jasnych kryteriów. Jak ktos narobi dużo tabelek to tylko znaczy, że miał problem z sensownym uzasadnieniem swojego wyboru, który i tak został dokonany najpierw... - długo przed tabelkami.

Ogólnie w 99% projektów technologia nie spotkasz się z żadnymi faktycznymi limitami technologii.
Co najwyżej:

  • ludzie będą narzekać, że pracują ze znanymi, ale przestarzałymi technologiami i będą nieefektywni,
    albo

  • ludzie będą narzekać, że pracują z nowymi, słabo znanymi i nieprzestestowanymi technologiami i będą nieefektywni.

1

Raczej dość prosto, bierzesz to co znasz albo lubisz.

Projekty skomplikowane technicznie są robione przez ekspertów domenowych i oni wiedzą które problemy są albo mogą być trudne do rozwiązania więc mogą wybrać pod nie język (np. system operacyjny to raczej będzie C/C++/Rust a nie Python/Javascript etc.). Jak nie jesteś ekspertem domenowym, albo jeszcze nie wiesz ze twój projekt jest skomplikowany technicznie to nadal wybierasz to co znasz i lubisz, bo i tak nie jesteś w stanie wybrać dobrze.

0

Hmm do wpisu dodam, ze technologia jest czymś innym niż klasyfikacja problemu.

Upraszczajac. Jeżeli twoja baza ma zapotrzebowania do tworzenia raportów, wiesz, ze będzie większy odczyt niż zapis.
To można to sklasyfikować bardziej jako problem pod relacyjną, natomiast jeżeli wiesz ze bedziesz miał duży write, nie wiesz co bedziesz zapisywał, chcesz mieć większa skalowalność niskim kosztem to dokumentowa.

Modne i zasadne jest podejście, gdzie szukasz driverów a później robisz ADR. Dzielisz się z programistami, każdy proponuje cos od siebie.

Druga sprawa to warstwowanie twojego kodu. Jak dobrze odseparujesz zlozonosc to pochodną będzie możliwość wymiany czegoś co łączy się z twoim kodem np bazy danych, resta... Oczywiście to przypadek który na 99% nie powstanie, ale Good to know.

3

Co do wyboru technologi, to tak:
W firme język dobiera się na ogół do danego celu, pod to jakich ludzi zatrudnia oraz pod daną specyfike dla klienta. Jeśli firma robi aplikacje biznesowe dla dużych klientów to będzie to pewnie Java lub C kratka, jesli to będą aplikacje dla małych klientów to pewnie będzie PHP. Ale jak firma zatrudnia Javovców, o nie będzie robić raczej projektu w C# bo by musiała po to zatrudnic nowych ludzi.
Co do juz technologii w samym projekcie - powinno się je wybierać tak późno jak można m.in. dzięki stosowaniu odpowiednich wartw abstrakcji, przy czym:

  1. Niestety rzadko tak się robi bo na przykład ludzie chcą mieć Kafke w CV mimo że projekt nie wymaga Kafki,albo z kolei odwrotnie - nie chcą się nauczyć Kafki mimo że w przy tych założeniach Kafka będzie najlepsza
  2. Czasami już wiemy że będziemy się na przykład z czyms integrować. Jeżeli mamy mikroserwis który będzie się komunikował z innymi i te inne korzystają z Kafki a ten ma być kolejnym subskrybentem to można założyć że Kafka będzie potrzebna.
0

Dziękuję Bardzo wszystkim którzy odpowiedzieli, szczerze mówiąc tak sporej dawki informacji się nie spodziewałem, ale widzę że technologie aktualnie nie są zależne od problemu, tylko bardziej do pracowników, firmy i klienta. Szczerze mówiąc myślałem zawsze że dana technologia ma jakąś mega przewagę w danym miejscu i projektu, aczkolwiek widzę że to dzieje się tylko w jakiś specjalnych przypadkach i aktualnie można wszystko spinać ze sobą bez problemów.

Co do baz danych @KamilAdam dokładnie MySQL i Neo4J to dwie różne bazy które swoje zastosowania znajdują w odmiennych miejscach, aczkolwiek taki mam temat projektu aby przedstawić zalety bazy grafowej, i przyrównać ją do bazy relacyjnej, a ze znam MySQL to postanowiłem na nią postawić, chyba że lepiej by było wybrać jakąś inną to mogą przemyśleć temat.

Tak samo wybór technologii do projektu, interesowało mnie właśnie to jak dobiera się daną technologię do projektu bo szczerze mówiąc to myślałem ze każdy przypadek aplikacji jest tak specyficzny że często się zmienia te technologie, trzeba szukać informacji w dokumentacjach i liczyć że uda się cos zrobić albo nie uda :D Ale jeżeli teraz sytuacja wygląda tak że można kombinować i wszystko łączyć to nie ma tak źle. Co do dynamicznie typowanego języka to dla mnie nie problem, szczerze mówiąc idzie przywyknąć :D

Aczkolwiek ciągle myślę nad technologią która by pozwoliła na w miarę wiarygodne testy dwóch baz, ponieważ mam taki plan żeby do jednej aplikacji, podłączyć dwie bazy, w sensie mam postawiony frontend, a następnie dostosować go raz do MySQL, a później dostosować do Neo4J i porównać jak dana aplikacja rodzi sobie na obu bazach. Na front raczej chciałbym się zdecydować na Reacta ciągnie mnie do niego, chętnie się go nauczę, lecz mam dylemat co do Back-endu, ponieważ Neo4J posiada oficjalną dokumentację do Node.JS, aczkolwiek w przypadku Laravela już bym musiał kombinować, i nie wiem czy by to był dobry wybór.

Tak z ciekawości, jakie narzędzia wykorzystujecie do testowania wydajności danej aplikacji, czy bazy danych? Są jakieś narzędzia które sprawdzają na bieżąco jak szybko pracuje dana aplikacja w konkretnej konfiguracji? Albo które pozwala zsymulować obciążenie aplikacji przez N ilość użytkowników i sprawdzić czy się coś wykrzaczy lub nie?

1
Krispi One napisał(a):

Tak z ciekawości, jakie narzędzia wykorzystujecie do testowania wydajności danej aplikacji, czy bazy danych? Są jakieś narzędzia które sprawdzają na bieżąco jak szybko pracuje dana aplikacja w konkretnej konfiguracji? Albo które pozwala zsymulować obciążenie aplikacji przez N ilość użytkowników i sprawdzić czy się coś wykrzaczy lub nie?

Gatling, ale nie miałem jeszcze okazji użyć :(

1

Tak z ciekawości, jakie narzędzia wykorzystujecie do testowania wydajności danej aplikacji, czy bazy danych? Są jakieś narzędzia które sprawdzają na bieżąco jak szybko pracuje dana aplikacja w konkretnej konfiguracji? Albo które pozwala zsymulować obciążenie aplikacji przez N ilość użytkowników i sprawdzić czy się coś wykrzaczy lub nie?

Ten jeden raz kiedy serio czegoś takiego potrzebowałem to używałem Tsung.

1 użytkowników online, w tym zalogowanych: 0, gości: 1