Para suplementar as outras respostas, eu faço uma combinação do tipo "Pense bem sobre o problema, depois anote a solução" e "Comece com uma replicação, e bata o programa no formato iterativamente". É geralmente no meio. O que eu faço é começar com uma idéia geral do que eu quero do meu programa, e então eu começo a escrevê-lo, tentando adquirir novos conhecimentos sobre o domínio do problema, a fim de revisar minha abordagem. Na prática, isso significa que eu faço muita experimentação e escrevo um monte de código para fora. Eu tento abordagens diferentes e posso mudar a direção muito rápido. Lisp é bom para esse tipo de desenvolvimento. É por isso que eu não gosto muito de TDD, tenho que saber o que quero fazer primeiro, para poder efetivamente fazer TDD.
Outra coisa importante que tento fazer é pensar mais sobre o protocolo entre as diferentes partes de um programa. Ao contrário de outras linguagens OO, o CLOS em Common Lisp é focado mais no conceito de uma função Genérica, os métodos IOW vivem fora das classes e são o foco do desenvolvimento. Às vezes eu apenas começo com um conjunto de GFs definindo o protocolo que eu quero, eu escrevo uma implementação simples e a utilizo para detalhar o protocolo, antes de escrever uma implementação real. Digamos que estou escrevendo uma camada que armazena um monte de posts, eu poderia ter um conjunto de GFs que definem como as postagens do blog são criadas, editadas e pesquisadas, e gostaria de escrever uma implementação simples que salva postagens do blog em uma lista na memória e, depois que estou satisfeito com meu protocolo, escrevo uma implementação que salva postagens de blog em um banco de dados ou as grava em arquivos.
Lisp torna tão fácil mudar de direção e fazer uma abordagem diferente quando você sabe que sua solução atual está abaixo do ideal e eu tento maximizar isso.
Ponto importante também: Use seu ambiente ao máximo, aprenda sobre como usar diferentes configurações de compilação para compilar seu código com mais informações de depuração, aproveite o fato de que o lisp pode ser compilado e interpretado. Use os recursos introspectivos dos lisps, como o MOP, use recursos de slimes para procurar documentação, use o inspetor para examinar objetos, consultar o hiperespaço regularmente, tratar seu sistema mais como um SO, do que um compilador estático para seu código, é muito mais poderoso do que isso.
Para um iniciante, o lisp não é uma grande vitória sobre o python e o ruby, mas à medida que você fica mais experiente com ele, você obtém enormes vitórias sobre ambientes menores.
O mais importante é que você tem que se divertir e amar essa linguagem, às vezes é fácil desanimar e usar os idiomas blub atualmente populares. Se você ficar com o lisp, ele irá recompensá-lo.