私のコンピューティングキャリアの初期に、ソフトウェアをシステムソフトウェア、アプリケーションソフトウェア、スクリプトの三つに分類する有用な枠組みに出会いました。この抽象化は完璧ではありませんが、エンジニアやマネージャーにとって有益な概念的枠組みとして機能します。各カテゴリはソフトウェア開発、使用、そしてそれを書き手のタイプに関する独自の洞察を明らかにします。\n\n基盤となるのはシステムソフトウェアで、オペレーティングシステム、コンパイラ、データベースが含まれます。これらは他のすべてのソフトウェアタイプを構築するために必要な汎用的かつ基礎的なコンポーネントです。システムソフトウェアは広く普及していますが、本質的に差別化されておらず、それ自体で意味のあるタスクを実行しません。生産品質のシステムソフトウェアの選択肢は比較的少なく、オペレーティングシステムは数種類、人気のプログラミング言語は約10種、主要なデータベースエンジンは数十種に限られます。選択肢が少ないのは経済的および技術的な課題によるもので、信頼性の高いシステムソフトウェアの作成には高度なスキルを持つ大規模な開発チームが必要で、多世代にわたる開発が求められます。代表例としてUnixやgccコンパイラがあり、その複雑さと規模を示しています。重要であるにもかかわらず、システムソフトウェア開発を専門とするソフトウェアエンジニアは少数派です。\n\nこの層の上にアプリケーションソフトウェアがあり、特定のタスク向けに設計されたすべての名前付きプログラムを含みます。例としてPhotoshop、Excel、TikTokのような消費者向け製品から、ヘルプデスクのチケット管理システムや工作機械のコントローラなど無数の内部ツールまで多岐にわたります。アプリケーションはシステムソフトウェアや他のアプリケーションの上に構築され、特定の仕事を遂行するために設計されており、カスタマイズやスクリプト機能は限定的です。システムソフトウェアと比べてアプリケーションは寿命が短い傾向がありますが、Microsoft Office、Google Search、Midnight Commanderのように数十年続くものもあります。アプリケーションソフトウェアはプロフェッショナルなソフトウェア開発の大部分を占め、それに対応して多くの開発者がこれらのアプリケーション作成に注力しています。\n\n三番目のカテゴリであるスクリプトは、さまざまなコンポーネントを自動化または連結するソフトウェアで、非常に特定かつ狭いユースケースに合わせて作られることが多いです。スクリプトはZapierのようなツールを使ってスプレッドシートとメールサービスを連携させる単純なものから、Numpyのようなライブラリを活用したデータ分析スクリプトのような複雑なものまであります。世界のソフトウェアの大部分はこのスクリプトカテゴリに該当します。プロフェッショナルな開発者とは異なり、スクリプトの作者にはExcelの数式を作成するオフィスワーカーやデータ分析コードを書く科学者など非専門プログラマーも含まれます。スクリプトは一般に完全なアプリケーションよりも複雑さは低いものの、プログラミングを伴い、独立した製品としてではなく明確な実用目的を持っています。\n\nこの枠組みは、NoCodeソリューションからマイクロコードまで幅広いプログラミング活動を同一の連続体上に優雅に位置づけ、開発者が習得すべき多様なツールを浮き彫りにします。また、完全なアプリケーションを構築するよりも単純なスクリプトや自動化の方が適切かどうかを検討することを促し、スクリプトは開発コストが低く迅速な反復を可能にします。興味深いことに、スクリプトはしばしばアプリケーションに進化し、アプリケーションはシステムソフトウェアに成長することがあり、層間でフラクタル的な性質を示します。\n\n組織内ではこれらのカテゴリは異なる形で現れます。プラットフォームチームはしばしばシステムソフトウェアを企業固有のニーズに合わせてカスタマイズし、アプリケーション開発に使用されるツールの複雑さを軽減します。歴史的に内部アプリケーションはスクリプトサポートが限定的でしたが、ロボティックプロセスオートメーション(RPA)、NoCodeプラットフォーム、ビジネスインテリジェンス(BI)ツールの進歩により、非専門開発者の自動化とカスタマイズ能力が向上しています。今後は、改善されたツールとソフトウェアソリューションへの需要増加により、非専門家がより多くのソフトウェアカスタマイズ役割を担うことが期待されます。一方、プロフェッショナルな開発者はコアのシステムおよびユーザー向けソフトウェアに注力し、上位のスクリプトや自動化ツールが活用できるAPIやデータストリームを提供します。\n\n全体として、この分類はソフトウェアの構築と維持の方法を明確にするだけでなく、キャリアに関する貴重な洞察も提供します。これらの層を理解することで、専門分野の選択やソフトウェアエコシステム全体での効果的な協力方法を見出す助けとなります。