hamburger

主に日記

読書メモ 入門監視

目的

最近、業務で担当しているアプリの品質維持で悩んでいて、バグアラート以外の監視も検討している。とは言っても、自分が監視方法として思いつくのはfirebaseのツールを導入するやり方ばかりで、全体像を理解しないでツール導入しても効果がないのではと悩んでいた。 で、元々評判が良かった上に社内の人もおすすめしていたので手にとってみた。
浅く広く学ぶはじめの1冊目として、監視を専門にしていない自分には丁度よいボリュームで、アプリケーション監視に関わる部分を中心に流し読みした。
全体感はわかったので、実際に手を動かすときに細部を見ながら関連情報も漁ってみようと思う。

概要

監視手法と監視対象別に、概要と例が紹介されている本。
特定のツールに特化した内容ではない。
もしツールの選択肢がたくさんあるならこの本で得られた知識をもとに監視フローを検討し、そこにフィットするものを選定するという流れで仕組みを組んでいけそう

印象に残ったところ

  • サービスの可用性は依存先以上に上がることはない
  • 監視を整備するときに、まず着手すべきはユーザが触れる部分
  • 監視のためのデータを集める方法はpull型とpush型に分類される。push型は必要なデータさえ送れば細かい設定を意識しなくて良いため、スケールしやすい
  • 管理対象→フロントエンド、バックエンド、インフラ、KPI
  • 万能で完全な一つのツールではなく、単一責務の複数のツールの組み合わせで監視用データを測定するのがトレンド
    • 監視ツールを自分たちで作る選択肢も勿論ある。但し多くの場合はSaasのツールで十分
  • 監視によってアラートが出た時の復帰方法も検討する
    • 手順書には、それが必要になった時に人間がどう判断すべきかを記載する
    • 人間の判断が不要な手順は自動で復帰する方法を検討すべき
  • 増えたデータをどうする?
    • 一定期間で削除
    • 特定時間での平均値を送る
  • データをどう活用する?
  • フロントエンドの監視
    • ロード時間をベースに考える
    • 実際のユーザのデータを取得するか、CIなどで実行して測定するか?
  • 自動データ取得ツールは、機能のコンテキストを意識して処理するわけではない。便利だが取得結果の活用方法は注意する
  • ログでデータを取得する場合、そのログで必要データが全て取得できるとは限らない
    • 必要データが含まれていない場合もある
    • ログレベルを設定しても、そのレベルを設定した開発段階では先の有用性まで判断できないので、解決しづらい

読書メモ チームで育てるAndroidアプリ設計

peaks.cc

アプリ開発をリードするときに悩むような、広い意味での設計についてフォーカスが当てられた本。筆者の経験を元に、新規事業で決めないといけないことだったり大規模開発で秩序を保ちながら改善していく方法だったりが紹介されている。アーキテクチャや具体的な実装方法も紹介されているが、そこは本題ではないように見えた。

新規開発と大規模開発という全く別の規模感の事例が一冊にまとまっているので、必ずどこかは刺さる部分があると思う。

紹介されているアイディアはチームリーダーやリードエンジニアになって初めて意識するような事例の解になっている部分が多い。もちろん全ての現場でそれがフィットするとは思わないが、複合的な状況を加味した設計・プロダクト開発マネジメント論を書籍で見かけることは少ないため、そういう意味でユニークな本だった。

作者ふたりともスキルの高い優秀な方なので、何も判断軸が無いうちはまずこの本に書かれていることをベースに試し、徐々に自分にあったやり方を身に着けていけばよいのだと思った。

以下は、個人的に気になったセクション。落ち着いたタイミングで再度読み返すつもり

読書メモ 技術者のためのテクニカルライティング

GWの割引に乗じて購入した書籍をガッと読んでみた。

社内に素晴らしい技術文書を書く人がいて、自分の文書と何が違うのかずっと気になっていた。課題感を持ちつつも具体的なアクションをとっていなかったのだが、たまたま目についたLINEの勉強会でテクニカルライティングという分野を知り、そのスキルにすごく興味を持った。

開発者として働いてきて非エンジニアが普通に身につけていそうな事務的スキルを磨いてこなかったので、ここ何日かでテクニカルライティングのスキルは明らかに変わった感覚がある。

この書籍は特別新しかったり難しい内容が書かれているわけではないと思う。しかし一度学んでしまえば取り入れやすいTipsばかりなので、すぐ成果に繋がりそう。今までこういう本を読んだことがない人は試しに読んでみるのが良さそう。

良い文書の判断基準

文章が簡潔

一文が短い方が良い。長いと何が重要なのか把握しにくい。

読み手がどんな行動をすれば良いのか明確

  • 書き手視点ではなく読み手視点で書く
  • 読み手がどの様な人か考える。提出相手だけが読み手だとは限らない
    • 例 提出先の部門関係者、経営者
    • 思いついた相手から広げる意識をもつ
  • その人が何をすべきかわかる様にする。それを判断する根拠も理解できる様にする。

論理的で理解しやすい

情報を整理してロジックツリーを組み立てる。ツリーの階層は3階層までにしておくと理解しやすい

校正時のテクニック

  • 書くべき情報を整理する。読み手に必要なキーワードが足りているか考える
    • 5W2Hを盛り込む。Hはどの様に(How)とコスト(How Much)
  • 文書をリファクタリングする
    • 重要な内容を先に書く
    • タイトルや概要を有効に活用する
      • 文章の構造がもつコンテキストも読み手の理解のフォローに役立てる
  • 文章をリファクタリングする
    • 接続詞を減らす。文の順序を入れ替えることで改善できることがある
    • 箇条書きを効果的に使う
      • 7項目以内にする。人が把握できる項目数は7つが平均
      • 見出しと箇条書きのセットで一つの情報
    • 手順のステップは10項目以内に抑える
      • 操作と結果は文章を分ける
  • 文をリファクタリングする
    • 一文40字が目安
    • 主題は一つに絞る
    • 行動してもらうことが目的の文は動詞で表現する
      • OK 〇〇してください
      • NG 〇〇が必要です
    • 否定表現は減らす。肯定系で書けないか検討する
    • ユーザを主語にして、能動態と受動態を使い分ける
      • 「など」は使わない
      • 選択肢は全て書く。あるいは必要なものを書く。
      • 同様の表現は英語に存在しない。英訳で誤訳に繋がる
    • カッコは丸括弧()と鉤括弧「」の二種類を基本にする
      • 丸括弧は言い換えや製品名
      • 鉤括弧は固有名詞や強調
      • 補足情報を括弧書きするのはNG
        • 一文が長くなる、冗長

読書メモ コーディングを支える技術

プログラミング言語に関してモバイル系以外を学習したことが少ないので、前からプログラミング言語に関する一般的な情報を一通り学んでみたかった。

またとある事情でアルゴリズム系の勉強をC++で始めるため、その前に読んでみようと思いこのタイミングになった。

メモ

