B-Teck!

お仕事からゲームまで幅広く

【振り返り】2021年振り返り

昨年の振り返り

【雑記】2020年振り返り - B-Teck!

2021年お疲れさまでした。

転職

今年最も大きなイベントは転職でした。
なんとなく登録して眺めていたLAPRASのスカウトメールから応募した企業にトントン拍子で決まり、自分がどこまで通用するのか不安に思いながら入社してからすでに半年が経っています。

技術的にははじめてなことも多く、正直今でも通用している自信は無いんですが、これまで様々な組織で学んできたこととか、やってよかったこととか、そういう部分をうまく使いながら、少しずつきちんと組織の一員になっていけたらなぁと思ってます。
触ったことの無い技術に触れられていること、設計を強く意識しているチームの中で働けていることで、これまでの自分の至らなさを実感しながらも、自分のレベルを一気に引き上げている感覚もあり、若干の大変さと多くの楽しさを感じる毎日です。

俗な話でいうと、給与が上がったので、社会人になって以来はじめて経済的な不安を持たずに生活ができています。
これまでずっとあと何ヶ月生きられるかを指折り数えながらやりくりしていたんですが、その部分の負担が消えたことは純粋にありがたい。

ほぼ完全にリモートで回る状態になっており、これまで1回しか出勤したことないんですが、今後どうなるかはちょっとドキドキですね。

新しいことを学び続けた一年

転職後もそうなんですが、前職でも、今年入ってからは知らないことをひたすら勉強して使い物になるようにしていました。

  • 1~3月
    • Go
  • 4~6月
    • Python
  • 7~12月
    • Scala
    • TypeScript
      • AngularJS
      • Angular
    • DDD

こんなに短期間で違うパラダイムの言語を勉強して仕事で使うなんてことはこれまでなかったので、なかなか激しい一年だったなぁと思います。
業務で扱っているシステムの規模が大きく、大きなワークフローを扱うものでもあるため、全容を理解するのが大変だったのもあって、まだまだ完全に理解するには先が長いなぁと感じてしまったり。
とはいえ、わかる範囲が増えてきたし、わからないことは調べてドキュメント化したりもしているので、きっとなんとかなるはず。

習慣化の定着

様々な習慣化の取り組みを2020年からやっていましたが、全体的にうまく定着してきたなと思います。
今年は更に毎日Githubの草を生やす活動をはじめていて、常に少しでも何かを学んでいくスタイルを確立できたように思います。
一方で、若干形骸化したり、当初の目的を見失ったりしている習慣も出てきました。
定期的なチェックと見直しの機構をうまく組み込みたいなぁ。

月次振り返りをはじめてみた

以前からいわしまんさんがやられているじぶん Release Note(これってどこかに元ネタあったりするんですかね?)を眺めながら、自分もある程度この月で何をやってたのか、何を感じていたのか残しておくといいのかもなぁと思ってゆるく始めてみました。
【雑記】じぶん Release Notes (ver 0.2021.05)的なテスト - Rのつく財団入り口

今できているのがその月に勉強した内容とか、読んだ本とか、娯楽をちょろっと書いて、ただ所感を並べるだけなので、ブログに書くことかといえば微妙なんですが、まぁ個人ブログなのでいいかという気持ち。
模索しながらいい感じのスタイルに落ち着けていきたいですね

ブログのPV

昨年の大きな下落から若干の回復傾向が見られました。
といっても水準的には引き続き2016年頃の年間PV数と同等なので、まだまだ頑張らねばなぁといった感じです。
ただ、累計PV数が70万まで来たのは単純に嬉しいですね。今後も地道にやっていければなぁと思います。

f:id:beatdjam:20211226141735j:plain

おわりに

今年は少し早めの振り返りでした。
コロナウイルスで出かけられない〜なんて言っていた去年でしたが、今年は割とその生活に順応してしまいました。
市中感染が落ち着いて、社会が以前の形になったらどうしようと若干戦々恐々としています。
なにはともあれ、このブログが続けていけているのも読んでくれる皆さんや、良くしてくれる周りの方のおかげです。
来年もまたよろしくお願いいたします。

