Frage

Ich habe von dem Konzept gehört Code zu minimieren und Daten zu maximieren, und frage mich, was Beratung andere Menschen mir geben können, wie / warum ich das tun sollte, wenn meine eigenen Systeme bauen?

War es hilfreich?

Lösung

In der modernen Software die Grenze zwischen Code und Daten können schrecklich dünn geworden und verschwommen, und es ist nicht immer einfach, die beiden auseinander zu halten. Schließlich, so weit der Computer betrifft, so ist alles Daten , wenn sie nicht von vorhandenen Code bestimmt wird - in der Regel das Betriebssystem - anders sein. Auch Programme in dem Speicher zu haben, wie Daten geladen, bevor die CPU sie ausführen kann.

Zum Beispiel einen Algorithmus vorstellen, dass die Kosten eines Auftrages berechnet, wo größere Aufträge niedrigere Preise pro Stück erhalten. Es ist Teil eines größeren Softwaresystems in einem Geschäft, in C geschrieben.

Dieser Algorithmus ist in C geschrieben und liest eine Datei, die eine Eingabetabelle durch das Management mit den verschiedenen pro-Artikelpreise und den entsprechenden Bestellmenge Schwellen enthält. Die meisten Leute würden argumentieren, dass eine Datei mit einer einfachen Eingabetabelle ist natürlich, Daten.

Nun stell dir vor, dass das Geschäft ändert seine Politik zu einer Art asymptotischer Funktion, anstatt vorgewählten Schwellen, so dass es irrsinnig große Aufträge aufnehmen kann. Sie mögen vielleicht auch zu Faktor in Wechselkursen und Inflation - oder was auch immer die Management Menschen kommen mit

.

Der Laden mietet einen kompetenten Programmierer und sie bettet einen schönen mathematischen Ausdruck Parser in dem ursprünglichen C-Code. Die Eingabedatei enthält jetzt einen Ausdruck mit globalen Variablen, Funktionen wie log() und tan(), sowie einige einfache Sachen wie die Plancksche konstante und die Rate der Kohlenstoff-14 Abbau.

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

Die meisten Menschen würden immer noch argumentieren, dass der Ausdruck, wenn auch nicht so einfach, wie eine Tabelle, in der Tat Daten vorhanden ist. Schließlich ist es wahrscheinlich, die von der Verwaltung, wie sie ist.

Der Speicher erhält eine große Menge an Beschwerden von Kunden, die versuchen, ihre Kosten wurden hirntot zu schätzen und aus den Bilanzierung Menschen über die große Menge an Kleingeld. Der Laden entscheidet sich für kleine Aufträge an den Tisch zurück und verwenden Sie einen Fibonacci-Folge für größere Aufträge.

Der Programmierer wird müde zu modifizieren und den C-Code neu kompilieren, damit sie interpretter stattdessen eine Python einbettet. Die Eingabedatei enthält nun eine Python-Funktion, dass Umfragen ein roomfull von Fib(n) Affen für die Kosten der Großaufträge.

Frage: ist diese Eingabedatei Daten

Von einem strengen technischen Punkt, gibt es nichts anderes. Sowohl der Tisch und der Ausdruck benötigt, um vor der Verwendung analysiert werden. Der mathematische Ausdruck Parser wahrscheinlich Verzweigung und Funktionen unterstützt -. Es vielleicht nicht Turing-vollständig gewesen sein, aber es immer noch eine eigene Sprache (beispielsweise MathML)

verwendet

Doch jetzt viele Leute würden argumentieren, dass die Eingabedatei nur wurde Code .

Also, was ist die Unterscheidungsmerkmal , die das Eingabeformat von drehen Daten in Code

  • Modifizierbarkeit: Mit dem gesamten System neu zu kompilieren eine Änderung zu bewirken, ist eine sehr gute Anzeige eines Code-zentrierten Systems. Doch ich kann sich leicht vorstellen (na ja, eher wie ich eigentlich gesehen ) Software, die inkompetent genug entwickelt wurde, haben z.B. eine Eingabetabelle eingebaute in bei der Kompilierung. Und nicht, dass viele Anwendungen vergessen noch Symbole haben -, dass die meisten Leute würden deem Daten -. Gebaut in ihren ausführbaren Dateien

  • Eingabeformat: Dies ist - meiner Meinung nach, naiv - häufigste Faktor, dass die Menschen betrachten: "Wenn es in einer Programmiersprache ist, dann ist es Code" . Fein, C-Code - Sie haben es schließlich zu kompilieren. Ich würde auch darüber einig, dass Python ist auch Code - es ist eine Blas- Sprache. Warum also nicht XML / XSL-Code? XSL eine ziemlich komplexe Sprache in seinem eigenen Recht -. daher der L in seinem Namen

