Naucz się programować wstecz, lub „więc nie zdałem testu FizzBuzz. Co teraz? ”[Zamknięty]


94

Trochę tła

Mam dziś 28 lat i nigdy nie odbyłem żadnego formalnego szkolenia w zakresie tworzenia oprogramowania, ale mam dwa stopnie naukowe odpowiadające licencjatowi z Public Relations i Executive MBA z zakresu zarządzania projektami. Pracowałem na tych polach łącznie przez około 6 lat, a 2,5 roku temu rzuciłem / straciłem pracę i postanowiłem zmienić kierunek.

Po miesiącu zastanowienia postanowiłem rozpocząć freelancing, tworząc małe strony internetowe w WordPress. Sam się nauczyłem i dzisiaj mogę powiedzieć, że prowadzę skromną, ale odnoszącą sukcesy karierę, opracowując od podstaw motywy i wtyczki dla moich klientów - głównie agencji zlecających część pracy programistycznej dla średnich / dużych stron internetowych.

Ale czasami po prostu czuję, że brak wystarczającej wiedzy z matematyki lub brak formalnego zrozumienia rzeczy naprawdę mnie powstrzymuje, gdy muszę konkurować lub pracować z bardziej doświadczonymi programistami. Ciągle szukam sposobów, aby dowiedzieć się więcej, ale wydaje mi się, że brakuje mi podstaw.

Niestety, spędzanie 4 kolejnych lat w informatyce nie jest teraz opcją, więc staram się nauczyć wszystkiego, co mogę, z książek i zasobów internetowych. Ta metoda nigdy nie spowoduje, że NASA mnie zatrudni, ale tak naprawdę nie obchodzi mnie to w tej chwili. Moim celem jest, aby najpierw przekroczyć poprzeczkę i móc nazywać się prawdziwym programistą.

Obecnie spędzam wolny czas studiując Javę dla programistów (aby opanować język, który według wszystkich jest trudny / wymagający), czytając fragmenty kodu Complete (aby uzyskać najlepsze praktyki), a także Code: The Hidden Language of Computer Sprzęt i oprogramowanie (aby uchwycić wewnętrzne działanie komputerów).

TL; DR

Tak więc moja obecna sytuacja jest następująca: w zasadzie jestem w stanie napisać dowolny kompletny system w PHP (z pomocą Google i kilku książek), zintegrować Ajax, SQL i tak dalej, i może trochę wolniej niż oczekiwałby doświadczony programista z powodu wszystkich zaangażowanych badań.

Ale wczoraj utknąłem w martwym punkcie, próbując znaleźć (nie Google) rozwiązanie dla testu FizzBuzz, ponieważ nie zapamiętałem operatora modułu if($n1 % $n2 == 0) metody .

Co sugerujesz jako dobry sposób rozwiązania tego dylematu? Jakie przedmioty / książki powinienem studiować, aby szybciej rozwiązywać problemy, a może bardziej „w sposób programistyczny”?

EDYCJA - Wydaje się, że było pewne zamieszanie w kwestii tego, czego nie wiedziałem, aby rozwiązać FizzBuzz.

Może nie wyraziłem się dobrze: znałem kroki potrzebne do rozwiązania problemu. To, czego nie zapamiętałem, to operator modułu. Problem polegał na transpozycji podstawowej matematyki do programu, a nie na znajomości podstawowej matematyki.

Podjąłem test dla zabawy, po przeczytaniu o nim w Coding Horror . Właśnie zdecydowałem, że to dobra linia porównawcza między mną a formalnie wyszkolonymi deweloperami.

Użyłem tego tylko jako przykładu tego, jak nie radzenie sobie z matematyką w środowisku komputerowym sprawia, że ​​tracę czas na szukanie podstawowych rzeczy, takich jak operatory modułu, aby móc rozwiązać proste problemy.


63
Kiedy to czytam: I'm basically capable of writing any complete system in PHP (with the help of Google and a few books)i łączę to z tym, że nie wiesz if($n1 % $n2 == 0), zastanawiam się nad narażeniem na rzeczy napisane w PHP. Myślę, że większość rzeczy, które robisz, wykracza poza proste obliczenia modulo. Czy mógłbyś dać więcej wglądu w to, co według ciebie jesteś w stanie zrobić?
phant0m

10
Jestem również samoukiem programistą ... pracuję nad tym od ponad 10 lat, cały internet, cały czas .. wtedy nie było żadnych zajęć z programowania stron internetowych ... myślę, że nauka przynosi korzyści. naprawdę chcesz poznać podstawowe zasady OO i wzorce projektowe. bardzo pomogą ci mieć je z tyłu głowy, gdy atakujesz problemy. Ogólnie uważam, że nie zawsze mam słownictwo, które mają inni, ale jeśli lubisz kodować i lubisz pisać eleganckie rozwiązania, to ostatecznie Będę mógł zakodować swoją drogę w cokolwiek zechcesz
hanzolo,

