サーバーサイドのプログラマがTypeScriptに入門してみた

この記事は[株式会社ビットキー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/bitkey) 16日目の記事です。
アドベントカレンダーも後半です、2022年11月に入社しましたWork & Experience Product所属の@hoshtが担当します。

## tl;dr

- TypeScriptは学習リソースが充実しているため他言語経験者に優しいです
- オライリーのサブスクはTypeScript学習にもいいぞ
- 型パズル楽しいです(むずかしい)

## はじめに

いきなりですが、ビットキーはサーバーサイドの言語として主にTypeScriptとGoを採用しています。

この記事はビットキーに入社したことにより、今まで見て見ぬふりをしていたTypeScriptに向き合わなければならなくなった筆者がお送りします。[^1]
TypeScript入門する過程で参考にしているリソースを紹介していきます。

## この記事の想定読者

タイトルに入門とありますが、プログラミング初心者に向けた記事ではありません。
筆者のようにすでに1つ以上の高水準言語の経験があり、過去にJavaScriptを分からないなりに書いたことがある人を想定しています。
TypeScriptの経験が豊富な諸兄姉のみなさまにつきましては、温かい目で応援していただけると幸いです。

## これまでの経験について

筆者はこれまでのキャリアで主に2つの領域で経験を積んできました。

- Ruby(on Rails)やPHPによるサーバーサイド開発
- Linux、コンテナ、AWS、Terraformなどアプリインフラ開発・運用

Webアプリケーションのサーバーサイド開発の比重が大きいため、必然的にサーバーサイド開発者の視点から見たTypeScript入門となります。

JavaScriptは業務上必要であれば触る程度で、包括的に学習したことはない状態です。
一方、言語を取り巻くエコシステムについてはNext.jsをDockerでデプロイした経験、Railsのフロントエンドエコシステムの方向性[^2]をキャッチアップする過程で概要レベルで把握しています。
型システムはTAPLを読んでいないので宇宙語が読めません。[^3]

## TypeScript入門の基礎編

### インプット

#### 公式Handbookに目を通す

