Учиться программированию: метод Франклина — статьи на Skillbox – Как научиться программированию с нуля? :: РБК Тренды

Содержание

Научиться программировать становится сложнее / Habr

Привет, Хабр! Представляю вашему вниманию перевод статьи Аллена Б. Дауни, автора таких книг как Think Python, Think Java, Think Bayes и других, опубликованной в личном блоге автора.

Я написал несколько книг, в которых c использованием языка программирования Python объясняются темы вроде Байесовской статистики и цифровой обработки сигналов. В дополнение к книгам читатели могут загрузить код с GitHub. Для того, чтобы использовать этот код, нужно знать некоторые основы Python. То есть, у читателей должен быть компьютер, на котором установлен интерпретатор этого языка и необходимые библиотеки, они должны знать, как загрузить код с GitHub, а еще они должны знать, как запустить код, который они загрузили.

Пытаясь проделать все это, многие читатели начинают испытывать трудности.

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

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

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

Фундаментальная проблема — барьер между использованием компьютера и написанием программ для него увеличивается.

Когда у меня появился Commodore 64 (кажется, в 1982 году), этого барьера не было. Когда вы включали компьютер, он запускал среду разработки. И чтобы сделать хоть что-нибудь, вам приходилось вводить как минимум одну строчку кода, даже если вы всего лишь хотели запустить другую программу.

С тех пор три вещи сделали путь от пользователя до программиста сложнее.

  1. Компьютеры перестали продаваться с предустановленными по умолчанию средами разработки. Теперь любому, кто хотел научиться программировать, приходилось сначала установить среду разработки. И это больший барьер, чем могло бы показаться. Многие пользователи вообще никогда ничего не устанавливали, не знали как это делать и могли не обладать необходимыми для этого правами. Сейчас устанавливать программы стало гораздо легче, чем это было раньше, но возможные ошибки при установке никуда не делись и это может доставлять пользователям серьезные неудобства. Если кто-то хочет научиться программировать, он не должен для этого предварительно изучать администрирование системы.
  2. Пользовательские интерфейсы сильно отошли от командной строки в сторону графических интерфейсов. Последними, как правило, проще пользоваться, но они не отображают информацию о том, что происходит в системе на самом деле. Когда пользователю не требуется знать все эти детали, в подобном поведении нет ничего страшного. Но проблема в том, что графические интерфейсы скрывают информацию, которую необходимо знать программистам. Поэтому когда пользователь начинает учиться программировать, он внезапно сталкивается с вещами, которые обычно от него скрыты. Если кто-то просто хочет научиться программировать, он не должен для этого изучать устройство операционных систем.
  3. Облачные технологии только осложняют ситуацию. Люди, использующие веб приложения, часто имеют очень смутное представление о том, где их данные хранятся и с помощью каких приложений они могут получить к ним доступ. Многие пользователи, особенно на мобильных девайсах, не видят различий между операционными системами, приложениями, веб-браузерами и веб-приложениями. Когда они загружают данные или отправляют их через интернет, они часто не до конца понимают, откуда именно эти данные поступают и куда попадают. А когда что-то устанавливают, часто не до конца понимают, что именно устанавливается и куда.

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

Хорошо, и что же мы можем с этим поделать? Вот несколько вариантов:

  1. Назад в будущее. Во-первых, можно создавать компьютеры (как мой Commodore 64), которые бы разрушали барьер между использованием устройства и его программированием. Одной из предпосылок к созданию Raspberry Pi, по словам Эбена Аптона, было желание создать среду, которая бы превращала пользователей в программистов.
  2. Встретиться с болью лицом к лицу. Другой подход — учить студентов как настраивать и использовать среду разработки до того, как они начали программировать (или одновременно с этим).
  3. Отсрочить боль. Третий вариант предполагает использование облачных сервисов, чтобы студенты могли сразу начать программировать и на время отложить подготовку собственной среды разработки.

На одном из моих курсов мы пользуемся вторым подходом. Студенты учатся использовать командную строку UNIX одновременно с изучением языка программирования C. Однако эти студенты уже умеют программировать и у них есть возможность обратиться к инструкторам за помощью.