3章 文法の誕生

  • forthの文法とスタックマシン
  • 構文木の流れ
  • ルールの競合と回避方法

4章 処理の流れのコントロール

  • ifとそれを便利にするためのelse
  • whileとそれを便利にするためのfor、更に便利にするためのforeach
  • ifもwhileもアセンブリではGOTOで表現できる

5章 関数

  • GOTOで同じ処理に飛ばす+戻り先のポインタをメモリに保存するのが原始的なやり方
  • 戻り先をスタックして保存できるようにすることで再帰呼び出しなどに対応

6章 エラー処理

  • 0or1の返り値でエラー判別
    • 読みづらいのとチェック忘れの発生
  • エラー発生時に例外として例外処理に直接飛ばす(GOTO)のがtry throw exception

7章 名前とスコープ

  • 変数名と変数のマッピングはそれぞれをポインタでマッピングする
    • 単純な箱と捉えると混乱するところ
  • 動的スコープと静的スコープ
  • 変数宣言の有無
    • 自分がrubyを苦手としている理由は変数宣言がないことによる読みづらさの気がしてきた

8章 型

  • 静的型付け言語と動的型付け言語
  • 型推論の立ち位置・解決しようとしたこと

9章 コンテナと文字列

  • hashテーブルの名前の由来
  • ListとLinkedList
  • O(1) < O(logn) < O(n) のイメージ

10章 並行処理

  • プロセスはメモリを共有しない
  • スレッドはメモリ共有する
  • コルーチンはメモリ共有するが割り込みをさせない

自分はプログラミングを社会人になってから始めた人間で別に優秀でもないので、新卒の新人研修などで覚えきれない情報処理系ワードがたくさんあった(コンパイルとか、JavaのList・Arrayの違いとか)。

それほど新しい書籍ではないので最新情報を追っている感じはしないものの、各言語で抱えていた課題とその改善案、それを踏まえて新しい言語ではどの様な思想で機能が組み込まれているか?などに触れられている。

いろんなキーワードがストーリーで繋げて理解できたので、単純な暗記が苦手な自分にとって非常に助かるものだった。

同僚などと会話していて一般常識のような頻度で出てくるキーワードもある程度網羅して学び直せたため、地味だけど今後の仕事に効いてきそうだと思った。

読書メモ エンジニアのためのマネジメントキャリアパス

上司と1on1をもう少し有効活用できないか?と考えていたところ、某フリマサイトで見つけたので購入してみた。

テックリードからCTOまでとの副題の通り、マネジメントされる側が持つべきマインドセットの説明から始まり、徐々に視座の高い役割で求められる振る舞いやTIPSが紹介されていた。

自分はどの役職で何をすべきか?にはとらわれず、普段のコミュニケーション相手がどのロールなのか?、何を求めているのか?をベースに読み進めていくのが良いのではないかと思っている。

一旦読み進めたのは3章のテックリードの項までだが、手元に置いて必要なときに参考にできる状態にしておきたい

1章 マネジメントの基本

  • 上司がやるべきアクションは、1on1を定期的に行うことと、フィードバックを提供すること
  • 1on1は上司への定期報告の場ではない。自分の責任でトピックを提案してみると良い
  • フィードバックは必要なときに早めに行う。ネガティブなものだとしても、早めに認知して改善するほうが評価が下がるよりもずっと良いはず
  • 出世や昇進を望んでいてそれについて悩みがあるのなら、それを上司に伝えてアドバイスを乞う。何が必要なのか伝えない限り手助けは出来ない。
  • 自分の目標達成のために行動する責任は自分にある

2章 メンタリング

  • 自分が言いたいことを相手に伝わる言葉で表現するのが下手な人は多い。傾聴とは、言葉だけでなく声や仕草にも目を配って相手を理解しようと務めること
  • 質問や自分が話そうとしていることが難しいと思ったら、別の表現で2~3回伝えてみる。間違っている場合は訂正してもらえるはず。
  • 自分がメンターになった場合は、相手に何を求めているかを明確に伝えること

3章 テックリード

  • 開発チームに対する責任を持ち、仕事の時間の3割はプログラミングしているのがテックリードの定義
    • 逆に言うと、7割程度はプログラミング以外のことをしていることが望ましい
  • システムアーキテクト・ビジネスアナリスト・プロジェクトプランナー・開発チームリーダーとしての役割を、バランス良くこなしていかなくてはならない
  • 他のメンバーに委譲できる仕事を積極的に探す
  • プリモータムで最悪の事態を想定し、逆算してプロジェクト完了時にすべき事を洗い出す
  • プロセスの改善が全ての課題を解決できるとは限らない

DDDへの第一歩を踏み出してみた

目的

アーキテクチャの話に振り回される前に普遍的な設計指針を持つべきと考えるようになり、DDDをベースに考えていくのが良さそう、という結論に至ったのが2月くらい。それから徐々にDDD本を読み進めている。

一冊目がドメイン駆動設計入門、今読み終わった二冊目が実践ドメイン駆動設計。

実践ドメイン駆動設計

実践ドメイン駆動設計

重複する内容も合ったがその分深い部分まで理解が進んだ。また、2冊目で新しく学んだ内容もハードルが下がった分わかりやすかった。少し遠回りしたかもしれないが、自分の中で咀嚼する余裕があったため普通に読むよりも定着していると思う。

読み進め方としては、以下のような感じ。

  1. 各要素(ドメインモデル、サービスなど)の概要を理解したら過去の自分の経験と比較し、適用できそうなケースを探す
  2. 適用したことで何が良くなるのか、良くならないのか、別の課題が発生しないか?を考える
  3. 設計が変わったことで他のコンポーネントも影響を受けるはずなので、その部分はDDDでどれに対応するのか考え、1に戻る

今担当しているプロダクトの改善案をいくつか思いつき、実践で適用していくモチベーションがアップしている。また、新機能開発では既にいくつかエッセンスを取り入れていて、見通しがよくなっている。レビューでも説得力がある指摘をできるようになった。

もっと早く学んでおけばよかったという後悔がある一方で、過去の自分だと理解は難しかったとも思っている。30代半ばに近づいてきてようやく理解できるスキルに到達できた、とポジティブに捉えている。

ドメインと境界づけられたコンテキスト

ドメインは事業を取り巻く世界、区分けの事。

一口に世界と言っても曖昧で広いので、関心の範囲を線引して境界づけられたコンテキスト内で要件を検討する。

現代の業務で扱うドメインは複雑で、複数のドメインが絡み合って一つのドメインとなっていることが多い。その場合、コアドメインサブドメインに切り分け、それらが一つのドメインを作り上げているという風に見る。

境界づけられたコンテキストの範囲は各ドメインの領域と同じになっていることが理想だが、システムとしてそうなっていないことも多い(巨大なモノリシック、不適切な範囲で分割されたモジュール、外部システムとの連携など)。そのため、既存システムを扱うときはドメインと境界づけられたコンテキストの範囲を正しく把握することが重要。

