[ЗАНЯТИЕ 1.02] Как работает программист?


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

Почему это важно?

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

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

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

Итак, приступим.


black-programming.jpg

Постановка задачи

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

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

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

Предметная область

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

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


tasks.jpg
рисунок 1.01.1

К одной и той же предметной области может относиться большое число самых различных задач.

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

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

Изучение предметной области

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

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

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

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

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

Моделирование

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


model
рисунок 1.01.2

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

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


chicken.jpg
рисунок 1.01.3

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

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

Проектирование

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

  • Языки программирования (ЯП) - на них собственно пишется программа.
  • Библиотеки и фреймфорки - содержат уже готовый код, предназначенный для повторного использования.
  • Сервера и сервисы - готовые приложения, с которыми может взаимодействовать ваша программа. Они могут требовать достаточно сложного конфигурирования или программирования на специальных языках. Типичные примеры: системы управления базами данных (СУБД)(4) и веб-сервера(5).

Почему вообще необходимо что-то выбирать? Одни инструменты лучше подходят для одних задач, другие для других. Что-то легче реализовать на Python(6), что-то на Haskell(7), где-то лучше всего подойдет Java(8).

В реальной жизни на выбор технологий также накладывается масса ограничений, которые необходимо учитывать. Например, если вы хотите реализовать сложное веб-приложение, такое как Gmail, без языка JavaScript будет не обойтись. Или если все разработчики в вашей команде хорошо знают C#(9), вряд ли получится убедить их перейти на Python, какие бы преимущества это не сулило.

Для выбора ЯП и прочих технологий вам понадобится:

  1. Понимание основных концепций и парадигм языков программирования - без этого не имеет смысла говорить о проектировании программ вообще, и именно поэтому в нашем курсе есть отдельный блок, в рамках которого вы сможете разобраться со всеми этими понятиями.
  2. Знание типовых решений (паттернов) проектирования - это помогает избежать изобретения велосипедов с квадратными колесами.
  3. Опыт - в идеале, вы должны со временем изучить и использовать на практике несколько различных языков и достаточно большое количество библиотек и фреймворков. Без опыта практической работы и самостоятельного набивания шишек теория мало чего стоит.

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

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

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

Реализация и тестирование

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

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

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

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

Внедрение и сопровождение

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

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

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

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

Итеративная разработка

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

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

Заключение

Ну вот и все на сегодня.

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

Дополнительные материалы

Для снятия "розовых очков":

Кто есть кто в ИТ:

Сайты, на которых вам желательно стать завсегдатаем:

Домашнее задание


ДОМАШНЕЕ ЗАДАНИЕ


Итоги по выбору лучшей домашней работы будут подводиться в понедельник, 11 сентября, после 10 часов утра по МСК. То есть у вас есть суббота и воскресенье, чтобы задать вопросы, не торопясь сделать домашку, познакомиться с результатами работ других участников и решить, за кого вы отдадите свой голос.

Примечания

  1. Текстовый редактор - программа для редактирования текста, например, Блокнот в Windows.
  2. Парсинг веб страниц - разбор содержимого страницы программой, с целью получения определенной информации, например, курсов акций или валют. Может быть необходим, если не доступны подходящие сервисы, поставляющие те же данные в удобном для работы программы виде.
  3. Определение уникальности текста - да-да, речь идет о выявлении той самой копипасты, о которой так часто говорят на Голос. Что это за штука и с чем ее едят можно почитать здесь.
  4. Система Управления Базами Данных (СУБД)? - программа, которая обеспечивает хранение данных и одновременных доступ к ним нескольких пользователей
  5. веб-сервер - программа, обеспечивает функционирование веб-сайта
  6. Python - язык программирования, широко распространен, любим профессиональными разработчиками, годится в качестве первого языка для новичков
  7. Haskell - функциональный язык программирования, используется преимущественно на университетских кафедрах, хотя в последнее время набирает популярность в отдельных областях, например, в финансовой сфере.
  8. Java - один из самых распространенных языков программирования, часто используется для разработки софта для внутренних нужд компаний и корпораций.
  9. C# - и еще один ЯП, широко распространен, разработан компанией Microsoft, используется главным образом для создания приложений для платформы Windows.
  10. Среда разработки - программа, с помощью которой ведется разработка других программ: редактируется код, выполняется компиляция и отладка

С пожеланием успеха,
@wealthycat


logo

Успех проекта @studychain зависит от вас -
каждый голос и репост важен!
Спасибо!


Comments 30


Очень хороший материал - всё четко и понятно. Спасибо за прекрасный урок! Ушел смотреть домашку

08.09.2017 14:08
0

Как-то странно давать ссылку на материал, который на Хабре имеет отрицательный рейтинг.

08.09.2017 14:23
0

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

08.09.2017 15:01
0

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

08.09.2017 15:15
0

НЕ толпа развивает науку, а личности, мнение которых часто не совпадает с мением толпы

10.09.2017 14:14
0

Толпа состоит из личностей

10.09.2017 14:34
0

хорошо сказано

10.09.2017 15:53
0

нет, личности стоят во главе толпы, но НИКОГДА не будут ее частью. У них есть собственное мнение ,а у толпы его нет.

10.09.2017 18:40
0

Вы высокомерны. Это может сыграть с вами плохую шутку и поставить вас в неловкое положение

10.09.2017 21:02
0

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

10.09.2017 21:59
0

LHC, LIGO, Fermilab

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

10.09.2017 22:02
0

делает, ибо более 50% подписчиков делают это из-за стадного рефлекса. Один побежал- все побежали

11.09.2017 14:43
0

Боюсь, никаких доказательств кроме голых слов у вас для этого утверждения нет

11.09.2017 18:28
0

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

11.09.2017 20:30
0

Интонация вашего ответа лишь подтверждает, что я прав

12.09.2017 06:39
0

ваши домыслы

12.09.2017 06:41
0

Скорее впечатление. Но подскажу. Адекватным ответом будет ссылка на надёжное исследование. Тем более если вы о психологии заговорили так, будто хорошо её знаете.

12.09.2017 06:43
0

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

12.09.2017 16:44
0

Вот вы вроде пытаетесь вести себя умно, а получается почему-то плохо. Известное имя это что и есть ваша конкретика? Пффф

12.09.2017 19:36
0

http://inexpl.ru/psyhol/page17.html как минимум. Хотя, это общеизвестные факты.

12.09.2017 15:14
0

ну а имена Гюстав Лебон, Вильфред Троттер, Габриель Тард, Зигмунд Фрейд, Элиас Канетти надеюсь вам и без меня что-то говорят.

12.09.2017 15:16
0

Да я уже понял, что ничего конкретного вы привести не можете.

12.09.2017 16:33
0

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

08.09.2017 14:36
0

Я пишу о вещах, который неоднократно помогали мне на практике решать самые разные задачи. К сожалению, у меня не получилось понять, в какой именно отрасли вы работаете, очень может быть, что в рамках вашей сферы деятельности вы и правы. Просто задумайтесь на секунду над тем, что очень многие из разработчиков в жизни не видели такого чуда, как "системный аналитик". Мне вот приходилось несколько раз работать над проектами, где у нас были BA, а вот ваших коллег встречать пока не доводилось :)

08.09.2017 15:18
0

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

текст написан отлично! ссылка на лурк - зачОт)) правда, не у всех откроется...

09.09.2017 21:23
0

очень классно написано, доступно и (вроде как) понятно. Объем, конечно... огромный )

10.09.2017 15:52
0

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

10.09.2017 19:46
0

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

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

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

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

10.09.2017 19:57
0

Уррраааааааа!!!!!!!

10.09.2017 20:53
0