Подтвердить что ты не робот

Мысли о минимизации кода и максимизации философии данных

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Часто сокращается "писать глупый код, который использует интеллектуальные данные".

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

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

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

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

E. W. Dijkstra в заметках о структурированном программировании, 1969, цитируется Джон Аллен, в анатомии Lisp, 1978.

Ответ 6

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

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

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

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

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

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

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

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