生まれて初めて抽象化と真面目に向き合った話

Adways Advent Calendar 2019 16日目の記事です。

http://blog.engineer.adways.net/entry/advent_calendar_2019



 
こんにちは。広告システム担当の飛田です。
今年は平日ですね。何か寂しさを感じるのは私だけでしょうか。
令和最初の天皇誕生日は2月23日です。

先日、所属しているチームで抽象化について話をしました。
個人的に抽象化が熱いワードになっていて、今回アウトプットを兼ねて。

背景

そもそも抽象化の話をチームでした経緯ですが、2つあります。

  • 変更容易性を高めるため
  • 変数名やメソッド名への違和感

変更容易性を高めるため

チーム開発では変更容易性は重要な関心ごとです。

そのため本格的にOOP(オブジェクト指向プログラミング)や
SOLID原則などを取り入れる策略を考えていました。
が、どうも裏で抽象化が深く関係しているっぽいことが分かり、
事前に抽象化の理解度を知る必要があると考えました。

変数名やメソッド名への違和感

コードレビュー時に、変数名やメソッド名と中身の内容で抽象度が一致していなかったり、
そもそも抽象的過ぎて何をしているのか分からない経験を何度かしました。

抽象化を意識したプログラミングをしたことがなかった

実はエンジニアになって10年は経ちましたが、
近年までプログラミングに抽象化が必要なことを知りませんでした。

抽象化とは何か

そもそも抽象化とは何かって話ですが、
短くまとめると 対象の特徴を抽出しいくつか削ぎ落とすこと です。
個人的には普段の生活で具体と抽象を意識することはほとんど無く、ほぼ感覚に近いかと思います。

いくつか例を挙げます。

グルーピング(関係性)

一般的にマグロ、アジ、イワシなどは魚類として分類されます。
対象それぞれの特徴を抽出し、グルーピングする行為を抽象化と言います。

逆に1匹のマグロに名前を付ければ、これは具体化になります。

構造、階層

何らかの組織に属していたことがあれば目標設定をやった経験はあるかと思います。
特に会社は理念や事業内容、今後の方向性などを考慮して目標や指標を決めています。
スタートアップなどの小さな組織を除けば、大抵は会社全体の売上高とか営業利益が主な目標になるかと思います。
会社全体の目標に月間新機能リリース100本とか掲げませんよね?

より現場に近い下位の組織ほど、その組織が持つ役割が加味された具体的な目標が設定されます。

例え話

抽象化を理解されている方はお気づきだと思いますが、例え話自体が抽象化と言えます。
雪を見たことがないかき氷を食べたことがある 人に
雪とはどのようなものか説明するのは比較的簡単でしょう。

例え話は対象の特徴を捉え(抽象化)、別の対象でその捉えた特徴を説明(具体化)しています。

ここまでで抽象化とはどんなことか、だいたい把握されたかと思います。

抽象化で大切なこと

抽象化で押さえておきたい、3つのポイントがあります。

  • 特徴の捉え方が人によって異なる
  • 抽象化にはレベル(階層)がある
  • 具体と抽象は相対的である

特徴の捉え方が人によって異なる

対象には様々な特徴があります。
その特徴をどう捉えるかは人によって変わります。
なので、他の人とのコミュニケーションは常に相手が対象を、
どう捉えているのか把握する必要があると考えています。

この、人による振れ幅を抑制するために、概念を定義したりする必要があったりします。

抽象化にはレベル(階層)がある

抽象化には階層があると説明しましたが、
この階層も決まったものはなく、人によって階層の数も違います。
そしてこの階層がズレているとコミュニケーションが成り立ちません。

具体と抽象は相対的である

絶対的な具体性や抽象性はありません。
常に具体性と抽象性は隣あっていて、上位層から見れば具体的で下位層から見れば抽象的になります。

なぜプログラミングで抽象化が大切なのか

個人的にプログラミングは、コードを介したコミュニケーションだと考えています。
コミュニケーションの対象は、同じチームメンバーや自分含め未来でサービスに携わるかもしれない方々です。

抽象化が蔑ろにされ、コミュニケーションが破綻すれば、
適切に意図が伝えられず、不具合に繋がる可能性があります。

それらを解決するために、多大なコミュニケーションコストがかかることは
容易に想像できるかと思います。

言うまでもないですが、前半で触れたSOLID原則を利用するためには抽象化の理解が必要です。
特にOOPはDIP(依存性逆転の原則)が必須なので、抽象化は避けては通れません。

依存性逆転の原則は、オブジェクト指向技術で得られると言われる数多くの利益のうち、もっとも根幹にあたる部分に位置付けられます。

謝辞

抽象化を勉強するにあたって参考にさせていただきました。
理解を深めることができ大変助かりました。ありがとうございます。

hidenorigotoさん
https://speakerdeck.com/hidenorigoto/chou-xiang-hua-tutehe-what-is-abstraction

ところてんさん
https://twitter.com/tokoroten/status/1198931581106184194?s=21

具体と抽象(著者:細谷 功さん)
https://www.amazon.co.jp/dp/B016LUTNI2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

最後に

抽象化の訓練のためのプラクティスを模索する予定です。
準備ができたらまた勉強会やるんで、チームのみんなよろしくね!

当面は今回積んだ本を消化ですかね。冬季休暇中に読みきれるといいなー。

 


 

次は大曲さんの記事です。
http://blog.engineer.adways.net/entry/advent_calendar_2019/17