Лучшие способы научить новичка программировать? [закрыто]


324

Оригинальный вопрос

В настоящее время я занимаюсь обучением моего брата программированию. Он абсолютный новичок, но очень умный. (И он действительно хочет учиться). Я заметил, что некоторые из наших сессий увязли в мелких деталях, и я не чувствую, что был очень организован. ( Но ответы на этот пост очень помогли. )

Что я могу сделать лучше, чтобы научить его эффективно? Есть ли логический порядок, который я могу использовать для прохождения концепции по концепции? Есть ли сложности, которых я должен избежать до позже?

Мы работаем с Python , но совет на любом языке приветствуется.


Как помочь

Если у вас есть хорошие, пожалуйста, добавьте следующее в свой ответ:

  • Упражнения для начинающих и идеи проекта
  • Ресурсы для обучения начинающих
  • Скринкасты / посты в блогах / бесплатные электронные книги
  • Печать книг, которые хороши для начинающих

Пожалуйста, опишите ресурс со ссылкой на него, чтобы я мог посмотреть. Я хочу, чтобы все знали, что я определенно использовал некоторые из этих идей. Ваши материалы будут собраны в этом посте.


Интернет-ресурсы для обучения начинающих:


Рекомендуем распечатать книги для обучения начинающих


Я не понимаю, почему это должно быть закрыто. По крайней мере 295 пользователей нашли этот вопрос (и 92 ответа) достаточно полезным, чтобы проголосовать за него, а 290 считают его одним из своих фаворитов. Вопрос привел к очень полезной совокупности учебных ресурсов. На самом деле это не привело к «аргументам» или «спорам», но действительно много полезных советов о том, как решить один из трудных «человеческих факторов» в программировании. Я думаю, что закрытие такого вопроса является драконовским и вредным для сообщества StackOverflow.
Джастин Стандарт

@JustinStandard Рассматривали ли вы преобразование ваших правок в несколько ответов на комментарии? Например, здесь , здесь и здесь
Джейсон Планк

Ответы:


118

Мне приходилось работать с несколькими начинающими (никогда не писавшими кода) программистами, и этой осенью я буду проводить внеклассный семинар со школьниками. Это самое близкое, что у меня есть к документации. Это все еще в стадии разработки, но я надеюсь, что это поможет.

1) FizzBuzz. Начните с программ командной строки. Вы можете очень быстро написать несколько забавных игр или инструментов, и вы очень быстро освоите все языковые функции, не изучая сначала инструменты GUI. Эти ранние приложения должны быть достаточно простыми, чтобы вам не понадобилось использовать какие-либо реальные средства отладки, чтобы заставить их работать.

Если ничего другого, как FizzBuzz, это хорошие проекты. Ваши первые несколько приложений не должны иметь дело с БД, файловой системой, конфигурацией и т. Д. Это понятия, которые просто сбивают с толку большинство людей, и когда вы только изучаете синтаксис и базовые функции инфраструктуры, вам действительно не нужно больше усложнять.

Некоторые проекты:

  • Привет мир!
  • Возьмите год моего рождения и посчитайте мой возраст (только (сейчас - тогда) без месячных поправок). (простая математика, ввод, вывод)
  • Спросите направление (вверх, вниз, влево, вправо), затем сообщите пользователю его судьбу (упасть в яму, найти торт, т. Д.) (Булева логика)
  • FizzBuzz, но считай раз в секунду. (Циклы, таймеры и многое другое логика)
  • В зависимости от их возраста некоторым действительно нравится приложение, которое называет пользователей случайным оскорблением через некоторый интервал. (Циклы, массивы, таймеры и случайные, если вы сделаете интервал случайным)

2) Простой проект Как только они хорошо разбираются в языковых функциях, вы можете начать проект (простые, веселые игры работают хорошо.). Вы должны попытаться завершить первый проект в течение 6-12 часов. Не тратьте время на его разработку рано. Пусть они спроектируют это, даже если это отстой. Если он развалится, поговорите о том, что произошло и почему это не удалось, затем выберите другую тему и начните снова.

Здесь вы начинаете знакомиться с возможностями отладки ваших инструментов. Даже если вы можете увидеть проблему, прочитав код, вы должны научить их, как использовать инструменты, а затем показать им, как вы можете это увидеть. Это служит двойной цели: обучить инструментам отладки и научиться идентифицировать ошибки без инструментов.

