Czy jako początkujący programista powinienem preferować tworzenie własnych bibliotek zamiast korzystania z bibliotek innych firm?

12

Czy jako początkujący programista Python dobrze jest budować i rozumieć własne biblioteki przed przejściem do zaawansowanych bibliotek innych firm, które zawierają potrzebne mi funkcje?

Niektóre projekty (np. Frameworki takie jak Django) są prawdopodobnie zbyt duże dla tego podejścia. Ale inne projekty (np. Przeszukiwacze sieci, biblioteki wykresów, parser HTML) wydają się wykonalne.

Martwię się, że wczesne poleganie na bibliotekach zewnętrznych zahamowało mój rozwój.

Uwaga: to pytanie i to pytanie wydaje się skupiać bardziej doświadczonych programistów, którzy prawdopodobnie bardziej skupiają się na wydajności ponownego wykorzystania niż na korzyściach uczenia się. Myślę, że moje pytanie dotyczy początkujących.

MikeRand
źródło
5
„nic więcej niż integrator bibliotek zamiast programisty”: klienci chcą, abyś był produktywny. Możliwość oceny i integracji istniejących bibliotek to ważna umiejętność, której potrzebujesz, aby być produktywnym. Jeśli nie ma dostępnej biblioteki, która odpowiadałaby Twoim potrzebom ... w przeciwnym razie skoncentruj się na rozwiązaniu problemu biznesowego, który rozwiązuje twoja aplikacja
Hamish Smith
2
Jakie jest rozróżnienie między „integratorem bibliotek” a „programistą”. Przez 30 lat - nawet tworząc wbudowane kontrolery urządzeń na poziomie układów - nigdy nie pracowałem bez bibliotek. Czy potrafisz wyjaśnić to rozróżnienie?
S.Lott
Źle sformułowane. Edytowałem.
MikeRand
Wolę zatrudnić integratora bibliotek. Po co koncentrować się na tym, jak możesz skoncentrować się na funkcjach? Po obejrzeniu kilkudziesięciu źle wymyślonych rowerów kulę się na myśl o kolejnym. Projektowanie biblioteki to ciężka praca i równoważenie. Typowy sklep z oprogramowaniem nie specjalizuje się w projektowaniu bibliotek, nie ma odpowiednich umiejętności, zasobów i cierpliwości, aby zrobić to dobrze. Uważaj na przepisywanie. Lepiej jest użyć kodu, który został przetestowany przez innych niż zaczynać od zera. Tylko wtedy, gdy występuje próżnia, należy wymyślić IMO.
Job

Odpowiedzi:

12

To zawsze jest kompromis.

Jako początkujący programista powinieneś zadać sobie dwa pytania, zastanawiając się nad ponownym użyciem kodu zamiast wynalezienia kwadratowego koła:

  1. Czy dowiem się więcej o problemie, który chcę rozwiązać, pisząc wszystko od zera lub skupiając się na domenie problemu i odkładając na bok złożoność, która nie jest krytyczna dla interesującego mnie problemu?
  2. Czy dla mnie ważniejsze jest rozwiązanie danego problemu, czy też ważniejsze jest zrozumienie podstawowych pojęć?

Jeśli nie musisz kończyć swojego projektu, dobrze jest zakręcić kołem w skomplikowane problemy, które inni ludzie już rozwiązali, ponieważ nauczysz się czegoś. Ale prawdopodobnie przejdziesz do czegoś innego, zanim „skończysz”, co może, ale nie musi mieć dla ciebie znaczenia. Inne projekty zaczną szybko wyglądać lśniąco, gdy przejdziesz nad głową w złożonej domenie, która wygląda na prostą, dopóki nie zaczniesz próbować rozwiązać samodzielnie.

Nie miej obsesji na punkcie rezygnacji z kontroli, ponieważ podążasz za cudzym sposobem myślenia; skoncentruj się bardziej na tym, co próbujesz osiągnąć.

Jeśli Twoim celem jest napisanie parsera HTML, ponieważ chcesz zrozumieć, jak działają parsery, idź do niego. Jeśli Twoim celem jest napisanie analizatora składni HTML, ponieważ chcesz zdezynfekować dane wejściowe użytkownika lub przekształcić losowe fragmenty HTML, prawdopodobnie skupiasz się na niewłaściwej rzeczy, ponieważ prawdopodobnie bardziej interesuje Cię zastosowanie analizy składniowej niż sama analiza. . Jeśli masz ochotę napisać parser HTML, ponieważ nie chcesz poświęcać czasu na zrozumienie czyjejś biblioteki, prawdopodobnie marnujesz swój czas, ponieważ przynajmniej w tym przypadku gwarantuję, że ktoś spędził więcej czasu na zastanawianiu się, jak aby rozwiązać ten problem skutecznie, niż będziesz miał. W naprawdę trywialnych przypadkach możesz zaoszczędzić czas, nie wykorzystując ponownie kodu, ale w skomplikowanych, chyba że biblioteka, której używasz, jest do kitu lub nie możesz czytać dokumentacji i próbek kodu,

Z drugiej strony powiedziałbym, że warto napisać własną bibliotekę wykresów, ponieważ bardziej skupisz się na przekazywalnych, podstawowych algorytmach i strukturach danych, które będziesz mógł zastosować w innych domenach, nawet jeśli w końcu użyjesz czyjaś biblioteka, kiedy pracujesz nad tymi problemami.

JasonTrue
źródło
Fantastyczne ramy do myślenia o problemie. Bardzo mile widziane.
MikeRand
8

