
С чего начать?
Что можно ответить ребенку младше 18 лет или даже взрослому, у которого появилось желание стать программистом? Может сложиться впечатление, что стать программистом нетрудно и потом можно работать через Интернет и неплохо зарабатывать. К сожалению, подростки, да и взрослые, имея доступ в Интернет попадают под заблуждение, что «в Интернет всё есть», что нужно только «скачать» или «посмотреть курсы». Это верно только отчасти. Да, много (если не большинство) компаний работают распределенно, используя Интернет как связующее звено между сотрудниками и офисами по всему миру. Интернет также соединяет на различных площадках заказчиков и исполнителей. Однако в мире разработки программного обеспечения (ПО) также существует безработица, хоть и обычно меньше, чем в других отраслях; есть трудные боссы и нечистоплотные заказчики. Но самое трудное для школьника или взрослого, решившегося на переквалификацию, обычно является объем знаний и навыков, требуемые для этой работы.
Что можно посоветовать? Для начала скажу банальные вещи, так как все коллеги согласились, что я не дружу с головой, если бы я сказал, что-то типа «прочитай вон ту книжку и станешь классным программистом». Я попробую в одном предложении, ниже по тексту будут подробности. Итак обязательны: пытливый ум и усидчивость, математическая подготовка, разговорный английский, знание самих вычислительных систем, фундаментальные знания алгоритмов, операционных систем и сетей передачи данных, владение 1-2 компьютерными языками — это тот минимум, который дается в 4-х летнем колледже или институте, который поможет приблизиться к цели — стать востребованным инженером-программистом. Такой инженер — программист не побоится пойти на интервью в Amazon, Google, Microsoft или Яндекс и кто-то с третьего-десятого (справедливо) жесткого интервью туда даже попадет работать. Возможно кто-то будет работать не на гигантов индустрии ПО и Интернет, но тоже со временем найдет интересную работу. Если Вы дойдя до этого момента расстроились, то это только потому, что такова реальность. Подготовка занимает годы. Чтобы понять, о чем я пишу, нужно видеть ситуацию как она есть, без «розовых очков». Далее подробно, почему всё именно так.
Юзаем термины
Разберемся для начала с терминами и специальностями. В ИТ сфере, связанной с программный обеспечением, существуют много специальностей, узкопрофильных областей, в принципе это так же, как в медицине или авиастроении. К примеру, в ИТ есть системные инженеры, которые в основном не пишут программный код, но тем не им также необходима подготовка по нескольким дисциплинам, а крупные компании часто дополнительно требуют сертификацию специалиста по одной или нескольким технологиям. В области сопровождения (администрирования) существуют и менее квалифицированные специалисты, в основном это сотрудники технической поддержки (support или даже «эникейщики»), которые находятся в подчинении менеджеров или системных инженеров. Для простоты далее мы назовем эти роли «инженерная» и «не инженерная». Я опущу область инженеров — системотехников и менее квалифицированных «ремонтников» компьютерной техники, так как эти специальности не являются целью статьи.
По примеру сопровождения информационных систем, собственно процесс разработки, выпуска и поддержки любого программного обеспечения требует как глубокой инженерной подготовки, так и работу тех, кто будет выполнять не инженерную (простую, с точки зрения инженера) работу. Например, существует технология обеспечения качества программного обеспечения (QA) или в более узком смысле тестирования ПО, в этой области требуется знать определенные процессы и технологии; также существует область разработки интерфейсов пользователя (UI), есть работа по верстке HTML страниц для Интернет сайтов. Есть кодировщики, которые знают какой-то язык программирования и не более. Такие не инженерные специальности можно освоить с помощью различных курсов, они могуть стать отправной точкой для будущей, возможно, более общей специализации. Это путь роста «снизу → вверх» из «компьютерщика» / UI-щика / кодировщика далее в инженеры — программисты, который, в свою очередь, обязательно потребует на определенном этапе получения знаний из области инженерии ПО. Рассмотрим, что такого особого в этой инженерии программного обеспечения.
К чему стремится
В инженерии программного обеспечения требуется владеть необходимым минимумом знаний. Хочу заметить, что это не какие-то тайные знания, нет, причина в том, что несмотря на множество специализаций, появляющиеся новые технологии и веяния моды (хайпа), инженеры — программисты (software development engineers) прежде всего инженеры. Они смогут понимать язык и работу инженера, кто-то захочет расти по карьерной леснице как менеджеры продукта, архитекторы ПО, тех.директора. Но это возможно только имея знание и понимание, чем занимаются их коллеги и подчиненные. Также на рынке freelance они смогут взяться за «денежный» заказ, который придется «не по зубам» низкоквалифицированным фрилансерам из стран треьего мира, готовым «за еду» продать свою вчерашнюю поделку.
Тогда где и как учиться? Ситуация в России в последние два деятилетия, начиная со школьного и кончая ВУЗами несколько в кризисе. Достаточно сравнить количество и качество научных публикаций в разных странах, чтобы понять, что наука развитых стран и Китая уже обошла науку в РФ, вспомним, например, кто разработал и продвигает стандарт связи 5G. Видя это, компании Яндекс и Mail.ru уже конкурируют с ВУЗами за студентов, так как им удобнее и качественее самим подготовить «под себя» своих будущих сотрудников. Хотя надо отдать должное ведущим школам, которые выживают несмотря на размер всепоглащающего госбюджета «безопасности». В большем выйгрыше выглядят ВУЗы США, Великобритании, Германии, так как в их программах вообще нет того откровенного хлама, который не нужен инженерам — программистам. Да, в таких ВУЗах и колледжах не учат философии, культурологии и истории. Зато уже на втором — третьем курсе студенты получают знания и навыки, которые дают им работу.
Можно ли все освоить самостоятельно, чтобы стать инженером-программистом? Теоретически да. Если есть достаточно много времени и средств — ведь нужно обеспечить себя во время учебы в течении 2-5 лет, то можно успешно учиться самостоятельно. Придется запастись хорошими учебниками и найти либо преподавателей, либо опытных наставников, которые будут направлять весь процесс. Какие предметы / учебники осваивать? В общем это основные дисциплины, которые преподают в техническом коледже или ВУЗе:
- Разговорный английский. Именно с упором на «разговорный». Критически важно. Требуется не просто «читать и переводить со словарем», а именно достаточно свободно общаться, в том числе с коллегами. Без этого пункта закрыты большинство путей и возможностей в принципе.
- Разделы высшей математики для ВУЗов: множества, функции, математический анализ, желательно теория вероятностей. Пространственная геометрия если требуется (для 3D моделирования или игр).
- Устройство современных микропроцессоров. Критически важно. Не нужно учить микрокод популярных процессоров, достаточно знать и понимать каждый компонент микропроцессора и связанных с ним аппаратных элементов.
- Современные вычислительные системы и параллельное программирование. Критически важно. Знать устройство многопроцессорных систем, процессы, потоки, знание и понимание общих для всех многопоточных систем проблем, такие как «мертвая блокировка», состояние гонки, отсутствие блокировок.
- Информатика: алгоритмы и структуры данных, блок-схемы. Критически важно. Тут нужно выучить очень много и обязательно с лабораторными работами: алгоритмы поиска и сортировки, теория графов. Нужно понимать большое «О», сложность алгоритмов. Важно понимать баланс память — скорость. Без этого нечего делать в инженерах.
- Современные операционные системы и системное программное обеспечение. Критически важно. Знать их устройство и понимать как программист взаимодействует с ними, лабораторные обязательно! Нужно знать и понимать как минимум устройство Unix (и похожие на них Linux, MacOS) и Windows. Android и iOS в мобильном мире растут от мира Unix, так что без Unix-подобных операционных систем никак.
- Компиляторы и интерпретаторы. Критически важно. Обязательно погрузиться в язык С и сделать несколько лабораторных работ с операционными системами (выше). Важно понимать работу препроцессора компилятора, этапы компиляции и компоновки. Разобратья как работают интерпретаторы на примере Python или JavaScript. Дальнейшее развитие зависит от изучающего, как минимум один из них: C++17, Rust, Dart, Go, Java. Я не говорю, что после изучения именно этих языков программирования можно стать инженером — программистом, я говорю о минимуме знаний. На этом этапе пригодятся знания об устройстве операционнах систем и взаимодействие с ними.
- Криптография и защита данных. Важно. Хэширование, симметричное и ассиметричное шифрование, современные реализации шифрования в сети Интернет. Вот тут и пригодится математика.
- Сети передачи данных и Интернет. Критически важно. Устройство сетей, виды протоколов, лабораторные работы, например многопоточный UDP и TCP сервер и клиент. Тут уже нужны все знания до этого пункта.
- Современные реляционные и нереляционные базы данных. Важно. Лабораторные обязательно! Важен практический опыт с SQL и NoSQL языками, их DDL, DML и так далее. Пригодится теория множеств.
Это и есть те самые знания, которые приближают человека к инженерии программного обеспечения. Для дальнейшего развития придется осваивать архитектурные шаблоны и паттерны программирования, а в зависимости от специализации еще и дюжину нужных инструментов: IDE, git, CASE, Bash, openssl, «облачные» сервисы…. Гораздо надежнее отыскать не поверхностные курсы по каким-то технологиям, а систематизирующие знания качественные ВУЗовские учебники, а потом, осваивая науку по учебникам, заведя тетрадки по предметам и делая лабораторки, подсматривать непонятную информацию в Интернет. Курсы хороши тогда, когда они полностью покрывают конкретную востребованную область инженерии или являются дополнением к учебнику.
Мне стало любопытно, какие же существую в 2020 году на русском языке учебники и справочники, которые помогут в самостоятельном обучении будущему инженеру — программисту. Попробую проанализировать. Также в будущем я в общих чертах хотел бы описать какие технологии потребуются при специализации в каждой области:
- разработка ПО для предприятий
- разработка Интернет сервисов
- создание коммерческих продуктов
- мобильная разработка для iOS и Android.
To be continued…
Автор Олег Хальзов
http://ohalzov.blogspot.com/2020/05/blog-post.html