Человеческие языки (насколько я это всё понимаю) бывают более или менее контекстно-зависимые. Например, русское слово «смеркается», вырванное из контекста скорее всего будет значить тоже самое, что и в самом контексте. Это удобно тем, что всегда можно его однозначно перевести просто по таблице перевода, а человеку надо меньше напрягать мозг, что бы понять что оно значит. Зато это слово писателю сложнее подогнать под свои нужды и выразить с его помощью что-то новое. Английское слово “do” наоборот: само по себе мало чего значит, зато его можно использовать в окружении других слов в разнообразнейших случаях. Минус понятен: что бы понять, что оно тут значит, надо держать кучу слов в памяти, что создает сильное когнитивное сопротивление.

Если перевести всё сказанное на программирование, то получается что:

Язык конфигурации postfix-а — первый вариант. Assembler — это чуть ли не предел контекстной зависимости. Хорошо бы держать всю память приложения в голове, когда на нем пишешь. Однако вполне понятно, что написать почтовый сервер на ассемблере безумно сложно, но теоретически возможно, а вот на языке конфигурации postfix-а — увы, никак.

Впрочем, столь же очевидно, что настраивать почтовый сервер лучше на нормальном языке, а не на ассемблере, или его адском порождении M4 (RIP sendmail). Связно это, как я считаю, с двумя факторами:

Руби предоставляет очень удобные возможности по созданию DSL-ей, например роуты в рельсах или миграции:


class CreateClubs < ActiveRecord::Migration
  def self.up
    create_table :clubs do |t|
      t.belongs_to :creator
      t.belongs_to :avatar
      
      t.string   :name
      t.text     :description

      t.timestamps
    end 
  end

  def self.down
    drop_table :clubs
  end
end

Практически ничего лишнего, не относящегося к делу. Метод string в контексте смены структуры БД делает вполне конкретную вещь, а belongs_to здесь — совершенно другое, нежели belongs_to в модели.

Чем именно руби лучше, чем использование спец-языка со спец-парсером? Тем, что всегда можно прям в миграции выполнить ещё код, который написан не на спец-языке, не на DSL. Будет огромной ошибкой думать, что «вот, этот ваш руби — лучший способ выстрелить себе в ногу». Проблема расползания кода по разным уровням логики существует давно и пока не решена. MVC — один из древних примеров решения этой проблемы: как разделять логику обработки действий пользователя (контроллер) и бизнес-логику.

У меня родилась такая мысль:

В каком году все эти мысли уже получили гораздо более четкое оформление на бумаге?

Sidebar