56
W odniesieniu do stuck b/c I didn't memorize %problemu warto zauważyć, że istnieją inne sposoby na zrobienie tego: (przy założeniu, że $ n2! = 0) if (is_int ($n1 / $n2))lub if (($n1 / $n2) == (int) ($n1 / $n2))znajomość słów kluczowych to jedno, a umiejętność wyrażenia podstawowych pomysłów w przypadku braku wbudowanego rozwiązania jest inne.
grossvogel

18
@grossvogel Dokładnie! Jednym z powodów, dla których ludzie lubią Fizzbuzz, jest to, że istnieje tak wiele sposobów jego rozwiązania. Nie jest tylko sztuczką sprawdzenie, czy znasz operator modułu. Jedną z kluczowych umiejętności programistycznych jest umiejętność przetłumaczenia problemu z formy, w której jest sformułowany, na formę, która jest najlepsza dla twojej wiedzy / narzędzi / zasobów / itp.
od

18
Niewiedza operatora modułu nie jest powodem do niepowodzenia FizzBuzz. Kiedy znajdziesz coś, czego brakuje, musisz być w stanie to obejść.
Loren Pechtel,

Odpowiedzi:


144

W twoim przypadku, ponieważ jesteś samoukiem i masz już dobre, zdrowe podejście do nauki bez BS. Nadal kilka sugestii ...

Praktyka czyni mistrza

Myślę, że powinieneś zanurzyć się w ćwiczeniach programowania, takich jak:

Weź nawet pytania z poprzednich egzaminów znanych uniwersytetów wokół ciebie lub lokalnych (lub zdalnych) konkursów programistycznych. Na przykład, mamy fajną we Francji dla początkujących programistów, która nazywa się Prologin , i co roku zapewnia dobrą serię łamigłówek (prawdopodobnie tylko po francusku, przepraszam, ale to jest to, co mam na myśli ).

Więcej informacji: gdzie mogę znaleźć programistyczne łamigłówki i wyzwania?

Klasyczne książki i referencje

Moglibyśmy również polecić bardzo długą listę niesamowitych książek , ale powiedziałbym, że Zen odpowiada, że ​​nie ma jednej właściwej drogi do Oświecenia.

Trudno byłoby powiedzieć, które są na szczycie listy. Czytaj dalej mnóstwo rzeczy, aby poznać ogólne pułapki, których należy unikać, i najlepsze praktyki, których należy przestrzegać, tak jak teraz postępujesz poprawnie.

Więcej:

Przekraczając granice

Poszukaj również materiałów do drapania głowy, takich jak:

Niekoniecznie musi być traktowany jako przykład rzeczy do zrobienia w dzisiejszych czasach, ale warto spróbować dowiedzieć się, co się tam do diabła dzieje.

Systemy równorzędne są motywacyjne

Możesz także czaić się (i angażować) w następujące społeczności, aby stopniowo podnosić swoje umiejętności poprzez konfrontację z innymi.

Edukacja w niepełnym wymiarze godzin

Jeśli nie masz czasu ani motywacji, aby wziąć udział w kolejnym 4-letnim kursie lub czymś podobnym (co może nawet nie być konieczne lub przynosić satysfakcję i kosztowne), możesz rozważyć poszukiwanie materiałów do nauczania online. Oczywiście nie ograniczają się one do informatyki.

Dzięki oryginalnemu wysiłkowi MIT OpenCourseWare , teraz jest mnóstwo uniwersytetów, które poszły w ich ślady , i możesz znaleźć wiele materiałów na poziomie uniwersyteckim za darmo. Nie zawsze jest łatwa nawigacja i samodzielne czytanie, ale niektóre są dość dobrze zrobione. Aby zacząć od zera i iść dość wysoko, zastanów się również nad Akademią Khan .

Niektóre z nich idą nieco dalej i oferują darmowe kursy online, w których podobnie masz dostęp do materiałów kursu, ale także zapewniają one wykłady i regularne samooceny. Na przykład odwiedź Coursera lub Udacity .

Większość z nich często publikuje swoje wykłady na Youtube lub iTunesU, więc znajdziesz mnóstwo materiałów, jeśli twoje pragnienie wiedzy nie zostało stłumione przez wszystkie poprzednie linki.

Jeśli chcesz czegoś, co zapewni bliższe doświadczenie „prawdziwemu” uniwersytetowi, możesz wziąć pod uwagę uniwersytety zdalne, które pozwalają również na pracę w niepełnym wymiarze godzin, ale wymagają zachowania tempa oraz posiadania zarówno samooceny, jak i zakończenia roczne egzaminy (czasem na miejscu), jak w przypadku OpenUniversity i jego międzynarodowych wariantów.

Pasja utrzymuje Cię w ruchu

  • Znajdź projekt zwierzaka: stwórz swój własny projekt lub dołącz do jednego lub kilku istniejących projektów oprogramowania i wnieś swój wkład.
  • Kod, kod, kod. A potem napisz trochę więcej.

