msksgm’s blog

msksgm’s blog

Webエンジニアです。日々の勉強記録、技術書感想、美術観賞感想を投稿します。

「プログラミングの基礎」感想

概要

プログラミングの基礎」を読みました。 「前提(関数型プログラミングの経験、目的、読了時間)」「感想」「次に関数型プログラミング or ComputerScience で勉強すること」「まとめ」を記述します。

前提

関数型プログラミングの経験

関数型プログラミングの経験はほとんどなく、TypeScript や React の構文に関数型プログラミングの思想が入っていることを認識しているぐらいでした。 第一級関数、パターンマッチ、カリー化などの単語は一応しっていますが、適切な理解もなければ意識して使用したこともありませんでした。

目的

以下の効果を得られることを目的に読み始めました。

  • 関数型プログラミングを理解するきっかけにする
    • OCaml などの関数型(に特化した)言語を使うのは初めてだった
    • 関数型の書き方を学ぶ
  • 月に 1 回 ComputerScience の勉強をしたいので、今月の 1 冊にした

読了時間

GW 中に 7 日間ぐらいかけて、17 章までしっかり読み 18 章から 24 章は流し読みしました。 本書の最終目標である「メトロネットワーク最短経路問題」はちゃんと読むと時間がかかりそうだったので、途中から飛ばしています。 1 日にかけた時間は 2 時間から 3 時間ぐらいです。 「メトロネットワーク最短経路問題」もしっかりと読む場合は、より多くの時間が必要です。

OCaml の環境構築(Mac OS)には、以下の zenn の記事を参考にしました。

zenn.dev

本書にはサポートページが用意されているので、演習問題を解いた後やわからなかったときに使用しました。

pllab.is.ocha.ac.jp

感想

目的通り、「関数型プログラミングを理解するきっかけ」になりました。 プログラミング初学者向けにも記述してあるので、わかりやすい言葉で丁寧に解説してくれます。 なので、主に以下の点において知見を深めることができました。

特に再帰関数は書籍を読むまで、メリットを感じられず敬遠していました。 書き方を知らなかったので、無限ループに落ち入りがちだったのも理由です。 しかし、パターンマッチ、停止方法、部分問題、分割統治法、といった適切な記述方法を学び、再帰を使いこなせばより綺麗なプログラミングができると考えが変化しました。 普段意識せずに使用していた関数も関数型プログラミングの設計が含まれていたことに気がつき、今後は関数型プログラミング意識して実践したいという気持ちになれました。

他にも、個人的な問題ですが、自身のアルゴリズム周辺の知識が弱い意識を持っています。 それらを再帰関数で記述した際の実装方法は命令型の言語よりも簡潔になり、理解する一助になったと思いました。

「メトロネットワーク最短経路問題」はダイクストラ法を用いたメトロの最短経路を求める問題です。 本書で学んだ内容を実世界の問題に対して落とし込んだ内容です。 段階を踏みながら進行していくので、わからなくても解説を見れば納得しながら進めることができます。 ただ、徐々に問題の難易度が上がっていくので、時間がかかるようになります。 この本を長い期間をかけて完全に理解するのであれば、解くことを推奨します。 しかし、自分みたいに主目的が他の部分にあるのならば、ある程度飛ばしてもいいと思いました。

他に思ったことは、欠点というほどではないのですが、まったくの初学者がプログラミングを独学で学ぶ 1 冊目の本には向いていないと思いました。 大学の教科書にも使われる本なので、授業で ComputerScience よりのプログラミングやアルゴリズムを学ぶには非常に向いていると考えています。 あくまで、機械学習や Web プログラミングに興味がある初学者に薦める本ではないという意味です。 その場合、一旦それらに適したプログラミング言語を学んでから、「関数型プログラミングを基礎から学びたい」「プログラミング自体を学びたい」というニーズに応えられる本だと思いました。

次に関数型プログラミング or ComputerScience で勉強すること

関数型プログラミングを実践したり他の書籍も読みたいですが、他の ComputerScience の本も読む方を優先する予定です。

関数型プログラミングでやること

  • 実務のプログラミングで実践する
  • 他の関数型プログラミングの本にも挑戦してみる
    • 「Functional Programming in Kotlin」「Domain Modeling Made Functional」あたりが気になる

ComputerScience でやること

まとめ

「『実践ドメイン駆動設計』から学ぶ DDD の実装入門」感想

概要

「実践ドメイン駆動設計」から学ぶ DDD の実装入門」(以下、副読本)を読みました。 「前提(DDD の経験、目的、読了時間)」「感想」「次に DDD で勉強すること」「まとめ」を記述します。

