НЛ-Программирование (1) Пять шагов программы

Периодически на меня находит желание поисследовать, откуда есть-пошло НЛП. Этакая психолого-историческая археология. Вслед за А. Ткачёвым я придерживаюсь точки зрения, что само название «нейро-лингвистическое программирование» имеет не случайное происхождение (как это последовательно утверждает Дж. Гриндер) а намеренное, и несёт в себе пресуппозиции работы самого метода, притом, это название следует понимать буквально.

На страницах журнала Метапракик мы уже разбирали термин «нейро-лингвистический». Как мы знаем, пришёл он из работы Альфреда Коржибского «Наука и психическое здоровье». С истоками термина «программирование» ясно не до конца. Во-первых, математическое образование Ричарда Бэндлера. Во-вторых, влияние известного (и гремевшего на всю Америку) тогда Эрика Берна. В книге, в которой его идеи получали максимальное развитие («What do you say after you say hello», в русском переводе «Люди, которые играют в игры»), мы встречаем термин «родительское программирование», parental programming. На мой взгляд, создатели НЛП успешно, вполне по-эриксониански использовали (utilized) идеи Берна и их известность, в частности, придали техническое содержание его термину «программирование».

У меня нет технического образования, на уроках информатики мы лишь учились печатать на клавиатуре и играть в немудрёные игрушки. К вопросу, что такое «программирование» я решил подойти по-эриксоновски: я бы не хотел, чтобы это знание было испорчено несовершенным знанием другого человека. Это совпало с моим интересом к компьютерным железкам, в частности к Arduino. Я подобрал для себя книгу Джека Пёрдэма “Beginning C for Arduino”. Во-первых, она интересна тем, что автор довольно много (и на уровне для самых начинающих) пишет о самом устройстве железок, о том, как именно связываются, соотносятся друг с другом код программы и работа непосредственно микроконтроллера (процессора). Во-вторых, сам автор стар, и в этой отрасли он очень давно, текст его учебника несёт печать старой доброй классики родом из 70-х годов прошлого века. И когда я прочитал одну главу из его книги, моё бессознательное очень чутко отреагировало на неё: «Вот-вот, это важная аналогия, не пропусти!» А потом я подумал, что понимание программирования Ричарда Бэндлера (70-х годов) и автора данной книги может быть схоже. И понял: надо перевести. Выношу на ваш суд: читайте, проводите аналогии, думайте.

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

Пять шагов программы

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

Неверный ход.

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

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

Простой факт состоит в том, что любая программа, о которой только можно подумать, может быть сведена к пяти простым элементам, или шагам. Когда вы начинаете разрабатывать решение задачи по программированию, вы должны думать о программе в терминах 5 шагов: 1) Инициализация, 2) Ввод, 3) Обработка, 4) Вывод, 5) Завершение. Давайте рассмотрим эти шаги немного подробнее.

1. Инициализация (Initialization)

Задача шага Инициализации — установить окружение, в котором программа будет запускаться. Например, если когда-нибудь запускали Microsoft Excel, Word или подобные программы, вкладка Файл обычно предлагает список недавно открытых файлов, интернет-браузеры позволяют выбрать стартовую страницу. Программа для вывода на печать обычно инициализирует принтер, который используется по умолчанию. Программа для работы с базами данных устанавливает сетевое подключение.

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

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

2. Ввод (Input)

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

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

3. Обработка (Processing)

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

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

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

4. Вывод (Output)

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

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

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

5. Завершение (Termination)

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

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

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

Назначение пяти шагов программы

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

Большая ошибка.

Даже одного или два утверждения на каждый из пяти шагов программы, вероятно, будет достаточно, чтобы вы приступили к проектированию и кодированию программы. Алгоритм есть не более, чем формальная запись того, как манипулировать введённой информацией, чтобы получить желаемый результат. Алгоритм подобен рецепту или набору чертежей: он описывает, что вам нужно сделать, чтобы достичь желаемого результата. Ровно то же и с программированием: пять шагов программы можно использовать для формулирования плана по решению задачи программирования. Несмотря на то, что алгоритмы больше связаны с шагами 2 и 3 (т. е. Ввод и Обработка), пять шагов программы должны помочь вам сформулировать алгоритм для решения той или иной задачи.

Боритесь со стремлением «выглядеть занятыми», просто набивая код на клавиатуре без проекта программы, основанного на пяти шагах. Создание проекта программы может казаться очень трудозатратным, но, поверьте, вы сэкономите массу времени в дальнейшем. (Кто придумал фразу про «массу времени»? Неужели время — это то, где находятся бозоны Хиггса?)

Tags: , , , ,

Leave a Reply