Czy to naprawdę wymagana umiejętność programowania bez dokumentacji API? [Zamknięte]

22

Ledwo zdałem dziś egzamin z programowania Java. Musiałem odpowiedzieć na kilka ogólnych pytań dotyczących wątków, które zrobiłem dobrze, i napisać trochę wątkowy program, który był gorszy. Musiałem podłączyć laptopa do ekranu projektora i od razu napisać program. Moją pierwszą próbą było użycie anonimowych klas, ale zapomniałem dokładnej składni. Może z powodu podniecenia, a może dlatego, że przez ostatnie dwa tygodnie pisałem głównie w php. Następnie zapytałem, czy można korzystać z dokumentacji API. Odpowiedź brzmiała „NIE”. Postanowiłem więc obrać inną drogę i wdrożyłem Runnable. Program robił to, o co proszono na końcu. Oczywiście egzaminatorzy zauważyli moją pierwszą porażkę, co bardzo wpłynęło na mój wynik. Byłem zaskoczony, że nie wolno używać dokumentacji API.

Moje pytanie brzmi: czy naprawdę ważne jest, aby móc bezbłędnie kodować bez dokumentacji API? Czy powinienem rozwinąć tę umiejętność? Czy to naprawdę ważne w świecie rzeczywistym i środowisku pracy? Podczas kursów programowania skupiałem się na wzorcach uczenia się, rozwijaniu umiejętności pisania dobrych aplikacji projektowych, umiejętności korzystania z API i szybkiego znajdowania niezbędnych informacji. Nie próbowałem nauczyć się programować bez dokumentacji API. Czy jest to obowiązkowe podczas rozmów kwalifikacyjnych (kodowanie bez dokumentacji API)?

bancer
źródło
2
Myślę, że pyta o dokumentację , w szczególności odniesienia do API.
3
@bancer - Brak możliwości korzystania z rodzimych klas Java nie ma sensu. Wygląda na to, że nie byłeś przygotowany do egzaminu.
Ramhound
27
W prawdziwym świecie zawsze będziesz mieć dostęp do dokumentacji. Mam okropną pamięć i staram się skupić na ogólnej logice mojej aplikacji i unikać zapełniania mojego umysłu bezcelowym zapamiętywaniem rzeczy, które można łatwo sprawdzić. Niestety świat akademicki (i świat certyfikatów) jest nieco inny i często kładzie się nacisk na bezcelowe zapamiętywanie. Moje studia licencjackie dotyczyły głównie matematyki i fizyki, ale pamiętam, że musiałem zapamiętać wiele wzorów itp. Co za strata czasu.
Antonio2011a
11
@ Antonio2011a - Znajomość interfejsu API języka, którego używasz, NIE jest „bezcelowym zapamiętywaniem”. Im lepiej znasz interfejs API, tym lepiej będziesz mógł programować, ponieważ wybierzesz odpowiednie klasy i metody dla swojego rozwiązania. Nie możesz ich wybrać, jeśli nie wiesz, że istnieją. Oczywiście nikt nie zna całego Java API; jest za wielkie. Ale zawsze dobrze jest wiedzieć, jak najwięcej.
Dawood mówi, że przywraca Monikę
9
@DavidWallace Może nie byłem pewien. Oczywiście nie mówię, że nie musisz znać API! Tyle, że nie musisz zapamiętywać dokładnych nazw klas, metod, kolejności parametrów i innych takich odrętwiających szczegółów! Wszystko, co naprawdę musisz wiedzieć, to że istnieje i jak jest użyteczne, wtedy możesz sprawdzić szczegóły podczas kodowania. Tak jak powiedziałem wcześniej, moja pamięć jest okropna i szczerze mówiąc, mógłbym skorzystać z zajęć godzinę temu, a gdybyś dał mi czysty kawałek papieru, nie byłbym w stanie zapamiętać dokładnych szczegółów.
Antonio2011a

Odpowiedzi:

39

W Real Life ™ oceniłbym tę umiejętność jako „miło mieć”, ale wcale nie był wymagany. Jednak w środowisku uniwersyteckim jest inaczej.