Для новичков, в особенности для тех, кто занимается самостоятельно, я рекомендую третий подход. Вот некоторые инструменты, которые я использовал:

  1. Интерактивные учебники, позволяющие запускать код прямо в браузере, как например эта адаптация книги How To Think Like a Computer Scientist
  2. Cреды разработки, работающие через браузер, как например PythonAnywhere
  3. Образы виртуальных машин с уже настроенными и готовыми к работе средами разработки, которые пользователь может загрузить и запустить у себя (при условии, конечно, что он может установить программное обеспечение для запуска виртуальной машины).
  4. Сервисы вроде Binder, представляющие собой среду выполнения в облаке, и позволяющие пользователям получить доступ к некоторым функциям через браузер.

В некоторых своих проектах я использовал сразу все эти инструменты. В дополнение к интерактивной версии How To Think Like a Computer Scientist есть еще интерактивная версия Think Java, подготовленная и поддерживаемая Trinket.

В Think Python я предлагаю читателям использовать PythonAnywhere в течение как минимум четырех первых глав, а затем привожу инструкции, как перейти к использованию Python локально.

Я использовал образы виртуальных машин для некоторых курсов в прошлом, но в последнее время я чаще пользовался онлайн сервисами, как в случае с этим Jupyter-ноутбуком для книги Think DSP. А репозитории для всех моих книг подготовлены для работы с сервисом Binder.

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

Nick Coghlan предложил в твиттере четвертый подход, который бы я назвал Загляни в будущее. Вполне возможно, новички могут начать с облачных сред разработки и остаться на них.

Как научиться программировать в 9 лет самостоятельно / Habr

Многие считают, что в 9-10 лет можно программировать максимум на Scratch’е. Но это не так. В 9 лет можно и на C# Windows Forms программки пилить. Главное – желание.

С чего все началось


Все началось тогда, когда я захотел сделать полноценный компьютер в Minecraft.

Я устроил DDoS атаку на Яндекс Я искал информацию, как работает компьютер. Во время поиска, мне на глаза попался видеокурс по шарпу. И началось…

Не всё так просто в этой жизни


Посмотрел первый урок «Что такое C# и зачем он нужен».

Я подумал:

«Зачем доучивать до конца? Установлю Visual Studio, понажимаю по кнопочкам (не на клавиатуре) и готово! Я — программист!»

Но не всё так просто.

Что это? Аааа! Помогите!

Начал бить по клавиатуре… Не в Visual Studio, а в Яндексе:
«Как программировать»
«Как программировать на C#»

«Уроки по C#»
И т.д.

Понеслась!

Нашёл сайты metanit.com и professorweb.ru. Читал…

Первые результаты


Сначала я работал в консоли. Сделал консольный «блокнот», консольный калькулятор, даже «виртуальную машину» и «язык программирования» написал (не доделал).
(К сожалению, они не сохранились).

Оконные приложения


Скачал вот эту книжку. Называется «C# для школьников». В ней есть уроки создания Windows Forms приложений. Дерзал, делал.

Игры


Надоело писать скучные, никому не нужные приложения.
И у меня появилась идея! Сделать мини-игру на Windows Forms!
Называлась Adventure of Warrior.


Начал учить XNA. На 3-й день сделал игру.


Еще пробовал сделать псевдо-3d графику:


Конференции


Участвовал в конкурсах 2 раза.

Первый раз победил (с оговорками). Как я победил? Меня не пускали соревноваться с программистами из старшей школы. А я ж был третьеклассник. Пустили соревноваться с второклашками. Пока они рассказывали про поезда, как они работают, ПДД и т.д., пришёл я.
Показал игру, и всё — 1 место!

Второй раз не попал в призовые места. Хотя моя программка – так себе. Называется Alprog.RadioWave– приложение для прослушивания интернет-радио.

Переход на WPF


Спустя два года

Ура! Я умею писать на Windows Forms!

Тем временем, мне захотелось сделать что-то новенькое! Анимации, полупрозрачность элементов.
Ну почему GDI не умеет работать с видеокартой?! Он не тянет!

Ищу… Оооо! Нашёл! WPF!

