Pensieri sul livello minimo di codice e massimizzare la filosofia dei dati

StackOverflow https://stackoverflow.com/questions/4397883

  •  10-10-2019
  •  | 
  •  

Domanda

Ho sentito parlare del concetto di minimizzare e massimizzare il codice dei dati, e si chiedeva quali consigli gli altri mi possono dare su come / perché dovrei fare questo quando si costruisce i miei sistemi?

È stato utile?

Soluzione

Nel software moderno la linea tra codice e dati può diventare terribilmente sottile e confusa, e non è sempre facile dire i due a parte. Dopo tutto, per quanto riguarda il computer è interessato, tutto è Dati , a meno che non è determinata dal codice esistente - normalmente il sistema operativo - per essere altrimenti. programmi nemmeno bisogno di essere caricato in memoria i dati, prima che la CPU di loro in grado di eseguire.

Per esempio, immaginate un algoritmo che calcola il costo di un ordine, in cui i più grandi ordini ottenere prezzi più bassi per articolo. Fa parte di un sistema software più grande in un negozio, scritto in C.

Questo algoritmo è scritto in C e legge un file che contiene una tabella di input fornito dalla gestione dei vari prezzi per-articoli ei le soglie di ordine corrispondenti. La maggior parte delle persone sostengono che un file con una tabella di input semplice è, naturalmente, i dati.

Ora, immaginate che il negozio cambia la sua politica a una sorta di funzione di asintotica, piuttosto che le soglie pre-selezionati, in modo che possa ospitare follemente ordini di grandi dimensioni. Si potrebbe anche voler fattore di tassi di cambio e l'inflazione - o qualsiasi altra cosa la gente di gestione messo a punto

.

Il negozio assume un programmatore competente e lei incorpora un bel parser di espressioni matematiche nel codice originale C. Il file di input ora contiene un'espressione con variabili globali, funzioni quali log() e tan(), e anche alcuni cose semplici come il costante di Planck e il tasso di carbonio-14 degradazione .

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

La maggior parte delle persone sarebbe ancora sostengono che l'espressione, anche se non è così semplice come una tabella, è nei dati di fatto. Dopo tutto probabilmente è fornito così com'è dal management.

Il negozio riceve una grande quantità di lamentele da parte dei clienti che sono diventati morte cerebrale che cercano di stimare le loro spese e dalle persone che rappresentano circa la grande quantità di spiccioli. Il negozio decide di tornare al tavolo per i piccoli ordini e utilizzare un Fibonacci sequenza per i più grandi ordini.

Il programmatore si stanca di modificare e ricompilare il codice C, in modo che incorpora un Python interpretter invece. Il file di input contiene ora una funzione Python che i sondaggi un roomfull di scimmie Fib(n) per il costo di ordini di grandi dimensioni.

Domanda:? questo dati del file di input

Da un punto strettamente tecnico, non c'è nulla di diverso. Sia il tavolo e l'espressione necessaria per essere analizzati prima dell'uso. Il parser espressione matematica probabilmente supportato ramificazione e funzioni -. Non avrebbe potuto essere Turing-completo, ma ancora usato un linguaggio a sé stante (ad esempio MathML)

Ma oggi molte persone sostengono che il file di input appena diventato codice .

Allora, qual è il che distinguono funzione che trasforma il formato di input da Dati in codice

  • Modificabilità: dover ricompilare l'intero sistema per effettuare un cambiamento è un molto buona indicazione di un sistema di codice-centric. Eppure, posso facilmente immaginare (beh, più come ho davvero visto ) un software che è stato progettato abbastanza incompetente per avere ad esempio una tabella di input incorporato in fase di compilazione. E cerchiamo di non dimenticare che molte applicazioni ancora icone - che la maggior parte delle persone avrebbe considerato Dati -. Costruito nel loro eseguibili

  • formato di input: Questa è la - a mio parere, ingenuamente - fattore più comune che le persone considerano: "Se è in un linguaggio di programmazione, allora è il codice" . Belle, C è il codice - si deve compilarlo, dopo tutto. Vorrei anche d'accordo che Python è anche il codice - è è un linguaggio pieno soffiato. Allora, perché non XML / XSL codice? XSL è un linguaggio abbastanza complesso a sé stante -. da qui il L nel suo nome

A mio parere, nessuno di questi due criteri è l'attuale caratteristica distintiva . Penso che le persone dovrebbero prendere in considerazione qualcosa di diverso:

  • Manutenibilità: In breve, se il utente del sistema deve assumere una terza parte per rendere il esperienza necessarie per modificare il comportamento del sistema disponibile, allora il sistema deve essere considerato il codice-centric ad un grado.

Questo, naturalmente, significa che se un sistema è basato sui dati o non dovrebbe essere considerato almeno in relazione al target di riferimento - se non in relazione al cliente su un caso per caso, base -case.

