Odkrywanie koła na nowo

0

Zastanawiam się dlaczego początkującym programistom często wpaja się, żeby nie rozwiązywali problemów samodzielnie tylko korzystali z gotowców? Rozumiem, że podczas pracy zawodowej liczy się czas i wybiera się gotowe biblioteki ale do nauki widzę to z goła inaczej.

Jako doświadczeni deweloperzy często robicie coś swojego, bo "można to zrobić lepiej" niż obecnie dostępne rozwiązania?

1

Zastanawiam się dlaczego początkującym programistom często wpaja się, żeby nie rozwiązywali problemów samodzielnie tylko korzystali z gotowców?

To zależy o jakiej sytuacji mówisz. Bo jeżeli robisz np. projekt na początku kariery, to lepiej jest korzystać z gotowych rozwiązań, bo często na tym poziomie będą one lepiej napisane i nie dodatkowo nie ugrzęźniesz w problemach, które wynikają tylko z tego, że chciałeś co samemu napisać.

Jeżeli np. dopiero co się uczysz samego programowania, algorytmów itpe, to wtedy w ręcz konieczne jest pisanie pewnych rzeczy samemu: listy, kolejki, algorytmy sortowania itd.
Nie chodzi o to że w pracy będziesz je klepał, ale dlatego, żeby nauczyć się jak to działa i wyrobić w sobie pewne nawyki, dzięki czemu w przyszłości będziesz np. wiedział dlaczego wybrać tę implementację listy a nie tamtą. itd.

0
.andy napisał(a):

To zależy o jakiej sytuacji mówisz. Bo jeżeli robisz np. projekt na początku kariery, to lepiej jest korzystać z gotowych rozwiązań, bo często na tym poziomie będą one lepiej napisane i nie dodatkowo nie ugrzęźniesz w problemach, które wynikają tylko z tego, że chciałeś co samemu napisać.

Chodzi mi tu wyłącznie o naukę/projekty hobbystyczne. Druga sprawa to wyrobienie sobie podejścia sceptyka, co wg. mnie bardzo dobrze się sprawdza w tym zawodzie. Słyszałem już wiele razy, że się nie da a się dało tylko nie wydeptaną ścieżką

3
Ales napisał(a):

Zastanawiam się dlaczego początkującym programistom często wpaja się, żeby nie rozwiązywali problemów samodzielnie tylko korzystali z gotowców?

Pytanie, kim jest początkujący programista? Ja przez dłuższy czas czułem się zawaansowany(lub średniozaawansowany), ale ostatnio stalem się coraz bardziej początkującym i zacząłem coraz więcej rzeczy samemu implementować. Myślę, że im bardziej się człowiek czuje początkujący, tym łatwiej jest zaimplementować coś od zera. Bo implementowanie od zera wymaga tego, żeby czuć się początkującym, robić coś od podstaw.

Z drugiej strony zawodowcy to nie będą się pier*olić, tylko skorzystają z gotowej biblioteki. Tylko, że o ile używanie gotowych bibliotek jest dobre pod kątem praktycznym (czyli używając gotowej biblioteki spędzę 5 godzin zamiast 50, a czas to pieniądz), no ale nie ma tej radości, bo używać bibliotek każdy może, nawet stróż nocny czytający podręcznik JavaScriptu czy pani na kasie przekwalifikowana na programistkę może użyć gotowej libki. Więc cieżko się wyróżnić, ciężko być dobrym przeciętnym programistą, jak każdy nim jest. Dlatego fajnie jest implementować coś od zera, bo przynajmniej ma się świadomość, że inni tak nie umieją xD

Jako doświadczeni deweloperzy często robicie coś swojego, bo "można to zrobić lepiej" niż obecnie dostępne rozwiązania?

To jest trochę inna kwestia. Zrobić lepiej niż obecnie dostępne rozwiązania jest łatwo. Problem w tym, że czasem gorszy (w założeniach) software jest lepszy, bo więcej ludzi go używa, jest lepiej utrzymywany, bardziej dojrzały itp.

3

@Ales:

Chodzi mi tu wyłącznie o naukę/projekty hobbystyczne.

Przy nauce, warto, przy pisaniu projektów nie ma co wymyślać koła. Wyobraź sobie, że musisz użyć w projekcie szyfrowania AES. Będziesz implementował to od zera?