Однажды или если проект станет функциональным, вы можете использовать его для внедрения инструментов рефакторинга. Хорошо, если вы сможете расширить проект с помощью простых функций, которые вы никогда не планировали. Обычно это означает рефакторинг и значительную отладку, поскольку очень немногие люди пишут даже наполовину приличный код в первый раз.

Некоторые проекты:

  • Игра палач
  • Экспериментируя с робототехникой ( Vex и Mindstorms являются опциями)

3) Реальный проект Начните реальный проект, который может занять некоторое время. Используйте надлежащий контроль источника и составьте план, чтобы составить расписание. Запустите этот проект, как настоящий проект, если не более того, это хороший опыт работы с инструментами.

Очевидно, вам нужно настроить это для каждого человека. Самая важная вещь, которую я нашел, - сделать так, чтобы даже первые простые приложения применялись к тому, что интересует человека.

Некоторые проекты:

  • Tetris
  • Механизм блогов на основе текстовых файлов
  • Более продвинутая работа робототехники

Это отличное руководство. Лично я не могу написать свой выход из бумажного пакета (я бы хотел, чтобы кто-то сделал это в реальной жизни, на самом деле), так что это выглядит как хорошее руководство для самообучения.
Keyofnight

Это очень хороший ответ. Мое единственное возражение состоит в том, что тетрис не является хорошим выбором для первой или второй игры. На этом уровне обнаружение столкновений может быть сложной проблемой - это здорово, если они могут ее решить.
phkahler

@phkahler Я понимаю вашу точку зрения, но я полагаю, что Tetris интересен, потому что существует множество реализаций OSS / demo, которые вы можете анализировать до и после написания своего кода.
Эрик Хаскинс

30

Вы можете попробовать использовать Алису . Это 3D-программа, предназначенная для использования в начальных классах программирования.

Два главных препятствия для начинающих программистов часто:

  • синтаксические ошибки
  • мотивация (писать что-то значимое и веселое, а не надуманное)

Алиса использует интерфейс перетаскивания для создания программ, избегая возможности синтаксических ошибок. Алиса позволяет вам создавать трехмерные миры и управлять своим кодом (простыми) трехмерными персонажами и анимацией, что обычно гораздо интереснее, чем реализация связанных списков.

Опытные программисты могут смотреть на Алису как на игрушку и смеяться над перетаскиванием строк кода, но исследования показывают, что этот подход работает.

Отказ от ответственности: я работал на Алису.


Я узнал об этом в последней лекции Рэнди Пауша. Причины этого проекта взорвали меня.
Джесвин Хосе

28

Я рекомендую Logo (он же черепаха), чтобы разобраться с основными понятиями. Он обеспечивает хорошую песочницу с немедленной графической обратной связью, и вы можете демонстрировать циклы, переменные, функции, условные выражения и т. Д. Эта страница предоставляет отличное руководство.

После логотипа перейдите на Python или Ruby. Я рекомендую Python, поскольку он основан на ABC, который был изобретен для обучения программированию.

При обучении программированию я должен поддержать предложение Э. Хаскинса о простых проектах, а затем о сложных проектах. Лучший способ учиться - начать с определенного результата и измеримой вехи. Это помогает сфокусировать уроки, позволяет ученику развить навыки, а затем развить их, и дает ученику что-то, чтобы похвастаться перед друзьями. Не стоит недооценивать силу того, что есть что показать для своей работы.

Теоретически вы можете придерживаться Python, так как Python может делать практически все. Это хороший инструмент для обучения объектно-ориентированному программированию и (большинству) алгоритмов. Вы можете запускать Python в интерактивном режиме, например, в командной строке, чтобы понять, как он работает, или запускать целые сценарии одновременно. Вы можете запускать интерпретируемые скрипты на лету или компилировать их в двоичные файлы. Существуют тысячи модулей для расширения функциональности. Вы можете сделать графический калькулятор, такой как в комплекте с Windows, или вы можете сделать IRC-клиент, или что-нибудь еще.

XKCD немного лучше описывает силу Python: "Ты летишь! Как?"  "Python!"

