Так в чём же конечная цель программирования?
Написать этот пост меня побудила статья «В чем конечная цель программирования?» и её обсуждение в комментах. Я поставил свой плюс за статью сразу же, как прочитал первое предложение:
В том, чтобы иметь код, который легко изменять.
Ведь это же очевидно любому, кто попрограммировал достаточно долго, чтобы столкнуться с необходимостью изменять свой собственный код через какое-то достаточно продолжительное время (более полугода от момента завершения проекта). Про чужой код я не говорю, потому что его, в массе своей, изначально пишут «криворукие ваш-любимый-эпитет» и нужно потратить кучу времени хотя бы для того, чтобы понять, что он делает, а чтобы что-то в нём изменить и не порушить всё остальное, времени нужно потратить в разы больше.
Но статья с таким очевидным (ну, лично для меня) выводом имеет, по состоянию на сегодня, оценку »-5» (»8» — в плюс,»13» — в минус). Под катом мои размышления о возможных причинах этого.
По итогу дискуссий в комментах с коллегами @hlogeon и @saboteur_kiev (спасибо им за подачи с их стороны) у меня перед глазами в конце-концов появилась известная всем «пирамида Маслоу»:
Пирамида потребностей Маслоу
В основании пирамиды лежат базовые потребности, а всякие «излишества» располагаются на верхних уровнях. Потребность в них начинает проявляться только после удовлетворения базовых.
Если представить цели программирования в виде подобной пирамиды то я бы расположил их в таком порядке (от базовых и к «излишествам»):
Write
Конечная цель программирования — сам текст программы. Это настолько очевидно, что перестаёт восприниматься как конечная цель уже после второй-третьей самостоятельно написанной программы.
Compile
Конечная цель программирования — создание компилируемой программы. Для программистов на интерпретируемых языках можно считать целью создание такой программы, каждая строка которой не вызывала бы ошибок, связанных с интерпретацией кода. Кстати, современные IDE очень сильно помогают в создании «компилируемых» программ.
Run
Конечная цель программирования — создание работающей программы. Бывают случаи, когда код успешно компилируется, но программа вылетает сразу же после запуска. Или не сразу же — вылетает при определённых условиях. Деление на ноль, переполнение стека, undefined и прочее — все эти вещи делают невозможным использование программы, даже если она написана и компилируется (или IDE не обнаруживает в ней ошибок).
Business
Конечная цель программирования — создание программы, решающей некоторую бизнес-задачу. Действительно, с точки зрения капиталистического общества нет смысла платить деньги за бесполезные программы, пусть даже они успешно компилируются и работают без ошибок.
Test
Конечная цель программирования — создание тестируемой программы. Не каждому проекту может понадобиться этот уровень. Но когда проект нуждается в тестировании, то это накладывает свой отпечаток на стиль написания кода (TDD, инъекция зависимостей и т.п.). Как правило, это проекты с большой кодовой базой и большой текучкой в команде.
Modify
Конечная цель программирования — создание легко изменяемой программы. Эти проекты, как правило, с продолжительным сроком жизни (свыше месяцев) и итерационным подходом к разработке (можно сразу же выкинуть из этого списка лендинги для сельских магазинов, но оставить в нём движок для создания этих самых лендингов).
Итого
Таким образом пирамида »главных целей» программирования может выглядеть так:
«Главные цели» программирования
Я уверен, что можно ещё надстроить уровней «главных целей», но я со своим опытом могу видеть только эти. Кто-то другой может найти ещё цели, которые начинают проявляться после достижения здесь описанных.
Уровень цели не означает её «весомости» — понятно, что если программа не решает какую-либо бизнес-задачу, то всем, кроме её создателя, глубоко фиолетово насколько хорошо она компилируется или тестируется. Уровень говорит лишь о том, что нет смысла достигать текущей цели, если не достигнуты низлежащие. Т.е. нет смысла реализовывать бизнес-логику в неработающей программе — сначала нужно добиться того, чтобы она работала. Нет смысла делать тестируемой программу, которая не решает бизнес-задачи, как и нет смысла беспокоиться о модифицируемости кода, непокрытого тестами.
На мой взгляд, конечных целей в программировании много. Они, как матрёшки, вложены друг в друга. Что конкретный программист в конкретном проекте принимает за конечную цель зависит как от опыта самого программиста, так и от проекта. В некоторых проектах действительно нет смысла подниматься выше бизнес-целей.
Ну, а коллегу @undeadlol1 зря заминусили, как по мне.