Руководство для начинающих по программированию - платформа криптовалютных бирж

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

Введение

Сегодня программирование становится всё более важным «навыком»: как дизайнер, знание некоторых основ программирования поможет вам лучше понять свою работу; как предприниматель, роль технического основателя сделает многие ваши задачи проще. А для новичка, только начинающего, перед лицом огромного потока информации зачастую трудно понять, с чего начать; после легкого освоения базовых материалов обучение становится всё сложнее, кривая обучения резко возрастает, и вы останавливаетесь в растерянности; вы знаете, как вывести текст на страницу, но не знаете, когда стоит начать настоящий полезный проект; вы не понимаете, что ещё не знаете, и даже не можете определить, что изучать дальше.

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

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

Несмотря на то, что тон всей статьи — так называемое «сильное мнение, слабая приверженность» (Strong Opinions, Weakly Held), читатель всё равно должен относиться к нашим словам с долей скептицизма, как и ко всему вокруг. Если есть вопросы — добро пожаловать к открытому обсуждению.

Настройка мышления

Определение целей

Перед началом изучения программирования подумайте о своих целях: ясное понимание конечной цели сделает путь более четким. Что вы хотите создать? Веб-сайт? игру? iOS или Android приложение? Или вы хотите автоматизировать скучные задачи, чтобы было больше времени на прогулки и наблюдение за природой? Может быть, вы просто хотите повысить свою конкурентоспособность на рынке труда. Все эти цели — ценны, они являются частью мотивации для обучения программированию. Без мотивации трудно пройти длинный и порой скучный путь обучения.

Это видео, возможно, даст вам вдохновение: «Большинство школ не учат этому»

Не торопитесь

Плохое программирование — это легко. Даже «Дураки» могут научиться за 21 день. Хорошее программирование требует размышлений, но каждый может это делать, и каждый может испытать огромное удовлетворение от этого. 糟糕的编程很容易。即使是傻⽠也能在21天内学会它。好的编程需要思考,但每个⼈都能做到,每个⼈都能体验到它带来的极度满足感。

В книжных магазинах и онлайн полно книг типа «За 21 день освоишь X», обещающих быстро научить нужным навыкам. Matthias Felleisen в своей книге «How to Design Programs» ясно указывает на тенденцию к «быстрой» подготовке и высмеивает её.

Так называемые «быстрые пути» или «серебряные пули» не существуют. Мудрецы говорили, что овладение чем-либо требует 10 лет или 10 000 часов — то есть, по-китайски, «десятилетняя заточка меча». Не торопитесь, усилия не пропадут зря.

Развивайте интерес

Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.

⼤多数优秀的程序员做编程不是因为他们期望得到报酬或得到公众的崇拜,⽽是因为编程很有趣。

– Linus Torvalds

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

Начинаем учиться

Вдохновляющие истории

Когда я только начал учиться в средней школе, я начал изучать программирование. К сожалению, я прочитал несколько популярных тогда «мусорных» книг вроде «За 21 день освоишь C++», и хотя вначале мог писать небольшие программы, когда возникали сбои или сложные задачи, я не понимал, почему так происходит, и не мог решить проблему. Я постоянно кодировал, но мои навыки росли очень медленно, я имел очень поверхностное понимание «итераций» и «рекурсии», использовал компьютер скорее как калькулятор.

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

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

Об этой лекции: мы только что изучили электричество и специальную теорию относительности, преподаватель написал на доске эти темы и связал их линией. «Предположим, у нас есть электрон, движущийся по проводнику со скоростью, близкой к скорости света…» — сначала он просто записал известные формулы, но после нескольких досок алгебраических преобразований появилась формула магнитного поля. Я давно знал эту формулу, но тогда я понял, что эти явления связаны гораздо глубже, чем казалось. Разница между электричеством и магнетизмом — лишь «точка зрения». Я вдруг осознал: я не просто учусь «как делать» (How), я начинаю спрашивать «почему» (why), возвращаюсь к самым базовым знаниям, учусь тому, что раньше игнорировал. Этот процесс — болезненный, но очень важный. Надеюсь, он вас тоже насторожит: никогда не стоит повторять мои ошибки.

