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

Разница в подходах к языкам программирования. Когда вам нравится какой-то язык, почему он вам нравится? Или что вы хотите от языка?

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

(define (mpower M p)
  (cond [(= p 1) M]
        [(even? p) (mpower (matrix* M M) (/ p 2))]
        [else (matrix* M (mpower M (sub1 p)))]))
(for ([i (in-range 1 11)])
  (printf "a^~a = ~s\n" i (matrix-expt a i)))

("источник")

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

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

Код должен скрывать неважные несущественные детали за пределами области видимости и оставлять важные на виду.

Вот пример «простого скучного кода», который ни в коей мере не красив, но с благодарностью принят читателем:

def save_settings(self):
  """Saves the current settings to persistent storage."""
  self.brushmanager.save_brushes_for_devices()
  self.brushmanager.save_brush_history()
  self.filehandler.save_scratchpad(self.scratchpad_filename)
  settingspath = join(self.user_confpath, 'settings.json')
  jsonstr = helpers.json_dumps(self.preferences)
  with open(settingspath, 'w') as f:
    f.write(jsonstr)

(из редактора Mypaint).

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

Но, черт возьми, последнее читабельно! Вы можете просмотреть код, не задумываясь над каждым оператором, точкой и столбцом, и при этом понять, что происходит. В красивой формуле, если вы пропустили половину формулы, остальное бесполезно. Нужно работать по формуле. Ярлыки не допускаются.

Я работаю большую часть времени с кодом в качестве оператора. Иногда пишу свои. Но я больше читатель, чем писатель. И как читатель я ненавижу код, который требует времени для работы. Элегантная абстрактная ткань для создания классов? Нет, но спасибо за предложение. Блестящий DSL, реализованный поверх аппликативных функторов? Я ценю ваши усилия, но мне нужно отказаться от более глубокого участия. Класс-перехватчик с маршрутизацией полиморфного типа? Никогда больше.

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

Тем не менее, я не хочу, чтобы программа рассматривалась как список формул. Я хочу, чтобы это рассматривалось как текст. Не как грамотное программирование (которое невозможно поддерживать), а как важный текст, который я могу читать, не останавливаясь на каждом слоге.