Problemy, jakie napotykamy podczas programowania wszelkiego rodzaju aplikacji można podzielić na dwie główne kategorie - wymagające doświadczenia i wymagające wiedzy. O ile te związane z doświadczeniem można rozwiązać bez pomocy innych - rozwiązania można po prostu wywnioskować na podstawie doświadczenia, o tyle związane z wiedzą nie są takie proste. Ich rozwiązanie to zdobycie informacji o tym, co należy zrobić, żeby było dobrze, a do rzeczonej informacji czasem bardzo ciężko się dostać.