mongolyyのブログ

開発(Javascript, Typescript, React, Next.js)や開発手法(スクラム, アジャイル)、勉強したことについて色々書ければと。

「良いコード/悪いコードで学ぶ設計入門-保守しやすい 成長し続けるコードの書き方」を読んだら、次の日からその知識が役に立った

はじめに

「良いコード/悪いコードで学ぶ設計入門-保守しやすい 成長し続けるコードの書き方」が先日出版されたので、GWに読みました。 その感想を書いていこうと思います。

感想

サンプルがあってわかりやすい

悪い例、良い例が両方とも書かれており、かつ、それらの例に対しての著者の経験を基にした考えが書いてあり、非常にわかりやすく、読みやすかったです。

本書では、今までClean Architectureやリファクタリング本で紹介されてきた設計原則を取り扱いつつも、一歩踏み込んで、実プロジェクトで発生してきたことベースで語られており、あるある度やわかりやすさは高く、現在の業務にすぐ活かせるように感じました。
特に、「5.5 多すぎる引数」や「8.2.1 継承に絡む密結合」、「8.2.5 高凝集の誤解から来る密結合」の章は自分も今まで何度かやってきてしまっていたり、見かけても放置してしまったことがあるなーと、ドキッとしました。

「8.2.1 継承に絡む密結合」については、他の方からも「継承より委譲を」と、言われたばっかりであったこともあり、改めて大事さを感じました。

今後の学習の指針となる

参考書籍や、勉強するときの心構えなどが書いてあって、初級者から一歩進んだ方から、設計に取り組み始める若手におすすめしたいと感じ、また、中堅以上の方も抜けている知識を補完するために役立つと感じました。

おわりに

繰り返しになりますが、著者の熱い想いが詰まっていて非常に読み応えがありました。
自分も心あたりがあるところがあったので、読んだ翌日から現場での得た知見を活かして業務をしていました。(今まで継承で実装していたであろう箇所を委譲を使用して実装していました)

基礎ができているエンジニアの方で、もう一歩成長していきたいという方におすすめの一冊でした。

「入門!論理学」を読んだら、論理学の考え方が少しわかった

はじめに

きしださんのこちらの記事を参考に、型理論を理解したいと考え、まずは「入門!論理学」を読んでみました。
感想を書いていこうと思います。

nowokay.hatenablog.com

読んでみてどうだったか?

論理学の考え方や、用語を理解できた

論理学での話の組み立て方、また、排中律、連言、選言、導入、除去、全称、存在と言った論理学の言葉について理解できました。
概念としてはもともと知っているものもありましたが、本書では、論理学としてどう捉えられているかというのが、わかり易い言葉で、深く説明されていて非常に読み応えがありました。

その中でも、「排中律」を認めるかどうかが論理学の中で議論されることの一つという話が興味深かったです。
排中律は、"Aである"が正の場合は"Aではない"は偽になり、逆に"Aである"が偽の場合は、"Aではない"は正である、という意味なのですが、プログラムを書いている上では当たり前なのですが、実生活では、証拠不十分でどちらかと断定するのは難しい場合があるんですよね。
本書では「排中律」が成り立たない例をいくつか紹介されていて非常にわかりやすかったんですが、同時に、普段自分たちが当たり前として捉えている考え方は、案外脆いものでもある、ということに気付かされました。

また、軽くしか紹介されていませんでしたが、「ゲーデル不完全性定理」についても興味深かったです。
今まで数学はいくつかの公理の上で、すべての命題について証明可能だと思っていましたが、そうではない(≒不完全性がある)ということを知り、「ほえー」と思いました。(これも正確な理解ではないかもしれませんが汗)

おわりに

本書で論理学を知って、今までの自分の考えはある枠組みの中で定義されたことであったと知りつつ、考えを広げてみると、「そもそも〇〇とは?」みたいな哲学的な方向性に考えにいきついたり、一方、数学やプログラミングとの結びつきも深く、論理学は領域横断的な基礎分野だなーと感じました。

本書は丁寧であるものの、論理学自体始めてだったこともあり、途中で何がわかっていて、何がわかっていないか、よくわからなくなる時がありました。 ただ、そういうタイミングに、本書では今までの理解を確かめたり、今までの理解を発展させた練習問題が出てきていて、それにより迷子にならずに読み進めることができました。
論理学難しそう、、という、初心者の方におすすめの本でした。