(i uzyskaj wystarczającą liczbę gałek ocznych, patrząc na Twój kod, aby Cię krytykować i mieć różne perspektywy)

Francuzi mówią:

C'est en forgeant que l'on devient forgeron.

Rób to, co robisz, a ostatecznie będziesz ekspertem. Zajmuje czas i pracę.

Zobacz także Mam problemy z nauką, aby uzyskać więcej sugestii.


PS: Chociaż jest to bardzo kontrowersyjne narzędzie do przeprowadzania wywiadów i nie pomaga w identyfikacji dobrych kandydatów, często używam FizzBuzz, aby przynajmniej wyeliminować niewiarygodnie „złych”. Więc zwróć uwagę na tę praktykę! :)


3
C'est super ça! :) Dzięki za listę. Projekt Euler i łamigłówki wydają się bardzo fajne. I już korzystam z innych stron SE. Zanurzę się w to.
moraleida

@moraleida: Cieszę się, że polubiłeś odpowiedź. Nie ma za co.
haylem

O twoim PS: Nie przejmuję się teraz rozmowami, ponieważ naprawdę nie chcę wracać do bycia pracownikiem. Podjąłem test dla zabawy, po przeczytaniu o nim w Coding Horror. Właśnie zdecydowałem, że to dobra linia porównawcza między mną a formalnie wyszkolonymi deweloperami. :)
moraleida,

4
+1 tylko dlatego, że FizzBuzz jest używany na końcu ... Zbyt często widzę tu komentarze lub blogi na temat osób krytykujących go, ponieważ zakładają, że firmy używają go do identyfikowania superkoderów. (Do tych firm: Źle to robisz!)
Izkata,

1
Jest to wymienione na niektórych linkach, ale czuję, że uzasadnia to wezwanie: rozejrzałbym się także po rosettacode.org . Ma wiele różnych problemów rozwiązanych w wielu językach programowania. Jest to dobra praktyka w odczytywaniu kodu, co jest równie ważne jak jego pisanie, a także świetny sposób, aby zobaczyć wiele różnych podejść do rozwiązania tego samego problemu. A jeśli znajdziesz problem, który nie został jeszcze rozwiązany w języku, który znasz lub chcesz się nauczyć, jest to dla ciebie wyzwanie programistyczne.
Mark Reed,

60
I didn't have the if($n1 % $n2 == 0) method memorized.

Nie pisałem zbyt długo (zacząłem uczyć się SQL około 27 miesięcy temu i zacząłem pisać w Perlu około 20 miesięcy temu), ale powyższy cytat brzmi jak niektóre rzeczy, które słyszałem od byłych uczniów:

Jak mam zapamiętać, jaką technikę integracji zastosować w przypadku każdego problemu?

Nie zapamiętałem, czy powinienem dodawać, czy mnożyć prawdopodobieństwa, czy używać „n wybierz k”, czy też silni.

Poczekaj minutę! Powiedziałeś, że x równało się 2 wczoraj! Czy teraz wynosi zero ?!

Okej, ten ostatni był chyba trochę trudny ... ale staram się, aby rozwiązywanie problemów nie polegało na zapamiętywaniu . Gdyby tak było, to jakiś geniusz mógłby zaprogramować komputer, aby rozwiązał każdy problem i nikt z nas nie musiałby nigdy więcej myśleć (jaki to piekielny świat ...).

Prawdą jest, że każda próba intelektualna polega na przynajmniej odrobinie zapamiętywania. W szczególności, jeśli zamierzasz pisać w PHP, powinieneś zrozumieć podstawowe typy danych (liczby, ciągi, tablice), podstawowe rzeczy, które możesz z nimi zrobić (dla liczb: dodawanie, odejmowanie, mnożenie, dzielenie i moduł; dla łańcuchów: konkatenacja, podciągi, zamiana i przynajmniej pewna znajomość wyrażeń regularnych; dla tablic: konkatenacja, sczepianie elementów, łączenie elementów, zapętlanie, zliczanie elementów itp.) oraz podstawowych struktur logicznych, których można użyć (instrukcje if / then / else, foreach loop, while loop itp.).

Następnie, gdy napotkasz problem, użyj go, aby zapewnić kontekst dla potrzebnych narzędzi. W przypadku FizzBuzz musisz powiedzieć, kiedy liczba jest podzielna przez 3, 5 lub 15. OK, więc mamy do czynienia z liczbami ... jakie podstawowe narzędzia pozwalają nam stwierdzić, kiedy jedna liczba całkowita jest podzielna przez inną? Operator modułu. Więc skorzystaj z tego. (Oczywiście, jeśli masz numer $n, możesz być fantazyjny i sprawdzić, czy ostatnia cyfra $nto 0 lub 5 i / lub czy cyfry $nsumują się do czegoś podzielnego przez 3, ale ja dygresję ...) Musisz zrób to dla każdej liczby od 1 do 100, więc aby uniknąć dostania się tunelu do carpel, użyj foreachpętli.

