2022年6月19日に開催されたJJUG CCC 2022 Springでの登壇資料です
JJUG CCC 2022 SpringJava初心者が知っておくべきプログラミングのこと2022/6/19 JJUG CCC 2022 Springきしだ なおき
View Slide
JJUG CCC 2022 Spring自己紹介●きしだ なおき (@kis)●LINE Fukuoka●「プロになるJava」デテマス●今日の話の具体的なコードのせてます
JJUG CCC 2022 Springプログラミング技術●プログラミング技術は大きくわけて2つ●プログラムを動かすための技術●プログラムを作るための技術
JJUG CCC 2022 Springプログラミング技術●プログラミング技術は大きくわけて2つ●プログラムを動かすための技術●計算論●アルゴリズム●プログラムを作るための技術●Javaの文法●標準ライブラリ●オブジェクト指向●テスト
JJUG CCC 2022 Springプログラミング技術●プログラミング技術は大きくわけて2つ●プログラムを動かすための技術●計算論●アルゴリズム●プログラムを作るための技術●Javaの文法●標準ライブラリ●オブジェクト指向●テスト知らないと動かせない知らないと書けない
JJUG CCC 2022 Springプログラミング技術●プログラミング技術は大きくわけて2つ●プログラムを動かすための技術●計算論●アルゴリズム●プログラムを作るための技術●Javaの文法●標準ライブラリ●オブジェクト指向●テスト入門書がない入門書がある
JJUG CCC 2022 Springプログラミング技術●プログラミング技術は大きくわけて2つ●プログラムを動かすための技術●計算論●アルゴリズム●プログラムを作るための技術●Javaの文法●標準ライブラリ●オブジェクト指向●テスト入門書がない入門書がある入門書を読んでも動くプログラムが書けない
JJUG CCC 2022 Springプログラミング技術●プログラミング技術は大きくわけて2つ●プログラムを動かすための技術●計算論●アルゴリズム●プログラムを作るための技術●Javaの文法●標準ライブラリ●オブジェクト指向●テスト入門書がない入門書があるプログラムを動かせないと意味がないのに入門書にあるプログラムを動かすのに必要っぽく書いてあったりする入門書を読んでも動くプログラムが書けない
JJUG CCC 2022 Springプログラミング技術●プログラミング技術は大きくわけて2つ●プログラムを動かすための技術●計算論●アルゴリズム●プログラムを作るための技術●Javaの文法●標準ライブラリ●オブジェクト指向●テストおおまかに載ってます
JJUG CCC 2022 Spring話すこと●プログラムを動かすための技術●プログラムの処理がなぜ難しいか●処理の難しさの分類●プログラムを作るための技術●オブジェクト指向がなぜ難しいか●オブジェクト指向をうまく使うには
JJUG CCC 2022 Springプログラムの処理がなぜ難しいか●状態遷移の理解●計算の複雑さ
JJUG CCC 2022 Spring状態遷移の理解●プログラムの処理では状態が変わっていく●通常の文章は状態一定●推理小説でも「犯人はヤス」という状態を徐々に記述している●途中を飛ばしたり、読む順番を入れ替えても、表現される状態は変わらない●プログラムは途中を飛ばしたり実行する順番を入れ替えると保持する状態が変わる●状態が変わっていくこと=状態遷移を理解する必要がある
代表的な状態●逐次実行●変数●ループ
代表的な状態●逐次実行●どの行を実行するかという状態が変わっていく(プログラムカウンタ)
代表的な状態●変数●再代入可能な変数は状態を保持している●状態を保持する変数は再代入が必要●再代入不可な変数は状態を管理しないので理解しやすい?●変数の難しさは、逐次実行で値が設定されることと状態をあらわしていることとにあるんではないだろうか
代表的な状態●ループ●ループの処理では状態が変わっていく●ループのない処理からはプログラムカウンタ以外の状態を排除できる●ループの難しさは状態遷移ではないだろうか●あとで詳しく説明
逐次実行や状態遷移を把握するには●JShellで一行ずつ実行する●デバッガで実行の過程や変数の変化を確認する
JJUG CCC 2022 Spring計算の複雑さ●計算自体に複雑さがある●複雑さには階層がある●組み合わせ論理●有限オートマトン●プッシュダウンオートマトン●チューリングマシン
JJUG CCC 2022 Spring計算の複雑さ●計算自体に複雑さがある●複雑さには階層がある●組み合わせ論理(状態がない)●有限オートマトン(状態がある)●プッシュダウンオートマトン(スタックが必要)●チューリングマシン(スタックが二つ必要=なにかデータ構造が必要)
JJUG CCC 2022 Spring計算の複雑さ●計算自体に複雑さがある●複雑さには階層がある●組み合わせ論理(論理素子の結線で実装可)●有限オートマトン(クロックとレジスタが必要)●プッシュダウンオートマトン(FIFOが必要)●チューリングマシン(自由にアクセスできるメモリが必要)
JJUG CCC 2022 Spring処理の難しさ●計算複雑さは理論的で実感とは異なる●逐次処理はどこを実行しているかの状態をもつ●有限オートマトン以上の複雑さになる●多くの処理ではスタックは不要●プッシュダウンオートマトンよりは単純
JJUG CCC 2022 Spring処理の難しさ●有限オートマトンを細分化する●それぞれの特徴をつかんで、それぞれをトレーニングすることで難しい処理がかけるようになっていくのでは?
JJUG CCC 2022 Spring処理の難しさの分類●ループがない●ループの各処理が独立●集計が必要●他のデータを利用●隠れた状態を扱う●状態を明示的に管理する●スタックが必要
JJUG CCC 2022 Springループがない●状態を考えなくていい●変数の再代入は不要
JJUG CCC 2022 Springループの各処理が独立●変数の再代入は不要●例: 配列のデータを表示する
JJUG CCC 2022 Spring集計が必要●変数の再代入が必要●例: 配列のデータを合計する
JJUG CCC 2022 Spring集計が必要●Streamが使える●ループを考えなくていい●変数の再代入が不要
JJUG CCC 2022 Spring他のデータを参照●拡張forやStreamでは書けない●例:重複排除、移動平均https://nowokay.hatenablog.com/entry/2022/04/25/130057
JJUG CCC 2022 Spring隠れた状態を扱う●隠れた状態をみつける必要がある●変数で管理する必要がある●例:ランレングス圧縮カッコが対応しているか検査https://nowokay.hatenablog.com/entry/2022/04/26/183544
JJUG CCC 2022 Spring状態を明示的に管理する●状態の遷移が複雑で管理が必要●状態遷移図を書く●各状態の処理は単純なので難しさに気づかずたくさんのフラグを導入してしまうことがある●例:文字列が実数として妥当か判定受注・入金・発注などの管理
JJUG CCC 2022 Springスタックを使う●入れ子のある処理●再帰を使って書ける●例:深さ優先探索カッコ付数式処理種類のあるカッコの対応を判定
JJUG CCC 2022 Springプログラムを動かすための技術のまとめ●作るための技術だけじゃなく動かすための技術も必要●処理の難しさに段階があるので、把握して練習しておくと難しい処理にも対応できるようになる
JJUG CCC 2022 Springオブジェクト指向がなぜ難しいか●必要ないところで使おうとしているからです
JJUG CCC 2022 Springオブジェクト指向がなぜ難しいか●必要なところで使うと難しくないし便利
JJUG CCC 2022 Springオブジェクト指向がハマるところは?●GUIフレームワークを作るとき●作る機会はめったにない●つまりオブジェクト指向がハマる機会はめったにない●オブジェクト指向が流行ったタイミングでGUIプログラミングが流行り始めたので、いろいろなプログラミングにオブジェクト指向がハマると勘違いしたのではと思っている
JJUG CCC 2022 Springオブジェクト指向がなぜ難しいか●オブジェクト指向とはなにか●「パラダイム」にだまされているのでは?
JJUG CCC 2022 Springオブジェクト指向とはなにか●「データ構造と振る舞いが一体となったオブジェクトの集まりとしてソフトウェアを組織化すること」~「オブジェクト指向方法論OMT」ジェームズ・ランボー~●OMTは「オブジェクト指向」の重要な源流のひとつ●ジェームズ・ランボー●1980年代のオブジェクト指向ブームの中心人物のひとり●ブーチ、ヤコブソンと共に「スリーアミーゴズ」と呼ばれた●OMT、ブーチ法、OOSEを統合するときの統一記法がUML
JJUG CCC 2022 Springオブジェクト指向とはなにか●オブジェクト指向の基準(「オブジェクト指向入門」~バートランド・メイヤー)●「支援する方法論も含めて、オブジェクト指向言語および環境は、ライフサイクル全体に適用され、作業段階の間の隔たりを最小限にするものでなければならない」●「クラスが唯一のモジュールでなければならない」●「すべての型はクラスに基づいていなければならない」●モジュールと型が一致する
JJUG CCC 2022 Springオブジェクト指向の特徴●カプセル化●データの一部を外部からみえなくする●データとデータに対する操作をまとめることで実現する●多態(ポリモーフィズム)●同じメソッド呼び出しが、操作対象によって振る舞いを変えること●継承●クラスの機能を再利用して拡張する●型理論の部分型(サブタイピング)を実現する
JJUG CCC 2022 Springオブジェクト指向の特徴の実際●カプセル化●抽象データ型としてオブジェクト指向以前から存在した●カプセル化をクラスとして実現するのがオブジェクト指向、といえる●多態(ポリモーフィズム)●関数を値としてもつことでオブジェクト指向以外でも実現化●Javaの場合はラムダ式●継承●機能を再利用するというコンセプトはオブジェクト指向に固有といえそうだけど、あまり機能の再利用としては使われなくなっている●型理論の部分型として考えるほうが整理されている
JJUG CCC 2022 Springオブジェクト指向の特徴の実際●カプセル化●抽象型としてオブジェクト指向以前から存在した●カプセル化をクラスとして実現するのがオブジェクト指向、といえる●多態(ポリモーフィズム)●関数を値としてもつことでオブジェクト指向以外でも実現化●Javaの場合はラムダ式●継承●機能を再利用するというコンセプトはオブジェクト指向に固有といえそうだけど、あまり機能の再利用としては使われなくなっている●型理論の部分型として考えるほうが整理されているオブジェクト指向にこだわらなくていいのでは
JJUG CCC 2022 Spring「パラダイム」にだまされているのでは●パラダイム – 考え方の枠組み●パラダイムの例●オブジェクト指向●関数型●構造化
JJUG CCC 2022 Spring「パラダイム」にだまされているのでは●パラダイムは暗黙にプログラミング全体を方向づけるように語られる●実際はパラダイムでプログラム全体を方向づけれない
JJUG CCC 2022 Spring「パラダイム」にだまされているのでは●イメージ:パラダイムはアプリケーション実装方針の枠組み●実現するためにそのパラダイムの言語を使う●実際:パラダイムは言語機能の枠組み●言語はいろいろなパラダイムの言語機能を独自の方針で組み込む●アプリケーション実装方針は言語次第要求アプリケーションオブジェクト指向Javaオブジェクト指向言語なら同じ実装方針のまま代替可イメージ 要求アプリケーションJavaオブジェクト指向関数型構造化実際言語が変わると実装方針も変わる
JJUG CCC 2022 Spring「パラダイム」にだまされているのでは●言語非依存な「オブジェクト指向プログラミング」なんてない●パラダイムに沿ったオブジェクト機能がある●言語によって「オブジェクト機能」の実現方法が違う●言語によって「オブジェクト機能」以外の機能との関係も違う●結局、言語ごとに言語機能を活かしてプログラミングするオブジェクト指向にこだわらなくていいのでは
JJUG CCC 2022 Spring話すこと●プログラムを動かすための技術●プログラムの処理がなぜ難しいか●処理の難しさの分類●プログラムを作るための技術●オブジェクト指向がなぜ難しいか●オブジェクト指向機能をうまく使うには
JJUG CCC 2022 Springオブジェクト機能をうまく使うには●アプリケーションのアーキテクチャ●差分プログラミング●データの定義と分類
JJUG CCC 2022 Springアプリケーションのアーキテクチャ●アプリケーションの構造はレイヤー構造が主流●レイヤーは関数的●クラスは単なる関数置き場●プログラム的には自由に統合分割できる●データはオブジェクト●操作はデータの正規化、別表現の生成●他のデータと直接やりとりしない
JJUG CCC 2022 Springレイヤー構造はオブジェクト指向か●「データ構造と振る舞いが一体」になってない●「オブジェクトの集まりとしてソフトウェアを組織化」されてない●「ライフサイクル全体に適用され」てない
JJUG CCC 2022 Springレイヤー構造はオブジェクト指向か●「データ構造と振る舞いが一体」になってない●「オブジェクトの集まりとしてソフトウェアを組織化」されてない●「ライフサイクル全体に適用され」てないオブジェクト指向とは言い難い
JJUG CCC 2022 Springレイヤーを流れるデータはオブジェクト指向か●「データ構造と振る舞いが一体」になっている●「オブジェクトの集まりとしてソフトウェアを組織化」してるほどではない●「ライフサイクル全体に適用され」てるとは言えない●レイヤーが変わるときに詰め替えることがある
JJUG CCC 2022 Springレイヤーを流れるデータはオブジェクト指向か●「データ構造と振る舞いが一体」になっている●「オブジェクトの集まりとしてソフトウェアを組織化」してるほどではない●「ライフサイクル全体に適用され」てるとは言えない●レイヤーが変わるときに詰め替えることがあるオブジェクト指向と言ってもいいかもしれないが余分な話がついてくるので抽象データ型と考えるのがいいんでは
JJUG CCC 2022 Springレイヤー構造でのオブジェクト機能の使い方●レイヤー●似たような処理の異なる部分を抜き出す差分プログラミング●データ●抽象データ型●継承を使ってデータを分類する
JJUG CCC 2022 Spring差分プログラミング●似たような処理のうち異なる部分を抜き出す●メソッドは似たような処理のうち共通部分を抜き出す
JJUG CCC 2022 Spring継承による差分プログラミング●共通部分をもつクラスを定義●差分は抽象メソッドとして定義●継承して実装●テンプレートパターン
JJUG CCC 2022 Springラムダ式による差分プログラミング●差分プログラミングはラムダ式を使うほうが簡潔
JJUG CCC 2022 Springデータの定義と分類●「オブジェクト指向」はアプリケーション全体の設計まで含みデータの定義方法を考えるには範囲が広すぎるので抽象データ型として考える●メソッドはデータの整合性の保障や別表現の生成を行う●継承を使ってデータの分類を行う
JJUG CCC 2022 Springプログラムを作る技術のまとめ●プログラムを動かすための技術ではない●まずは動かせるようになろう●オブジェクト指向が適用できるところは限定的●現代のアプリケーション構造にあわせて利用方法を絞る●オブジェクト機能としてJava言語の機能に集中する
JJUG CCC 2022 Springまとめ●プログラミングは作り方だけじゃなく動かし方も勉強する必要がある●JShellやデバッガで逐次実行を確認しよう●ループを分類して、難しいループも書けるようにしよう●入門書を読んでるとオブジェクト指向に惑わされることがあるけど、プログラムが動かせるようになってから考えよう●Javaの機能を使いこなすことを考える