Так в чём же конечная цель программирования?

Написать этот пост меня побудила статья «В чем конечная цель программирования?» и её обсуждение в комментах. Я поставил свой плюс за статью сразу же, как прочитал первое предложение:

В том, чтобы иметь код, который легко изменять.

Ведь это же очевидно любому, кто попрограммировал достаточно долго, чтобы столкнуться с необходимостью изменять свой собственный код через какое-то достаточно продолжительное время (более полугода от момента завершения проекта). Про чужой код я не говорю, потому что его, в массе своей, изначально пишут «криворукие ваш-любимый-эпитет» и нужно потратить кучу времени хотя бы для того, чтобы понять, что он делает, а чтобы что-то в нём изменить и не порушить всё остальное, времени нужно потратить в разы больше.

Но статья с таким очевидным (ну, лично для меня) выводом имеет, по состоянию на сегодня, оценку »-5» (»8» — в плюс,»13» — в минус). Под катом мои размышления о возможных причинах этого.

По итогу дискуссий в комментах с коллегами @hlogeon и @saboteur_kiev (спасибо им за подачи с их стороны) у меня перед глазами в конце-концов появилась известная всем «пирамида Маслоу»:

Пирамида потребностей Маслоу

Пирамида потребностей Маслоу

В основании пирамиды лежат базовые потребности, а всякие «излишества» располагаются на верхних уровнях. Потребность в них начинает проявляться только после удовлетворения базовых.

Если представить цели программирования в виде подобной пирамиды то я бы расположил их в таком порядке (от базовых и к «излишествам»):

Write

Конечная цель программирования — сам текст программы. Это настолько очевидно, что перестаёт восприниматься как конечная цель уже после второй-третьей самостоятельно написанной программы.

Compile

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

Run

Конечная цель программирования — создание работающей программы. Бывают случаи, когда код успешно компилируется, но программа вылетает сразу же после запуска. Или не сразу же — вылетает при определённых условиях. Деление на ноль, переполнение стека, undefined и прочее — все эти вещи делают невозможным использование программы, даже если она написана и компилируется (или IDE не обнаруживает в ней ошибок).

Business

Конечная цель программирования — создание программы, решающей некоторую бизнес-задачу. Действительно, с точки зрения капиталистического общества нет смысла платить деньги за бесполезные программы, пусть даже они успешно компилируются и работают без ошибок.

Test

Конечная цель программирования — создание тестируемой программы. Не каждому проекту может понадобиться этот уровень. Но когда проект нуждается в тестировании, то это накладывает свой отпечаток на стиль написания кода (TDD, инъекция зависимостей и т.п.). Как правило, это проекты с большой кодовой базой и большой текучкой в команде.

Modify

Конечная цель программирования — создание легко изменяемой программы. Эти проекты, как правило, с продолжительным сроком жизни (свыше месяцев) и итерационным подходом к разработке (можно сразу же выкинуть из этого списка лендинги для сельских магазинов, но оставить в нём движок для создания этих самых лендингов).

Итого

Таким образом пирамида »главных целей» программирования может выглядеть так:

«Главные цели» программирования

Я уверен, что можно ещё надстроить уровней «главных целей», но я со своим опытом могу видеть только эти. Кто-то другой может найти ещё цели, которые начинают проявляться после достижения здесь описанных.

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

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

Ну, а коллегу @undeadlol1 зря заминусили, как по мне.

© Habrahabr.ru