Morale tej historii jest to, że jeśli z jednej strony powiesz „Jestem w zasadzie zdolny napisać dowolny kompletny system w PHP”, az drugiej strony nie możesz napisać kodu do FizzBuzz, to pierwsze stwierdzenie jest błędne. Niektórzy z moich byłych studentów rachunkowości przeklinali w górę i w dół, że rozumieli pojęcia, ale po prostu nie mogli rozwiązać problemów na egzaminie ... ani zadań domowych ... ani problemów z quizem. Myliły się również co do swojego zrozumienia.

Przestań robić wymówki i naucz się podstaw.


6
Nie zapamiętywam, metabolizuję i włączam te rzeczy do mojej intuicji. Zawsze staraj się to rozszerzać.
ncmathsadist

@ncmathsadist - Tak, rozwijanie intuicji jest kluczowe, ale nawet intuicja musi polegać na zapamiętywaniu niewielkiej liczby bardzo podstawowych pojęć i faktów.

dla przypomnienia, nie musisz pomnożyć liczby przez 3, a następnie dodać cyfry, aby zobaczyć, czy można ją podzielić przez 3, możesz po prostu dodać liczby. na przykład 864, 8 + 6 + 4 = 18, który można podzielić przez 3, podobnie jak 864
Oztaco

@ leaf68 - Duh! [klepie cię w czoło] masz absolutną rację ... edytuj!

27

Możesz myśleć, że FizzBuzz to problem z zabawkami; kiedy będę musiał użyć operatora modułu w prawdziwym programie. Ale tak naprawdę używasz go cały czas. Trzy typowe przykłady:

  1. Wyświetlasz tabelę i potrzebujesz naprzemiennych kolorów tła dla różnych wierszy. Sprawdzasz, czy wiersz jest parzysty ( row_number % 2 == 0) i wyświetlasz jeden kolor dla wierszy parzystych i jeden dla wierszy nieparzystych.
  2. Masz kolekcję obiektów, przez które zapętlasz się i chcesz wydrukować tabelę z N obiektami w rzędzie; wówczas kryterium, kiedy należy dodać podział wiersza, jest (item_number% N == 0). Właściwie miałem pytanie SO dotyczące tego dokładnego zachowania, chociaż w tym języku szablonów warunek if item_number % N == 0został zapisany jako równoważny ( if item_number|divisbleby: N).
  3. Wykonujesz kilka operacji, które chcesz zgrupować w transakcję, która zostaje zatwierdzona dopiero wtedy, gdy grupa osiągnie określony rozmiar ze względu na wydajność. Być może korzystasz z interfejsu API danych Google i nie chcesz, aby nagłówek HTTP / koszt uwierzytelnienia był wykorzystywany do tworzenia nowej transakcji dla każdej operacji, więc grupujesz je razem w grupy 50 operacji. Lub zapisujesz rekordy do bazy danych i chcesz zatwierdzić transakcję, gdy ma ona rozsądny rozmiar. Coś jak if cur_item_number % 50 == 0 then commit_data.

Pewnie, że istnieją inne sposoby robienia tych wszystkich rzeczy. Ale możesz zrobić fizyczny szum bez użycia operatora modułu lub porównywania podziału zmiennoprzecinkowego z podziałem całkowitym. Na przykład dla FizzBuzz możesz zrobić coś takiego jak następujący pseudo-kod.

div_by_3_rem = 0
div_by_5_rem = 0
for(i = 0; i< 50; i++) {
    if(div_by_3_rem == 0 && div_by_5_rem == 0) {
       print "FizzBuzz"
    } elif(div_by_3_rem == 0) {
       print "Fizz"
    } elif(div_by_5_rem == 0) {
       print "Buzz"
    } else {
       print i
    }
    div_by_3_rem += 1
    div_by_5_rem += 1
    if(div_by_3_rem == 3) {
       div_by_3_rem = 0
    }
    if(div_by_5_rem == 5) {
       div_by_5_rem = 0
    }
}

Podsumowując, jeśli chcesz zostać świetnym programistą, nie wskakuj do nauki książek językowych. Tak, w książce PHP / Java będziesz otrzymywać odpowiedzi z google / stackoverflow i programów działających w połowie znacznie szybciej niż cokolwiek innego. Ale aby móc wiedzieć, jak pisać optymalne programy o jakości i myśleć jak programista, trzeba mieć kontakt z prawdziwymi książkami z CS.

Zacznij od książki CS, która wprowadza język programowania i tło CS, ze słynnym przykładem struktury i interpretacji programów komputerowych (który nauczy Schematu - dialektu Lisp) lub czegoś innego jak Think Python Jak myśleć jak komputer Naukowiec (którego nie przeczytałem). Oba są bezpłatne online.

