Czy można żyć bez wiedzy o tym, jak działa utworzony program?


16

Mam na myśli, że są naprawdę przydatne biblioteki, które mogą rozwiązać problemy, gdy utkniesz i nie wiesz, jak rozwiązać ten lub inny problem ze swoją znajomością języka programowania, którego używasz ... Na przykład Boost dla C ++ lub JQuery dla JavaScript lub Spring dla Java ... Rozwiązują problemy w kilka sekund, a Ty tak naprawdę nie obchodzi Cię, jak to zrobili (pomimo tego, że są napisane w tym samym języku, w którym programujesz) ... Zastanawiam się, czy jestem sam w używaniu bibliotek, nie będąc potrafię pisać od zera rozwiązania moich problemów, czy to standardowa praktyka?


Nie rozwiązują problemów poszczególnych osób, są jedynie rozwiązaniem typowych problemów w powiązanych obszarach.
Abimaran Kugathasan

więc czy dobrze jest nie wiedzieć, jak rozwiązać typowe problemy w powiązanym obszarze i powiedzieć „po prostu użyj *** (tutaj twoja ulubiona lib)”, to naprawi to, że nie wejdzie w to, jak to zrobili?
Kabumbus

1
Czy kiedykolwiek programowałeś programy skalowalne? Szczerze mówiąc, żadna biblioteka nie jest idealna w 100% przypadków, a błędy mogą się zdarzyć. Teraz, jeśli ten błąd znajduje się w jednej z wielu zewnętrznych bibliotek, z których korzystasz, a po 2 latach cyklu programowania zaczynają się pojawiać problemy, a co wiesz? To jedna z tych bibliotek, których używasz! Mówiąc szczerze: nie, nie ma sensu używać bibliotek jako szybkiej poprawki (przynajmniej nie dla oprogramowania na poziomie przedsiębiorstwa itp.), Ponieważ stają się one pewnym ograniczeniem w miarę postępów.
jerluc

5
@jerluc: biblioteki standardowe są często znacznie lepiej opracowane i obsługiwane niż kod jakiejkolwiek organizacji. Na przykład boost share_ptr jest uważany za „must have” przez wszystkich w branży, z którymi się zetknąłem, a różne inne fragmenty kodu dostarczone przez boost pozwoliły projektowi, nad którym pracuję, skupić się na szczegółach problemu, a nie spędzać czas na pracy nad mniej ważnymi rzeczami, które już zostały zrobione. Możesz napotkać problemy, więc powinieneś wybierać biblioteki, które wybierzesz, ale ogólnie są dobre. Syndrom „nie opracowano tutaj” jest zły.
TZHX

@TZHX Przypuszczam, że powinienem być bardziej definitywny, mówiąc, że to, co powiedziałem, dotyczy głównie bibliotek, które mogą robić takie rzeczy, jak pakowanie czegoś, co można by uznać za kod „kotła”. Sensowne jest zaufanie do „wymyślonego koła”, nie pisząc opakowań IO (gdy biblioteki są dostępne dla takich opakowań), ale nie ma sensu ufać „nieco okrągłemu kołowi” lub, innymi słowy, bibliotece, która jakiś rodzaj czarnej skrzynki i działa na to, czego potrzebujesz w danym momencie.
jerluc

Odpowiedzi:


22

Czy dobrze jest nie rozumieć, jak samodzielnie rozwiązać problemy i zamiast tego korzystać z bibliotek?

Ogólnie nie, nie jest.

Biblioteka może zaoszczędzić ci (ciężkiej!) Pracy nad rozwiązywaniem problemu, a następnie debugowaniem rozwiązania, a następnie utrzymaniem go. Ale jeśli zamierzasz go użyć, lepiej upewnij się, że rozumiesz, jak to działa - dlaczego rozwiązanie faktycznie rozwiązuje problem. Nie musisz wiedzieć, jak wymyślać samochody, silniki i roboty, które budują silniki samochodowe, jeśli pracujesz jako mechanik - ale lepiej zrozum, jak działają części, co one robią i jak działają pasują do siebie!

To jest powód, dla którego wielu ludzi stanie się bardzo wyspecjalizowanych - wiele razy uczy się tylko pracy z jednym językiem, jedną platformą, jedną strukturą i zestawem bibliotek.

