Uma vez, há muito tempo, ainda na graduação, fui convidado a explicar algo durante o almoço de domingo - uma das experiências mais educacionais que já tive. A pessoa que fez a pergunta não foi comprovadamente estúpida - mas não tinha antecedentes, o nível de conhecimento que presumi não estava lá. Comecei a responder, dei uma olhada em branco, mudei, ainda em branco, mudei novamente, ainda em branco ... hmm ... então comecei da mesma maneira que você começa a criar um aplicativo, com pequenos blocos de explicação que você pode construir em algo mais substancial.
A parte principal desta lição, para mim, foi (e é) o quanto presumimos (não apenas programadores, todos) sobre o conhecimento de outras pessoas sobre a nossa especialidade escolhida, enquanto, de fato, você pode razoavelmente assumir que a maioria das pessoas sabe que 1 + 1 = 2, mas depois disso fica interessante.
Portanto, a primeira e mais importante coisa a entender é que as pessoas não sabem e não entendem o que você faz - mas elas entendem o que fazem e quando você está explicando coisas, portanto, você precisa começar de maneira simples e permanecer no local apropriado. nível para o seu público.
Em termos de técnicas específicas - acho que o @Josh K tem bastante cobertura - e enfatizo que as analogias são um vencedor absoluto.
Mais uma coisa - pode ser, de tempos em tempos, aceitável apenas escrever coisas como "coisas nerds", as pessoas nem sempre querem explicações completas sobre o porquê e se você já demonstrou disposição para explicar e capacidade de fazer portanto, de maneira compreensível, as pessoas tenderão a confiar em você quando você sugerir que "razões técnicas complexas" se apliquem ou que, em última análise, você possa obter um resultado específico "fazendo coisas de nerd" (ou "coisas de programador" ou qualquer outro termo que funcione bem) seus arredores).
Comunicar coisas técnicas a um público não técnico (de um ou mais) é uma habilidade, que você pode desenvolver e que precisa.