13
языки программирования, инструменты и окружающее ПО, новые проблемы
взаимодействия с которыми обязательно придется решать.
Профессиональное творчество программиста принципиально отличается от
творчества в науке и искусстве. Программистские задачи с каждым годом
становятся все сложнее и объемнее, а сроки, за которые требуется решить эти
задачи, наоборот, с каждым годом сокращаются. Поэтому современные
программы создаются коллективами от нескольких до тысяч программистов, в
то время как творческие деятели науки и искусства работают, как правило, в
одиночку.
Есть еще нечто, что отличает труд профессионального программиста от
ученого, художника, композитора и поэта. Предметом деятельности ученых
являются упрощенные модели, в которых они могут абстрагироваться от
большинства деталей реального мира, не существенных для их целей.
Математик, доказывая новую теорему о тензорах, не заботится ни о чем, кроме
системы постулатов, положенных в основание дифференциальной геометрии.
Физик, описывая динамику жидкости в трубе, абстрагируется от того, как
движутся и сталкиваются молекулы и от того, как движутся планеты вокруг
Солнца. Деятели искусства тоже во многом оперируют абстракциями. Поэту,
композитору, художнику достаточно лишь сделать намек, абрис объекта
творчества, и на этом его работа закончена. Остальное пусть додумывает
читатель, слушатель, зритель.
Программист тоже работает с абстракциями, но ему приходится держать в
голове гораздо больше абстракций, чем любому ученому. Абстракции
сопутствуют программисту на всех уровнях разработки программы от описания
ее целей до исполняемого машинного кода. И этих уровней могут быть десятки.
И на каждом уровне абстракций их деталей становится все больше и больше.
Дополнительно к абстрактному мышлению, программист должен обладать
сильно выраженным системным мышлением, чтобы удерживать
многочисленные взаимосвязи, существующие на всех уровнях программистских
абстракций, а также взаимосвязи между этими уровнями. Еще одной
сложностью является то, что все эти абстракции и взаимосвязи между ними
изменяются во времени, и программист должен учитывать эту динамику.
Кроме того, программист должен обладать маниакальной усидчивостью,
сосредоточенностью и упорством для перебора всех возможных вариантов
поведения своих абстракций и доскональной проработки всех деталей.
Проработка должна быть абсолютно точной и не должна содержать ни одной
ошибки, неправильного, лишнего или отсутствующего символа исходного кода
(а это порой миллионы строк). Инструменты программирования: синтаксические
анализаторы, компиляторы и проч., - лишь незначительно помогают в этой
работе.
Еще одна особенность, которая присуща программистскому творчеству, это
постоянное обновление информационных технологий, которые программисту
необходимо знать и успешно применять в своей работе. Поэтому
профессиональный программист должен, как сказал один из наших прежних
вождей, «учиться, учиться и учиться». Программист должен удерживать в
голове, постоянно пополнять и активно применять на практике гигабайты
профессиональной информации. Это устройство компьютеров, компьютерных
сетей и сетевые протоколы. Это операционные системы и языки
программирования. Это программные интерфейсы промежуточного ПО и
прикладных библиотек с особенностями и багами их реализации в конкретных
продуктах. Это технологические стандарты, технологии разработки и