巨大なソフトを、どう作るのか
現代のソフトウェアは、途方もなく巨大です。スマホのアプリ一つ、Webサービス一つでも、膨大な量のプログラムからできています。大きなシステムになれば、数百万行、数千万行にもなります。こんな巨大なものを、人間は、どうやって作っているのでしょうか。一人の天才が、全部を頭に入れて書いている——わけではありません。そこには、複雑さを飼いならすための、鮮やかな知恵があります。それは、ソフトウェアに限らず、あらゆる複雑な問題に通じる考え方です。
分割——大きな問題を、小さくする
第一の知恵は、分割です。大きな問題を、そのまま解こうとするのではなく、小さな部品(部分)に分けて、一つずつ解く。そして、それらを組み合わせて、全体を作る。これは、前にアルゴリズム的思考で学んだ「問題を分解する」の、実践です。
たとえば、買い物アプリを作るなら——
- 商品を表示する部分
- カートに入れる部分
- 支払いをする部分
- 配送を手配する部分
——というように、機能ごとに分けます。それぞれの部品は、全体よりずっと小さく、扱いやすい。一つひとつの部品を作り、テストし、組み合わせていく。こうして、巨大なソフトウェアも、人間が扱える大きさの部品の集まりとして、作られていくのです。この分割は、複雑なシステムを部分に分けて理解する発想と、深く通じています。
抽象化——中身を隠して、使いやすくする
第二の、そしてより強力な知恵が、抽象化です。これは、部品の中身を隠して、「何をするか」だけで使えるようにすることです。
例で考えましょう。あなたは車を運転するとき、エンジンの中で何が起きているかを、いちいち知る必要はありません。「アクセルを踏めば進む」という、使い方だけ知っていれば運転できます。エンジンの複雑な仕組みは、「隠されて」いるのです。これが抽象化です。
ソフトウェアでも、同じことをします。ある部品を作ったら、その中身の複雑さを隠し、「これに、こう指示すれば、こういう結果が返る」という使い方だけを、外に見せる。すると、その部品を使う人は、中身を知らなくても、使えます。
この抽象化には、絶大な効果があります。
- 複雑さを管理できる:一度に考えることが減る。部品を使うときは中身を忘れ、部品を作るときは外のことを忘れられる
- 再利用できる:一度作った部品を、何度も使い回せる。同じものを、毎回作り直す必要がない
- 分業できる:各部品を、別々の人が作れる。使う側は中身を知らなくていいから
つまり、抽象化とは、複雑さと戦うための、人類の最も強力な道具の一つなのです。
積み上げられた、巨人の肩
抽象化と再利用の力は、想像以上に大きなものです。現代のソフトウェア開発では、プログラマーは、すべてをゼロから作るわけではありません。すでに誰かが作り、抽象化された部品を、大量に組み合わせて、新しいものを作ります。
- 基本的な機能は、既存の部品(ライブラリなど)を使う
- その上に、自分たちの部品を積み上げる
- さらにその上に、アプリケーションを作る
これは、いわば巨人の肩の上に立つようなものです。過去の無数の人々が作り、抽象化してきた部品の、はるか上に、現代のソフトウェアは建っています。あなたが使う一つのアプリの裏には、何十年にもわたって積み上げられた、無数の人々の仕事があるのです。ソフトウェアの世界は、知識が積み重なって発展する、人類の営みの、最も凝縮された姿の一つと言えます。
ニュースで使う視点
新しいアプリやサービス、システムの開発、技術基盤——ソフトウェアに関わるニュースに触れるときは、「これは、どんな部品を組み合わせて作られているのか」「何を土台(基盤)にしているのか」を想像してみてください。ソフトウェアが、分割と抽象化と再利用によって作られていると知ると、技術のニュースの見え方が変わります。次のレッスンでは、それでもソフトウェアに不具合が生まれる理由——バグを見ます。