MVVM? Что это??

Уже разозлился, подумал написать свой UI Фреймворк в Windows Forms на OpenGL.
Начал делать. Ой! Еще OpenGL учить надо! А как кнопку отрисовать? Текстуры в Photoshop’e делать?

Я переступил через порог «нихачу учиться! Я и так всё снаю!» и начал учить. Практика – вещь золотая в обучении.

Что сейчас?


А сейчас в 2019 году, когда мне 11 лет, я учусь на Xamarin.Forms и разрабатываю органайзер. Называется Alprog.Priority.

Первая версия называлась Alprog.XNote:

Уже на WPF

Вот основная:


Стал школьным «тыжпрограммистом». Информатику сдал экстерном. Если что, учителя ко мне обращаются (очень часто).

На уроках информатики приношу свой ноутбук и творю. Учитель информатики стал моим наставником.

Очень ему благодарен. Иногда бывает, что нет идей – хочется бросить программирование. А учитель подсказывает мне, куда двигаться дальше. И я начинаю реализовывать новые идеи.
Ещё я благодарен своим родителям – за поддержку и веру в меня.

Итоги


Как видите, если есть желание, то есть и результат. Чуть-чуть поплясать с бубном вокруг компа, и точку с запятой ставишь вовремя.

P.S. Ждите новых статей!

Как научиться программировать с нуля и найти первую работу.

На /r/learnprogramming собрали самые часто задаваемые вопросы по теме обучения программированию с нуля и поиска первой работы. 

Читать далее

Иллюстрация: Reddit blog

Начало
    С чего мне начать?
    Какой язык программирования стоит выучить первым?
    Где можно найти качественные образовательные ресурсы?
Как совершенствовать навыки
    Как перейти с начального уровня на средний?
    Где можно найти тренировочные упражнения и идеи для проектов?
    Как улучшить навык реализовывать задачи/задания в программах (алгоритмическое мышление)?
    Я не могу придумать классную идею для проекта. Мне просто не хватает креативности? Как другие программисты ищут вдохновение?
    Где можно найти примеры хорошего кода и проектов для обучения?
    Как выучить темы, которые рассматриваются в стандартных университетских программах по информатике?
    Как начать крупный проект и не забросить его?
Распространённые страхи и опасения
    Я уже слишком стар для программирования?
    Есть что-то другое, чему мне сначала нужно научиться?
    Нужно ли мне хорошо знать математику?

    Я много гуглю или не знаю, как делать что-то, когда только собираюсь начать. Это плохо?
    Программировать сложно?
Вопросы про обучение
    Что значит «знать язык» или «уметь программировать»?
    Я только что начал учить язык Х. Стоит ли мне начинать учить язык Y?
    Стоит ли учить более одного языка программирования одновременно?
    Это плохо, что у новичков иногда возникают проблемы с задачами и упражнениями?
    Как найти/поддерживать мотивацию, чтобы учиться программировать?
С чего мне начать Х?
    С чего начать делать видеоигры?
    С чего начать делать веб-сайты/веб-приложения/веб-разработку?
    С чего начать делать мобильные приложения/приложения для Android/приложения для iOS/приложения для Windows Phone?
    Как автоматизировать что угодно?
Терминология и словарь
    В чём разница между информатикой (computer science, CS), компьютерной инженерией (computer engineering, CE), программной инженерией (software engineering, SE), программированием и кодированием?
    С чём разница между Cи, C++, Objective-C и C#?
    В чём разница между Java и JavaScript?
Инструменты и управление версиями
    Что такое управление версиями/контроль версий? Стоит ли мне его использовать?
    С чего начать использовать управление версиями?
    Что такое IDE? Стоит ли мне её использовать?
Компьютеры и операционные системы
    Какую операционную систему мне следует использовать?
    Какой компьютер/ноутбук мне следует купить?
Карьера и работа
    Можно ли заработать много денег на программировании?
    Можно ли получить работу в программировании, не имея диплома по информатике? Или вообще без высшего образования?
    Как войти в эту отрасль и получить стартовую должность?
Что делать дальше?
    Больше не новичок
    Программирование — лишь инструмент
    Как улучшить навыки программирования
