Czy powinieneś skorzystać z biblioteki, kiedy możesz wykonać to zadanie bez niej? [Zamknięte]

33

Jestem w sytuacji, w której mogę użyć wtyczki JavaScript typu open source do wykonania zadania. Ale kiedy spróbowałem go użyć, odkryłem, że muszę przeprojektować wiele rzeczy z tego, co już zrobiłem, i to dodaje mojej projektowi pewnej złożoności. Podczas gdy mogę wykonać to samo zadanie za pomocą czystego kodu, który sam mogę stworzyć i bez potrzeby zmiany tego, co zrobiłem do tej pory.

W takiej sytuacji powinieneś zdecydować się na bibliotekę (na przykład ze względu na kod lepszej jakości?)

Billal Begueradj
źródło
3
Jak mierzysz „jakość”. Według liczby wierszy kodu? Klasy? Złożoność? Konserwowalność? Sprężystość?
Laiv
3
Odpowiedź brzmi NIE, bez względu na to, co uważasz za jakość, czy nie. Ale jeśli przekażesz nam swój pomysł na jakość, odpowiedzi odpowiedzą na ich uzasadnienie, wyjaśniając, dlaczego liczba bibliotek nie poprawia tego, co uważasz za jakość. To tylko kwestia precesji. W tej chwili proste NIE odpowie na pytanie bez potrzeby wyjaśniania.
Laiv
4
Nie bezpośrednia odpowiedź na twoje pytanie, ale pomysł, że „ten numer” nieuchronnie gwarantuje „lepszą jakość”, jest sprzeczny z trudnościami związanymi z poprawą jakości kodu. Brak szybkiej naprawy zapewniającej jakość. Gdyby tak było, problem nie istniałby. Każdy, kto twierdzi, że pewne proste podejście jest rozwiązaniem typu „wszystko na samym końcu”, albo (w najlepszym wypadku) nadmiernie uogólnia, albo (w najgorszym przypadku) popycha swój wadliwy pomysł jako prawdę.
Flater
3
Co sprawia, że ​​uważasz, że użycie biblioteki poprawiłoby jakość kodu?
Przestań krzywdzić Monikę
1
Głosowano na zakończenie, ponieważ wydaje się, że pytanie zostało znacznie przeformułowane, a górne odpowiedzi odpowiadają na starą wersję ... lepiej ponownie opublikuj pytanie w obecnej formie (plus dodaj szczegóły, aby uniknąć „zbyt tablicy” „głosy) ...
AnoE

Odpowiedzi:

54

Jako inżynier może warto pomyśleć o tym jako o problemie z optymalizacją. Oczywiście musimy mieć cel optymalizacji . Powszechną w tego rodzaju sytuacjach byłoby zminimalizowanie całkowitego kosztu posiadania .

Jeśli uważasz, że dodanie komponentu innej firmy pozwoli zaoszczędzić koszty w dłuższej perspektywie, powinieneś go użyć. Jeśli nie, nie powinieneś. Pamiętaj, aby wziąć pod uwagę koszty bieżącej konserwacji (na przykład, gdy wydana zostanie nowa wersja O / S, zostanie wykryta usterka bezpieczeństwa lub wydana zostanie nowa specyfikacja W3C).

W przypadku wielu trywialnych problemów będzie to kosztować mniej, ale w przypadku średnio skomplikowanych problemów wykraczających poza podstawowe kompetencje organizacji, często warto skorzystać z usług innej firmy.

Są też inne cele do rozważenia (np. Ryzyko), ale całkowity koszt posiadania jest duży.

