Jak mogę nauczyć jasną osobę, bez doświadczenia w programowaniu, jak programować? [Zamknięte]

100

Poproszono mnie o zatrudnienie osoby w naszym dziale IT, która nie ma doświadczenia w programowaniu, ale jest inteligentną i zdolną osobą i pomaga mu przejść do programowania w, powiedzmy, początkującym programistą obsługującym istniejące aplikacje .Net. Zdecydowanie wierzę, że ta osoba może to zrobić, ale szukam najszybszego sposobu, aby przyspieszyć. Mam mnóstwo pomysłów, ale chciałem zobaczyć, co myślą inni ludzie. Wiem, że będzie to również bardzo zależało od tego, jak się uczy, ale ogólnie mówię.

Więc pytanie: Jakie są najlepsze sposoby na szybkie przyspieszenie rozwoju oprogramowania przez programistę (w tym przypadku .Net)?

Richard Fantozzi
źródło
1
Być może powiązane pytanie: programmers.stackexchange.com/questions/10930/… : D
jmservera
Słyszałem, że nauka języka Python The Hard Way jest dobra dla początkujących programistów.
john2x
Spójrz na Small Basic . Jest to proste, ale przydatne dla początkujących.
3
Myślę, że wyjaśnienie programowania komuś, kto nie ma mentalnego modelu czegokolwiek, o czym mówisz, jest bezużyteczne. Dowiedz się, w jakim języku będziesz rozmawiać, i poproś, aby uderzyli w samouczki i pobrudzili ręce, a następnie wyjaśnili. Będą się zmagać, a ty wpadniesz i przyspieszysz proces uczenia się.
The Muffin Man
1
Poprosiłbym go, żeby przeczytał artykuł Edgsera Dijkstry | O okrucieństwie naprawdę nauczania informatyki | poproś go, aby dowiedział się o przyczynie tego artykułu, aby był ostrożny wobec możliwego uszkodzenia mózgu, które może zostać mu wyrządzone przez ogólnie przyjętą sposoby nauczania programowania
vfclists

Odpowiedzi:

125

Zazwyczaj przepisuję tę samą sekwencję każdemu, kto chce nauczyć się programowania. Jest to bardzo teoretyczne, ale stanowi dobry fundament. Studia stacjonarne powinny zająć trzy lub cztery miesiące, ale programowanie nie jest czymś, czego uczysz się z dnia na dzień.

Jeśli nie uda ci się przejść przez tę sekwencję, nie będziesz mógł programować, więc równie dobrze możesz się teraz poddać.

  1. Kod, Charles Petzold.
  2. Język programowania C, K&R
  3. Struktura i interpretacja programów komputerowych, Abelson i Sussman.

Moją zasadą jest: przejrzyj te trzy książki siłą, jeśli to konieczne. Zadawaj dowolne pytania, ale dopiero po tym, jak starasz się je rozwiązać samodzielnie. Jeśli dasz radę przejść przez te trzy książki, gratulacje, jesteś programistą, teraz mogę rzucić PERLĘ W 15 MINUT lub cokolwiek na śmieci w księgarni w Wielkiej Bibliotece Jawy i poradzisz sobie dobrze. Jeśli nie zdołasz przejść przez te trzy książki, poddaj się, idź do domu, nigdy tego nie dostaniesz.

Szczerze mówiąc, nie sądzę, że musisz uczyć się C i Schematu. Są tylko podstawą do przyszłej nauki. Te dwie dość proste książki są pozornie bardzo proste (C i Schemat są bardzo łatwymi językami), ale bardzo zagłębiają się w prawdziwą sztukę programowania bez marnowania czasu na mylącą składnię, więc doskonale nadają się do ponownego łączenia twój mózg, aby być dobrym programistą.

