システム開発は、建築に例えると非常に直感的に理解できます。家を建てる際、施主の要望を聞いて間取りを設計する「建築士・設計士」がシステムエンジニア(SE)であり、図面に従って木材を組み上げ壁を塗る「大工・職人」がプログラマー(PG)に該当します。
ソフトウェア開発は一般に「上流工程」と「下流工程」と呼ばれる一連の流れで進行します。SEが担当する領域は、クライアントが抱える業務課題をヒアリングし、どのようなシステムで解決するかを決める要件定義から始まります。続いて、システムの全体像や画面遷移、データベース構造を固める基本設計(外部設計)、内部のデータ処理手順を詳細に詰める詳細設計(内部設計)までを主導します。ここまでの工程が「上流工程」です。
対して、プログラマーが主戦場とするのは「下流工程」です。SEが書き起こした詳細設計書を読み解き、Java、Python、Go、TypeScriptなどのプログラミング言語を用いてソースコードを構築する製造(コーディング)を行います。さらに、設計書通りに動作するかを確かめる単体テストや、複数のモジュールを結合して不具合を洗い出す結合テストまでを担うのが一般的な業務範囲となります。
ただし、近年のアジャイル開発を採用する現場では、上流と下流の境界線が急速に溶け合っています。SEが自らコードを書きながら仕様を調整するケースや、プログラマーがユーザー体験(UX)の設計段階から議論に参加するチームが増加しており、旧来の完全分業型SIer(システムインテグレーター)モデルとは異なる力学が働き始めています。