前提

DDD の経験

ドメイン駆動設計(以下、DDD)関連の本は、この本を読んだ時点では、以下の書籍を読んでいました。 基本的なことは知っている状態で読んでいたつもりです。 元々、DDD を習得するために、「実践ドメイン駆動設計」(以下、IDDD 本)の勉強会を開催し、この本は副読本として使用しました。

IDDD 本の読書感想は以下にまとめています。

msksgm.hatenablog.com

目的

以下の効果を得られることを目的に読み始めました。 あくまで IDDD 本を副読書の立ち位置です。

  • IDDD 本の勉強会の副読本として使用する

読了時間

勉強会は 14 週間かけておこなっていました。 副読本は 1 章だいたい 2 時間ぐらいで読み込んでいたと考えています。 副読本を読むのに 28 時間ぐらいかけたことになりますが、IDDD 本も読むことを前提なので、人によって読了時間が異なります。

感想

実際に読んでみて、IDDD 本を読むための必須の本でした。 IDDD 本に興味がある全ての人に薦めています。

IDDD 本の内容的、日本語的にわかりづらい部分をわかりやすくまとめていました。言葉に起こすとわかりづらい部分も図や表で綺麗にまとめられているおかげで、勉強会中になんどもお世話になりました。 IDDD 本は 1 章ごとの内容が濃いので、IDDD 本を読む前後のどちらにも学びがある内容でした。 IDDD 本の不必要に思える内容についてバッサリ切り落としており、むやみに深堀して時間を浪費しないですみます。 また、参考文献に数多くの資料が載せられており、これらを探す時間を省けるのもメリットです。 逆にいえば、この本だけで DDD を学ぶにはチグハグになるので、この本のみで DDD を学ぶには不向きだと思いました。

気になった点は、IDDD 本の内容から省略されすぎている部分があることです。重要に思えて深堀したいことがなかったりするので、本に採用された基準が気になりました。他には、IDDD 本はサンプルコードが Java なのですが、副読本は C#Java の 2 つを用意していて、理由が気になりました。

次に DDD で勉強すること

IDDD 本の感想と同じですが、以下のことに取り組みます。

  • エヴァンス本を読む
  • DDD を実践する
  • DB に対する知見(設計、パフォーマンス、SQL)を得る
  • ドメインイベントについて学ぶ
  • DDD の知見をさらに深める

まとめ

  • IDDD 本の副読本としての使用を目的に読んだ
  • IDDD 本の内容が適切にまとめられており、IDDD 本を読むには必読だった

「Real-World Next.js」感想

概要

Real-World Next.js」を読みました。 「前提(React・Next.js の経験、読了時間)」「目的」「感想」「次に Next.js で勉強すること」「まとめ」を記述します。

前提

React・Next.js の経験

React の書籍では「りあクト!」を読んだ経験があります。 個人開発だけでなく業務でも使用した経験があり、React の基本的な構文は理解している状態でした。

最近は Next.js の公式チュートリアルを完了し、現在の業務で導入しようとしていました。 Next.js の理解度はあまり高くなく、「Next.js は React のシンタックスを使える何か」というぐらいの認識でした。 特に、SSR の仕組み、使い所を理解できておらず、特にテストとデータの取得周りの知識がない状態でした。

目的

以下の効果が得られることを目的に読み始めました。 総じて、「実務で使える知識がすぐに欲しかった」次第です。

  • Next.js の仕組み、書き方を理解する
  • Next.js のデータの取得方法、テストの記述方法を知る

読了時間

GW 中に 1 日 4 時間程度取り組み、3 日程度で読了しました。 ただし、主目的は「実務で使える知識をすぐに手に入れる」だったため、現在の実務では使わないであろう内容は読み飛ばしています。 具体的には、UI ライブラリ、GraphQL、デプロイ、GraphCMS、SEO の高め方、EC サイトの構築、といった内容を飛ばしました。

感想

具体的かつ丁寧な説明によって、Next.js に対して認識が曖昧で不安だった部分をある程度解消できました。 具体的には以下の部分で理解が深まりました。

  • SSRCSR、SSG の効果やユースケース
  • 外部 API に対してデータの取得方法
  • Next.js の Route API の使い方、ユースケース
  • Custom Server について
  • テスト(react-testing-library)の実装方法
  • 認証認可

