Una volta, tanto tempo fa, mentre ero ancora uno studente universitario, mi è stato chiesto di spiegare qualcosa durante il pranzo della domenica - una delle esperienze più educative che abbia mai avuto. La persona che ha posto la domanda non è stata stupida, ma non aveva background, il livello di conoscenza che ho assunto non era lì. Ho iniziato a rispondere, ho ottenuto uno sguardo vuoto, cambiato, ancora vuoto, cambiato di nuovo, ancora vuoto ... hmm ... così ho iniziato nello stesso modo in cui inizi a creare un'applicazione, con pochi blocchi di spiegazione che puoi costruire in qualcosa di più sostanziale.
La parte fondamentale di questa lezione, per me, è stata (ed è) esattamente quanto supponiamo (non solo i programmatori, tutti) sulla conoscenza delle altre persone della specialità scelta, mentre in realtà, si potrebbe ragionevolmente presumere che il la maggior parte delle persone sa che 1 + 1 = 2 ma dopo diventa interessante.
Quindi la prima e più importante cosa da capire è che le persone non sanno e non capiscono cosa tu fai - ma capiscono cosa fanno loro e quando stai spiegando le cose devi quindi iniziare in modo semplice e rimanere ad un livello appropriato per il tuo pubblico.
In termini di tecniche specifiche - penso che @Josh K lo abbia abbastanza coperto - e sottolineo che le analogie sono un assoluto vincitore.
Un'altra cosa: potrebbe essere, di tanto in tanto, accettabile solo scrivere cose come "roba geek", le persone non sempre vogliono spiegazioni complete sul perché e se in precedenza hai dimostrato la volontà di spiegare e un capacità di farlo in un modo comprensibile quindi le persone saranno inclini a fidarsi di te quando suggerisci che "ragioni tecniche complesse" si applicano o che alla fine puoi ottenere un risultato particolare "facendo roba geek" (o "roba programmatore" o qualsiasi altro termine funziona bene nei tuoi dintorni).
Comunicare cose tecniche ad un pubblico non tecnico (di uno o più) è un'abilità, una che puoi sviluppare e una di cui hai bisogno.