Разное
    Как обучить программированию ребёнка?
    Как делать вклад в open source-проекты?
    У меня вопрос по Си/Python/другому языку.
    Там нет моего вопроса. Что мне делать?
    Да, мой вопрос есть в ЧаВо, но я хочу получить ответ от реального человека.
    Как редактировать вики /r/learnprogramming (включая эти ЧаВо)?

Итак.

С чего мне начать?

Если вы хотите научиться кодить, для начала полезно правильно понимать, зачем вам это нужно. В этом видео на YouTube Кевин Чирс отлично объяснил, как нужно подходить к изучению программирования.

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

  1. Найти небольшую задачу или проект, который вам будет интересно решить. Можете попробовать создать инструмент для решения небольшой жизненной задачи или с нуля реализовать программу, которая вам кажется интересной. Такой проект мотивирует вас продолжать учиться кодить и даст возможность применить полученные знания на практике.
  2. Почитайте информацию о разных языках программирования, чтобы выбрать наиболее подходящий для вашего проекта. (См. рекомендации ниже).
  3. Найдите один качественный ресурс для новичков по этому языку и руководствуйтесь им. (Также см. ниже).
  4. Помимо этого ресурса, гуглите и задавайте вопросы.
  5. Выполните несколько оригинальных проектов на этом языке.

Вот эти вещи мы советуем не делать:

  1. Нельзя просто пассивно штудировать выбранный ресурс: делайте упражнения и домашние задания; практика – это незаменимая часть обучения программированию.
  2. Не переключайтесь без необходимости с одного языка на другой. Выберите один и придерживайтесь его, потому что главное в программировании — решать задачи, а не выучить языки. Научиться решать проблемы сложно, и этот навык можно отточить, только если постоянно тренироваться. Каждый раз, когда вы переключаетесь на другой язык, то теряете время, в которое могли бы тренироваться применять полученные знания, чтобы развить навыки решения задач.
  3. Не прекращайте учиться после того, как закончили какой-либо курс. Программирование — одна из тех областей, где всегда есть, чему учиться.

И наконец, помните, что обучение программированию — долгий и трудный процесс. Если вам тяжело, не расстраивайтесь! Это абсолютно нормально, и многие люди годами учатся и тренируются, пока не почувствуют себя достаточно компетентными, чтобы искать работу или сделать вклад в серьёзный проект. К счастью, просто начинать учиться совсем не так сложно.

Какой язык программирования стоит выучить первым?

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

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

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

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

Я хочу научиться…

  • …разрабатывать приложения для iPhone — Swift (ещё)
  • …разрабатывать приложения для Android — Java (ещё)
  • …создавать веб-сайты — JavaScript, CSS, HTML5 (ещё)
  • …писать десктопные приложения для Windows — C#
  • …создавать 2D/3D-игры — JavaScript, C# или C++ (ещё)
  • …программировать Arduino/микроконтроллеры/роботов — Си
  • …заниматься научными/математическими вычислениями или анализом данных — Julia, Python, R или Matlab
  • …заниматься автоматизацией и разработкой скриптов — многие языки (Python, Ruby, Bash, Powershell, AutoHotKey…)

Если в списке нет того, что вам нужно, поищите другие варианты на этих ресурсах:

Если вы всё ещё не можете определиться с выбором, изучайте Python. Это хороший, доступный для начинающих программистов язык с огромным сообществом и множеством библиотек, с помощью которых можно сделать практически всё что угодно, начиная созданием игр, и заканчивая автоматизацией процессов дома или на работе и анализом данных для построения веб-сайта. Постарайтесь найти обучающий ресурс, в котором разобраны ключевые принципы и основы, прежде чем погрузиться в разработку более сложных приложений. Инструкции о том, как начинать изучение любого языка, можно найти на странице reddit getting started.

Где можно найти качественные образовательные ресурсы?

Как перейти с начального уровня на средний?

Типичный вопрос, который мы получаем от многих новичков, — «что дальше?» В частности, когда они пытались проработать какие-то уроки, пособия, курсы, но в итоге всё равно не смогли заполнить пробел между пониманием, как работает оператор if или цикл for, и как именно применять то, что они изучили, чтобы создать сложные и интересные программы.

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

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