これらの部分は、公式チュートリアルでも説明があったり、説明に参考リンクがあったりした部分なので、人によっては当たり前に感じる可能性があります。 ただ公式チュートリアルの解説は簡潔すぎる部分が個人的に多いと感じたので、より具体的にステップを踏みながら学びたいときにおすすめできる内容だと思いました。 特に「Real-World Next.js」ではチャプターのトピックごとにサンプルコードが GitHub に上がっているため、わからない部分を明確化できます。 そして、この書籍を読んだ後にチュートリアルを再び読んでみたら、既に説明してあったり納得感がある説明だったりしたことに気がつきました。

自分が学びたかった基礎的な部分だけでなく、GraphQL、デプロイ、EC サイトの構築といった、実践的な部分にも触れられます。 自分は読み飛ばしたため、具体的に良いかどうかはわかりませんが、しっかり読んでみても得られるものが多いと思っています。

この本を読む上で、必要となる前提知識は React の構文を知っていること、Next.js の公式チュートリアルを終えていることだと思いました。 その 2 つを完了していれば難なく読むことができます。

次に Next.js で勉強すること

以下のことに取り組む予定です。

  • 実務で適用する
    • 雰囲気で実装していた部分を理解できたので、実務で適用してきます
    • 特にデータの取得と、テストについて取り組んでいきます
  • RealWorld を実装する
    • ややこしいですが、RealWorldというプロジェクトがあります
    • 仕様が定義されているので、それに沿った実装をしていく内容です
    • TypeScript、Next.js はなさそうなので、時間があれば実装していきたいと考えています

まとめ

  • Next.js の基本的な知識をすぐに得るために、「Real-World Next.js」を読んだ
  • 基本的な記述方法、概念について述べられていて目的と合っていた
  • すぐに実践に活かせそうなので、取り組んでいく

2022年5月の目標

概要

5 月の目標です。

生活習慣

ジム通います。ベンチプレス 80kg は継続です。 スクワット、デッドリフトは大きな怪我をしかねない重さになってきたので慎重に続けていきます。

勉強関連

以下を勉強していきます。

  • プログラミング言語
    • Go
      • 特になし
      • 「実用 Go 言語」「RealWorld HTTP 第 2 版」「Go ならわかるシステムプログラミング」あたりをやるかも
    • Kotlin
      • 「Kotlin サーバーサイドプログラミング実践開発」
  • 注力分野
    • ドメイン駆動設計
      • 「Design It!」
      • 「Web API The Good Parts」
      • 業務で実践
    • セキュリティ
      • 「認証と認可 Keycloak 入門」勉強会
      • 「情報セキュリティマネジメント試験」の試験勉強
    • DB
      • 今月は注力しない予定
  • Computer Science
    • 「プログラミングの基礎」

読書

  • 「なぜあなたの仕事は終わらないのか」
  • 「Design It!」
  • 「Web API The Good Parts」
  • 「Kotlin サーバーサイドプログラミング実践開発」
  • 「プログラミングの基礎」
  • 他に 1 冊

美術展

技術記事の作成

毎週 1 記事(金曜日がある週を 1 週とカウント)投稿。 今月は 4 記事目標。

2022年4月の振り返り

概要

2022 年 4 月の振り返りです。

以下を目標に掲げていました。

msksgm.hatenablog.com

目次

生活習慣

以下の目標を掲げていました。なんとか達成した次第です。 ランニングは業務が忙しくてできていませんでした。 来月から、時間を見つけて取り組んでいきます。

ジム通います。ベンチプレス 80kg は背伸びした目標ですが達成したいです。

勉強関連

勉強関連 概要

プログラミング言語(Go)

引き続き「Learning Go」と「ドメイン駆動設計入門」をもとに勉強を続けていました。

「Learning Go」は 4 月開始時点で残り 3 章ほどになっており、3 週目には読み切ることができました。 途中からダラダラしながら進めてしまいましたが、英語の書籍を曲がりなりにも読み切ったのは少し自身につながりました。 「Learning Go」は、Go の根本的な仕組みと歴史的経緯と哲学について学ぶことができるので、Go を使用している方には積極的におすすめしています。

ドメイン駆動設計入門」をもとに、DDD の戦術的パターンを実装し、zenn に 4 記事作成しました。 一通り実装したので、「ドメイン駆動設計入門」の実装はこれで終わりです。 ドメイン駆動設計の戦術的実装パターン理解を深めること、Go の実装方法を学ぶことの 2 つを達成できました。

