Плох тот работник, который не мечтает овладеть средствами производства, как сказал один из классиков. Но не все понимают толк в том, что такое средства производства. А они, между прочим, существуют не только в виде тракторов, комбайнов и автомобилей.
(С) Балабоба, искусственный интеллект Яндкса.
После того как я немного освоился с командной строкой Linux и заимел собственный виртуальный сервер в Интернете, возник вопрос куда двигаться дальше?
На самом деле Linux - это универсальная площадка для работников многих направлений умственного труда, от близких непосредственно к сфере информационных технологий (ИТ) до таких прикладных вещей как графика, дизайн, инженерия, менеджмент, медицина, лингвистика и т.д. Нельзя объять необъятное, поэтому нужно определиться с целью обучения и составить план освоения непосредственно необходимых для её достижения тем.
Для меня такой целью является стать компетентным разработчиком решений на стыке мобильных технологий, интернета вещей (IoT) и инженерии встраиваемых систем (Ebedded Systems). Результатами деятельности в этой области, на мой взгляд, могут быть:
- программы, взаимодействующие с пользователем, как правило выполняемые на клиентских устройствах (сфера разработки, имеющая общее название "Frontend");
- программы, реализующие внутреннюю логику обработки данных, зачастую выполняемые на стороне сервера (сфера, называемая "Backend");
- схемы и чертежи устройств, реализующих аппаратную часть системы ("Hardware development");
- макеты и прототипы устройств ("Prototype development")
Отсюда можно в первом приближении очертить круг необходимых знаний и предполагаемых средств производства. Для этого можно обратиться к программам курсов по соответствующим направлениям. К примеру на Яндекс.практикум.
Вот что там предполагается изучать в рамках курса Frontend разработки:
- HTML; CSS; Flexbox;
- Git; BASH; JavaScript;
- TypeScript; React; Redux;
- Grid Layout; DOM; Webpack;
- React Router; ООП;
С направлением Backend-разработки всё немного сложнее - там значительно больше технологий и языков программирования. Вот что, например, предполагается изучить в рамках курса от GeekBrains:
- Базовые алгоритмы программирования;
- Введение в контроль версий;
- Знакомство с языком программирования C#;
- Веб-технологии и основы бэкенда (PHP, MySQL, JSON, XML);
- Знакомство с языком Python;
- Фреймворки Flask, FastAPI, Django;
- Базы данных и SQL.
А вот что предлагает более специализированный курс этого направления от Яндекс.практикум:
- Python; Django;
- GitHub; Bash;
- SQL; PostgreSQL;
- Nginx; Gunicorn;
- Docker; Docker Hub
С мобильной разработкой сейчас имеется две основные ветви: iOS- разработчик (ориентированный на пользователей устройств Apple iPhone) и Android (для устройств под управлением Google Android).
В частности направление Android охватывает такие темы как:
- Java;
- Kotlin;
- UI и хранение данных;
- Сеть (HTTP, REST API и Retrofit);
- Хранение данных (SharedPreferences);
- Многопоточность;
- Архитектура (ООП+SOLID, рефакторинг и MVVM);
- DI, принципы и библиотеки;
- Продвинутая навигация (RxJava);
- Продуктовая и командная разработка (MVP, Agile, Git, декомпозиция задач)
Направление iPhone я могу сразу отбросить поскольку не являюсь его пользователем и не планирую. Но в поле зрения думаю стоит держать отечественную мобильную платформу Аврора, мало-ли куда нас заведёт прогресс в ближайшее время.
По встраиваемым системам курсы найти сложнее, но компиляция из разрозненных источников представляет следующее:
- Определение аппаратных, и программных компонентов встраиваемых систем;
- Основы программирования на C;
- Знакомство с системами сборки (GCC и GNU Make);
- Базовые концепции Ebedded-разработки: типы памяти, сегменты и управление;
- Интерфейс C-программ с ARM ядром микроконтроллера;
- Ядро микроконтроллера ARM;
- Манипуляции с памятью (прошивка, манипуляции битовыми полями, использование указателей, таблиц регистров, векторов прерываний, отладка);
- Разработка встраиваемых структур данных(перечисления, союзы, битовые поля, стеки, связанные списки, кольцевой буфер);
- Периферийные модули микроконтроллеров (Timer, DMA, ADC, DAC, USB, Ethernet);
- Проблемы и концепции систем реального времени (Linux POSIX, RTOS, MFE);
- Теория качества обслуживания (кривые полезности, политика монотонного планирования скорости, стандарты абсолютного времени);
- Планирование и концепция предоставления услуг в режиме реального времени;
- Обзор аппаратных архитектур реального времени и стеков программного обеспечения (варианты RTOS и ОС с расширениями реального времени POSIX);
- Системное программирования Linux и введение в Buildroot (процессы и потоки, создание пользовательского ядра Linux и корневой файловой системы для встраиваемого устройства);
- Основы разработки ядра Linux и введение в Yocto Project (создание пользовательских драйверов и образов встраиваемых устройств);
- Проектирование критически важных систем, работающих в режиме реального времени(использование защищённых кодов, методы конструирования с резервированием, перекрёстной привязкой и восстановлением);
- Базовые понятия о программируемой логике (FPGA, CPLD, ASSP и ASIC);
- Инструменты разработки FPGA (Quartus Prime, RTL Viewer, ModelSim, TimeQuest);
- Архитектура FPGA на базе SRAM, FLASH, Anti-fuse (от базовой логической ячейки ядра до сложных блоков IP);
- Проектирование FPGA-устройств с использованием инструментов схемотехнической разработки и запуск их на платах демонстрационных платах;
- Введение в машинное обучение (основные понятия включая логистическую регрессию, многослойный персептрон, глубокое обучение и простые модели);
- Основы обучения модели (минимизация математической функции, методы проверки и оптимизации, практическое применение стохастического градиентного спуска);
- Анализ изображений с помощью свёрточных нейронных сетей (обучение модели, тонкая настройка, интуиция, концептуальное понимание);
- Введение в обработку естественного языка (концепция встраивания слов, рекуррентные нейронные сети, модели долговременной и кратковременной памяти).
И, наконец, IoT. По нему имеется больше предложений, включая курс от GeekBrains, на котором обещают рассказать следующее:
- Введение в программирование (базовые алгоритмы и структуры данных, сложность и стоимость);
- Введение в контроль версий;
- Знакомство с базами данных;
- Компьютерные сети (Ethernet, IP, VLAN, UDP и TCP, VPN, HTTP, DNS);
- Знакомство с языком программирования C# (функции, двумерные массивы, рекурсия,связанный список, дерево и хэш-таблица);
- Введение в IoT (архитектура, датчики и телеметрия, платформы, технологии связи);
- Программирование на C (типы данных, ветвления, циклы, функции, указатели, массивы, файлы, препроцессор и отладка, динамические типы, библиотеки, оптимизация, компиляция);
- Особенности C для IoT;
- Распределённые системы и сети (типы, параметры, Mesh-сети);
- Продвинутый контроль версий (удалённые репозитории, изменения, инструменты работы с Git);
- Linux и виртуализация (работа в терминале, сетевые возможности, веб-сервер, основы Docker, скрипты Bash);
- Контейниризация (механизмы пространства и контрольных групп, Dockerfile, Docker Compose и Docker Swarm);
- Парадигмы программирования и языки парадигм (структурное, ООП, декларативное, функциональное, логическое).
Также на Хабре имеется "Открытый курс молодого бойца по Интернету вещей":
https://habr.com/ru/companies/samsung/articles/560130/
Что же касается Hardware and Prototype development, здесь дело, скорее всего не обойдётся без освоения каких-нибудь систем автоматизированного проектирования (САПР), обзор наличия которых для пользователей Linux я оставлю на на будущее.
Подводя итог сему обзору могу сделать следующие предварительные выводы. Даже эта "суженная" задача похожа на "необъятную". Хотя, при наличии достаточного свободного времени и финансовых средств, прохождение всех вышеупомянутых программ займет примерно 3-4 года регулярных трудов.
Преимущество самообразования заключается в том, что нет необходимости строго следовать кем-то разработанным программам. Поэтому я рассчитываю за счёт выделения ключевых для себя вещей построить собственную систему знаний по интересующим меня темам до конца этого года. Чтобы в 2024 году начать уже практически полезную деятельность. Узловые моменты этого процесса будут фиксироваться на этом канале, так что, кому это тоже интересно - не переключайтесь, как говорят у нас на телевидении.