John Wu
źródło
1
Myślę, że ta odpowiedź wymaga więcej pozytywnych opinii. - Długoterminowa niezawodność bibliotek może być ogromnym problemem. A nawet jeśli biblioteka istnieje, kto wie, czy interfejsy API ulegną zmianie? Biblioteki są łatwe w krótkim okresie, ale mogą powodować problemy w dłuższej perspektywie. (Uwaga dodatkowa: biblioteki jako kod źródłowy łagodzą niektóre problemy).
DetlevCM
6
@DetlevCM Odpowiedź mówi również, że można bardzo łatwo odwrócić. Do bibliotek nietrywialnych będą przypisane koszty utrzymania, których użytkownik jako użytkownik biblioteki nie musi płacić, a być może nie byłby w stanie zapłacić, gdybyś musiał (tj. Gdybyś był właścicielem biblioteki).
Cubic
Zgadzam się, ale nie zapomnij również wziąć pod uwagę kosztów biblioteki - błędów, zmian projektowych poza twoją kontrolą i wiązek kodu, których nie używasz tylko do wprowadzenia pojedynczej funkcji. Również biblioteka często nie jest tak wyrazista, jak rozwiązanie dla danego problemu. TAKŻE nie możesz tak łatwo debugować biblioteki zewnętrznej, a jeśli tak, musisz później poradzić sobie z większą liczbą problemów z scalaniem. Nie zakładaj tylko, że rozwiązanie biblioteki jest lżejsze, weź pod uwagę wszystkie czynniki i nie bój się kodować własnego rozwiązania, jeśli biblioteka nie do końca pasuje!
Bill K
36

Bill Gates powiedział kiedyś:

„Mierzenie postępu programowania za pomocą linii kodu jest jak mierzenie postępu budowy samolotu według masy”.

Ten cytat przychodzi mi na myśl, ponieważ to samo można ostatecznie powiedzieć o liczbie bibliotek. Z reguły nie używam bibliotek, chyba że:

  1. Nie ma innego sposobu, aby to zrobić. Rezygnacja z niego nie byłaby już ekonomicznie opłacalna, aby wyprodukować produkt na czas i zgodnie z budżetem.
  2. Zaoszczędziłoby mi to sporo czasu, ponieważ wymagałbym wielu funkcji wspomnianej biblioteki
  3. Biblioteka jest dobrze używana, a wszelkie potencjalne problemy, które mogłem mieć, byłyby dobrze udokumentowane.

Idealnie wszystkie trzy warunki są spełnione, ale zadowoliłbym się dwoma. Podsumowując, nie powinieneś dodawać biblioteki do swojego programu, chyba że służy to celowi. Jeśli musisz zapytać, co to za cel, prawdopodobnie nie powinieneś dodawać go do swojego programu. Kod jakość swojego programu korzysta zatem ponieważ elegancko wzywa każdej biblioteki bez przygnieciony konieczności muszą przepisać bibliotek wewnątrz programu.

Powodzenia!

Neil
źródło
4
@BillalBegueradj Sensowny cytat, tak. Odpowiednie, nie. Nie mówimy o postępie, mówimy o jakości oprogramowania, a linie kodu mają bardzo silną korelację z liczbą znalezionych defektów. Zobacz artykuł Zaskakujący wpływ wielkości klasy na ważność mierników obiektowych, który pokazuje, że wszystkie inne mierniki nie mają mocy predykcyjnej na znalezione defekty po korekcie za pomocą LOC, co oznacza, że ​​LOC jest najlepszym predyktorem wad (lub było w tym czasie: 2001). Nawiasem mówiąc, artykuł naukowy bije słynny cytat.
Theraot
5
@Theraot Sugerujesz, że skoro liczba wierszy określa liczbę defektów, to że większe programy mają gorszą jakość kodu niż mniejsze programy? Przepraszam, nie zgadzam się z twoimi danymi. Ponadto, jeśli cytat naprawdę Ci przeszkadza, możesz zignorować.
Neil,
3
@Neil, żeby być jasnym, liczba linii nie określa liczby wad, ma silną korelację z liczbą znalezionych wad. Łatwo to zrozumieć: im większy kod, tym więcej możliwości wprowadzenia defektów. Oczywiście liczba wad spadłaby po ich znalezieniu i naprawieniu. W końcu to tylko korelacja. Dodatek: LOC pokonuje wiele typowych wskaźników, więcej szczegółów w artykule.
Theraot
5
@Theraot Mój argument nie dotyczył korelacji wad z liczbą wierszy. Mój argument dotyczył samej liczby wad odpowiadających złej jakości kodu. Chrome ma wiele wad na przestrzeni lat, ale argumentowałbym za zasadnością każdego roszczenia, które sugeruje, że jest napisane gorzej niż źle napisana 10-liniowa wtyczka jQuery na github.
Neil,
3
@Theraot „artykuł naukowy bije słynny cytat”. - brzmi to tak, jakby twój papier faktycznie wspiera cytat, a nie go bije ...
npostavs
14

