Pregunta

He oído hablar del concepto de minimizar el código y la maximización de los datos, y se preguntaba qué consejo que otras personas me pueden dar sobre cómo / por qué debería hacer esto cuando la construcción de mi propio sistema?

¿Fue útil?

Solución

En el software moderno de la línea entre el código y los datos puede llegar a ser muy delgada y borrosa, y no siempre es fácil diferenciar entre los dos. Después de todo, por lo que el equipo se refiere, todo es datos , a no ser que se determina por el código existente - normalmente el sistema operativo - a ser de otra manera. programas siquiera tiene que ser cargado en la memoria como datos, antes de que la CPU puede ejecutarlos.

Por ejemplo, imagine un algoritmo que calcula el coste de una orden, donde las órdenes mayores obtienen precios más bajos por artículo. Es parte de un sistema de software más grande en una tienda, escrito en C.

Este algoritmo está escrito en C y lee un archivo que contiene una tabla de entrada proporcionada por la administración con los diferentes precios-artículo por y los correspondientes umbrales de tamaño de orden. La mayoría de la gente diría que un archivo con una tabla de entrada simple es, por supuesto, los datos.

Ahora, imaginemos que la tienda cambia su política de algún tipo de función asintótica, en lugar de umbrales preseleccionados, de modo que pueda acomodar increíblemente grandes pedidos. También puede ser que desee factor en los tipos de cambio y la inflación - o lo que la gente de gestión de llegar a

.

La tienda contrata a un programador competente y se incrusta un buen analizador de expresiones matemáticas en el código original C. El archivo de entrada contiene ahora una expresión con variables globales, funciones tales como log() y tan(), así como algunas cosas simples como la constante de Planck y la tasa de carbono-14 degradación .

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

La mayoría de la gente todavía podría argumentar que la expresión, aunque no sea tan simple como una tabla, es de hecho, datos. Después de todo lo que es, probablemente, proporciona tal como es por la dirección.

La tienda recibe una gran cantidad de quejas de los clientes que se convirtió en muerte cerebral tratando de estimar sus gastos y de las personas que representan aproximadamente la gran cantidad de monedas sueltas. La tienda decide volver a la mesa para pedidos pequeños y utilizar un Fibonacci secuencia para grandes pedidos.

El programador se cansa de modificar y volver a compilar el código C, por lo que incorpora un pitón interpretter lugar. El archivo de entrada contiene ahora una función de Python que las encuestas un roomfull de monos Fib(n) por el costo de grandes pedidos.

Pregunta:? es este los datos del archivo de entrada

Desde un estricto punto de vista técnico, no hay nada diferente. Tanto la mesa y la expresión necesaria para ser analizados antes de su uso. El analizador de expresiones matemáticas, probablemente, soportada ramificación y funciones -. Podría no haber sido Turing completo, pero todavía se utiliza un lenguaje propio (por ejemplo, MathML)

Sin embargo, ahora muchas personas podrían argumentar que el archivo de entrada sólo se convirtió en código .

Entonces, ¿cuál es el rasgo distintivo que convierte el formato de entrada de datos en código

  • modificabilidad: Tener que volver a compilar todo el sistema para efectuar un cambio es un muy buena indicación de un sistema centrado en el código. Sin embargo, me puedo imaginar fácilmente (bueno, más bien tengo en realidad visto ) de software que ha sido diseñado de manera incompetente suficiente para tener, por ejemplo, una tabla de entrada incorporado en tiempo de compilación. Y no hay que olvidar que muchas aplicaciones todavía tienen iconos - que la mayoría de la gente consideraría datos -. Construida en sus ejecutables

  • Formato de entrada: Este es el - en mi opinión, ingenuamente - factor más común que la gente considera: "Si se trata de un lenguaje de programación, entonces es código" . Bien, C es el código - que tiene que compilar después de todo. También me acuerdo que Python es también el código - que es un lenguaje completo soplado. Entonces, ¿por no código XML / XSL? XSL es un lenguaje bastante complejo en sí mismo -. por lo tanto el L en su nombre

En mi opinión, ninguno de estos dos criterios es el real rasgo distintivo . Creo que la gente debe tener en cuenta otra cosa:

  • Capacidad de mantenimiento: En resumen, si el usuario del sistema tiene que contratar a un tercero para que el experiencia necesario para modificar el comportamiento del sistema disponible, entonces el sistema debe ser considerado centrado en el código en un grado.

Esto, por supuesto, significa que si un sistema está controlada por datos, o no se debe considerar al menos en relación con el público objetivo - si no es en relación con el cliente en un caso por -case base.

También significa que la distinción puede verse afectada por el conjunto de herramientas disponibles. El UML especificación es una pesadilla que pasar, pero en estos días que tenemos todos los editores gráficos UML a Ayúdanos. Si hubo algún tipo de herramienta AI alto nivel de terceros que analiza el lenguaje natural y produce XML / Python / lo que sea, entonces el sistema se vuelve basadas en datos, incluso para la entrada mucho más compleja.

