Question

Je l'ai entendu parler du concept de minimiser le code et la maximisation des données, et je me demandais quels conseils d'autres personnes peuvent me donner sur comment / pourquoi je devrais le faire lors de la construction de mes propres systèmes?

Était-ce utile?

La solution

Dans le logiciel moderne de la ligne entre le code et les données peuvent devenir terriblement mince et floue, et il est pas toujours facile de distinguer les deux. Après tout, dans la mesure où l'ordinateur est concerné, tout est données , à moins qu'il est déterminé par le code existant - normalement le système d'exploitation - pour être autrement. Même les programmes doivent être chargés dans la mémoire sous forme de données, avant que le processeur peut les exécuter.

Par exemple, imaginez un algorithme qui calcule le coût d'un ordre, où des commandes plus importantes obtiennent des prix plus bas par article. Il fait partie d'un système logiciel plus dans un magasin, écrit en C.

Cet algorithme est écrit en C et lit un fichier qui contient une table d'entrée fournie par la direction avec les différents prix par élément et les seuils d'ordre correspondant. La plupart des gens affirment qu'un fichier avec une table d'entrée est simple, bien sûr, les données.

Maintenant, imaginez que le magasin modifie sa politique à une sorte de fonction asymptotique, plutôt que des seuils de pré-sélectionnés, afin de pouvoir accueillir des commandes incroyablement grandes. Ils pourraient aussi vouloir facteur des taux de change et l'inflation - ou tout ce que les gens de gestion viennent avec

.

Le magasin engage un programmeur compétent et elle intègre un analyseur d'expression mathématique bien dans le code original C. Le fichier d'entrée contient maintenant une expression avec les variables globales, des fonctions telles que log() et tan(), ainsi que des trucs simples comme le constante de Planck et la vitesse de carbone-14 dégradation .

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

La plupart des gens soutiennent encore que l'expression, même si pas aussi simple que d'une table, est dans les données de fait. Après tout, il est probablement fourni-est par la direction.

Le magasin reçoit une grande quantité de plaintes de clients qui sont devenus des cerveaux morts en essayant d'estimer leurs dépenses et des personnes représentant au sujet de la grande quantité de monnaie. Le magasin décide de revenir à la table pour les petites commandes et utiliser une séquence pour rel="noreferrer"> Fibonacci commandes plus importantes.

Le programmeur est fatigué de modifier et recompiler le code C, elle intègre un Python interpretter à la place. Le fichier d'entrée contient désormais une fonction Python qui interroge une roomfull des singes Fib(n) pour le coût des grosses commandes.

Question: est ce données du fichier d'entrée

D'un point de vue strictement technique, il n'y a rien d'autre. La table et l'expression nécessaire pour être analysé avant l'utilisation. L'analyseur d'expression mathématique probablement pris en charge et les fonctions de branchement -. Il pourrait ne pas avoir été Turing-complet, mais il utilise encore un langage propre (par exemple MathML)

Pourtant, maintenant beaucoup de gens soutiennent que le fichier d'entrée est juste devenu code .

Alors, quelle est la trait distinctif qui transforme le format d'entrée de données dans code

À mon avis, aucun de ces deux critères est la réelle caractéristique . Je pense que les gens devraient considérer autre chose:

  • maintenabilité: En bref, si le utilisateur du système doit engager un tiers pour faire le expertise nécessaires pour modifier le comportement du système disponible, le système doit être considéré centrée sur le code à un degré.

Ceci, bien sûr, signifie que si un système est basée sur les données ou non doit être considéré au moins par rapport au public cible - sinon par rapport au client sur un cas par base -case.

Cela signifie aussi que la distinction peut être affectée par le jeu d'outils disponibles. UML spécification est un cauchemar pour traverser, mais ces jours-ci, nous avons tous les éditeurs UML graphiques à Aidez nous. S'il y avait une sorte d'outil AI haut niveau tiers qui analyse le langage naturel et produit XML / Python / whatever, le système devient piloté par les données même pour l'entrée beaucoup plus complexe.

Un petit magasin n'a probablement pas l'expertise ni les ressources pour embaucher un tiers. Donc, quelque chose qui permet aux travailleurs de modifier son comportement en sachant que l'on pourrait obtenir un cours de gestion en moyenne - mathématiques, graphiques, etc -. Pourraient être considérés comme suffisamment axée sur les données pour ce public

D'autre part, une société internationale de plusieurs milliards a généralement de sa masse salariale d'un groupe de spécialistes et concepteurs Web. Par conséquent, XML / XSL, Javascript, ou même Python et PHP sont probablement assez facile pour elle de gérer. Il a également des exigences assez complexes que quelque chose plus simple pourrait couper juste pas.