W końcu musisz przeczytać dobrą książkę z algorytmami, najlepiej z algorytmami CLRS (nie za darmo), choć ta książka z darmowymi algorytmami onlinemoże to być tani zamiennik (choć jeśli możesz po prostu kupić CLRS). Książka algorytmów nauczy Cię, jak myśleć o rozwiązywaniu problemów z komputerem i zapozna Cię z różnymi strukturami danych (tablice / listy połączone / sterty / drzewa binarne / B-drzewa / tabele skrótów) i ważnymi algorytmami, które musisz wiedzieć, jak optymalnie używać . Nie musisz zapamiętywać każdego dowodu ani wiedzieć, jak perfekcyjnie napisać każdy algorytm (kto kiedykolwiek używa sterty Fibonacciego); ale intuicyjnie powinieneś wiedzieć, że dwa zagnieżdżone dla pętli to O (N ^ 2); sortowanie porównawcze jest w najlepszym wypadku O (N lg N), wyszukiwanie binarne to O (lg N), można znaleźć medianę w O (N), dlaczego bazy danych na twardym dysku używają B-Drzewa itp.). Co najmniej dobra znajomość książki algorytmów pomoże Ci przeprowadzić asy techniczne wywiady programistyczne odmiany Google / Facebook. Czytając książki programistyczne, nie tylko przeglądaj / czytaj; ty'

Po przeczytaniu książki CS i algorytmów poleciłbym także książkę o inżynierii oprogramowania (Code Complete lub Pragmatic Programmer), która nauczy najlepszych praktyk pisania dobrego kodu, który można utrzymać (jasne nazwy; komentuj tylko w razie potrzeby ; trzymaj kod razem; refaktoryzuj w razie potrzeby; użyj kontroli wersji; itp.).


4
Najlepszy jak dotąd komentarz; podczas gdy widzę wielu ludzi mówiących, ćwiczyć, ćwiczyć, ćwiczyć, to nie jest właściwa droga. Mówi się, że praktyka czyni mistrza, ale tylko wymusza złe zachowania. Do PO: Odsłoń się do innych pojęć, dowiedz się, dlaczego preferowany jest Quicksort nad bąbelkowym. Tylko doskonała praktyka czyni mistrza. Zdobądź kurs CS.
Pieter B

2
Dziękuję za opublikowanie tego przykładowego kodu, już pomyślałem, że będę musiał to zrobić sam. - Możemy zbudować dowolny złożony obwód logiczny przy użyciu samych bramek NAND; mamy języki z bardzo kilkoma prostymi operacjami, które są kompletne w Turingu; nie potrzebujemy tych wymyślnych operatorów do rozwiązywania problemów. Rozwiązanie problemu to nie tylko znajomość odpowiednich narzędzi, umiejętność pracy nad problemem, wymyślenie rozwiązania, które działa na własną wiedzę, co czyni programistą.
poke

22

Ale wczoraj utknąłem w martwym punkcie, próbując znaleźć (nie Google) rozwiązanie dla testu FizzBuzz, ponieważ nie zapamiętałem metody if ($ n1% $ n2 == 0).

Nikt tego nie pamięta . Powinieneś sam to wymyślić. Jeśli znasz operatora modułu i wiesz, co on robi, to w trywialny sposób doskonale pasuje do problemu FizzBuzz.

Mam zamiar wyjść tutaj na całość i ogólnie sugeruję, że problemem jest PHP. Lubię powiedzieć, że Java jest najgorszym językiem, jaki kiedykolwiek zaprojektowano, a PHP jest najgorszym językiem , ponieważ nawet jego twórcy przyznają, że nigdy nie został zaprojektowany. Trudno jest nauczyć się dobrych praktyk inżynierii oprogramowania, gdy środowisko jest praktycznie definicją tego, jak tego nie robić. I w zależności od struktury, aby wszystko załatwić, niewiele mówi.

Obecnie spędzam wolny czas studiując Javę dla programistów (aby opanować język, o którym wszyscy mówią, że jest trudny / wymagający)

Java jest jednym z najłatwiejszych i najgorszych istniejących języków. Ma tylko jedno: ręczne dziedziczenie śmieci. Jeśli Twoi znajomi lub doradcy twierdzą, że Java jest trudna, znajdź nowych przyjaciół. C ++ to trudny język, który zawiera wiele pojęć i których nikt nie będzie kwestionował. Możesz także zrobić C #, który ma przynajmniej niektóre generyczne i lambdas.

Jak zamierzasz nauczyć się kodować, kiedy twoje języki zostały zaprojektowane i zaimplementowane przez ludzi, którzy nie potrafią kodować, a ty zależysz od ram dla wszystkiego, co robisz?


14
@ moraleida: Nie ma wstydu patrząc na składnię operatora, którego nie miałeś powodu używać.
DeadMG,