Вот несколько советов, как не сдаваться и что делать дальше.

Перейдите с пассивного обучения на активное

Вместо того, чтобы брать курсы и уроки, которые (как вы думаете) научат вас тому, чему вы хотите научиться, начните активно искать способы обучиться самостоятельно. Например, если вы понятия не имеете, как создать игру, загуглите «как написать игру на Х», где «Х» — это язык программирования, который вы собрались использовать. Если у вас всплыло сообщение об ошибке, которая вам незнакома, попробуйте загуглить её. Если вы хотите освоить машинное обучение — погуглите и найдите годную книгу, пособие или онлайн-курс.

Вам будут нередко попадаться учебные пособия, разъясняющие, что именно вам следует делать, или по крайней мере статьи, которые дадут общее представление и подсказки о том, как составить более точные поисковые запросы. Тем более, нет ничего стыдного в том, чтобы искать источники новых знаний — как раз наоборот. Все программисты, как начинающие, так и профессиональные, постоянно делают две вещи: гуглят и учатся.

Постоянно практикуйтесь

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

Главная цель программирования — разработка прикладного решения задач, а лучший способ научиться этому — постоянно решать задачи, большие и маленькие.

(См. также ЧаВо: Где можно найти тренировочные упражнения и идеи для проектов и ЧаВо: Я не могу придумать классную идею для проекта. Мне просто не хватает креативности? Как другие программисты ищут вдохновение?)

Научитесь декомпозировать задачу

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

Допустим, вы хотите создать игру «камень-ножницы-бумага». Её можно разделить её на несколько подзадач: как получить вводные данные от пользователя, как заставить компьютер сделать случайный выбор, как определить победителя и как повторить игру (если вы хотите играть несколько раз подряд).

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

Если вы совсем не знаете, как сделать что-то (например, как заставить компьютер выбрать случайное значение), погуглите. В данном примере поиск «Х выбрать случайное значение» (где Х — используемый язык программирования) покажет несколько различных способов, которые вы сможете использовать. Иногда задачу получается разбить на множество частей без поисковика, а иногда без него не обойтись.

Так, если вы учите Java и хотите научиться писать игры, но понятия не имеете, с чего начать или как разбить задачу на составляющие, загуглите «java игры уроки». Поиск даст несколько хороших источников, которые научат вас писать игры и (обычно автоматически) разбивать процесс написания игры на подзадачи поменьше.

По сути, этим вы прививаете себе образ мышления разработчика. Если задача слишком сложная, не расстраивайтесь. Продолжайте разбивать её на всё более простые составляющие и исследуйте вещи, которые кажутся неделимыми. Потом снова по кругу: разбиваете, гуглите, разбиваете, гуглите…

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

Больше советов смотрите в ЧаВо: Как улучшить навык реализовывать задачи/задания в программах (алгоритмическое мышление).

Будьте систематичны

Когда вы пишите и отлаживаете код, ни в коем случае не привыкайте просто пробовать сделать что-то, рассчитывая, что это случайно сработает. Будьте максимально чётки и последовательны — метод «проб и ошибок» здесь не подойдёт.

Во время написания кода остановитесь на минуту и составьте на листе бумаги приблизительные план действий. Попробуйте нарисовать какие-то схемы или набросать что-то вроде псевдокода. Если вам придётся изменить свой план (что вы, скорее всего, и сделаете), подумайте, для чего вам нужно это изменение и каким будет ваш новый план действий. (Этот этап планирования — также подходящая возможность, чтобы потренироваться декомпозировать задачи!)

Во время отладки кода ставьте чётки цели. Попробуйте мыслить, как учёный: проводите эксперименты, чтобы либо попытаться исправить баг, либо сузить область его поиска, и запишите результаты. Если ваша догадка/предпринятая попытка оказалась неверной или произошло что-то, чего вы не предусмотрели, остановитесь и разберитесь, в чём причина. Можете фиксировать эксперименты и тесты в блокноте, если это поможет вам придерживаться плана.

