Часть 2

Часть 2

Sharofiddin

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

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

Загляните в раздел Коллекций на GitHub. Здесь размещён курируемый список массы популярных и интересных open source-программ от библиотек и игр до музыки, журналистики и анализа данных. Он хорошо отражает, какого рода вещи можно делать с помощью кода. Исходный код находится в публичном доступе, и вы можете скачать эти проекты и сами посидеть над ними.

Посмотрите также серию бесплатных электронных книг The Architecture of Open Source Programs, в которых более детально разобрана структура популярных open source-программ. Хорошим отправной точкой может стать последняя книга серии «500 lines or less», так как программы в ней достаточно малы, чтобы вы точно могли выполнить их/с ними справиться самостоятельно и использовать в качестве стартовой площадки для запуска своего проекта.

Как выучить темы, которые рассматриваются в стандартных университетских программах по информатике?

Если вам интересно самому пройти материал, который входит в большинство стандартных программ по информатике в вузах, неплохой материал, а также ссылки на дополнительные образовательные источники, можно найти по следующим ссылкам:

What every computer science major should know — Matt Might (Что нужно знать каждому студенту, изучающему информатику — Мэтт Майт)

Даёт высококачественный обзор различных областей и причин, почему они ценны. Также содержит список материалов к прочтению.

Open source computer science degree — Open Source Society (Открытая программа по информатике от Open Source-сообщества)

Предлагает последовательный учебный план со ссылками на курсы — преимущественно Coursera — в каждой теме.

Teach yourself CS (Как самостоятельно изучить информатику)

Аналог предыдущего ресурса с тем исключением, что рекомендует как книги, так и видеолекции. Более продвинутые рекомендуемые источники связаны с системами (например, операционными системами, базами данных…)

A Self-Learning, Modern Computer Science Curriculum (Современная программа по информатике для самостоятельного изучения)

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

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

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

Во-первых, досконально разберитесь в сути задачи.

Часто на этом этапе помогает Rubber Duck Debugging. Объясняя задачу или идею кому-то (или чему-то) другому, кто о ней ничего не знает или ничего в ней не понимает, человек сам более глубоко вникает в неё: ведь ему приходится размышлять над задачей значительно больше, и это приводит к её лучшему пониманию.

Во-вторых, не бросайтесь сразу же к компьютеру!

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

Это приведёт нас к следующему.

Помните кое-что, когда работаете над крупным проектом в одиночку:

ВСЁ В МИРЕ СОСТОИТ ИЗ БОЛЕЕ МЕЛКИХ ЧАСТЕЙ.

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

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

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

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

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

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

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

Как не забросить проект?

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

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

Ещё несколько советов:

  • Для начала полностью забудьте о коде и взгляните на программу полностью с точки зрения пользователя.
  • Составьте список желаемых функций, которые программа должна выполнять.
  • Составьте список функций, которыми программа не будет обладать (Так вы сможете избежать соблазна добавить кучу «классных» и совершенно ненужных «улучшений». В основном, именно потому, что программы становится слишком раздутыми, разработчики бросают их через несколько недель.)
  • Сделайте несколько набросков экрана, который будет видеть пользователь, и как он будет с ним взаимодействовать. Это не должны быть точные прототипы — они, скорее, помогут представить, что будет изменяться на экране пользователя при переходе на другую страницу. Эти зарисовки помогут вам не забыть что-то важное.
  • Научитесь использовать git и заведите аккаунт на GitHub. Здесь можно получить хорошую поддержку и попросить оценку коду. (Игнорируйте комментарии по поводу стиля кода: 99% из них — бесполезные споры.)

Распространённые страхи и опасения

Я уже слишком стар для программирования?

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

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

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

Есть что-то другое, чему мне сначала нужно научиться?

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

Вот единственные действительно необходимые условия:

  • Вы должны уметь печатать (если только вы не используете язык на основе подхода «drag-and-drop» вроде Scratch).
  • У вас должен быть компьютер.
  • Вы должны уметь самостоятельно гуглить/искать ответы на вопросы.

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

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

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

Нужно ли мне хорошо знать математику?

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

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

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

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

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

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

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

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

Я много гуглю или не знаю, как делать что-то, когда только собираюсь начать. Это плохо?

Нет. Вот ветка, в которой эта тема рассмотрена с разных сторон. Есть много других, аналогичных этой.

Программировать сложно?

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

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

Итак, программирование может быть сложным. Как и многие другие вещи, оно требует усилий, и эти усилия могут нелегко даваться. Не опускайте руки — получайте удовольствие, и все трудности будут того стоить.

Вопросы про обучение

Что значит «знать язык» или «уметь программировать»?

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

Я только что начал учить язык Х. Стоит ли мне начинать учить язык Y?

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

Стоит ли учить более одного языка программирования одновременно?

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

Это плохо, что у новичков иногда возникают проблемы с задачами и упражнениями?

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

Конечно, нет!

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

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

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

Как найти/поддерживать мотивацию, чтобы учиться программировать?

Зайдите на /r/GetMotivated/ и /r/GetDisciplined.

Мы часто думаем: «если бы у меня было достаточно мотивации… тогда я мог бы…», хотя именно действие поддерживает мотивацию. Сначала идёт действие, потом — мотивация. Найдите небольшие конкретные программы, которые хотели бы создать. Избавьтесь от всего, что вас отвлекает. Установите расширения для браузера, блокирующие сайты вроде Reddit, Facebook и Twitter. На минуту представьте, насколько здорово будет ощущать, что вы стали более компетентным программистом.