Z drugiej strony jak pisał poprzednik czasami fajnie coś zrobić samemu, tylko jak to zrobisz, to potem musisz utrzymywać ;)

4

Nie wiem jak jest teraz ale w moich czasach mówili ze raczej sam tego nie zrobisz lepiej niz całe zespoły przed tobą. Jak tylko mamal gotowca odpowiedniej jakości to nawet nie próbuję. Ale co innego jest np z implementacja biblioteki standardowej c++ a co innego z jakimś komponentem js z biblioteki wspieranej przez jednego czowieka.

6
Ales napisał(a):

Jako doświadczeni deweloperzy często robicie coś swojego, bo "można to zrobić lepiej" niż obecnie dostępne rozwiązania?

Zacznę jak zawsze... To zależy.
Osobiście staram się używać jak najmniej obcych bibliotek ale też nie jestem całkiem szurnięty zatem z tego co w moim mniemaniu rozsądne to oczywiście korzystam. Korzystam także z bibliotek standardowych i oficjalnych dla danego środowiska.
Jestem zwolennikiem pisania własnych rozwiązań o ile nie sięgają one po głęboką wiedzę specjalistyczną t.j. szyfrowania, obsługa protokołów sieciowych, parsery XML a także w miejscach gdzie wymagane jest duże bezpieczeństwo (np. systemy autoryzacji).

**Zatem jakimi jeszcze kryteriami się kieruję podejmując decyzję czy pisać swoje czy korzystać z gotowca? **
To także zależy ale poza wymienionymi wyżej opcji jest już mniej bo determinuje je głównie rodzaj projektu jaki robię.

  • chętniej używam gotowych bibliotek podczas pisania back-end o ile tematyka nie wymaga specyficznego podejścia ( jakieś minimalistyczne wymagania ).
  • niechętnie używam gotowych bibliotek na front-end składających się z JS+HTML ;

Dlaczego tak? Kod po stronie serwera przed skompilowaniem nie jest praktycznie żadnym obciążeniem dla docelowej wykonywalnej aplikacji. W przypadku takiego JS ciągnięcie całej biblioteki 400kB tylko po to aby zrobić lazyLoad, slider czy wywołanie ajax często mija się z celem - wówczas wolę napisać swoje.

6

Jak chcesz coś zbudować to bierzesz gotowca.
Hackerzy zawsze mówili żeby nie rozwiązywać już rozwiązanego problemu.
Jeden Rabin powie "tak", drugi powie "nie".

Ale czasami chcesz zrozumieć jak coś działa i wtedy warto napisać samemu. Przykładowo sporo gamedev'ów pisze na jakimś etapie swój silnik grafiki i ray-tracer.
Ja napisałem na magisterkę swój kompilator i bardzo dużo mi to dało jeśli chodzi o zrozumienie (wtedy) bebechów .NET.

Myślę że trzeba to wyważyć, w czasie nauki dobrze jest poświęcić pewną część czasu na reimplementację istniejących bibliotek. Z drugiej strony pisanie własnego serwera HTTP to sporo roboty a niewielki zysk "uczeniowy". Myślę że jak już przepisywać to rzeczy typu czytniki barcode'ów, syntezatory mowy czy inne trudniejsze klocki...

4

W pracy rzadko coś implementujemy od zera. Czasem jednak zdarza się, że program sypie błędem i wtedy trzeba go rozgrzebać. Tak bywa ze Springiem: godzina debugowania, bo Spring w swoich bebechach robi magię i komunikat błędu nic nie mówi. OK, wiedza z tego debugowania (co jest w Springu) mało kiedy się przyda. Sprawa jest inna: gdzie i jak szukać przyczyny błędu? Tego ciężko się nauczyć zestawiając klocki w jedną apkę.
Druga sprawa: jeśli nie wiemy jak coś działa, to będziemy pisać trochę na ślepo. Prosty przykład: sortowanie. Możemy polegać na dokumentacji i na informacjach z internetu. Powiedzmy, że mamy dokumentację https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Arrays.html#sort(int%5B%5D)

is typically faster than traditional (one-pivot) Quicksort implementations

Jeśli ktoś nie rozumie implementacji, nie będzie w stanie zweryfikować co znaczy "typically faster". OK, można szukać w internecie. Ale to też trzeba umieć. A wziąć pierwszy lepszy blog z internetu i zawierzyć tabelkom to nie sztuka.
Drugi przykład: funkcja calloc w C: https://www.cplusplus.com/reference/cstdlib/calloc/ .
Dlaczego często nie można zaalokować tą funkcją 128 GB na raz nawet, jeśli mamy 256 GB RAM? Albo dlaczego system używa pliku/ partycji wymiany nawet, jeśli mamy połowę RAMu wolną?