Umiejętność kodowania bez dokumentacji może być wykorzystana jako pośredni wskaźnik znajomości przedmiotu przez studenta. W pewnym sensie, widzenie, jak kodujesz coś bez dotykania dokumentacji, mówi profesorowi, że ćwiczyłeś wcześniej używanie API - odrabiając zadania domowe i inne zadania, a może nawet sam programując dla zabawy. Inteligentna osoba z pobieżnym zrozumieniem danego interfejsu API powinna być w stanie to zrobićdowiedzieć się prawie każdego interfejsu API Java samodzielnie, przeglądając dokumentację. To nie przypadek: często oczekuje się, że programiści będą uczyć się w pracy, a dokumentacja API dla popularnych systemów programistycznych, w tym Java, ma strukturę ułatwiającą programistom szybką naukę. Dokumentacja często zawiera krótkie, niezależne przykłady, ilustrujące koncepcję w zwięzły i zwięzły sposób.

Działa to bezpośrednio wbrew celowi profesora, polegającemu na mierzeniu twojej wiedzy na ten temat (w przeciwieństwie do mierzenia twojej inteligencji). Dlatego nie jest nierozsądne pytanie o kod bez przejrzenia dokumentacji.

UWAGA: Zredagowałem tę odpowiedź w odpowiedzi na edycję pytania.

dasblinkenlight
źródło
2
Z mojej lektury egzaminatorzy patrzyli na jego zdolność do zapamiętywania dokumentacji API. Wiedział, co robić, po prostu nie pamiętał składni.
Paul
@Paul Przeczytałem zmiany i zmieniłem odpowiedź. Myślałem, że OP prosi o coś zupełnie innego. Dzięki!
dasblinkenlight
2
+1 za zidentyfikowanie prawdziwego problemu tutaj. Gdyby to była rozmowa o pracę, ankieter byłby bardziej zainteresowany sposobem rozwiązania problemu i prawdopodobnie pozwoliłbyś napisać swoje najlepsze przybliżenie składni na tablicy. Jeśli spędziłeś ostatnie trzy miesiące na uczeniu się określonego materiału i jesteś testowany na tym konkretnym materiale, uzasadnione jest, aby nie mieć polityki „otwartego Internetu”.
StriplingWarrior
@Paul: masz rację
bancer
21

Był kiedyś facet, który miał mały błąd w kodzie, więc zabrał go do StackOverflow i poprosił o pomoc. StackOverflow: Java (generowanie liczb bez powtórzeń) . Spojrzałem na jego kod i wskazałem mu, że jego HashSet jest nieustannie wypełniony wartościami, ale nigdy nie został wyczyszczony. Zapytał mnie więc: „jak to wyczyścisz?” Muszę przyznać, że nie jestem szczególnie dumny z udzielonej odpowiedzi.

Musisz absolutnie znać podstawowe rzeczy, których używasz na co dzień. Musisz znać je wszystkie i dobrze je znać. Ale tylko podstawowe rzeczy.

W przypadku wszystkiego innego ważne jest, aby wiedzieć, że istnieje coś, co robi, co chcesz. Dokładnie, z której klasy należy skorzystać, dokładnie, którą metodę należy wywołać i jakie parametry należy do niej przekazać, jest czymś, czego nie trzeba zajmować cennymi neuronami mózgu. Do tego służy dokumentacja i dlatego wymyślono IDE z funkcją autouzupełniania. A jeśli push przychodzi do końca, zawsze istnieje StackOverflow i większy interwebz.

Proszenie programistów o zapamiętywanie API na pamięć jest podobne do proszenia prawników, aby znali na pamięć kodeks prawny i wszystkie precedensy. To jest bezcelowe. Ćwiczenie bezcelowości.

Mike Nakis
źródło
+1: Bardzo trudno jest nauczyć się całego API dużej biblioteki, takiej jak Java, tylko ze względu na jej rozmiar. Wiedza o ogólnych możliwościach, jakie zapewniają pakiety, jest jednak łatwiejsza (np. Javax.imageio zapewnia zaawansowaną obsługę obrazów, chociaż nie zawsze go używałem) i należy nauczyć się kilku podstawowych funkcji . W szczególności java.lang i java.util będą używane praktycznie w każdym programie Java.
Donal Fellows
9

Czy to naprawdę wymagana umiejętność programowania bez dokumentacji API?

Nie powiedziałbym, że jest to wymagane, ale tak jest

bardzo pożądana umiejętność

imNSho.

