フォン＝ノイマン・アーキテクチャの発明により、プログラムをコンピュータのメモリに格納できるようになった。初期のプログラミングは機械語のコードを直接並べる（「コーディング」の本来の意）ことで行われた。入力方法としては穿孔カードや鑽孔テープが利用された他、スイッチなどで直接入力したり、まだ半導体技術などのない時代のため、ROMに相当する電気的配線を直接変更したりすることもあった。しかし、機械語の命令は人間にとって扱いにくく、代わりにニーモニックと呼ばれる略語を割り当てたアセンブリ言語により、プログラマは命令をテキスト形式で記述できるようになった。しかし、アセンブリ言語は機械語と同様にプロセッサの種類ごとに異なるため、（意図的に互換性があるように設計された機械以外では）他機種にはそのまま流用できなかった。また（人間から見れば）単純な処理でも、機械が操作できる基本的な処理命令は細粒度であり、大量に記述する必要があった。
コンピュータの能力は時と共に飛躍的に向上した。このため、より抽象化されたプログラミング言語が開発されるようになっていった。抽象化レベルの高い言語はオーバーヘッドも大きいが、コンピュータ自体の性能の向上が激しいため、多少オーバーヘッドが増えても以前よりも高性能な動作が実現された。このような抽象化レベルの高い言語の利点は、習得が容易であることと、プログラム作成時間が短縮されること。そして何より、バッファオーバフロー等の危険性を孕んだプログラムを書く余地が無いこと、である。しかしそれでも、巨大で複雑なプログラムや、高速性が何よりも重視されるプログラムでは、現在でも比較的低レベルな言語を使っている。
プログラミングの過程.
まず、そのプログラムの目的、さらには「本当に解決したい問題は何なのか」ということについて十分な検討が必要である（ワインバーグの著書などを参考のこと）。プログラミングの過程は文書化され、将来の拡張に利用できるため、これは非常に重要なことである。