(Uwaga: pierwotne pytanie brzmiało: czy liczba bibliotek poprawia jakość kodu?)

Prawdopodobnie możesz sobie na to odpowiedzieć: Nie, oczywiście sam fakt korzystania z bibliotek nie poprawia twojego kodu. Gdyby tak było, łatwo byłoby napisać świetny kod do wszystkiego bez wysiłku.

To, co ludzie mają na myśli, gdy zalecają wielokrotne użycie własnego narzędzia, to fakt, że kod w znanej bibliotece jest prawdopodobnie bardziej poprawny, wydajny i / lub użyteczny niż to, co sam wymyślisz, po prostu dlatego, że autorzy spędzili znacznie więcej czasu na jeden konkretny obszar funkcjonalności, na jaki możesz sobie pozwolić (wraz z terminem całego projektu).

Ale to tylko trend, a nie prawo. Z pewnością mogą istnieć biblioteki, które nie są tak przydatne w użyciu, jak zwykłe tworzenie własnych. Często dzieje się tak, gdy biblioteka faktycznie robi znacznie więcej, niż potrzebujesz, i robi to w sposób, który zmusiłby cię do dostosowania własnej bazy kodu do ich konwencji o wiele bardziej niż jest to uzasadnione. Wygląda na to, że właśnie to znalazłeś w tym przypadku.

Kilian Foth
źródło
4

Korzystanie z odpowiednich bibliotek pozwala zaoszczędzić dużo pracy, ale wiąże się również z wieloma ukrytymi kosztami:

  • Biblioteki muszą być aktualizowane. Musisz regularnie sprawdzać, czy otrzymali aktualizacje (które mogą być związane z bezpieczeństwem!) I zastosować je. Każda aktualizacja biblioteki może potencjalnie uszkodzić coś w Twojej aplikacji. Oznacza to, że musisz później wykonać pełny test integracji. Tak więc każda biblioteka, na której opiera się Twój projekt, zwiększa koszty konserwacji długoterminowej.
  • Niektóre biblioteki Javascript są tak potężne i wykorzystują tak unikalne wzorce, że ludzie zaczynają postrzegać je jako oddzielne obszary wiedzy specjalistycznej. Każda dodana biblioteka może odstraszyć programistów, którzy nie czują się pewnie w edytowaniu kodu, który opiera się na środowisku, którego nie znają. Zatrudnianie nowych programistów zajmujących się konserwacją, którzy znają wszystkie używane biblioteki, może być trudne.
  • Dodanie biblioteki do witryny wydłuża czas ładowania, ponieważ użytkownik musi załadować całą bibliotekę, nawet jeśli używasz tylko jej niewielkiej części. Niektóre popularne biblioteki pozwalają pobierać niestandardowe kompilacje tylko z potrzebnymi funkcjami, ale nawet wtedy zwykle zawiera dużo kodu, który nigdy się nie uruchomi (lub nawet gorzej: kod, który działa , ale nie robi nic użytecznego, ponieważ po prostu przygotowuje struktury danych dla funkcji, których nie używasz).

Więc zanim dodasz kolejną zależność do swojego projektu, aby dołączyć coś, co równie dobrze możesz napisać sam, wykonaj analizę kosztów i korzyści.

