詳細はプログラミング (コンピュータ)を参照
ソフトウェアは記憶装置(ハードディスクドライブ、RAMなど)に「ロード」されて初めて機能する(実行可能になる)。逆にコンピュータはプログラムを実行することで機能する。このとき、アプリケーションソフトウェア内の命令列がシステムソフトウェアを経由してハードウェア(CPU)に渡され、それを機械語として実行する。各命令はコンピュータに何らかの操作(データの移動、計算、制御フローなど)を実行させる。
データの移動は、一般にメモリ上のある位置から別の位置に行われる。メモリとレジスタ間の移動の場合もあり、CPUがより高速にデータにアクセスできるようにする。大きなデータの移動は時間がかかるため、ポインタを使って移動しない場合もある。計算には、データのインクリメントのような単純なものも含まれる。より複雑な計算には、複数の命令と複数のデータ要素が必要となる。
命令は、逐次的に実行される場合、条件つきで実行される場合、繰り返し実行される場合がある。逐次的命令列は、1つずつ順に演算が実行される。条件付き命令列は、何らかのデータの値によってそれが実行されるか否かが決定される。プログラミング言語によってはこれをif文という。繰り返し命令列は、繰り返し実行されるもので、場合によっては何らかのデータの値で繰り返すか否かが決定される。これをループと呼ぶこともある。命令列をひとまとめにしたものをサブルーチンと呼び、他のサブルーチンを「呼び出す」命令もある。プロセッサが複数あるシステムでは(マルチプロセッシング)、命令列は複数同時並行的に実行される。
例えば、メニューから "Copy" というエントリを選択したとき、ソフトウェアがどのように機能するか考えてみよう。この場合、条件付き命令列が実行され、メモリ上の「文書」領域にあるデータからテキストが、一般に「クリップボード」と呼ばれる中間的記憶領域にコピーされる。別のメニューエントリである "Paste" が選ばれると、ソフトウェアはクリップボードから特定の領域にテキストをコピーする命令列を実行する。
アプリケーションによっては、もっと複雑な処理が行われる。ソフトウェア工学は、そのようなソフトウェアの操作の複雑さを管理・制御しようとする学問分野である。特に大規模なコンピュータを運用するためのソフトウェアは複雑化する傾向がある。
現在では、ソフトウェアの応用範囲を制限しているのは、開発者/プログラマの発想力だけと言っても過言ではない。かつては無理だと思われていた活動(グランドマスターレベルのチェスをさすことなど)も、次々とソフトウェア化されている。芸術だけはソフトウェアによるシミュレーションでは創造できないと考えられている[要出典]。
ソフトウェア品質は、ソフトウェアの運用によって生じるエラーや障害によって測られる。詳しくは、ソフトウェア品質、ソフトウェアテスト、コンピュータセキュリティを参照されたい。
ソフトウェアライセンスは、ユーザーにそのソフトウェアを使用する権利を与えるものである。ライセンス形態で分類すると、以下のようになる。コピーガードについても参照されたい。
オープンソース
フリーウェア
フリーソフトウェア
ドネーションウェア
メールウェア
シェアウェア
商用ソフトウェア、市販ソフトウェア
ソフトウェア特許に関しては、様々な議論がある。特許がソフトウェア開発の妨げになると主張する人々もいるし、ソフトウェア特許によってソフトウェアの進化が促進されると主張する人々もいる。
新しい概念であるため、ソフトウェアのユーザーが持つべき権利についての考え方は、まだ発展途上である。フリーソフトウェアコミュニティでは、ユーザーは使っているソフトウェアの修正や再配布を自由に行えるべきだと考えられている。そうすることで自分のコンピュータを制御でき、各人が協力できるようになり、場合によっては複数の人々が集まって、特定のソフトウェアを特定の方向に進化させることが可能になる。また、そうなるような権利が保証されるべきだと彼らは主張する。他の人々は、ソフトウェアの作者がユーザーにどのような権利を与えるかを制御できるようにすべきだと主張している。
前者の哲学は、1960年代に始まるハッカー文化にその源流の一部がある。
ウィキポータル FLOSS
コンピューティング
Software as a Service
プログラミング言語
ソフトウェア開発工程
ソフトウェア工学
クローズドソース
運用制約