Lorsque l'on desire creer un programme repondant a un cahier des charges bien defini (condition prealable evidement necessaire), il faut determiner quelles donnees il va falloir traiter, et comment les traiter. La premiere etape est donc de choisir comment representer en memoire ces donnees, et si plusieurs possibilites sont envisageables, choisir la plus appropriee aux traitements qu'il faudra effectuer (c'est a dire celle pour laquelle les algorithmes seront le plus facile a mettre en oeuvre). Dans un gros programme (C.A.O. par exemple), on appelle modele la structure choisie pour stocker les donnees en memoire.
Une fois ce modele defini, le programme doit etre ecrit de maniere structuree, c'est a dire etre decompose en petites entites (sous programmes, fonctions en C), realisant chacune une tache bien definie, en ayant bien defini quelles sont les donnees necessaires en entree du sous programme, et quelles seront les donnees retournees en sortie du sous programme (arguments ou dans certains cas variables globales). La realisation pratique de la tache doit ne dependre que de ses entrees et sorties, et n'acceder a aucune autre variable (par contre elle peut utiliser pour son propre compte autant de variables locales que necessaire). Ceci permet d'eviter les effets de bord, qui rendent la recherche d'erreurs (debogage) presque impossible.
Le choix d'un modele est capital : devoir le modifier une fois le programme bien avance necessite en general la reecriture complete du programme, alors que modifier certaines fonctionnalites du programme correspond a ajouter ou modifier des sous programmes sans modifier les autres. C'est un des interets de la programmation structuree. Par contre, pour pouvoir plus facilement modifier le modele, il faut des structures de donnees hierarchisees et evolutives (disponibles dans les langages orientes objets). Un autre avantage de la programmation structuree est la possibilite de creer dans un premier temps chaque sous programme realisant une tache determinee grace a un algorithme simple, puis d'optimiser uniquement les sous-programmes souvent utilises, ou demandant trop de temps de calcul, ou necessitant trop de memoire.
Parlons encore de l'optimisation d'un programme. On n'optimise un programme (ou du moins certaines parties) que si l'on estime que son fonctionnement n'est pas acceptable (en temps ou en consommation de memoire). On devra choisir un algorithme en fonction des conditions d'utilisation du programme (on ne trie pas de la meme maniere un fichier totalement melange et un fichier deja trie , mais avec quelques valeurs non triees en fin de fichier). A partir d'un moment, on ne peut plus optimiser en temps et en memoire. Il faut alors choisir. Par exemple, un resultat de calcul qui doit etre reutilise plus tard peut etre memorise (gain de temps) ou on peut preferer refaire le calcul (gain de memoire). Par exemple, il est rare de passer par une variable intermediaire pour utiliser deux fois i+1.