Próby skorzystania ze skrótu i ​​przejścia bezpośrednio do nauki dokładnie tego, czego chcesz się teraz nauczyć (np. Zaczynając od C # i ASP.NET) są skazane na niepowodzenie.

Joel Spolsky
źródło
25
Jako ktoś, kto musiał walić głową w biurko nad „programistami”, którzy bardzo zalecili swoje umiejętności w języku C #, ale nie mógł robić prostych rzeczy, takich jak implementacja bardzo dobrze udokumentowanej klasy bazowej, znajdowanie przecieków pamięci w programach c i c ++, lub po prostu samodzielnie rozwiąż problem lub naucz się nowego pomysłu nawet w umiarkowanym tempie, zgadzam się. To nie jest elitarność; to zdrowy rozsądek. Jeśli nie jesteś w stanie opanować wskaźników i rekurencji, nigdy nie będziesz bardzo przydatny dla nikogo, kto potrzebuje programistów, którzy mogą samodzielnie rozwiązać problemy.
Jonathan Henson
53
Nie, to nie jedyny sposób na bycie dobrym programistą. Ale jeśli trzy książki są „zniechęcającą listą”, być może nie doceniasz tego, co robią programiści.
Joel Spolsky
32
Czasami jesteś tak niedostępny, Joel.
Robert S.
46
Przepraszam, gazety docierają do mojego prywatnego klubu kilka dni, ponieważ muszą je wyprasować lokaj, zanim będziemy mogli je zobaczyć.
Joel Spolsky
19
Niestety ta odpowiedź zawodzi up to speed quickly.
rlb.usa
30

Najlepszym sposobem na szybkie przyspieszenie nie-programisty jest zainspirowanie ich !

Aby odnieść sukces, kandydat musi być co najmniej ciekawy, jeśli nie pasjonujący się programowaniem (niezależnie od platformy).

Chociaż zgadzam się z Joelem w przypadku idealnego kandydata, staram się nie wpychać zbyt dużej ilości teorii w słaby umysł - to tylko ich zniechęci. Jeśli są natchnieni, ciekawi i miejmy nadzieję namiętni, będą chcieli zrozumieć teorię po zobaczeniu magii.

Całkowicie zgadzam się z @karudzo - samorealizacja i konstruktywna recenzja mogą być bardzo inspirujące.

jkoreska
źródło
29
„Jeśli chcesz zbudować statek, nie zbieraj ludzi, by zbierać drewno, nie przydzielaj im zadań i prac, ale raczej naucz ich tęsknić za nieskończonym bezkresem morza”. - Antoine de Saint-Exupery
Julien Chastang
Julien - miło! Dokładnie!
jkoreska
Całkowicie się z tobą zgadzam w tej sprawie! Byłem mentorem / korepetytorem dla wielu programistów, którzy nie mieli doświadczenia i czasami nie mieli pojęcia, że ​​zostaną programistami. Zrobiłem to po prostu prowadząc ich po drodze ... ich własna ciekawość i pasja doprowadziły ich do efektu końcowego. Gdyby nie mieli żadnego z tych dwóch atrybutów, nie sądzę, by mogli osiągnąć to, co osiągnęli. Pracuję ze zbyt wieloma programistami, którym brakuje jednego lub obu tych atrybutów i są w nim tylko dlatego, że jest dużo pracy ... to okropne!
Jeach
Zgadzam się. Wydaje mi się, że odpowiedź na pytanie dotyczące programowania jest bardzo dosłowna. Ludzie uczą się różnych rzeczy bez powodu. Ludzie uczą się programować w celu rozwiązywania problemów, pomagania ludziom i przekształcania pomysłów w coś prawdziwego. Po drodze spotkałem ludzi, którzy o tym zapomnieli, a kiedy odkryli to na nowo, odkryli swoją miłość do programowania. Kiedy naprawdę spodoba ci się coś, czego się nauczysz, znajdziesz sposoby na naukę i poprawisz się.
Luis Perez
12

Szukam najszybszego sposobu na przyspieszenie go.

Najszybszym sposobem może być poświęcenie mu czasu , choć może to zająć rok lub dwa.

Jasne, wydaje się łatwe nauczenie go prostego języka (C #, jeśli ma on robić rzeczy .NET), ale nauka języka nie jest nauką programowania.

Jeśli nigdy nie programował, to oprócz składni i biblioteki co najmniej jednego języka będzie musiał nauczyć się o tablicach, połączonych listach, modelu kompilacji dowolnego języka, którego się uczy, modularyzacji, zarządzaniu zasobami, paradygmatach, wzorach, Big- Notacja O ... - cała enchilada. Jest wiele rzeczy do przebrnięcia i większość z nas zajęła kilka lat, aby nauczyć się tych podstaw, a jeszcze więcej, aby stać się prawdziwym profesjonalnym programistą.

Istnieje materiał, który obejmuje wiele z tego (jak najnowsza książka Stroustrupa, która uczy programowania przy użyciu C ++, zamiast uczyć języka C ++), ale nie ma go zbyt wiele i nic, co obejmuje wszystko. Więc facet musi chcieć się uczyć i czytać dużo książek i artykułów.

Co do tego, jak to zrobić: nie mam gotowego programu nauczania do wklejenia tutaj. (Przepraszam.)
Zalecam jednak zacząć od nauczenia go jednego języka programowania, aby miał szansę dokonać szybkiego wstępnego postępu i uzyskać zachęcające wyniki. Istnieje wiele książek do nauczania takich języków, wybierz taki, który znasz. Jeśli książka zawiera wiele ćwiczeń i jest gotów je wykonać, przygotuj się na spędzenie dużo czasu, pomagając mu w tych ćwiczeniach. Jeśli książka nie ma (m) żadnych, zacznij wymyślać własne z dużym wyprzedzeniem, ale bądź przygotowany na dostosowanie ich do jego poziomu / szybkości zrozumienia.
Jeśli tym pierwszym językiem nie był ani C, ani C ++, IMO powinien nauczyć się jednego z nich. K&R jest do tego dobry, podobnie jak TCPL Stroustrupa lub, jeśli może (z twoją pomocą) poradzić sobie ze stromą krzywą uczenia się, Koenig / Moo. Powodem, dla którego polecam to, jest to, że gdy poznasz C lub (najlepiej IMO) C ++, stosunkowo łatwo jest pobrać dowolne z tych pochodnych C, takich jak C #, Java, ObjC ...

Co do reszty, zapewniaj mu ciągły strumień dobrych książek i artykułów. Nie sądzę, aby było to bardzo pomocne, jeśli zasugerujemy zbyt wiele z nich, ponieważ 1) musi pasować do kultury Twojej firmy i 2) musisz czuć się swobodnie, mówiąc mu, żeby się tego nauczył.

