Un sistema può essere guidato da dati al 100%?

44

Il mio nuovo capo ha lavorato a questo progetto per molti anni. Sono qui da poche settimane, ma non sono sicuro che sia possibile. Vorrebbe progettare un sistema "al 100% guidato dai dati".

Quindi, se inseriamo abbastanza dati, possiamo definire e generare qualsiasi applicazione. Sono riuscito almeno a fargli concedere alcune cose come gli utenti, o le app dovrebbero avere valori predefiniti, ma gli piace il concetto della struttura del sistema, l'interfaccia utente e la logica che vengono tutti archiviati come dati.

Ci sono alcune dimostrazioni di cose semplici e ha sostanzialmente riscoperto alcune semplici idee di programmazione orientata agli oggetti e i tuoi modelli di template di base, ma penso che in generale questo obiettivo potrebbe essere effettivamente impossibile.

Non so come sia possibile definire la logica usando i dati senza che il sistema diventi così complesso da fare comunque una programmazione vera e propria.

Penso che in teoria non è perché la cosa che interpreta i dati finisce per diventare completa per descrivere l'applicazione in modo da aver spostato il problema un livello più alto senza alcun beneficio netto.

È possibile un'applicazione basata sui dati al 100%?

    
posta Great Turtle 07.03.2014 - 20:14
fonte

7 risposte

46

Il tuo capo dovrebbe leggere questo pezzo: Bad Carma: il progetto "Vision", un avvertimento racconto sull'effetto piattaforma interna o sul secondo effetto di sistema.

Astratto

Those of us who work in Information Technology (IT) have all been on a project where something important is just not right. We know it, most everyone knows it, but nobody is quite able to put his or her finger on the problem in a convincing way.

This story is about such an IT project, the most spectacular failure I have ever experienced. It resulted in the complete dismissal of a medium-sized IT department, and eventually led to the destruction of a growing company in a growing industry. The company, which we'll call "Upstart," was a successful and profitable subscription television business.

The project occurred in the early 1990s, and it was a custom-built order-entry and customer-service application, closely resembling what is now referred to as Customer-Relationship Management or CRM. The core functionality of the system included:

  • Order entry and inventory
  • Customer service, help desk
  • General ledger, accounts receivable, billing, and accounts payable

The application was called "Vision" and the name was both its officially stated promise for Upstart as well as a self-aggrandizing nod to its architect. The application was innovative, in that it was built to be flexible enough to accommodate any future changes to the business. Not just any foreseeable future changes to the business, but absolutely any changes to the business, in any form. It was quite a remarkable claim, but Vision was intended to be the last application ever built. It achieved this utter flexibility by being completely data-driven, providing limitless abstraction, and using object-oriented programming techniques that were cutting-edge at the time.

Like many such projects that set out to create a mission-critical application, the development effort spanned two years, about a year longer than originally projected. But that was acceptable, because this was the application that would last forever, adapting to any future requirements, providing unlimited Return On Investment (ROI). When the application finally went "live," almost everybody in the company had invested so much in it that literally the fate of the company hinged on its success.

However, in the event of total project malfunction, mission-critical applications running the core business of multinational corporations are not permitted the luxury of the type of fast flameout demonstrated by thousands of "dot-com" companies in the era of the Internet bubble. Within a month of Vision going "live," it was apparent to all but those most heavily vested in its construction that it was a failure.

Vedi anche

link

    
risposta data 07.03.2014 - 20:22
fonte
17

La risposta è sì, è possibile creare un sistema completamente basato sui dati e sì, di solito è una pessima idea.

Un programma completamente basato sui dati è uno in cui tutta la logica e la configurazione sono gestite da valori memorizzati in modo tale che in un altro contesto essi sarebbero considerati come dati. C'erano molti prodotti 4GL prodotti negli anni '80 che fornivano la capacità di generare report, moduli, tabelle e logica utilizzando gli elementi di dati inseriti in una molteplicità di moduli, archiviati in tabelle e accessibili tramite report. Mi riferivo a sistemi come "dipingere con i numeri" ma vedo che ora è noto come effetto "sistema interno". Buon nome.

Le persone che creano questi sistemi stanno provando (che lo sappiano o meno) per creare un nuovo linguaggio di programmazione. Dal momento che non hanno le capacità, lo fanno male. Dal punto di vista di JVM / CLR, un programma Java / C # compilato è semplicemente dati. In questo caso è stato fatto bene. In entrambi i casi, i programmatori sono necessari per utilizzare la lingua, qualunque essa sia.

C'è un modo specifico per fare questo lavoro, che io sappia. Si costruisce lo scheletro di ciascuno dei componenti necessari: modulo, report, tabella, ecc. Si fornisce un meccanismo per configurare le varie parti di questi componenti impostando gli elementi di dati. Per una serie di funzionalità scelte, prendi le decisioni e bloccale nel sistema, negando in particolare la possibilità di configurare tali funzioni.

