chroju.dev/blog

the world as code

2022年時点で知っていることと知らないことと、今年の展望

年間の目標、というのはスパンが長すぎる気がしていてここ数年立ててはいなくて、Q単位での目標だけにしているんだけど、とはいえ年の初めは自分がこれから何を成すのか棚卸しながら考える機会になりやすい。この年末年始もいろいろと考え事をしていた。

『達人プログラマー』 に「知識ポートフォリオ」というプラクティスの紹介がある。自分の知識の多寡を金融資産のポートフォリオのように見立てて、定期的にリバランスしたり、分散投資しながら継続的に強化していこうという話だ。これ、ずっとやってみたいと思ってはいたのだが、なかなかその機会が取れなかったのを、今回やってみることにした。自分の中の知識を一度客観的に見つめ直してから、今後何に取り組むのかを改めて考えたいと思ったからだ。なので、この記事では「知識ポートフォリオ」を書いたあと、最後に今年の展望に少し触れてみたい。

書籍の中には具体的なポートフォリオの書き方には言及がないので、似たことを実践している以下の記事を参考にさせてもらった。

前者の記事は、 React のコアコミッターという「強い」エンジニアの方が、そんな自分でも知らないことはたくさんあるんだよ、という意味で書いたエントリーなので、知識ポートフォリオとは意味合いが異なるのだが、「知らないこと」を真摯に見つめ直すということはとても意義があると思い、常々真似してみたいと考えていた。また、後者の記事も前者の記事も、単に技術の名前をピックアップして「できる」「できない」という話だけをするのではなく、ある程度その判断の根拠を言語化しているので、この点も参考にさせてもらった。

「得意」という言葉を使うのは気が引けるし、つよつよではなくても、自分が業務で使えるレベルであればそれは肯定しておきたかったので、分類は「知っていること」「ある程度知っていること」「知らないこと」の三段階としてみた。自分に知識があると思われる領域を正確に把握しておくことは、生存バイアスの自覚など、心理的な部分にも大いに影響するはずで、軽視したくはない。ちなみにやってみてわかったのだが、どれも完全に書きだそうと思うと際限がないのと、どのレイヤーで書くべきかが悩ましい(RDBMS とするべきか MySQL とするべきか、など)ので、そのあたりは割り切って一旦書いてみている。

知っていること

SRE / DevOps プラクティス

  • 『サイトリライアビリティエンジニアリング』『サイトリライアビリティワークブック』『Lean と DevOps の科学』などを読んで実践を試みている
  • 現状の自身のエンジニアリングの中心課題がここになっている

Terraform

  • module, for_each, 各種 function などを用いながら記述できる
  • 自動実行のパイプラインを組むことができる
  • 実行エラーや state にまつわるトラブルに一定程度対処できる
  • terraform-provider-aws に commit 経験がある
  • 同種の他ツール(Pulumi, CloudFormation など)の経験はほとんどない

AWS

  • Well Architected なプラクティスを理解している
  • AWS Certified Security - Specialty を取得している
  • AWS Certified SysOps Administrator - Associate の取得経験がある(expire 済み)
  • API 体系をある程度把握しており Terraform や CLI を通じて操作できる
  • EC2, ELB, S3, EKS, ECS, Lambda, Kinesis, CloudFront, SES, SQS, CloudWatch, Aurora, RDS, Elasticache, API Gateway, Cognito, Code series などの経験がある
  • ただし、まったく知らないサービスも多く、これほど「知っている」と言うのが怖いものもない
    • しかし変に謙遜するのも微妙な気がするのでここに置いた
    • 個々のサービスは置いておいて、 AWS 全体的な管理、運用、利用上のプラクティスを「知っている」の意である

bash

  • 好みはしないが、ある程度複雑化したシェルスクリプトや、長時間稼働のスクリプトをシグナルハンドリングなどを考慮しながら書いたりはできる
  • awk, sed, cut, tr などを使って標準出力のテキストを編集してごにょごにょする、みたいなことは好きでよくやる (awk, sed は正確には bash の域に含めるべきではないかもしれない)
  • POSIX 標準で書けとか言われたら無理です

Go

  • terraform-provider-aws を触ったりしているし、基本的な読み書きはほぼできる、ここ2年ぐらいの OSS commit は半分以上 Go である
  • 自分で何か CLI ツールを作るときなども Go を使うことが多い
  • Go を専門職とするエンジニアにはどう考えても劣るので、進んで得意と言える気もしてはいないが、一定のレベルには達していると認識している