Questo significa anche che la distinzione può essere influenzato dal set di strumenti a disposizione. Il UML specifica è un incubo di passare attraverso, ma in questi giorni abbiamo tutti quei redattori UML grafici a Aiutaci. Se ci fosse una sorta di strumento di AI alto livello di terze parti che analizza il linguaggio naturale e produce XML / Python / qualunque cosa, allora il sistema diventa data-driven, anche per l'ingresso molto più complesso.

Un piccolo negozio, probabilmente non ha la competenza o le risorse per assumere una terza parte. Quindi, qualcosa che permette ai lavoratori di modificare il suo comportamento con la consapevolezza che si potrebbe ottenere in un corso medio di gestione - la matematica, grafici, ecc. - potrebbero essere considerate sufficientemente data-driven per questo pubblico

D'altra parte, un multi-miliardi di società internazionale di solito ha nel suo libro paga un gruppo di specialisti IT e web designer. Pertanto, XML / XSL, Javascript, o anche Python e PHP sono probabilmente abbastanza facile per lui da gestire. Essa ha anche i requisiti abbastanza complessi che qualcosa di più semplice potrebbe proprio non è tagliato.

Credo che quando si progetta un sistema software, si dovrebbe cercare di raggiungere questo delicato equilibrio nei formati di input utilizzati in cui il pubblico di destinazione può fare quello che necessità per senza dover chiamare frequentemente a terzi.

Si deve notare che l'outsourcing sfuma le linee ancora di più. Ci sono alcuni problemi abbastanza, per i quali la tecnologia attuale semplicemente non consente la soluzione per essere accessibile da parte del laico. In questo caso il target di riferimento della soluzione dovrebbe probabilmente essere considerato il terzo al quale l'operazione sarebbe stata affidata a. Questo terzo può essere previsto di impiegare un buon numero di esperti.

Altri suggerimenti

In genere il codice data-driven è più facile da leggere e gestire. So che ho visto casi in cui è stata presa data-driven alle estreme e venti fino molto inutilizzabili (sto pensando a qualche SAP implementazioni che ho usato), ma la codifica il proprio "dominio specifico lingue" per aiutarvi a costruire il software è in genere un enorme risparmio di tempo.

Pragmatic Programmers rimangono nella mia mente la maggior parte dei sostenitori vivide di scrittura poco lingue che ho letto. macchine a stati poco che gestiscono piccole lingue di input possono avere una molto realizzato con pochissimo spazio, e rendere più facile fare modifiche.

Un esempio specifico: prendere in considerazione un sistema di tassazione progressiva sul reddito, con le staffe di imposta di $ 1.000, $ 10.000, e $ 100,000 USD. Reddito di sotto di $ 1.000 è tassato. Reddito tra $ 1.000 e $ 9.999 è tassato al 10%. Reddito tra $ 10.000 e $ 99,999 è tassato al 20%. E il reddito di sopra di $ 100.000 è tassato al 30%. Se si dovesse scrivere questo tutti fuori nel codice, che sarebbe sguardo su come si sospetta:

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

L'aggiunta di nuovi scaglioni d'imposta, cambiando le staffe esistenti, o modificare il carico fiscale tra parentesi, sarebbe tutto richiede la modifica del codice e ricompilare.

Ma se fosse guidato dati-, è possibile memorizzare questa tabella in un file di configurazione:

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

Scrivi un piccolo strumento per analizzare questo tavolo e fare le ricerche (non è molto difficile, giusto?) E ora tutti può facilmente mantenere le tabelle dei tassi d'imposta. Se il Congresso decide che 1000 staffe sarebbe meglio, chiunque potrebbe fare i tavoli si allineano con le tabelle IRS, e da fare con essa, la ricompilazione necessario alcun codice. Lo stesso codice generico potrebbe essere utilizzato per una staffa o centinaia di staffe.

E adesso per qualcosa che è un po 'meno ovvio: il test. Il href="https://wiki.ubuntu.com/AppArmor" rel="nofollow"> AppArmor progetto

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

Si basa su alcune funzioni di supporto per generare e profili di carico, verificare i risultati delle funzioni, e riferire agli utenti. È molto più facile di estendere questi piccoli script di test che è di scrivere questo tipo di funzionalità senza un po 'la lingua. Sì, questi sono gli script di shell, ma sono così lontani da script di shell reali;.) Che sono praticamente dati

Spero che questo aiuta motivare programmazione data-driven; Temo non sono così eloquenti come altri che hanno scritto su di esso, e certamente non ho ottenuto bene a esso, ma ci provo.

Una delle cinque massime sotto il Unix Filosofia , così come presentati dal Rob Pike , è questa:

domina dati. Se avete scelto le strutture di dati giusti e organizzato le cose per bene, gli algoritmi sarà quasi sempre auto-evidente. strutture dati, non algoritmi, sono fondamentali per la programmazione.

Si è spesso abbreviato in "Scrivi codice stupido che utilizza i dati intelligenti".

Altre risposte hanno già scavato in quanto spesso è possibile codice di comportamento complesso con semplice codice che solo reagisce al modello della sua particolare ingresso. Si può pensare di dati come un linguaggio di dominio-specifici, e del codice come interprete (forse uno banale).