Hay una tienda pequeña, probablemente no tiene la experiencia o los recursos para contratar a un tercero. Por lo tanto, algo que permite a los trabajadores para modificar su comportamiento con el conocimiento que se obtendría en un curso de manejo promedio - matemáticas, gráficos, etc -. Podrían considerarse suficientemente impulsada por los datos para este público

Por otro lado, una corporación internacional multimillonaria por lo general tiene en su nómina un grupo de especialistas de TI y diseñadores de páginas web. Por lo tanto, XML / XSL, Javascript, o incluso Python y PHP son probablemente lo suficientemente fácil para que manejar. También tiene suficientes requisitos complejos que algo más simple podría simplemente no es suficiente.

Creo que la hora de diseñar un sistema de software, uno debe esforzarse para lograr ese delicado equilibrio en los formatos de entrada utilizados en el que el público objetivo puede hacer lo que necesidad a sin tener que llamar con frecuencia a terceros.

Debe tenerse en cuenta que la externalización de borra los límites aún más. Hay algunas cuestiones del todo, para los que la tecnología actual, simplemente no permite que la solución sea accesible por el profano. En ese caso, el público objetivo de la solución probablemente debería ser considerado como el tercero al que la operación se subcontrata a. El tercero se puede esperar que emplear un buen número de expertos.

Otros consejos

Normalmente código impulsado por los datos es más fácil de leer y mantener. Sé que he visto casos donde se ha tomado por datos para el extremo y termina muy inutilizable (estoy pensando en algunos despliegues de SAP que he usado), pero la codificación de su propio "dominio específico Idiomas" para ayudarle a construir su software es típicamente un gran ahorro de tiempo.

programadores pragmáticos permanecen en mi mente los defensores más vívidas de escribir poco idiomas que he leído. máquinas de estados pequeños que se ejecutan pequeñas lenguas de entrada pueden obtener un mucho lograrse con muy poco espacio, y que sea fácil de hacer modificaciones.

Un ejemplo concreto: considerar un sistema de impuestos sobre la renta progresivo, con soportes de impuesto en $ 1.000, $ 10.000 y $ 100,000 USD. Ingresos por debajo de $ 1,000 son libres de impuestos. Ingresos entre $ 1,000 y $ 9,999 se grava al 10%. Ingresos entre $ 10,000 y $ 99,999 se grava al 20%. Y los ingresos por encima de $ 100.000 se grava al 30%. Si se va escriba todo esto en el código, se vería tan sospecha:

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)
}

La adición de nuevas categorías de impuestos, el cambio de los soportes existentes, o el cambio de la carga tributaria en los soportes, que todos requieren la modificación del código y volver a compilar.

Sin embargo, si se acciona con los datos, se podría almacenar esta tabla en un fichero de configuración:

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

Escribir una pequeña herramienta para analizar esta tabla y hacer las operaciones de búsqueda (no muy difícil, ¿verdad?) Y ahora cualquiera puede mantener fácilmente las tablas de tasas de impuestos. Si el Congreso decide que 1000 soportes estarían mejor, cualquiera podría hacer que las tablas se alinean con las tablas del IRS, y hacerse con él, volver a compilar es necesario ningún código. El mismo código genérico podría ser utilizado para un soporte o cientos de soportes.

Y ahora para algo que es un poco menos obvio: las pruebas. El href="https://wiki.ubuntu.com/AppArmor" rel="nofollow"> proyecto AppArmor tiene cientos de pruebas para lo que las llamadas al sistema deben hacer cuando se cargan varios perfiles. Uno busca de pruebas de muestra como esta:

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

Se basa en algunas funciones de ayuda para generar y perfiles de carga, probar los resultados de las funciones, y volver informe a los usuarios. Es mucho más fácil de extender estos scripts de prueba pequeños de lo que es para escribir este tipo de funcionalidad sin un poco de lenguaje. Sí, estos son los scripts de shell, pero están tan alejadas de las secuencias de comandos shell reales;.) Que son prácticamente de datos

Espero que esto ayuda a la programación basada en datos motivar; Me temo que no soy tan elocuente como otros que han escrito sobre ello, y desde luego no he conseguido bien en ello, pero lo intento.

Una de las cinco máximas bajo la filosofía Unix , expuestos por Rob Pike , es la siguiente:

domina datos. Si ha elegido las estructuras de datos adecuados y cosas así organizada, los algoritmos casi siempre será evidente por sí mismo. estructuras de datos, algoritmos, no son fundamentales para la programación.

A menudo se acortó a "escribir código estúpida que utiliza datos inteligentes."

Otras respuestas ya han excavado en la forma en que puede a menudo código de comportamiento complejo con código simple que sólo reacciona a la pauta de su entrada en particular. Se puede pensar en los datos como un lenguaje específico de dominio y de su código como intérprete (tal vez un trivial).