To powiedziawszy, jest tylko tyle, ile będziesz miał czasu na naukę. Czasami musisz wybierać skróty - bierz je, ale wiedz, że to skróty. Być może przeczytałeś tylko tyle o bibliotece, by wiedzieć, że możesz ją rozgryźć, jeśli będziesz miał czas. A może wymyślisz tylko dwie funkcje, które faktycznie musisz wywołać, i tylko tyle, aby poprawnie wykonać połączenia. To skrót, który będzie miał swoją cenę - zwykle później, gdy ktoś (być może starszy i bardziej doświadczony) musi naprawić kod.


13

Kiedyś computerworld.com.au zapytał Bjarne Stroustrup „Czy masz jakieś porady dla przyszłych programistów?”
I odpowiedział„Poznaj podstawy informatyki: algorytmy, architektury maszyn, struktury danych itp. Nie kopiuj na ślepo technik z aplikacji do aplikacji. Wiedz, co robisz, że działa i dlaczego działa. Nie myśl, że wiedzieć, jaka będzie branża za pięć lat lub co wtedy będziesz robić, więc zbierz portfolio ogólnych i przydatnych umiejętności. Spróbuj napisać lepszy, bardziej zasadowy kod. Pracuj, aby „programowanie” było bardziej profesjonalną działalnością i mniej na niskim poziomie „hakowania” (programowanie to także rzemiosło, ale nie tylko rzemiosło). Ucz się od klasyków w terenie i bardziej zaawansowanych podręczników; nie zadowalaj się łatwym do zrozumienia „jak” przewodniki i dokumentacja online - są płytkie ”.
Mam nadzieję, że rozwiąże to twoje wątpliwości co do tego, co jest wymagane doPrawdziwy programista i to, co jest niezbędne, aby każdy mógł nim być.


4
+1 - Myślę, że ważne jest, aby pamiętać, że - chociaż w 100% zgadzam się ze Stroustrupem, OP nie powinien wpadać na pomysł, że oznacza to, że powinien wynaleźć koło na nowo przy każdej swojej rzeczy. Głównym powodem, dla którego edukacja informatyczna wymaga implementacji klasy String oraz MergeSort i innych algorytmów, jest to, że kiedy korzystamy z bibliotek dostępnych w wybranym przez nas języku, zrozumiemy, co dzieje się pod maską. Zajmij się wystarczającą liczbą bibliotek z dobrym zrozumieniem podstaw, a
właściwie

Pochodzący z człowieka, który potrzebuje kilkudziesięciu akapitów, aby dokładnie przeanalizować, uzasadnić i wyjaśnić, dlaczego konkretna marka i smak herbaty wzbudziły jego zainteresowanie, jednocześnie całkowicie rezygnując z pytania wstępnego. ALE nadal go kocham!
Filip Dupanović,

1
Szczerze mówiąc, wiem dużo o algorytmach, architekturze maszyn, strukturach danych i wielu innych rzeczach. Nie oznacza to, że rozumiem, co dokładnie robi każda z naszych bibliotek stron trzecich, a nawet cała teoria. Myślę, że to dobra rada, ale nie oznacza to, że musisz wiedzieć wszystko o swojej aplikacji.
David Thornley,

12

Tak - i wszyscy to robimy!

Weźmy na przykład bardzo prosty błąd, który naprawiłem w kodzie graficznym związanym z komputerem Mac. Kod wokół błędu składał się z kilku kroków:

  1. Po pierwsze, metoda Celu C przydziela bufor pikseli za pomocą malloc () i dołącza go do swojego obiektu Celu C.
  2. Później coś się dzieje, a procedura C wysyła komunikat do obiektu Objective C i pobiera bufor pikseli.
  3. Procedura C kompresuje zawartość bufora pikseli za pomocą jpeglib i wysyła ją przez połączenie TCP / IP.

Tam dzieje się okropnie dużo! Oto kilka rzeczy:

  • Dynamiczny alokator pamięci do implementacji malloc (), który zakłada, że ​​pamięć jest fizycznie ciągła i adresowalna liniowo.
  • Podstawowy system wirtualnej pamięci jądra Darwina do mapowania zarówno pofragmentowanej fizycznej pamięci RAM, jak i miejsca na dysku (będącego innym urządzeniem fizycznym niż pamięć RAM), na coś, co wydaje się dynamicznemu alokatorowi pamięci, tak jak fizycznie ciągła i liniowo adresowalna pamięć RAM.
  • System obiektowy celu C.
  • System przesyłania komunikatów środowiska wykonawczego Mac OS i sposób, w jaki współdziała z obiektami Celu C.
  • Implementacja biblioteki kompresji stratnego obrazu rastrowego JPEG w jpeglib, która wykorzystuje dyskretny algorytm transformacji kosinusowej
  • Procedura sieciowa przestrzeni użytkownika do wysyłania danych, która wywołuje różne implementacje protokołu TCP i IP, która z kolei wywołuje jądro systemu operacyjnego. Następnie, w zależności od tego, co masz włączone w sieci, może on wywoływać sterownik portu Ethernet, układ Wi-Fi, a bardziej nietypowo sterownik USB lub Firewire.

