Мысли о минимизации кода и максимизации философии данных - PullRequest
18 голосов
/ 09 декабря 2010

Я слышал о концепции минимизации кода и максимизации данных, и мне было интересно, какие советы могут дать мне другие люди о том, как / почему я должен делать это при создании своих собственных систем?

Ответы [ 6 ]

23 голосов
/ 26 января 2011

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

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

Конкретный пример: рассмотрим прогрессивную систему подоходного налога с налоговыми скобками в 1000, 10000 и 100000 долларов США. Доход ниже 1000 долларов не облагается налогом. Доход от 1000 до 9999 долларов облагается налогом по ставке 10%. Доход от 10 000 до 99 999 долларов облагается налогом по ставке 20%. А доход свыше 100 000 долларов облагается налогом в размере 30%. Если бы вы записали все это в коде, это выглядело бы так, как вы подозреваете:

total_tax_burden(income) {
    if (income < 1000)
        return 0
    if (income < 10000)
        return .1 * (income - 1000)
    if (income < 100000)
        return 999.9 + .2 * (income - 10000)
    return 18999.7 + .3 * (income - 100000)
}

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

Но если бы она была управляемой данными, вы могли бы сохранить эту таблицу в файле конфигурации:

1000:0
10000:10
100000:20
inf:30

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

А теперь кое-что менее очевидное: тестирование. Проект AppArmor содержит сотни тестов на то, что должны делать системные вызовы при загрузке различных профилей. Один пример теста выглядит так:

#! /bin/bash
# $Id$

#   Copyright (C) 2002-2007 Novell/SUSE
#
#   This program is free software; you can redistribute it and/or
#   modify it under the terms of the GNU General Public License as
#   published by the Free Software Foundation, version 2 of the
#   License.

#=NAME open
#=DESCRIPTION 
# Verify that the open syscall is correctly managed for confined profiles.  
#=END

pwd=`dirname $0`
pwd=`cd $pwd ; /bin/pwd`

bin=$pwd

. $bin/prologue.inc

file=$tmpdir/file
okperm=rw
badperm1=r
badperm2=w

# PASS UNCONFINED
runchecktest "OPEN unconfined RW (create) " pass $file

# PASS TEST (the file shouldn't exist, so open should create it
rm -f ${file}
genprofile $file:$okperm
runchecktest "OPEN RW (create) " pass $file

# PASS TEST
genprofile $file:$okperm
runchecktest "OPEN RW" pass $file

# FAILURE TEST (1)
genprofile $file:$badperm1
runchecktest "OPEN R" fail $file

# FAILURE TEST (2)
genprofile $file:$badperm2
runchecktest "OPEN W" fail $file

# FAILURE TEST (3)
genprofile $file:$badperm1 cap:dac_override
runchecktest "OPEN R+dac_override" fail $file

# FAILURE TEST (4)
# This is testing for bug: https://bugs.wirex.com/show_bug.cgi?id=2885
# When we open O_CREAT|O_RDWR, we are (were?) allowing only write access
# to be required.
rm -f ${file}
genprofile $file:$badperm2
runchecktest "OPEN W (create)" fail $file

Он использует некоторые вспомогательные функции для генерации и загрузки профилей, тестирования результатов функций и представления отчетов пользователям. Гораздо проще расширить эти маленькие тестовые сценарии, чем написать такую ​​функциональность без небольшого количества языка. Да, это сценарии оболочки, но они настолько далеки от реальных сценариев оболочки;) что они практически являются данными.

Надеюсь, это поможет мотивировать программирование на основе данных; Боюсь, я не так красноречив, как другие, кто писал об этом, и я, конечно, не получил хорошо , но я стараюсь.

18 голосов
/ 28 января 2011

В современном программном обеспечении грань между кодом и данными может стать ужасно тонкой и размытой, и не всегда легко отличить их друг от друга.В конце концов, что касается компьютера, все это data , если только существующий код - обычно ОС - не определен иначе.Даже программы должны быть загружены в память как данные, прежде чем ЦПУ сможет их выполнить.

Например, представьте алгоритм, который вычисляет стоимость заказа, когда более крупные заказы получают более низкие цены за единицу.Он является частью более крупной программной системы в магазине, написанной на C.

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

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

Магазин нанимает компетентного программиста, и она встраивает хороший синтаксический анализатор математических выражений в исходный код на Си.Входной файл теперь содержит выражение с глобальными переменными, такими функциями, как log() и tan(), а также некоторые простые вещи, такие как постоянная Планка и скорость carbon-14 * 1016.* деградация.

cost = (base * ordered * exchange * ... + ... / ...)^13

Большинство людей по-прежнему утверждают, что выражение, даже если оно не так просто, как таблица, на самом деле является данными.В конце концов, это, вероятно, предоставлено руководством как есть.

Магазин получает большое количество жалоб от клиентов, которые потеряли сознание, пытаясь оценить свои расходы, и от бухгалтеров о большом количестве потерь.менять.Магазин решает вернуться к столу для небольших заказов и использовать последовательность Фибоначчи для более крупных заказов.