Ostatnie kilka miesięcy spędziłem na kodowaniu w ścisłej współpracy z facetem, który zna API zauważalnie lepiej ode mnie. Jest o wiele bardziej produktywny - po prostu dlatego, że może pominąć sprawdzanie dokumentów API, które mnie rozpraszają .


Mówię tutaj o płynności. O byciu nie tylko zdolnym do czegoś, ale płynnym.

Czy wiesz, co to znaczy być płynnym? To dla kogoś, kto na ciebie patrzy, wygląda to tak, jakbyś pisał podczas pisania ...

  • ... Jakby właściwy kod po prostu płynął z twoich palców na ekran. Jakby nie sprawdzać dokumentów API, samouczków i instrukcji. Właściwie to zrobić sprawdzić je wszystkie, ale to jest niewidoczne, ponieważ wszystko jest w twojej głowie. Masz całą wiedzę, której potrzebujesz w swoim mózgu - naładowany, załadowany i gotowy do użycia.

... To płynna wiedza. To wtedy zajmuje ci minutę, aby zrobić to, co nowicjusz zajmuje godzinę. Naprawdę warto. Pachnie zwycięstwem.

Jeśli opanujesz biegłość w niektórych interfejsach API i odpowiednio zapamiętasz, jak to jest, pamięć ta poprowadzi cię dalej, jak stać się najbardziej produktywnym w pracy z dowolnym innym interfejsem API.

komar
źródło
Nie sądzę, aby jego pytanie dotyczyło tego, czy w końcu powinieneś znać dokumentację, ale czy powinieneś zapamiętać dokumentację jak na egzaminach.
Rei Miyasaka,
@ReiMiyasaka dobrze, jeśli pominiesz pełne pisanie egzaminów, możesz zauważyć: „Tak więc, moje pytanie brzmi: czy naprawdę ważne jest, aby móc bezbłędnie kodować bez dokumentacji API? Czy powinienem rozwinąć tę umiejętność? Czy to naprawdę ważne w prawdziwym świecie? i w środowisku pracy? ” . Skoncentrowałem się na tej części pytania, ponieważ, jak widzicie, moje niedawne doświadczenia sprawiły, że poczułem się dość nieswojo z powodu pomysłu, że może on po prostu przelecieć z elementarną odpowiedzią, która nie jest wymagana . Słusznie?
komara
2
+1 za pokrycie kosztów zmiany kontekstu na dokumenty referencyjne. Konieczność patrzenia na każdy krok spowalnia rzeczy.
Wyatt Barnett
8

Nie. Byłbym martwy bez możliwości spojrzenia z dokumentacji API. Nie mam go tylko wtedy, gdy próbuję debugować coś, w którym nie mogę uzyskać dostępu do dokumentacji. Następnie „odtwarzam inżynierię” interfejsu API i w razie potrzeby wycinam i wklejam kawałki.

Ważne jest, aby dobrze wiedzieć, o co chodzi w interfejsie API i której części najlepiej użyć, ale znając nazwy metod, nazwy zmiennych ... nie jest to naprawdę konieczne.

Paweł
źródło
3

W pracy nigdy nie miałem sytuacji, w której nie miałem dostępu do dokumentacji. Z drugiej strony, umiejętność rozumienia czytania i ogólne rozumienie, aby móc interpretować źle napisaną dokumentację, jest przydatna przez cały czas.

W końcu powinieneś poznać wzorce i strukturę swoich interfejsów API, ale wiedza, gdzie dokładnie wszystko jest, nie jest szczególnie przydatna.

W SFU Computing Science egzaminy zamknięte stanowią od 70% do 100% naszych ocen. Teoria polega na tym, że egzaminy sprawdzają twoje zrozumienie materiału kursu i twoją zdolność adaptacyjną. W rzeczywistości wszystko, co naprawdę testuje, to twoje nerwy, jakość / czas snu, twój dowcip i techniki zapamiętywania na pamięć - z których żadna nie jest konieczna ani naukowo, ani do typowej pracy w branży oprogramowania.

Rei Miyasaka
źródło
2

Do wszystkich oprócz ostatniego pytania: Encyklopedyczna znajomość dokumentacji API nie jest ważna. Oczywiście programujesz szybciej, jeśli znasz każdy szczegół każdej metody każdej klasy, ale nie jest to rozsądne oczekiwanie.