Meiner Meinung nach ist keines dieser beiden Kriterien ist die tatsächliche Unterscheidungsmerkmal . Ich denke, dass die Menschen noch etwas anderes in Betracht ziehen sollten:

  • Wartbarkeit: Kurz gesagt, wenn die Benutzer das System hat eine dritte Partei mieten, um die Know-how erforderlich, um das Verhalten zu ändern, des Systems zur Verfügung, dann sollte das System Code-zentrierten zu einem gewissen Grad in Betracht gezogen werden.

Dies bedeutet natürlich, dass, ob ein System datengesteuerte oder nicht, sollte zumindest in Betracht gezogen werden in Bezug auf die Zielgruppe - wenn auch nicht in Bezug auf den Client auf einem Fall-zu -case Basis.

Es bedeutet auch, dass die Unterscheidung von dem verfügbaren Toolset beeinflusst werden kann. Die UML Spezifikation ist ein Alptraum zu gehen, aber in diesen Tagen haben wir alle diese grafischen UML-Editoren Hilf uns. Wenn es von Drittanbietern High-Level-KI-Tool eine Art ist, dass Parsen natürliche Sprache und produziert XML / Python / was auch immer, dann wird das System datengesteuerte auch für weitaus komplexen Eingang.

Ein kleiner Laden wahrscheinlich nicht die Know-how oder die Ressourcen, einen Dritten zu mieten. Also, etwas, das der Arbeiter erlaubt sein Verhalten mit dem Wissen zu modifizieren, dass man in einem durchschnittlichen Management-Kurs bekommen würde - Mathematik, Diagramme usw. -. Als in ausreichendem Maße für diese Zielgruppe datengetriebener werden könnte

Auf der anderen Seite, ein Multi-Milliarden internationaler Konzern hat in der Regel in der Gehaltsliste eine Reihe von IT-Spezialisten und Web-Designern. Daher XML / XSL, Javascript, oder sogar Python und PHP ist wahrscheinlich einfach genug für sie zu handhaben. Es hat auch komplex genug, um Anforderungen, dass etwas einfacher könnte es einfach nicht schneiden.

Ich glaube, dass, wenn ein Software-System entwerfen, sollte man diese feine Balance in den verwendeten Eingabeformaten zu erreichen strebt danach, wo die Zielgruppe tun kann, was sie Notwendigkeit ohne mit an dritte häufig nennen.

Es ist zu beachten, dass Unschärfen die Linien noch mehr Outsourcing. Es gibt durchaus ein paar Probleme, für die die aktuelle Technologie einfach nicht die Lösung erlaubt den Laien zugänglich zu sein. In diesem Fall sollte die Zielgruppe der Lösung wahrscheinlich die dritte Partei angesehen werden, auf die die Operation würde ausgelagert. Die dritte Partei kann erwartet werden, eine angemessene Anzahl von Experten zu beschäftigen.

Andere Tipps

Normalerweise datengesteuerten Code ist leichter zu lesen und zu pflegen. Ich weiß, ich habe Fälle gesehen, wo datengesteuerte hat auf die Spitze getrieben worden und windet sich sehr unbrauchbar (Ich bin von einigen SAP denken Implementierungen ich verwendet habe), aber Codierung Ihre eigene „Domain Specific Languages“ zu Hilfe, die Sie bauen Ihre Software ist in der Regel eine große Zeitersparnis.

Die pragmatische Programmierer die lebendigsten Befürworter des Schreibens wenig in meinem Kopf bleiben Sprachen, die ich gelesen habe. Kleine Zustandsmaschinen, die wenig Eingabesprachen laufen können eine bekommen Los mit sehr wenig Platz erreicht, und machen es einfach, Änderungen vorzunehmen.

Ein konkretes Beispiel: Betrachten Sie ein progressives Einkommensteuersystem, mit Steuerklassen bei $ 1.000, $ 10.000 und $ 100.000 USD. Einkommen unter $ 1.000 ist nicht versteuerten. Einkommen zwischen $ 1.000 und $ 9.999 werden mit 10% besteuert. Einkommen zwischen $ 10.000 und $ 99.999 bei 20% besteuert. Und Einkommen über 100.000 $ bei 30% besteuert. Wenn Sie diese alle aus in Code sind schreiben, würde es so aussehen zu, wie Sie vermuten:

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