Czy rozumiesz wszystkie szczegóły, w jaki sposób wszystkie te rzeczy są faktycznie realizowane? Na pewno nie! Wątpię, że na Ziemi jest bardzo wielu ludzi, którzy to robią - może nawet żaden. Więc po prostu się tym nie martwię.

Ale dobrze jest być ciekawym i dowiedzieć się choć trochę o bibliotekach i narzędziach, z których korzystasz. Kiedy zaczynałem programować, wiedziałem, że kompilatory i systemy operacyjne nie mogą być magiczne, ale na pewno wydawały mi się takie. Rozkoszując się ciekawością tych rzeczy, nauczyłem się bardzo dużo i do tej pory miałem świetną karierę.


1
Gdybym miał zrozumieć cały kod, którego używam rutynowo, musiałbym zrozumieć kompresję danych, w tym JPEG, geometryczną reprezentację danych, w tym wszystko w <i> The Nurbs Book </i>, zawiłości formatów PDF i U3D oraz wiele więcej. Mam referencje na wszystko, ale nigdy nie będę miał tego wszystkiego w dół.
David Thornley,

Muszę przyznać, że nie zawsze szczegółowo rozumiem wszystkie bloki konstrukcyjne, których używam do pisania działającego kodu, ale czuję się niezadowolony, gdy tak się dzieje. Zrozumienie, a przynajmniej wiedząc, że w razie potrzeby mogę zrozumieć podstawowe elementy, znacznie ułatwia życie. Cieszę się, że wiem, jak działa alokator, jakie zasady stosuje się do kompresji obrazu JPEG, jak działa TCP / IP, w jaki sposób można wdrożyć pamięć wirtualną, jak działa procesor itp. Pozbycie się tych wszystkich szczegółów niskiego poziomu jest dobra, ale brak dostępu do szczegółów jest naprawdę zły ...
Pierre Arnaud

5

Uważam, że głównym powodem, dla którego korzystamy z bibliotek, jest nieustanne „wymyślanie koła”, co wyodrębnia problemy, które zamierzają rozwiązać. Możesz spróbować rozwiązać problemy samodzielnie, ale zajęłoby to więcej czasu.

Uważam jednak, że musimy również wiedzieć lub zgadnąć, w jaki sposób biblioteka rozwiązuje problem. Zazwyczaj jest to udokumentowane w dokumentacji użytkownika biblioteki, a dzięki oprogramowaniu typu open source zawsze możesz sam zajrzeć do kodu.

Poza tym zazwyczaj rozwiązujemy problemy, wyodrębniając trudne części, więc dlaczego nie jest to w porządku?


5

Biblioteki służą do rozwiązywania typowych problemów. Musisz zdecydować, czy rozwiążą konkretny problem, który rozwiązujesz. NIE zastępują one nieumiejętności rozwiązania problemu. Załóżmy na przykład, że Twoja aplikacja wymaga tabeli skrótów, powinieneś mieć wystarczającą wiedzę, aby zrozumieć, jaki problem rozwiązuje tabela skrótów. Powinieneś być w stanie ocenić wydajność używanej biblioteki, aby zdecydować, czy zadziała ona w twojej aplikacji. Uważam, że użycie biblioteki do pokrycia niedostatecznej wiedzy technicznej nie jest właściwym przypadkiem użycia. Decyzja o użyciu biblioteki powinna polegać na tym, czy korzystanie z biblioteki przyspieszy rozwój i zapewni przetestowane i niezawodne rozwiązanie. Decyzja o użyciu biblioteki nie powinna obracać się wokół niezdolności programistów do rozwiązania danego problemu.


Oznaczałoby to, że w moim obecnym projekcie musiałbym znać szczegóły specyfikacji PDF i U3D. W przypadku pewnego projektu szkolnego musiałbym dużo wiedzieć o niektórych algorytmach programowania liniowego (w moim przypadku simplex byłby beznadziejny). Gdyby trzeba było dokładnie zrozumieć, co robi biblioteka, aby z niej skorzystać, nigdy nie dałbym rady.
David Thornley,