initializes all its bits to zero

A jeśli alokujemy dużo pamięci na raz, to jak jej zerowanie się odbywa? To ważne, bo przy blokach rzędu 128 GB czas przeczesania nie jest mały. Sekunda tu, sekunda tam i wykonanie programu wydłuża się o pół godziny. Można nie zerować (i użyć malloc) kiedy sami wczytujemy dane np. z pliku. Oczywiście o ile plik dostarcza wartości dla całego bloku pamięci.
Tak że: tak, można programować nie znając mechanizmów leżących u podstaw bibliotek. Są jednak takie koksy programowania, co za pisanie bibliotek mają całkiem sporo kasy itd.

4
Ales napisał(a):

Zastanawiam się dlaczego początkującym programistom często wpaja się, żeby nie rozwiązywali problemów samodzielnie tylko korzystali z gotowców?

No ok, pytanie z tezą. Skąd ta teza pochodzi? Ze studiów, z grup na facebooku, z tutoriali, z książek?

Jako doświadczeni deweloperzy często robicie coś swojego, bo "można to zrobić lepiej" niż obecnie dostępne rozwiązania?

Gdy istnieje taka uzasadniona potrzeba albo gdy nie da się uzasadnić użycia gotowej biblioteki.

Ales napisał(a):

Chodzi mi tu wyłącznie o naukę/projekty hobbystyczne. Druga sprawa to wyrobienie sobie podejścia sceptyka, co wg. mnie bardzo dobrze się sprawdza w tym zawodzie. Słyszałem już wiele razy, że się nie da a się dało tylko nie wydeptaną ścieżką

Myślę, że zaimplementowanie czegoś od zera w ramach nauki jest bardzo ważne, bo:

  1. może pozwolić zrozumieć, że coś nie jest takie łatwe jak się wydaje;
  2. może pozwolić docenić twórców danej biblioteki, że rozwiązali wiele problemów zanim samemu się na nie wpadło;
  3. zdejmuje otoczkę magii z frameworka/biblioteki, pozwala lepiej zrozumieć ich koncepcje, przez co nawet tych gotowych używa się później z lepszym zrozumieniem i unikając różnych pułapek.
0

No ok, pytanie z tezą. Skąd ta teza pochodzi? Ze studiów, z grup na facebooku, z tutoriali, z książek?

Co ta wiedza zmienia w temacie?

Gdy istnieje taka uzasadniona potrzeba albo gdy nie da się uzasadnić użycia gotowej biblioteki.

Jaka to może być potrzeba?

2

Jaka to może być potrzeba?

Podejrzewam że przypadek w którym nasza implementacja może być na przykład bardziej wydajna w konkretnym przypadku ewentualnie lepsza.

4
Ales napisał(a):

Jako doświadczeni deweloperzy często robicie coś swojego, bo "można to zrobić lepiej" niż obecnie dostępne rozwiązania?

Nikt ode mnie nie wymaga żeby było zrobione lepiej. Za to wymagają żeby było zrobione na wczoraj. Czyli im więcej gotowców użyje tym klient bardziej zadowolony

0
PerlMonk napisał(a):

No ok, pytanie z tezą. Skąd ta teza pochodzi? Ze studiów, z grup na facebooku, z tutoriali, z książek?

Co ta wiedza zmienia w temacie?

No tyle, że może w ogóle tematu nie ma. :)

Jaka to może być potrzeba?

Kwestie wydajnościowe, licencyjne, albo potrzeba użycia rozwiązania prostszego niż te gotowe.

0

Ogólnie widzę, że wszyscy są zgodni co do tematu :)

Wg. mnie kwestie bezpieczeństwa, szyfrowania danych i innych tematów, gdzie mogą trafić się krytyczne podatności powinny zostać po stronie ludzi zajmujących się tym od lat.

Dużo własnych implementacji powstaje w młodych technologiach. Sam pracuję głównie z blazorem i miałem okazję napisać całkiem sporo rzeczy praktycznie od zera

1

każdy dzieciak w wieku przedszkolnym odkrywa co to jest koło

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