Ciągle napotykam na wyrażenie „nie wymyślaj koła ponownie” lub „nigdy nie wymyślaj koła ponownie”, kiedy zadaję kilka pytań na temat SO. Mówią ci, abyś używał niektórych frameworków lub istniejących pakietów. Wiem, skąd taka postawa, ponieważ niemądrze jest tracić czas na coś, co inni już rozwiązali. A może tak?
Jako student stwierdzam, że używając kodu napisanego przez innych w celu rozwiązania mojego problemu, nie mogę się nauczyć tyle, ile bym chciał, i mam mniej wglądu. Czasami myślę, że to wyrażenie jest przeznaczone głównie dla pracujących programistów, którzy stoją w obliczu terminów, a nie dla studentów takich jak ja.
Czy to takie złe „odkrywać koło”? Może myślę, że to źle? Może jest jakiś sposób, aby uniknąć ponownego odkrycia koła, a jednocześnie wiele się nauczyć?
źródło
Odpowiedzi:
Myślę, że masz rację. Większość programistów na tej stronie to prawdopodobnie profesjonaliści pracujący, których celem jest jak najszybsze stworzenie wysokiej jakości oprogramowania. Ponowne wynalezienie koła nie spełnia tego celu z dwóch powodów.
To powiedziawszy, w środowisku akademickim celem jest nauka , a nie dostarczanie oprogramowania z ograniczonym budżetem. Ponowne wynalezienie koła, aby zrozumieć, jak działają szprychy lub oś, to świetny sposób na osiągnięcie tego celu. Właśnie dlatego wiele programów nauczania obejmuje klasę budowania kompilatorów, gdy tylko niewielu pracujących programistów kiedykolwiek ma ku temu powód.
źródło
Odpowiedź zależy w dużej mierze od kontekstu. Jeśli chcesz uzyskać bardziej dogłębne zrozumienie struktur danych, próbując swoich sił w implementacji tabeli skrótów, najlepszym rozwiązaniem jest „odkrycie koła”. Jeśli uczysz się pisać kompilatory i potrzebujesz tablicy symboli, wdrożenie własnej mapy skrótów zamiast ponownego korzystania ze standardowej biblioteki jest całkowitą stratą czasu.
źródło
Jako student spodziewałbym się, że zaczniesz edukację programistyczną, najpierw kopiując koło lub dwa na początek, a następnie ucząc się modyfikować koła, aby zobaczyć, jak działają i zrozumieć wszelkie ograniczenia. Później możesz nawet stworzyć zupełnie nowe koło, aby sprawdzić, czy możesz ulepszyć projekt, lub pokazać swojemu kierownikowi kursu swoje zrozumienie związanych z tym koncepcji.
Jako zawodowy profesjonalista oczekuję jednak, że nauczyłeś się, którego koła użyć, aby rozwiązać dany problem, i kiedy może być właściwe zmodyfikowanie istniejącego koła, jeśli tylko częściowo rozwiąże problem. Jeśli nie można znaleźć koło gdziekolwiek, to może zidentyfikowaniu nisza rynkowa, albo nie zbadane wystarczająco daleko i trzeba by być wystarczająco doświadczony, aby wiedzieć, kiedy byłoby właściwe, aby utworzyć nowy koło twojego posiadać.
Kwestia, kiedy należy ponownie wynaleźć rozwiązanie, jest złożona i wymaga czasu i doświadczenia, aby dowiedzieć się, kiedy lepiej byłoby stworzyć zupełnie nową wersję czegoś, co już zostało zrobione wcześniej. Jeśli rozwijasz się tylko przez krótki czas, lepiej po prostu użyć istniejącego rozwiązania i poprosić mentorów o zasugerowanie opcji. Kiedy masz napięte terminy i dużo niepewności w projekcie, użycie czegoś, co istnieje, może być ogromną oszczędnością czasu i zawsze jest twoim pierwszym wyborem. Zawsze możesz refaktoryzować, aby użyć innych rozwiązań później, jeśli jest to właściwe, nawet jeśli oznacza to w końcu powrót do wynalezienia twojego koła .
źródło
Będąc nauczycielem lub programistą nieustannie walczę z przeciwną stroną problemu: kiedy proszę uczniów, aby wymyślili nowe koło?
Weźmy te proste sytuacje: badamy algorytm sortowania, a ja zlecam zadanie napisania programu, który sortuje niektóre dane; lub pracuję nad funkcją daty, a ja proszę o kalendarz.
W obu przypadkach dostępnych jest niezliczona ilość gotowych bibliotek i funkcji; ale chcę, aby uczniowie ich unikali i opracowali własną wersję algorytmu sortowania lub kalendarza.
Teraz weźmy jeszcze jeden: wyznaczyłem zadanie napisania prostej aplikacji, powiedzmy, na planowanie spotkań. Może to wymagać sortowania, kalendarza i innych rzeczy. Tym razem obowiązuje zasada „nie wymyślaj na nowo koła”: nie chcę, aby uczniowie borykali się z rozwiązanymi problemami, ale zamiast tego gromadzą istniejące funkcje, aby uzyskać wynik.
Moja trudność polega na tym, o ile poprosić cię o odtworzenie istniejącej, która pozwala ci się uczyć i ma tę zaletę, że rozwiązane problemy z wiedzą o trudnościach, które mogę wykorzystać, abyś ćwiczył rzemiosło, i ile powinienem postawić jesteś w świecie rzeczywistym, w którym koła nie są wymyślane na nowo?
Aby odpowiedzieć bardziej szczegółowo na twoje pytanie, dwie sugestie:
źródło
Praktyka Wątpię, aby pierwsze 1000 wierszy kodu, które ktoś pisze, były bardzo unikalne.
Rozszerz swój zestaw narzędzi Korzystanie ze szkieletu daje więcej korzyści, gdy rozumiesz, co on robi (prawie do tego stopnia, że możesz to zrobić samodzielnie), dzięki czemu wiesz, jak go zastosować.
Zrozumienie „kół” Używanie źle skonstruowanego i zużytego koła lub takiego, które nie pasuje, nie jest usprawiedliwieniem ślepego trzymania się tej zasady. Być może brakuje Ci czasu, funduszy i wiedzy, więc po prostu załataj to i dokończ podróż.
Jest kilka absolutów .
źródło
Studenci nie mają budżetów pieniężnych na realizację zadań, ale są terminy do rozważenia.
Jako ktoś, kto do niedawna był studentem, myślę, że ilość wymyślania kół, która jest odpowiednia, zależy od klasy, dla której wykonujesz zadanie. Nie chcesz pisać własnej biblioteki gniazd dla klasy programowania i projektowania stron internetowych (jeśli możesz to zrobić i oddać zadanie na czas, co robisz, biorąc lekcję tak łatwo?), Ale byłoby ci brakować świetna okazja, jeśli było to zadanie dla klasy sieci. Oczywiście profesorowie zwykle biorą to pod uwagę podczas tworzenia zadań, więc będziesz głównie wykonywać pracę związaną z klasą, ale czasami wiedza o tym, czego nie powinieneś pisać, jest również ważna.
To powiedziawszy, kiedy opuścisz szkołę, ciężko jest znaleźć czas na zbudowanie rzeczy, które już istnieją. Skorzystaj z każdej okazji, kiedy możesz, kiedy jesteś jeszcze w szkole.
Jeśli pojawi się komunikat „Użyj biblioteki X / framework Y” na stronie SO, poprzedzaj swoje pytanie słowem „Piszę sam X, aby dowiedzieć się więcej na ten temat”
źródło
Jeśli nie masz ustalonego terminu dla swojego projektu, IMO, lepiej wymyślić koło na nowo. Jeśli nie masz pracy lub po prostu chcesz nauczyć się programować, a nie zarabiać na programowaniu, jaki jest sens korzystania ze skrótów, które nie uczynią cię lepszym programistą, które tylko przyspieszą twój projekt? Chociaż jest to prawda, zdecydowanie dobra umiejętność korzystania z bibliotek, frameworków i kodu innych osób.
źródło
W prawdziwym życiu koło jest ciągle wymyślane na nowo. Jeśli szukamy powodów, możemy znaleźć pewien wgląd, gdy potrzebujemy nowego podejścia do programowania.
Od czasów sumeryjskich wiele się zmieniło:
Jak to się przekłada na świat oprogramowania? Dobrze,
źródło
Jestem nowo wykształconym studentem. W szkole „uczyliśmy się” asp.net i C #, przez te 2 lata edukacji nie próbowaliśmy tworzyć własnego systemu poczty e-mail, systemu logowania ani CMS. Wszystko po prostu przeciągało i przestawiało kontrolę w widoku projektu .
Rozpoczęliśmy 102 studentów, 23 ukończyło. 4 osoby mają pracę. Powód ?: Te 4 osoby (w tym ja) wiedziały, jak programować, zanim zaczęliśmy naukę.
Reszta ludzi jest zagubiona. Ponieważ nigdy nie „wynaleźliśmy koła”. Nigdy nie dowiedzieliśmy się, jak działa kod. Zbudowanie pełnego systemu logowania z zarządzaniem użytkownikami jest dość proste - ale studenci z mojej edukacji nie wiedzą, jak to zrobić. Ponieważ nie wiedzą, jak działa system logowania.
Jest mi smutno, że w pewnym momencie zmarnowałem 2 lata, niczego się nie ucząc. - Chciałbym, aby nauczyciele na całym świecie mówili: Tak, wiemy, że istnieją ramy, w których istnieje kod. Możesz ich używać w prawdziwym życiu. Ale na tym szkoleniu nauczysz się programowania.
Wiele edukacji programistycznych jest bardzo krótkich, więc edukacja musi obejmować wiele rzeczy w tym czasie. Myślę, że byłoby lepiej, gdyby lista rzeczy została zmniejszona do połowy i poświęcenie więcej czasu na programowanie. Ludzie mogą „wymyślić nowy rodzaj koła”, jeśli wiedzą, jak zbudować normalne „koło”. Ludzie nie są głupi, jeśli mają małą wiedzę, ale nie można poprosić człowieka, który nic nie wie o samochodach, o zbudowanie samochodu. Ale zapytanie człowieka, który umie zbudować rower, byłoby znacznie łatwiejsze z budowaniem samochodu.
źródło
To naprawdę zależy od tego, co robisz. Jeśli próbujesz zrozumieć koła, dobrze jest je odkryć na nowo. Jeśli jednak próbujesz zrozumieć samochody, wynalezienie koła lub silników spalinowych jest generalnie marnotrawstwem i rozprasza.
Na przykład, jeśli chcesz zrozumieć, jak może działać indeks wyszukiwania pełnotekstowego, dobrym pomysłem jest utworzenie własnego. Jeśli próbujesz zbudować aplikację do zarządzania dokumentami, lepiej ponownie wykorzystać istniejącą bibliotekę, ponieważ większość pracy polega na tym, aby jednocześnie uzyskać architekturę aplikacji i wrażenia użytkownika.
źródło
Tak, należy powiedzieć uczniom, aby nie wymyślali koła na nowo. Ale musi być jasne zrozumienie, co to oznacza dla ucznia: napisz, co jest istotne dla zadania. Nie oznacza to, że zadaniem jest napisanie bubbleortortu, skopiujesz go z Wikipedii, ani nie oznacza to użycia array.sort lub ekwiwalentów, jeśli zapewnia to twój framework lub język. Ale po omówieniu różnych algorytmów sortowania, napisaniu własnego sortowania bąbelkowego i szybkiego sortowania, nie zawracaj sobie głowy przepisywaniem go dla każdego nowego zadania, użyj wbudowanego sortowania lub tego, co napisałeś, nie rób ponownie tej samej starej rzeczy .
Nowe odkrywanie koła polega na tym, aby nie marnować czasu, co dotyczy zarówno studentów, jak i profesjonalistów - różnica polega na tym, jakie są cele. Uczniowie powinni się uczyć, więc coś, co nie pogłębia ich zrozumienia, jest stratą czasu - po napisaniu jednego bąbelkowego fragmentu wiesz, co on robi, wiesz, dlaczego nie chcesz go używać na dużym zestawie, a przepisywanie go od nowa to strata czasu. Nie będziesz uczyć się niczego nowego podczas 25 przepisywania.
Dla studentów nie oznacza to, że nie pisz tego, co napisali inni, oznacza to, że nie przerabiaj tego, co już opanowałeś - ten czas, który można lepiej poświęcić na to, czego nie opanowałeś.
źródło
Dużo myśli i wysiłku włożono w stworzenie koła. Rada brzmi: „nie wymyślać koła na nowo”, ale możesz iść naprzód i dokonać inżynierii wstecznej koła i zrozumieć, dlaczego pewne rzeczy są wykonywane w sposób, w jaki zostało to wykonane. Następnie możesz spróbować zastosować koło na swój własny sposób, co może doprowadzić do jednego z trzech logicznych zakończeń.
Dla mnie uczeń nie powinien wymyślać koła na nowo, ale spróbować go odtworzyć i zrozumieć konsekwencje.
źródło
Powiedziałbym, że to zależy od tego, czy odkrywasz na nowo, jak działa koło, czy wymyślasz koło w trakcie wykonywania innego zadania. Z pewnością istnieją koła, które każdy uczeń musi wdrożyć przynajmniej raz na własną rękę. Musisz wiedzieć, jak działają niektóre podstawowe struktury danych i algorytmy, aby zrozumieć, w jaki sposób wpłyną one na wydajność twojego kodu lub wybierz, które z nich będą używane w różnych okolicznościach.
Stosy, stosy, powiązane listy, drzewa itp. Są zdecydowanie warte inwestycji w czasie, aby wdrożyć je raz; potem zawsze po użyciu tych dostarczonych przez framework. Każdy, kto korzysta z wtyczki jQuery, powinien napisać co najmniej jeden, ale nie musisz pisać każdego innego typu, którego kiedykolwiek będziesz używać. Powiedziałbym, że napisanie małego harmonogramu procesów lub mini-OS jest pomocne, ale nie konieczne, abyś mógł zrozumieć, co dzieje się pod maską komputera. Musisz jednak zrozumieć, jak działają procesy, wątki itp.
Gdy masz dobrą wiedzę praktyczną, może być również ważne (i zabawne) wrócić i wdrożyć nowe struktury / algorytmy, aby się z nimi zapoznać. Jeśli nie jest to twoja praca lub nie jesteś w tym naprawdę dobry, trzymałbym się istniejących w twoim kodzie.
źródło
Odpowiedź zależy od tego, czy chcesz się uczyć, czy tworzyć.
Jeśli celem jest nauka, „wynalezienie koła” może dać lepszy wgląd i lepsze zrozumienie niż korzystanie z istniejących kół (funkcje biblioteczne).
Ale jeśli celem jest stworzenie skomplikowanego produktu, wówczas „wynalezienie koła” może być czasochłonną praktyką i niewiele pomoże w stworzeniu produktu.
Niemniej jednak, jeśli celem duszy jest nauka zapewniająca wystarczającą ilość czasu i wytrzymałości, najlepszym rozwiązaniem jest „wynalezienie koła”, ponieważ pomaga dostosować każdą funkcję.
źródło
Są dwa aspekty.
Po pierwsze, jeśli próbujesz się uczyć, przydatne może być zrobienie pewnych rzeczy od zera lub użycie interfejsów niższego poziomu niż to konieczne. Jednak nadal musisz określić, czego się uczysz: jeśli chcesz dowiedzieć się o protokole HTTP, nie musisz samodzielnie programować gniazd. Wymyślaj na nowo rzeczy, o których się uczysz i rób to tylko po to, aby je naprawdę poznać i zrozumieć.
Ale - jedną z najważniejszych umiejętności profesjonalnego programisty jest wybór, poznanie i używanie wcześniej istniejącego oprogramowania. Tego też musisz się nauczyć. Ogromna część pytań dotyczących SO wydaje się pochodzić od osób niezdolnych do czytania dokumentacji.
Wreszcie, programowanie opiera się na znacznej podstawie teoretycznej. Aby nauczyć się teorii, będziesz musiał skorzystać z obu praktycznych ćwiczeń połączonych z czytaniem.
źródło
Napotkałem tę samą sytuację. Wynika to z różnicy w postrzeganiu w przemyśle i środowisku akademickim.
Jeśli nie „wymyślisz koła”, absolutnie nie możesz uczyć się w szkole ani zrozumieć, jak coś działa.
Natomiast w branży celem jest wprowadzenie produktu w jak najkrótszym czasie i wysiłku.
Osobiście lubię schodzić się do króliczej nory i nie cierpię filozofii branżowej, ale tak właśnie robią firmy i nie można narzekać.
źródło
Hacker Fachowe Lexikon ma bardzo dobrą opinię na temat wyważania otwartych drzwi :
Może więc warto wymyślić koło na nowo, ale upewnij się, że patrzysz na rozwiązania innych przed lub po zrobieniu tego.
źródło
Odpowiedź A: Ponownie wymyśl koło. Pogłębia to zrozumienie struktur danych i algorytmów i sprawia, że dużo bardziej prawdopodobne jest, że napiszesz dobre rzeczy. Jestem pewien, że kiedy Guido van Rossum zaczynał od Pythona, ludzie mówili mu, żeby nie wymyślał koła na nowo. Było już wiele języków. Po co pisać w Google, gdy był już Yahoo! Co powiesz na brzęk? Dowiedz się wszystkiego. Bądź gigantem. Nie pozwól, aby mali ludzie cię ograniczali. Odpowiedź B: Jeśli instruktor powie ci, co masz robić, daj mu to, czego chce, lub tylko trochę więcej, nawet jeśli wydaje się to głupie. Jeśli chcesz TAKŻE zwariować, tworząc zadziwiające rozwiązanie i dać mu link do niego, śmiało. Najpierw jednak spełnij podane wymagania, aby był szczęśliwy.
źródło
Jeśli jesteś studentem, a zatem nie masz określonego terminu swojego projektu, lepiej „wymyślić koło”. Jeśli programujesz teraz tylko po to, aby nauczyć się programować, a nie zarabiać, po co wybierać skróty, które nie pomogą ci się uczyć? Dlaczego nie zrobić tego w trudny sposób? Ale kiedy staniesz się działającym programistą, ludzie będą sceptyczni, jeśli nie wiesz, jak korzystać z frameworków lub bibliotek ...
źródło
Zrób to, o co prosi zadanie / pytanie / egzamin.
Wiele lat temu byłem studentem TA w klasie programowania C. Pytanie egzaminacyjne brzmiało „Napisz program do skopiowania pliku”. Kilku uczniów zadało to samo pytanie - czy mogą odrodzić proces i uruchomić polecenie systemu operacyjnego cp?
To, o co poprosiliśmy, to „Czy Twój program skopiuje plik?”
Pytanie egzaminacyjne wymagało od nich napisania kodu w celu skopiowania pliku. Jeśli odpowiedź nie zawierała kodu C, który kopiował plik (np. Otwórz wejście, otwórz wyjście, pętla do odczytu / zapisu bajtów, zamknij wejście, zamknij wyjście), to nie skopiował pliku.
Jeśli nauczyciel mówi, że należy użyć frameworka lub biblioteki (np. Klasa grafiki może zalecić korzystanie z biblioteki 3D), należy użyć tego, co zalecił. Nie wymyślaj własnych ani nie używaj innego. Cokolwiek innego utrudni nauczycielowi ocenę twojej pracy.
Podczas rozmowy kwalifikacyjnej znajomość popularnych ram pomoże ci odpowiedzieć na pytania. Twórz własne projekty do nauki. Powodzenia z Twoimi studiami.
źródło
cp
ich program skopiowałby plik.