Nie twierdzę, że musisz zrozumieć wszystkie szczegóły wdrożenia. Ale powinien wiedzieć, czego oczekiwać od wyniku. Weźmy ponownie przykład tablicy skrótów. Jeśli widzisz słabą wydajność, to jak zacząć oceniać przyczynę. Pierwszą rzeczą, o której zacznę myśleć, są współczynniki kolizji między moimi kluczami. Jeśli nie masz pojęcia, jak coś działa, to jak możesz zacząć stawiać hipotezy na temat powodów, dla których coś nie działa lub nie spełnia oczekiwań?
Pemdas

5

Do ciebie, naprawdę .

Najlepiej rozumiesz narzędzia, z którymi pracujesz, tym lepiej możesz z nich korzystać.

Na przykład rzadko używam jQuery, ale kiedy muszę, wiem, co mam z tego skorzystać i jak mogę sprawić, by współistniał z innymi frameworkami, takimi jak Mootools.

Wkrótce też zacznę przygodę z gamedev z UDK i jestem pewien, że im więcej ją rozumiem, tym bardziej będę w stanie nagiąć ją do mojej złej woli, ale mógłbym również po prostu postępować zgodnie z samouczkami. Wybieram pierwszy, trochę dodatkowego czasu i cykli mózgowych, a ja osiągnę lepsze i łatwiejsze wyniki .


5

Ważne jest, aby poznać swoje królestwo i swoją część procesu.

Powiedzmy, że korzystasz z biblioteki przetwarzania obrazu. Czy naprawdę musisz wiedzieć wszystko na temat rozmycia gaussowskiego, transformacji i przestrzeni kolorów? Nie. Ale musisz przede wszystkim wiedzieć, dlaczego korzystasz z biblioteki. Lub funkcja sortowania frameworka. Czy musisz znać faktyczny zastosowany algorytm sortowania? W większości przypadków nie. Ale musisz wiedzieć, dlaczego potrzebujesz sortowania danych.

Z drugiej strony, jeśli piszesz kompilator, lepiej wiedzieć, jak działa kompilator, ponieważ jest to twój udział w tym procesie.

Niektóre frameworki, takie jak jQuery, bardzo często abstraktują. Czy trzeba wiedzieć, jak dokładnie one działają? Nie. Ale posiadanie silnego, fundamentalnego zrozumienia tego, co robi biblioteka, będzie bardzo korzystne dla Ciebie podczas pisania kodu, ponieważ będziesz lepiej rozumieć, dlaczego struktura jest taka, jaka jest, i będziesz w stanie wykorzystać ją w pełni .


2

Z mojego doświadczenia: ponieważ nie możesz wyeliminować zależności bibliotek, ty i twój zespół powinniście wiedzieć wystarczająco dużo, aby rozwiązać problem.

Jako programiści mamy mało czasu, dlatego musimy wybrać ten, który ma najwyższy priorytet. Problem musi zostać rozwiązany tak szybko i łagodnie, jak to możliwe. Tylko ten powód sprawia, że ​​„nauka wszystkiego o rzeczy działa” nieco zbędne.

To, co chcę tutaj dodać, to „zależność”. Jako społeczność wszyscy jesteśmy zależni od innych. Stawiamy na Giants, aby zbudować naszą aplikację: Java, .NET, API ... I ufamy Giants ich pracy; ponieważ działa na tak wiele osób. Jeśli masz problem z frameworkiem lub interfejsem API, istnieje duża szansa, że ​​inni gdzieś się z nim zmierzyli i istnieje rozwiązanie / obejście problemu.

Jedyny problem tutaj: może gdzieś w ograniczonych kryteriach giganci upadli. Na przykład flash nie jest obsługiwany w niektórych systemach operacyjnych i jest wiele rzeczy, bez których nie możemy się obejść. Ta możliwość jest większa niż zero, ale w tym przypadku mamy niewiele rzeczy, które możemy zrobić. Tylko w tych przypadkach wiedza na temat „tego, co kryje się za maskami” okazuje się przydatna, ponieważ wskazuje, gdzie naprawdę jest problem i może spowodować duże obejście; ale nie jestem pewien, czy czas, który inwestujemy, naprawdę jest tego wart.

