It's okay to be weird

レールの無い道を行くプログラマーのブログ

お子がもうすぐ生まれる予定なのでルーチンを見直した

あと数ヶ月で初めての子どもが生まれる予定だ。自分の過去を振り返ると奇跡に近いことだなぁと思う。ここまで繋いでくれた色んな人に感謝。

さて、そうなると使える時間がかなり変わってくるだろうから、それに備えてルーチンを見直した。

まず、体力と精神面での健康が大事になってくるだろうから、運動をしっかりやっていく。
朝の出勤前の30分程度の散歩は継続できているので、あとはそれにプラスしてSwitchでのエクササイズをやる。
リングフィット アドベンチャーとFit Boxing 2の両方をやってみたけど、短時間で済むし、クリアという目標があるリングフィット アドベンチャーを中心にひとまずやっていこうと思う。

夜に風呂をわかすタイミングをキューにしてやろうとしていたのだけど、夕食を食べた後は1日の疲れでどうしてもダラダラしてしまい、気力がわかず習慣化できなかったので、朝やることにする。
ただ、朝は出勤前の勉強時間に充てているのでどうしようかと考えていたところ、妻に日ごとに勉強と運動を交互にすればいいんじゃないとアドバイスをいただけた。

というわけで、朝のルーチンとして、月・水・金は勉強、火・木は運動って感じにしようと思う。土日は朝たっぷり時間があるので、両方やる感じ。

勉強の内訳としては、平日は数学、土日は技術という感じ。数学は1年ぐらいで高校3年の範囲を終わらせようかとも思っていたけど、焦らずのんびりやっていこうと思う。

こんな感じで設定してみたが、思った通りにいかないことが多くなるとは思う。
そんな時でも、1度きりの生活をどうせなら楽しんで過ごしていきたい。

『Clean Coder』を読んだ ― ボブおじさんに学ぶプロの職業倫理

ソフトウェア・エキスパートであるRobert C. Martinことボブおじさんによる『Clean Coder』を読みました。

この本の原著がリリースされたのは2011年と結構前なのですが、具体的なプログラミング手法などではなく、プログラマーの働き方について書かれた本なので、今でも十分に読む価値はあると思いました。

序章で以下のように書いてある通り、本書は各章でボブおじさんの失敗談が書かれたあと、それを受けてプロはどうあるべきかが書かれているという構成をとっています。

本書は、私の間違いの一覧であり、これまでの悪事の記録であり、私と同じ道を歩まないための指針であると考えていただきたい

プロ意識とは自分で責任を取ることに他ならず、コミットメントを安易にしないことや、言う必要がある場面ではノーと言うことなどの重要性が説かれています。

特に印象的だったのがプロの労働倫理として、雇用主のために働く週40時間とは別に、自分のキャリアを強化する週20時間を作ろうと書いてあることです。会社で働く時間とは別に学習する時間をそれだけ用意するということです。
これは賛否両論ある意見だと思いますが、本当のプロになるにはそれだけの覚悟が必要なのだということなのだと思います。
ここのところ向上心がそれほど持てず、ぬるま湯に浸かりつつあった自分にはハッとさせられる考え方でした。

他にも目次にある通り、コーディング、テスト駆動開発、練習といったコーディングについての話や、受け入れテスト、テスト戦略といったテストについての話、時間管理、見積もり、プレッシャー、協力、指導・徒弟制度・職人気質といった仕事全般の話について広範囲に書かれています。特にPERTといった見積もりについての話は失敗しがちなので参考になりました。

ボブおじさんの半世紀近い経験を元にしたプログラマーとして働くことのエッセンスが込められた本でした。
僕も一人のプロであるということを忘れず、日々の行動を見直していこうと思いました。

2022-02 振り返り

2022年2月の振り返り。まだフォーマットが定まってないので適当に。

技術

Go 周り

  • Effective Go
  • Go Code Review Comments
  • Go Test Comments
  • Practical Go: Real world advice for writing maintainable Go programs
  • エキスパートたちのGo言語

この辺りを読んだ。

Go はシンプルな言語とはいえ、やはり良いコードを書くには色々と覚えることがあるなと思った。
Effective Go みたいに公式のプラクティス集がまとまっているのは有難い。

機械学習

  • Kaggle Learn - Intro to Machine Learning
  • Kaggle Learn - Intermediate Machine Learning
  • Coursera - Machine Learning

Kaggle の 30 Days of ML というチュートリアル集をやって、Coursera の Andrew Ng 先生の Machine Learning を少し進めたが、機械学習に行くまでに最低限の数学をちゃんとやっておきたいなとなってストップした。

