Não há caixa!
Há um problema específico a ser resolvido e um conjunto de restrições que podem ser aplicadas. Calcule qual é o problema (pense abstratamente e em termos reais), definindo-o em termos específicos baseados em tópicos e em termos mais gerais.
Examine cada uma das restrições (não faça suposições) para ver se, quando e em que medida elas podem ser aplicadas. Observe o problema da perspectiva de quem ele afeta (não esqueça o objetivo) e também dos bastidores.
Não faça suposições.
Se você presumir que certas coisas são verdadeiras quando não são, impedirá-se de examinar diferentes perspectivas. Também desafie as decisões / suposições existentes que outras pessoas fizeram - pode haver uma boa razão para isso, ou não, ou há uma que não se aplica mais.
Pense abstratamente.
Aprenda a ver as coisas como padrões e em termos abstratos. Ao identificar um padrão, considere coisas semelhantes e veja se você pode aplicar ações dele ao atual. Se a sua área de assunto tiver nomes de padrões, aprenda-os - mas não os trate como soluções de corte de biscoitos.
Não pense abstratamente.
Sempre tente ver as coisas como elas são também - lembre-se de que "usuários" são pessoas e nem sempre são lógicas ou racionais. Pratique empatia com as pessoas usando o que você cria.
Não esqueça o objetivo.
Às vezes, é fácil ficar atolado em um determinado destino / implementação (por exemplo, "como encaixamos esses controles X na interface do usuário?") Em vez de lembrar o objetivo real (como "como permitimos que o usuário faça Y?" )
Nunca pare de aprender.
O conhecimento geral pode ser uma grande fonte de inspiração - muitos problemas já foram resolvidos por alguém - quanto mais você sabe, mais se lembra de algo aplicável à situação atual.
Seja um bom programador, não apenas um bom em [linguagem de programação].
Não tenha medo de aprender várias tecnologias e técnicas - mesmo vários idiomas "sobrepostos" podem ajudá-lo a ver as coisas em termos diferentes, mas uma boa variedade de idiomas diferentes pode ajudar mais. É claro que escolha algumas áreas para se especializar / dominar, mas também verifique se você tem uma base decente em conceitos gerais, que você pode obter aprendendo vários idiomas diferentes,
Não assuma que alguém é inexperiente demais para ajudar.
Às vezes, pessoas que parecem pouco conhecedoras ou que nunca programaram podem parecer inúteis para um problema de programação - mas isso não significa que você deva ignorá-las. Todo mundo tem diferentes perspectivas e conjuntos de habilidades e pode fornecer uma visão única que leva você a uma solução.
As crianças pequenas podem ser uma boa fonte de uma perspectiva "não contaminada" que pode ser inspiradora.