Эмиль Манукян, Программисты и человеческий фактор

Введение

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

Миф о технаре

Итак, я бросаю вызов утверждению, что программист — технарь. Не в частном смысле, а в общем. То есть, я не пытаюсь доказать, что нельзя найти программиста, который является технарем. Я утверждаю, что свойство «технарь» для программиста ни необходимо, ни достаточно.

Этимологический аргумент

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

Техника

Словарь Ожегова определяет технаря как:

ТЕХНAРЬ, -я, муж. (разг.). Специалист, работающий в области техники, технического обслуживания чего-н., а также вообще человек, к-рый знает и любит технику.

Этимология «техники» приводит нас к греческому τέχνη — искусство, мастерство, умение. То есть ключевым в данном термине является элемент ремесла. Исследуя наиболее распространенный производный от «техники» термин «технологию», мы видим, что технология (от др.-греч. τέχνη — искусство, мастерство, умение; λόγος — мысль, причина; методика, способ производства) — это комплекс мер и приемов, обеспечивающих функционирование той или иной системы. В случае информационных технологий — информационных систем. Таким образом, техника — это формализованное и структурированное знание. Именно в данном контексте технарей принято называть «сухими». Сухой технарь — человек, рассматривающий мир в перспективе окостеневших рамок и инструкций.

Программа

Программист — это автор программы. Программа (от греч. προ — пред, греч. γράμμα — запись) буквально переводится как «предписание», т.е. программист пишет как должно быть. Да, он вынужден расписывать подробно, чтобы описание квалифицировалось как «технология», но но нам никуда не деться от префикса pro-. Программист не пишет, он предписывает. Предписания делаются тем, кто оперирует более высоким уровнем абстракции для потребителя этих инструкций. Таким образом, программист находится не на уровне технологии, а над ней. Далее мы рассмотрим, что именно вкладывается в эти слова.

Когнитивный аргумент

В своем превалирующем большинстве конечной целью IT технологий является удовлетворение человеческих потребностей пользователей. Есть, конечно, научные, исследовательские, военные итд. проекты, но бум IT технологий пришелся именно на корпоративное и консьюмерское программное обеспечение, решая пользовательские задачи. Например, по данным за 2009 год сегментация IT индустрии в Европе выглядит так:

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

Программист, математика и вычисления

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

Компьютер и процессор

Компьютер, он же computer, этимологически восходит к глаголу compute — считать, вычислять. И это не удивительно, ведь на самом нижнем уровне оперирования компьютер преисполнен арифметикой, львиную долю в которой составляют операторы сложения. Для примера, я присоединился отладчиком к процессу Skype (который не замечен в сложных математических вычислениях). В радиусе пяти инструкций — два сложения:

В 50-х годах 20-го века, когда люди общались с компьютером на его родном языке, математика была неотъемлемой частью их лексикона. В добавок к этому, сами задачи, делегируемые компьютеру, были в основном вычислениями. Таким образом, computer и вправду занимался computing-ом, и в этом активно участвовали его собеседники — программисты.
Однако, как мы можем заметить, компьютеры не стояли на месте, становясь все ближе к людям. В какой-то момент компьютер получает себе человеческое прилагательное — персональный. PC — персональный компьютер становится де-факто стандартом, так что определение «персональный» становится тавтологичным и потому часто пропускается. Стоит заметить, что тут мы замечаем ранее упомянутую деформацию символа. Ведь персоны, которым принадлежит их персональный компьютер, не так заинтересованы в computing-е как их предшественники, создавшие computer для компьютинга. Новые пользователи оперируют на намного более высоком уровне абстракции и зачастую в школе у них по математике стоит твердая двойка. То, что они творят с компьютером, уже никак нельзя назвать вычислением. Они просто вводят данные и получают обратно другие данные. То есть, следуя сложившейся терминологии, data processing. Для них компьютер — это процессор. Как это ни парадоксально, этим словом называют наиболее вычислительную часть компьютера — central processing unit. Потому что термин «компьютер» уже занят. А ведь должно быть наоборот — люди работают на процессоре, который транслирует их высокоуровневые абстракции в строгий язык арифметических инструкций посредством CCU — central computing unit.

Эволюция программиста

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

и эту:

foreach (File log in Server.Logs)
{
  if (MaxErrorCluster(WebServer.Parse(log)).Length > Config.ErrorClusterThreshold)
  {
    Alerts.Add(Messages.BruteForce);
  }
}

Языки программирования вплотную подошли к человеческому языку. Языки 4GL стали настолько дескриптивными, что больше напоминают метафизическое описание вселенной, чем перечень инструкций, подлежащих выполнению. Развившаяся технология настолько абстрагировала программистов от окружения, что программист зачастую не знает, что, где и когда выполняет его программу. Единственное, что остается у современного программиста из темного прошлого — это пользователь и его требования.

Пользователь — наше все!

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

Программист и абстракции

Призывы грандов проектирования использовать повсеместный язык (Ubiquitous Language) по сути являются перефразировкой утверждения: приближайте технологии максимально близко к пользовательским абстракциям. Т.е. технология, которую создает программист для реализации пользовательских требований, должна быть гомоморфна концептуальным классам, витающими в пользовательской голове. Тут есть один очень важный момент, о котором периодически забывают дегуманизаторы профессии программиста. Концепции, живующие в пользовательской голове, неявные. Т.е. нейронная сеть пользователя настроена так, что эти концепции позволяют ему в каждом конкретном эпизоде принмать верное для своей предметной области решение, но описать эти концепции он не может. Т.е. это не репродуктивное знание, а реактивное. Именно поэтому, когда пользователь начинает активно формулировать свои мысли, звучат они как непоследовательный бред, которым зачастую и являются. Задача программиста, переводящего эти требования на язык своей технологии, выявить в потоке этих слов те неявные понятия, которые генерируют все эти требования. Тут-то перед программистом и встает задача выявления абстракций, соответствующих пользовательским концептуальным классам. Если абстракция выявлена правильно, то новые поступающие требования будут не разламывать ее, а гладко и однозначно в нее вписываться. Если неправильно, то абстракцию надо перенастроить. Программисты называют это рефакторингом. А лингвисты — этимологией. Поиск пользовательских абстракций есть лингвистически-психологическим мероприятием. Да и именование — переменных, функций, классов, файлов, модулей — что это как не копание в собственных мозгах с целью выявления нового символа, согласованного с существующей символьной системой? Программист денно и нощно творит новый язык — язык своего уровня абстракции со своими существительными, глаголами, грамматикой. Лингвистам такого и не снилось!

Заключение

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

Источник: https://habrahabr.ru/post/187568/