В основной массе производственных профессий есть разделение на конструкторов, которые решают что мы будем делать, технологов, которые решают как мы будем делать и рабочих, которые собственно воплощают в жизнь задуманное конструкторами, используя решения технологов. Соответственно, хотя обычно работа рабочих требует меньшей квалификации, чем работа конструкторов и технологов, их работа никак не менее важна, т.к. без работы рабочих работа конструкторов и технологов никому не нужна.
Однако в программировании столь четкого разделения не произошло, из-за того, что средства производства программиста-конструктора, программиста-технолога и программиста-рабочего ничем не отличаются друг от друга, соответственно один и тот же программист легко может выполнять работу и конструктора, и технолога, и рабочего. Поэтому в программировании у нас есть два пути: 1) использовать только высококвалифицированных программистов, заставляя их заниматься и работой конструктора, и работой технолога, и работой рабочего 2) пойти по пути других производственных профессий, разделяя программистов на конструкторов, технологов и рабочих(кодеров).
В чем недостатки первого подхода, который сейчас можно считать общепринятым в программистской отрасли?
1) Трудности с набором сотрудников. Понятно, что точно также как и в любой другой профессии количество высококвалифицированных работников много меньше, чем общее число работников. Соответственно высококвалифицированных работников на всех не хватет и хватать не может. Если же мы берем (по ошибке или потому что других нет) работника менее квалифицированного, то он оказывается малополезен, т.к. при такой организации труда нет явно выделенных конструкторов и технологов, задачей которых было бы переформулирование исходной задачи в понятную менее квалифицированному программисту форму.
2) Высокая стоимость рабочей силы. Если нам повезло и все нанятые работники действительно оказались высококвалифицированными, то им и платить надо соответствующе. Однако если программист-технолог написал решение для типовой задачи, то производительность использования этого решения, что более высококвалифицированным, что менее квалифицированным программистом обычно близка. Соответственно возникает вопрос зачем платить больше?
3) Проблема с мотивацией. В любой работе есть рутинные задачи, типовое решение для которых уже давно найдено. И если программисты-технологи занимаются делом, то круг задач с типовыми решениями постоянно увеличивается. Если у нас есть только высококвалифицированные программисты, то хочешь не хочешь этими рутинными задачами приходиться заниматься им. Естественно они от этого не в восторге, т.к. для них эти задачи слишком примитивны и соответственно неинтересны. Кодеров же мотивировать на таких задачах проще, т.к. и сложность этих задач более близка к способностям кодера, и людей в кодеры можно набирать с предрасположенностью к рутинной работе.
4) Проблема с амбициями. Если у нас есть только высококвалифицированные программисты, то каждый имеет свое мнение на тему что и как делать. Соответственно либо приходиться ради единообразия решений в проекте выбирать решения одних программистов и ущемлять других, что не очень хорошо с точки зрения обстановки в коллективе. Либо мириться с тем, что каждый программист имеет свой зоопарк стандартных решений, что плохо с инженерной точки зрения. При использовании кодеров такой проблемы нет, кодер наоборот рад, что ему предлагают решение с помощью которого он может выполнять свои задачи проще.
Второй, т.е. традиционный производственный подход этих недостатков лишен, хотя естественно в нем есть свои проблемы. Однако как мне кажется эти проблемы существенно меньше, чем в первом подходе, а сегодняшнее доминирование первого подхода объясняется не его эффективностью, а молодостью профессии, в силу которой специализация труда в программировании еще не успела развиться.