Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はじめてのIT勉強会 プリンシプルオブプログラミングPart.3

unisuke
September 21, 2021
110

はじめてのIT勉強会 プリンシプルオブプログラミングPart.3

unisuke

September 21, 2021
Tweet

Transcript

  1. The Principles of
    Programing
    Part.3
    2021.09.22 はじめてのIT勉強会

    View full-size slide

  2. 自己紹介
    名前 : うにすけ
    所属 : 東北大学工学部電気情報物理工学科4年
    出身 : 埼玉県
    twitter : @uniuni_8282

    View full-size slide

  3. プリンシプルオブプログラミング
    プログラマが3年目までに身に付けたい
    一生役立つ101の原理原則

    View full-size slide

  4. どんな人のための本?

    View full-size slide

  5. コードは書けるけど
    「よいコード」にならない人

    View full-size slide

  6. 「よいコード」にならない
    はどんな状況?

    View full-size slide

  7. 「よいコード」にならない
    ● 書いたコードがリリースされると頻繁に障害が発生する
    ● 書いたコードがリリースされると動作が遅い、すぐに落ちるなどのクレームがくる
    ● 書いたコードを見てもらうとわかりにくい、シンプルでない、美しくないと指摘を
    うける
    ● 書いたコードを見返した時読みにくいと感じる
    ● 書いたコードを修正すると途端に動かなくなる
    ● 書いたコードを修正すると予想外の箇所に影響が出る
    ● 書いたコードに機能を追加しようとしてもうまくいかない
    ● 書いたコードに仕様変更が入るとその部分全てが書き直しになる

    View full-size slide

  8. なぜ「よいコード」が書ける
    プログラマに成長するのが困難か?

    View full-size slide

  9. 成長したいが
    方法・指針がわからない

    View full-size slide

  10. よいコードを書くための
    「プリンシプル」を紹介

    View full-size slide

  11. 「プリンシプル」とは?

    View full-size slide

  12. プログラミングの指針となる
    前提・原則・思想・習慣・視点
    手法・法則

    View full-size slide

  13. なぜ「プリンシプル」を学ぶべきか?

    View full-size slide

  14. 「プリンシプル」の価値
    今ある技術はプリンシプルの目的「コードを書きやすく・読みやすく・バグを生じにくく・修正しや
    すくする」の具現化
    ● 技術がなぜ必要かを理解できるために習得が早く・深くなる
    ● 技術の目的に沿った形で適用できるために技術の使い方がうまくなる
    ● 普遍的な情報であるために陳腐化しない

    View full-size slide

  15. プログラマとしての成長の
    「正しい道」かつ「近道」になる

    View full-size slide

  16. 目次
    第1章 前提〜プログラミングの変わらぬ真実〜
    第2章 原則〜プログラミングのガイドライン〜
    第3章 思想〜プログラミングのイデオロギー〜
    第4章 視点〜プログラマの見る角度〜
    第5章 習慣〜プログラマのルーティーン〜
    第6章 手法〜プログラマの道具箱〜
    第7章 法則〜プログラミングのアンチパターン〜

    View full-size slide

  17. 目次
    第1章 前提〜プログラミングの変わらぬ真実〜
    第2章 原則〜プログラミングのガイドライン〜
    第3章 思想〜プログラミングのイデオロギー〜
    第4章 視点〜プログラマの見る角度〜
    第5章 習慣〜プログラマのルーティーン〜
    第6章 手法〜プログラマの道具箱〜
    第7章 法則〜プログラミングのアンチパターン〜

    View full-size slide

  18. 目次
    第1章 前提〜プログラミングの変わらぬ真実〜
    第2章 原則〜プログラミングのガイドライン〜
    第3章 思想〜プログラミングのイデオロギー〜
    第4章 視点〜プログラマの見る角度〜
    第5章 習慣〜プログラマのルーティーン〜
    第6章 手法〜プログラマの道具箱〜
    第7章 法則〜プログラミングのアンチパターン〜

    View full-size slide

  19. 第3章 思想〜プログラミングのイデオロギー〜
    目的 : 成功したソフトウェアを支えた文化・哲学・価値観といった思想を学びプログラミングの設計
    方針に生かす
    ● プログラミングセオリー
    ● アーキテクチャ根底技法
    ● アーキテクチャ非機能要件
    ● 7つの設計原理

    View full-size slide

  20. プログラミングセオリー
    プログラミングを導く価値観
    プログラミングの最大の関心ごとは「最高のコードを作り上げること」
    最高のコード : 拡張方法が多く存在し、余分な要素が存在せず、読みやすく理解しやすいコード
    ● コミュニケーション
    ● シンプル
    ● 柔軟性
    価値観を技術の選択基準に
    プログラミングにおける問題解決に用いる技術の選択には適応理由「なんでこんなことしなくちゃい
    けないの?」が必要→「価値」が個別の技術の選択理由になる
    What
    最高のコードの実現のために「セオリー」を支える3つの価値
    Why

    View full-size slide

  21. 価値観は原則を通じてコードに適用
    プログラミングセオリーの「価値」を基準として利用して技術や手法の適用/不適応を判断する
    →「価値」はプログラミングに利用するには抽象的すぎるために実戦につなげる橋渡しの概念が必
    要。それが6つの原則
    プログラミングセオリー
    How
    ● 結果の局所化
    ● 繰り返しの最小化
    ● ロジックとデータの一体化
    ● 対称性
    ● 宣言型の表現
    ● 変更頻度
    価値とプログラミングの架け橋となる6つの原則

    View full-size slide

  22. プログラミングセオリーを支える3つの価値
    - コードは「文書」であるので
    本質は「コミュニケーション
    ツール」
    - コミュニケーションが良好で
    あるとはコードを読んだ人が
    コードの理解・修正・使用がで
    きること
    - 良好なコミュニケーションの
    ために読む人のことを考えるべ

    コミュニケーション
    - コードの変更の容易さのこと
    - 保守作業を円滑に進めるのに
    役立つ
    - 拡張しやすく拡張が他に波及
    しないような設計を目指すべき
    - 柔軟性を言い訳にした複雑な
    コード/設計は許容できない。
    余計な柔軟性は結局使われず複
    雑さを増すコードになる可能性
    が高い
    柔軟性
    - コードがシンプルであるとは
    「余分な複雑性」が取り除かれ
    た状態
    - 「余分な複雑性」の除去は
    コードの理解を容易にし、障害
    の入り込む確率も下げる。良好
    なコミュニケーションにも繋が
    ることが多い
    - シンプルにしすぎてコミュニ
    ケーションが損なわれる場合に
    はコミュニケーションを優先
    シンプル

    View full-size slide

  23. プログラミングセオリーを実現する6つの原則
    変更の影響が局所に留まるよう
    にコードを構成する
    →関係性の高いコードを集約し
    てモジュール化する
    結果の局所化
    ロジックと操作されるデータは
    同じ関数やモジュールに
    ロジックとデータの一体化
    重複ロジックの排除
    →コードの分割/関数化
    繰り返しの最小化
    同質なものはコードのどの場所
    でも同じ振る舞いをする
    対称性
    修正タイミングが近いものは
    まとめる
    更新頻度
    データフローをなくし
    シンプルに表現する
    宣言型の表現

    View full-size slide

  24. よいコードの基礎原理
    よいソフトウェア・アーキテクチャ構築のための基礎原理
    ● コミュニケーション
    ● シンプル
    ● 柔軟性
    アーキテクチャ根底技法
    ● 抽象
    ● カプセル化
    ● 情報隠蔽
    ● パッケージ化
    ● 関心の分離
    ● 充足性、完全性、プリミティブ性
    ● ポリシーと実装の分離
    ● インターフェイスと実装の分離
    ● 参照の一点性
    ● 分割統治
    What
    10の根底技法

    View full-size slide

  25. 「機能以外の機能」の観点
    「機能面以外全般についての要件」でありソフトウェアが高品質でユーザーの役に立つためには必要
    不可欠であるもの
    ● コミュニケーション
    ● シンプル
    ● 柔軟性
    アーキテクチャ非機能要件
    ● 変更容易性
    ● 相互運用性効率性
    ● 効率性
    ● 信頼性
    ● テスト容易性
    ● 再利用性
    What
    10の根底技法

    View full-size slide

  26. コード妥当性レビュー観点
    障害を作り込まないように考慮すべきコードの構造上の7つの核心観点のこと。コードビューの時に
    チェック観点として使用できる。
    ● コミュニケーション
    ● シンプル
    ● 柔軟性
    7つの設計原理
    ● 単純原理
    ● 同型原理
    ● 対称原理
    ● 階層原理
    ● 線形原理
    ● 明証原理
    ● 安全原理
    What
    7つの設計原理

    View full-size slide

  27. 目次
    第1章 前提〜プログラミングの変わらぬ真実〜
    第2章 原則〜プログラミングのガイドライン〜
    第3章 思想〜プログラミングのイデオロギー〜
    第4章 視点〜プログラマの見る角度〜
    第5章 習慣〜プログラマのルーティーン〜
    第6章 手法〜プログラマの道具箱〜
    第7章 法則〜プログラミングのアンチパターン〜

    View full-size slide

  28. 第7章 法則〜プログラミングのアンチパターン〜
    ソフトウェア開発において陥りやすい「罠」に関するプリンシプル。ソフトウェア開発の歴史のなか
    で導き出された否定的な結果を持つ経験則で、アンチパターンと呼ばれる。
    ● ブルックスの法則
    ● コンウェイの法則
    ● 割れた窓の法則
    ● エントロピーの法則
    ● 80-10-10の法則
    ● ジョシュアツリーの法則
    ● セカンドシステム症候群
    ● 車輪の再発明
    ● ヤクの毛刈り

    View full-size slide

  29. ブルックスの法則

    View full-size slide

  30. コンウェイの法則

    View full-size slide

  31. 割れた窓の法則

    View full-size slide

  32. エントロピーの法則

    View full-size slide

  33. コードの腐敗の兆候
    ● 硬さ
    ● 脆さ
    ● 移植性のなさ
    ● 扱いにくさ
    ● 複雑さ
    ● 繰り返し
    ● 不透明さ

    View full-size slide

  34. 80-10-10の法則

    View full-size slide

  35. ジョシュアツリーの法則

    View full-size slide

  36. セカンドシステム症候群

    View full-size slide

  37. 車輪の再発明

    View full-size slide

  38. ヤクの毛刈り

    View full-size slide

  39. ご清聴ありがとうございました

    View full-size slide