テストも書かずにリファクタリングとは何事か

はじめに

知人と話していて、「レガシーコードをメンテナンスしており、リファクタリングをしているが、テストは書いていない」という話を聞いて、それは違うのではないか?と思ったので、ポエムを書こうと思います

書いていることは、大体「リファクタリング」本や「レガシーソフトウェア改善ガイド」「レガシーコード改善ガイド」に書いてあることなので、まずはこれらを読みましょう。

リファクタリングとはなにか?

外から見たときの振る舞いを変えずに、内部の構造を変えることです。

外から見たときの振る舞いを変えずに、というのを検証するためにテストが必要になってきます。

テストを書かなかった場合に、どんな問題があるか?

テストを書かなかったときの問題点①

壊していても気づかない。気づけない。

テストを書かなかったときの問題点②

良い設計になっているか検証できない。 悪い設計になっている特徴として、テスタビリティが低いというのがあると思っています。 リファクタリングしたと思ったけれど、逆リファクタリングデグレさせている可能性さえあります。

レガシーコード(テストがない)の場合の対処法

個人的には以下の選択肢があると思っています

終わりに

テストが書けないと言っている場合も、よくよく見てみるとテストをかける場合が多いと思っています。 また、こんな面倒なことにしないためにも、最初からテストを書いておきましょう。

React系のライブラリにおいて、ts/tsxをトランスパイラーとして、何が使用されているのか調査してみた

はじめに

「Reactを使っている場合はjsxをトランスフォームするためにbabelを使用するのはわかるが、React + TypeScriptの組み合わせを使っている場合、tscでトランスパイルすれば、tsxのトランスフォームもtscがしくてれて、babel使わなくていいんじゃないの?」と知人から聞かれて、たしかにそうだなーと思いつつ、プロダクトでは babel や最近は esbuildswc を使っていることが多くて、tsc を使うことは少ない気がする(というか見たことない)と思ったので調べてみました。

まずReactの環境をどう構築するのか問題

次期公式ドキュメントになるであろう React Docs beta の中では、次の方法が紹介されています。

  • Create React App
  • Vite
  • parcel
  • snowpack
  • Next.js
  • Gatsby
  • Razzle

beta.reactjs.org

それぞれどういったトランスパイラーを使用しているか

感想

やはり babel を使用していることがそこそこ多く、 tsc は存在しなかったですね。tsx→jsだけでなく、jsx→jsの変換もしようとすると、 babel を採用するのは納得できるなーといった感じです。

多いですね。一方、最近出てきた esbuildswc はバンドルが可能であったり、トランスパイル自体早いものの、babelのプラグインが必要だったライブラリは移行しづらく、 swc のメンテナーをvercelが採用したのも、このbabel依存を剥がすためにはそのくらい本気で取り組まないと進まないんだなーと感じました。

今後、 esbuildswc 、あと、今回は出てきていませんが all-in-oneな rome のどれがディファクトスタンダードになるか、見守っていきたいと思います

「オブジェクト指向 JavaScriptの原則」を読んだ

はじめに

メーカーのコーポレート部門でソフトウェアエンジニアとして働いているモンゴルです。 今回、3連休に次の書籍を読んだので、その感想を書いていこうと思います。

感想

プリミティブか参照型か意識するようになった

ラッパーオブジェクトの存在により、プリミティブ型であってもメソッドが使えていたということもあり、以前はあまり意識していませんでした。
本書を読んで、ラッパーオブジェクトの仕様などが丁寧に説明されており、非常にわかりやすく理解できました。
また、 type ofinstanceof に対して、正直なんとなーくで使っていましたが、本書を読んで、プリミティブ型の場合は type of でそれ以外の独自のオブジェクトについては instanceof という理解が進みました

内部プロパティを知った

関数オブジェクトは [[Call]]、通常のオブジェクトは [[Put]][[Set]][[Get]] などの内部プロパティ、メソッドを保有していることを知りました。 またこれらの値を使って、関数かどうか判定したり、setter、getterの処理が保有されていることを知りました。
内部プロパティの一部は Object.defineProperty() で設定ができるということも初めて知りました。

これを知って、TypeScriptのreadonlyやgetterの記載をしたときに、 Object.defineProperty() を使用したコードにトランスパイルされているのでは?と感じ、実際に次のコードをTypeScript Playgroundでトランスパイルしてみました。

class Employee {
  readonly id: string;
  name: string;