Philipp
źródło
Powtórz tę analizę, gdy naprawdę masz prawdziwe dane. Być może nie doceniłeś kosztu / przeszacowałeś korzyść lub sytuacja mogła się zmienić.
Deduplicator
1

Nie musi to być decyzja binarna: albo użyj tylko biblioteki OSS, albo zaprogramuj nowe rozwiązanie od zera. Inną opcją może być ponowne użycie części biblioteki, jeśli pozwala na to licencja.

Na przykład w mojej dziedzinie (oprogramowanie numeryczne) biblioteka może mieć drobnoziarniste moduły i niektóre wyspecjalizowane moduły, z których jestem tylko w 80% zadowolony. Więc użyłbym modułów podstawowych i napisałbym opakowanie dla modułów specjalistycznych. Albo mogę opracować własne wyspecjalizowane moduły, korzystając z projektu i kodu modułów OSS. Najtrudniejsze, algorytmiczne bity zwykle są ponownie wykorzystywane od tych, ze zmodyfikowanym tylko kodem rusztowania. Mogę również wyczyścić część oryginalnego kodu. Okazało się to dobrym doświadczeniem edukacyjnym i oszczędnością czasu w porównaniu z opracowywaniem od zera.

Tupolew._
źródło
0

Jeśli ktoś już dla ciebie wykonał pracę, oczywiście powinieneś go użyć.

Wyjątkiem od reguły jest javascript. Tam zaimportują kilkanaście innych bibliotek (oczywiście przestarzałe wersje), aby dodać funkcje językowe, których chcą używać, a następnie wykonali pracę za Ciebie.

Wybierz swoją strukturę i pozostań w jej obrębie. Jeśli biblioteka działa z twoim frameworkiem lub zwykłym js, w porządku. Ale jeśli potrzebuje innej struktury, poszukaj innej opcji.

Ewan
źródło
4
Wielu fanów javascript tutaj
FCw
0

Biblioteki i kiedy z nich korzystać to skomplikowana decyzja.

Z jednej strony dobrze przetestowałeś, prawie standardowe rzeczy (w mojej dziedzinie FFTW na przykład należy do tej kategorii lub coś w rodzaju pliku libsnd), które są ogólnie uznawane za działające i były standardowymi rzeczami przez ostatnie 20 lat, które wszyscy używają.

Z drugiej strony masz losowe rzeczy z github, bez pakietu testowego i tylko około 1 opiekuna, generalnie po co zawracać sobie głowę?

Test kwasowy polega przede wszystkim na tym, że biblioteka pasuje do mojej architektury (czasami, jeśli wiesz, że chcesz użyć danej biblioteki, to w końcu ją projektujesz) i czy myślę, że skończę z debugowaniem kogoś innego kodu biblioteki ? Dobrym proxy dla drugiego pytania jest „Czy istnieje zautomatyzowany zestaw testów i jaka jest dokumentacja?”.

Trochę debugowania nie jest poważnym problemem, ale w tym momencie kod biblioteki zaczyna liczyć się do mojego własnego kodu z punktu widzenia konserwacji (więcej, jeśli moje poprawki nie mogą być z jakiegoś powodu przesłane do poprzedniej wersji).

Rozróżniałbym również biblioteki i frameworki, ponieważ wszystko to czasami nie jest tak wyraźne, frameworki w moim świecie (mały rdzeń, ciężki procesor DSP) są zwykle bolesne dla tyłka, szczególnie jeśli próbujesz połączyć więcej niż jeden lub zrób coś nieco poza liniami, biblioteki są czasem przydatne. Zdaję sobie sprawę, że jest to bardzo różnie postrzegane na scenie tworzenia aplikacji internetowych.

Koniec dnia jest to decyzja, która sprowadza się do smaku i doświadczenia, a nawet doświadczeni czasami wybierają źle, nadal przynajmniej z biblioteką, zawsze możesz ją oderwać i napisać własną implementację, jeśli stanie się zbyt denerwująca.

Decyzje, decyzje....

Dan Mills
źródło