1) рассмотрение всей программной системы как многоуровневой системы
2) открытость программы для быстрых модификаций, поэтому она должна быть понятна и хорошо прокомментирована
3) решение трудной задачи путем разделения ее на множество мелких, легко решаемых подзадач (+)
4) реализацию некоторого алгоритма, который построен на определенной математической модели решения задач
