Страницы

Частные решения в общей задаче

Когда нужно решить относительно небольшую задачу, почти всегда есть уместное желание, проведя обобщение, решить нечто большее, включая будущие задачи. Здесь бывает трудно остановиться, так как почти любые практические обобщения сами являются частностями ещё больших обобщений. С другой стороны было бы большой ошибкой пытаться решить задачу череcчур обобщённо, так как это может неоправданно затянуть решение текущей задачи.

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

Распутать всемирную путанину

Совокупность современных стандартов предоставления информации во всемирной сети, а также средств их просмотра чрезвычайно сложна, несистемна, избыточна. Полноценные браузеры - это огромные комплексы кода, неподвластные полному пониманию человеком. Только крупные компании могут себе позволить разрабатывать и поддерживать такое ПО, да и то немногие. Наличие открытых исходных кодов ничего по сути не меняет. Свободное сообщество в нынешнем виде может либо только плестись за могущественными корпорациями, либо самоизолироваться. Можно ли это изменить?

Препроцессорная бомба

#define A ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
#define B A A A A A A A A A A A A A A A A
#define C B B B B B B B B B B B B B B B B
#define D C C C C C C C C C C C C C C C C
#define E D D D D D D D D D D D D D D D D
#define F E E E E E E E E E E E E E E E E
#define G F F F F F F F F F F F F F F F F
#define H G G G G G G G G G G G G G G G G
#define I H H H H H H H H H H H H H H H H
#define J I I I I I I I I I I I I I I I I
#define K J J J J J J J J J J J J J J J J
#define L K K K K K K K K K K K K K K K K
#define M L L L L L L L L L L L L L L L L
#define O M M M M M M M M M M M M M M M M
#define P O O O O O O O O O O O O O O O O
#define Q P P P P P P P P P P P P P P P P

Q

Как вы думаете, текст какого размера порождает эта простенькая препроцессорная программа?

Ограничение словаря идентификаторов

Типичное программирование не требует такого богатого набора понятий, какой существует в естественных языках. Можно было бы использовать достаточно ограниченный набор слов для сложносочинённых идентификаторов, что упростило бы их запоминание и использование. Однако при отсутствии контроля над словарём разработчик склонен к использованию более широкого словарного запаса за счёт ненужной(?) синонимизации. Если снабдить средства трансляции дополнительным контролем за словами, используемыми в программе, за счёт ведения общего словаря ограниченного размера, можно было бы получить интересный результат.

Чему ещё может помочь такой инструмент?

  1. Избеганию омонимов и достижению двунаправленной однозначности
  2. Слежению за способами комбинирования слов в иденитификаторах для избегания формирования разных идентификаторов со схожими смыслами
  3. Поддержанию общего набора определений, особо полезного для неологизмов и нераспространённых сокращений
  4. Интернационализации исходных кодов
  5. Создание новых, логически составленных терминов для ясного и, может быть, краткого обозначения.

Наследие в развивающейся системе без раздувания сложности

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

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

Вездесущее программирование или ПОП

Программирование компьютеров в его привычном понимании — это самый мощный способ взаимодействия с машиной и единственный, позволяющий использовать её любым из возможных для программного обеспечения способов. Но если посмотреть шире, то практически любое взаимодействие с машиной можно назвать программированием, в том числе и взаимодействие с программой, предлагающее лишь однообразный набор реакций на скромный список воздействий.

Строительная аналогия в программировании

Думаю, найдётся мало таких программистов, которым бы не рассказывали про правильный подход к созданию программ через строительную аналогию. Под ней подразумевается, что перед тем, как что-то строить, его сначала нужно спроектировать. При этом под строительством в программировании подразумевается кодирование на языке, а под проектированием — создание высокоуровневой архитектуры. Знаете, почему так происходит? Думаю, из-за того, что те, кто приводят эту аналогию, плохо понимают в строительстве.