вторник, июня 05, 2007

Настоящий программист

«А вообще я много раз говорил — настоящему программисту все равно, на каком языке писать, под какую платформу или кросс-платформенно и какие технологии использовать»

Настоящий Программист.

«Я процесс написания на Java и C# считаю простым и не интересным... Мне больше C/C++ нравится»

Настоящий Программист.

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

Заглянем в историю. Бурно развивавшаяся в начале XX века теория алгоритмов продолжала оставаться теорией, пока фон Нейман не предложил отделить в компьютерах алгоритм от железа. Так алгоритмическая теория перешла в практическую плоскость, и возникла потребность в такой категории людей, которые умеют составлять программы для решения различных задач при помощи компьютеров. Ну, а фон Нейман стал дедушкой всех программистов.

В те далекие времена компьютеры были большими, а все программисты были «настоящими». Их работой было построение алгоритма решения поставленной задачи и описание этого алгоритма в доступной для машины форме. Задача – программист – машина и ничего более. По правде сказать, «настоящему программисту» для счастливой жизни ничего более и не нужно. Одна деталь омрачала эту пасторальную, идиллическую картину. Дело в том, что компьютеры изначально были придуманы, чтобы решать задачи быстро. В быстроте был весь смысл, потому что любую компьютерную задачу человек может решить и без компьютера…, но медленно. Но работа программиста занимала очень много времени, и с этим надо было что то делать. Естественно начали с самого медленного участка – записи алгоритма в понятной машине форме. Так появились первые языки программирования, а между программистом и машиной вклинился транслятор. Первичная гармония бытия настоящего программиста была нарушена, и сделал это он своими руками. С тех пор пошло и поехало. Появились операционные системы, которые еще больше отдалили «настоящего программиста» от машины. Над операционными системами выросли командные оболочки (ээх, вы помните «Примус», друзья…). Власть над машинами захватили безжалостные админы, которые начали распределять время на общение «настоящего программиста» с машиной (опять, кстати, при помощи программ, написанных самим «настоящим программистом»). Появились библиотечные функции, которые отобрали у «настоящего программиста» последнюю радость в жизни - разработку базовых алгоритмов. Эпоха настоящих программистов закончилась.

Новые времена требовали от программистов совсем других умений. Вместо решения отдельных задач, необходимо было создавать программные системы, которые могут решать целые классы задач. Появились базы данных, конструкторские пакеты, графические системы, и т.д. и т.п. А главное – программы стали товаром. Поэтому программистов теперь нужно много и программистов теперь нужно разных. Нужны миллионы web программистов для создания и поддержки сотен миллионов сайтов и web приложений. Причем web программисты нужны разные, специалисты по PHP и Ruby, JSP и ColdFusion, ASP.NET и Perl, JavaScript и Ajax, Flash и еще бог знает что. Нужны разработчики ABAP для SAP, и X++ для Acsapta. Нужны программисты С++ под OpenGL и COBOL под маинфреймы. Нужны разработчики БД под Oracle и MSSQL.

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

Работать с «настоящим программистом» тяжело. Ты никогда не объяснишь «настоящему программисту», что он был неправ, когда написал свою сортировку (O(n * log n)) вместо использования библиотечной (O(n*n)), потому что время сортировки данных по любому на два порядка меньше времени передачи по сети, и его сложный код кому то придется поддерживать, и есть подозрение что на комбинации граничных условий он даст ошибку, и он потратил на это кучу времени, вместо того чтобы реализовать списание складских остатков по методу FIFO… «Настоящий программист» обязательно начнет писать свой компилятор или, на худой конец, framework потому, что все существующие, по его мнению, полное барахло. Многие поколения разработчиков изнывают в рабстве Инструментов в свое время созданных, а затем заброшенных «настоящими программистами». «Настоящему программисту» все равно, на каком языке писать и под какую платформу. Главным образом потому, что ни одну из них он не удосужился изучить досконально.

Что ни говори, «настоящий программист» умеет программировать, это мощнейший, но неуправляемый источник программного кода и головной боли для его руководителя. У многих синдром «настоящего программиста» со временем проходит (правда не у всех), и тогда он становится настоящим программистом без кавычек.

Для этого надо любить и уметь программировать, т.е. находить оптимальное решение задачи в виде оптимальных структур данных и алгоритмов. Это условие необходимое, но отнюдь не достаточное. Гораздо сложнее научится выстраивать цепочку причинно следственных связей от пользователей твоего продукта и владельцев бизнеса - к своему коду. Ориентироваться не на процесс создания программного продукта, а на результат, и в тоже время, овладеть этим процессом в совершенстве. Врубиться в предметную область, чтобы сделать из своей программы по настоящему полезный и удобный инструмент. Изучить используемую технологию и инструментарий так, чтобы не только знать, как его наилучшим способом использовать, но и то, как его использовать не следует.

Вот такого чела можно действительно назвать Настоящим Программистом.

5 комментариев:

Анонимный комментирует...

Хе, я тоже был кем-то вроде "настоящего программиста", пока судьба не столкнула с настоящим менеджером. Грамотно и внятно сформулированные требования и сроки плюс контроль за качеством исполнения очень быстро направляют энергию в нужное русло.

Iv комментирует...
Этот комментарий был удален автором.
Iv комментирует...

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

зы. быдлокодерами - я, например, таким образом ласково называю своих коллег. (Ну что быдлокодеры, по пивку. :) ) Они не обижаются, а просто зовут меня главным быдлокодером :).

Rodion Bykov комментирует...

Общаясь в качестве волонтера-преподавателя со студентами своей родной кафедры в рамах факультатива по веб-разработке явно наблюдаю как растят "настоящих программистов". На мои пояснения как надо проектировать с помощью объектов, мне отвечают, зачем тратить память на создание объектов... Конечно, им же вложили в мозг что экономить 4 байта памяти это важнее чем понять предметную область и спроектировать ее в терминах ООП, а затем поддерживать и расширять. Волнуются о вопроса очистки памяти в PHP, когда там давно есть garbage collector. Процесс проектирования они начинают со схемы данных, не понимая зачем нужны быстрые прототипы. Список можно продолжать. Надо признать, например моя группа знает реляционные СУБД на отлично и хорошо алгоритмизирует. Но создать нечто большее чем "сферического коня в вакууме" они к сожалению не могут.

apoudy комментирует...

отличный пост.
только Фон-Нойман изобрел не программы, а т.н. "принцип хранимых в памяти программ" (SPP), т.е. хранение программ вместе с данными в общей памяти. до этого программы были на катрочках отдельно, память в цилиндрах отдельно.