neue Steuerklassen Hinzufügen, die bestehenden Klammern zu ändern, oder die Steuerlast in den Klammern zu ändern, würde alle benötigen Sie den Code zu modifizieren und neu zu kompilieren.

Aber wenn es wurde datengesteuerte, könnten Sie diese Tabelle speichern in einer Konfigurationsdatei:

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

Schreiben Sie ein kleines Werkzeug, um diese Tabelle zu analysieren und zu tun, die Lookups (nicht sehr schwierig, richtig?) Und jetzt jemand kann die Steuersatz-Tabellen leicht halten. Wenn der Kongress, dass 1000 Klammern entscheidet besser wäre, könnte jemand die Tabellen machen mit den IRS-Tabellen in einer Reihe aufstellen, und mit ihm getan werden, kein Code neu kompilieren notwendig. Das gleiche generische Code könnte für eine Konsole oder Hunderte von Klammern verwendet werden.

Und jetzt etwas, das ein wenig weniger offensichtlich ist: Testen. Das AppArmor Projekt hat hunderte von Tests für das, was Systemaufrufe tun sollen, wenn verschiedene Profile geladen werden. Ein Probe-Test sieht wie folgt aus:

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

Es stützt sich auf einige Hilfsfunktionen zu erzeugen und Lastprofile, testen Sie die Ergebnisse der Funktionen und Bericht zurück an Benutzer. Es ist viel einfacher, diese kleinen Testskripte zu erweitern, als es diese Art von Funktionalität ohne eine wenig Sprache zu schreiben ist. Ja, das ist Shell-Skripte, aber sie sind so weit von den tatsächlichen Shell-Skripten entfernt;.), Dass sie praktisch Daten

Ich hoffe, diese motivate datengesteuerte Programmierung hilft; Ich fürchte, ich bin nicht so eloquent wie andere, die darüber geschrieben haben, und ich habe sicherlich nicht bekommen gut es, aber ich versuche.

Einer von fünf Maximen unter Unix Philosophie , wie präsentiert von Rob Pike , ist dies:

Daten vorherrscht. Wenn Sie die richtigen Datenstrukturen ausgewählt und organisiert die Dinge gut, werden die Algorithmen fast immer selbstverständlich. Datenstrukturen, nicht Algorithmen, sind von zentraler Bedeutung für die Programmierung.

Es wird oft verkürzt, "schreiben dummer Code, Anwendungen Smart Daten."

Andere Antworten haben bereits gegraben darüber, wie Sie können oft Code komplexes Verhalten mit einfachen Code, der nur reagiert auf das Muster seines besonderen Eingangs. Sie können als domänenspezifische Sprache der Daten denken, und des Codes als Dolmetscher (vielleicht trivial).

Da viele Daten Sie weiter gehen kann: die Statistiken kann der Strom Entscheidungen. Peter Norvig schrieb ein großes Kapitel illustriert dieses Thema in Schöne Daten , mit Text, Code und Daten all online verfügbar. (Disclosure: Ich bin in der Danksagung bedanken.) Auf den Seiten 238-239.

Wie funktioniert den datengetriebene Ansatz zu einer eher traditionellen Software-Entwicklung vergleichen Verfahren, bei dem die Programmierer Codes explizite Regeln? ... Offensichtlich sind die handgeschriebenen Regeln schwierig zu entwickeln und zu pflegen. Der große Vorteil der datengesteuerten Verfahrens ist, dass so viel Wissen in den Daten codiert ist, und neues Wissen kann hinzugefügt werden, nur um mehr Daten zu sammeln. Aber ein weiterer Vorteil ist, dass, während die Daten massiv sein können, ist der Code prägnanter-etwa 50 Zeilen für correct, im Vergleich zu mehr als 1.500 für ht: // Dig der Rechtschreibung Code. ...

Ein weiteres Problem ist die Portabilität. Wenn wir einen lettische Rechtschreibung-Korrektor wollten, das Englisch Metaphone Regeln würde wenig nützen. Zum Anschluss der datengesteuerten correct Algorithmus zum anderen Sprache, alles, was wir brauchen, ist ein großer Korpus von lettischen; der Code bleibt unverändert.

Er zeigt dies konkret mit dem Code in Python unter Verwendung eines Datensatzes bei Google gesammelt. Neben Rechtschreibkorrektur, gibt es Code zu segmentieren Worte und zu entziffern Kryptogramme - in nur ein paar Seiten, wieder, wobei Buch Grady Booch der Dutzend verbringt sogar ohne es zu beenden.

