Programmering handlar om att ge instruktioner till en maskin och de personer som ägnar sig åt detta hantverk kallas följaktligen programmerare. En vanlig missuppfattning är att programmering enbart har med datorer att göra, men alla typer av maskiner som använder sig av kodade instruktioner kan programmeras – vare sig det gäller en dator, en robot eller en miniräknare. De har alla en processor som direkt förstår och klarar av att exekvera de givna instruktionerna. Språket en processor förstår kallas maskinkod.
Programmering direkt i maskinkod mycket ovanlig nuförtiden. Maskinkod är nämligen på en mycket låg abstraktionsnivå och är gjord för att direkt kunna läsas och förstås av en maskin. Det kallas ofta binärkod, eftersom det i grund och botten rör sig om långa sekvenser av ettor och nollor. Maskinkod är svårtolkad för människor och den skiljer sig dessutom beroende på processortypens instruktionsuppsättning. På grund av att programmering direkt i maskinkod skulle vara mycket opraktiskt har man istället strävat efter att öka abstraktionsnivån.
Först kom så kallade assemblerspråk, som ligger relativt nära hårdvaran och har direktöversättning till maskinkod, men de är fortfarande på en relativt låg abstraktionsnivå. Det verkliga genombrottet kom med de allmänna programspråken, som till exempel C, Pascal och Java. Där motsvarar en sats eller en instruktion ett flertal instruktioner i maskinspråket. Sedan kompileras det till maskinkod av en kompilator, vilket i princip kan ses som en slags översättning. I dagsläget finns det flera programspråk med mycket hög abstraktionsnivå. Dagens programmerare arbetar i huvudsak med den här typen av högnivå-språk, när de till exempel utvecklar mjukvara.
Det finns också flera olika idéer och läror om hur programmering ska struktureras och organiseras. De flesta har säkert hört talas om objektorienterad programmering, som kortfattat handlar om att modularisera program efter de begrepp eller de data som hanteras. I slutändan är syftet i regel att lösa problem. Man strävar alltid efter att programmeringen ska vara lätt att överblicka, lätt att förstå, så felfri som möjligt och gärna ta så lite resurser i anspråk som möjligt.