Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
sc-programming
7 лет назад

[ЗАНЯТИЕ 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 зависит от вас -
каждый голос и репост важен!
Спасибо!

8
84.822 GOLOS
На Golos с August 2017
Комментарии (30)
Сортировать по:
Сначала старые