Баги возникают тогда, когда ваши предположения не совпадают с реальностью. Если что-то кажется неправильным, не игнорируйте это: продолжайте искать, пока не выясните, в чём дело/какое из ваших предположений было неверным.

Не делайте что попало, пока что-нибудь не сработает — будьте последовательны.

Не расстраивайтесь, если приходится исправлять баги или гуглить

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

Отладка (и трудности!) — неотъемлемая часть программирования. Если получится, постарайтесь не отчаиваться и не злиться. Отнеситесь к этому как к занимательному квесту или головоломке.

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

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

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

Не бойтесь попросить помощи

И наконец, если вы совсем не можете сдвинуться с места и понятия не имеете, что делать дальше, не стесняйтесь обратиться за помощью!

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

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

Больше информации читайте в руководстве о том, как задавать вопросы на reddit.

Пройдите более интенсивный вводный курс

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

Железное правило: если вводные курсы по программированию, которые вы проходили, не вызвали у вас особых трудностей или не содержали заданий, упражнений и мини-проектов, вам нужно поискать более требовательные курсы. Постоянная практика (и трудности!) — неотъемлемая часть учебного процесса.

Ещё больше подходов, рекомендаций и советов о том, как осуществить этот прорыв, читайте в следующих постах:

Где можно найти тренировочные упражнения и идеи для проектов?

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

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

Здесь список простых клонов 49 игр, которые можно повторить.

Здесь список классных идей для заданий по информатике от Стэндфордского университета. Этот ресурс больше ориентирован на преподавателей информатики, которые ищут неизбитые идеи для заданий для своих вводных курсов. Поэтому это идеальный ресурс, если вы ищете короткие, несложные, но интересные идеи для проектов.

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

Если вы хотите попробовать что-то новое, на сайте Idea Machine пользователи размещают свои идеи для приложений и очень хотели бы, чтобы кто-нибудь их осуществил.

Если вы ищете что-то посложнее, попробуйте переписать программы, которыми пользуетесь каждый день. Например, попробуйте сами написать…

  • утилиты командной строки (ls, wget, curl и т.д.)
  • текстовый редактор
  • IDE
  • программу для просмотра изображений
  • пакет офисных приложений (например, Microsoft Office или Libreoffice)
  • язык программирования (интерпретатор или компилятор)
  • веб-браузер
  • базу данных (реляционную или нереляционную)
  • веб-сервер
  • систему управления версиями

Если хотите сделать что-то потруднее, но с детальным объяснением, попробуйте реализовать одну из программ 500 Lines or Less — это open source-книга, в которой пошагово описано, как создавать относительно сложные программы, занимающие не более чем 500 строчек кода (3D-моделлеры, статистические анализаторы и т.д.). В нагрузку попробуйте реализовать эти программы на другом языке, адаптируйте их под немного другую задачу или добавьте им новые интересные возможности. Исходный код книги содержит полные реализации каждой включённой в неё программы.