実はあまり Go が好きではなくなってしまっています。 しかし、現状はモダンな言語にある過去の言語の課題を解決しようとして加えられた変更点に対して違和感をいだいているだけだとも感じてきました。 「達人プログラマー」に書いてある"毎年 1 つ新しい言語を学ぶ"はステップアップだけでなく"様々な言語に触れることで、自分の求めるものがわかってくる"という意味で理解してきました。

来月からは、Kotlin に注力していきたいです。

注力分野

ドメイン駆動設計

「実践ドメイン駆動設計」の勉強会の第 11 回から第 14 回をやりました。 内容は「ファクトリ」「リポジトリ」「境界づけられたコンテキストの統合」「アプリケーション」でした。 途中から DDD の本質を理解してきたので、説明される内容も目新しいものがなく、飽きてきた印象でした。 しかし、これにて「実践ドメイン駆動設計」を完読しました。非常に重厚な本でしたが、熟読する価値のある本だと思いました。 期間は 14 週間で、毎週予習と勉強会に 10 時間はかけていたので、「実践ドメイン駆動設計」だけでも 140 時間かけたことになります。 「ドメイン駆動設計モデリング/実装ガイド」から数えると、17 週間をかけています。 加えて、「ドメイン駆動設計入門」の実装も継続していました(こちらもちょうど 4 月で完了)。 「実践ドメイン駆動設計」「ドメイン駆動設計モデリング/実装ガイド」「ドメイン駆動設計入門」の勉強時間は 200 時間超やっていたと考えています。 4 ヶ月におよぶ勉強期間のおかげで、ドメイン駆動設計の概念を体に染み込ませることができました。 ドメイン駆動設計のインプットは一旦終了です。 実務でドメインモデリングを実践しているのですが、やはり、開発者と企画側で認識の齟齬を埋めることの難しさを感じています。 DDD は戦術的と戦略的は両方とも銀の弾丸のようなメソッドがあるわけではないので、試行錯誤を重ねていきます。

まだ取り組めていませんが、今回の経験から以下の 3 つ記事を執筆しようと考えています。

  • 「『実践ドメイン駆動設計』から学ぶ DDD の実装入門」の感想記事
  • 「『ドメイン駆動設計入門』を『実践ドメイン駆動設計』の副読本に使ってみた & Go にリプレイスしてみた感想」という記事
  • IDDD 本勉強会の感想記事

セキュリティ

Auth 屋の以下の本を読みました。 以前、OAuth と OIDC は学習したことがあったのでなんとかスムーズに理解できました。 フローが似たようなものなので整理しづらかったのですが、前より理解できた気がします。 あと何回か繰り返し実践したいです。

  • 「雰囲気で OAuth2.0 を使っているエンジニアが OAuth2.0 を整理して、手を動かしながら学べる本」
  • 「OAuth、OAuth 認証、OpenID Connect の違いを整理して理解できる本」を読みました。
  • 「OAuth・OIDC への攻撃と対策を整理して理解できる本(リダイレクトへの攻撃編)」

そして、「SAML 入門」も読みました。 知識ゼロの状態だったので不安だったのですが、取っ付きやすかったです。 ただ、アプリ上で具体的なフローを確認する機会はなかったので、定着できていません。リファレンスとして使うようします。

来月から「認証と認可 Keycloak 入門」の勉強会を開始します。 第 6 章までの予定です。 既に第 1 章と第 2 章を読みました。過去に Auth 屋の書籍を読んでいたおかげでスムーズに読むことができています。 改めて、OAuth と OIDC の復習になっていて学びがあります。 Keycloak 専用の単語が存在することは読み手を選ぶポイントだと思いました。

DB

今月は注力しない予定だったので特になし。

Computer Science

今月は注力しない予定だったので特になし。

読書

勉強会が終わりを迎えたので、合計 6 冊読んでいました。 感想文をかけていない本もあるので、本当はもっとあります。 書けていない分は 5 月に書こうと考えています。

目標時点では「あなたの知らないあなたの強み」も読もうとしていました。 実際読んでみて、最初の 100 ページぐらいで自分に合わなさそうだと考え、読むのをやめました。

1 冊目 「雰囲気で OAuth2.0 を使っているエンジニアが OAuth2.0 を整理して、手を動かしながら学べる本」

msksgm.hatenablog.com

2 冊目 「OAuth、OAuth 認証、OpenID Connect の違いを整理して理解できる本」

msksgm.hatenablog.com

3 冊目 「OAuth・OIDC への攻撃と対策を整理して理解できる本(リダイレクトへの攻撃編)」

msksgm.hatenablog.com

4 冊目 「Learning Go」

msksgm.hatenablog.com

5 冊目 「SAML 入門」

msksgm.hatenablog.com