sbi
źródło
1
„podstawowy programista obsługujący istniejące aplikacje .Net” ... ”będzie musiał dowiedzieć się o tablicach, połączonych listach, modelu kompilacji dowolnego języka, którego się uczy, modularyzacji, zarządzaniu zasobami, paradygmatach, wzorcach, notacji bit-O„ Te wszyscy są „mili”, ale założę się, że spora część programistów, którzy napisali kod, nie ma tych umiejętności.
Kirk Broadhurst,
1
@KirkBroadhurst: Jeśli tak, to coś jest nie tak w Twojej firmie.
sbi
@sbi Myślę, że w wielu firmach znajdziesz coś złego. Firma OP sugeruje, aby nieprogramiści (ale jest on „mądrym facetem”!) Przenieść na stanowisko obsługujące aplikacje. Nie wiem, gdzie pan pracuje ... ale z mojego doświadczenia wynika, że jest „prawdziwy świat”. Naprawdę dobrzy, kompetentni programiści są wyjątkiem - tak jak w większości branż, większość ludzi robi tak dobrze, aby sobie z tym poradzić.
Kirk Broadhurst,
1
@KirkBroadhurst: Moja praca to moja decyzja. Uciekałem przed firmami za niekompetencję i uciekłbym, gdyby żaden z programistów nie wiedział o co najmniej większości z tych rzeczy.
sbi
7

Nie uruchomiłbym ich w .NET. Popełniłem ten błąd zbyt wiele razy. Nie pozwól, aby pracodawca naciskał na ciebie, aby stworzyć niekompetentnego programistę z powodu czasu. .NET może być szybką platformą programistyczną, ale nie zmusza programistów do nauki programowania. W samym C # znajdziesz programistę, który utknął w typach referencyjnych, czasie życia obiektu, pozostawi ogromne wycieki pamięci (tak jest możliwe w .NET) i będzie miał kiepskie projekty. Byłoby znacznie lepiej uruchomić je na C lub C ++ (prawdopodobnie c ++, ponieważ będą musiały używać koncepcji OOP), a następnie powiedzieć coś w stylu: „Czy nie byłoby miło, gdyby twoja pamięć była dla ciebie zarządzana, wszystko było przedmiotem zorientowany i nie musiałeś sobie radzić z tymi wszystkimi paskudnymi wskazówkami? Oto C # i JAVA. Jeśli opanowali język c ++, pokonają oba za tydzień lub dwa. Polecam pułk Joela. To była lista, którą dostałem od mojego nauczyciela CS 101, i byłem znacznie lepszy, kiedy trafiłem na analizę numeryczną. Pozwoli ci to również dowiedzieć się wcześniej, czy kandydat pokroi musztardę, czy nie. Ponadto, gdy zdobędziesz c i c ++, automatycznie zrozumiesz c # i java po przeczytaniu wstępu do książek. Nie tylko je zrozumiesz, ale zrozumiesz je lepiej niż ktoś, kto nie znał C i C ++.

