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?
16
Odpowiedzi:
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.
źródło
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ć.
źródło
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:
Tam dzieje się okropnie dużo! Oto kilka rzeczy:
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ę.
źródło
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?
źródło
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.
źródło
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 .
źródło
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 .
źródło
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.
źródło
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.
źródło
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.
źródło
Jest ok, ale jest niebezpieczny. Jako ogólną praktykę należy wiedzieć, jak działa to, co opracował.
źródło
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.
źródło