Teniendo en cuenta una gran cantidad de datos que puede ir más allá: los estadísticas las decisiones de potencia puede. Peter Norvig escribió un gran capítulo ilustrar este tema en hermoso de datos , con el texto, el código y los datos disponibles en línea. (Disclosure: Estoy agradeció en los reconocimientos.) En pp 238-239:.

¿Cómo funciona el enfoque impulsado por los datos comparar a un desarrollo de software más tradicional procesar las reglas que los códigos de programador explícitas? ... Es evidente que las reglas escritas a mano son difíciles de desarrollar y mantener. El gran ventaja del método basado en datos es que tanto conocimiento se codifica en los datos, y los nuevos conocimientos se pueden añadir simplemente mediante la recopilación de más datos. Sin embargo, otra ventaja es que, si bien los datos pueden ser masivas, el código es-sucinta sobre 50 líneas para correct, en comparación con más de 1.500 para ht: Código de ortografía // Dig. ...

Otra cuestión es la portabilidad. Si quisiéramos un deletreo-corrector de Letonia, el Inglés metaphone normas serían de poca utilidad. Al puerto de correct el algoritmo basado en datos a otro idioma, todo lo que necesitamos es un gran corpus de Letonia; el código se mantiene sin cambios.

Se muestra esto concretamente con código en Python usando un conjunto de datos recogidos en Google. Además de la corrección ortográfica, no hay código para segmentar palabras y descifrar los criptogramas - en tan sólo un par de páginas, de nuevo, donde libro de Grady Booch gastó decenas sin siquiera terminarlo.

"La irrazonable eficacia de datos" desarrolla el mismo tema en términos más generales, sin todos los frutos secos y pernos.

He tomado este enfoque en mi trabajo para otra empresa de búsqueda y creo que está siendo subexplotadas en comparación con la programación basada en tablas / DSL, porque la mayoría de nosotros no estaban nadando en los datos tanto hasta la última década o dos.

En los lenguajes de código en el que se puede tratar como datos es un no-tema. Utiliza lo que está claro, breve y fácil de mantener, inclinándose hacia los datos, código, funcional, orientado a objetos, o de procedimiento, ya que la solución requiere.

En procesal, la distinción está marcado, y tendemos a pensar en los datos como algo almacenados en un específica manera, pero incluso en los procedimientos que lo mejor es ocultar la datos detrás de una API, o detrás de un objeto en OO.

A lookup(avalue) puede reimplementada de muchas maneras diferentes durante su vida útil, siempre y cuando sus aperturas como una función.

... Todo el tiempo que los programas para máquinas no existente y añadir Diseño: 'si ahora tuviera una máquina que comprende las primitivas aquí se supone, entonces el trabajo está hecho.' ... En la práctica, por supuesto, esta máquina ideal va a salir, no existiendo, por lo que nuestra siguiente tarea --structurally similar a la original uno-- es programar la simulación de la máquina "superior" ... Pero esto montón de programas está escrito para una máquina que con toda probabilidad no existirá, por lo que nuestro siguiente trabajo será para simularlo en términos de programas para una máquina siguiente nivel inferior, etc., hasta que por fin tenemos un programa que puede ser ejecutado por nuestro hardware ...

E. W. Dijkstra en Notas sobre la programación estructurada , 1969, citado por John Allen , en Anatomía de Lisp , 1978.

Cuando pienso en esta filosofía que estoy de acuerdo con un poco, la primera cosa que viene a la mente es la eficiencia del código.

Cuando estoy haciendo el código que estoy seguro que no siempre es algo cercano a la perfección o incluso un entendido. Sabiendo lo suficiente para acercarse a la máxima eficiencia de una máquina cuando es necesario y una buena eficiencia del resto del tiempo (tal vez la negociación fuera para un mejor flujo de trabajo) me ha permitido producir productos acabados de alta calidad.

Codificación de una manera basada en los datos, que terminan usando código para qué código es para. Para ir y 'externalización' todas las variables de archivos sería absurdo extremo, la funcionalidad de un programa tiene que estar en el programa y el contenido, configuración y otros factores pueden ser gestionados por el programa.

Esto también permite que las aplicaciones mucho más dinámicos y nuevas características.

Si usted tiene incluso una forma simple de base de datos, que son capaces de aplicar la misma funcionalidad que muchos estados. También puede hacer todo tipo de cosas creativas como cambiar el contexto de lo que está haciendo su programa basado en datos de cabecera de archivos o quizás directorio, nombre de archivo o extensión, aunque no todos los datos son necesariamente almacenados en un sistema de archivos .

Finalmente mantener su código en un estado en el que está manejando simplemente coloca los datos en un estado de ánimo en el que está más cerca de imaginar lo que realmente está pasando. Esto también mantiene el volumen fuera de su código, reduciendo en gran medida programas de relleno.

Creo que hace que el código sea más fácil de mantener, más flexible y más eficiente Aaaand me gusta.

Gracias a los demás para su entrada en esta también! Me pareció muy alentador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top