エンティティ・値オブジェクト・ドメインサービス

エンティティは一意のもの。必要なフィールドが全て同じであっても区別すべきオブジェクト。DDDのコンテキストにおいて、単なるテーブルオブジェクトではない。

値オブジェクトはその逆で、フィールドが同じ場合は区別しなくてよいオブジェクト。値の入れ物。

会社というドメインの中では、社員はエンティティ、社員が持っている名刺は値オブジェクト。PCは、ドメイン仕様に応じてエンティティとして扱う場合も、値オブジェクトとして扱う場合もあるかもしれない(会社はほとんどの資産をIDを付与して管理しているので、会社ドメインの値オブジェクトは探しづらい)。

ドメインサービスは、ドメインに特化したステートレスな処理を行うもの。staticなMethodで実現したくなるもの。

ドメインイベント

ドメインイベントはドメイン内で発生したドメインエキスパートが気にかける出来事。ただの仕様というものにとどまらず、〇〇になったら 〇〇のときにの様に名前をつけて表現すべき状態やアクションを指すことが多い。pub-subで通知したいイベントとして理解した。

モジュールと集約・ファクトリ・リポジトリ

不変的なルールや維持すべき整合性を表現する方法として集約がある。集約の単位を大きくしすぎるとドメインルールを見落とすリスクが高そうなので、極力小さくすることを心がけたい。集約同士が連携しあってそれぞれのレイヤーのルールを実現していくイメージ。

モジュールは、コンポーネントを集約して依存関係を整理することで、クラス間の適切な結合を表現する。実際の開発では、モジュール単位でビルドできたり切り替えがしやすくなるため、そっち方面でも活用することが多い。もちろん、設計意図の表現方法として活用されているケースもよく見かける。

ファクトリは複雑なインスタンス化を集約・表現するための手段だと思っている。カプセル化の一種。※実際にそう書かれていたわけではない。

リポジトリインスタンスの永続化機能を提供し、かつそれに関する操作を集約したコンポーネント

アプリケーションサービス

アプリケーションサービスは、ドメインドメインサービスのクライアントとして動作するもの。ドメインロジックではなく、ユースケースを表現するための手段。

アーキテクチャ

アーキテクチャに関する情報はたくさん見てきたが、エンタープライズ向けシステムのスケールに耐えられるサービスを表現しようとした場合はヘキサゴナルアーキテクチャを活用するのが一番バランスが良いのではと考えている。

一時期堅牢なアーキテクチャとして紹介されることが多かったCleanArchtechtureやOnionArchtechtureも結局はヘキサゴナルアーキテクチャと同様にレイヤを意識したもの(多分の話。CleanArchtechture自体ふわっとしか理解していない)なので、これをベースに組み立てて行くことでほとんどのケースで困ることはなくなりそう。モジュールのIFを定義してアダプタ経由で外部とメッセージを送受信できる、というのは一度仕組みを理解すれば応用が効きそうで、テストコードの実装パターンとも相性が良い。

経験が浅い頃はアーキテクチャの話がかっこいいと思っていたので、自分の主戦場であるモバイルアプリのアーキテクチャを色々考えては落ち着き、ということを繰り返してきた。一方でそういう話の中ではモデル層はModelとしてざっくりと紹介されることが多く、いつまで経っても理解が進んでいなかった。

そのモデル層というのがいわゆるpresentation層以外の部分で、DDDの領域の話と相性も良かった。今回DDD本を読みながら過去の開発経験と照らし合わせて妄想してかなり整理できたので、オレオレ設計になりかけている担当プロダクトを徐々にオーソドックスな設計に寄せていこうと思っている

SourceTreeでブランチ名をコミットメッセージの先頭に自動挿入する

はじめに

手順は9割以下のサイトと同じです。やってみたら少しだけ詰まったので、差分をメモしています

mono0926.com

目的

issue番号をブランチ名にしているので、それをcommitメッセージにも追加することであとから辿りやすくしたい

手順

hooksディレクトリの確認

本来なら.git/hooksディレクトリがある。ない場合はリポジトリrootでgit initコマンドを実行する

任意のリポジトリ内の.git/hooks/commit-msg.sample.git/hooks/commit-msgにリネームする

直接ファイル作成をするとcommit時に正しく起動しなかったので、.sampleファイルをリネームした

commit-msgファイルを変更

#!/usr/bin/env ruby
message_file = ARGV[0]
message = File.read(message_file, :encoding => Encoding::UTF_8)

current_branch = `git branch | grep '*'`.chomp.sub('* ', '')
current_branch = current_branch[current_branch.rindex("/")+1 .. current_branch.length]

newmessage = message.sub(/branchname/, current_branch)

File.write(message_file, newmessage)

SourceTreeの設定からコミットテンプレートを変更する

f:id:burgerham:20210405143316p:plain

メッセージが置き換わらない

hookのスクリプトが動いていない

stackoverflow.com

$ pwd
<repo>/.git/hooks
$ chmod +x commit-msg

スキルアップのために個人スクラムをやってみる

目的

スキルアップのために色々やりたいが、家族がいると時間を確保しづらいしダラダラやって成果が出ないという状況は避けたい。プロセスを改善することで何か良くならないか?と考え、やりたいことがスクラムと似ている気がしたので挑戦してみる

前提

  • 平日の午前1時間ほどは自由に使える
    • 子供を保育園に送っていってから、業務開始までの時間
  • 土日に時間を確保するのは厳しい
    • 子供の面倒を見てもらっている横で何かするのはハードルが高い、ということをこの一年で学んだ

スクラムについて

https://scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf

スクラム(名詞):複雑で変化の激しい問題に対応するためのフレームワークであり、可能な限り価 値の高いプロダクトを生産的かつ創造的に届けるためのものである。

複雑で変化の激しい問題 → 現状と目標のスキルギャップ、興味の移り変わり

プロダクト → 自分と、自分が周囲に提供できる価値

と読み替えて定義してみると、意外としっくりくる

ルール

スプリント

  • 1週間のタイムボックスで、計画→振り返り と input→output を繰り返していく
  • スプリントの開始日は月曜日、終了日は金曜日
  • 作業可能時間は平日9:00~10:00。一週間で5時間、月に20時間

www.amazon.co.jp

バックログ

何か課題や身につけたい事はTodoistに登録する

プランニング

月曜日にバックログから選択する。大きいテーマは金曜日に達成できる規模に分割する

レビュー

金曜日にアウトプットする。ブログなり、githubなり

レトロスペクティブ

個人的に別目的で月曜日に振り返りをやっていたので、それを活用する

読書メモ アジャイルな見積りと計画づくり

アジャイルサムライに続けて、アジャイル関連書籍2冊目。

hamburger.hatenablog.jp

開発手法よりも計画そのものを考える上で参考になる情報が欲しかったのと、社内で読書会を行っていたので、そのキャッチアップも兼ねて購入した。

目論見通り、アジャイル開発における見積もり・計画段階のTipsやマインドセットについて深堀りされていた。アジャイルサムライとページ数は同じくらいで、全体で占める見積もりの割合が圧倒的に多い。たとえや筆者の事例などが比較的多く、細かいステップを踏んで理解を進めていける。

一方で既に知っている知識も多いためか新鮮味が薄れていたのも事実で、後半は若干集中力を切らしてしまった。また、各セクションのタイトルと内容の関連が分かりづらいことが多く、読んでいて混乱するところもあった(これは自分の読解力の問題かもしれない)。Kindleでハイライトをつけられなかったのも残念。

プログラミングに関するセクションが無いため、実装工程から離れているPMみたいな人は手に取りやすいかもしれない。

第1部 問題とゴール

1章 計画の目的

  • 見積もりと計画づくりの正確さは、不確実性コーンのような傾向で収束する。プロダクト定義初期の段階では60~160%の誤差を生じる可能性があり、要求仕様が定まった段階でも15%ほどの誤差が生じるとされている。
  • 計画づくりはスケジュール決めではなく、何を作るか?を決める場
  • プロジェクトをすすめると新しい知識が手に入る。その知識を計画に反映させるべき。また、それを反映させやすくする計画づくりが重要
  • 計画が、期待と可能性を伝えるコミュニケーションの助けになる
  • 良い計画とは、ステークホルダーが意思決定するための参考になるもの

2章 なぜ計画づくりに失敗するのか

  • 顧客に価値があるのはフィーチャの完了であり、作業の完了ではない
  • 作業感の連携が必要なので、作業見積もりの合計=フィーチャの見積もりにはならない
  • マルチタスク化の悪い点はスイッチングコストだけでなく、一つが遅れ始めると複数のタスクの進捗に影響を与えること
  • 優先順位を意識しないで開発すると、プロジェクト終了間近になってスコープ減らす必要が出たときに重要機能が残っている可能性を残してしまう。
  • 見積もりはコミットメントではない

3章 アジャイル手法

  • イテレーションごとにリリース可能な状態の成果をあげること
  • イテレーション=リリースではない。複数のイテレーションをまとめてリリースすることもある
  • イテレーション開始時に、前のイテレーションで得た知識を計画に反映する
  • ユーザストーリーは要求を先にすべて書き出す必要はない。必要な情報を必要なときに会話して決めれば問題ない
  • プロダクトナレッジとプロジェクトナレッジを得ることで計画が正確になっていく。最初の計画時にすべての知識があるわけはない。
  • 知識を獲得するための時間も、計画に組み入れておくこと
  • 計画する対象は、リリース イテレーション 今日。あまりに先の計画は正確性にかける。
  • 計画の見直しの時間も計画に組み込むこと
  • リリースプランニングは、プロダクトオーナーと開発チームが満足条件を探っていくことから始める。満足条件は、フィーチャーとテスト内容で表現すること
  • 開発したフィーチャに対するフィードバックを踏まえ、満足条件を更新していく

第2部 規模を見積もる

4章 ストーリーポイントによる規模の見積り

  • ストーリーポイントの見積もり技法は、最小のストーリーを1として基準にする方法と、中央値を決めてそれを基準にしていく方法の2種類がある。
  • 1イテレーション内で完了したストーリーポイントの総量がベロシティ
  • 見積もりは規模と期間で分けて考える

5章 理想日による見積り

  • 理想日で見積もる場合の前提
    • ストーリー実現に必要な作業のみ見積もる
    • 必要なものはすべて作業開始前に用意されている
    • 割り込みは発生しない
  • 理想日であってもベロシティを導出できるので、その点はストーリーポイントと変わらない
  • ストーリーに対して見積もりは1つにするべき
    • 担当者ごとに見積もると、チーム一丸となって動くアジャイルチームの性質が失われてしまう。
    • 同じ機能を別プラットフォームでリリースする場合などはOK

6章 見積りの技法

  • 見積もりに費やした労力と見積もりの正確性は比例しない
  • チームで見積もるメリット
    • 見積もった人が作業できるとは限らない
    • 詳しくない人が意見を持っていないとは限らない
  • 相対見積もりがうまくいく規模は10倍までが目安
  • 専門家の意見で見積もりを決めようとしてもうまく行かないことが多い
    • アジャイル開発では作業ではなくストーリーに対して見積もりを行うが、そのストーリー実現のために必要なスキルは多岐にわたる。そのスキルすべてを持ち合わせている専門家は少ない
  • プランニングポーカーは、専門家の意見、対比、分割を組み合わせて行える

7章 再見積り

  • 結果的に予測したベロシティからずれたとしても、それだけであれば見積もりの値の変更は行わない。ベロシティが補正されていくため問題ない
  • 新しい知識を獲得した結果、規模が変わったと判断できたら再見積もりが必要
  • 完了とはストーリーの完了であり、作業の完了では無い

8章 ストーリーポイントと理想日

  • 見積もりはなるべく職能横断で行う
  • 理想日だと担当者のスキルが反映されやすいが、ストーリーポイントだと作業スピードを反映するイメージは湧きづらくなるため、結果的に相対見積もりがうまくいきやすい
    • 理想日と現実の経過日を関連されて考えがち

第3部 価値のための計画づくり

9章 テーマの優先順位づけ

  • ビジネス価値を図る上で見るポイント
    • フィーチャの金銭価値
    • フィーチャの開発コスト
    • フィーチャから学べる知識とその意義
      • 知識の獲得=不確実性の低下 であるので、計画の正確性向上につながる
    • フィーチャによって低減できるリスク
      • スケジュール、コスト、機能

10章 金銭価値による優先順位づけ

  • 新しい収益、増加する収益の他に、維持できる収益が存在する
    • もし実行しなかった場合に失ってしまう収益のこと

11章 「 望ましさ」による優先順位づけ

  • 狩野モデルでテーマを評価する
    • 当たり前
    • 一元的(線形)
    • 魅力的
  • 相対的重み付け
    • フィーチャがある場合の利点とない場合の悪影響それぞれを1~9でポイント化→価値の合計
    • 見積もりをコスト割合に変換
    • 価値/コスト で優先度が出せる

12章 ユーザーストーリーの分割

  • いつストーリー分割するべきか?
    • 1イテレーション内に収まらないと気づいた時
    • 大きいストーリーの見積もりの正確性をあげたい時
  • 分割方法
    • データ境界
    • 操作境界
    • 横断的な関心事
    • 機能要求と非機能要求
    • 優先度
  • ストーリーとして分解すること。タスクとして分解してはいけない
  • 小さすぎも良くない

第4部 スケジュールを立てる

13章 リリース計画づくりの基本

  • リリース計画で現時点の目標を決める
    • 満足条件を決める
    • 見積もる
    • ストーリーのリリース日を決める
  • イテレーション終了時にリリース計画を見直すとうまくいく

14章 イテレーション計画づくり

  • イテレーション内で行うタスクは詳細に理解しておく必要があるため、時間単位で見積もってもブレは少ない
  • イテレーションレビューでプロジェクトに関わりのある人からフィードバックをもらう
  • イテレーションのゴールを決める
  • 着手するストーリーを選んだら、それをタスクに分解する
  • 各タスク1日で終わるくらいのサイズた良い

15章 イテレーションの長さを決める

  • リリースまでの軌道修正が必要な頻度を基準として、タイムボックスを決める。2週間~2ヶ月程度が一般的

16章 ベロシティの見積り

  • 過去の実績でベロシティを見積もる
  • イテレーションの経験を積む前に計画を建てる必要がある場合は、一日の予定作業時間から消化できるタスクを選び、メンバー数を考慮してベロシティを導出できる

17章 不確実性に備えるバッファの計画

  • バッファ=不確実性に対する備え
  • フィーチャバッファは必須以外の見積もり時間をバッファとして扱う方法
    • 必須フィーチャは70%を超えないようにする
  • スケジュールバファは見積もり全体に対してバッファをつける
    • ここのタスクにはバッファはつけない
  • バッファを設定する場合は元の見積もりの20%以下にはしないこと。それ以下だとリスクに対応する備えになりづらい
  • 見積もり対象のストーリーが10個以内の場合はバッファは不要
  • フィーチャバッファとスケジュールバッファを組み合わせることで、異なる不確実性に対応できるようになり、リスクが減る

18章 複数チーム編成プロジェクトの計画づくり

  • チームで見積もり基準は揃える
  • イテレーション開始前にはユーザストーリーは詳細化できるのが理想
  • 合流バッファが必要なのは大規模チームのみ。中小チームでは不要

第5部 トラッキングと情報共有

19章 リリース計画のモニタリング

20章 イテレーション計画のモニタリング

21章 計画とコミュニケーション

第6部 なぜアジャイルな計画づくりがうまくいくのか

22章 なぜアジャイルな計画づくりがうまくいくのか

第7部 ケーススタディ

23章 ケーススタディ:ボムシェルタースタジオ

読書メモ アジャイルサムライ

漠然とプロジェクトマネジメントに関する理解も深めたいなと考えていて、評判が良かったのもあり読んでみた。

エンジニア組織論への招待よりも、アジャイルに関する情報が1段階深く、かつアジャイルに必要な考え方を分解して書かれている印象。

読むと真似したくなるTipsが多く、少しずつ実務に取り入れていきたい。

以下は各セクションに関するメモ

第I部 「アジャイル」入門

第1章 ざっくりわかるアジャイル開発

  • 価値ある成果を毎週届ける
    • 成果 = 動くもの
  • 1週間で終わらなそうな場合は、もっと小さい単位に分解する
    • ただし、どうしても分割できないものもあるので、そこは柔軟に考える
  • 毎週、にこだわらず、タイムボックスも柔軟に決める
  • ソフトウェア開発の大前提
    • 要求は初期段階で全ては揃わない
    • 要求は変わる
    • 確保できる時間より、要求されているタスクのほうが多い

第2章 アジャイルチームのご紹介

  • 役割に仕事をふるのではなく、仕事に必要な役割を演じる
  • 開発完了まで担当するので、品質保証も自分たちでやる
  • 自己組織化されたチームに必要なのは、役割ではなく目的達成のために動ける人
    • その人に、適切な権限を移譲する
  • 役割を固定しないほうが良いが、理解への第一ステップとして各役割のアジャイルな状態を説くのも良い方法(ex,アジャイルプログラマ)
  • スクラムマスター = PM + アジャイルコーチ

第II部 アジャイルな方向づけ

第3章 みんなをバスに乗せる

  • 適切な人を集めず、前提を共有しないまま開始したPJTは失敗しやすい。ここで理解が異なる状態でコミュニケーションミスが発生するから
    • インセプションデッキを参考にチームで議論を進めて理解を深めることで、改善できる
  • 我々はなぜここにいるのか、という問いは、なぜこのPJTに集められたと思うのか?なぜこのPJTが始まったと思っているか?を問いている
    • なぜ自分がこの会社に所属しているのか?という問ではない
      • 以前チームジャーニーが会社で流行った時、同様の質問をチームで考えていて出てきた意見がそういうのばかりだった。その時聞いてて感じていた違和感はこれだったんだ!と気づけた。

第4章 全体像を捉える

  • インセプションデッキの前半について。なぜ?の理解をすすめる
  • PJTのゴールは与えられるものではなく、議論してチームで理解するのが重要
    • そのためにも、PJTの課題を現場で体験して状況を理解する必要がある
  • 顧客が知りたいのは機能の変更点ではなく、自分にとって何が良くなったか?
  • プロダクトのパッケージデザインを話し合うのは、楽しいこともありチームビルディングに向いているトピック
  • 自分が思っているよりもプロジェクト関係者は多い、ということを念頭に置く。その人達を大事にして信頼関係を構築しておくこと。
    • いざという時に助けてくれる味方になる

第5章 具現化させる

  • インセプションデッキの後半。どうやってを理解する
  • チームメンバーを決めるということは、その後決めるアーキテクチャの方向性も決めるということ
    • 自分の得意分野を表明しておく
  • 早めにリスクについて話すメリット
    • 早いタイミングであればあるほど、対応できる余地が増える
    • それについての議論をすることで、メンバー同士の理解が進む
    • 抱えているものを吐き出すことで、スッキリする
      • 個人的には、作業に集中できるかどうかが変わるので結構大事なこと
  • 6ヶ月以上の期間を要するPJTは、届けられる成果が曖昧になりやすく、失敗の確率が高いと言われている。避けるか、小さく分解すべき
  • QCDの他にスコープがあり、スコープは他に比べ変更がしやすい
    • スコープ→featureの内容
  • プロジェクトで重要視するものを決める際はQCDスコープの他に、各チームメンバーが大事にしていることも議論の対象にすること
    • チームの生産性にも寄与するから
    • 自分は何を大事にしているか?を考えたが、成長できるかどうか?しか思いつかなかった。逆に他に何があるんだろう。。。
      • 定期的に考え直してみたほうが良いかも
  • チームの中で、顧客に求められる役割についてはなぁなぁになりがちなので、気を付ける

第III部 アジャイルな計画づくり

第6章 ユーザーストーリーを集める

  • 要求をすべて文書にするのは難しい
    • 文書とのコミュニケーションができないのと、他人の文章は誤解を招きやすい
    • 文書がすべて、となるのは良くない
  • ユーザストーリーとしてまとめ、それを実現できることをターゲットにする。テスト対象は、ストーリーを実現できるか?
  • 顧客が理解できる書き方で書くこと。

