Programowanie systemowe jest rodzajem programowania systemów oprogramowania. Główną cechą odróżniającą programowanie systemowe od aplikacyjnego jest to iż programowanie aplikacyjne tworzy oprogramowanie które świadczy usługi dla użytkownika (np. edytor tekstu), natomiast programowanie systemowe służy stworzeniu oprogramowania które świadczy usługi sprzętowi komputerowemu (np. defragmentator dysku) co wymaga dużej znajomości sprzętu i wewnętrznej budowy systemu komputerowego. W szczególności

programista przyjmuje założenia odnośnie do sprzętu i innych właściwości systemu na którym program jest uruchomiony, i często będzie aktywnie wykorzystywał te własności (na przykład przez zastosowanie algorytmu który jest efektywniejszy na specyficznym sprzęcie) używany jest język niskiego poziomu albo język który: potrafi działać w środowisku o limitowanych zasobach jest bardzo efektywny i ma małe narzuty uruchomieniowe ma małą bibliotekę uruchomieniową (albo wcale) pozwala na bezpośredni i surowy dostęp do pamięci i kontroli wykonania umożliwia programiście pisać części programu bezpośrednio w języku asemblera debugowanie może być utrudnione, albo niemożliwe z powodu ograniczonych zasobów w których program działa.