6 冊目 「実践ドメイン駆動設計」

msksgm.hatenablog.com

美術展

今月は 1 回行きました。 元々はミロ展にいくつもりでしたが、日程が合わず「シダネルとマルタン展」にいってきました。

「シダネルとマルタン展」

msksgm.hatenablog.com

技術記事の作成

週 1 回の投稿(金曜日がある週を 1 週としてカウント)の目標を達成しました。 5 記事作成しました。2022 年になってから合計 17 記事書きました。

1 記事目 「gh コマンドでブラウザを開けなくなったときの対処法」

zenn.dev

2 記事目 「Go でリポジトリを実装(「入門ドメイン駆動設計」Chapter5)」

zenn.dev

3 記事目 「Go でファクトリを実装(「入門ドメイン駆動設計」Chapter9)」

zenn.dev

4 記事目 「Go でアプリケーションサービスを実装(「入門ドメイン駆動設計」Chapter6)」

zenn.dev

5 記事目 「Go で集約を実装(「ドメイン駆動設計入門」Chapter12)」

zenn.dev

その他

読書感想、美術感想、技術記事以外にも不定期に思ったことを書こうと考えています。 今月は以下でした。

Auth 屋さんの書籍を全て読んだ感想

msksgm.hatenablog.com

まとめ

今月の一番のイベントは「実践ドメイン駆動設計」を完読し、勉強会も完遂できたことです。 いままで、このレベルの分厚さと難解さの本を読み切ったことはなかったので自身につながりました。 ドメイン駆動設計でやりたいことを戦術的にも、戦略的にも体に染み込ませることができ、引き出しが増えたと実感しています。 実践で活かせてこその、ドメイン駆動設計だと考えているので、実務で戦略的なところから取り組み、ドメイン駆動設計についてより洞察を深めたいと考えています。

Go もとりあえず一区切りだと考えています。 細々と RealWorld の実装をしたり、渋川よしきさんの書籍を読んだりする可能性はありますが、前ほどの熱意はなくなっています。 この数ヶ月間の学習で「モダンで流行りの言語」という印象から、「どのような哲学で何を解決したい言語」なのか理解できたと考えています。 個人的には、「モダンで銀の弾丸な言語」から「繰り返し同じようなこと記述する煩雑な言語」にかわり、最終的に「他の言語が持つ課題を違う角度から解決しようとしている言語」になっています。 途中の悪い印象から、割と良い印象になりましたが、自身が「DDD をやりたい」という目標から「オブジェクト指向のような表現力を持つ言語を使用したい」という気持ちが生まれています。 なので、目的に沿っていない状態です。 結果、Go に対して興味が薄れている状態です。 しかし、以下のような続ける理由もたくさんあるので細々と続けていきます。

  • Go を用いた Computer Science よりの書籍が複数存在するので勉強用言語として使う
  • 書籍「実用 Go 言語」が面白そう
  • CLI ツールを作りたい
  • (一応)業務では引き続き使用する
  • Go の実力が低い
  • 自身が認識していないだけで DDD に沿った記述方法が存在する
  • 流行りの言語なので転職時の武器になりそう

言語に関しては来月から Kotlin に注力して知見を深めていきます。

セキュリティは認証認可に注力できました。 Auth 屋さんの書籍はどれも良書で、初心者におすすめします。 来月は「認証と認可 Keycloak 入門」を用いて認証認可の理解の仕上げにかかりたいです。 6 月には「情報セキュリティマネジメント試験」を受験する予定なので、5 月は情報セキュリティマネジメント試験の勉強も再開します。 加えて、最近「徳丸実務知識試験」の一般受験が公開されたので、そちらにも興味があるので再来月ぐらいから取り組んでいきます。

DB と Computer Science は元々注力しない予定だったので放置しています。 DB は取り組むとしても、10 月以降になりそうです。 Computer Science は簡単なものを月 1 ぐらいで勉強できたらと考えています。

今月でついに社会人 2 年目になりました。 3 月から大きく変わったことはないですが、2022 卒が同じ部署に配属されたら、ようやく 2 年目の立場を求めらそうです。 色々試したいことがあって、今月の残業時間は 45 時間ぐらいになりました。 やりたいことで残業していると普段よりは気持ちが救われますが、残業のしすぎ精神と体力的の両方によくない感じました。 試したいことを効率的にできるようになりたいです。

色々書きましたが、残業時間が多いながら今月も目標を達成できました。 欲を言えば普段の勉強を業務にも活かしていきたいです。 来月も引き続き頑張っていきます。