  constructor(id: string, name: string) {
    this.id = id;
    this.name = name;
  }

  get label() {
    return `名前は${name}`;
  }
}

TypeScript: TS Playground - An online editor for exploring TypeScript and JavaScript

面白いことに、TargetをES5としたときと、ES2015にした場合で結果は異なりました。

  • ES5の場合
"use strict";
var Employee = /** @class */ (function () {
    function Employee(id, name) {
        this.id = id;
        this.name = name;
    }
    Object.defineProperty(Employee.prototype, "label", {
        get: function () {
            return "\u540D\u524D\u306F".concat(name);
        },
        enumerable: false,
        configurable: true
    });
    return Employee;
}());

本書で習ったObject.definePropertyが使われてました。

  • ES2015にした場合
"use strict";
class Employee {
    constructor(id, name) {
        this.id = id;
        this.name = name;
    }
    get label() {
        return `名前は${name}`;
    }
}

classが追加されたせいなのか、トランスパイルされた結果もTypeScriptで実装したものとほぼ同一になっていました。
確証はありませんが、classが追加されたことにより、このような変化が生じたのだと思いました。

おわりに

JavaScript初級者という方で、言語仕様をもっと知りたいという方におすすめの一冊でした。
一方、ES2015からクラスが追加されていたり大きな変更があるのに対し、本書はES5ベースで書かれているので、無用とまではいかずとも、注意が必要にも感じました。

最後に、自分の仕事観点での、個人的感想です。
普段はTypeScriptを使っているのですが、仕様がJavaScriptに由来するものなのか、TypeScriptに由来するものなのか意識できていなかったということに気付かされました。

通常のTypeScriptを使用した実装では直接役に立たないかもしれませんが、何か不具合調査のためにトランスパイルされたコードを読んだり、JavaScriptで書かれたライブラリのコードをサクッと読む場合も、JavaScript本来の仕様を知っていることで、理解のしやすさ、深さは変わりそうだなと思いました。
本書はその役に立ちそうにも感じましたし、他の本や情報源も使って、継続的に学習したいと感じました。

「Real World HTTP」を読んだ

はじめに

こんにちは。メーカーのコーポレート部門でソフトウェアエンジニアとして働いているモンゴルです。 前々から気になっていた「Real World HTTP」を読んだので感想を書いていこうと思います。

感想

読み物として面白かった

Cookieの細かい仕様や、HTTP2については概要は知っていたものの、本書をきっかけに理解を深められました。
また、HTTP3、WebRTCについては知識がほとんどなかったのですが、この機会に学べてよかったです。
これらについて、適度な粒度で体系的にまとまっている書籍などもなかなかないように感じるので、Web系のエンジニアの方は手元に置いておいて、辞書的に読むのはおすすめだなと感じました。

クライアントを作るのは新鮮だった

サーバー側の実装は業務などでよくありますが、HTTPクライアントを作ってみるのは初だったので、面白かったです。
特に、HTTPS通信のために証明書を読み込んで、というところは、普段は触れない部分なので、興味深かったです。手を動かしながら学びたい派の方におすすめだなと感じました。

終わりに

HTTP周りについて体系だってまとめられている書籍はなかなかないので、Web系のエンジニアの方は手元に置いておき、知識を広げるためにぜひ読んでみるといいのでは、と思いました。

令和3年度 技術士一次試験(情報工学)の合格体験記

はじめに

今回、技術士情報工学部門で合格できたので、その体験記を共有します。

どのくらい勉強したか?

勉強時間は合計20時間くらい
期間は1ヶ月くらい

何を使用して勉強したか?

次の本を一通り読みました。
よくわからなかったり、忘れそうなところはNotionにメモを残して、繰り返し確認できるようにしていました。

上記の本で基礎を一通り押さえた後、下記の本を使って3年分の過去問を解きました。
情報処理技術者試験と異なり、同一の問題が出題されるということはなさそうという事がわかりました。

結果はどうだったか?

という感じでした。
過去問では適正科目は8割以上取れていましたが、少し低くて、自己採点中はちょっと焦りました。

終わりに

情報工学部門の一次試験の合格率は55.1%と高かったので、勉強時間の確保ができさえすれば合格できそうだと感じました。
また、情報工学の場合は、高度情報処理技術者試験保有者向けの専門科目の免除措置があるので、それもあって合格率が高くなっていそうだと感じました。

二次試験もがんばります!