6月の活動まとめと7月の目標

勉強,振り返りと目標

要約

今月やったこと

  • DDDとClean Architectureの勉強をした
  • 『オブジェクト指向でなぜ作るのか』を読んでいる
  • Nuxt.js + socket.ioで案件納品
  • 引き続きPM/ITコンサル業務も
  • AWS基礎勉強し直し

次月目標

  • Clean Architectureのサンプルリポジトリを完成させる
  • FlutterかGoのどちらかに触れる
  • Nuxt.js + socket.ioを使って簡単なアプリケーションのリポジトリを作る
  • 『オブジェクト指向でなぜ作るのか』読了する
  • 何社か面談を受ける

設計・ソフトウェアアーキテクチャ・思想関連

学ぶ理由

DDDとClean Architectureのことを学んでいる。読むべき資料が多く、どちらもまだ原著に当たれていない。

なぜこの領域を勉強していたかというと、今まで最上流から最下流まで携わってきた経験上、要件定義~設計のプロセスが最も苦しく、使える武器を増やしていかなければならないと焦りを感じているため。

MVC(正確にはMVC2)を採用したプロジェクトからエンジニア人生が始まり、Fat Controllerがダメなら全てモデルに入れてしまおう!という思想でしばらくコードを書いていた。当時は多数のテーブルをjoinするデータ取得処理と、それを操作する処理がごちゃ混ぜになったトランザクションスクリプトをモデルと呼ぶのだと思っていた。その後railsやその他Active RecordライクなORMを利用したFWに個人開発で触れていく中で、多くの人がFat Controllerを作り出してしまう理由が理解できた。せめてデータの取得とロジック部分は分けよう、とMVCS(ServiceのS)的なアプローチで設計をしたこともある。プロジェクトが進行していくにつれて、「オレオレではなくもう少し有名なアーキテクチャを採用すれば良かった」と深く悩むようになった。その当時は全てをゼロにしてやり直したい気持ちでいっぱいだったが、今思うとさほどアーキテクチャ自体に問題はなかったのかもしれない。少なくともチームの規模や習熟度、ビジネスとしての発展性を考えれば完全な失敗という訳ではなかった。その辺りの話が『さよならアーキテクチャ議論』という記事とその周辺で話題になっていて、わかりみが深いなあと感じた。

DDD (Domain Driven Design)

DDDではDomain Driven Design(ドメイン駆動設計) Quickly 日本語版をまず読み、具体的な方法論等は松岡さん@little_hand_sの記事や書籍から学んでいる。

現状では、現実的に実践する機会が少なそうという印象がある。どうもコアとなる部分はドメインモデリングなのではないかと考えていて、一人で無理やり理解を進めてしまうと変な知識が身についてしまいそうで怖い。身近にドメインエキスパートがいて、エンジニアメンバーもDDDに興味を持ってくれている状況が必要。ドメインモデリングをする時間をとり、ユビキタス言語をチームとして作り上げていこうという意識が高いチーム、かつ大きなプロジェクトにジョインできれば是非試してみたい。現状私が受けている案件だと、スポットかつ単独開発の案件がおおく、中々そのような機会がないのが歯痒い。Scrum + DDDでうまくビジネスサイドと一丸になって開発しているチームがあるとすれば、ヨダレを垂らして参与観察したい。DDDでいう「ドメインモデルとソフトウェア設計の乖離」が少ない開発には、どんな時にどうメリットがあるのか、是非肌で感じてみたい。

Clean Architecture

Clean Architectureについてはまず例の概念図を理解するところから始め、Qiitaやその他リポジトリで実装方法を学んでいる。特にLaravelとClean Architectureの共存方法を考えるに当たって、成瀬さん@nrslib岡田さん@okashoiの記事やスライド、リポジトリが参考になった。成瀬さんのリポジトリ / 岡田さんのリポジトリ

こちらも大きな括りではアーキテクチャの話であり設計の話となるのだが、DDDとは違って私一人でも実践をすることが可能そうに感じた。そのため、今は休日に一人でサンプルリポジトリの作成を進めている。Laravel + Clean Architectureという観点で開発している。しかしそもそもFWに依存しないアーキテクチャであるならばLaravelさえいらないのでは、さらに言えば型に緩いPHPでない方が合っているのでは、と思いはじめてはいるが、しかし今の私の理解が合っているのかを確認するためにとりあえずこのまま粛々と進める。完成次第知人にでもレビューしてもらいたいなと考えている。

オブジェクト指向でなぜつくるのか

DDDやClean Architectureを学んでいくに当たって、凝集度・結合度について考える機会が頻繁にあった。経験から手癖でまとめようとしてしまうが、それが世間的には間違った考え方なのかもしれないという不安が拭えない。では改めて、オブジェクト指向で作る意味という部分からきちんと向き合い直そうと考えた。そういったことで、下記の本を再読しはじめた。今ちょうど半分くらいまで読み進めている。

2年目だか3年目だかの時期に先輩に勧められて読んだ記憶があるが、当時は経験が浅かった上に激務だったのもありしっかりと向き合えてはいなかったと思う。今改めて読むと「後輩に教える時に例え話を多用しすぎたなあ、分かりづらく説明しちゃったかなあ」と反省の念が生まれるとともに、歴史的にオブジェクト指向が発生/流行した理由を再確認できている。もう少し読み進めれば凝集度や結合度の話が出てくると思うので、読み進めるのが非常に楽しみ。

Nuxt.js(Vue.js) フロント周り

Vue.js自体は過去に案件で触れていた。その際はモノリシックなフルスタックフレームワーク(Laravel)のView部分、さらにその一部でVue.jsを利用する形だった。個人的な勉強や開発でも度々触れてはいたが、ガッツリとは触れてこなかった。

この6月はその苦手感を少しでも克服するため、少し背伸びしてVue.jsの簡単な案件を受けた。要件定義を進めていくにつれ、Vue.js単体ではなくNuxt.jsを利用することとした。その理由は、今後SSRが必要そうな要件であること、双方向通信が必要なためnode.js(Express + socket.io)を動かす環境が欲しかったことから。結果的には(まだ微妙に保守作業はあるが)一ヶ月での納品までいけたのでよい経験となった。

Vue.jsに関しては、公式ドキュメントや先輩諸氏の記事をつまみ食いしながら都度都度学んできた。しかし今回はお仕事としての案件ということで、しっかりと書籍『これからはじめるVue.js実践入門』を購入して学んでから臨んだ。

各言語やFWの入門書籍を書かれている山田祥寛先生の本ということで、安心して購入できた。丁度先月フロントエンド熱が上がっており、改めてES6のキャッチアップを目的として同先生の『JavaScript本格入門』を通勤中に読んでいたので先生にはお世話になりっぱなしの印象。

フロントエンドをガッツリやっている方は、HTML5,CSS,JS(ES6~),React.js,Vue.jsの知識に加え、コンポーネント分割の方法論(アトミックデザイン等)やCSSの設計規則(BEM等)にも詳しい。さらに言えばデザインやUI理論に踏み込んでいる方もいらっしゃる。私はバックエンドエンジニアなので門外漢だと自認しているが、モックやプロトタイプを作る際に困らない程度にはフロントエンドも扱えるようになっていたい。今後もフロントエンドの案件を積極的に探してお手伝いさせてもらいたい。

今回せっかくNuxt.js + socket.ioで一つのアプリケーションを作れたので、簡単なチャットでも実装したリポジトリをサンプルとして作っておきたい。記憶が新しいうちにコード資産を増やしたい。

AWS基礎勉強し直し

今月は当ブログも立ち上げた。せっかくなので勉強したことの記録を残しておきたいのと、「AWSで簡単な環境くらいは作れるよな?」という自分自身への不安を解消したかった。

今みると、ロードバランサについての記述でちょくちょくELBと呼んでいるあたりがキャッチアップの遅れを示しているような気がする。今はALBというものになっているらしい。

その他興味が出てきたこと

アプリ開発

アプリを作ってみたくなってきた。言語はSwiftでもJavaでもkotlinでも良いが、今はFlutterに興味を持っている。なぜこんなことを思いはじめたのかと振り返ってみると、昨今の自粛ムードの中スマホを触る機会が増えてきたことから「アプリっていいよな」というエモい気持ちが溢れてきているのかもしれない。それに具体的な収入という意味での生活のためにもなるし、こんなの作れますよーというポートフォリオ的な意味での生活のためにもなる。Flutterはプロダクションで使えるほどいい感じだという噂も聞いているので、ではそれに触れようかなというところ。

Go

昔の同僚からISUCONに誘われ、言語を聞いたところGoだと言うので学ばなければならない。とりあえずA Tour of Goをやれば大体わかるからやれ、と言われたので、Flutterとどちらかは7月中に触れるようにしておきたい。

ISUCONに出るかは置いておいて、昨今ではGoを使ってClean Architectureで実装している、というイケてる会社も多いので何にせよ私がGoを学ぶ理由は十分にありそう。GCPのサービス(Cloud Functions等)でも当然Goで書けるはずなので、ソフトウェアでなくインフラやネットワークとしてのアーキテクチャを学ぶ際にも役に立ちそう。

全体的な感想と人生の振り返り

6月はNuxt.jsの案件を受けてため、手を動かして勉強することがあまりできなかった印象。7月の常駐は週1になるので、たくさん手を動かすことを目標としたい。

8月以降の仕事を探し始めたい。現在の案件はある程度期間はこちらでコントロールできる。丁度7月いっぱいで一旦区切れそうなので、いくつか面談を受けるようにする。正社員/フリー問わず、面白くていい人達と働いて生きたいというのが今の気持ち。一緒に働く人がよければ業界も業務内容も給与もどうでもよいというのが正直なところ。とはいえある程度は絞らないとキリがないため、もともと興味がある教育系の業界か、もしくは業務内容的に自分の経験で役に立てそうなところ、全くやったことのない領域に触れるところを基準に選ぶこととする。

今後の人生としては、そろそろ労働集約でなく、現金以外でもよいので何かしらの利益をうむ自分のサービスを持ちたい。それがスマホアプリで広告収入なのか、ブログで自身のブランディングなのかは置いておいて、少なくとも何か考えて動かなければ。

ちなみに技術書は普段紙で読んでいたが、カバンに入れると重いのでkindleを買った。現状でも積読が何冊かあるので7月の移動時間はそれを消化したい。ちなみに欲しい本は増え続けている。今狙ってるのはコレ。

勉強,振り返りと目標

Posted by shoopon