しばらくは機械学習には触れずに数学をやっていこうと思う。

数学

  • 長岡先生の授業が聞ける高校数学の教科書
  • Khan Academy

高校数学レベルの数学を学ぶにはどれが良いのかなぁと色々探った結果 Khan Academy をやっていたのだけど、同じことを違う動画で何度も説明したり、途中の計算が丁寧すぎたりとちょっと退屈だったので、 reddit などで評判の良かった Serge Lang の Basic Mathematics という本で学んでいくことにした。

評判がすこぶる良い MIT OpenCourseWare のLinear Algebra を受講することが目標。

プリンシプル オブ プログラミング

t-wada さんも良書と言っているので気になっていたこの本をようやく読み始めた。

各原則が短くまとまっていてとても良い本。出典なども書いてあるので広がりもありそう。

少しずつ読み進めていこうと思う。

WEB+DB PRESS Vol.127

リファクタリング特集は面白かった。凝集度と結合度、いつも理解が曖昧なのだけど、結構シンプルに考えることができるのだなと分かった。

趣味・娯楽

ゲーム

ゼルダの伝説 ブレス オブ ザ ワイルドを進めている。自由度が高すぎてどこに行けばいいか難しい。そして死にまくり。オールタイムベスト的なゲームなので、じっくり大事に攻略サイトを封印して進めようかと思ったけど、レシピとか分からんやろって感じなので解禁して進めている。

映画

ゲーム・ナイト、フリー・ガイ、地球外少年少女を観た。

結婚生活を描いた映画で検索して見つけたゲーム・ナイトがなかなか面白かった。レイチェル・マクアダムスやっぱ良いなと思った。

楽器

Beginner to Badass を進めていたが、スラップのところでうまくいかずに停滞してしまった。

発表の機会もなく、一人で黙々とだとモチベーションがなかなか続かないので、コロナの状況下が明けてバンド活動とかがしやすくなった時に楽器はやるかなーと思い始めているところ。

まとめ

Go 周りを学びつつ、機械学習のための数学を何で勉強していくか定まってきた感じ。

プライベートの勉強は数学をメインにして、その傍らで技術書を少しずつ読み進めていくスタイルで進めていこうと思う。

私生活も色々と忙しくなってくるので、楽器はいったん置いておくなど、やることは絞っていく方向にしていく。

2022-01 振り返り

振り返りは大切ということで、今月から月単位での振り返りをやってみる。日記を書くのは続けるのが難しそうだが、月ペースなら楽そうってのがある。
学生時代はブログで勉強の振り返りをやっていたのだが、これからは勉強以外も含めた総合的な振り返りをやっていこうと思う。

というわけで振り返る。

読んだ本

The Go Programming Language

去年6月に読み始めて、"8. Goroutines and Channels" まで読んでいたのだが、長いこと積まれていて気持ち悪かったので、エイヤとそこから最後まで読み通した。

この本はCSチックで骨太な本で、全部理解しようとするとかなり腰を据えて取り組む必要があるので、8章からは、後で「あそこに書いてあったな」ぐらいのインデックスを貼る意味でほとんど見出しだけ追うみたいな読み方をした。 こういう読み方はあまりしてこなかったのだが、じっくり読んでも結局内容を忘れることが多いので、このような必要ドリブンな読み方もしていきたいと思う。

インターフェイスについての詳細など、Goを真に理解する上で大事なことが書かれている本ではありそうなので、腕を上げた後でまた読み返したいと思う。

長岡先生の授業が聞ける高校数学の教科書

今年は数学をやっていくぞということで開始。数学1 第1章 数と式を終えたところまで40ページ進めた。

このペースだと数学Cまで全て終えるまでに2年ぐらいかかってしまうので、もっとペースを上げていこうと思う。
この教材は音声講義が入っている本で、とても興味深い話が聞けるのだが、全部聴いていると時間がかかるし、既に一度4年ほど前に数Cの途中まで進めてはいるので、音声講義は本を読んだだけで理解できなかったところだけ聴くようにする。

早く高校数学を終わらせて最終目標の機械学習に進みたいと思っている。が、積み上げる学問なので、慌てずじっくり理解していく。

趣味・娯楽

映画

『レディ・バード』、『サイダーのように言葉が湧き上がる』、『浅草キッド』、『朝が来る』を観た。

『レディ・バード』は難しい時期の女子高生の成長物語。前々から観たかったのだけど、母との絆などとても良かった。女性視点だとまた違って見えるのだろうなぁ。