Je crois que lors de la conception d'un système logiciel, on doit chercher à atteindre cet équilibre bien dans les formats d'entrée utilisés où le public cible peut faire ce qu'ils besoin , sans avoir à appeler fréquemment à des tiers.

Il convient de noter que l'externalisation brouille les frontières encore plus. Il y a bien quelques questions, pour lesquelles la technologie actuelle ne permet tout simplement pas la solution d'être accessible par le profane. Dans devrait probablement être considéré ce cas, le public cible de la solution à la tierce partie à laquelle l'opération serait confiée à. Ce tiers peut être prévu d'employer un certain nombre d'experts de juste.

Autres conseils

En général le code piloté par les données est plus facile à lire et à maintenir. Je sais que je l'ai vu des cas où des données ont été axée sur les prises à l'extrême et des vents jusqu'à très inutilisable (je pense à certains déploiements SAP que j'ai utilisé), mais coder votre propre « DSLs » pour vous aider à construire votre logiciel est généralement un gain de temps énorme.

Les programmeurs pragmatiques restent dans mon esprit le plus vif de défenseurs peu d'écriture langues que je l'ai lu. Les petites machines d'état qui fonctionnent peu langues d'entrée peuvent obtenir un beaucoup accompli avec très peu d'espace, et le rendre facile d'apporter des modifications.

Un exemple spécifique: envisager un système d'impôt progressif sur le revenu, avec des tranches d'imposition à 1 000 $, 10 000 $ et 100 000 $ USD. Un revenu inférieur à 1 000 $ est non imposable. Revenu entre 1 000 $ et 9 999 $ sont imposés à 10%. Revenu entre 10 000 $ et 99 999 $ sont imposés à 20%. Et le revenu est supérieur 100 000 $ est imposé à 30%. Si vous étiez écrire tout cela dans le code, il regarderait au sujet que vous pensez:

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

Ajout de nouvelles tranches d'imposition, en changeant les supports existants, ou de modifier la charge fiscale dans les crochets, ont tous besoin de modifier le code et recompiler.

Mais si elle était axée sur les données, vous pouvez stocker ce tableau dans un fichier de configuration:

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

Ecrire un petit outil pour analyser ce tableau et faire les recherches (pas très difficile, non?) Et maintenant quiconque peut facilement maintenir les tables de taux d'imposition. Si le Congrès décide que 1000 crochets seraient mieux, tout le monde pourrait faire les tables alignées avec les tables de l'IRS, et faire avec elle, sans recompiler le code nécessaire. Le même code générique pourrait être utilisé pour un support ou des centaines de crochets.

Et maintenant quelque chose qui est un peu moins évidente: tester. Le projet AppArmor a des centaines de tests pour ce que les appels système doivent faire lorsque différents profils sont chargés. On regarde l'échantillon de test comme ceci:

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

Elle repose sur des fonctions d'aide pour générer et profils de charge, tester les résultats des fonctions, et le dos de rapport aux utilisateurs. Il est beaucoup plus facile d'étendre ces petits scripts de test que d'écrire ce genre de fonctionnalité sans un peu de langue. Oui, ce sont des scripts shell, mais ils sont si loin de scripts shell réels;.) Qu'ils sont pratiquement données

J'espère que cela aide à motiver la programmation axée sur les données; Je crains que je ne suis pas aussi éloquent que d'autres qui ont écrit à ce sujet, et je l'ai certainement pas eu bon à, mais j'essayer.

L'une des cinq maximes sous la Unix philosophie , tel que présenté par Rob Pike , est la suivante:

données. Si vous avez choisi les structures de données bonnes choses et bien organisé, les algorithmes seront presque toujours de soi. structures de données, pas des algorithmes, sont au cœur de la programmation.

Il est souvent abrégé, « écrire le code stupide qui utilise des données intelligentes ».

D'autres réponses ont déjà creusé dans la façon dont vous pouvez le comportement souvent complexe de code avec code simple que seulement réagit au modèle de son entrée particulière. Vous pouvez penser des données comme une langue spécifique de domaine, et de votre code d'interprète (peut-être un trivial).

Étant donné beaucoup de données que vous pouvez aller plus loin: les statistiques peut les décisions de puissance. Peter Norvig a écrit un grand chapitre illustrant ce thème dans Belle données , avec le texte, le code et les données disponibles en ligne. (Divulgation: Je remercie dans les remerciements.) Pp 238-239.

  