2
@moraleida: w takim przypadku zgadzam się, że nie ma prawdziwego problemu. Nie sądzę, aby jakikolwiek profesjonalista, ankieter lub coś innego, nie powinien mieć nic przeciwko, jeśli nie możesz wskazać dokładnej składni dla innego języka, o ile możesz jasno wyrazić swoje zamiary.
haylem

5
Zgadzam się w większości punktów, ale dlaczego uważasz Javę za „najgorszy język, jaki kiedykolwiek zaprojektowano”? Nie jestem wielkim fanem Javy, ale brzmi to bardzo pozytywnie.
Casey Kuball

7
-1 za użycie pytania jako pretekstu do podkręcania PHP, gdy ma zerowy związek z tym, o co pytano.
StasM

1
@Darthfett: Mógłbym napisać esej na ten temat. Przyjdź na czat SO C ++ i możesz go przeczytać: P
DeadMG

11

Myślę, że musisz rzucić okiem na powód, dla którego utknąłeś w obliczu FizzBuzz. Przypuśćmy, że pamiętasz, że istnieje operator, który $npowiedział ci, czy można go podzielić przez liczbę. I masz pecha, aby zapomnieć, co to jest. Dobrze, dlaczego nie spróbujesz tego zrobić w inny sposób? Jeśli wiesz coś o kodzie, powinieneś być w stanie znaleźć tuzin innych sposobów na zrobienie tego. Niektóre z nich mogą wyglądać dziwnie - na przykład umieszczanie każdej wielokrotności 5 w tablicy, a następnie sprawdzanie, czy $njest wśród nich - i jest to złe rozwiązanie, ale nadal byłoby rozwiązaniem. Mówisz jednak, że nie masz, po prostu utknąłeś. Może to być objaw większego problemu.

W programowaniu musisz nauczyć się dwóch rzeczy.

  1. Torba sztuczek. Jak czytać plik w PHP, jak analizować XML w Javie, jak połączyć się z bazą danych w Pythonie. Niektórzy zapamiętują to, ale w rzeczywistości te rzeczy są warte zapamiętania tylko wtedy, gdy używasz ich codziennie. W przeciwnym razie po prostu przejdziesz do dokumentów i przejrzysz. Te rzeczy nie mają żadnej substancji poza ich dosłowną formą - wystarczy wiedzieć, jak brzmi konkretna magiczna inkantacja i jaki będzie wynik.
  2. Sposób myślenia To jest najważniejsze. Tak programujesz, a to nie ma nic wspólnego z zapamiętywaniem. Musisz zrozumieć, jak wyjaśnić komputerowi, co chcesz zrobić, jakie są sposoby jego wykonania i które z nich użyć w konkretnym przypadku. Teraz, biorąc pod uwagę nowoczesne narzędzia i nowoczesną dokumentację, prawdopodobne jest, że można napisać cały CMS w PHP przy użyciu podejścia „worek sztuczek”, ale gdy napotkasz zadanie, które nie ma gotowego rozwiązania, „utkniesz”.

Z twojego opisu wygląda tak, jakbyś zaczął od pierwszej części, ale trochę jej brakuje w drugiej części. Dobry kurs CS zwykle bardzo w tym pomaga, ale nie jest to jedyny sposób. Próbując rozwiązać różne problemy i poczytać o tym, jak problemy te należy rozwiązać, czytając cytowane tutaj podstawowe książki - wszystko to by pomogło. Po ustaleniu sposobu myślenia programisty odkryjesz, że korzystanie z nowej torby sztuczek nie będzie stanowić większego problemu. Oczywiście musisz tu i tam google, ale nigdy nie będziesz osierocony.


1
„I poczytaj o tym, jak należy rozwiązać te problemy” - w rzeczywistości spójrz na różne rozwiązania tego samego problemu. Staraj się zrozumieć każdego z nich, porównaj to, co ich łączy i co robią inaczej. Zrozum te rzeczy, a automatycznie wybierzesz różne sposoby myślenia o tym samym problemie.
worku

Zgodziłbym się całkowicie co do sposobu myślenia. Po zrozumieniu sposobu myślenia i pojęć nauka podstawowych konstruktów językowych jest znacznie łatwiejsza i oczywiście zaczniesz myśleć o alternatywnych sposobach robienia rzeczy. (Jak fizzbuzz, wszystkie liczby podzielna przez 5 kończy się w 5 lub 0, to nie ma potrzeby operandu modułu na tej części)
JohnP

9

Jesteś dobry w rozwoju tak, jak jesteś dobry w czymkolwiek innym: ćwicz. W świecie programowania istnieje dobra koncepcja o nazwie kata kodu . Jest to w zasadzie ćwiczenie polegające na kodowaniu rozwiązania stosunkowo niewielkiego problemu, analizowaniu tego, co jest dobre, a co złe, wycinaniu wszystkiego i robieniu tego ponownie. FizBuzz jest kata sama w sobie. Zrób to i zrób więcej. Kiedy znajdziesz rzeczy, które wydają się niezbyt dobre lub po prostu nie działają, przeprowadź badania i bądź dogłębny. Zadawaj pytania na stronach z pytaniami i odpowiedziami, czytaj artykuły i blogi, zobacz, jak radzą sobie z tym inni, a następnie ćwicz to, czego się nauczyłeś.