Jonathan Henson
źródło
4
„„ Czy nie byłoby miło, gdyby twoja pamięć była dla ciebie zarządzana, wszystko było zorientowane obiektowo i nie musiałeś radzić sobie z tymi wszystkimi nieprzyjemnymi wskazówkami? ”Masz na myśli Oto STL. Czekaj, co Dlaczego od początku nie
nauczyłeś
Cóż, STL jest słodki. Odnoszę się bardziej do interfejsu API systemu Windows, jeśli chodzi o programowanie w systemie Windows. Windows API nie jest zaprojektowany z myślą o OOP. Uważam, że to świetne ćwiczenie, aby jakiś słaby facet napisał aplikację przy użyciu interfejsu API w c ++. Następnie każę mu napisać klasę Window i enkapsulować pętlę zdarzeń, więc ... no wiesz, zorientuj obiektowo. Potem, kiedy wreszcie działają, pokazuję im formularze Windows. To naprawdę zmusza ich do radzenia sobie z podstawowymi pojęciami - tj. Działaniem aplikacji Windows - których nikt nigdy nie dostałby, gdyby tylko wskoczył do .NET.
Jonathan Henson
4
dlaczego ktokolwiek miałby dotykać interfejsu Windows API kijem. Mówiłem o hWNDlatach 80., prawda? Najwyraźniej używasz zamiast tego jakiejś ładnej abstrakcji (która to jest zupełnie inna debata). Pewnie wiedza, jak to działa pod maską, jest dobra, ale nie potrzebujesz C # .NET do abstrakcji
Raynos
2
Windows API jest niesamowity. W każdym razie używam go tylko jako narzędzia dydaktycznego. Na przykład ludzie zwykle nie rozumieją, jak zdarzenia są magicznie uruchamiane w programach Windows. Pomocne jest wygłupianie się w pętli zdarzeń. Ponadto programiści muszą przynajmniej znać hWND, szczególnie jeśli będą mieli do czynienia z apami, które wygłupiają się z grafiką - tak jak ciężko będzie ci robić cokolwiek w Uniksie, nie wiedząc, jak używać XID. W każdym razie zmusza ich to do nauki działania programu Windows. Ponadto, gdy skończą, wiedzą, jak działa Windows.Forms.
Jonathan Henson
Nie musi to być przejście do C # btw, tylko ogólnie .NET. Myślę, że @Joel ma dobry artykuł na temat prawa nieszczelnych abstrakcji, wyjaśniający, dlaczego często dobrze jest, aby programiści zaglądali pod maską przed użyciem frameworka.
Jonathan Henson
6