Linux OS の概念

  • 低レイヤーに詳しくはないが、メモリ、ネットワークIO、ファイルシステム、CPU、ロードアベレージ、プロセス管理など、 Linux OS の運用上把握しておくべき点は把握しており、トラブル時の対応などもできる
  • Ubuntu の経験が長いが RedHat 系も触れる、それ以外のディストリビューションは趣味で Arch Linux を使っていたのと、 Amazon Linux ぐらい

ネットワーク

  • プロトコルとしては ssh, http, ssl/tls, tcp, ip, icmp, dns などは概念的に理解している
  • DNS サーバの設定や権威 DNS の切り替え、 TTL を考慮した設定や運用はできる
  • TLS をどこで終端させるか、どの範囲を TLS 暗号化するべきかなどは関心が強い領域
  • IPv6 は理解が薄い

ウェブサービスのインフラ設計、構築

  • LB を設けて、ウェブサーバを立てて、アプリケーションサーバへリクエストをプロキシして、という一般的なウェブサービスの構成を一通り構築できる
  • nginx と AWS を用いた場合の経験過多、という偏りは強い

Docker

  • マルチステージビルドなどを活用しながら Docker コンテナの開発ができる
  • docker コマンドを一通り使いこなしたり、 docker-compose を使ったりできる
  • Dockerfile を記述する上でのベスト / バッドプラクティスを知っている

Ansible

  • 一般的な使い方はできる、 Playbook の読み書きはできる
  • 最近はコンテナを使う機会が多く、最新のトレンドなどは把握できていない

ログ管理

  • fluentd や Amazon Kinesis を使ってログの永続化や各種転送、フィルタリング処理の自動化ができる
  • 構造化ロギングや Twelve Factor App に基づいたロギングプラクティスを理解している
  • Elastic Stack は Logstash を除いて運用経験があるが、 Elasticsearch の運用はあまり好きではない

システム監視

  • アプリケーションやソフトウェアに応じた適切な監視設計、設定ができる
  • Datadog, Nagios, Grafana, influxDB, Hinemos, Mackerel などの構築、運用の経験がある
  • 偽陽性アラートの問題、アラート疲れへの対処、平均、中央値、パーセンタイルなど統計方法の使い分けといったプラクティスを理解している
  • Prometheus は利用経験がない

CI/CD

  • ほぼツールの話になってしまうので「知っている」と言っていいのか判断しづらいが、その必要性と実装方法はわかっている
  • CircleCI、 AWS Code Series、 GitHub Actions の使い方をよく理解している

ある程度知っていること

Kubernetes

  • Pod, Namespace, DaemonSet, ReplicaSet, Service, Deployment など一般的な概念は理解して活用できている
  • 全容が広くてどのレベルまで把握していれば「知っている」と言えるのかの自信がない
  • EKS などを使っていて、 etcd などコントロールプレーンのコンポーネントは正直きちんと意識はできていない
  • kubectl, kustomize, helm などを用いたマニフェストの適用、設定、記述などは一通りできる

GitOps

  • Argo CD と Flux の構築、設定経験がある
  • CIOps とは異なり、システムの実態と設定とを自律的に sync する仕組みだと認識しており、 CIOps と使い分けることができる

RDBMS

  • MySQL に関しては構築、設定、ある程度のパフォーマンスチューニングや堅牢性の確保ができる
  • MySQL 以外の RDBMS は商用運用経験がない
  • MySQL にしてもそこまで深く理解しているという自覚はなく、300ページの MySQL 本があるとしたら、自分が理解しているのは30ページぐらいだと思う

KVS

  • redis と memcached の構築、設定経験がある
  • チューニングなどはほとんど経験がない

CDN

  • Amazon CloudFront は触っているが他は通じていないので、 CDN という括りだと「知っている」と言っていいのか判断がつかない
  • 書籍『Web 配信の技術』は読んでいるし、ある程度の理解をしているとは思う

mail 関連

  • POP3, IMAP などのプロトコルと DKIM などの認証技術、 Bounce への対処といった一連のプラクティスは理解し、対策も出来る
  • とはいえ、それほど問題になる機会が多くなかったりはするので、調べながらじゃないと難しいかも知れない

JavaScript (TypeScript), Python

  • いずれも Go に次いで書く機会はあり、入門はしていると自覚している
  • JS はとりあえず文法はわかる、 Node.js や React などメジャーなライブラリがどう使われているかは知っている、という程度で、それぞれに適した形ですぐに書ける、読める、というレベルではない
  • Python は AWS Lambda 程度でしか使わない