Podczas wykonywania tej praktyki dowiesz się, ile dodatkowego matematycznego / teoretycznego zaplecza możesz potrzebować. Jeśli natkniesz się na koncepcje, których po prostu nie możesz owijać w głowę, przeczytaj o nich i ich niezbędnej wiedzy i zdecyduj na podstawie indywidualnych przypadków, czy chcesz wziąć udział w kursie lub co masz, aby rozwinąć swoją podłoże teoretyczne.


1
Ta kata kodu też wydaje się niesamowita!
moraleida

8

... ponieważ nie zapamiętałem metody if ($ n1% $ n2 == 0).

Rozumiem, że to znaczy, że nie wiedziałeś i / lub nie pamiętasz operatora modułu. W takim przypadku zacznij od sprawdzenia konstrukcji języka w języku, którego używasz. Przejrzyj wszystko, czego nie znasz „zimnem”, i naucz się wszystkiego, czego po prostu nie znasz.


4
+1. Podczas gdy inne odpowiedzi mówią o tym, jak zostać lepszym rzemieślnikiem, być może jeszcze ważniejsze jest wiedzieć, które narzędzia faktycznie istnieją. Czy próbowałeś kiedyś usunąć zepsutą śrubę bez łatwego wyjmowania ? Istnieją inne sposoby, aby to zrobić, ale jest to gafa na czole, gdy w końcu poznasz narzędzie, które jest do tego stworzone. Powiedziałbym, że OP powinien już dawno przejrzeć dowolną listę operatorów PHP i bawić się z tymi, którzy byli nieznani.
Tim Lehner,

5

Kontynuuj kodowanie, kontynuuj naukę. W końcu, przy wystarczającym zaangażowaniu, spojrzysz na FizzBuzz i zastanawiasz się, dlaczego w ogóle o tym pomyślałeś. Wiele firm zadaje pytanie w stylu FizzBuzz jako bardzo wczesna część swoich wywiadów, więc niepowodzenie tego razu oznacza, że ​​przynajmniej dowiedziałeś się czegoś o procesie rekrutacji.

Po prostu pisz kod, wymyślaj pomysły na projekty i badaj.


4

Czy mogę polecić naukę JavaScript przed Java, C ++? Powody dla ciebie:

  1. Używany w projektowaniu front-end (jQuery, niektóre wtyczki WordPress, kanały na Twitterze, ładowanie baz danych do przeglądarki za pomocą JSON przy niewielkiej lub żadnej pracy back-end, sprawdzanie poprawności formularza itp.)
  2. Może być używany po stronie serwera przez Node.js
  3. Może być używany do tworzenia aplikacji hybrydowych na iOS, Android, Win8 itp
  4. Studiowanie JS pomoże ci lepiej zrozumieć wydajność stron w różnych przeglądarkach i urządzeniach
  5. JS został zaprojektowany tak, aby był bardziej przyjazny dla początkujących
  6. Znasz już HTML i CSS (mam nadzieję;), więc to pomaga w JS

Darmowe zasoby dla początkujących

http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info
Miałem około 10 dodatkowych linków, ale SE nie pozwoli mi ich opublikować, dopóki nie trafię 10 powtórzeń.

Nauka C ++, Java itp. Są również pomocne, ale nie IMHO nie ma tak dużego wpływu na programowanie sieciowe, jak JS, ponieważ można go używać zarówno na froncie, jak i na zapleczu. Baw się dobrze!



1
a kiedy będziesz gotowy na znalezienie pracy: jobety.com
imns

3

Możesz znaleźć i pomóc innym, np. Podając kod (ujawnienie: moja strona) lub Code for America lub cokolwiek innego. Jest to doskonały sposób, aby uzyskać większą ekspozycję na problemy z tworzeniem stron internetowych innych niż PHP i czuć się dobrze.

Gdy masz problem do rozwiązania - lub pomóc rozwiązać, lub po prostu zrozumieć - odebranie kodu przychodzi naturalnie po drodze. Osiągnięcie celu jest najlepszym sposobem na naukę czegoś.


1
Niesamowite! To naprawdę fajny sposób na naukę!
moraleida

0

Więc nie można rozwiązać problemu FizzBuzz. Wielka rzecz. Teraz możesz i założę się, że nigdy nie zapomnisz wszystkich niezliczonych sposobów. Staraj się nie być tak chętnym do oznakowania się złym programistą tylko dlatego, że nie możesz rozwiązać jednego głupiego problemu z głowy.

To jeden problem. Po drugie, wydaje się, że czujesz się trochę za krzywą uczenia się programowania. Jak powiedzieli inni, kontynuuj kodowanie i czytaj dalej. Im więcej robisz, tym lepiej. To takie proste. Zacznij od tego, co uważasz za największą dziurę w tle, i stamtąd.