『浅草キッド』も人情溢れる良い映画だった。あまり昔は良かったというのは好きではないのだけど、その時代を一生懸命に生きた人たちがいたのだなぁと心揺さぶられた。

ベース

楽器をやるとなったら毎日練習したりしていたのだが、色々やることがある中でなかなか厳しいので、楽器は緩く週末だけやる感じにすることにした。

BassBuzzというサイトのBeginner to Badassを進めている。
これも1回途中まで進めていて、以前はModule 10まで終えていたので、ざっと復習をしていてModule 07まで終えたところ。
まずはこのコースをしっかり終えて、色々曲を覚えていきたい。

ゲーム

Oculus Quest 2でHalf-Life: Alyxを遊んでいる。弾が少ないゲームで操作も慣れないのでなかなか難しい。これを遊ぶと他のVRゲームが遊べなくなるとさえ言われるゲームなので、じっくり楽しんでクリアしたい。

まとめと今後

結婚したり、年初だったりと、気づいたら終わっていたという感じの月だった。

2月はもっと落ち着くと思うので、数学にどっぷり取り組んでいきたい。
引き続きGoのスキルも上げたいので『Effective Go』、『Go Code Review Comments』、『エキスパートたちのGo言語』、『Go言語による並行処理』と読んでいく。
同僚に刺激を受けてKaggleを始めたのでそちらも進めていく。

やってくぞー。

2022年抱負 - 数学と機械学習、楽器をやっていく

紅白の藤井風さん、とても良かったなーと思いつつ、恒例の年初抱負を書いてみる。

技術

今年は私生活が忙しくなりそうなので、プライベートの時間でやる技術は思い切って絞ってみる。

新規にやること

数学

プログラマーとして社会人になったけど高校数学を1から独学しているを書いた時に勉強して以来、約4年半ぶりのチャレンジ。前回は長岡の教科書2+Bを終えたところで止まってしまったので、最低限高校数学までは履修したい。海外の教材も選択肢に入れて勉強していきたい。

機械学習

何のために数学を学ぶかというとこれ。
仕事を通じてある程度Webアプリケーション周辺のプログラミングは慣れてきた感があって(もちろんまだまだな部分がとても多いのだけど)、何か新しいことにチャレンジしてみたいと思ったというのが動機。
その時に思いついた技術として、ブロックチェーン、XR、機械学習があった。
ブロックチェーンはまだ自分の頭では本当に実用的なのか判断が難しく様子を見たいと思い、XRはまずコンシューマーとして遊んでみたいと思った。
最後に残った機械学習は既に十分に実用されていて、これからも必要になる技術だろうと見たのでやってみることにした。 Kaggleみたいなコンテストがあり、ゲーム的に学ぶこともできそうと思ったのも理由。極めるのが難しそうなのも難しい物好きな自分には合っていそう。
これをどう仕事に活かすかとかは考えてないが、知的好奇心頼りに進めていくつもりだ。

引き続き

Go

去年は自分の中でGoの年と言って良かったと思う。引き続き業界全体としても、自分の周りでも、主要な言語として使われていくであろうから、1.18のキャッチアップや並行処理の勉強などやっていこうと思う。

その他

あとは業務効率化をミッションの1つにしているチームに所属していることもあり、Slackの新機能がかなり気になっているため、そこに使用される技術であるTypeScriptとDenoも追っていきたいと思っている。

趣味

楽器

楽器をやっていきたい。紅白の藤井風さんを観て改めて思った。
色々やっていきたいが、昨年末のサカナクションのライブで間近に見た草刈愛美さんがかっこよかったので、まずはベースにしようと思っている。
去年ストラトを思い切って買ったが眠らせてしまっているので、ギターもやっていきたいところ。ギター1本で人前で披露できるのはとても良いので、弾き語りできるようにもなりたい。となると高い声が苦手なのでボイトレも必要そう。
コロナの状況しだいで教室にも通ってみたいと思っている。何かの教室に通うという体験はしばらくやってないので良いのではという期待から。島村楽器だと年1でホールでの発表の機会があるとのことなので気になっている。

XR

技術のところでも触れたが、XRの可能性を探ってくために色々触れてみたい。Quest 2は昨年末に買った。まずはValve Indexを買ったのにすぐ売っ払って未クリアのHalf-Life: Alyxをクリアしたい。

まとめ

こんな感じだろうか。
やることは最小限に、あまり根を詰めずに余裕のある豊かな日々を送れたらと思っている。

いい年にしていくぞ。

2021年振り返り

恒例の年の振り返りをする。なお2016年から続けているようだ。けっこう続いている。