Daj im coś prostego, ale przydatnego do rozwiązania. Pozwól im trochę pogrzebać i pomóż im je wypolerować. Nie ma nic takiego jak małe osiągnięcie, które mogłoby je pobudzić (chociaż ktoś nie jest zainteresowany programowaniem w

jschorr
źródło
6

Programowanie w parach. Pozwól im śledzić Cię podczas pisania własnego kodu - dowolnego kodu. W ciągu kilku godzin poproś, aby wprowadzili dla Ciebie Twój kod, a Ty powiesz im, co mają robić, naciskając kolejno klawisze, nawet jeśli to konieczne. Odpowiedz na kilka ich pytań, ale nie na tyle, żebyś znacznie zwolnił - po prostu pozwól im się wsiąknąć. Znajdą też twoje literówki i więcej błędów, niż myślisz. W ciągu kilku dni będą mogli rozpocząć „nawigację” i powiedzieć ci, jaki kod wprowadzić dla zadań podobnych do tych, które widzieli wcześniej.

W ciągu miesiąca nauczyłem się wiele z tego, co wiem jako programista, i nauczyłem w ten sposób kilku innych nowych programistów, z których jeden mógł po kilku miesiącach przejąć funkcję głównego programisty w startupie. Kiedy zaczęliśmy razem pracować, nigdy nie napisał ani jednego wiersza kodu.

ślad
źródło
1
Myślę, że programowanie w parach to naprawdę świetny sposób na nauczenie początkujących programistów, ale myślę, że programowanie w parach przez cały czas może być problematyczne. Myślę, że początkujący programiści potrzebują trochę czasu, pracując samotnie, aby nauczyć się rozwiązywać problemy i budować zaufanie do swoich umiejętności.
Helephant
Tak, przygotuj ich do programowania w parach i podaj proste zadania - prawdziwe zadania, na oprogramowaniu, nad którym mają pracować, w języku, w którym mają pracować, z prawdziwym osiągnięciem. Oceń i mentor wszystkie swoje prace i będą rozwijać.
Thomas W
2

Daj mu dobry ide (studia wizualne, ekspres jest nadal dobry). Naucz go 60% typowej składni (pomiń wydajność, linq, wyliczenia, atrybuty itp., Ucz klas, wirtualny i zastępuj). Poświęć czas na debugger (szczególnie callstack). Następnie powiedz mu, aby google „msdn functionanme” za każdym razem, gdy potrzebuje pomocy, co powinno mu pomóc w szybkim uruchomieniu.

Naucz go również, aby nigdy nie łapał i nie połykał wyjątku. Powiedz mu, że musi go ponownie rzucić lub zalogować!

Bonus: naucz go serializować dane JSON, aby mógł łatwo czytać / zapisywać w pliku. Db jest nadmiaru i zbyt wiele do nauczenia się i nie chcesz, aby pisał niestandardowe formaty plików, chociaż mogę pozwolić jednemu wpisowi na typ pliku przejść, aby zapisać / załadować tablicę ciągów jako akceptowalną.


źródło
1

Wiem, że wiele osób mówi o językach i książkach dla tych języków. Ja się różnię

Programowanie polega na nauce analitycznego myślenia. Przede wszystkim osoba powinna być w stanie pomyśleć i wymyślić algo na kartce papieru, na czym polega problem. Musisz ich poprowadzić, aby otrzymali właściwą technikę myślenia.

Dalej są podstawy języka. Zacznij je od wybranego języka. Daj problem do zaprogramowania.

Po zakończeniu pierwszego cięcia poproś, aby wykonali podstawy CS i wzorce projektowe.

Teraz poproś, aby przeprogramowali wcześniejszy problem z tymi nowymi koncepcjami.

Koczownik
źródło
1

Zacznij od podstaw: zmiennych, pętli, podczas gdy pętle, dla pętli, tablic, naucz go podstaw, drukowania na ekranie, robienia prostej matematyki. Przejdź do metod i podstawowego OOP, na przykład jak stworzyć klasę, pokaż mu, dlaczego nie tylko jak.

Język nie ma znaczenia, ale wybierz coś, co wiesz, a to jest wysoce abstrakcyjne (java, python itp.), Dzięki czemu nie musi się martwić o takie rzeczy, jak zarządzanie pamięcią, wskaźniki itp. Naucz się podstaw rekurencja, wieże hanio lub rekursywnie przeszukujące katalogi.

Naucz się programować to dobry darmowy zasób dotyczący programowania w Ruby. Spraw, by było to przyjemne, łatwe i zabawne.

Snow_Mac
źródło
1

Daj mu kilka wyzwań i pozwól mu nauczyć się, jak znaleźć zasoby, aby sam rozwiązać problem.

Jeśli nauczysz go, jak znaleźć odpowiedzi i będzie samowystarczalny, w naturalny sposób nauczy się, jak dobrze programować. Krytyczne myślenie i zaradność to dwie kluczowe umiejętności programisty.

Ostatecznie pasja / zainteresowanie z pewnością będzie kluczowym czynnikiem, który odniesie sukces w szybkim nauce. Jeśli nie ma lub nie złapie „błędu”, może to być powolny i / lub bolesny proces. Jeśli złapie błąd, będzie spóźniał się z kodowaniem, poza godzinami pracy, mając czas swojego życia.

Andy Fleming
źródło