Сегодня мы публикуем историю перехода в IT Андрея Вуколова. Детское увлечение космосом когда-то привело его на ракетостроение в МГТУ. Суровая реальность заставила забыть о мечте, но все обернулось еще интереснее. Изучение C++ и Python позволило заниматься не менее увлекательной работой: программированием логики систем управления роботами.
Начало
Мне повезло все детство бредить космосом. Поэтому после школы я ни минуты не сомневался, куда мне пойти учиться, и поступил в МГТУ им. Баумана, на кафедру ракетного двигателестроения. Впрочем, саму ветвь курса — пороховые или жидкостные двигатели космических ракет — выбирать вообще не приходилось: по целевым группам абитуриентов в 2001 году еще распределяла специальная факультетская комиссия. Я попал «в бочку с порохом».
На тот момент «ракетный бум» существовал только в планах, инженеры получали мизерные зарплаты и работали в специальных закрытых КБ и НИИ практически без перспектив карьерного и профессионального роста. Все-таки, пороховые ракеты в России — продукция сугубо военная.
Сейчас это направление востребовано, но уже во время учебы я понял, что в ракетостроении почти невозможна любая деятельность по собственной инициативе. Фактически, это военная служба. Например, работая в ракетной отрасли, я был бы полностью лишен возможности самостоятельно разрабатывать ПО, даже для себя, так как эта деятельность строго регламентируется.
Все программные продукты разрабатываются исключительно по спецзаказу и с утверждением комиссии по секретности (теперь это подразделение ФСТЭК). Разработчик там обязан регистрировать и лицензировать буквально каждую строчку кода. Все ПО изначально является секретным на уровне задач. Отчасти это объясняет, почему ПО, используемое сейчас для обучения студентов-ракетостроителей, разработано максимум в 90-е годы ХХ века.
К моменту окончания института я успел поработать на кафедре теории механизмов и приступить к разработке учебного симулятора техпроцесса на С++, так что имел пример для сравнения, и мог взвешивать все «за» и «против». Выбор был очевиден, и я понемногу начал дрейфовать в сторону IT и робототехники. В прикладной механике было куда веселее, чем в ракетостроении: много нерешенных задач, открытая среда, отсутствие индустрии разработки, острая нужда в ПО для имитационного моделирования. В робототехнике — неустоявшаяся архитектура распространенного ПО и необходимость многократно реализовывать сложные алгоритмы, в том числе, нечеткую логику и зачатки ИИ. Поэтому после своих первых программ для обработки экспериментальных данных, я уже почти не возвращался к ракетам (за исключением дипломного проекта).
В итоге, по специальности довелось проработать всего лишь четыре месяца перед дипломом на подмосковном заводе композитных конструкций для аэрокосмической отрасли. По окончании обучения работу даже не пришлось искать — сразу пришел преподавать прикладную механику на робототехнический факультет.
От преподавания к программированию
На Всемирном конгрессе IFTOMM со студентами — членами исследовательской группы (я справа)
В МГТУ на пробототехническом факультете я проработал 10 лет, читал курс теории механизмов. Публиковал научные работы (см. в конце статьи), постепенно двигался из механики в сторону САПР и робототехники. И в конце концов принял решение оставить преподавательскую деятельность. Чтобы наиболее ярко проиллюстрировать причины такого решения, скажу, что за десяток лет читаемый мной курс обучения не изменился ни на запятую. Хотя прикладная механика, судя по публикациям, шла вперед весьма и весьма успешно.
К тому же, работа все больше напоминала чиновничью — отчеты, программы, стандарты и тонны бумаги. В таких условиях удовольствие от преподавательской деятельности оказалось заменено отчетностью о получении этого удовольствия, а это для практикующего специалиста более чем неприятно.
А окончательно в робототехнику я пришел так: в 2007-2009 годах совместно с профессорами А. Головиным и Н. Умновым мы начали готовить первые научные работы. Там мне пришлось использовать алгоритмы для определения траекторий движения объектов по стробоскопической фотографии. От этой темы — один шаг до машинного зрения, OpenCV и Robotic Operating System (правда, тогда я даже не помышлял о таких масштабах). После этого я уже окончательно сосредоточился на прикладной механике и робототехнике в исследованиях, а разработка стала вспомогательной деятельностью.
Однако для поиска новой работы в робототехнике необходимо было совершенствовать и дополнить мои знания в программировании. Ведь специально IT, кроме годового университетского курса (ObjectPascal и Borland VCL на C++) нигде не изучал, в теоретических аспектах разработки полагался на математику.
Сначала рассматривал варианты очных курсов в родном институте. Правда, очень быстро выяснилось, что совмещать такую учебу с работой на кафедре будет практически невозможно из-за рваного графика и частой работы вне собственного расписания (замены и т.п.). Так постепенно пришел к идее окончить платные курсы удаленно. На GeekBrains вышел по рекомендации профессоров из учебного центра «Технопарк Mail.ru», расположенного в Бауманке, и поступил на курс «Программист Python».
Курсы затруднений не вызвали, одна проблема — постоянно приходилось совмещать: с работой на кафедре, научными трудами и мероприятиями. Времени не хватало так сильно, что пришлось пожертвовать (к счастью, временно) большинством социальных связей вне дома.
Справлялся с нагрузками так: решал задачи в дороге. Этот навык, развитый многочисленными командировками, оказался очень полезен, так как без него я даже не смог бы выполнить все домашние задания (а еще он заменяет медитацию…). Я приучился программировать в пути, используя ноутбук, смартфон и беспроводные клавиатуры для смартфона.
Ноутбук у меня Dell Latitude 3470, а смартфон подойдет любой с диагональю от 5.5 дюймов в паре с клавиатурой Logitech K 810 BT. Вообще всем рекомендую продукцию Logitech, она очень надежная и переносит весьма суровые условия использования (и это ни разу не реклама).
Клавиатура Logitech K810
Python к такой работе очень располагает — при наличии хорошего редактора. Еще один лайфхак, касающийся программирования: использовать удаленные подключения к рабочему столу или среде исполнения. Несколько заданий я выполнил, используя защищенный веб-сервер с запущенным Django на домашнем компьютере. Работал при этом из поезда, программное обеспечение использовал PyDroid, DroidEdit, Maxima.
Почему именно Python?
Совсем недолго я пытался использовать PHP как системный скриптовый язык. Python изначально самостоятельно и понемногу изучал «для себя». Учить всерьез решил после того, как узнал о существовании эффективной связки между Python и C++ на уровне модулей — показалось интересным разделить между собой оптимизированные алгоритмы и процедуры подготовки данных в рамках одного языка.
Самый простой пример: есть система управления нестандартным мощным приводом, реализованная на встраиваемой машине с RISC-процессором, на С++. Управление идет через внешний машинно-зависимый API, поддерживающий, например, связь между подсистемами по сети. На высоком уровне алгоритм работы привода не отлажен, либо не постоянен (нужна загрузка различных алгоритмов в зависимости от рабочего процесса).
Один из лучших способов получить такую систему — использовать машинно-специфичный API С++-подсистемы в качестве основы набора классов Python, использующихся на кроссплатформенном интерпретаторе. Таким образом, у разработчика верхнего уровня не возникнет необходимости учитывать особенности встраиваемой машины и ее ОС, он просто будет работать с классами Python, которые выступают «обертками» низкоуровневого API.
Мне пришлось практически с нуля изучить связывание С++ и Python. Быстро пришло понимание того, что объектно-ориентированные возможности на высоком уровне гораздо важнее, чем на низком. Из-за этого пришлось полностью изменить подход к проектированию и реализации API, сделав выбор в пользу классов на уровне Python и разделяемых глобальных данных на С/С++. Привыкнуть к кодогенерации: например, фреймворк ROS сам генерирует имена и объекты на Python, так что приходится учитывать различия языков, особенно в типизации, проектируя свои интерфейсы.
Работа в настоящем: Python и логика систем управления роботами
Теперь я работаю программистом на Python и C++ в научно-учебном центре «Робототехника» при МГТУ. Мы реализуем научно-исследовательские проекты и софтовый инструментарий по заказу государственных ведомств: разрабатываем манипуляторы с встроенными системами технического зрения и высокоуровневые алгоритмы автоматического управления, независимые от систем.
Сейчас я программирую на Python высокоуровневую логику систем управления роботами, этот язык связывает между собой высокооптимизированные модули, написанные на C++, ассемблере и Go.
В программировании алгоритмов управления роботами используются две больших группы алгоритмов. Первая из них реализуется непосредственно на оборудовании, на низком уровне — это встроенное ПО контроллеров привода, концентраторов линий связи, подсистем взаимодействия с оператором.
Алгоритмы здесь проектируются в расчете на контролируемую скорость исполнения и надежность, превышающую показатели робота в целом. Последнее обязательно, так как от ПО низкоуровневого управления зависит безопасность всей системы.
Вторая группа алгоритмов определяет работу робота в целом. Это высокоуровневые программы, акцент в разработке которых делается на понятность и быстроту реализации алгоритма, зачастую, достаточно сложного. Кроме того, высокоуровневое ПО на роботе очень часто подвергается изменению в процессе наладки и тестирования. Для такой разработки незаменимы интерпретируемые языки общего назначения.
Какие знания нужны для подобной работы
Обязательным будет изучение языка шаблонов C++, объектно-ориентированных возможностей Python. Практически незаменимый навык — умение проектировать и документировать API. Не лишним будет изучить возможности специализированных библиотек, вроде Boost::Python. Тем, кто работает с низкоуровневым ПО, обязательно придется столкнуться с многопоточностью (причем, на уровне ядра), системными вызовами Linux/UNIX/QNX. Чтобы подтянуть понимание принципов построения робототехники очень полезно ознакомиться с фреймворком Robotic Operating System.
Я стараюсь иметь в активе как минимум один компилирующий и один интерпретируемый язык программирования, развивающийся и востребованный. Это выигрышная стратегия для работы в инженерии, где постоянно требуется разрабатывать узкоспециализированные (читай: необычные) алгоритмы и реализовывать их на компилирующих языках. Задачу же подготовки данных для такого ПО гораздо приятнее решать, используя интерпретируемые языки. Изначально в мой набор входили С++, Pascal и BASIC, позже добавились PHP и BASH.
Как инструменты разработки могут пригодится в обучении студентов
Основной план на профессиональное развитие сейчас — попытаться подвести научную базу под применение инструментов профессиональной разработки ПО в педагогике, разработать и испытать методику преподавания.
С 2016 года я начал большой эксперимент по внедрению инструментов разработки — языков программирования, IDE, генераторов документации, систем контроля версий — в педагогическую практику в высшей школе. Сейчас уже удалось получить результаты, поддающиеся качественному обобщению.
Например, введение версионирования материалов в учебный процесс существенно повышает качество студенческих работ, однако, только при обязательном условии: совместной работе студентов над разделяемыми проектами. Разработка методики преподавания технических дисциплин с применением инструментов профессиональной разработки ПО сейчас активно ведется силами моей исследовательской группы, состоящей из студентов, абитуриентов и слушателей программ дополнительного образования МГТУ.
Преподавательскую практику я, кстати, не оставил — разработал авторский углубленный очный курс по устройству и администрированию Linux для института повышения квалификации МГТУ, и сам преподаю.
Научные работы
Ранние работы
Вопросы планирования походки при проектировании четырехногих шагающих систем на примере реализации лошадью аллюра (2010 г.)
Из последнего
3D-приложение для моделирования производства зубчатых колес для обучения теории механизмов и машин (2019 г.)
Метод распознавания структурных препятствий и его применение при поиске объектов рельефа (2018 г.)
Другие работы, индексируемые базами научного цитирования, можно увидеть в моем профиле на ResearchGate. Большинство статей посвящено движению машин, есть работы по инженерной педагогике и учебному ПО.
Автор: mary_arti