Większość początkujących programistów zdecydowanie nie docenia złożoności problemu. Prowadzi to do wielu nieprzyjemnych sytuacji, ale skupię się na jednej: odrzucają wiele bibliotek stron trzecich za to, że są „rozdęte” lub „zbyt skomplikowane”. Następnie próbują napisać własny kod, aby wykonać tę samą pracę, i zrobić z tego kompletny bałagan, ponieważ nie przewidzieli wszystkich rzeczy, z którymi będą musieli sobie poradzić.

Przeszukuj HTML i parsuj HTML. Wygląda na to, że podchodzisz do tych zadań dość swobodnie - co prowadzi mnie do wniosku, że nigdy nie próbowałeś ich wykonywać na małą skalę. Oto krótka, niekompletna lista potencjalnych problemów, z którymi musi zmierzyć się prawdziwy robot indeksujący:

  • Zniekształcony HTML.
  • Wiele kodowań znaków (cały świat nie działa na ASCII).
  • Linki generowane lub modyfikowane przez JavaScript.
  • Łącza do plików binarnych o pojemności wielu gigabajtów.
  • Niepoprawne typy MIME.
  • Awaria w trakcie sesji indeksowania.
  • Doły smołowe.
  • Konsultanci SEO.
  • Microsoft.
Mike Baranczak
źródło
6

Martwię się, że wczesne poleganie na bibliotekach innych producentów zahamowałoby mój rozwój i uczyniło mnie jedynie integratorem bibliotek niż programistą.

To nieprawda.

Wczesne poleganie na bibliotekach zewnętrznych nauczy, jak działają dobre biblioteki.

Przedwczesny rozwój to zawsze strata czasu. Pisanie własnych bibliotek bez dokładnego przestudiowania (tj. Korzystania) istniejących bibliotek skazuje Cię na ponowne odkrycie koła - źle - do końca swojej kariery.

Spędziłem wiele płatnych godzin, sprzątając te bałagany.

S.Lott
źródło
Nie jestem pewien, czy całkowicie się z tym zgadzam. Czasami biblioteki stron trzecich są źle napisane i mogą uczyć złych nawyków. Jeśli podstawowe algorytmy są dobrze zrozumiane, dobrym pomysłem może być ponowne wynalezienie koła, a następnie porównanie ich z innymi bibliotekami, aby zobaczyć, jak dobrze lub słabo stosujesz swoje w porównaniu do innych. W obu przypadkach oczywiście jakaś forma mentoringu jest niezwykle korzystna :)
Demian Brecht
Mimo, że nie jest korzystne dla studiowania istniejących API :)
Demian Brecht
2
@Demian Brecht: „Czasami biblioteki stron trzecich są źle napisane i potrafią uczyć złych nawyków” Chociaż może to być prawda, większość projektów typu open source jest mocno sprawdzana przez społeczność użytkowników, a złe pomysły nie są w stanie wytrzymać mądrości tłumu. Ponadto, „źle napisany” jest osądem, którego n00b nie może skutecznie wydać.
S.Lott
@ S.Lott: Dobrze powiedziane (re: n00b) :) I myślę, że po prostu trzeba być ostrożnym, który bibliotek 3rd party obejrzysz, jak niektórzy mają bardzo niewielki (jeśli w ogóle) społeczności. Grzebanie w losowych projektach na przykład na githubie może zacząć prowadzić cię złą ścieżką.
Demian Brecht
2
@Demian Brecht: Nie możesz wypracować żadnego osądu, dopóki nie zobaczysz różnych bibliotek. Nie ma możliwości „wstępnego filtrowania” bibliotek do użycia przez n00b. To wszystko biblioteki lub brak bibliotek.
S.Lott
4

To zdanie, które jest pierwsze, jest dla mnie bardzo logicznie problematyczne:

Czy jako początkujący programista Python dobrze jest budować i rozumieć własne biblioteki przed przejściem do zaawansowanych bibliotek innych firm, które zawierają potrzebne mi funkcje?

Jak możesz wierzyć, że potrafisz efektywnie pisać zaawansowane biblioteki funkcji (twoje słowo) jako początkujący, który będzie tak samo poprawny, kompletny i przetestowany jak istniejące biblioteki?

Nie wspominając nawet o ogromnej ilości czasu, który zmarnowałbyś na ponowne wynalezienie koła, którego nie rozumiesz jako początkujący, w końcu porzuci, gdy będziesz mieć szczęście, gdy zdasz sobie sprawę, że masz nad głową i musisz nauczyć się i tak wychodzenie z biblioteki.

Weźmy na przykład parsowanie HTML, wspominasz o tym jako wykonalne, nie ma sposobu, abyś mógł wykonać lepszą robotę niż Piękna Zupa jako początkujący. Jasne i proste, że zawiedziesz. Rzeczy, które uważasz za wykonalne, mają ogromne problemy ze złożonością, których nie bierzesz pod uwagę, nie znasz domeny problemów wystarczająco szczegółowo, aby zrozumieć złożoność, z tego powodu jesteś skazany na porażkę.

Moim zdaniem dowiesz się, co zrobili inni ludzie i już rozwiązali Twój problem, dopóki nie znajdziesz czegoś, co rozwiązałoby Twój problem.


źródło
1

To tylko moja opinia, ale proponuję zbudowanie własnych bibliotek dla dość prostego kodu do wielokrotnego użytku. W cokolwiek bardziej złożonego możesz użyć bibliotek firm trzecich, które zostały zbudowane i dokładnie przetestowane (miejmy nadzieję!). Stworzenie solidnej biblioteki może być bardzo czasochłonne, w zależności od tego, co to jest. Jestem pewien, że zdobędziesz mnóstwo praktyki programowania, po prostu budując swoją aplikację!

Jon Onstott
źródło