抱負の振り返りから。
2021年抱負に書いたことを振り返っていく。

技術

  • TypeScript
  • React
  • Next.js
  • Docker / Kubernetes
  • Go (余裕あったら)

結果的には余裕あったらとしていたGoを一番書いた年だった。業務で主に書いた言語だったし、個人的にも初めて自身のOSSプロダクトをリリースしたりした。
DockerとKubernetesについては同僚のakht氏とちょろっとやったが中途半端に終わった。
TypeScriptはほとんど触らなかった。ReactやNext.jsといったフロントエンド技術にも触れることはほとんどなかった。

仕事

  • 等級上げる

半期ごとの評価なのだけど、上半期に上げることは叶わず、現在下半期の評価待ちとなっている。

色々

  • 毎月1記事のペースでブログを書く

数えたらこの記事を含めずに丁度12記事書いていた。ということで達成。

  • お気に入りのキーボードを見つける

REALFORCEなど試したものの、家の机のスペースの関係などでMacBookの内蔵キーボードに戻ってしまった。M1になってからはバタフライではなくなったことで余計に気にならなくなった。
ただ分離キーボードの方が肩に良いということを聞くので、まだ探すのを止めたわけではない。けど沼っぽくて足を踏み入れないでおこうという気持ちが強い。

  • ギターで弾ける曲を5曲増やす

他にもやることがたくさんある中、中途半端にできない性格のせいで楽器は全くやらないと決めてしまった。ただ音楽ってそういうものじゃ無い気もするので、気が向いた時にジャガジャガやるのもありかと思ったりして、来年は再開しようと思っている。

  • お金周りの勉強(貯金以外の資産運用の手段を増やす)

これはちょこちょこ始めている。手始めにふるさと納税はやった。忙しくて手を出せなかったけど、来年はつみたてNISAを始めてみようかと思っているところ。

  • 体重を理想体重まで減らす

4月ごろまで順調に減っていたのだが、5月ごろから順調に増えてプラマイゼロになってしまった。来年はちゃんと運動して痩せたい。

  • 健康に気をつける

人生で初めて受けた人間ドックの結果はあまり良くなかった。ここも来年はもう少し頑張る。

  • 周りの人を大事にする

これは仕事、私生活含めてけっこうできたのではと思っている。そもそも交友関係の少ない方だし、少ない人を深く大事にする方が自分には合っているようだ。

まとめとして、

前年はインプットの年にしたので今年はアウトプットやっていく。

と書いていたのだが、Fukuoka.goでは登壇できたし、OSSプロダクトを出したりして、十分アウトプットをやっていけたのではと思っている。

あとは個人ブログに移行したりISUCONに出たりが大きなイベントだったように思う。

ここでは詳しく書けないが、業務と私生活の両方とも精一杯やって、個人的には人生で一番頑張ったし、一番充実していた1年だったように思う。大変なご時世ではあるものの、その中で工夫して楽しく過ごすことができた。丑年36歳、年男Man of the yearとして十分な1年を送ることができた。

こうやって充実した日々を過ごせたのも関わってくださった周りの方々のおかげである。
いつもありがとうございます。今年もお世話になりました。良いお年を。

初めてのGo製CLIツール作成、初めてのOSS公開に込められた物語

この記事はGMOペパボエンジニア Advent Calendar 2021の15日目の記事です。

昨日はToshifumi Tsutsumiさんの入社から一年、ペパボはどうですか?に答えるでした。
ペパボにいるとインプット、アウトプットが出来てる方々の集まりで本当に刺激的ですよね。…そして、評価資料がんばりましょう。

さて、今回、記事にするのは掲題の2つの「初めて」についてと、作成したGo製CLIツールの紹介です。
2つの「初めて」とは、1つ目はGo製CLIツールを自分で作成したこと、2つ目はそれをOSSとして公開したことです。

What is takolabel

まず、そのGo製CLIツールについて紹介します。

tommy6073/takolabel
https://github.com/tommy6073/takolabel

名前はtakolabelと言って、GitHubのマスコットであるOctocatがタコとネコの合体であることから(割と安易に)takoを、ラベルを操作するツールなのでlabelを取って、takolabelと名付けました。
後になって英語圏の人に伝わりにくいかもと少し後悔していたりもしますが、Kubernetesなんて名前のソフトウェアがあるぐらいなので良いかなと思ったりしています。

