О кодерах, программистах и инженерах-программистах

в 20:39, , рубрики: инженер, Карьера в IT-индустрии, кодер, Программирование, программист

На этот пост меня натолкнули недавние статьи на Хабре "Кто такой программист?" и "Почему Python так хорош в научных вычислениях".

Читая комментарии к ним, я неоднократно натыкался на рассуждения с разделением разработчиков на «кодеров», «программистов» и «инженеров-программистов» и другое навешивание ярлыков.

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

image


Заглянем в историю. Как и для чего появились ЭВМ и первые программы? Для ускорения и повышения точности математических расчетов и алгоритмов. Криптографы хотели возможность иметь брутфорсить тысячи комбинаций для расшифровки секретных сообщений, военные хотели возможность быстро и точно рассчитывать траектории полета артиллерийских снарядов и ракет, строители хотели возможность расчета прочности конструкций при разных исходных данных, и т.д.

В свою очередь, процесс проходил примерно так: сначала исследуется предметная область, продумывается алгоритм, выводятся формулы расчета, и потом все это дело переводится в программный (машинный) код.

Люди, которые делали всё, кроме последнего пункта, были «инженерами», люди же, которые переводили алгоритм, изложенный в виде математических формул, блок-схем или естественного языка, были «кодерами» (или, тогда еще просто «программистами»).

image

Годы шли. Техника развивалась, появились языки более высокого уровня, появились ОС. «Кодирование» стало проще, появились люди, совмещавшие в себе обе позиции, и они были «инженерами-программистами». Пока что всё тоже ок.

А потом началось интересное. Компьютеры и микроконтроллеры проникли везде, от больших дата-центров до карманных устройств. Сфера их использования тоже значительно расширилась — не только научно-инженерные применения, но и информационные системы, документооборот, средства связи, развлечения и игры, и т.д.

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

image

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

image

и в итоге появилась такая отдельная профессия как UI/UX-дизайнер. Чуть позже все поняли, что требовать совмещать в одном лице как профессионала в области разработки ПО, так и профессионала в какой-то предметной области — это сложно и дорого. Как пример, посмотрите на 1С'ников (заранее извините, никого не хочу обидеть, у меня родной брат бывший 1С'ник) — по идее это должен быть программист-бухгалтер, а по факту получается недобухгалтер и недопрограммист.

Проблемы это приносило как работодателям (например, непросто найти специалиста-эксперта в области торговли на бирже, и непросто найти профессионала в области разработки ПО, а вероятность найти человека, совмещающего в себе и того, и другого, соответственно, еще гораздо ниже), проблемы это приносило так и самим работникам (в твоем городе может быть десять фирм, где нужны java-синьоры, но у каждой разная специализация по предметной области), и каким-то светлым головам пришла гениальная мысль: анализом предметной области, формулированием ТЗ, и прочим должен заниматься один человек (бизнес-аналитик, менеджер, технолог), а разработкой ПО для получения результата — другой человек (программист).

В плюсе оказались все. И это хорошо, и по этой модели сейчас работает все большее и большее количество компаний. Достаточно посмотреть на резюме на хедхантеровских сайтах — ищут именно «Senior-разработчиков микросервисного Java-бэкенда» или «ReactJS Middle developer», а «знание специфики банковской сферы» или «опыт в отрасли XXX» в хотелках указывается в лучшем случае как «будет плюсом».

image

Правда, концепция «один пишет алгоритмы, а другой их кодит» немного поменялась — с одной стороны стало легче, потому как в 90% задач в наше время важнее не изобретение нового алгоритма или структуры хранения данных, а грамотный выбор и оптимальное использование существующих концепций, либо их модификация под конкретные случаи. Но и без «создания алгоритмов» работать нельзя в принципе, т.к. уже никто не формулирует задания вида «аллоцируй массив, сделай цикл для прохода поэлементно, и т.д.» (такое только в школе на уроках информатики встречается), сейчас разработчик оперируя информацией о том «что есть и что должно получится» разрабатывает последовательность действий. По сути дела, даже элементарный SQL-запрос — это уже алгоритм.

Именно поэтому можно сказать, что разделение на «кодеров» и «программистов» устарело лет 20 так назад, сейчас эти понятия размылись и разделение не имеет смысла.

Но тут все-таки хочется как-то разделить тех, кто просто «придумал алгоритм и излагает его в виде кода» и тех кто занимается «разработкой ПО».
И вот тут старое разделение снова пригождается. Того, кто просто придумал алгоритм и пишет по нему код, достаточно корректно будет считать "кодером", а вот того, кто занимается не только придумыванием алгоритма и кодированием, а еще написанием тестов, документации, проработкой архитектуры и API, заботится о читаемости и надежности кода, и принимает участие во многих других процессах, можно считать "программистом".

А что же с "инженерами-программистами"? Как я уже говорил в начале, в отличие от старых лет, разработка ПО не ограничивается инженерно-техническими задачами, и каждый, работающий с ЭВМ уже не обязан иметь высшее техническое образование. В наше время кроме «инженера-программиста» и «математика-программиста» может быть «химик-программист», «финансист-программист», «гейммастер-программист» (ролевики поймут), и даже «музыкант-программист». То есть по сути дела, это понятие всего лишь указывает на сферу задач человека, для чего именно он занимается программированием.

А учитывая, как часто обстоят дела в разработке ПО в сфере инжиниринга:

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

и научной деятельности:

«По своему опыту научной работы могу сказать, что когда над задачей работает от одного до нескольких человек, он повторном использовании кода речи не идёт. Пишут как получится, используются минимальные возможности языка, о системах контроля версий большинство не знает.» [из комментариев]

во многих случаях определение правильнее будет звучать «инженер-кодер» или «математик-кодер».

Если кто-то хочет предложить другие варианты толкований и наименований — буду рад увидеть раскрытые и обоснованные комментарии.

Автор: Whuthering

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js