Вот несколько свежих веток по теме:

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

С чего начать делать видеоигры?

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

  • Unity (C#): подходит для мобильных, десктопных, браузерных/онлайн и консольных 2D и 3D-игр
  • Construct2 (JavaScript): для мобильных, десктопных и браузерных/онлайн 2D-игр
  • Pygame (Python): движок для десктопных 2D-игр
  • LÖVE (LUA): подходит для десктопных 2D-игр

Всегда помните, что ваша цель — разрабатывать игры, а не движки! Так что не нужно заново изобретать велосипед.

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

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

Обязательно загляните в ЧаВо /r/gamedev, почитайте вводное руководство на /r/gamedev и поищите более старые ветки на /r/gamedev и /r/learnprogramming.

С чего начать делать веб-сайты/веб-приложения/веб-разработку?

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

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

Больше информации можно найти в ЧаВо /r/webdev. Вот ещё один список онлайн-курсов, пособий и ресурсов для начинающих.

С чего начать делать мобильные приложения/приложения для Android/приложения для iOS/приложения для Windows Phone?

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

  • Приложения для Android пишутся преимущественно на Java — больше информации читайте в ЧаВо /r/androiddev.
  • Приложения для iOS пишутся на Objective-C или Swift — больше информации ищите на боковой панели /r/iosprogramming и в их вики (на GitHub).
  • Приложения для Windows Phone пишут на C#, Visual Basic или Javascript — больше информации ищите на боковой панели /r/WPDev.

Вы также можете создать приложения, которые будут запускаться на всех трёх крупнейших платформах, с помощью технологий Phonegap и Titanium — приложения пишутся один раз с использованием HTML, CSS и Javascript, а запускаются на любой платформе.

Больше информации ищите в списке ресурсов по разработке мобильных приложений. Вот одна старая ветка на эту тему: http://redd.it/352f09.

Однако не забывайте, что многие, если не все из указанных инструментов рассчитаны на тех, кто уже имеет предыдущий опыт в программировании. Если вы прежде никогда не занимались разработкой, может быть, вам лучше начать с изучения языка, по которому есть больше ресурсов специально для новичков. Когда вы приобретёте некоторый опыт и усвоите лежащие в основе программирования принципы, то вам станет намного проще учить новые языки и начинать изучение мобильной разработки. Раздел «С чего мне начать?» в нашем ЧаВо содержит больше информации о том, с чего нужно начинать.

Как автоматизировать что угодно?

Для Windows есть пара специальных языков программирования, такие как Autohotkey and AutoIt.

Другая подходящая кросс-платформенная альтернатива — это PythonAutomate the Boring Stuff with Python (Как автоматизировать рутину с помощью Python) — потрясающий образовательный ресурс.

Если вы хотите автоматизировать MS-Office, используйте встроенный язык программирования Visual Basic for Applications (VBA). Сабреддит /r/vba посвящён программированию на VBA.

Какие лучшие…

/u/thekodols сделал подборку из более чем 150 вопросов и ответов в стиле «какие лучшие» в этом посте, который охватывает различные языки, инструменты и темы.

Терминология и словарь

В чём разница между информатикой (computer science, CS), компьютерной инженерией (computer engineering, CE), программной инженерией (software engineering, SE), программированием и кодированием?

Информатика/компьютерная инженерия/программная инженерия vs. программирование/кодирование

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

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

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

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

Информатика vs. компьютерная инженерия vs. программная инженерия

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

Более детальный обзор смотрите здесь: http://www.reddit.com/r/learnprogramming/comments/2k569h/eli5_computer_science_vs_software_engineering_vs/.

Программирование vs. кодирование

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

Напротив, если вы говорите «я кодер», то подчёркиваете, что занимаетесь исключительно разработкой кода, и в меньшей степени — остальными вещами.

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

С чём разница между Cи, C++, Objective-C и C#?

Cи, C++, Objective-C и C# — это не вариации одного и того же языка.

Си — самый маленький и старый из этих языков. Изначально он создавался как системный язык программирования для операционной системы Unix и до сих пор широко используется в прикладном программировании.

С++ — очень популярный язык программирования общего назначения, изначально основанный на Си. После некоторых настроек большая часть кода (почти любой код) на Си может быть скомпилирована как код на С++. Однако в языке С++ появляется большой набор особенностей, которые значительно меняют применение языка по сравнению с Си. Написание кода в стиле Си на С++ обычно не приветствуется.

Objective-C — это строгое надмножество языка Си, поэтому любой рабочий код на Си также является рабочим кодом Objective-C. Этот язык далеко не так распространён, как Си или С++, и сегодня в основном используется в разработке для платформ OS X и iOS от Apple.

C# не основан на Си ни в каком техническом плане. С# — это язык программирования общего назначения, созданный Microsoft и подобный Java. Он компилируется в промежуточную форму, которая запускается на виртуальной машине (CLR), в отличие от предыдущих трёх языков, которые компилируются в нативный машинный код. И хотя С# заимствует элементы синтаксиса из Си и С++ (как и Java), технически он с этими языками не связан.

В чём разница между Java и JavaScript?

Java и JavaScript связаны в той же степени, в которой связаны крем и крем-брюле.

Аналогично предыдущему вопросу, с технической точки зрения Java и JavaScript никак не связаны. У них есть некоторые общие черты в синтаксисе, так как предком обоих был Си, но не более. В Википедии есть хорошее объяснение, откуда взялось это сходство в названиях: https://ru.wikipedia.org/wiki/JavaScript#JavaScript_%D0%B8_Java.

Report Page