Пробуждение и размышления

Эта картинка взята из книги Douglas Hofstadter «Гёдель, Эшер, Бах». Каждая буква состоит из меньших букв. На самом верхнем уровне мы видим «MU», буква M состоит из трёх «HOLISM» (целостность), U — из «REDUCTIONISM» (редукционизм). Каждая из них содержит другую, и наоборот. На самом нижнем уровне — самая маленькая буква, которая состоит из повторяющегося «MU».

Каждый уровень абстракции содержит информацию. Если смотреть только сверху или снизу, можно упустить важные детали. Вопрос: как максимально полно получать информацию на каждом уровне? Или, иначе, как изучать сложные области (например, программирование), содержащие множество знаний?

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

Этот путь кажется скучным и неинтересным.

Две ловушки для новичков:

  1. Если новичок работает только с готовыми «двигателями и компонентами» (без понимания их устройства), это сильно ограничит его способность в будущем создавать что-то новое и диагностировать проблемы.
  2. Вторая ловушка менее очевидна: иногда «целостный» подход кажется эффективным, но через год-два, когда вы пройдете дальше, возвращение к основам будет очень сложным. Тогда придется отказаться от прежних заблуждений и идти медленно, что гораздо труднее, чем учиться с нуля.

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

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

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

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

Основы программирования

«Какой язык выбрать для обучения?» — часто первый вопрос новичков. Но это — неправильный вопрос. Первым делом нужно понять: «Из каких элементов состоит основа обучения программированию?»

В основе знаний по программированию есть три ключевых компонента:

  1. Алгоритмическое мышление: например, как найти максимум в наборе чисел? Для этого нужно иметь переменную maxSoFar, затем для каждого числа…
  2. Синтаксис: как выразить эти алгоритмы на конкретном языке программирования, чтобы компьютер их понял.
  3. Основы систем: почему при while(1) поток никогда не завершится? Почему недопустимо писать: int *foo() { int x = 0; return &x; }?

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

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

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

MIT 6.00.1x (Введение в компьютерные науки и программирование на Python). Хотя курс преподается на Python, он подчеркивает важнейшие концепции и парадигмы в области CS, а не только язык. Для тех, кто не в технической сфере, это расширит кругозор; содержание: вычислительные концепции, Python, простые структуры данных и алгоритмы, тестирование и отладка.

Harvard CS50x (Гарвард: Введение в компьютерные науки). Тоже вводный курс, дополняет MIT. Ведется на C, PHP, JavaScript + SQL, HTML + CSS. Объем и глубина материала разумны, есть возможность ознакомиться с современными достижениями технологий, что стимулирует интерес к CS. Дополнительный материал: «Кодирование».

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

Что делать на этом этапе? Вспомнить свои прошлые программы, подумать: «Почему я так их сделал?», «Как написать лучше?», — и понять, что такое суть программирования: использование компьютера для решения задач.

Предположения:

X = время, затраченное на размышление о решении, «решение задач»

Y = время, затраченное на реализацию кода, «использование компьютера»

Навыки программирования = F(X, Y) (где X > Y)

Чтобы повысить навыки, нужно оптимизировать X и Y, а также функцию F(X, Y). Мало кто может одновременно сосредоточиться на всех трех аспектах, но есть книга, которая помогает — «Structure and Interpretation of Computer Programs» (SICP). Она показывает, как абстрагировать и разбивать задачи, что позволяет решать более сложные проблемы — это огромный скачок в развитии навыков. Важное — язык преподавания в книге — Scheme, он очень прост и быстро осваивается, что позволяет сосредоточиться на идеях.

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

Если вы — один из первых — чтение SICP станет ключевым этапом между началом и следующими уровнями.

