Почему программирование не только для математиков

21 December 2018

Пара слов про "гуманитарные" навыки при разработке программного обеспечения, включая программирование.

Почему программирование не только для математиков

Ниже в тексте под гуманитариями и гуманитарными навыками я понимаю ряд навыков языковых, социальных и других. Разумеется, разговор идёт о развитых навыках, а не просто умении разговаривать и ругаться в комментариях :) Подчеркну также, что я не отрицаю, что наличие математического образования даёт преимущества, а уж тем более преимущества даёт профильное образования в сфере информационных технологий. Я лишь хочу рассказать, что гуманитариям можно и нужно себя пробовать в программировании, не бояться что это нечто, недоступное им!

Я программист. Собственно, я уже не вспомню с какого года я начал изучать программирование, вероятно с 2000, когда в мои 14 лет у нас с братом появился компьютер.

И всё время я слышу, что "программирование это как математика", "нужно математическое образование", "программирование не для гуманитариев" и прочее в том же духе. Надоело.

В настоящее время я ведущий разработчик в довольно крупной компании и за плечами неплохой опыт коммерческой разработки, веду два проекта, приходится управлять коллегами-программистами и участвовать в наборе новых сотрудников (посмотреть резюме, код в репозитории или тестовых заданиях, провести собеседование). В общем, есть некоторый опыт в вопросе.

И вот что я хочу сказать: в реальной разработке люди с чисто математическим складом ума (те, кто реально очень "прокачан" в математике, но практически неспособны к гуманитарным наукам) нужны практически... ну, почти никогда. Причина этого - программирование лишь в теории основано на математике, то есть, в основе лежит математика и математическая логика, но реальная работа намного сильнее связана с теми умениями, что можно назвать "гуманитарными".

Давайте начну со ссылки на статью: https://dev.by/news/mozg-programmista-kak-ob-ekt-nauchnogo-issledovaniya-neyrofiziologiya-programmirovaniya (а вот само исследование: http://www.cs.cmu.edu/~ckaestne/pdf/icse14_fmri.pdf)

Если кратко: мозг программиста активно использует языковые навыки, "гуманитарные". Процитирую:

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

Дело в том, что немалую часть времени программист должен читать и понимать код, а это совершенно эквивалентно чтению обычного текста и мозг использует те же отделы.

При написании же кода всё работает аналогично написанию текста: нужно выразить идею на языке.

Навыки, специфичные именно для математики, нужны лишь в сложных алгоритмах, работающих с очень нетривиальными данными, например без математики не обойтись при разработки ПО для работы со звуком, видео, 3D-графикой.

Основная же масса типичных задач программиста требует:

1. Умение общаться с людьми (тимлидом, менеджером проекта, коллегами), обсуждать проблемы и находить решение.

2. Умение писать и читать код (см. выше про это), т.е. понимать что хотел сказать другой программист и изложить своё решение задачи для компьютера. Если вы можете по-русски записать, скажем, процесс приготовления сложного блюда (по всем этапам: что берём, как чистим/режем/варим и так далее), то вы сможете записать и алгоритм на языке программирования (разумеется, как и любой естественный язык, этот язык нужно будет сначала изучить).

3. Умение документировать написанный код (а это на 100% задача не математическая).

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

5. Умение разработать самостоятельно алгоритм под нестандартную задачу (т.е. придумать последовательность шагов для обработки данных и запрограммировать эти шаги).

3 первых пункта, как видите, вполне доступны гуманитариям, а 3 пункт особенно (вы же не думаете, что математики все поголовно хорошо владеют написанием грамотных текстов?).

Пункт номер 4 не требует никаких особых умений, кроме умения учиться и запоминать.

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

Собственно, все хорошие программисты, с которыми я был знаком, были очень хорошо прокачаны в гуманитарном направлении, а некоторые не имели вовсе математического или инженерного образования (юристы например). Вообще, хороший программист всегда прокачан и как технарь, и как гуманитарий. А без "софт-скиллов", т.е. фактически опять же гуманитарных, почти нереально стать техлидом - это же работа с людьми.

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

Но всегда есть и некоторые отрицательные моменты, конечно. Разработка это точно не для людей, которые не обладают должной усидчивостью и усердностью! Творческих личностей, пишущих стихи под вдохновением и не способных работать без вдохновения тоже прошу не беспокоиться - это не ваше. А вот если вы можете долгими часами сидеть и писать тексты, или вычитывать текст на предмет ошибок - это, возможно, ваше.

Ну и, собственно, к чему я это всё? Нынче большой дефицит кадров в ИТ. Нужны разработчики, тестировщики, технические писатели (те, что пишут документацию) и многие другие. Этот сектор растёт, и зарплаты там не в пример выше многих других областей.

Попробуйте себя, если хотите найти новую профессию! Даже если вы считали себя всю жизнь гуманитарием - не бойтесь, ваши умения тут могут быть очень к месту!

Возможно, это замотивирует: https://moikrug.ru/salaries

И немного про мозг и программирование: https://dev.by/news/kak-programmirovanie-vliyaet-na-mozg-3-nauchno-dokazannyh-fakta

PS: Ещё немного про математиков и компьютерные науки: был у меня в институте преподаватель математики, реально просто крутейший математик, дифференциальное исчисление и математический анализ для него - легче лёгкого. Но когда он садился за компьютер он выглядел примерно так же, как 20 лет назад за компьютером выглядела бы моя бабушка: неуверенные движения мышью, долгий поиск на экране нужного значка программы, набор текста одним пальцем с долгим поиском нужной клавиши.