Предположим, что, прочитав предыдущий пост "Об информатике вообще", вы взвесили все ЗА и ПРОТИВ и решили стать программистом.

Какие способности в себе имеет смысл развивать и как узнать есть ли у вас призвание к программированию?

Принято считать, что хорошей основой для программирования является математика. Конечно, это верно. Человек должен быть знакомым с аристотелевской логикой и уметь решать математические задачи в три действия.
Но есть и другие требования…


Кстати, здесь уместно сказать, что программисту попадаются задачи не в три, а в 10000 действий. И эти действия необходимо уметь разбить на подзадачи, каждую из которых нужно чётко формально описать, оценить сложность, сформулировать критерии выполнения, п��ручить исполнение каждой из подзадач группам программистов (или себе самому), проконтролировать ход их выполнения (осуществить самоконтроль) и суметь вовремя внести важные корректировки по ходу выполнения заданий. Как-то так, как-то так … Ещё не раздумали становиться программистом?

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

Непредсказуемость программиста (команды программистов) – это одна проблема. Она решается просто – нужно просто давать пробный строк. Но есть и другая проблема – неисправимый оптимизм программистов. Они действительно преуспевают в деле упрощения сложных задач, умеют находить архитектурные решения, которые сводят неподъемную с виду задачу к вполне осуществимой. Но они почти всегда переоценивают свои способности и верят, что всё будет хорошо, пока “несовершенная материя” в очередной раз не поставит их на место. Если вы станете программистом, который будет ошибаться в сроках выполнения задачи менее чем в два раза – вам цены не будет.

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

Но, несмотря на очевидную необходимость математических знаний и способностей, не хотелось бы утверждать, что программистам нужно классическое математическое образование. Эта должна быть особенная математическая программа, в которой не так много непрерывного анализа, но много дискретной математики и логики. При этом значительную часть времени при подготовке программистов следует уделять способности ясного изложения мыслей. Регулярный тренинг должен быть таким: изучение текстов, их аннотирование, выделение главной мысли, оценка полезности, интересности и перспективности. Если говорить грубо, то программистов нужно делать из математиков, подготавливая их по программам лингвистических специальностей, либо из лингвистов – по программам компьютерных специальностей (это идея Непейводы Н.Н.).

Если провести анализ видов деятельности типичного IT-специалиста или программиста, то окажется, что это вовсе не работа с математическими абстракциями, а анализ технических текстов, аннотирование, выражение мыслей и концепций максимально кратко и чётко.

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

Языки программирования – не единственная область, где программист сталкивается с языками. Формальные языки используются для описания данных, протоколов, архитектур и процессов. Профессионального программиста можно сравнить с полиглотом, который уже знает достаточно много языков, каждый из которых увеличивает его способность кратко, точно и красиво выражать мысли. Изучение или разработка нового языка является типичной задачей программиста.