Что касается тренировочных упражнений, вот некоторые хорошие сайты/ресурсы для старта:

  • На reddit:
    • /r/dailyprogrammer — сабреддит с ежедневными трудностями программирования
    • /r/ProgrammingPrompts — небольшие простые проекты
    • /r/tinycode — сабреддит о том, как писать маленький код с большими возможностями
    • /r/programmingchallenges — сабреддит, посвящённый трудностям программирования (который не мешало бы оживить)
    • /r/programbattles — новый сабреддит, аналогичный /r/photoshopbattles, где пользователи соревнуются в решении задачек на написание кода
  • Общие упражнения:
    • Finxter — более 300 головоломок на Python, чтобы проверить и потренировать быстрое понимание кода.
    • Project Euler — предлагает около 500 математических задач (например, по теории чисел, простым числам, системам счисления), которые возможно решить с помощью программ (на любом языке).
    • CodeAbbey — более 200 задач по программированию, начиная с самых простых. Позволяет учиться на решениях других разработчиков.
    • Rosalind — аналогичный Project Euler сайт, который содержит более 200 задач по программированию, связанных (немного) с биоинформатикой.
    • CodeByMath — более 100 небольших задач по математическому программированию.
    • Codingbat.com — упражнения на Java и Python для новичков и программистов более продвинутого уровня.
    • codegolf.stackexchange.com — сайт, где можно постить и обсуждать вопросы по программированию.
    • Ruby Quiz — ряд заданий, в которых нужно создать небольшие программы разной степени сложности. Все решения пишутся на Ruby, но подсказки работают для любых языков, поэтому вы сможете использовать любой другой язык программирования, если справитесь без эталонного решения, в которое можно было бы подсмотреть.
    • OCS Prep Work — подготовительная работа для студентов компьютерных курсов в Омахе. В будущем она превратится в полноценную книгу, но сейчас это просто компиляция тренировочных задач. — Эндрю Эк.
    • UVA Online Judge — собрание сотен задач из конкурсов по программированию с системой онлайн-проверки решений.
    • TopCoder — содержит алгоритмические задачи, накопленные за годы соревнований, доступных на нескольких популярных языках. Также проводит онлайн-соревнования по программированию несколько раз в месяц.
    • CodeForces — аналогичен TopCoder, но даёт больше заданий на соревнованиях и имеет мало отличительных функций, включая «виртуальные конкурсы».
    • Timus — аналогичен UVA, предлагает задачи со многих прошедших соревнований (мирового и регионального масштаба).
    • SPOJ — аналогичный UVA ресурс с широчайшим выбором языков программирования для разработки решений.
    • CodeForces — содержит алгоритмические задачи, накопленные за годы соревнований, доступных на нескольких популярных языках.
    • USACO — содержит алгоритмические задачи вместе с руководствами.
  • По языкам:
    • Для Prolog, Lisp и схожих языков смотрите P-99 и L-99 — в подборках по 99 задач, которые помогут повысить уровень владения языками.
    • Python Challenge — объединяет загадки и вопросы по программированию, которые помогут продвинуться на новые ступени.
    • 4Clojure — подборка упражнений по программированию специально для Clojure — диалекта Lisp.

13 советов тем, кто изучает программирование самостоятельно

1. Найдите правильную мотивацию для обучения

Чёткое обоснование того, зачем вы изучаете программирование, поможет вам сконцентрироваться. Обязательно сформулируйте для себя конкретную цель. Детально рассмотрите свою мотивацию. «Хочу уметь», «хорошо бы научиться» — это плохая цель. Примеры хороших целей:

  1. Продвинуться дальше в текущей карьере.
  2. Сменить род занятий.
  3. Зарабатывать дополнительно благодаря сторонним проектам.
  4. Разработать свой собственный продукт (игру, мобильное приложение), создать стартап.

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

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

2. Выберите правильный язык

В самом начале может оказаться очень сложно решить, что именно изучать. Некоторые языки программирования освоить легче, некоторые имеют узкие сферы применения. Однако на этом не стоит серьёзно зацикливаться. Лучше начать с чего угодно, чем тратить часы в поисках «идеального» варианта. Потому что, освоив один язык программирования, будет легче переключиться на другой.

Если вы уже знаете свою конечную цель, определите, что необходимо для её достижения. Изучайте языки, которые соответствуют этой цели. Для разработки трёхмерных игр нужны одни языки и инструменты, для создания сайтов — другие.

Если не знаете, с чего начать, попробуйте изучить язык JavaScript. Нравится это или нет другим программистам, JavaScript становится всё более популярным и применяется не только при разработке веб-сайтов, но и в других сферах. Таким образом, вы покроете максимальное количество вариантов применения.

3. Составьте расписание

Чёткое расписание занятий повышает вероятность успеха. Но устанавливайте реалистичные дедлайны для конкретных задач. Не рассчитывайте осилить книгу по программированию из сотен страниц меньше чем за неделю — если только вы не бросите все другие обязанности на это время.

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

Самостоятельное изучение программированияEric Rothermel/Unsplash.com

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

4. Занимайтесь одним делом в один момент времени

Многие пытаются делать сто вещей за раз. Огромная ошибка! Занимайтесь одним делом в один момент времени. Не изучайте параллельно HTML, JavaScript, Swift и что-то ещё. Вы сведёте себя с ума!

