Pull to refresh

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

Level of difficultyEasy
Reading time3 min
Views7.9K

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

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

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

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

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

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

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

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

Write

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

Compile

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

Run

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

Business

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

Update: если вам не нравится программирование за деньги, считайте, что программа должна решать некоторую общественно (на край - персонально) значимую проблему.

Read

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

Test

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

Modify

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

Итого

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

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

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

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

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

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

P.S.

Добавил пункт Read.

Tags:
Hubs:
Total votes 27: ↑14 and ↓13+4
Comments42

Articles