Pierwsze kroki w każdym projekcie programistycznym powinny być analiza wymagań, modelowanie, implementacja i eliminacja błędów (debugging). Istnieje wiele różnych sposobów na zrealizowanie każdego z tych etapów.
Współcześni programiści korzystają z wielu specjalistycznych narzędzi wspomagających tworzenie i zarządzanie złożonymi aplikacjami. Proces tworzenia programu komputerowego zazwyczaj rozpoczyna się od stworzenia analizy wymagań oraz zaprojektowania architektury. Popularnymi technikami modelowania są tutaj OOAD oraz MDA. Unified Modelling Language (UML) jest powszechnie akceptowaną notacją do prezentowania obu z nich.
Dopiero wtedy następuje tworzenie właściwego kodu źródłowego. Przy złożonych aplikacjach korzysta się z zaawansowanych środowisk IDE wyposażonych w szereg dodatkowych menedżerów pokazujących różne informacje o strukturze aplikacji oraz w rozbudowany system wykrywania i usuwania błędów. Popularnymi środowiskami IDE są Visual Studio firmy Microsoft oraz projekt Eclipse nadzorowany przez IBM.
Obecnie istotnym zagadnieniem jest kontrolowanie wersji kodu źródłowego, który często jest modyfikowany w sposób rozproszony przez wielu programistów. Im większy projekt (np. taki jak system operacyjny: FreeBSD, NetBSD, GNU/Linux itp.) tym większe znaczenie ma integrowanie wielu zmian oraz zarządzanie nimi (np. śledzenie zmian niezależnie od np. przemieszczania się plików itp.). Do takich systemów zaliczyć można np. CVS, Subversion, svk, Git, Bazaar i inne. Wiele dużych, komercyjnych środowisk programistycznych zintegrowanych jest w system kontroli wersji.
Usuwanie błędów z gotowej aplikacji jest ostatnim krokiem rozwoju oprogramowania. Trudność jego realizacji zależy od środowiska, jakości kodu źródłowego oraz wybranego języka programowania. Istnieją dwa główne sposoby debugowania: statyczna analiza kodu i dynamiczna. Pierwszy polega na analizie kodu źródłowego pod kątem występowania możliwych błędów. Drugi, na analizie programu w trakcie pracy, służą ku temu specjalne narzędzia, zwane debugerami oraz fragmenty kodu zawarte bezpośrednio w programie, których jedynym zadaniem jest pomoc w znalezieniu błędów.