Этот пункт может даться вам с трудом (говорю по опыту), потому что всегда хочется выучить всё сразу.

В своей книге «Начни с главного!» Гэри Келлер (Gary Keller) сказал: «Необыкновенные результаты напрямую определяются тем, насколько сильно вы можете сузить свой фокус». Это можно применить к чему угодно, включая изучение программирования. Не бойтесь опоздать — языки и технологии никуда не денутся. Начинайте с малого и двигайтесь вперёд.

5. Делите всё на небольшие порции

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

Сфокусируйтесь на одной теме и разделите её на удобоваримые кусочки. Удостоверьтесь, что вы полностью поняли и усвоили какую-то концепцию, перед тем как переходить к следующей.

Предприниматель Тим Феррисс (Tim Ferriss) придумал акроним ABC — Always Be Compressing. Идея заключается в том, что каждый блок информации нужно постараться сформулировать настолько кратко, насколько возможно. Потом обобщить это в абзац, создать диаграмму или изображение, использовать мнемоническую схему — что угодно, если это поможет вам быстро вспомнить нужное.

6. Меняйте способы

Исследования показывают, что чем больше типов восприятия информации вы используете, тем больше вероятность её усвоить. В этом вам помогут книги, видео, интерактивные уроки, тесты, подкасты и многое другое.

Впитывайте информацию любыми возможными способами. По словам Джуди Уиллис (Judy Willis), автора книги «Как научить ребёнка легко учиться», чем больше областей мозга хранит данные о предмете, тем активнее формируются взаимосвязи. Их избыточность даёт учащемуся дополнительные возможности доставать информацию из разных хранилищ мозга. Такие перекрёстные связи данных означают, что мы изучили что-то, а не просто запомнили.

7. Обучайте других

Необходимость объяснять кому-то концепцию или процесс даёт гарантию, что вы сами полноценно это усвоите. Делать это можно разными способами. Один из них — вести курс или семинары для подростков. Можно делать свои видео на YouTube с объяснениями каких-то концепций. Не нравится идея с видео? Можно обойтись и без него. Вы можете преподавать разными способами. Как вариант — писать. Например, с помощью своего блога я не только помогаю другим, но также обучаюсь гораздо эффективнее, чем если бы я училась одна.

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

На образовательных платформах, как правило, есть возможность помогать другим. Обычно это что-то вроде форума с вопросами учащихся. Загляните туда, и если там есть вопрос, ответ на который вам известен (или у вас есть хотя бы соображения по поводу), — пишите, не стесняйтесь. На хороших образовательных сайтах царит здоровая атмосфера, и вашу помощь оценят. И не стесняйтесь задавать вопросы сами! Дайте другим возможность объяснить вам что-нибудь.

8. Найдите единомышленника

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

9. Найдите наставника

Чаты и форумы образовательных платформ — неплохие места для поиска единомышленников и, возможно, наставников.

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

10. Внесите в процесс элементы игры

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

Устанавливайте цели и работайте над ними. Вознаграждайте себя, когда достигнете их.

Самостоятельное изучение программированияPawel Kadysz/Unsplash.com

11. Переделайте чей-нибудь код

Посмотрите, как кто-то другой реализовал решение, которое вы хотите разработать. Заглядывайте в open source проекты на GitHub. Сообщество программистов может оказаться очень дружелюбным местом, где чтение (или даже модификация) чьего-то кода — это абсолютно нормально. Просто просматривайте строку за строкой, размышляя, как каждая из них работает и сочетается с общей картиной.

Используйте чью-то работу для вдохновения и идей.

12. Практикуйтесь. Не зацикливайтесь только на обучении

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

Выяснение того, как всё работает, — это ваше собственное испытание, а ошибка — то, что кардинально изменит правила игры. Это ведёт нас к последнему совету.

13. Не бойтесь неудач

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

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

Вывод

Ключ к успешному самообучению — это уверенность. Если вы верите в себя, то с большей вероятностью у вас всё получится лучше, чем ожидалось. Прекратите сомневаться в себе и своих способностях, и вы прорвётесь, как настоящий чемпион!

Игра проиграна, только если вы сдались.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *