Java言語で学ぶデザインパターン入門 読了

概要

Java言語で学ぶデザインパターン入門』を読み終えました。

モチベーション

主にこれを読もうと思ったのは、最近仕事中にやたらとアーキテクチャ系の疑問が出てきたり、議論しつつ決着がつかないということが多く、 自分の設計への理解不足を痛感したからです。(エンジニアリングむずすぎる)

デザインパターン銀の弾丸だと思って、読み進めたのですが、結論から言うと今の所直接的には何も役になっていません

ちなみに業務ではGoを使っているのですが、一年ほど前まではJavaのエンジニアだったのでコード自体の理解はなんとか大丈夫でした。

印象に残ったパターン

Template method Pattern

public abstract class AbstractDisplay { // 抽象クラスAbstractDisplay
    public abstract void open();        // サブクラスに実装をまかせる抽象メソッド(1) open
    public abstract void print();       // サブクラスに実装をまかせる抽象メソッド(2) print
    public abstract void close();       // サブクラスに実装をまかせる抽象メソッド(3) close
    public final void display() {       // この抽象クラスで実装しているメソッドdisplay
        open();                             // まずopenして…
        for (int i = 0; i < 5; i++) {       // 5回printを繰り返して…
            print();                    
        }
        close();                            // …最後にcloseする。これがdisplayメソッドで実装されている内容。
    }
}

上記のような構成でこのクラスを継承させた先に各メソッドの実装は任せつつ大元の処理の流れを決めるというもの。 綺麗だな〜頭いいな〜と思いました。

これが後から色々なパターンで出てくるので重要らしいです。 多分Goでは抽象メソッドがないのでできない。

Strategy Pattern

インターフェースの型に対して、パターンに合わせて実装を注入するというもの。 DIがやってることと同じ?という感想でした。

State Pattern

これぞOOPというような、オブジェクトによって振る舞いを変えるというもの。

Abstract Factory Pattern

難しすぎて理解できず印象に残った。 筆者もデザインパターンの中で一番難しかったと述べています。

感想

書いてみて基本簡単なパターンしか印象に残っていなかったことに気づき悲しいです。 最近ずっと書いているGoでは継承がないので、直接使えないパターンもいくつかあったのですが、 移譲で代用する方法なども書かれていたので、機会があれば使ってみたいです。

普段何気なく書いているコードが実はこのパターンだった、頭いい!みたいな嬉しい気持ちにも時々なれました。 感覚で理解したつもりになっていたものをしっかりパターンとして落とし込むことで多少は理解が深まった(と思いたい)です。

加えてかなり良かったのが、UMLのクラス図の記法にに慣れられたことです。 完全に副産物なんですが、今までUMLの話題になるたびにIT専科を見に行ってましたが、 23パターン分のクラス図を見たのでだいたい覚えることができたことはかなりでかい。

総じていうとやはりOOP言語を使うハイレベルな開発者でデザインパターンのことをほぼ知らない人はいないと思うので、 開発者としてレベルアップするための一つの必須項目なんだと思います。 今後のじわじわと効いてくると嬉しいなという感じです。

まとまりはないですが、これからも読み終わったらちょくちょく更新していきます。

Go Conference 2019 Autumnに参加してきました

はじめに

10/28(金)にGo Con autumnに参加してきました。 Goを仕事で使い始めてから半年ほど経ち、〇〇.goなどのミートアップには積極的に参加するようにしていましたが、GoConのようにオフィシャル?なイベントには初参加です。

やはり見応えのあるセッションが多くやる気maxになりました。

エセGopher脱却に向けて日々精進します。 以下見たセッションの紹介です。

セッション紹介

Go GC algorithm 101

speakerdeck.com

1個目からヘビー目の発表でしたが、 あまり触れたことのない人向けに説明も交えつつGOのGCの歴史について学ぶことが多かったです。

以下の本がオススメされていました。

ガベージコレクションのアルゴリズムと実装

stop the worldによりlatencyが落ちてしまう Mark and Sweep方式にて実装されていた以前のGOと

concurrent Mark and Sweep GCの違いなど、 今まで意識したことのない内容が多くとても楽しく聴くことができました。

Goにおける API Client実装パターン

speakerdeck.com

Gopher道場出身の方らしい。

begginer向けと書いてあり、わかりやすい内容だったが、実務で役立つ点・共感できる点も多かったです。

帰って早速exponential backoffについて実装してみました。

OSS Performance Tuning Tips

speakerdeck.com

まず世の中のソフトウェアは全て遅いものと考える という意識に脱帽しました。

  • 問題箇所の特定
  • benchmark
  • どう解決するかの引き出し
  • マージされるPR
  • 解決策を考えたら一度benchmark

各項目についてテクニック?を発表されていましたが、 その中を通して、すぐpprof, benchmarkと言った心がけが大事ということが伝わってきました。

avoでGoでアセンブラが書けるなど、asmの闇に飲まれかけているらしいです 笑

Accelerate Go development with Bazel

speakerdeck.com

monorepo build 辛い...などいきなり共感できる内容でした笑

gazzel, bazelの関係など今まで曖昧だったことがわかりやすく解説されていました。

以前軽く触れたことがあるのですが、学習・導入コストを考えると気軽にいれれるものではないそうで、istioもbazelをrepositoryから消したらしい...

  • gazel: goのファイルを解析してbazelファイルを生成
  • .bazelrc: option指定
  • bazelisk: bazelのバージョン管理
  • nogo: bazelの静的解析チェック

Check Container Images with Original Rules

speakerdeck.com

container imageはコントロールしやすい! 数々のdockerの脆弱性検知ツール開発者による発表で、 GKEなどマネージドオーケストレーション上ではコントロールできる部分が限られてくるということ、

docker imageは静的解析が容易だということを力説されていました。

思ったよりお手軽にできそうに見えるので挑戦してみたいと思います。

Microsoft Graph API Library for Go

speakerdeck.com

microsoft graph api SDKがGOに対応していないということで自分で作っちゃいました、という発表。

office365など自分では使っていないのですが、SDK作成のつらみ、ポイントなどが面白かったです。

Go Conference 2019 Autumn Go で超高速な 経路探索エンジンをつくる

speakerdeck.com

重み付き有向グラフ、ダイクストラ法などギリギリ聞いたことがある内容でこの発表は理解できないかもしれないと思っていましたが、

しっかり解説されており、slice, mapなど基礎的なものをいかに高パフォーマンスで使うかという内容はとても勉強になりました。

さすがD社という気持ちです。

Welcome to Linter

speakerdeck.com

linterを実際に会社で作成している方の発表。

最近静的解析に興味を持って取り組んでいるので、なんとかついていくことができました。

広く触れられている発表でしたが、実際の運用に乗せるまでのtipsなど興味深かったです。

compiler

speakerdeck.com

以前記事でみたことのある内容でしたが、やはりみたいと思ってホールへ 喋りが面白くて、何回か爆笑してしまいました(panicの実装を忘れていたなど)

目の前で実際に第二世代以降のコンパイラをビルドしたりエンターテイメント性があって面白かったです。

これだけのことを実行にうつしてしまう姿勢は見習いたいです。

まとめ

会社の仕事をほぼほったらかして参加しましたが、得たものを仕事で活かせば必ずプラスだと言えるくらい濃い内容だったと思います。

どの発表もプライベートor仕事にすぐ活かせる内容が入っており、モチベーションが爆上がりです。

初参加でしたが、敷居は全然高くなく、それでいて(自分にとっては)ハイレベルなカンファレンスだったので次も必ず行きたいです。

Linuxのしくみを読んで

読んだ本

[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識

https://www.amazon.co.jp/dp/477419607X/ref=cm_sw_em_r_mt_dp_U_uAxpDb2BB37CE

 

動機

文系で大学を出て、エンジニアになり実務経験はまだ一年半の自分にとって低レイヤーは未知の領域です。
 
一度転職しているのですが、前職ではシステム構築はベテランの仕事であり、自分はアプリケーション層のみ、言われた仕様通りの実装をするいわゆるコードモンキーでした。
 
オンプレシステムだったのでlinux(Cento OS)を使う機会自体はありましたが、周りに詳しい人はおらず、最低限の知識しか持っていませんでした。(上司はviを使いながら矢印キーで移動してたぐらい)
 
一年目の終わりに転職して自社サービスを作る会社でバックエンドを担当しているのですが、新しいことだらけで業務についていくのも大変でした。今もですが・・・
 
現在業務ではGCPを使っています。
cloudサービスでは直接linuxを扱う場面は少なく隠蔽されていることが大半ですが、
やっている領域はインフラに近くなってきたこと、具体的にはk8sネットワークやDNS、コンテナなど基礎知識がないと厳しい領域を扱うことが多くなり、
その辺の知識が新入社員研修レベルでは流石にやばいと思い、
大学の同期で優秀なエンジニアから薦めてもらった[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識を読むことにしました。
 

内容

冒頭でも説明されているのですが、比較的浅めの知識の方が読んでも概要は掴めるような内容だと思います。
osのカーネルモード、ユーザーモードの違いなどから始まり、プロセスの仕組み、CPU、メモリ、ストレージについて概念を説明してあります。
度々図やC言語で実装を伴った説明があり、コードを読みつつベンチマークを確認できるので、抽象度と具体度がちょうどいい本だと感じました。
全部のコードを理解できれば良いのですが、この辺に詳しくない方は概念を追うだけでも十分学ぶことは多いと思います。
 

ポイント

新卒研修で大雑把な話はわかっているつもりでしたが、
- プロセススケジューラー
- メモリキャッシュ、メモリ、ストレージの関係、特にページテーブルの考え方
などは今まで知らなかったことが多く勉強になりました。
 

感想

正直なところ今のところほぼ業務では役立っていませんが、今後表面的な策では解決できない問題が起きた時のアプローチの幅が増えるのではないかと期待しています。
あとこの本を読んでよかった点として、他の低レイヤー関連の本を読むハードルが低くなったと感じています。
現在は『

マスタリング TCP IP 

』『

30日でできる Os自作入門

』を少しずつ読みすすめています。
インフラ関連への興味がかなり湧いてきたので、今後はバックエンドよりもdevops系を優先的に学んでいきたいというお気持ちです。