Déjame hacerte una contrapregunta completamente seria: ¿Cuál es, en tu opinión, la diferencia entre "datos" y "código"?
Cuando escucho la palabra "datos", pienso "estado". Los datos son, por definición, lo que la aplicación en sí está diseñada para administrar y, por lo tanto, es lo que la aplicación nunca puede saber en tiempo de compilación. No es posible codificar los datos, porque tan pronto como los codifica, se convierte en comportamiento, no en datos.
El tipo de datos varía según la aplicación; un sistema de facturación comercial puede almacenar información de clientes y pedidos en una base de datos SQL, y un programa de gráficos vectoriales puede almacenar datos de geometría y metadatos en un archivo binario. En ambos casos y todo lo demás, hay una separación clara e irrompible entre el código y los datos. Los datos pertenecen al usuario , no al programador, por lo que nunca se pueden codificar.
De lo que parece estar hablando es de usar la descripción más precisa técnicamente disponible para mi vocabulario actual: información que rige el comportamiento del programa que no está escrito en el lenguaje de programación principal utilizado para desarrollar la mayoría de la aplicación.
Incluso esta definición, que es considerablemente menos ambigua que solo la palabra "datos", tiene algunos problemas. Por ejemplo, ¿qué pasa si partes significativas del programa están escritas en diferentes idiomas? Personalmente, he trabajado en varios proyectos que tienen aproximadamente 50% C # y 50% JavaScript. ¿Es el código JavaScript "datos"? La mayoría de la gente diría que no. ¿Qué pasa con el HTML, son esos "datos"? La mayoría de la gente aún diría que no.
¿Qué hay de CSS? ¿Son esos datos o código? Si pensamos que el código es algo que controla el comportamiento del programa, entonces CSS no es realmente código, porque solo (bueno, principalmente) afecta la apariencia, no el comportamiento. Pero tampoco son realmente datos; el usuario no lo posee, la aplicación ni siquiera lo posee. Es el equivalente de código para un diseñador de interfaz de usuario. Es como un código, pero no del todo código.
Podría llamar a CSS un tipo de configuración, pero una definición más práctica es que es simplemente código en un lenguaje específico de dominio . Eso es lo que a menudo representan su XML, YAML y otros "archivos formateados". Y la razón por la que usamos un lenguaje específico de dominio es que, en términos generales, es simultáneamente más conciso y más expresivo en su dominio particular que codificar la misma información en un lenguaje de programación de propósito general como C o C # o Java.
¿Reconoces el siguiente formato?
{
name: 'Jane Doe',
age: 27,
interests: ['cats', 'shoes']
}
Estoy seguro de que la mayoría de la gente lo hace; es JSON . Y aquí está lo interesante de JSON: en JavaScript, es claramente código, y en cualquier otro idioma, son datos claramente formateados. Casi todos los lenguajes de programación convencionales tienen al menos una biblioteca para "analizar" JSON.
Si usamos exactamente la misma sintaxis dentro de una función en un archivo JavaScript, no puede ser otra cosa que código. Y, sin embargo, si tomamos ese JSON, lo guardamos en un .jsonarchivo y lo analizamos en una aplicación Java, de repente son "datos". ¿Eso realmente tiene sentido?
Sostengo que la "data-ness" o "configuration-ness" o "code-ness" es inherente a lo que se describe, no a cómo se describe.
Si su programa necesita un diccionario de 1 millón de palabras para, por ejemplo, generar una frase de contraseña aleatoria, ¿desea codificarlo así:
var words = new List<string>();
words.Add("aa");
words.Add("aah");
words.Add("ahhed");
// snip 172836 more lines
words.Add("zyzzyva");
words.Add("zyzzyvas");
¿O simplemente insertaría todas esas palabras en un archivo de texto delimitado por líneas y le diría a su programa que lea? Realmente no importa si la lista de palabras nunca cambia, no se trata de si está codificando o codificando (que muchos consideran correctamente un antipatrón cuando se aplica de manera inapropiada), es simplemente una cuestión de qué formato es más eficiente y hace que sea más fácil describir el "material", sea cual sea el "material". Es bastante irrelevante si lo llamas código o datos; es la información que requiere su programa para ejecutarse, y un formato de archivo plano es la forma más conveniente de administrarlo y mantenerlo.
Suponiendo que siga las prácticas adecuadas, todas estas cosas pasarán al control de la fuente de todos modos, por lo que también podría llamarlo código, solo código en un formato diferente y quizás muy minimalista. O puede llamarlo configuración, pero lo único que realmente distingue el código de la configuración es si lo documenta o no y le dice a los usuarios finales cómo cambiarlo. Tal vez podría inventar algún argumento falso sobre la configuración que se interpreta en el momento del inicio o el tiempo de ejecución y no en el momento de la compilación, pero luego comenzaría a describir varios lenguajes dinámicamente escritos y casi cualquier cosa con un motor de secuencias de comandos incrustado dentro de él (p. Ej. la mayoría de los juegos). El código y la configuración son lo que decida etiquetarlos, nada más y nada menos.
Ahora bien, no es un peligro para la externalización de la información que no es realmente seguro modificar (véase el enlace "suave codificación" más arriba). Si externaliza su conjunto de vocales en un archivo de configuración y lo documenta como un archivo de configuración para sus usuarios finales, les está dando una forma casi infalible de romper instantáneamente su aplicación, por ejemplo, poniendo "q" como vocal. Pero ese no es un problema fundamental con la "separación de código y datos", es simplemente un mal sentido del diseño.
Lo que les digo a los desarrolladores junior es que siempre deben externalizar las configuraciones que esperan cambiar por entorno. Eso incluye cosas como cadenas de conexión, nombres de usuario, claves API, rutas de directorio, etc. Ellos podrían ser el mismo en su caja dev y en la producción, pero probablemente no, y los administradores de sistemas decidirán cómo quieren que se vea en la producción, no a los desarrolladores. Por lo tanto, necesita una forma de aplicar un grupo de configuraciones en algunas máquinas, y otras configuraciones aplicadas en otras máquinas: ergo, archivos de configuración externos (o configuraciones en una base de datos, etc.)
Pero enfatizo que simplemente poner algunos "datos" en un "archivo" no es lo mismo que externalizarlos como configuración. Poner un diccionario de palabras en un archivo de texto no significa que desee que los usuarios (o TI) lo cambien, es solo una forma de facilitar que los desarrolladores entiendan qué demonios está sucediendo y, si es necesario, cambios ocasionales Del mismo modo, poner la misma información en una tabla de base de datos no necesariamente cuenta como externalización del comportamiento, si la tabla es de solo lectura y / o los DBA tienen instrucciones de no atornillarla. La configuración implica que los datos son mutables, pero en realidad eso está determinado por el proceso y las responsabilidades más que por la elección del formato.
Entonces, para resumir:
"Código" no es un término rígidamente definido. Si expande su definición para incluir lenguajes específicos de dominio y cualquier otra cosa que afecte el comportamiento, gran parte de esta aparente fricción simplemente desaparecerá y todo tendrá sentido. Puede tener un "código" DSL no compilado en un archivo plano.
"Datos" implica información que es propiedad del usuario (s) o al menos alguien que no sea el desarrollador, y que generalmente no está disponible en el momento del diseño. No podría estar codificado incluso si quisieras hacerlo. Con la posible excepción del código auto modificable , la separación entre código y datos es una cuestión de definición, no de preferencia personal.
La "codificación suave" puede ser una práctica terrible cuando se aplica en exceso, pero no todas las instancias de externalización necesariamente constituyen una codificación suave, y muchas instancias de almacenamiento de información en "archivos planos" no son necesariamente un intento de buena fe de externalización.
La configuración es un tipo especial de codificación suave que es necesaria debido al conocimiento de que la aplicación puede necesitar ejecutarse en diferentes entornos. Implementar un archivo de configuración separado junto con la aplicación es mucho menos trabajo (y mucho menos peligroso) que implementar una versión diferente del código en cada entorno. Entonces, algunos tipos de codificación suave son realmente útiles.