Na twoje ostatnie pytanie: Można oczekiwać, że znasz specyfikę niektórych klas bez dokumentacji API. Jeśli przed wejściem na rozmowę wiesz, że zostaniesz przetestowany, lub jeśli praca jest bardzo skoncentrowana (tzn. Będziesz robił wątki przez cały dzień), możesz oczekiwać, że będziesz musiał szczegółowo zapoznać się z powiązanymi zajęciami.


Dodatek: Powinieneś dokładnie wyjaśnić przed egzaminem z profesorem / instruktorem, jakie dokładnie materiały zostaną dostarczone i jakie możesz sobie przynieść. Załóż, że wszystko, na co nie wyrazili wyraźnej zgody, jest niedozwolone. Miałem kursy, w których mogłem tylko przynieść podstawy pisania, gdzie mogłem przynieść dowolne książki i gdzie mogłem przynieść dokładnie jeden dwustronny arkusz ze wszystkim, co chciałem. Egzaminy są zwykle skonstruowane wokół dozwolonych materiałów.

Matt
źródło
2

Dokumenty API! = Składnia języka.

Rozumiem, kiedy ktoś nie zna dokładnych nazw różnych klas Java i ich metod. Nie znam ich i codziennie koduję w Javie. Zgubiłbym się bez dokumentacji lub wszechstronnego autouzupełniania IDE - szczególnie jeśli chodzi o standardowy interfejs API języka Java, który jest dobrze znany ze swojej szczegółowości w nazwach zmiennych / klas / metod.

Jednak, jak sam powiedziałeś, w dokumentach zwykle nie ma niczego, czego nie mogłeś zapamiętać. Jest to składnia klas wewnętrznych - jest to cecha samego języka, a nie coś, co należy zapamiętać z dokumentów.

Chociaż uważam, że uczniowie powinni (w wielu przypadkach) mieć możliwość korzystania z dokumentów dla standardowych interfejsów API, myślę, że każdy, kto chce zdać egzamin programistyczny, powinien znać składnię języka. I nie mam na myśli dziwacznych przypadków, o których wiedzą tylko projektanci języków, tylko te standardowe - jak ten w twoim przykładzie.

Goran Jovic
źródło
2
Nie uważam też, że warto zapamiętać składnię. Funkcje, wzory i gotcha, tak, ale składnia, nie. Pracuję w zbyt wielu językach, aby miało to sens, i myślę, że jest to również prawdą w przypadku większości programistów.
Rei Miyasaka,
@ReiMiyasaka: Nie sądzę, że powinieneś zapamiętywać specyfikacje całego języka, ale powinieneś znać podstawową składnię w dowolnym momencie. Czy patrzysz w dokumentach, jak napisać pętlę w jednym ze swoich języków? A może po prostu kodujesz?
Goran Jovic
W rzeczywistości pracuję z wieloma językami i często zapominam o dokładnej składni nawet dla podstawowych rzeczy !! Więc zawsze muszę odnosić się do dokumentów.
Antonio2011a,
@ Antonio2011a: Przyznaję, że robię to sam, zwłaszcza gdy używam mniej popularnych języków. Ale dla wielu studentów język, który się uczy, jest pierwszym językiem programowania. Jeśli uczeń nawet nie nauczył się składni, to nie mówi nic dobrego o tym, jak przygotował się do egzaminu.
Goran Jovic
@Goran Właściwie niekoniecznie z dwóch powodów: 1. kompilacja w tle mówi mi, kiedy źle się składam, oraz 2. pętle są wtórne (prawie nieistniejące) w językach takich jak Haskell i ML. Języki są bardziej zróżnicowane, niż mogłoby się wydawać. Mimo że spędzam większość czasu na kodowaniu w F # i tylko niejasno pamiętam Haskell, nadal potrafię dobrze zrozumieć kod Haskell, pamiętając o zauważeniu różnic semantycznych. Z drugiej strony zgadzam się, że nauka pierwszego języka od podszewki jest niezwykle ważna i zbyt często zaniedbywana.
Rei Miyasaka,
2

W Eclipse możesz pisać obj.i naciskać ctrl + spacja, a on spróbuje się automatycznie uzupełnić, podając wszystkie opcje metody dla danego obiektu. Jeśli z jakiegoś powodu mi się to nie powiedzie, Java API ma resztę odpowiedzi. Trudno mi byłoby wymyślić dzień, w którym nie zrobiłem Google, jak coś zrobić.