(To miało zabrzmieć podnosząco na duchu. Nie jestem pewien, czy mi się tam udało. Lol.)
Nick Spreitzer

0

Nie sądzę, żebym odmówił polecenia kogoś do wynajęcia, ponieważ nie wiedzieli, że to operator modułu, pod warunkiem, że:

  1. Wiedzieli, że to jakiś operator.
  2. Mogli mi powiedzieć, czym był „moduł”, gdy ich o to poprosiłem.

Nie zawsze (choć zwykle)%, a niektóre języki są dziwne. I do diabła, po dekadzie nie mogę szczerze powiedzieć, że znam wszystkich operatorów Perla (i co jeszcze robi statek kosmiczny?), Ani też nie zawsze pamiętam doskonale operatorów bitowych. Minęło kilka lat, odkąd zrobiłem coś, co nawet wymagałoby tego.

Może wahałbym się polecić komuś, kto spowodowałby atak paniki z powodu pominięcia tego pytania / testu. Mogłoby to sprawiać wrażenie, że były trochę zbyt zielone (chyba że była to pozycja bardzo na poziomie podstawowym). Nikt nie potrzebuje kogoś, kto (lub czuje potrzebę) zapamiętania tych rzeczy. Potrzebujesz kogoś, kto rozumie znacznie szersze pojęcia. Nikogo to nie obchodzi, jeśli spojrzysz na to w Google, ale musisz być pewny w wywiadzie, że znajomość% nie była niczym wielkim, a także, że wiesz, jak używać operatora jako słowa kluczowego, gdy robisz szybkie google Szukaj.

Jest to także pomysł ... ale jeśli lokalna uczelnia ma program compsci, wszystkie inne kredyty zostaną przeniesione i prawdopodobnie potrzebujesz tylko około 20 punktów na 2-letni dyplom. Mogłoby to prawie zakończyć w semestrze. Poprowadzą cię przez kurs struktur danych, mam nadzieję, że algorytmy ... mogą cię wzmocnić.


-1

Oto przykładowy kurs: http://www.ox.ac.uk/admissions/undergraduate_courses/courses/computer_science/computer_science_.html

Proponuję przeczytać najpierw: Programowanie obiektowe (bardzo powszechne, używane wszędzie, tutaj pojawia się Java) Współbieżność (pisanie programów Java, które nie ulegają tajemniczym awariom w prawdziwym świecie, poznanie impasu) Pojęcia dotyczące baz danych (większość aplikacji musi zapisywać dane, teoria jest tutaj ważna). Paradygmaty programowania (przeczytaj o co najmniej jednym języku non-ups, najlepiej funkcjonalnym, aby rozwinąć swoje myślenie i nauczyć się nowych rzeczy)

Kiedy patrzę na 4 lata edukacji informatycznej, szczerze mówiąc, myślę, że jest tylko kilka kursów, które należy wziąć na poważnie.

Struktury danych i algorytmy (a tutaj potrzebujesz matematyki, aby być naprawdę dobrym i być traktowanym poważnie przez innych programistów), najważniejsze są sieci komputerowe i systemy operacyjne. Inne tematy, które dotyczą kodu niższego poziomu, takie jak możliwość kodowania w asemblerze, prawdopodobnie nie są dla ciebie tak ważne. Inżynieria oprogramowania i testowanie narażają Cię na przydatne koncepcje, które możesz wykorzystać z czasem.

Wystarczy pobrać pdf, który wyjaśnia te pojęcia w intuicyjny sposób, a będziesz na dobrej drodze.

Na niektórych kursach informatycznych, przynajmniej w moim, pierwszy rok jest wstępem do wszystkich dziedzin inżynierii, takich jak mechanika, elektrotechnika, inżynieria lądowa itp. Jest wiele skomplikowanych obliczeń matematycznych, pamiętajcie, które znowu mogą, ale nie muszą być istotne dla większości programistów aplikacji dzisiaj. Tak więc wielu inżynierów dzisiaj ma zaledwie 3 lata prawdziwej edukacji informatycznej (Mam nadzieję, że dzięki temu poczujesz się lepiej :)

Sedno odpowiedzi: codziennie możesz poświęcić trochę czasu na naukę, powiedzmy godzinę, i z czasem stać się całkiem dobrym programistą. Po prostu kontynuuj naukę. I pamiętaj, aby codziennie pisać kod.


-3

Dla mnie moja strategia polega na tym, że atakuję tylko problem związany z tym, co pracuję, więc radzę, abyś nie musiał się wszystkiego uczyć, po prostu przeczytaj te rzeczy, które są istotne dla tego, nad czym pracujesz, ponieważ jeśli spróbujesz nauczyć się tego wszystkiego naraz, wtedy masz tendencję do prostaty i w końcu nienawidzisz programowania.

Pokój

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.