第7章 見積り:当てずっぽうの奥義

  • 概算見積もり ≠ 正確な見積もり
  • 事前に正確な見積もりをするのは不可能
  • ptで相対見積もりをする。一定のタイムボックスで対応できるptを算出する。イテレーションを繰り返していくと、ベロシティが安定する
  • 三角測量
    • 小中大のストーリーを決め、それを基準に割り振る。割り振れなかったものはそれらと相対的に見積もり、ptを算出する
    • サイズを算出できないものは、期間を決めてスパイク(雑に言うと調査)して算出
  • プランニングポーカー
    • 関係者みんなで見積もりし、議論しながらすり合わせていくことで精度が上がる、という理屈
    • 合意できるように議論することで、理解が進む

第8章 アジャイルな計画づくり:現実と向きあう

  • 計画も変化するもの
  • 計画の立て方
    1. マスターストーリーリストを作る
    2. 見積もる
    3. 優先順位を付ける
    4. ベロシティを仮で決定する
    5. 期日とfeatureを調整する
  • 立てた計画は、バーンダウン(アップ)チャートで可視化する

第IV部 アジャイルなプロジェクト運営

第9章 イテレーションの運営:実現させる

  • イテレーションのゴール => 顧客にとって価値のある成果を出すこと
  • 分析は、作業するイテレーションの一つ前で行う
    • 必要なときに必要な分だけ
    • アイディアを出し、デザインを考え、テスト条件を確定する

第10章 アジャイルな意思疎通の作戦

  • ストーリー計画 : ストーリー開始可能かチェック
  • ショーケース : デモをしてフィードバックを受け取る
  • イテレーション計画 : ベロシティの確認
  • 振り返り : どうすればもっとよくやれるか?
    • kptをすると、pを文字通りただの問題と捉えてプロジェクトと全く関係のないことを上げる人がいて、直近の悩み。(天気が悪い、みたいな内容)
  • デイリースタンドアップ : 自分のコミットメント対象を宣言する
  • チームに合うものを、合う形でやること。合わなかったものは無理してやらない

第11章 現場の状況を目に見えるようにする

  • チーム外に対する期待値のマネジメント
  • リリースボード : 終わっているストーリーの把握
  • ストーリーボード : 現在のイテレーションで取り掛かっているもの
  • チームのベロシティ : 開発速度
  • バーンダウンチャート : 今のペースだとどのくらいに終わるのか?

第V部 アジャイルなプログラミング

各章読んだが、今となっては基本的なこと、+もっと深い内容を知るべきなので別の本で理解をすすめることに。

第12章 ユニットテスト:動くことがわかる

第13章 リファクタリング:技術的負債の返済

第14章 テスト駆動開発

第15章 継続的インテグレーション:リリースに備える

読書方法を変えてみた

きっかけ

以前GoogleKeepに写真付きでメモするというやり方に落ち着いたのだが、結局見返したときに何が大事なのか?その時感じたことはなにか?が無いため見返してもよくわからず、すぐに挫折してしまっていた。

そのままメモをしないで読書を続けていたが、やはりアウトプットが必要だしどうにかしたくて、何気なく見たyoutube動画がきっかけでまた別のスタイルを試してみている。

そのやり方のメモです

参考になった動画

www.youtube.com

やり方

  1. iPadKindleで本を読む
  2. 読みたいトピックを目次から探し、ハイライトする
  3. ざっと流し見し、気になった本文をハイライトする
  4. ハイライトにその感想を書く→goodnotesに変更

なぜiPad?

物理本にマーカー引くのもいいが、Kindleのハイライトはそれだけを抜き出してデータにできる。

それをしようとすると電子書籍を購入することになるが、スマホの小さい画面では結構読みづらいし、ハイライトしづらい。

大きい画面で没入することで集中できる効果もあると思うので、iPadはおすすめ(自分も購入して2週間くらいだが)

ハイライト?

Kindleのマーカー機能。ハイライトとメモをhtmlで出力できるので、後からまとめたりするときも紙のメモを見るより使いやすい

(追記)感想や個人的なまとめなどの場所

当初はkindleのハイライトと一緒にメモを残せばよいかと思っていたが、電子キーボードでの入力の煩わしさがきつかった。ペンの手書き入力のほうがフリーフォーマットで書けて便利だと仮説を立て、GoodNotes5というアプリを購入してペン入力してみた。

2回目の確認ではハイライト部分を見ながら雑なメモを手書きで残すとスピードも落ちず、思考をまとめられていい感じだった。

やってみた感想

とりあえず、一週間で一冊読んで雑に感想をまとめることができた。後から見るときも目次のハイライト部分を主に見れば良いし、中身を覚えてきたらそれ以外のところを見れば良いので、繰り返し読みながら学んでいくという観点で考えると続ける価値があるなと思った。

読書メモ エンジニアリング組織論への招待

念願のiPadを購入したので、その勢いでKindle積ん読状態を解消した。

組織論と書かれているがプロジェクトマネジメントに通じる部分が多いので、プロジェクト進行に課題を感じている人はメンバーだろうとテックリードだろうと読んで損はない内容だった。アジャイルスクラムといった個別のトピックは、別の書籍でフォローしたほうが深堀りできそう。

自分はモバイルエンジニアの役割で仕事をしている。一人でアプリを担当することが多いのであまりチームとしてのフィードバックを受けることがなく、プロジェクト進行に関するモヤモヤが解消されないことが多かった。この本を読んで、言語化できたり改善のきっかけをつかめた気がする。

以下は各セクションの概要とKindleのハイライトメモの抜粋

Chapter1 思考のリファクタリング

  • エンジニアリングする上で向き合うべき不確実性について、その発生原理や対処方法のパターンについて

「曖昧さ」を減らし、「具体性・明確さ」を増やす行為が「エンジニアリングとは何か」という答えでもあるのです。

エンジニアリングの本質

少ない指示で物事を実現できるので、より大きな「不確実性」の削減を行うことができます

自己組織化された組織であるメリット

人間にとって、本質的に「わからないこと」はたった2つしかありません。それは、「未来」と「他人」です。

解消すべき不確実性の分類

技術的な理解や視点は重要ですが、それだけを考えていると本質を見失ってしまいます。

自分が陥りがち。戒めとして覚えておく

これらのことからわかることは、「怒り」が発生しているそのときは「自分」ないし「自分の大切にしているもの」に被害が及びそうだと感じている

扁桃体が刺激されている、と自覚して怒りを気づきのきっかけにしたい

経験主義的な発想でことに臨めば、「わからなかった」あるいは「正解ではなかった」ということが重大なヒントになり、次の行動を生み出します

スクラムでチーム成長が起きるサイクル

対立に見える問題を、対立にならない全体像をあぶりだすことと、その解決を個人の問題にせず、関係性の問題に変換して、本当の問題を発見する

システム思考でやるべきこと

Chapter2 メンタリングの技術

  • 不確実性を生み出す人間の認知の歪みを矯正する手段としてのメンタリング技術について

上司が「ここまでは自立的に考えてほしい」と考えている期待値と、部下の「ここまでは自立的に考えるのが自分の仕事だ」と考えている期待値の2つが、一致していれば問題はありません。

部下のマネジメントの成功判断基準