Comment l'approche axée sur les données à comparer un développement logiciel plus traditionnel   procédé dans lequel les codes de programmation des règles explicites? ... De toute évidence, les règles écrites à la main sont difficiles à développer et à entretenir. Le grand   avantage du procédé est piloté par les données que tant de connaissances est codée dans les données,   et de nouvelles connaissances peuvent être ajoutées simplement en recueillant plus de données. Mais un autre avantage est   que, alors que les données peuvent être massives, le code est succinct-environ 50 lignes pour correct, par rapport à plus de 1 500 pour ht: code d'orthographe // Dig. ...

     

Une autre question est la portabilité. Si nous voulions un Letton épellation Correcteur, les Anglais   règles de metaphone seraient de peu d'utilité. Pour le port de l'algorithme correct piloté par les données à un autre   langue, tous nous avons besoin est un grand corpus de Lettonie; le code reste inchangé.

Il montre concrètement ce avec le code en Python en utilisant un ensemble de données recueillies à Google. En plus de la correction d'orthographe, il y a un code à segmenter les mots et Déchiffrer cryptogrammes - en seulement quelques pages, encore une fois, où le livre de Grady Booch a passé des dizaines sans même finir.

« L'efficacité des données Déraisonnable » développe le même thème plus large, sans tous les écrous et des boulons.

J'ai pris cette approche dans mon travail pour une autre société de recherche et je pense qu'il est encore sous-exploité par rapport Driven table / programmation DSL, parce que la plupart d'entre nous nageaient pas tant de données jusqu'à la dernière décennie ou deux.

Dans les langues où le code peut être considéré comme des données est un non-problème. Vous utilisez ce qui est clair, bref et maintenable, se penchant vers les données, code, fonctionnel, OO ou procédural, comme la solution exige.

Dans la procédure, la distinction est marquée, et nous avons tendance à penser à des données comme quelque chose stocké dans un spécifique chemin, mais même dans la procédure, il est préférable de cacher la données derrière une API, ou derrière un objet en OO.

A lookup(avalue) peut être réimplémenté dans de nombreuses façons différentes au cours de sa vie, tant que ses démarrages en fonction.

... Tout le temps que je les programmes desing pour machines et ajouter non existants: « si nous avions maintenant une machine comprenant les primitives supposé ici, le travail est fait. » ... Dans la pratique, bien sûr, cette machine idéale tournera pas Exister, notre prochaine tâche --structurally semblable à l'original One-- est de programmer la simulation de la machine « supérieure » ... Mais tas de programmes est écrit pour une machine qui, selon toute probabilité n'existera, notre prochain travail sera de simuler en termes de programmes pour une machine de niveau inférieur suivant, etc., jusqu'à ce que nous avons enfin un programme qui peut être exécuté par notre matériel ...

E. W. Dijkstra Remarques sur la programmation structurée , 1969, cité par John Allen , Anatomie de Lisp , 1978.

Quand je pense à cette philosophie que je suis d'accord avec un peu, la première chose qui vient à l'esprit est l'efficacité du code.

Quand je fais du code, je sais que ce n'est pas toujours tout proche de la perfection ou même complètement informé. assez savoir pour se rapprocher de l'efficacité maximale sur une machine quand il est nécessaire et une bonne efficacité le reste du temps (peut-être troquer pour un meilleur flux de travail) m'a permis de produire des produits finis de haute qualité.

codage d'une manière axée sur des données, vous vous retrouvez à l'aide de code pour ce code est pour. Pour aller « sous-traiter » toutes les variables aux fichiers serait stupidement extrême, la fonctionnalité d'un programme de besoins d'être dans le programme et le contenu, les paramètres et d'autres facteurs peuvent être gérés par le programme.

Ceci permet également d'applications et de nouvelles fonctionnalités beaucoup plus dynamiques.

Si vous avez même une forme simple de base de données, vous êtes en mesure d'appliquer les mêmes fonctionnalités à de nombreux états. Vous pouvez également faire toutes sortes de choses créatives comme changer le contexte de ce que fait votre programme fondé sur des données d'en-tête de fichier ou répertoire peut-être, le nom du fichier ou une extension, mais pas toutes les données sont nécessairement stockés sur un système de fichiers .

Enfin en gardant votre code dans un état où il est tout simplement la manipulation de données met dans un état d'esprit où vous êtes plus proche de ce qui se passe envisager réellement sur. Cela permet aussi l'essentiel de votre code, ce qui réduit considérablement bloatware.

Je crois qu'il rend le code plus maintenable, plus souple et plus efficace Aaaand je l'aime.

Merci aux autres pour vos commentaires sur ce aussi bien! Je l'ai trouvé très encourageant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top