После этого вы можете перейти на C # или Java, хотя они не предлагают многого, чего у Python еще нет. Преимущество этого заключается в том, что они используют синтаксис в стиле C, который используют многие (я бы сказал, больше всего?) Языки. Вам не нужно беспокоиться об управлении памятью, но вы можете привыкнуть к тому, что у переводчика языка будет немного больше свободы и меньше усилий. Python применяет пробелы и отступы, что приятно в большинстве случаев, но не всегда. C # и Java позволяют вам управлять собственным пробелом, оставаясь строго типизированным.

Оттуда стандартом является C или C ++. Свобода в этих языках почти экзистенциальна. Теперь вы отвечаете за собственное управление памятью. Там нет сбора мусора, чтобы помочь вам. Здесь вы обучаете действительно продвинутым алгоритмам (таким как сортировка слиянием и быстрая сортировка). Здесь вы узнаете, почему «ошибка сегментации» является ругательством. Здесь вы скачиваете исходный код ядра Linux и смотрите в Бездну. Начните с написания кольцевого буфера и стека для работы со строками. Тогда поднимайся.


На самом деле, вы не полностью управляете памятью в C. У вас есть malloc и т. Д., И вы можете свободно управлять ею за вас. Вам просто нужно сообщить системе, когда вам нужно больше памяти и когда вы закончите с памятью, которую вы использовали.
комп

15

Хорошим курсом Python является MIT's A Gentle Введение в программирование с использованием Python . Это все бесплатно онлайн, и вам не нужно быть студентом MIT, чтобы понять это.

Редактировать [ Джастин Стандарт ]

Этот курс использует эту бесплатную онлайн-книгу: « Как думать, как ученый-компьютерщик».
Я определенно считаю ее весьма полезной.


12

Пакет Python VPython - 3D-программирование для обычных смертных ( видеоурок ).

Пример кода:

from visual import *

floor = box (pos=(0,0,0), length=4, height=0.5, width=4, color=color.blue)
ball = sphere (pos=(0,4,0), radius=1, color=color.red)
ball.velocity = vector(0,-1,0)
dt = 0.01

while 1:
    rate (100)
    ball.pos = ball.pos + ball.velocity*dt
    if ball.y < ball.radius:
        ball.velocity.y = -ball.velocity.y
    else:
        ball.velocity.y = ball.velocity.y - 9.8*dt

VPython прыгающий мяч http://vpython.org/bounce.gif


Хорошо только после того, как они изучили основные понятия. Создание визуальных эффектов - отличный способ мотивировать людей изучать программирование.
phkahler

12

Начните с графики черепахи в Python.

Я бы использовал графику черепахи, которая входит в стандартную комплектацию Python. Это наглядно, просто, и вы можете использовать эту среду для представления многих концепций программирования, таких как итерации и вызовы процедур, прежде чем углубляться в синтаксис. Рассмотрим следующий интерактивный сеанс в Python:

>>> from turtle import *
>>> setup()
>>> title("turtle test")
>>> clear()
>>>
>>> #DRAW A SQUARE
>>> down()        #pen down
>>> forward(50)   #move forward 50 units
>>> right(90)     #turn right 90 degrees
>>> forward(50)
>>> right(90)
>>> forward(50)
>>> right(90)
>>> forward(50)
>>>
>>> #INTRODUCE ITERATION TO SIMPLIFY SQUARE CODE
>>> clear()
>>> for i in range(4):
        forward(50)
        right(90)
>>>
>>> #INTRODUCE PROCEDURES   
>>> def square(length):
        down()
        for i in range(4):
            forward(length)
            right(90)
>>>
>>> #HAVE STUDENTS PREDICT WHAT THIS WILL DRAW
>>> for i in range(50):
        up()
        left(90)
        forward(25)
        square(i)
>>>
>>> #NOW HAVE THE STUDENTS WRITE CODE TO DRAW
>>> #A SQUARE 'TUNNEL' (I.E. CONCENTRIC SQUARES
>>> #GETTING SMALLER AND SMALLER).
>>>
>>> #AFTER THAT, MAKE THE TUNNEL ROTATE BY HAVING
>>> #EACH SUCCESSIVE SQUARE TILTED