Dato un sacco di dati che è possibile andare oltre: Statistiche le decisioni di alimentazione può. Peter Norvig ha scritto un grande capitolo illustrare questo tema Bella dati , con testo, codice e tutti i dati disponibili on-line. (Disclosure: Sto ringraziato nei ringraziamenti.) Su pp 238-239.

Come funziona l'approccio data-driven confrontare ad uno sviluppo di software più tradizionale elaborare regole in cui i codici programmatore espliciti? ... Chiaramente, le regole scritte a mano sono difficili da sviluppare e mantenere. Il grande vantaggio del metodo basato sui dati è che così tanta conoscenza è codificato nei dati, e nuove conoscenze può essere aggiunto solo attraverso la raccolta di ulteriori dati. Ma un altro vantaggio è che, mentre i dati possono essere massiccia, il codice è succinta-circa 50 linee per correct, rispetto a oltre 1.500 per ht: // codice ortografia di Dig. ...

Un altro problema è la portabilità. Se volevamo un lettone di ortografia-correttore, l'inglese regole metaphone sarebbe di scarsa utilità. Alla porta l'algoritmo correct data-driven ad un altro lingua, tutti abbiamo bisogno è un grande corpus di Lettonia; il codice rimane invariato.

Si mostra questo concretamente con il codice in Python usando un set di dati raccolti a Google. Oltre correzione ortografica, c'è il codice per le parole del segmento e da decifrare crittogrammi - in appena un paio di pagine, ancora una volta, dove Il libro di Grady Booch speso decine senza nemmeno finirlo.

"L'irragionevole efficacia della Data" sviluppa lo stesso tema in modo più ampio, senza tutti i dadi e bulloni.

ho preso questo approccio nel mio lavoro per un'altra società di ricerca e penso che è ancora poco sfruttato rispetto alla programmazione guidata da tabella / DSL, perché la maggior parte di noi non stavano nuotando nei dati così tanto fino a quando l'ultimo decennio o due.

In lingue in cui il codice può essere trattata come dati si tratta di un non-problema. Si utilizza ciò che è chiaro, breve, e mantenibile, pendente verso di dati, codice, funzionali, OO, o procedurali, come la soluzione richiede.

Nel procedurale, la distinzione è segnata, e si tende a pensare a dati come qualcosa memorizzati in un specifica modo, ma anche nelle procedurale è meglio per nascondere il dati dietro un'API, o dietro un oggetto in OO.

Un lookup(avalue) può essere reimplementata in molti modi diversi durante la sua vita, fino a quando le sue inizia come una funzione.

... Tutto il tempo che desing programmi per inesistente macchine e aggiungere: 'se noi ora avevamo una macchina comprendente le primitive qui assunto, poi il lavoro è fatto.' ... In pratica, naturalmente, questa macchina ideale andrà a finire non esistere, quindi il nostro prossimo compito --structurally simile all'originale tra-- è quello di programmare la simulazione della macchina "superiore" ... Ma questo gruppo di programmi è scritto per una macchina che con ogni probabilità non esiste, quindi il nostro prossimo compito sarà quello di simulare in termini di programmi per una prossima macchina di livello più basso, ecc, fino a quando finalmente abbiamo un programma che può essere eseguito da il nostro hardware ...

E. W. Dijkstra in Note sulla programmazione strutturata , 1969, come citato da John Allen , in Anatomia di Lisp , 1978.

Quando penso a questa filosofia, che sono d'accordo con un bel po ', la prima cosa che viene in mente è l'efficienza del codice.

Quando sto facendo il codice che so per certo che non è sempre qualcosa di vicino alla perfezione o addirittura possedere la verità assoluta. Conoscendo abbastanza per avvicinarsi a massima efficienza di una macchina quando è necessaria e buona efficienza il resto del tempo (forse negoziazione fuori per una migliore flusso di lavoro) mi ha permesso di produrre prodotti finiti di alta qualità.

Codifica in modo di dati guidata, si finisce per utilizzare il codice per quello che il codice è per. Per andare e 'outsourcing' ogni variabile per i file sarebbe stupidamente estrema, la funzionalità di un programma deve essere nel programma e il contenuto, le impostazioni e di altri fattori può essere gestito dal programma.

Ciò consente anche di molto più dinamico applicazioni e nuove funzionalità.

Se avete anche una semplice forma di banca dati, si è in grado di applicare la stessa funzionalità di molti stati. Si può anche fare ogni sorta di cose creative come cambiare il contesto di ciò che il programma sta facendo basa su dati di intestazione del file o forse directory, il nome del file o estensione, anche se non tutti i dati sono necessariamente memorizzati su un file system .

Infine mantenere il codice in uno stato in cui viene semplicemente gestendo mette dati si in uno stato d'animo in cui si sono più vicini a immaginare ciò che sta realmente accadendo. In questo modo anche la maggior parte del vostro codice, riducendo notevolmente bloatware.

Credo che rende il codice più gestibile, più flessibile e più efficiente aaaand mi piace.

Grazie agli altri per il vostro input su questo pure! L'ho trovato molto incoraggiante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top