Урок 25. Разработка ваших первых программ

   ⁄ 

 Обновлено 24 Фев 2017

  ⁄   

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

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

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

Шаг 1: Определите проблему

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

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

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

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

Хотя этот шаг кажется очевидным, но он также очень важен. Самое худшее, что вы можете сделать — это написать программу, которая на самом деле делает не то, что вам (или вашему боссу) нужно!

Шаг 2: Определите свои инструменты, цели и план «Б»

Для опытных программистов на этом этапе будет еще немало дополнительных пунктов:

Кто ваши целевые пользователи и чего они хотят?

На какой архитектуре и/или ОС ваша программа будет работать?

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

Будете ли вы писать программу в одиночку или в составе команды?

Сбор требований (документированный перечень того, что ваша программа должна делать).

Определение стратегии тестирования/обратной связи/релиза.

Создание резервного бэкапа или план «Б» в случае неожиданных проблем.

Тем не менее, для начинающего программиста, ответы на эти вопросы, как правило, просты: вы пишете программу для собственного использования, в одиночку, на своей операционной системе, с помощью IDE, которую вы приобрели или скачали, и вашей программой, скорее всего, пользоваться будете только вы. Всё просто 🙂

Однако, если вы собираетесь работать над чем-нибудь посложнее, у вас должен быть резервный план «Б» (бэкап вашего кода). Это не просто сделать копию или архив в другой папке компьютера (хотя и это лучше, чем ничего). Если ваша ОС выйдет из строя, вы потеряете все данные. Хорошая стратегия резервного копирования включает в себя создание копии кода вне вашей операционной системы. Например: прикрепить код в виде файла к e-mail и отправить самому себе, скопировать в Dropbox или в любое другое облако, перенести на дополнительное устройство, скопировать на другой компьютер в локальной сети, воспользоваться системой контроля версий, расположенной на другом устройстве или в облаке (например, GitHub).

Шаг 3: Разбейте сложную проблему на несколько легких

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

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

 Написать доклад о картошке

Это довольно большая задача, давайте разделим её на подзадачи:

 Написать доклад о картошке

 Поиск информации о картошке

 Создание плана

 Заполнение каждого пункта плана подробной информацией

 Добавление итогового содержания

Это уже проще, так как теперь мы имеем список подзадач, на которых мы можем сосредоточиться в индивидуальном порядке. Тем не менее, в данном случае, «Поиск информации о картошке» звучит немного расплывчато, поэтому мы разобьем дополнительно и этот пункт:

  Написать доклад о картошке

 Поиск информации о картошке

Сходить в библиотеку за книжками о картошке

Поискать информацию в Интернете

Делать заметки на соответствующие разделы из справочного материала

  Создание плана

Информация о выращивании

Информация об обработке

Информация о добавках

 Заполнение каждого пункта плана подробной информацией

 Добавление итогового содержания

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

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

В качестве примера: многие люди вынуждены идти на работу или в школу в будние дни, так предположим нам нужно решить проблему «от постели к работе». Если бы вас спросили, какие дела вы выполняете на пути от постели к работе, у вас мог бы быть примерно следующий список:

 Выбрать одежду

 Одеться

 Позавтракать

 Ехать на работу

 Почистить зубы

 Встать с постели

 Приготовить завтрак

 Сесть в машину

 Принять душ

Используя метод снизу вверх, мы можем сгруппировать похожие задания и создать иерархию:

  От постели к работе

  Спальня

Встать с постели

Выбрать одежду

Одеться

  Ванная

Принять душ

Почистить зубы

  Завтрак

Сделать завтрак

Позавтракать

  Транспорт

Сесть в машину

Ехать на работу

Использование подобных иерархий чрезвычайно полезно в программировании. Таким образом, мы определяем структуру всей программы. Задача верхнего уровня (в данном случае: «Написать доклад о картошке» или «От постели к работе») становится main() (так как это основная проблема, которую нужно решить). Подпункты будут функциями в программе.

Шаг 4: Определите последовательность событий

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

 Встать с постели

 Выбрать одежду

 Принять душ

 Одеться

 Приготовить завтрак

 Позавтракать

 Почистить зубы

 Сесть в машину

 Ехать на работу

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

 Получить первое значение от пользователя

 Получить математическую операцию от пользователя

 Получить второе значение от пользователя

 Вычислить результат

 Вывести результат

Этот список в основном определяет, что должно быть в главной функции main():

Или в случае с калькулятором:

Шаг 5: Определите входные и выходные данные для каждого пункта

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

Давайте рассмотрим пару примеров. Функция getUserInput() довольно проста. Мы собираемся получить число от пользователя и вернуть его обратно в caller. Таким образом, прототип функции будет:

В примере о калькуляторе, функции calculateResult() нужно 3 ввода: два числа и математический оператор. При вызове calculateResult() у нас уже должны быть 3 фрагмента данных, которые мы будем использовать в качестве параметров функции. calculateResult() будет вычислять значение результата, но не будет его выводить. Следовательно, нам необходимо вернуть этот результат в качестве возвращаемого значения, дабы другие функции имели возможность его использовать.

Учитывая это, прототип функции будет:

Шаг 6: Детали пунктов

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

Например:

Шаг 7: Соединение входных и выходных данных

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

Это, как правило, более читабельно, нежели вариант без использования временных переменных:

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

cтейтменты if позволяют выполнять строки кода, если определенное условие истинно;

оператор == позволяет сравнивать два элемента на их равенство между собой.

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

Несколько советов при написания программ

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

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

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

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

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

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

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (26 оценок, среднее: 4,96 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

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

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