Пытаясь выполнить два последних задания, у них будет много неудачных попыток, но неудачи будут визуально интересными, и они быстро научатся, пытаясь понять, почему это не нарисовало то, что они ожидали.



11

Главное, чтобы у данного человека была какая-то проблема, которую он хочет решить. Если у вас нет программы, которую вы хотите написать (и что-то разумное и четкое, а не «Я хочу написать следующий Quake!»), То вы не сможете научиться программировать, потому что вам нечем мотивировать , Я имею в виду, что вы могли бы читать книгу и иметь грубое понимание синтаксиса и семантики языка, но пока у вас нет программы, которую вы хотите написать, вы никогда не схватите крапиву.

Если этот импульс существует, то все остальное - лишь незначительные детали.


Я думаю, что лучший способ выучить любой технический предмет - это научиться решать небольшие, дополнительные проблемы.
cbednarski




5

Это фантастическая книга, которую мои младшие братья изучали:

http://pine.fm/LearnToProgram/

Конечно, самое главное - начать по-настоящему полезную программу НЕМЕДЛЕННО после окончания книги.


4

Если он заинтересован, разве мелкие детали не являются хорошими частями? Используя python, вы уже отключили GUI, чтобы избежать путаницы. Почему бы не выбрать проект, игру или что-то, и реализовать это. Классическая игра с угадыванием чисел hi-lo может быть просто реализована из командной строки в 20-30 строках кода (в зависимости от языка, конечно) и дает вам переменные, условия, циклы и ввод пользователя.



4

Я бы просто позволил ему написать тонны кода. Пусть он вбивает все, что вы, ребята, делаете, и просто готов ответить на вопросы.

Хотите верьте, хотите нет, но после нескольких месяцев написания тонны дрянного кода он начнет понимать и начинает писать лучшие программы. На этом этапе вы можете увязнуть в деталях (память и т. Д.), А также поговорить об общих принципах проектирования.

Я слышал, что то, что отличает великих художников от посредственных, состоит в том, что каждый раз, когда они практикуют, они что-то улучшают, независимо от того, насколько они малы. Позвольте вашему брату практиковаться, и он будет улучшаться каждый раз, когда садится за клавиатуру.

Редактировать: [Джастин Стандарт]

Esteban, это напоминает мне о недавнем кодировании поста ужаса , и я действительно думаю , что вы правы. Но я думаю, что все еще стоит найти методы, которыми он будет руководствоваться . Без сомнения, я хочу, чтобы он написал столько кода, сколько он знает, как это сделать. Вот одна из причин, почему я прошу примеры проектов.


Да, я знаю, о каком посте ты говоришь Джастин. Чтение этого напомнило мне, что большинство вещей, которые я изучил, пришли от попыток учиться на собственных ошибках. Я действительно не могу подчеркнуть важность обучения на практике!
Эстебан Арайя

2

Прежде всего, начните, как и все остальные: с программы Hello World . Это просто, и это дает им общее представление о макете программы. Попытайтесь вспомнить, когда вы впервые программировали, и насколько сложными были некоторые концепции - начните с простого.

После Hello World перейдите к созданию некоторых базовых переменных, арифметики, затем к логической логике и операторам if / else. Если у вас есть один из ваших старых учебников по программированию, посмотрите некоторые из ранних примеров и попросите его просмотреть их. Только не пытайтесь вводить слишком много всего сразу, иначе это будет ошеломляющим и запутанным.


2

То, о чем вы должны помнить при обучении своего брата программированию, - это чтобы он не слишком сильно на вас полагался. Часто, когда я помогаю другим, они начинают воспринимать меня как книгу ответов на все свои вопросы, и вместо того, чтобы экспериментировать, чтобы найти ответ, они просто спрашивают меня. Часто лучшим учителем являются эксперименты, и каждый раз у вашего брата возникает вопрос: «Что произойдет, если я добавлю 2 к строке?» Вы должны сказать ему, чтобы попробовать это и посмотреть на себя. Также я заметил, что когда я не могу донести концепцию до кого-то, это помогает увидеть некоторый пример кода, где мы можем посмотреть на каждый сегмент по отдельности и объяснить его по частям. Как примечание: люди, плохо знакомые с программированием, часто сталкиваются с проблемой объектно-ориентированного программирования