【本】ドメイン駆動設計入門を読んだ

よんだ

読書メモ

  • chapter1
    • ドメインとは
      • プログラムを適用する対象となる領域
      • ドメインの概念を抽象化したものがドメインモデル
      • ドメインモデルをコードで表現したものがドメインオブジェクト
  • chapter2
    • 値とは?
      • 不変
      • 可換
      • 等価性
    • システム上必要な値はプリミティブなものではない可能性がある
      • 値をオブジェクトの形で表現したのが値オブジェクト
    • 値オブジェクトとして切り出す基準
      • 値としてのルールが存在するか
      • 単体で取り扱いたい概念か
        • 値として表現する価値のある概念か
    • バラバラの引数などではなく値オブジェクトとしてまとめるモチベーション
      • コード上での表現力を増す
      • 不正な値を存在させない
      • 誤った代入を防ぐ
      • ロジックの散逸を防ぐ
  • chapter3
    • エンティティとは?
      • 可変
      • 属性ではなく識別子などの同一性によって区別される
    • エンティティとして切り出す基準
      • システムの中にライフサイクルがある概念など(ユーザーとか)
  • chapter4
    • ドメインオブジェクトに振る舞いとして持たせると不自然なものを置くのがドメインサービス
    • ドメインサービスを使うのは最小限にするべき
      • オブジェクト自身の振る舞いがなくなってしまい、コード上の表現力が下がる
  • chapter5
    • リポジトリの責務
      • ドメインオブジェクトの永続化や再構築
    • リポジトリはinterfaceと実装で分ける
      • 利用側は具体の技術に依存せずに利用できる
      • ユニットテストしやすくなる
    • 重複確認などをリポジトリに持たせるのは注意
      • ドメインのルールの流出とも取れる
      • 識別子を渡して返却値をドメインサービスで検証するなど
  • chapter6
    • アプリケーションサービスとは
      • ユースケースを表現するためのオブジェクト
      • ドメインオブジェクトを組み合わせてユーザー機能を実現する
    • アプリケーションサービスにドメインオブジェクトを公開するか?
      • 公開する場合、ドメインの振る舞いを意図しないタイミングで利用される可能性がある
      • DTOなどに詰め替えるほうが唖然
    • 複雑な入力はCommandオブジェクトに切り出すなどする
      • 入力に変化があってもシグネチャが変わらないため、入力と操作のみの修正で良くなる
    • 凝集度を高めるためユースケース別にクラスを分ける場合もある
    • アプリケーションサービスは振る舞いを変えるような常態をもってはいけない
  • chapter7
    • 依存元・依存先が抽象を介して依存していることを依存性逆転の法則と呼ぶ
    • 抽象への依存を利用して実体を切り替える手法にService LocatorとDependency Injectionがある
  • chapter8
    • ドメインオブジェクトの生成はドメインの知識である
      • 複雑な生成はFactoryを作って切り出すとわかりやすくなる
  • chapter10
    • 連続する複数の処理はトランザクションで守られるべき
    • データベースの制約でも守れるが、基本はアプリケーションでも制約をかける
  • chapter12
    • 集約とは?
      • 不変条件を維持する単位
      • 境界とルートを持つ
        • 境界: 集約に含まれる範囲を定義する境界
        • ルート: 集約に含まれる特定のオブジェクト
    • 集約への操作はルートを経由し、内部のオブジェクトを直接操作しない
      • ルートが境界内のルールに責任を持つことをデメテルの法則っていうらしい
    • 集約の内部に実体を持たせず識別子のみをもたせる場合もある
      • ユーザー自体じゃなくてユーザーIDだけとか
  • chapter13
    • 仕様オブジェクトとは?
      • あるオブジェクトが仕様を満たしているかを判定するためのオブジェクト
      • 複数の集約をまたいだ制約などを判定させたいときに使う
      • アプリケーションサービスにドメインを流出させず、仕様としてまとめて管理できる
    • CQRS
      • コマンド: 書き込み
      • クエリ: 読み取り
      • 読み書きを分離することで複雑さを減らせる
    • QueryService
      • 集約をまたいだ複雑な検索や取得を、まとめる
  • chapter14
    • アーキテクチャは開発者に対するガードレールである
    • レイヤードアーキテクチャ
      • UI/アプリケーション/ドメイン/インフラで層を分ける
      • 各層の知識を他の層に持ち出さない
    • ヘキサゴナルアーキテクチャ
      • アプリケーションのコアに対してUIや保存媒体を差し替えられる
    • クリーンアーキテクチャ
      • 目的はヘキサゴナルアーキテクチャと同じ
      • Controllerからの呼び出し、処理、出力のそれぞれが抽象に依存している
        • 依存の方向が一方になるよう厳密に定義されている
  • chapter15
    • 実装パターンをなぞるだけでは軽量DDD
    • パターンが主眼ではなく、ドメインを表現するためのもの
    • ドメイン理解の手法
      • ドメインエキスパートとのモデリング
        • 開発者・ドメインエキスパート双方の理解を深めながらドメインモデリングを行う
      • ユビキタス言語
        • ドメインを表現するための言葉を定義する
        • コード上もユビキタス言語で表現されていると良い
      • 境界づけられたコンテキスト
        • 同じ言葉で表現されていても異なるコンテキストの場合がある
        • モデルに対する捉え方が変わる場所が境界
      • コンテキストマップ
        • 境界内のみに集中すると複数のコンテキストの関連を見失ってしまう
        • 各コンテキストのつながりを俯瞰できるようにしておく