„Die Unreasonable Wirksamkeit von Daten“ das gleiche Thema im Großen und Ganzen mehr entwickelt, ohne die ganze Nüsse und Bolzen.

habe ich diesen Ansatz in meiner Arbeit für eine andere Suche Firma genommen und ich denke, es ist noch zu tabellengesteuerte / DSL-Programmierung im Vergleich zu wenig genutzt ist, weil die meisten von uns nicht so sehr in den Daten schwimmen bis zum letzten Jahrzehnte oder zwei.

In Sprachen, in denen Code kann als Daten behandelt werden, ist es kein Thema. Sie verwenden, was ist klar, kurz und wartbar, auf Daten gestützt, Code, funktional, OO oder Verfahren, wie die Lösung erfordert.

In Verfahren wird die Unterscheidung markiert, und wir neigen dazu, über Daten zu denken, wie etwas gespeichert in einem spezifischen Art und Weise, aber auch in verfahren ist es am besten, das zu verbergen Daten hinter einer API, oder hinter einem Objekt in OO.

Ein lookup(avalue) kann auf viele verschiedene Arten während ihrer Lebensdauer neu implementiert werden, solange seine beginnt als eine Funktion.

... Die ganze Zeit, die ich Programme Desing für Maschinen nonexisting und fügen: ‚Wenn wir jetzt eine Maschine hatten mit dem Primitiven hier angenommen, dann wird die Arbeit geleistet.‘ ... In der Praxis wird natürlich das ideale Gerät nicht exist entpuppen, so dass unsere nächste Aufgabe --structurally ähnlich wie das Original one-- die Simulation der „oberen“ Maschine zu programmieren ist ... Aber das Bündel von Programmen für eine Maschine geschrieben, dass nicht aller Wahrscheinlichkeit bestehen, so dass unsere nächste Aufgabe wird es sein, für eine nächstniedrigere Ebene Maschine usw., in Bezug auf den Programme zu simulieren, bis wir endlich ein Programm, das von ausgeführt werden kann unsere Hardware ...

E. W. Dijkstra in Hinweise auf die strukturierte Programmierung , 1969, wie zitiert von John Allen , in Anatomy of Lisp 1978

Als ich von dieser Philosophie denken, die ich mit ziemlich viel zustimmen, das erste, was in den Sinn kommt, ist der Code-Effizienz.

Wenn ich Code mache was ich sicher weiß, ist es nicht immer alles in der Nähe oder sogar volles Wissen zu perfektionieren. aus einer Maschine zu wissen, nahe genug, um einen maximalen Wirkungsgrad zu erhalten, wenn es nötig ist und einen guten Wirkungsgrad der Rest der Zeit (vielleicht für eine bessere Workflow-off Handel) hat mir erlaubt, qualitativ hochwertige Fertigprodukte zu produzieren.

in einer datengesteuerten Art und Weise Codierung, Sie für die Verwendung von Code am Ende, was für Code. Zu gehen und ‚auslagern‘ würde jede Variable, um Dateien dummerweise extrem sein, die Funktionalität eines Programm Bedürfnisse im Programm sein und der Inhalt, Einstellungen und andere Faktoren können von dem Programm verwaltet werden.

Dies ermöglicht auch viele dynamischen Anwendungen und neue Funktionen.

Wenn Sie auch nur eine einfache Form der Datenbank haben, sind Sie in der Lage die gleiche Funktionalität zu vielen Staaten anzuwenden. Sie können auch alle Arten von kreativen Dinge tun, wie das Ändern der Rahmen dessen, was Ihr Programm macht basierend auf Daten-Datei-Header oder vielleicht Verzeichnis, Dateiname oder die Erweiterung, wenn auch nicht alle Daten unbedingt auf einem Dateisystem gespeichert .

Schließlich Ihren Code in einem Zustand zu halten, wo es einfach ist, Daten puts Handhabung Sie in einem Zustand des Geistes, wo Sie sind näher an Vorstellungsvermögen, was eigentlich los ist. Dies hält auch den größten Teil des Codes aus, stark Bloatware zu reduzieren.

Ich glaube, es Code besser verwaltbar macht, flexibler und effizienter uuuuund ich mag es.

Vielen Dank an die anderen für Ihre Eingabe auf das so gut! Ich fand es sehr ermutigend.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top