2

Я преподавал программирование, и у твоего брата есть одно главное преимущество перед большинством моих учеников, которым он хочет учиться :)

Если вы решите пойти с C, у друга есть сайт, на котором есть программы, используемые старшими поколениями, которые запоминаются как основные вводы. Более сложные из них используют ncurses, которые как бы отрицают их использование в качестве учебного пособия, но некоторые из них являются крошечными мелочами, и вы можете научиться многим без обучения.

Лично я думаю, что Python и Ruby будут отличными первыми языками.

РЕДАКТИРОВАТЬ: список заданий для начинающих программистов, появившихся в одночасье, может быть именно тем, что вы ищете.


2

Это действительно зависит от стиля обучения вашего брата. Многие люди учатся быстрее, пачкая руки и просто углубляясь в это, кристаллизуя концепции и общую картину по мере того, как они прогрессируют и наращивают свои знания.

Я предпочитаю начинать с общей картины и углубляться в мельчайшие подробности. Первое, что я хотел знать, было то, как все это объединяется, затем все эти объектно-ориентированные трюки, потом о классах, экземплярах и так далее. Мне нравится знать основные понятия и немного теории, прежде чем я изучу синтаксис. У меня было небольшое преимущество, потому что я написал несколько игр на бейсике 20 лет назад, но с тех пор ничего особенного.

Возможно, полезно замаскировать производственный процесс, начав с общей формулировки миссии, затем плана и / или блок-схемы, а затем углубившись в некоторый псевдокод (опираясь на синтаксис, который вы в конечном итоге будете использовать), прежде чем писать код.

Золотое правило здесь - выяснить стиль склонности вашего ученика.


2

Если у вашего брата есть доступ к iTunes, он может скачать видео-лекции вводного курса по информатике, прочитанного Ричардом Баклендом в Университете Нового Южного Уэльса. Он является привлекательным инструктором и охватывает основы вычислительной техники и языка Си. Если ничего другого, скажите своему брату сыграть видео на заднем плане, и некоторые концепции могут проникнуть через осмос. :)

COMP1917 Higher Computing - Session 1, 2008 г. http://deimos3.apple.com/WebObjects/Core.woa/Browse/unsw.edu.au.1504975442.01504975444

Если ссылка не работает, вот путь:

Главная -> iTunes U -> Разработка -> COMP1917 Higher Computing - 2008 Session 1


2

есть вики-книга, которая очень хороша для изучения питона .

Я не знаю, как вики-книги для других языков, но я лично выучил Python из вики-книги, как это было в феврале 2007 года.

ps - если вы не знакомы с вики-книгами , то это в основном версия авторской книги в википедии. это сложно описать, но если вы посмотрите несколько книг, вы увидите, как это работает.



2

Я думаю, что Python - отличная идея. Я бы дал ему несколько основных заданий, которые он мог бы выполнить сам, и сказал бы, что любые тупики, которые он ударит, могут быть устранены путём посещения Google. Для меня, по крайней мере, решение проблемы самостоятельно заставляло ее держаться лучше, чем кто-то, кто говорил мне решение.

Некоторые возможные проекты (без определенного порядка):

  • Монета флип-симулятор. Позвольте пользователю ввести желаемое количество испытаний для подбрасывания монеты. Выполните его и отобразите результаты вместе с процентом для головы или хвоста.

  • Сделайте преобразователь температуры с меню, которое принимает пользовательский ввод, чтобы выбрать, какой тип преобразования пользователь хочет сделать. После выбора преобразования и его выполнения он должен вернуться в главное меню.

    Вот пример расширенного конвертера с той же идеей: http://pastebin.org/6541

  • Создайте программу, которая принимает числовые данные и отображает буквенную оценку, в которую она будет переведена. В конечном итоге он оценивает входные данные по операторам if и elif, чтобы найти, где они подходят.

  • Сделайте простой тест, который проходит через несколько вариантов ответа или заполните пустые вопросы. В конце он покажет, как сделал пользователь. Он может выбрать любые вопросы, которые он хочет.

  • Возьмите ввод некоторого (предположительно большого) количества копеек и конвертируйте его в более крупные номиналы. Например, 149 копеек = 1 доллар, 1 квартал, 2 цента и 4 копейки.

  • Создайте простой менеджер списков. Иметь возможность добавлять / удалять списки и добавлять / удалять записи в этих списках. Вот пример менеджера новогодних списков: http://pastebin.org/6543

  • Создайте программу, которая будет создавать и затем проверять, образуют ли введенные числа магический квадрат (с двумерным массивом). Вот некоторый пример кода, но он должен действительно распечатывать квадрат на каждом шаге, чтобы показать, где находится пользователь с точки зрения создания квадрата: http://pastebin.org/6544