Szkoła to jednak zupełnie inna historia.

Stephanie
źródło
2

IMHO, środowisko akademickie zwykle śmierdzi wytwarzaniem dobrych inżynierów oprogramowania. Tylko ludzie, którzy kodują dla zabawy po lekcjach, mają szansę osiągnąć coś w rzeczywistych projektach.

Z drugiej strony środowisko akademickie nie polega na tworzeniu programistów, cały świat polega na rozwiązywaniu abstrakcyjnych problemów i przeprowadzaniu badań. Przez większość czasu jest to dalekie od praktycznego zastosowania. A naukowcy niekoniecznie są dobrymi programistami.

A nauka API na pamięć śmierdzi. Istnieje autouzupełnianie / google / msdn / javadocs, aby sprawdzić wszystkie zakamarki, dlaczego ktoś miałby chcieć mieć to wszystko w głowie przez cały czas? Najczęstsze funkcje, których nauczysz się za kilka tygodni / miesięcy, wszystko inne można sprawdzić w ciągu kilku sekund, jeśli znasz składnię, strukturę i ogólne pomysły.

Z drugiej strony, niektóre osoby nadal kodują w edytorach tekstowych i zapamiętują nazwy funkcji na pamięć, niekoniecznie jest to błędne, ale jeśli są fanatyczne, masz swojego profesora.

Co więcej, nawet jeśli znasz nazwy funkcji i parametry na pamięć, dobrym pomysłem jest ich weryfikacja w najnowszym dokumencie API. Strtok działał dobrze w scenariuszu jednowątkowym 10 lat temu, obecnie nie jest dobrze. Jeśli nauczysz się tylko nazw i parametrów, nigdy nie dowiesz się, że funkcjonalność może być przestarzała lub wymyślone lepsze alternatywy.

Języki się zmieniają, więc musisz się z nimi zmieniać, pamiętając, że jeden prawdziwy sposób nie jest do tego odpowiedni.

Koder
źródło
1

jeśli zaczniesz pracę nad jakimś projektem przez jakiś czas, używając API, wcześniej czy później nauczysz się tego interfejsu. wierzę, że jest to całkowicie niepotrzebna umiejętność, ponieważ nie znam nikogo, kto nigdy nie zajrzy do żadnej dokumentacji (msdn, strony podręcznika itp.)

jednak uniwersytety są zupełnie innym wszechświatem, więc nie zdziw się, jeśli zawiedziesz, ponieważ nie znasz na przykład nazwy typedef 10. parametru CreateWindowEx.

Hayri Uğur Koltuk
źródło
Niezgodne z moim doświadczeniem na uniwersytetach. Jeśli już, to mieli obsesję na punkcie teorii i nie zwracali uwagi na szczegóły. Czy poziom spadł do poziomu szkoły zawodowej?
AProgrammer
nie mówię o jednym uniwersytecie, a to tylko przykład tego, co możesz zobaczyć gdzieś na świecie na jakimś uniwersytecie. jak wiecie, nie wszystkie są takie same
Hayri Uğur Koltuk
2
Uniwersytety zawsze miały pewien stopień zapamiętywania i regurgitacji. Sprawdziłbym rachunek różniczkowy, gdybym miał książkę CRC, zamiast zapamiętywać tabele integralne.
Blrfl
1

Powiedziałbym, że nie, nie jest to wymagane, ludzki mózg jest fizycznie niemożliwy do zapamiętania tak dużej ilości informacji, ale nadal musisz znać podstawy lub najczęściej używane rzeczy, ponieważ nie ma zbyt wielu z nich do zapamiętania . W przeciwnym razie niemożliwe jest zapamiętanie wszystkiego, co jest w Javie.

Również niesprawiedliwe jest, aby nauczyciel chciał, aby jego uczniowie wiedzieli wszystko lub wykorzystali to, aby wiedzieć, czy programują w języku, oprócz ćwiczeń lub projektów, które ci zleca. Dla mnie to tak, jakby chcieć wiedzieć, co robisz, gdy nie jesteś w szkole, lub wykonywać związanej z tym pracy.

EDYCJA: Oczywiście, to, o co nauczyciel cię prosi, zależy od niego, niektórzy nauczyciele bardziej cenią teorię, podczas gdy inni cenią praktykę i nie dbają o to, jeśli nie wszystko zrozumiesz.

Coyote21
źródło