Программист устал от модификации и перекомпиляции кода C, поэтому она встраивает Pythonвместо интерпретатора.Входной файл теперь содержит функцию Python, которая опрашивает целое число Fib(n) обезьян на предмет стоимости больших заказов.

Вопрос: Является ли данными входного файла?

С технической точки зрения нет ничего другого.И таблицу, и выражение необходимо проанализировать перед использованием.Синтаксический анализатор математических выражений, вероятно, поддерживает ветвление и функции - возможно, он не был завершен по Тьюрингу, но он все еще использует собственный язык (например, MathML).

И все же сейчас многие людиутверждают, что входной файл просто стал кодом .

Так что же является отличительной особенностью , которая превращает формат ввода из data в код ?

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

  • Формат ввода: Это - на мой взгляд, наивно - самый распространенный фактор, который люди считают: «Если это на языке программирования, то это код» .Хорошо, C - это код - вы должны его скомпилировать.Я также согласен с тем, что Python также является кодом - он является полноценным языком.Так почему же не является XML / XSL-кодом? XSL - довольно сложный язык сам по себе - отсюда и название L.

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

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

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

Это также означает, чтоРазличия могут быть затронуты доступным набором инструментов.Спецификация UML - настоящий кошмар, но в наши дни у нас есть все эти графические редакторы UML, которые могут нам помочь.Если был какой-то сторонний высокоуровневый инструмент ИИ, который анализирует естественный язык и производит XML / Python / что угодно, то система становится управляемой данными даже для гораздо более сложного ввода.

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

С другой стороныу многомиллиардной международной корпорации обычно в штате есть группа ИТ-специалистов и веб-дизайнеров.Поэтому XML / XSL, Javascript или даже Python и PHP, вероятно, достаточно просты для обработки.У него также есть достаточно сложные требования, чтобы что-то более простое могло бы просто не сократить его.

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

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

5 голосов
/ 02 февраля 2011

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

Учитывая множество данных, вы можете пойти дальше: статистика может влиять на решения.Питер Норвиг написал великую главу , иллюстрирующую эту тему в Красивые данные , с текстом, кодом и данными, доступными в Интернете.(Раскрытие: я благодарен в благодарностях.) На стр. 238-239:

Как подход, основанный на данных, сравнивается с более традиционным процессом разработки программного обеспечения, в котором программист кодирует явные правила?... Понятно, что рукописные правила сложно разрабатывать и поддерживать.Большим преимуществом метода, управляемого данными, является то, что в данных закодировано так много знаний, и новые знания можно добавить, просто собирая больше данных.Но еще одно преимущество состоит в том, что, хотя данные могут быть массивными, код является кратким - около 50 строк для correct, по сравнению с более чем 1500 для кода правописания ht: // Dig....

Еще одна проблема - переносимость.Если бы мы хотели латышский корректор правописания, английские правила метафона были бы бесполезны.Чтобы перенести управляемый данными алгоритм correct на другой язык, все, что нам нужно, это большой корпус латышского языка;код остается неизменным.

Он показывает это конкретно с кодом на Python, используя набор данных, собранный в Google.Помимо исправления орфографии, есть код для сегментирования слов и расшифровки криптограмм - опять же, всего за пару страниц, где книга Грэди Буча потратила десятки, даже не закончив ее.

"«Неоправданная эффективность данных» развивает ту же тему более широко, безо всяких гаек.

Я использовал этот подход в своей работе для другой поисковой компании, и я думаю, что он все еще недостаточно эксплуатируется по сравнению спрограммирование на основе таблиц / DSL, потому что большинство из нас не слишком много плавали в данных до последнего десятилетия.

5 голосов
/ 01 февраля 2011

Один из пяти принципов под Unix Philosophy , представленный Rob Pike , таков:

Данные доминируют. Если вы правильно выбрали структуры данных и упорядочили вещи, алгоритмы почти всегда будут самоочевидными. Структуры данных, а не алгоритмы, являются центральными в программировании.

Его часто сокращают до «написать глупый код, который использует умные данные».

4 голосов
/ 02 февраля 2011

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

В процедурном отношении различие отмечено, и мы склонны думать о данных как о чем-то , хранящемся в специфическом виде, но даже в процедурном порядке лучше скрыть data за API или за объектом в OO.

A lookup(avalue) может быть переопределено многими различными способами в течение его срока службы, если он начинается как функция.

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

E. W. Dijkstra в Примечания по структурированному программированию , 1969, в цитировании John Allen , в Anatomy of Lisp , 1978.

3 голосов
/ 29 января 2011

Когда я думаю об этой философии, с которой я немного согласен, первое, что приходит на ум, - это эффективность кода.

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

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

Это также позволяетдля гораздо более динамичных приложений и новых функций.

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

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

Я считаю, что это делает код более легким в обслуживании, более гибким и более эффективным, и мне это нравится.

Спасибо другим заВаш вклад в этом также!Я нашел это очень обнадеживающим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...