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

JavaDo18_20200829

 JavaDo18_20200829

〈オンライン〉Javaを始めた&これから使う人向けモブプログラミング会
https://javado.connpass.com/event/185539/

Hiroto YAMAKAWA

August 29, 2020
Tweet

More Decks by Hiroto YAMAKAWA

Other Decks in Programming

Transcript

  1. #javado Hiroto YAMAKAWA, @gishi_yama 2 公立千歳科学技術大学 情報システム工学科 専任講師
 R&D: Experimental Development

    of ICT Systems (ex: City-Bus Tacking System) 
 Computer in Education, Programming and Programmer's Learning 
 
 Communities:
  2. #javado 最近のJavaの流れ・使われどころ 4 ͍Ζ;ʢʣ τϨϯυ͔Βߟ͑ΔϑϦʔϥϯε+BWBΤϯδχΞͷੜଘઓུ
 IUUQTP⒎FSTKQNFEJBTJEFKPCXPSLTUZMFB@ 流れの1つとして、多言語のシステムをJavaへ
 - 後方互換性、実行基盤(JVM)... ドメイン駆動開発などでの利用


    - 静的な型による問題領域とのマッピング
 - ソフトウェア仕様の記述 ૿ాږ ʢʣ ΦϒδΣΫτࢦ޲ϓϩάϥϛϯάͷݱࡏɾաڈɾະདྷ 
 ιϑτ΢ΣΞ։ൃͷ΍Γํͷվળ 
 IUUQTXXXTMJEFTIBSFOFUNBTVEBTT
 IUUQTXXXTMJEFTIBSFOFUNBTVEBTT
  3. #javado 何らかの範囲や共通の種別の中での定義を表すためのクラス。 何かを区別・判断するための定数やバリエーションを表す(例:種類、処理パターンなど)。 enumをうまく扱うための独自の仕組みなどもある。
 (例:EnumSet, Switch文) class 識別子の変わりに enum 識別子を使う。


    列挙型(enum) public enum Season { SPRING, 
 SUMMER,
 FALL,
 WINTER; } Season.SPRING
 で「春」を定数として
 使える  public enum Exchange { USD(106), 
 EUR(125),
 NZD(68); private nal int rate; private Exchange(int rate) {
 this.rate = rate;
 }  public int getRate() {
 return rate;
 } } 定義ごとに、
 付属する値を定義し、
 外部から利用できる Exchange.USD.getRate();
 ⇒ 106が返る
  4. #javado イミュータブルオブジェクト:
 インスタンス化の後、フィールドの値や参照先を変更できない仕組みのインスタンス ミュータブルオブジェクト:
 インスタンス化の後、フィールドの値や参照先を変更できる仕組みのインスタンス 通常、意識せずにクラスを作ると、ミュータブルオブジェクトを作るクラスになる。
 イミュータブルにすると、フィールドの状態の管理やインスタンス同士の比較が楽になる。 イミュータブルとミュータブル Field Field

    変更 × 変更 × イミュータブル Field Field 変更 変更 ミュータブル 不可 不可 可 可 検索や表示のみの用途のもの
 (利用期間内に)内容が変更されないもの
 ⇒ イミュータブル が向いていることが多い
  例:商品やそのリスト、注文履歴 入力や編集する用途のもの
 (利用期間内に)内容が変更されるもの
 ⇒ ミュータブル が向いていることが多い
  例:プロフィール編集画面、購入カート インスタンス化された後は
 フィールドの内容(参照)を変更不可 インスタンス化された後も
 フィールドの内容(参照)を変更可
  5. #javado 外部連係クラス
 (インスタンス) 共通処理クラス
 (インスタンス) 例えば、複数の対象(クラスやインスタンス、処理対象)をまたぐような部分は
 別のクラスやインスタンスになるように役割を切り分ける。 別のクラス/インスタンスに役割を切り分けるきっかけを見つける A, B両方に共通


    するような処理 システム外や
 別の仕組みと
 関わるような処理 A B 役割を切り分けたクラスは、
 利用しているパターンや技術、
 処理の内容や使われ方等に
 あわせて呼び方がかわる 例) サービス、リポジトリ、
    コンポーネント... データベースやファイル 部品クラス
 (インスタンス) 一部だけを書き換え て使い回せる処理
  6. #javado カードゲームのプログラムをクラスにわけてみよう ① ♠, ♥, ♦, ♣, Joker の5枚がシャッフルされたカードの山がある ②

    Player1がカードの山から
   n枚目を指定して1枚引く ③ Player2がカードの山から
   n枚目を指定して1枚引く ④ 引いたカードを比べて、
   強いカードを引いた方が勝ち ルール)5枚の山から引く ルール)4枚の山から引く ルール)♠, ♥, ♦, ♣, Joker の順に強い。ただし、♠ は Jokerに勝てる。 vs
  7. #javado 14 120行程度の手続き型的なプログラムでも実装可能 けれども....   ゲームの勝敗のルールを変える(強さを逆にする)   カードの内容を変える(トランプにする)   プレイヤーにもっと情報を増やす としたら?  ⇒ そもそもゲームをどうやって実現しているのか?


     ⇒ ルールを変えたいときにどこを変えれば良い? をプログラムを全部読んで、頭にいれないといけない。
 実際に変えてみると、プログラムの中でいろいろなものが
 連動している。(暗号的強度が高い) カード、マーク、カードの山プレイヤー、ルールなど、
 前ページの図の中にもあった観点を手がかりに、
 わかりやすい・変更しやすい構造(クラス)にわけられないか?
  8. #javado モブプログラミング 17 マーク・パール (著)、長尾高弘(訳)、
 及部敬雄(解説):
 モブプログラミング・ベストプラクティス ? モブプログラミング: 
  複数人の質疑や議論の結果で進み、


     フロー効率の向上やチームの成長に
  寄与する ◦ 難しい課題に複数人の知識、
    スキル、ノウハウを総動員し取り組める
 ◦ 相互に知識・スキルを共有・継承できる
 ◦ 開発と改善(レビュー・リファクタリング)
    を兼ねられる ! ひとつのプログラミング課題に、複数人のチームメンバーが、
 同じ場所で、ひとつのパソコンを使って、解決方法を議論しながら
 開発を進める手法 参考文献:
  9. #javado モブプログラミングの流れ 18 1. 3名以上で一カ所に集まる 2. タイピスト(1名)とモブ(そのほか)に分かれる。タイピストは、パソコンの前に座る。 3. 活動する時間と、時間内に到達を目指すゴール、タイピストの交代のタイミング(5〜15分ごと)を決める
 〈モブ〉


    ・ ディスプレイに表示される画面を全員で見ながら、
   解決すべき課題や問題点に集中し、問題解決のための方法を考え・推測・提案する
 ・ わからないことはわかるまで質問して、学ぶ
 〈タイピスト〉
 ・モブ全員の合意がとれた操作やコードの入力をする 4. タイミングがきたら、タイピストを交代する。 5. ゴールが達成できたら、みんなで喜ぶ(ハイタッチ!) 6. モブ終了の時間がきたら、次回のモブにむけてふりかえりを行う モブ タイピスト モブ モブ モブ モブ
  10. #javado 今日のモブプログラミングの体制 19 Zoomミーティング AWS Workspaces 遠隔タイピストPC Zoomで画面共有 Workspaceクライアントで
 接続・タイピスト操作

    タイピスト役 音声・カメラ
 共有 音声・カメラ共有 モブ役たち IntelliJ IDEA,
 Zoom を起動
 ブラウザも利用可 10分程度で交代
 モブ役→タイピスト役は
  Workspacesクライアントを起動
 タイピスト役→モブ役は
 Workspacesクライアントを終了 Zoomを起動 遠隔タイピストPCの画面を
 Zoom画面共有で確認しながら
 モブ役達でディスカッションし、
 タイピストへ操作依頼
  11. #studyhacklt モブプログラミングでの勉強会事例(JetBrains Educational IDE の Kotlin入門) 20 モブ モブ モブ

    タイピスト • モブは問題解決にむけて積極的に議論する • モブ間の合意がとれた操作依頼をタイピストが反映する
 (誰か一人の独断では操作しない) • ゴールに到達したらみんなで喜ぶ • 分からないことや疑問を残さず確認する • 終了時には、次回にむけた振り返りをする • ※映像では割愛しているが、タイピストは
 一定時間(10分前後)で交代する 画面共有 (ゴール)
 Javaのオーバーロード 相当をKotlinでやる (議論)
 引数の型の後ろに
 デフォルト値を設定できる (議論)
 numberと toUpperCaseに
 デフォルト値を与える? (タイピストへ依頼)
 Intの後ろに=42, 
 Booleanの後ろに=false ゴール達成!
 みんなで喜ぶ (質疑)
 実際の開発環境は
 どんなコードに? (回答)
 使いどころやノウハウ、
 実例の共有 (ふりかえり)
 一連のモブや
 課題への振り返り
  12. #javado モブプログラミングタイマー(画面右下 Mob Ticker で起動) 21 1)参加者の名前をいれて Add (全員分) 1)最初の⼈を選んでタイマースタート(最初はスタッフが良いかも)

    3)みんなで調べるときなどはポーズ 4)中断するときはストップ(休憩など) 時間がくると、英語のダイアログで交代する⼈を教えてくれます。
  13. #javado • 内職はやめましょう!
 通知がきたのでつい...は休み時間までグッと堪える。
  ⇒どうしても緊急のときは、一旦モブの活動から抜けて、終了させてから戻ってくる。
 進行に必要な調べものも、タイピストに指示をしてみんなで同じ画面で調べる。
  ⇒調べる時は一時的にタイマーをポーズしても良い。 • できるだけビデオもONにしましょう
 メンバーがどんな表情で参加しているかも、チームに重要な情報です。


    差し支えのない範囲で、カメラをONにして参加しましょう。 • タイピストへ指示するときは、Zoomのコメント機能をうまく使おう!
 オプションを表示>コメントをつける で、画面共有に色々描ける
  ⇒レーザーポインタのつもりで「絵を描く」「スターをつける」で指し示す
  ⇒削除で消す • 細かくゴールを設定して、達成したら万歳しよう!
 「何分ぐらいで◦◦をしよう」と目標を決めてから作業をする
 目標が達成できたら、全員で万歳をして喜ぶ(少し大げさに) モブプログラミングの注意点(1) 23
  14. #javado • 参加者の人へ
 どんなことでも「わからない」「不安」「こういうことかな?と確認したい」ことが
 1つも残らないようにどんどん質問・確認しましょう。
 もちろん、プログラムのこと以外でも構いません。
 あなたが質問すれことで、同じ事を思っている・実は勘違いしている他の人も助かります。 • 経験者の方へ
 参加者(初心者)の方が発言しやすい雰囲気造りや、確認の促しをしてあげてください。


    どんな細かいことでも共有された知識・スキルがチームの財産や蓄積になります。
 あながた教えることで、チームがどんどん円滑に、ゴールに進めるようになります。 • Java Do スタッフへ
 原則経験者と同じ振る舞いですが、タイピストの暴走(モブの合議や指示のない操作)や
 モブの暴走(一人の意見で質疑や合議無しに進んでしまう)を防いでください。
 ゴールに到達したら率先して喜んでください。チームの良い雰囲気が作れます。 モブプログラミングの注意点(2) 24
  15. #javado 補足)List / ArrayList 27 容量が自動的に変化する配列として使うことができる。 ArrayListの中に格納されるインスタンスを要素と呼ぶ。 Fooインスタンスを要素として格納する予定の
 ArrayListをインスタンス化し、listという変数で参照する Foo

    Foo Foo list ArrayListΠϯελϯε List<Foo> list = new ArrayList<>(); List<Foo> list = new ArrayList<>(); Foo foo1 = new Foo(); list.add(foo1); Fooインスタンスを生成し、ArrayListに要素として参照を格納する Foo Foo Foo list ArrayListインスタンス Foo 0 0番目の要素として格納される。この番号を インデックス と呼ぶ。
  16. #javado 補足)List / ArrayList 28 Foo foo0 = list.get(0); Foo

    Foo Foo ArrayListΠϯελϯε Foo 0 1 2 Foo Foo Foo foo0 ArrayListの0番目に格納されている要素の参照を返す
 (foo0変数が要素0と同じインスタンスを参照する) Foo get(0) 返した要素は
 ArrayListから取り除かれない
 ※要素も返値も同じインスタンスを
  参照している状態になる list.remove(0); 要素自体をArrayListから取り除きたい場合は、
 removeメソッドを使う。
 ArrayListの要素の0番目に格納されている要素の参照を削除する。 Listの順序をランダムに並べ替える
 (下は実⾏例であり、実⾏結果は毎回変化する) List<Integer> list = new ArrayList<>(); list.add(8); list.add(1); list.add(5); list.add(10); System.out.println(list.toString()); 
 Collections.shuffle(list); System.out.println(list.toString()); ⇒[8, 1, 5, 10] ⇒[5, 1, 10, 8]