感想

発売日に買ったものの複数回挫折していて、ようやく読み終われた。
いくつか気になる記述があったものの、DDDをコード上でどう表現するか概観するには良い本だった。

表紙に謳われているようにコードの表現からDDDの概念を説明する構成で、モデリングなどには踏み込んでいない。
これは良し悪しありそうで、設計パターンとして取り込む軽量DDDに流れてしまう危険性もあるかもしれない。できれば個別の概念を説明する軽めの本を別途読んでおくと良さそう。

ドメイン駆動設計入門というよりドメイン駆動設計実装入門みたいな雰囲気はある。

C#のサンプルコードをベースにScalaで写経しながら読み進めてたんたけど、Commandオブジェクトをどういう感じで表現するとしっくりくるのか全然わからない…
良いサンプルとかあれば教えて下さい

【振り返り】2021年11月

前月の振り返り
【振り返り】2021年10月 - B-Teck!

学習

今月やったこと

所感

11月は様々な事情が重なり、めちゃくちゃバタバタしていて正直あまり記憶が無いような気がする。
月末にかかる辺りで一通りのカタがついてきてやっと思考の余力が生まれてきたという感じ。
勉強・プライベート合わせて全体的に個人の活動は控えめになってしまった。

学習面では新たななにかに手を出すことができなかったものの、先月から手をつけていたAngular講座を終わらせることができた。
ざっくりと仕組みはわかったので、なにか習作を作って振り返りをやりたいと思ったり。
ScalaもAngularJSもTSもAngularも、仕事で触る範囲だと理解が追いつかなかった気はするので、総じてプライベートの時間を投下してよかった。
改めて全部はじめての仕事は初動が大変だなと感じた。

ここからはプライベートの話。
先月に引き続きApexにどっぷり。なので本当は買うつもりなかったんだけどつい真・女神転生Vを買ってしまった。
過去作に比べてだいぶ遊びやすくなっていて、シナリオもわかりやすくいいんだけど、肝心の東京が滅びすぎていて、もっと面影を残していてほしかったのが正直なところ。
真3や真4はその辺り結構満足感高かったので悲しい。品川埠頭辺りで止まってるので、いい加減続きをやらないと。
あと、ずっと積んでたアンチャーテッドコレクションを徐々に崩し始めた。ストーリーは面白いものの、ゲームとしては別になぁ…といった思いがある。当時遊んだら衝撃だったのかな。

10月は世界史・美術史 あたりが主だったので、なんとなく幕末史の本に手を出してみた。
このまま何冊か幕末・維新関連の本を読んだり日本史の本を読んだりしていきそう。
余力がなかったのもあり、趣味の本以外にはなかなか手が伸びなかったなぁ。