自分から考えて動いた結果、評価されたとか、周囲からの尊敬を集めたとか、そういったポジティブな結果を手に入れた人は、正のフィードバックサイクルの中に「自立的に動くことは、楽しい」といった回路が組み込まれることになります。

メンタリングで意識すべきこと

メンタリングは、自立型人材を作るために、信頼関係の上に期待値を調整して、適切に自己効力感をもてるようなフィードバックループを作り出していきます。

メンタリングの際の基本姿勢

このような閉じた世界の中での合理性、「限定合理性」に人々が縛られてしまうのは、その閉じた世界で考えることが「心地よい」ものだからです。

作業に追われているときに陥りがちな状態

すべてのその人の問題は当人しか解決できないので、解決策を言うこと自体が、相手への敬意を欠いた行為ともいえます。

メンターの心構え

メンタリングにおいては、この「リフレーミング」のテクニックを使って、メンティが囚われている認知フレームを別のフレームに変えていくことで、「解けない問題」を「解ける問題」に変えていきます。

メンタリング関係なく認知フレームを外す為の習慣取り入れてみたい

アクノレッジメントは、・ちゃんと挨拶する・無視しないで話を聞く・相手に感謝を伝える・気にかけて話しかける・自分本位でなく相手本位で話をするという、小学校で習うような当たり前のことばかりです。

メンタリングの心構えその2

私がよく使う言葉として、「能力は習慣の積分だ」というものがあります。「習慣」とは「行動」が染みついたものです。そのため、「行動」や「習慣」は外からでも、メンタリングの方法論を用いて成長を促すことができます。

観測して測定

Chapter3 アジャイルなチームの原理

  • アジャイルをチーム単位でのメンタリングと捉えた上での、解説やポイント

アジャイル開発は、アジャイルなチームを作るための方法論で、複数の軽量開発プロセスの総称です。

概要

開発チームが抱える不安と要求を出すプロダクトのオーナーとの意志が統一されていること

アジャイルで重要視すべきこと

アジャイルな方法論を用いて、チームの認知をリフレーミングしていくことが、アジャイルな方法論を「チームメンタリング」であるとする理由です。

アジャイルとメンタリングの関係

Chapter4 学習するチームと不確実性マネジメント4

  • チーム内で発生する不確実性のマネジメント方法について

・制約スラックを削減する

・見積りの予測可能性を上げる

・プロジェクトバッファの消費を可視化し改善する

スケジュールマネジメントの基本要素

不安量の大きいタスク順に問題解決をする

不安量の大きいタスクを解体する

不確実性解消に向けたステップ

自分たちが今わからないものを「どのようにしたらわかるようになるのか」「わかったものからどのようにしたら改善するのか」を意識できるようになると、自分たちを役割に閉じ込めること自体がおかしなことだと気がつくようになります。

自己組織化されたチームの第一歩

Chapter5技術組織の力学とアーキテクチャ

  • チームより大きな組織単位で考えたときに不確実性を下げるためにできること

コミュニケーションというのは、「発信」と「到達」だけではなし得ません。「受信」の確認と行動変化による「正しく受信されたか」の確認が不可欠です。

正しく受信されたか?の確認をしない人は多い気がする

システムの要件を決めるプロダクトオーナーは、少しでもビジネスを進捗させたいため、工数のかからない施策への優先順位を上げていきます。工数のかからない施策とは、現行のアーキテクチャで無理のない施策ということなので、アーキテクチャがビジネスの構造や組織構造への影響を与えることになります。

技術的負債がビジネスに影響を与えるプロセス

2020年の振り返り(その他)

右手首の負傷

元旦に息子の抱っこ中に手首を負傷した。

okuno-y-clinic.com

腱鞘炎と似ているが、完治することは無いらしい。3月くらいまでは気を緩めると痛む、ということを繰り返していて、今ではすっかり手首をかばう動きに慣れてしまった。

これを機に、キーボード沼に興味を持ち始めた

リングフィットアドベンチャー

ガッキーのCMがかわいいゲーム。発売直後くらいに購入していたが、前述の通り手首を痛めたことで使わなくなっていた。コロナがきっかけで妻と一緒に再開したが、子供がいると危ないので日中はできない+夜は足音を気遣う必要があって静音モードでやる必要がある、という状況が嫌になってきて、6月くらいでやめてしまった。本当は継続してやりたい

www.nintendo.co.jp

デスク環境とキーボード

会社支給のmacbook proのキーボードが不調だったので、会社経費でrealforceを購入してもらった。押し心地が良すぎて感動したが、手首の可動域の関係で分離キーボードが気になり始めた。結局、デスク環境を改善する過程でMD770を購入し、今に至っている。これのBT版が出たら買い替えたいと思ってる

Apex Legends

友達とGWから週1でやっている。最初は撃っても当たらず、逃げて生き残るしかできなかったが、最近ではたまにkillとったりアビリティを使えるようになってきた。まだまだ初心者レベルだが、結構楽しい。ただ最近は、友人との上達速度の違いが気になったり、若干マンネリになっていのを感じていて、別のゲームをやろうかと相談中

www.ea.com

Ghost of Tsushima

一人で楽しんでいるゲーム。発売直後に購入したが、仕事が忙しかったためまだクリアしていない。本当は年末にやりきりたかったが、無理そう。映像が綺麗

store.playstation.com

電動モップ

息子のクレヨン汚れのために購入。アメトークの家電芸人で紹介されていたもので、水拭きのハードルが下がりまくって助かっている

kuralabo.com

ストレッチ

3月くらいまでマッサージに通っていたが、値段も結構するし居心地悪いしで、行かなくなった。ただ、座っている時間が長引いた影響か体の不調が気になってきたので、youtube見ながらほぼ毎晩ストレッチをするようになった。体が柔らかい、股が180度開く、みたいなのが理想だが、流石にそこまでは行かなかった。でも前屈してて明らかに柔らかくなったのを実感しているので、続けてよかった習慣。肩や腰の痛みも無くなった

www.youtube.com

iPad Air

技術書が増えて本棚が埋まっているのが嫌になって、電子書籍への移行を決意し購入した。もともと私物iOS端末がほしかったというのもある。試しに何冊か読んだが、ラインを引いたりできる(物理本は抵抗があるのとマーカーを持ち歩くのが億劫)ので便利。スマホ電子書籍が苦手だったから躊躇していたが、大きい画面ではそれほど問題にならなかった。オライリーの本は電子書籍が無いのが残念

www.apple.com

youtube premium

ゲーム動画や勉強系動画を風呂で見る習慣が一時期あり、その短い時間をCMで浪費するのがすごく嫌で登録した。ダウンロードもできるので便利だが、最近Apex動画を見なくなった関係で利用頻度が下がっている。今後どうするかは悩み中

アレクサ

セールでやすかったから購入し、天気と時計代わりくらいでつかっていたが、ある日から子供が異常に興味を持ち始め、今ではエース級の活躍をしている。音楽かけても簡単な質問を聞くのでも、泣いているときに意識がそっちに向かったりするので、助かる。

