Technology Radar 2019のピックアップ

[Technology Radar](https://www.thoughtworks.com/radar)から気になったものをピックアップし、軽く説明を添えてみました。
社内で共有したところ、反響が良かったのでQiitaにも投稿します。

（自分と似た技術スタックの方に刺さるのではないかと考えています）

# ピックアップの観点
**「自社の技術スタックとマッチしてるか」**、**「自分の技術スタックとマッチしているか」**の観点からピックアップしています。

筆者は現在web系の企業のSREチームに所属しており、業務や趣味で触れる技術/言語としては下記のとおりです。

- Ruby on Rails
- Node.js / Vue.js / Nuxt.js
- AWS + Terraform
- Go/python/Firebase/GCP

一方で下記技術は興味が無い/専門じゃない等の理由でスルーしていますのでご注意ください。

- モバイルアプリ系
- ML系
- JVM系

# Technology Radarとは
要は**今年のイケてる技術の紹介**です。
4段階で導入のおすすめ度合いが評価されているので、毎年重宝しています。

>TECHNOLOGY RADERとはThoughtWorks社が発表している技術トレンド分析の調査結果になります。 年1-2回発表しており、2016年は4月と11月に発表されました。

>ユニークな点は、技術トレンドの分析を
Techniques(開発手法) / Tools(ツール) / Platforms (プラットフォーム) / Languages & Frameworks(言語とフレームワーク)
の4分野に分けているところです。
また、評価結果も ADOPT / TRIAL / ASSESS / HOLDの4つに分けているところです。

>ADOPT : プロジェクトにマッチするならば、採用を強くおすすめしている。
TRIAL : プロジェクトでリスクを管理できればやる価値はある。
ASSESS: どのような影響をあたえるか理解するために採用するときがある。(今後のために採用するときがある)
HOLD : 採用する場合は慎重に進める必要がある。

引用元：https://allabout-tech.hatenablog.com/entry/2017/02/15/093000

# 気になった技術
それぞれの領域ごとに概要と所感を記載しています。

## Techniques
### Container security scanning (ADOPT)
もはやコンテナのセキュリティスキャンは必須の時代です。
CI/CDパイプライン内でスキャンを実施しましょう。

所感：ECRのscan on pushやtrivyで簡単に実現できそうなのでやっていきたい。

### Pipelines for infrastructure as code (ADOPT)
ソフトウェアのCI/CDパイプラインによるデプロイが主流になってきました。
Chef/Puppet/Ansible、Packer、Terraform等の登場により、インフラレイヤーもCI/CDを実現することが可能です。
インフラレイヤーもCI/CD化することで、実行元の一元管理や、実行前のエラー検知ができるようになるので、是非やりましょう。

所感：Lint/validationやplan結果の表示もできるのでやりたい。stg/prdのapplyタイミングを踏まえて設計する必要があるのでちょっと大変かも。Dockerfileも現在はCIにかかってないので回すようにしたい。

### security policy as code (TRIAL)
セキュリティポリシーをコード化し管理していきましょう。
[Open Policy Agent](https://www.openpolicyagent.org/)や[Istio](https://istio.io/)等であれば、ポリシー定義と実施メカニズムを提供しています。

所感：明文化してGit管理を開始したので、適用を強制したり検知する仕組みもあわせて実施していけるといい感じかも。

## Tools
### Commitizen (ADOPT)
http://commitizen.github.io/cz-cli/
対話形式でGitのコミットメッセージをサポートしてくれるツールです。
コミットの種類とか関連するIssueの有無とかbreaking changeの有無とか聞いてくれていい感じにメッセージを組み立ててくれます。
![commitizen](https://raw.githubusercontent.com/commitizen/cz-cli/master/meta/screenshots/add-commit.png)

所感：個人のリポジトリはコミットメッセージ英語なので、これを導入することで良さげなリポジトリに見えるようになりそう。

### jib (TRIAL)
https://github.com/GoogleContainerTools/jib
Java用のコンテナイメージ作成ツールです。
MavenやGradleに対応しており、DockerfileやDockerデーモンを必要とせずにイメージをビルドします。

所感：使うことはまあ無いだろうけど、デーモン無しにイメージを作成できる技術は気になる。

### Trivy (TRIAL)
https://github.com/aquasecurity/trivy
コンテナイメージのセキュリティスキャンツールです。

所感：今ではかなり有名なやつ。使っていきたい。

### Twistlock (TRIAL)
https://www.twistlock.com/
Twistlockは、コンテナ環境向けセキュリティ製品です。開発環境から実行環境まで、包括的なセキュリティを提供します。
NIST/CISベンチマークなど、業界のベストプラクティスに沿った対策が可能です。
![twistlock](https://www.twistlock.com/wp-content/uploads/2019/02/Twistlock-Solutions-2019.png)

所感：金額次第だが、セキュリティ要件厳しいサービスを運用する際にはいいかも。ただし、融通が利くかどうかは重要。

### asdf-vm (ASSESS)
https://asdf-vm.com/#/
複数の言語のバージョンを管理できるコマンドラインツールです。
RVMやnvmのようにバージョンを管理できますが、複数の言語をこのツール1つで管理できるのが特徴です。

所感：ruby以外もバージョン固定して利用するプロジェクトでは良さそう。個人の環境は全部これに乗せ替えたい。

### AWSume (ASSESS)
https://github.com/trek10inc/awsume
AssumeRoleをいい感じにやってくれるCLIツール
![AWSume](https://awsu.me/assets/img/demo.2f37110c.gif)

所感：社内のエンジニアには基本的にassum roleして利用するIAMユーザーを配ってるので、これを標準の手順にしてみてもよさそう。（現在、MFAを利用していることもあり、AssumeRoleするユーザーでawscliを使う手順がやや面倒）

### Pumba (ASSESS)
https://github.com/alexei-led/pumba
PumbaはDockerのためのchaos testingとネットワークエミュレーションのツールです。
ネットワークをエミュレートし、遅延、パケット損失、帯域幅レート制限などのさまざまなネットワーク障害をシミュレートすることもできます。

所感：chaos testingはやったこと無いので挑戦してみたい。

## Platforms
### Crux (ASSESS)
https://opencrux.com/
bitemporal graph queryを備えたドキュメントデータベースです。
bitemporalとは、履歴を持ったデータのこと
>不変のトランザクションレコードも保持しながら、ビジネスの真の履歴を記録します。これがバイテンポラリティの本質です。開発者およびアプリケーションユーザーとして、時間をかけて効率的にクエリを実行する機能のロックを解除します。 Cruxを使用すると、遡及修正を作成し、履歴データの移行を簡素化し、異常なイベントデータの統合ビューを構築できます。

所感：特許で見たことあるような。履歴を持ち、かつそれを遡及して修正するシステムは本当に辛いので、これがマッチするなら使うのが良さそう。

### Hydra (ASSESS)
https://www.ory.sh/hydra/
OAuth2、OpenID connect providerを簡単にホストすることができるOSSです。

所感：micro serviceをk8s上で構築する際に使えそう。認証系の自前メンテは辛いので、こういうものを活用していきたい。

### Teleport (ASSESS)
https://gravitational.com/teleport/
>『Gravitational Teleportは、SSHまたはKubernetes API経由でLinuxサーバーのクラスタへのアクセスを管理するためのゲートウェイです。従来のOpenSSHの代わりに使用することを目的としています。』

[参考記事](https://qiita.com/gutio/items/2001710b5ca20397a579)

所感：中規模以上のk8sを利用している場合に効果を発揮しそう。自前でteleportのクラスタを構築し、ライセンスも必要なプロダクトなので、導入するのはけっこうな大事。GitHubや任意のSSO連携可能なサービスのアカウントで、ロールに基づいたsshができるのはまさに我々が求めていたものである。

## Languages & Frameforks
### jest-when (TRIAL)
https://www.npmjs.com/package/jest-when
`when(fn).calledWith(args).thenReturn(value)`のような感じでモック関数の引数に対するレスポンスを定義できるプラグインです。

所感：地味に便利で記述量を少なくできるので良さそう。

### NestJS (ASSESS)
https://nestjs.com/
TypeScript製のserver side Node.jsフレームワークです。
GraphQL、Websocket、ORMライブラリなどのプロトコルをサポートしています。

参考記事：[Nest.jsは素晴らしい](https://qiita.com/kmatae/items/5aacc8375f71105ce0e4)

所感：発想はRailsに近いように思える（レールに乗ることでスタイルが統一され楽に開発できる等）。expressとの2択になりそう。

### Paged.js
https://www.pagedmedia.org/paged-js/
HTMLで書籍等の印刷物を作る場合に必要なページカウンターやヘッダー、フッター等を描画できるポリフィルとCSSモジュールを生成してくれるライブラリです。

所感：本を作る機会があれば使ってみたいかも。前職であれば仕様書は謎に文書形式である必要があったので、Markdownで書いた場合でもヘッダーやフッターを頑張ってつけてたから、それにも使えそう。

# まとめ
個人的に気になった技術をいくつかピックアップして紹介してみました。

よくあるツール紹介でごめんなさい。
~~でも、元が英語だから許してね。~~