Я также предложил бы сделать кое-что с xTurtle или другим графическим модулем, чтобы все перемешать и не дать ему скучать. Конечно, это очень практическое программирование, а не сценарии, для которых многие люди действительно будут использовать python, но примеры, которые я привел, взяты непосредственно из того, когда я учился через python, и это отлично сработало для меня. Удачи!


2

Просто сделайте это весело!

Удивительно, что Scala может быть самым простым, если вы попробуете Kojo


2

Если вашему брату нравятся головоломки, я бы порекомендовал Python Challenge . Я бы не использовал его в качестве формального учебного пособия в уроке 1 на 1, но он может сделать это, когда вы не вместе, чтобы бросить вызов себе и повеселиться.



2

Пройдя несколько бесплатных электронных книг, я обнаружил, что лучшей книгой для обучения программированию была книга Head Head Programming, изданная O'Reily Press. Он использует Python в качестве языка и дает вам программы для работы с самого начала. Они все интереснее, чем «Hello World». Это хорошо стоит денег, которые я потратил на это, и, так как он вышел немного, возможно, вы сможете найти более дешевую использованную копию на Ebay или Amazon.


1

Если вы хотите обучить основам программирования, не привязываясь к конкретному языку, в MIT создано приложение Scratch . Он предназначен, чтобы помочь людям развить навыки программирования. По мере того, как пользователи создают проекты Scratch, они учатся создавать условия, циклы и т. Д. Существует также сообщество чистых проектов, определяющих, какие проекты можно загружать, - таким образом, вы можете исследовать программы других людей и видеть, как они создавались.


1

Я думаю, что когда у него есть основы (переменные, циклы и т. Д.), Вы должны попытаться помочь ему найти что-то конкретное, что его интересует, и помочь ему изучить все необходимое, чтобы это произошло. Я знаю, что я гораздо более склонен и мотивирован сделать что-то, если это мне интересно. Кроме того, не забудьте позволить ему бороться, хотя некоторые из более сложных проблем, нет ничего более удовлетворяющего, чем момент, когда вы решите это самостоятельно.


1

Меня учили, узнавая, как решать проблемы не зависящим от языка способом с использованием блок-схем и PDL (Program Design Language). Через пару недель я научился конвертировать написанные на языке PDL языки. Я рад, что научился так, потому что большую часть лет проводил за программированием, решая проблемы, не привязываясь к языку. Какой язык я использую, всегда был деталью реализации, а не частью дизайна.

Необходимость решить проблему, разбив ее на основные этапы, является ключевым навыком. Я думаю, что это одна из вещей, которая отделяет тех, кто может программировать, от тех, которые не могут.

Что касается того, как вы справляетесь с порядком понятий языка, я считаю, что самый простой способ - это решить, что нужно иметь в виду проект, и заняться понятиями по мере необходимости. Это позволяет вам применять их по мере необходимости к тому, что вас интересует. При изучении языка хорошо иметь в виду несколько простых проектов и несколько с прогрессивной сложностью. Выбор тех поможет вам наметить концепции, которые необходимы и их порядок.


1

Я бы порекомендовал также посмотреть некоторые скринкасты - они обычно создаются в контексте конкретной технологии, а не языка, хотя, если отображается код Python, это подойдет :). Суть в том, что они созданы хорошими программистами и смотрят, как хорошие программисты программируют. Вы и ваш брат могли бы также заняться программированием на равных, это может быть даже лучшей идеей. Только не забудьте объяснить, ПОЧЕМУ вы делаете что-то так, а не так. Я думаю, что лучший способ научиться программировать на хороших примерах и стараться даже не видеть плохих.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.