www.amazon.co.jp

カフェオレ、シュークリーム、エクレア

朝仕事前に購入していたもの。さすがに、毎日食べていると好物でも飽きる、ということがわかった。

全身蕁麻疹

11月仕事が忙しすぎて、12月に気持ちが切れた瞬間に発症した。まさかストレス系で自分が体調を崩すと思っていなかったので、加齢は恐ろしいなと実感した。今もまだ少し痒くなることがあり、薬で治療中。

2020年の振り返り(仕事編)

転職(1月)

  • 2020/01/01に入社。同期入社のうち、エンジニアが全4名なので寂しい
  • 同期飲み会をやったが、特に仲良くならなかった。
    • 若い+営業系の人種と話すのが久しぶりすぎてノリについていけず、若干引いていたせい

組織内の空気が悪い?(3月)

  • 勘違いだった。議論と喧嘩の判断が難しくて最初数ヶ月は注視していた。炎上プロジェクトで白熱していただけだった模様。

Android/iOSエンジニアとして活動(1~8月)

  • 地味なバグ対応が中心。自分の役割がふわっとしていて、最初は細切れのタスクを消化しているだけだった
  • 組織課題が大量にある気がしたが、ぽっと出がいきなりイキっても反感買うだけだし本当の状況をわかっているわけではないので、ぐっと堪えた。
    • この判断は正しかったっぽい。状況を理解してきた今なら最初と別のアクションを考えそう
  • AndroidiOSそれぞれ実装するうちに、Flutterへの興味が湧いてくる

コロナでリモートワーク開始(4月~)

  • わかりやすくチームマネジメント不全になった。課題の解決どころかチーム課題の認知もされなくなり、チームの生産性瀑下がりしていたはず
  • 自分もちょっとだけメンタル不調を起こして怒りっぽくなっていた。家から出る機会がほとんど無いのが間接的な原因
    • 自覚してからは運動と週イチのテレビゲームをすることで改善されてきた

Add To App挑戦(6~8月)

  • コロナで困っている人のために、というモチベーションの機能が直前でリリーズストップがかかった
    • PM側の課題認識の問題なので、自分の反省点は無い
      • が、さすがに堪えた
    • 2OS実装後の手戻りだったので無感情になり、その後Flutter導入を意識し始める
  • Add To Appに挑戦した。参考情報が殆どない中で手探りで進めたので、良い経験になった
  • 案件の運営はカオスだったが、リリースに漕ぎ着けたので合格点

そしてFlutterエンジニアへ(9月~)

  • 新プロダクトFlutterリプレイスプロジェクトに異動した。手探りながら、地道に知識をつけられたと思う
  • 今自分がAndroidをKotlinで実装しようとしたときと同じくらいの工数感でFlutterを扱えるようになった
  • 見積もりの甘さやプロジェクトマネジメント失敗による炎上
    • 自分が関与できる範囲ではどうしようもなかったので、これもあまり反省点が思いつかない
    • 11月は人生でトップレベルの稼働時間になったが、12月は体調を崩し、わかりやすく燃え尽きで生産性が下がった
  • 作業に追われている時期が長くて、視野は狭まった。意識的にセルフマネジメントしていかないと
  • flutterはかなり手に馴染んだ

読書メモ プロに追いつくAndroid開発入門

booth.pm

技術的負債に向き合う

  • God ClassFatActivityDelegate
  • 実装の共通化
  • 実装の強制はabstractよりもinterface
  • 継承を使う場合はis-aを意識する

Androidアプリ開発におけるMVVMアーキテクチャ

  • Viewとロジックを明確に分離する手段としてアーキテクチャを使う
  • privateなmutavleLiveDataとpublicなLiveData
  • 今はAndroidXとDataBindingを利用したMVVMがおすすめ

ライフサイクル生存戦略

  • Jetpack Lifecycleを利用することで、Activity/Fragmentからライフサイクルステータスの変化に対応するための処理を分離できる
  • Lifecycleで実行できるのは、Activityで定義されているものだけ。onViewCreatedのようなFragment特有なものは用意されていない
  • Activityの再生成に対応する場合はonSavedInstanceStateを利用する。これはViewModelでも利用できる。

ライルサイクルをコントロールするLiveDataとViewModel

  • LiveDataはライフサイクル的にアプリがアクティブの場合のみpublishするデータホルダー
  • ViewModelはActivityのonCreateからfinishまで生存するオブジェクト。onSavedInstanceStateよりも柔軟かつ高速にデータの読み書きができるが、プロセスの終了には対応できないので使い分けが重要。
  • ViewModelStoreOwnerに親Activityを指定することで、異なる子Fragment同士でFragmentのライフサイクルを気にせずにデータの共有が可能
  • ViewModelはデータではなくデータソースを持つ。その際MediatorLiveData,Transformationsなどの便利クラスも活用すべし

コルーチンとアーキテクチャ

  • コルーチンスコープ単位でキャンセルや例外補足が可能
  • コルーチン内で発生したレスポンスはResult型で表現すると便利
  • asyncは返却する。launchは値を返却しない。joinでlaunchの終了を待てる
  • withContextでスレッド制御
  • applicationScopeでviewModelのライフサイクルから外れた制御もできる

ビルド速度を改善したいけど何をすればいいの

  • Build Analyzerで各工程ごとのビルド時間の計測が可能
  • Android Gragle pluginはビルド速度改善のアップデートが多いため、最新版の利用を推奨
  • Gradleデーモンに割り当てるメモリ
  • ビルドのオフラインモード

メモリリークの謎を追う

  • rxjavaの非同期通信でviewの参照を持ったときはdisposableのclear()を利用する。それか github.com を活用
  • LiveDataをViewから購読するようにすることで参照方向を逆転できる。
  • AlertDialogはactivityのcontextを利用すると画面回転などの対応ができないため、DialogFragmentのcontextを利用する
  • FragmentManagerが持つFragment参照とViewのライフサイクル。今まで意識してなかったのでbindingをlateinitで宣言してた。業務で色々改善できそう
  • Bitmapの直接の利用は極力避け、Glideなどのライブラリやurlなどの参照形式で代替できないか検討する
  • LeakCanaly,strict mode

感想

感覚的には、知っていることが5割、知識の整理につながったのが4割、完全新規で得られた情報が1割くらい。
ある程度知識がついてくると初級者向けの書籍などはコスパが悪くなってくるし、かと言って最新のドキュメントを追い続けるのも最近は時間的にしんどい。そういった意味でこの書籍は今のAndroid開発を俯瞰して確認できてありがたかった。
個人的に今後Androidの最新情報を得る手段としては、日々の業務での調査+信頼できる人たちが書いた技術書展系の書籍でdiffの取り込みを繰り返すのがちょうど良さそう。
技術同人誌にかけるお金を少し増やしていこうかなと思えた一冊だった。