Una volta, molto tempo fa mentre ero ancora studente, 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 è evidentemente stupida - ma non ha avuto precedenti, il livello di conoscenza che ho assunto non esisteva. Ho iniziato a rispondere, ho avuto un aspetto vuoto, cambiato in basso, ancora vuoto, cambiato di nuovo in basso, ancora vuoto ... hmm ... quindi ho iniziato nello stesso modo in cui inizi a creare un'applicazione, con piccoli blocchi di spiegazioni che puoi costruire in qualcosa di più sostanziale.
La parte chiave di questa lezione, per me, era (ed è) quanto assumiamo (non solo i programmatori, tutti) sulla conoscenza delle altre persone della specialità prescelta mentre, in effetti, potresti ragionevolmente presumere che la maggior parte delle persone sappi 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 quello che fai, ma capiscono quello che fanno e quando spieghi cose devi quindi iniziare in modo semplice e rimanere livello per il tuo pubblico.
In termini di tecniche specifiche - penso che @Josh K l'abbia coperto abbastanza - e sottolineerei che le analogie sono un vincitore assoluto.
Ancora una cosa - può essere, di tanto in tanto, accettabile semplicemente scrivere le cose come "cose da geek" che le persone non vogliono sempre spiegazioni complete sul perché e se in precedenza hai dimostrato la volontà di spiegare e la capacità di fare quindi in modo comprensibile, allora le persone saranno inclini a fidarsi di te quando suggerisci che si applicano "ragioni tecniche complesse" o che alla fine puoi ottenere un risultato particolare "facendo cose geek" (o "cose programmatore" o qualunque termine funzioni bene in i tuoi dintorni).
Comunicare cose tecniche a un pubblico non tecnico (di una o più) è un'abilità, una che puoi sviluppare e una di cui hai bisogno.