セキュリティ

  • 旧セキュリティスペシャリストの取得経験はある
  • とはいえアプリケーション開発者ではないので、いわゆる「徳丸本」に書かれているような脆弱性を生まないために、どう気をつけてプログラミングすればいいのか、などはよく知らない
  • インフラのレイヤーで無駄にポート開放するなとか、暗号化の必要性、適切な権限管理などは理解して実践している

知らないこと

SRE、インフラ以外の領域

  • SRE とインフラエンジニア以外の各 IT エンジニアの領域は基本的にわかっていない
  • 趣味で Ruby on Rails によるウェブサービスを作ったり、 Next.js でブログを作ったりはしているが、業務レベルでそれをこなせる自信はまったくない

マイクロサービス

  • 概念としては知っているが、運用経験はない
  • よくマイクロサービス(というか分散システム)と付随して語られるサービスメッシュや分散トレーシング、 gRPC なども知らない

GraphQL

  • REST のように URL でリソースを表現するものではなくて、リクエストに DSL を使う、というぐらいはわかっている
  • 趣味含めて、開発の中で自分で実装をしてみた経験はないし、叩いたこともないかもしれない

低レイヤー

  • いわゆる OS の低レイヤーにはほとんど触れたことがない
  • システムコールはいくつか知っているものはあるが、知らないもののほうがほとんどだし、カーネルの知識はない
  • C言語もまったく知らない、システムプログラミングの経験はない

アルゴリズム

  • 雑学的に知っているものはあるが、業務に活用できたと思う機会はほとんどない

ソフトウェア開発哲学

  • 断片的に SOLID やら何やらを聞いてはいるがちゃんとはわかっていない
  • Infrastructure as Code のコード設計にも役立つものはあるはずで、すごく「わかりたい」と思っている領域
  • 全貌がよく見えていなくて、どこから手を付けていいのかもよくわからない領域でもある

動画やゲームなど大容量の転送、負荷対策

  • 経験がないので、何が必要なスキルになるのかもわかっていない
  • 単純な負荷対策だけで済まないものと思っている
  • 億単位の RDBMS レコードなども扱った経験がない

データパイプライン、データ分析

  • パイプラインの構築経験も、データ分析を行ったこともない

HTTP3 / QUIC

  • どちらも触れる機会がないまま来てしまった
  • なんなら HTTP/2 すらちゃんと理解していない気がする

今年の展望

棚卸しをしてみた感想としては Kubernetes と Terraform を除くと、結構古くからの知識で食べている部分が大きい気がした。ネットワークや Linux 、ログ管理のプラクティスなどがすぐに陳腐化することはないので、それはそれでいいのかもしれないが、一方でシステム監視であれば Prometheus exporter にも対応できるようになっておくとか、よりモダンな部分を取り入れて視野を広げていくアプローチも必要かもしれない。

知らないこと、ある程度知っていることに含めたなかでは、業務上 Kubernetes とセキュリティの必要性が高まっているのと、個人的な興味としてはソフトウェア開発哲学まわりが大きい。去年もこのへんやりたいと言いながら、あんまり取り組めた感覚がないので、インプットとアウトプットを集中的かつ効率的に回していく仕組み作りが必要そう。知識ポートフォリオが少しずつ入れ替わっていくような形を目指していきたい。この記事は折りを見て chroju.dev 配下かつブログの外に移して、定期的に更新していこうと考えている。

習慣に落とし込むと、このあたりを意識することとする。

  • 技術書の読むスピードを上げる、1冊2週間以内 = 年間24冊が目安
    • ものによっては1週間以内でよい
    • 熟読するより、まずインデックスを脳内に張るために読むことを考えて数をこなせるようにする
  • インプット自体を増やす
    • 勉強会への出席機会が減ってきていたので、増やす
    • RSS reader でブログを読むことがなくなったので、代替手段を考える
  • 言語化の機会を増やす
    • Scrapbox のメモを1日3page = 年間約1000pageは増やしたい
    • ブログを2週に1回は書きたい
    • 頓挫してしまった週報は2週間単位で途切れず書くことを目指す
  • 8:30〜12:30 をディープ・ワークの時間にする
    • 10:00までプライベートの学び、10:00以降は仕事
    • プライベートの学びは大学の授業を中心、それがないときは私的なインプットをする
    • ポモドーロテクニックを使って、 7 pomodoro はこなせるようにしたい
  • 一方で家族や健康は犠牲にしない
    • 家族関連のイベントが最優先
    • ディープ・ワークと仕事を終えたら、だらだら「ながら」で勉強したりしない
    • BMI が 18 を切っているので、食の見直しと筋トレで体重を 5kg 増やしたい

参考

知識の棚卸しにあたっては、以下の記事を参考にした。