Хотя SICP — «вводная книга», для новичков она сложна. Вот полезные ресурсы:

  1. Udacity CS212 «Проектирование компьютерных программ» — преподаватель Питер Норвиг, язык — Python, уровень сложности — высокий.
  2. «How to Design Programs, Second Edition» — более простая версия HtDP, хороша для начинающих, если SICP кажется слишком сложной.
  3. Видео лекций по SICP от Гарварда и записи авторов, проводивших тренинги для HP.
  4. «Composing Programs» — продолжение идей SICP, использует Python.
  5. Решебник по задачам из SICP — для самостоятельной практики.

После этого вы сформируете собственную модель проектирования программ, перестанете запоминать только библиотеки и синтаксис, и поймете, что нужно учить дальше. Тогда самое время — приступать к проектам. Для начинающих участие в open-source проектах пока рано. Лучше начать с простых — создать сайт, игру, расширять их. Если идеи не ясны — посмотрите «炼⽠研究所» или выберите проект из «Mega Project List».

Если SICP кажется слишком сложной — не стоит себя заставлять. Можно сразу перейти к книге «The Elements of Computing Systems», которая научит вас строить компьютер с нуля, начиная с NAND. Эта книга — важная часть начального этапа, и ваша цель — завершить все проекты из нее (включая минимальный компилятор и ОС).

Чтобы полностью освоить книгу и укрепить базу, нужно сделать следующее (обратите внимание: порядок не строгий):

Основы компьютерных систем

После базового изучения программирования стоит углубиться в компьютерные системы. Рекомендуется книга: «Computer Systems: A Programmer’s Perspective, 3/E». В названии есть критика — на самом деле это учебник «Введение в системы», созданный CMU. Он показывает, как работают системы с точки зрения программиста, подробно разбирает внутренние детали.

Если книга кажется скучной, можно пройти курс на Coursera: «The Hardware/Software Interface» — это часть курса CSAPP, с практическими лабораторными. Также полезно освежить знания по C — например, книгу «The C Programming Language».

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

Базовые структуры данных и алгоритмы

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

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

Ресурсы для изучения:

  1. «Introduction to Algorithms» — не стоит считать это учебником для новичков, он сложен, но его можно пропускать на первых чтениях, сосредоточившись на основном содержании. Можно сначала прочитать «Data Structures and Algorithm Analysis».
  2. «Algorithms: Design and Analysis» (части 1 и 2) — курс Стэнфорда, не привязан к языкам, хорош для базового понимания.
  3. В начальной стадии важно уметь решать небольшие задачи с помощью стандартных алгоритмов — книги «Programming Pearls», «The Practice of Programming».

Другие основы

Несколько советов для начинающих:

  1. Учитесь задавать правильные вопросы и искать ответы через поисковики. Когда не можете решить — задавайте вопросы на Stack Overflow или Zhihu, предварительно прочитав статью о правильных способах задавать вопросы.
  2. Общайтесь с другими — создавайте личные сайты, ведите блоги, подписывайтесь на популярные ресурсы: Joel on Software, Peter Norvig, Coding Horror.
  3. Хорошо владейте английским — большинство ресурсов и документации на нем, и это значительно расширит ваши возможности.

Итог

Не бойтесь — вход в программирование не за несколько недель. В процессе вы столкнетесь с множеством трудностей. Используйте технику Фейнмана: разбивайте сложные темы на мелкие части, учитесь объяснять их другим — так вы лучше поймете. И даже если что-то не получится — не страшно. Иногда, спустя время, решение станет очевидным.

Также стоит читать другие книги, которые рекомендуют профессионалы и сообщество. В числе обязательных — «Code Complete» и «The Pragmatic Programmer». Они помогут вам дополнить знания и понять, как стать хорошим программистом.

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

()(

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • комментарий
  • Репост
  • Поделиться
комментарий
0/400
Нет комментариев
  • Закрепить