Implementa anche un linguaggio che ha la capacità di codificare le operazioni logiche. La mia raccomandazione è di usare un linguaggio esistente come lua o forse Python. Incorporate pezzi di questo codice ovunque siano necessarie operazioni logiche.

In questo modo si riduce sostanzialmente la quantità di scrittura richiesta per implementare ogni modulo, report, tabella e così via. Il sistema sembra essere basato sui dati, ma solo fino a un certo punto.

A questo punto hai appena implementato un nuovo 4GL. Se vi capita di farlo correttamente, fatemelo sapere. La maggior parte delle persone fallisce in modo smodato Sarò il primo a congratularmi con te per il tuo successo.

    
risposta data 08.03.2014 - 11:06
fonte
6

Penso che tu sia sostanzialmente corretto. Un runtime linguistico è già un sistema completamente flessibile e basato sui dati. Prende un pezzo di dati (il programma) e lo usa per determinare come dovrebbe agire su altri dati. Potrebbe anche avere uno schema multiutente per memorizzare il codice da riutilizzare da altri programmi (che vanno da un percorso di inclusione a una corretta gestione dell'installazione).

Un "linguaggio di scripting", in parole povere, è un runtime di linguaggio in cui questo input di codice è leggibile. Un compilatore pone un passaggio in più tra l'utente e il runtime. Le lingue "Joke" come Malbolge e APL non devono necessariamente essere leggibili in alcun modo. Ma è la stessa cosa a un livello, e comunque leggibile dall'uomo non significa che tutti i potenziali utenti abbiano le capacità per leggerlo o scriverlo, o ci si può aspettare che lo sviluppino.

Ci sono buone ragioni perché normalmente non esporti un runtime di lingua direttamente agli utenti finali. Il principale è che la rimozione della flessibilità aumenta la praticità.

Se voglio scrivere un post SO, voglio solo scriverlo. Sono perfettamente in grado di scrivere invece un programma C ++ per l'output, ma non utilizzerei un browser Web che esponeva un editor di programmi C ++ al posto di una normale casella di testo. Le persone che non conoscono il C ++ non solo non userebbero il browser, non potevano.

Se voglio configurare determinati parametri di business, non voglio necessariamente farlo usando un linguaggio di specifica completo di Turing, e anche se l'ho fatto questo probabilmente non è distinguibile da "hard- codifica "quegli stessi parametri di business in qualsiasi altro linguaggio di programmazione. Hai ancora bisogno di considerare se ciò che stai scrivendo significa ciò che vuoi che significhi. Hai ancora bisogno di testare che le modifiche siano corrette. Cioè, hai ancora bisogno di capacità di programmazione per qualsiasi compito che non sia banale e non anticipato da qualcuno che fa abbia capacità di programmazione che hanno preparato un sottosistema specializzato ("applicazione") da configurare ( "uso").

Quindi, se stai per imbarcarti in un sistema basato sui dati al 100%, che può fare qualsiasi cosa, dati i giusti dati, hai due domande da porsi:

  1. Siamo nel business di inventare i linguaggi di programmazione, o dovremmo esserlo?
  2. Il nostro nuovo linguaggio di programmazione sarà migliore (per i nostri scopi) di quello che abbiamo già e lo supporteremo e lo svilupperemo in base alle esigenze?

A volte le risposte sono sì e scrivi un linguaggio specifico del dominio. O anche un vero linguaggio di programmazione generico se sei Sun / Microsoft / Stroustrup / van Rossum / molti altri. A volte le risposte sono no e hai l'effetto "piattaforma interna" - dopo molti sforzi e tentativi ed errori si finisce con qualcosa. Se sei fortunato è solo leggermente inferiore al linguaggio di programmazione in cui l'hai scritto e non è più facile da usare.

Alcune lingue sono più difficili o più facili da usare rispetto ad altre, in particolare se sono specializzate per uno scopo come R, quindi alcuni utenti le troveranno molto più facili. Ciò che probabilmente non farai, è rendere la programmazione di applicazioni generali fondamentalmente più semplice. In qualsiasi momento ci sono probabilmente diverse persone / organizzazioni nel mondo che hanno il potenziale per farlo, ma il tuo capo / azienda deve onestamente considerare se includerlo o meno.

C'è un trucco spesso usato per i giochi, che è quello di esporre i binding Lua al motore del gioco. Ciò consente ai progettisti di programmare in un linguaggio relativamente facile, ma coinvolgere comunque un programmatore "reale" ove necessario per le prestazioni o per accedere a particolari funzionalità del motore o della piattaforma. Gli script Lua risultanti sono "dati" per quanto riguarda il motore. Non tutti hanno bisogno di includere gran parte di ciò che chiamereste "logica" in contrapposizione ai dati di configurazione, e spesso definiscono praticamente tutta la trama e l'ambiente, ma non l'intero gameplay. Questo non è al 100% guidato dai dati e certamente non è al 100% privo di errori, ma è un compromesso pratico interessante.

    
risposta data 08.03.2014 - 11:50
fonte
4

Ho lavorato in un'azienda in cui questo era l'obiettivo. Frammenti di SQL sono stati memorizzati nelle tabelle del database, letti in fase di runtime ed eseguiti. Le prestazioni erano terribili, come puoi immaginare, e gli errori erano frequenti. Era anche impossibile eseguire il debug, senza tracce di stack o nient'altro che rendesse la vita facile.

"Programmazione basata sui dati" deriva da una fondamentale mancanza di comprensione di ciò che stiamo facendo, come programmatori; tutti i dati che sono in grado di far accadere un algoritmo è in realtà "programmazione", anche se in qualche modo sei riuscito a mescolare (manipolare?) le due idee nell'interfaccia utente. Ora, questo non significa che non è possibile combinare le due idee dall'altra direzione, in modo che tutto il codice sia dato; questa è la premessa dietro lisp, che è abilitata dalla sua omonimia e sfruttata dal suo sistema macro. Sì, questi concetti sembrano simili, ma le loro implicazioni e applicazioni sono molto diverse nella pratica.

Inoltre, questo potrebbe essere l'editorializzazione, ma i posti che ho incontrato che vogliono una programmazione "completamente basata sui dati" in realtà non apprezzano i loro programmatori. Pensano al codice come a un centro di costo, qualcosa da esternalizzare o ignorare.

    
risposta data 08.03.2014 - 15:03
fonte
4

Intendi dire che il tuo capo vuole che tu scriva questo:

[
  {
    "statement": "Assignment ",
    "variable": "App",
    "value": {
      "type": "Function",
      "arguments": [],
      "function-body": [
        {}
      ]
    }
  },
  {
    "statement": "Assignment",
    "variable": "App.prototype.action",
    "value": {
      "type": "Function",
      "arguments": [
        "data"
      ],
      "function-body": [
        {
          "statement": "Call",
          "function-name": "console.log",
          "arguments": [
            "data"
          ]
        }
      ]
    }
  }
]

Per generare questo:

var App = function () {};
App.prototype.action = function ( data ) {
    console.log( data );
}

Il primo è JSON e il secondo è JavaScript .

Clearification

I think theoretically it isn't because the thing that interprets the data ends up needing to become turing complete to describe the application so you've just shifted the problem one level higher to no net benefit.

Is such a 100% Data Driven Application possible?

Questo è il punto in cui ho appena iniziato. Con la mia risposta sto cercando di concordare con il post originale che: È possibile, ma tu sei corretto, spostando il problema di un livello più alto senza alcun beneficio [evidente] .

    
risposta data 14.03.2014 - 11:02
fonte
0

Potresti argomentare in modo convincente, penso, che qualsiasi applicazione per browser web possa essere considerata guidata al 100% da dati 1 .

Ovviamente, ciò non rende più semplice o più facile creare applicazioni sul Web, anzi le rende molto più difficili.

Dì al tuo capo che sta reinventando il browser web e alla fine dovrà reinventare JavaScript per creare qualcosa di abbastanza complesso.

1 Bene, se ignori plugin, JavaScript e HTML5 .

    
risposta data 08.03.2014 - 02:25
fonte
-1

Sì. Per quanto ne so, un sistema come Mathematica , che è un cosiddetto potente linguaggio di programmazione ma essenzialmente una shell, si basa sull'idea simile che il vostro capo si aspettava. Wolfram Mathematica sta diventando abbastanza complesso in modo che molti compiti computazionali possano essere facilmente eseguiti da esso.

I dati guidati sono un concetto. Se i programmatori manipoleranno i dati in un modo semplice, abbiamo bisogno di una shell che sia facile per noi giocare con i dati. Cerca di capire che una volta che iniziamo a parlare dell'apprendimento di un linguaggio di programmazione basato sulla sintassi, stiamo effettivamente imparando l'interfaccia dell'applicazione o semplicemente la sua shell. Se comprendiamo la shell, possiamo guidare i programmi.

Per quanto riguarda il 100% guidato dai dati, se il compilatore o l'interprete possono comprendere la shell, viene eseguito il calcolo. Se i dati hanno la stessa struttura di base della shell o dell'interfaccia, i dati possono essere guidati dal compilatore o dall'interprete. Penso che Mathematica sia una buona spiegazione del perché ti rispondo con un sì.

    
risposta data 08.03.2014 - 05:11
fonte

Leggi altre domande sui tag