Размышления о философии минимизации кода и максимизации данных

StackOverflow https://stackoverflow.com/questions/4397883

  •  10-10-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

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

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

Итак, что же это за отличительная особенность это превращает формат ввода из данные в код?

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

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

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

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

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

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

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

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

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

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

Другие советы

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

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

Конкретный пример:рассмотрим прогрессивную систему подоходного налога с налоговыми рамками в размере 1000, 10 000 и 100 000 долларов США.Доход ниже 1000 долларов не облагается налогом.Доход от 1000 до 9 999 долларов облагается налогом в размере 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 и покончить с этим, не требуя перекомпиляции кода.Один и тот же общий код может быть использован для одной или сотен скобок.

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

#! /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

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

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

Один из пяти максима под UNIX Философия, как представлено Роб Пайк, это:

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

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

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

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

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

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

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

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

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

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

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

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

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

EW Dijkstra в Примечания по структурированному программированию, 1969, как цитирует Джон Аллен, в Анатомия LISP, 1978.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top