Aby poradzić sobie z tą możliwością, myślę, że istnieje rozwiązanie: ponieważ większość programistów może łatwo złapać „pracę powierzchniową” biblioteki i tylko czasami naprawdę potrzebujemy kogoś, kto jest bardzo dobrze rozumiany: podzielmy zespół, aby to zrobić. Próbując stworzyć zespół, w którym każdy z nich wypróbował około 1,2 przydatnych bibliotek / narzędzi / „zestawu umiejętności”, które dotyczyły : ktoś ma dobre doświadczenie w zakresie jQuery, specjalizuje się w bazie danych, ... Pomoże to znacznie w minimalizacji ryzyka.


2

Innym punktem widzenia jest bezpieczeństwo. Kiedy korzystasz z biblioteki, której nie znasz dokładnych mechanizmów wewnętrznych, przyjmujesz założenia dotyczące tego, co się właściwie dzieje. Każde nieudane założenie może otworzyć wektor ataku dla złośliwego atakującego.

Dzwoniąc do Quicksort, powinieneś być świadomy najgorszego zachowania. W przeciwnym razie osoba atakująca może wstrzyknąć dane dotyczące najgorszego przypadku i wykonać DoS.

Podczas wywoływania biblioteki kompresji należy pamiętać, że gdy niektóre dane są kompresowane do mniejszej liczby bajtów, muszą istnieć dane, które „kompresują” do większej liczby bajtów niż oryginał. Więc jeśli Twoim założeniem jest, że bufor wyjściowy potrzebuje tylko rozmiaru danych wejściowych, ponieważ kompresuje [do mniejszej liczby bajtów], wtedy przepełnienie bufora czeka na wystąpienie.

Powinieneś wiedzieć wystarczająco dużo podstaw na temat rzeczy, które zamierzasz zrobić, aby móc udowodnić, że twoje założenia są prawdziwe. W przeciwnym razie biblioteka powinna wyraźnie się tym zająć, np. Zgłaszając wyjątek, gdy dostarczony bufor wyjściowy nie jest wystarczająco duży.


1
Przydzielanie buforów o stałej wielkości do czegokolwiek to przepełnienie bufora, które czeka na wystąpienie. Znacznie lepiej jest użyć języka, który obsługuje tablice dynamiczne i pozwolić odbiorcy zarządzać własnymi buforami.
Mason Wheeler

1

Nie można zrozumieć wszystkiego, z czego korzystasz, dopóki masz pewność, że to działa. Kiedy ugryzie Cię błąd w bibliotece, jest czas, aby zobaczyć, jak to działa, dlaczego działa, a dlaczego nie. Oczywiście zawsze jesteś mile widziany i zachęcany do zajrzenia pod maskę, nawet jeśli nie musisz.

Jedną z trudnych rzeczy w programowaniu jest przezwyciężenie pokusy samodzielnego rozwiązania wszystkich problemów.


1

Jest ok, ale jest niebezpieczny. Jako ogólną praktykę należy wiedzieć, jak działa to, co opracował.


1

Trochę ...

Jest w porządku, pod warunkiem, że uzyskasz ogólny zarys tego, co stara się biblioteka lub środowisko. Jeśli chodzi o części wewnętrzne, a co nie, to nie. Przyjmij pragmatyczne podejście. Działa, zrobił to, co chcę, dobra.

Chodzi o to, aby nie wpaść w garść drobnych szczegółów i po prostu wdrożyć swój cholerny pomysł.

Chyba chodzi o to, że nie dowiesz się wszystkiego. Poważnie, masz tak mało czasu na zbadanie wszystkiego, ponieważ odwróci to uwagę od twojego głównego celu, jakim jest stworzenie twojego pomysłu. Być może po trochu możesz poświęcić trochę wolnego czasu w weekend na przeczytanie rozdziału na ten temat.

Ale nie próbuj wszystkiego wymyślić, chyba że masz dużo wolnego czasu ... Spójrz na to w ten sposób. Powodem programowania języków jest osłona nas przed zrobieniem kodu asemblera, a powodem tego jest osłona nas przed zrobieniem 1 i 0. Nie sądzę, że musisz znać każdy drobiazg mechanizmu leżącego u jego podstaw, ale po prostu znać ogólną istotę tego mechanizmu. Podobnie jak śmieciarz, wiem, że poradzi sobie z moimi wskaźnikami / pamięcią, nie obchodzi mnie, jakiego magicznego algorytmu używa, po prostu wiem, że działa (do tego, czego potrzebuję) i nie robi nic innego. Może wada tego, ale meh. Chyba że oczywiście jesteś w polu, w którym musisz sobie z tym poradzić. W takim razie i tak nie zadałbyś tego pytania, ponieważ jest ono częścią twojej pracy haha.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.