このツールが何をやってくれるか短く言うと、「複数のGitHubリポジトリに渡ってのラベル操作」です。
例えば、A、B、Cというリポジトリがあって、X、Y、Zというラベルをそれぞれのリポジトリに一括で作成したい、といった時にそれを実現してくれるというものです。YAMLにリポジトリとラベルを指定して操作します。GitHub Enterprise Serverにも対応しています。

ここでは、なぜそのようなツールが必要になったかについて説明します。

ツールが生まれたきっかけ

このツールが生まれたきっかけとしては、私が所属しているGMOペパボ ホスティング事業部 ISR (Internal System Reliability) チームにて、運用業務のコスト可視化というタスクがありました。
前提として、GMOペパボ ホスティング事業部では全パートナーが割り当てたタスクをGitHub Issues上で議論や過程を記録しながら進行させるのが基本になっています。そういうことから、コストを可視化するためにはIssue上で分類や消費時間を記録すれば計測できるのではないかとチームで話し合われました。
その結果、サービスや用途ごとに異なる複数のリポジトリにGitHub Issuesに計測用の分類、消費時間を表すラベルを貼った上で、Google Sheetsにエクスポート、それをさらにGoogle Data Studioに取り込みレポートを作成するという仕組みを実現しました(こちらについては別に改めて紹介できたらなと思っています)。
その過程の、GitHub Issuesにラベルを貼るという作業を手動で行うのは大変なので、それを自動化するために生まれたものです。
最終的には、思った通りにラベルを複数のリポジトリに一括で作成することができ、ツールとしての役目を無事果たすことができました。

Goについて

なぜこのツールにGoを選んだかということについては色々とありますが、ホスティング事業部として今後バックエンドを中心に採用していく言語であること、実行ファイルがシングルバイナリであることからCLIツールとして適していること、個人的に学んでみたい言語のリストに入っていたこと、が挙げられます。

結果として、ツールの作成を通じてDXとして非常に満足のいくものがありました。
まずは言語の売りである簡潔性がとにかく素晴らしいです。学習にかかる時間がかなり少なかったですし、覚えることが少ない分、コードも読みやすく仕上げることができます。
良く言及されるエラーハンドリングも個人的には何も苦ではない感じです。
IDEとの親和性も高く、ツールチェインについてもシンプルで、言語としての完成度の高さを嫌というほど実感しています。

そういうわけで、これから自分で書いていくプログラムで採用していくことも増えていくだろうなと思っています。CLIツール以外でも使ってみたいですね。
色んな言語を使ったり学んできて、使う言語にこだわりのない方なのですが、この言語については惚れてしまいました。

あとはGoルーチンを使った並行処理の強みについてはまだ活かせていないので、その辺りも勉強していきたいと思っています。

OSSとして

2つ目の初であるOSSとしてですが、こちらは主に2人の会社の先輩に助力をいただきました。

まずは、Fukuoka.go#17での発表でも触れましたが、CIフレンドリーなDBドキュメントツールであるtblsを代表プロダクトに持つk1lowに、環境変数の命名や設定ファイルの書き方といった点を中心に、様々なアドバイスをいただけました。このプロダクトを社内Slackで公開した時に、「え、めちゃいい!」と言っていただけたこと、非常に嬉しかったです。

次に、チームの先輩である、お手軽にTLS証明書の情報を引けるcertを作ったgenkiroidには設計のアドバイスをいただきました。現在のコードの状態を見て、自分ならこうするという例を提示していただき、責務の分離や構造体の定義、関数とメソッドの使い分けといったことを教えていただきました。仕事上でもいつも的確な意見をいただけていて、私の中でロールモデルな存在です。

お2人とも貴重なプライベートの時間を使ってプロダクトを見ていただいた上で助言をいただけて、最高の福利厚生だなと思っています。いや〜ほんとありがたいです。この場を借りてお礼させていただきます。

takolabelのこれから

そんなtakolabelですが、現在のところ必要ドリブンで、ラベルの作成、削除、空にする、という3つの操作ができるにとどまっています。これからも操作を拡張したり、使いやすくしたり、リファクタリングしていけたらと思っています。

もちろんPull Requestsもお待ちしております!

まとめ

この記事を通じて、1つの小さなプロダクトにも、物語があるのだということを感じ取っていただけたらなと思います。
そして、Goで書くことも、自身のOSSを持つことも、自分次第でなんとでもなることだと分かり、挑戦して良かったなと思っています。こうしてAdvent Calendarのネタにもなっていることですしね。

Who's next?

さて、明日のGMOペパボエンジニア Advent Calendar 2021の16日目の担当はAkihito Ikedaです。
彼はISUCON11でISUCONに初参加した時の盟友です。何を書いてくれるんでしょうね。楽しみです。