何はともあれ新しい言語を学ぼうとしたら公式のドキュメントを探します。
TypeScriptは公式のドキュメントが存在する上に[Handbookが公開されている](https://www.typescriptlang.org/docs/handbook/intro.html)のでまずはそこから始めます。

全ての内容が理解できなくても良いので、Handbookを読み進めてTypeScriptの雰囲気を掴んでいきます。
サンプルコードのTryボタンを押すとTypeScriptのPlaygroundが立ち上がりさっと試せるのは強みですね。[^5]

#### オンラインの学習リソースを読む

Handbookをいきなり読みこなすのは難しかったため、日本語の学習リソースを探します。

- [サバイバルTypeScript](https://typescriptbook.jp/)
- [仕事ですぐに使えるTypeScript](https://future-architect.github.io/typescript-guide/)

サーバーサイド開発の経験者向けに書かれた入門ドキュメントがあるので、読まない手はありません。
TypeScriptをTypeScript足らしめる型システムやあらゆることろで使う関数を中心に読んで行きます。

### アウトプット

#### TypeScriptの型演習

プログラミング言語の習得を目標にするならば、手を動かしてコードを書きたくなります。

後述するプロを目指す人のためのTypeScript入門の著者であるuhyoさんがTypeScriptの型演習をQiitaに公開されているので、解きながら型システムを手に馴染ませていきます。

https://qiita.com/uhyo/items/e4f54ef3b87afdd65546

#### AtCoderのABCをTypeScriptで解いてみる

競技プログラミングコンテストサイトである[AtCoder](https://atcoder.jp/)はバージョンが少し古い[^4]ですがTypeScriptで提出することができます。

この記事で詳細は割愛しますがABCのA問題、B問題は制御構文やループで処理すれば解ける問題が多いです。

こちらはTypeScriptの式と文に慣れる目的で埋めていきたいです。

## TypeScript入門の応用編

### インプット

#### 書籍をザッピングする

より包括的な情報にアクセスしたい場合は書籍を当たります。ただし、技術書は発行年によっては情報が古くなることが多いため注意が必要です。

記事執筆時点で[プロを目指す人のためのTypeScript入門 安全なコードの書き方から高度な型の使い方まで](https://gihyo.jp/book/2022/978-4-297-12747-3)が2022年と最近発売のため、読まない手はありません。

**オライリーのサブスクはいいぞ**

いきなり宣伝が始まり恐縮ですがO'reilly Learning Platformのサブスクを契約しています。

SRE関連書籍を読むために契約していたのですが、[プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発](https://www.oreilly.com/library/view/typescript-javascript/9784873119045/)がラインナップに追加されており、読まない手はありません。

プログラミングTypeScriptはより網羅的な印象で、辞書的に活用しています。

サブスクだと物理書籍と比較して金額分しっかりと読まなければいけないプレッシャーに襲われにくいです。

他にも英語のTypeScript本が読めるので、前述の型システムと関数を中心に興味の赴くままに目を通します。

- [Effective TypeScript](https://www.oreilly.com/library/view/effective-typescript/9781492053736/)
    - 目次からは型について深掘りしているような印象です
- [Learning TypeScript](https://www.oreilly.com/library/view/learning-typescript/9781098110321/)
    - Learningとあるように学習者向けの印象です
- [TypeScript Cookbook](https://www.oreilly.com/library/view/typescript-cookbook/9781098136642/)
    - Early Releaseにつき3章まで公開されている

TypeScriptと関係がなくとも、日本語書籍が[大量に登録されている](https://www.oreilly.com/beta-search/?q=publisher%3A%22O%27reilly+Japan%2C+Inc%22&type=*&order_by=published_at)のでオススメです。

### アウトプット

#### Type Challengesで型パズルに挑戦する

スキマ時間でTypeScriptを学ぶのにちょうど良いリソースがないか探してみたら、[Type Challenges](https://tsch.js.org/)を発見したので挑戦してみました。

Type ChallengesはTypeScriptの型を操作して解答していく問題集です。
こちらもPlaygroundが用意されているため環境構築不要ですぐに始めることができるのは嬉しいポイントです。
初級問題に挑戦してみましたが、初学者には初級問題でも歯応えが強く遅々として進んでいないです。
ドキュメントや書籍を読み返すきっかけになるので、なるべく正解を見ずに取り組んでいます。
あまりに進まないので基礎編で紹介した型演習を復習しています。

#### ISUCON予選問題の参考実装を眺める

筆者は[ISUCON](https://isucon.net/)[^6]に参加したことがありませんが、学習を目的として予選問題の参考実装を読むことがあります。

最近の予選問題のNode.js参考実装はTypeScriptで実装されています。そのため、動くTypeScriptサーバーサイドアプリが[すぐに手に入ります](https://github.com/search?q=org%3Aisucon+qualify&type=all)。

ベンチマーカーを動かせたら、アプリケーションの挙動を変えずにリファクタリング可能です。

## 学習過程での気づき

入門して間もないですが、言語仕様や機能の記事に比べTypeScriptならではのサーバーサイド設計やドメインモデリングの資料は少なめな印象を持ちました。TypeScriptでサーバーサイド開発している人はどのように情報を得ているのか気になります。同じ静的型付け言語のJavaやC#の書籍を参考にしているのでしょうか。

## まとめ

記事執筆時点で紹介したコンテンツの全てに目を通せたわけではないですが、TypeScriptは学習のためのリソースが豊富に用意されていて、初学者も入門しやすい言語です。
入門直後は型システムの柔軟さに驚くばかりですが、コンパイラを信じて進んで行きます。

明日17日の担当はBKP&HubCoreModuleの@nrnrkさんです。

[^1]:SREとして入社しているので厳密には習得が必須ではありません。Embedded SREとして、実装を読んで事業ドメインを理解していきたいのが学習のモチベーションです。
[^2]:https://world.hey.com/dhh/modern-web-apps-without-javascript-bundling-or-transpiling-a20f2755
[^3]:宇宙語とは https://www.youtube.com/watch?v=JELIVTVuFHo&t=1459s
[^4]:https://atcoder.jp/contests/language-test-202001
[^5]:余談ですが今冬リリースが予定されているRuby3.2ではWASM対応により、将来類似の機能がドキュメントに入ってくると予想されます。入ってほしい。
[^6]:ISUCON公式TwitterのBioより「ISUCONとは、LINE株式会社が運営窓口となって開催している「お題となるWebサービスを決められたレギュレーションの中で限界まで高速化を図るチューニングバトル」です。」