Un punto che sta facendo è che, specialmente per tutto ciò che è orientato al web, ma anche per gli altri, si ottiene un grande beneficio fornendo un'interfaccia aperta e programmabile. Ciò non significa un'interfaccia utente con un linguaggio macro, ma un'interfaccia utente che è in gran parte separata dal "motore" che fa il vero lavoro - e una documentazione completa e aperta su come l'interfaccia utente parla al motore, quindi qualcuno può scrivere un'intera nuova interfaccia utente che utilizza il motore, componenti aggiuntivi del motore che possono collegarsi perfettamente all'interfaccia utente, ecc.
In breve, invece di costruire (o addirittura pensare in termini di) prodotti completi, dovresti pensare e lavorare principalmente in termini di produzione di componenti utili. Questi componenti devono funzionare l'uno con l'altro in modo pulito, ma non è abbastanza da solo. Le interfacce tra questi componenti devono essere chiaramente documentate e definite in modo tale che siano idonee a sostituire sostanzialmente (ad esempio) l'interfaccia utente con qualcosa di proprio, collegarlo al motore ed essere in grado di utilizzare il motore al massimo capacità, perché hanno accesso alle proprie capacità proprio come chiunque altro.
In definitiva, questo non è un cambiamento radicale da ciò che è stato spinto per un certo tempo (ad es. applicazioni a 3 livelli). La grande differenza è che anche se sono scritti come componenti, la maggior parte delle tipiche applicazioni a 3 livelli presuppongono fondamentalmente che tutti i componenti in uso saranno prodotti insieme, quindi tutte le interfacce tra di loro sono "private". In alcuni casi ci sono supposizioni implicite che un componente non debba controllare gli input da un altro, perché "sa" quali input l'altro può produrre.
Soprattutto per i server con connessione Web e simili, non è sostenibile. Invece, l'interfaccia ogni deve essere "hardened" - specificata e implementata per funzionare in qualsiasi circostanza, specificatamente inclusa la possibilità che qualunque cosa sia dall'altra parte dell'interfaccia possa essere sciatta e schifosa, o addirittura un attaccante accuratamente progettato.
Considerato da una prospettiva leggermente diversa, un prodotto dovrebbe fornire l'accesso a uno qualsiasi dei diversi livelli. Per gli utenti principianti, dovrebbe avere un'interfaccia utente lucida. Per gli utenti più avanzati, dovrebbe avere una sorta di programmabilità integrata per modificare cose che non gli piacciono, automatizzare cose che fanno troppo spesso, ecc. Infine, e soprattutto, dovrebbe fornire un'interfaccia di basso livello che fornisca < em> controllo completo di ogni aspetto del "motore" di quel prodotto. Questo deve essere esattamente quello che usi per sviluppare il tuo codice personale per lavorare con il motore del prodotto, quindi chiunque altro ha accesso completo a quel motore come fa la tua interfaccia utente.