見出し画像

シアトルで実践する「プログラミング的思考」[9] ~データを表現する(2) データを抽象化する

データを表現する(2)デジタル情報として表す では「デジタル情報」の利点と、人間にとって扱いやすいデジタル情報としての「データ型」について解説しました。ここではデータ型の抽象化についてみていきましょう。

抽象データ型

データ型が表す事象が複雑になり、より人間にとって意味あるものに近づくにしたがい「抽象化が進む」と言い表します。高度に抽象化されたデータは「抽象データ型」と呼ばれ始めます。

抽象データ型はそれにとって意味のある、いくつかの操作(オペレーション)を行うことが出来るようになります。例えば音楽の曲情報は「再生」というオペレーションを実行できるようになり、画像データは古ぼけた感じのフィルターを掛けたり出来るようになります。「物と動作」の間に強い関連が生まれるのです。例えば「ボールを投げる」や「バナナを食べる」は抽象化されたデータと操作です。「ボールを食べる」と「バナナを投げる」は抽象化が失敗していて少し変ですよね(バナナを投げてはいけません)。抽象化の対象を正しく表さなくてはならないのです。ソフトウェアエンジニアはそのような抽象データ型を定義し実装する仕事をしています。

世の中には多くのプログラミング言語がありますが、それらを分類分けするのに「どのぐらいの抽象化されたデータを主に扱えるか」をという特徴で整理する方法があるでしょう。コンピュータという「機械」に近いレベルのプログラミング言語の代表が「C言語」です。逆に高度に抽象化されたデータを扱うのに向いている言語に JavaScript、python、Java、C# などがあります。

いずれのプログラミング言語であっても、機械レベルから抽象化されたデータ型を使っている、という点は同じです。ただしその言語で扱いやすい抽象レベルがあり、解決しようとする問題とプログラミング言語の抽象レベルのミスマッチは非生産的です。例えば機械により近いC言語で、抽象レベルの高い、例えば保険業務のワークフローを管理するプログラムを作るとしましょう。それは不可能ではありませんが、抽象度を合わせるためのコーディングが増えることでしょう。逆に子供のプログラミング学習用のScratchなどは高度に抽象化されており、C言語などで自然にプログラムできるシステムプログラミングなどはそもそも出来ません。

「人気のプログラミング言語はどれ?」といった議論は「何が目的か」の前提無しにはほとんど無意味なのです。データ型と抽象化のトピックに戻りましょう。

抽象データ型の構成

数値データ型などは原始的な(プリミティブな)データ型と呼ばれ、コンピューターシステムのハードウェアのレベルで実装されています。コンピュータにとっての得意分野です。整数型や小数点がつく実数、さらに論理演算のためのデータ型などがこれにあたります。

一方、人間の世界の物事を表すデータ型は人間が定義します。プログラミング言語で記述(コーディング)する際にソフトウェアエンジニアがそれらのデータ型を定義します。多くの一般的によく使われるデータ型はプログラミング言語の一部もしくはライブラリなどで定義されています。それらに定義がない場合はソフトウェアの開発の一部として新たに定義する必要があります。「性別」や「電話番号」などを表すデータ型などがその例です。機械レベルで「性別」や「電話番号」といった原始的なデータ型は存在しません。また電話番号などは国によって書式が異なることもありますから、機械レベルで表すことは適切ではないのです。

このような抽象度の高いデータ型はソフトウェア開発者が定義します。その際、プログラミング言語が提供するデータ型を使います。性別などは以前は「男・女」のふたつしか考慮されていなかったのでブール型を使うことが出来ましたが、現在は「男・女」以外の性も考慮すべきなので、整数型を使うほうが適切でしょう。ソフトウェアエンジニアも社会の変化などを見ておかなくてはならないのです。

抽象データを定義することが出来ることはソフトウェア開発者に求められる重要なスキルのひとつです。このスキルは、解決しようとする問題領域(問題ドメイン)と設計実装のためのコンピュータの知識の両方を必要とします。「具体」と「抽象」の間を行ったり来たりして最良の選択が出来る能力が必要になるのです。

プログラミング教育では、ついついコンピュータの知識やコーディングの練習に重点が置かれてしまいますが、生産的なソフトウェアエンジニアは解決領域の知識経験に加えて、問題領域を理解できる能力も兼ね備えていると言えるでしょう。

ドメイン知識の必要性

例えば新規のプロジェクトで、今まで取り扱ったことのないデータがあった時、それをどのようにデジタル情報として表せば良いのかを考えます。このような場合、コンピューターのことに詳しいだけでなく、むしろそのデータが使われるコンテクスト(背景)、例えば銀行口座なら銀行業務、大学の授業なら学校運営、タレントのマネージメントなら芸能業界、など「ビジネスドメイン」と呼ばれる「現場の知識や経験」が重要になります。なぜなら、データーが現実に即した形で表されていなければ、最終的なシステムが不自然になってしまうからです。

こういった「ドメイン知識」は開発チームの「プロダクトマネージャ」という役割の人が担当することが一般的です。ソフトウェアエンジニアはプロダクトマネージャからドメインのことを学び、会話を持ち、多くの質問をして、最適なデータ型を定義していきます。この作業は「一発で正解」とはならないことが多いのです。実際に実験的にデータを作って、チームで検証していき、必要に応じて変更していきます。学びながら作って行くのです。

既存のデータ型の組み合わせを考える

ドメインを理解したらその理解を元に抽象データ型を定義します。その作業のほとんどは、既存のデータ型をどう組み合わせるかです。コンピュータの原始的なデータ型はもちろん、既存の抽象データ型(例えばユーザを表すデータ型や、すでにあるビジネスの商品を表すデータ型など)を部品として、構成していきます。

同じ事象について、複数の抽象データ型を定義してしまうと混乱の原因になります。ですから、ソフトウェアエンジニアには「調べる力」が求められます。経験豊富なエンジニアは、すでにあるデータ型のことを良くしっていますから、新たに抽象データ型を定義すべきかどうかの判断をすばやく下せます。そして必要であれば適切なデータ型を定義することができます。

この記事が気に入ったらサポートをしてみませんか?