Отклики на статью “Легких путей не будет”, написанную ровно 10 лет назад, приходят и до сего дня. Та заметка, опубликованная в период общероссийского финансового кризиса, была посвящена навыкам, которыми должен владеть разработчик в условиях ухудшения ситуации на рынке труда. Сегодняшняя ситуация немного напоминает обстановку тех дней — так давайте посмотрим, многое ли изменилось за это время в программистской отрасли?
В 1998-м предлагалось хорошо изучить следующие области: объектно-ориентированное программирование (ООП), API Windows 98/NT и DirectX, MS Office + Visual Basic for Applications (VBA), хотя бы один распространенный язык программирования третьего поколения (Си, С++, Паскаль, Бейсик, Java) и соответствующие среды разработки (Microsoft Visual Studio, Borland Delphi), принципы построения Web-узлов, работы клиент-серверной и трехзвенной архитектур, SQL, “тяжелую” СУБД, HTML, сетевые технологии, Интернет и протокол TCP/IP, Unix и технологии построения распределенных и компонентных приложений. Для приобретения прикладных навыков HTML-верстки полезно было создать веб-страничку на бесплатном хостинге. Неплохо по возможности разобраться в конкретной предметной области (прежде всего бухгалтерский и управленческий учет), в принципах построения интерпретаторов и трансляторов и не забыть про тренировочные задачки по математике.
Некоторые читатели удивлялись — дескать, все это изучить сложно даже за год. Да, сложно, и не только за год, но и за пять, и за десять лет, как показывает практика, соответствующие навыки можно все время с успехом углублять, и совершенствоваться в этом процессе придется всю жизнь. Чтобы стать мастером в выбранной профессии, надо каждый день тренироваться по восемь часов на протяжении многих лет.
Изменения в требованиях к классическому программисту за истекшие годы, что интересно, произошли не очень большие. По-прежнему актуально знание ООП, API Win32 и Microsoft Visual Studio, офисного VBA-программирования и многозвенных архитектур. К ним еще добавилась платформа Microsoft .NET и язык моделирования UML, а вот некогда популярную среду Delphi, к сожалению, вытесняет открытая система Eclipse, сама по себе неплохая. Велик и продолжает расти интерес к Java, обязательно знание SQL, акцент с Unix немного сместился на Linux. Что касается языков программирования, то теперь в дополнение к С++ и Java надо бы изучить и C#. Из специализированных платформ стоит отметить “1C” как среду программирования деловых задач, а также два-три внутренних языка наиболее популярных в России крупных КИС. Желательно как минимум познакомиться с принципами создания софта для систем реального времени и встраиваемого ПО для бытовой техники и роботов.
Самый сильный прорыв произошел в сетевых технологиях. В дополнение к HTML и JavaScript веб-разработчику надо хорошо программировать на ASP.NET, PHP и Perl, уметь администрировать СУБД MySQL или ей подобную, обязательно знать XML и принципы настройки серверов Apache и IIS, веб-сервисы и всевозможные “локальные” технологии — флэш, AJAX, RSS и т. д. Отдельная быстрорастущая сфера со множеством специфических требований — телекоммуникационные проекты, программирование для конкретных аппаратных платформ, где необходимо знание ассемблера, сетевых протоколов и способов разработки драйверов. Изменения здесь происходят быстро, и стать всесторонне развитым программистом в данных областях действительно весьма сложно.
На рынке появилось множество коммерческих библиотек компонентов и заметно выросло число проектов, в которых задействован “зоопарк” технологий. Разработчику сегодня важнее уметь не столько создавать проект с нуля, сколько разбираться вместе с коллегами в десятках и сотнях тысяч строк чужого и нередко “криво” написанного кода, в котором вдобавок используются компоненты третьих фирм с неуклюжими и плохо документированными интерфейсами. Объемы проектов тоже растут, и к обязательным требованиям отнесем знание систем коллективной работы — как минимум, типовых решений для контроля версий исходных текстов.
В методологическом обеспечении процесса разработки наиболее принципиальным изменением стал рост популярности гибких подходов, а “тяжелые” модели зрелости процессов создания ПО (CMM) и качества софта (ISO) из экзотики превратились в будничную реальность (правда, немного профанированную). Agile-подходы шлифуются и оттачиваются на сложных и дорогих проектах, и особый акцент в них сегодня делается прежде всего на обеспечении сроков сдачи как ключевой проектной характеристике с возможностью серьезной модификации заказчиком требований в самый разгар работ! Такие ранее немыслимые условия в ситуации растущей конкуренции за подряды сегодня далеко не редкость. Поэтому, наверное, на собеседовании странно будет выглядеть разработчик, не понимающий базовых принципов организации проекта, его основных этапов и способов учета рисков. Впрочем, эти достаточно высокие требования ныне компенсируются и существенно возросшими зарплатами, в разы, а то и на порядок превышающими уровень 1998 г.
Из перспективных, постоянно обсуждаемых, но пока относительно слабо применяемых направлений выделяется сервисно-ориентированная архитектура и параллельное программирование для кластеров и многоядерных процессоров. С последним направлением тесно пересекается функциональное программирование, которое потихонечку развивается. Вряд ли оно займет ведущие позиции в ИТ-мире в ближайшие годы, но если брать “сингулярную” перспективу, когда появится софт, способный рассуждать на уровне человека (а произойдет это лет через 20--30), то любые сегодняшние эксперименты в сфере создания программ, способных понимать и модифицировать свои и чужие исходные тексты, могут оказаться бесценными. А делать это удобнее всего именно на функциональных языках. К тому времени будут доступны зетафлопсные ресурсы (миллион петафлопсов), которые позволят преодолеть нынешнюю медлительность логических вычислений. Пока же аналитики Intel и KurzweilAI.net предсказывают достижение экзафлопсного рубежа (тысяча петафлопсов) к концу следующего десятилетия, а один петафлопс, напомним, был достигнут в 2007 г. сетью волонтеров проекта Folding@home Стэнфордского университета, объединяющей ресурсы простаивающих компьютеров. Существенный вклад в подобных проектах вносят графические процессоры, производительность которых удваивается каждые восемь месяцев, а их программирование для прикладных задач сегодня возможно, например, на Си с помощью общедоступной системы Nvidia CUDA.
В заключение процитирую старую заметку: “знать надо много — и это “много” знать надо хорошо”.