http://blog.engineer.adways.net/entry/advent_calendar_2019こんにちは。広告システム担当の飛田です。何か寂しさを感じるのは私だけでしょうか。令和最初の天皇誕生日は2月23日です。先日、所属しているチームで抽象化について話をしました。個人的に抽象化が熱いワードになっていて、今回アウトプットを兼ねて。背景そもそも抽象化の話をチームでした経緯ですが、2つあります。変更容易性を高めるためチーム開発では変更容易性は重要な関心ごとです。そのため本格的にOOP(オブジェクト指向プログラミング)やSOLID原則などを取り入れる策略を考えていました。事前に抽象化の理解度を知る必要があると考えました。変数名やメソッド名への違和感コードレビュー時に、変数名やメソッド名と中身の内容で抽象度が一致していなかったり、そもそも抽象的過ぎて何をしているのか分からない経験を何度かしました。近年までプログラミングに抽象化が必要なことを知りませんでした。個人的には普段の生活で具体と抽象を意識することはほとんど無く、ほぼ感覚に近いかと思います。いくつか例を挙げます。グルーピング(関係性)一般的にマグロ、アジ、イワシなどは魚類として分類されます。対象それぞれの特徴を抽出し、グルーピングする行為を抽象化と言います。逆に1匹のマグロに名前を付ければ、これは具体化になります。何らかの組織に属していたことがあれば目標設定をやった経験はあるかと思います。会社は理念や事業内容、今後の方向性などを考慮して目標や指標を決めています。スタートアップなどの小さな組織を除けば、大抵は会社全体の売上高とか営業利益が主な目標になるかと思います。会社全体の目標に月間新機能リリース100本とか掲げませんよね?より現場に近い下位の組織ほど、その組織が持つ役割が加味された具体的な目標が設定されます。抽象化を理解されている方はお気づきだと思いますが、例え話自体が抽象化と言えます。人に雪とはどのようなものか説明するのは比較的簡単でしょう。例え話は対象の特徴を捉え(抽象化)、別の対象でその捉えた特徴を説明(具体化)しています。ここまでで抽象化とはどんなことか、だいたい把握されたかと思います。抽象化で大切なこと抽象化で押さえておきたい、3つのポイントがあります。特徴の捉え方が人によって異なる抽象化にはレベル(階層)がある具体と抽象は相対的である特徴の捉え方が人によって異なる対象には様々な特徴があります。その特徴をどう捉えるかは人によって変わります。他の人とのコミュニケーションは常に相手が対象を、どう捉えているのか把握する必要があると考えています。この、人による振れ幅を抑制するために、概念を定義したりする必要があったりします。抽象化にはレベル(階層)がある抽象化には階層があると説明しましたが、この階層も決まったものはなく、人によって階層の数も違います。この階層がズレているとコミュニケーションが成り立ちません。具体と抽象は相対的である絶対的な具体性や抽象性はありません。常に具体性と抽象性は隣あっていて、上位層から見れば具体的で下位層から見れば抽象的になります。プログラミングで抽象化が大切なのか個人的にプログラミングは、コードを介したコミュニケーションだと考えています。コミュニケーションの対象は、同じチームメンバーや自分含め未来でサービスに携わるかもしれない方々です。適切に意図が伝えられず、不具合に繋がる可能性があります。それらを解決するために、多大なコミュニケーションコストがかかることは容易に想像できるかと思います。言うまでもないですが、前半で触れたSOLID原則を利用するためには抽象化の理解が必要です。OOPはDIP(依存性逆転の原則)が必須なので、抽象化は避けては通れません。依存性逆転の原則は、オブジェクト指向技術で得られると言われる数多くの利益のうち、もっとも根幹にあたる部分に位置付けられます。抽象化を勉強するにあたって参考にさせていただきました。理解を深めることができ大変助かりました。ありがとうございます。功さん)https://www.amazon.co.jp/dp/B016LUTNI2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1最後に抽象化の訓練のためのプラクティスを模索する予定です。準備ができたらまた勉強会やるんで、チームのみんなよろしくね!当面は今回積んだ本を消化ですかね。冬季休暇中に読みきれるといいなー。次は大曲さんの記事です。