2018年の振り返り、あるいは2019年の抱負のようななにか

年末年始ちょっと時間ができたので、重い腰を上げて古き良きはてなダイアリーからはてなブログへの移行をやった。 はてなダイアリーはサービス終了しちゃうらしい。データの移行で過去の記事を見たら学生の頃の2005年ぐらいから合計2000記事ぐらい書いてたらしく、最近はちっとも書いてなくて、1年に1投稿ぐらいの頻度になっちゃったけど、むかしは日記ぐらいの勢いで毎日書いてたのを思い出してなんだか懐かしい。 というわけで、この記事ははてなブログ移行後の初投稿である。

で、これを書くに当たり、1年前の新年に書いた振り返り、あるいは抱負のようななにかを読み返してたのだけど、問題意識はあんまり変わってなくて進歩してないのかもしれない。というのが第一印象ではあるが、英語やコードを書いたりする力が突然どうにかなるものでもないので、コツコツ積み上げた分だけは何某か前には進んでるんだろうと思う。

今年は去年よりも子育てに使う時間がさらに増えた。3月まではまだ奥さんが専業主婦で子供の面倒を見ててくれたのだけど、4月から運良く保育園に入れてたので、奥さんも働きに出て共働きになり、子育てと家事を分担してやらないと終わらないかんじで、自分の時間はゼロどころかマイナスである。朝が苦手な自分が6時過ぎに起きて洗濯物を干して、7時に子供を起こしてご飯を食べさせて、着替えさせて保育園に送って、そのあと仕事に行き、仕事から返ってきたら、ご飯を食べて、子供を寝かしつけて、お風呂に入って寝るという生活を毎日繰り返しているなどと想像できただろうか。なんかこんなことを書くと、平凡な生活を送ってるように見えるかもしれないけど、毎日生きるのに精一杯である。平凡な普通の生活は尊い。たまに体調を崩したりして一家が壊滅的な状態に陥ったりすると、毎日の健康に感謝するし、健康であればそれ以外のことは大体おっけーぐらいの気持ちになったし、人生を生き急がずに、人に優しくなった。健康であることに感謝できるようになると、幸せのベースラインがそこなので、大抵のことは残り全部プラスであるというのは発見だ。

英語については引き続き勉強してる。最近は朝の電車でTOEICの勉強をして、帰りの電車で洋書を読むみたいなかんじ。TOEICの勉強をしだしたのはいろんな複合的な要因はあるのだけど、技術文章って文法が単純でこればっかりやっててもビジネスレベルの実務能力付かんなこれって思い、いまのところすぐに転職する予定はないが、子供がもうちょっと手間がかからないようになったら外資系の企業で働いてみたいなと漠然と考えているというのがある。前職をやめたときお金だけがすべてじゃないなーって思ってやめたけど、子供ができるとお金も大事だなーって思うようになった。国内のWeb系企業よりもやっぱり外資系のソフトウェア企業の方が賃金水準のベースが高いってのはある。あと、英語で開発の仕事ができた方が仕事の幅は広がるよなーってのもある。ただ給料に関しては、仲の良い同僚がいっぱいやめちゃった影響なのか(?)さしあたり困らない水準まで上げてもらえたので、いまのところ困らないぐらいにはもらえるようになった。ただ、仲の良い同僚がいろいろやめちゃって、ジュニアレベルのエンジニアが増えて、相対的に古株になってしまい、すごい人みたいに遠巻きに見られるのは個人的にはなんだかなー感はある。マサカリを投げてくるような人もいないし、成長の機会を意識的に社内ではなく自分と社外に求めないといけない。

OSSについては、1〜3月で作ってたtfschemaは寝る時間を削って作ってたけど、4月以降の子供の保育園の生活リズムの変化でそんなこともできなくなった。一方で会社でOSS活動やってみたい人の背中を押すという名目で、業務時間中にOSS活動する空気感を作ることに成功したのはよかった。寝る時間を削るのはつらいし、本業の中で一定やりたいことに時間が割けるように口実を作る活動は大事だ。

あと今年の一番個人的な大きな変化としては、科学的にメンタルを鍛えることに興味を持ったことだ。きっかけはたまたまQiitaの記事かなにかで引用されてた「嫌われる勇気」というアドラー心理学の入門書を読んだことで、アドラー心理学の目的論によると、「自分が変われないのは、変わらないと決心しているからだ」ということらしい。若干文言は違うかもだけど、よーするに変わらない方が楽で、変わらないと決めてるのは自分だということだ。この気付きは直視するのがキツイ。 結果として、怠けてないでもっと勉強せねばと思って睡眠時間を削って、当然の帰結としてちょっと体調を崩した。どうやら私の体は6時間ぐらいは寝ないとダメっぽい。 で、そこから健康のありがたみを再認識し、科学的に最高の睡眠方法と休息方法を学び、マインドフルネスを学び、ストレスを力に変えるためのレジリエンスについて学んだ。 で、いま絶賛読んでる本は「Search Inside Yourself」というGoogle社内のマインドフルネス研修について書いてる本を英語の勉強がてら原書で読んでるんだけど、Emotional Intelligenceこそが2019年の個人的なテーマかなという気がしている。

今年でついに35歳になるのだけど、プログラマを定年する気はないし、マネージメントする気もないし、現場で幸せにコードを書き続けるための何かを探している。幸せっていうのはすごく相対的なもので、事実は変えられないけど解釈は自分次第だ。解釈は自分次第っていうのは、たぶん何者にもなれないだろう平凡なエンジニアとしては、非常に救いのある考え方で、自分が何に楽しみを見つけるのか?その過程も含めて楽しめるようになりたい。そのヒントがマインドフルネスとEmotional Intelligenceにある気がしている。自分の感覚と感情に素直になること、自分が何を楽しいと感じるのか、それはなぜなのか?どうやったら好きなことだけしてたらお金がもらえる状態になるのか?自分を過小評価せず、過大評価せず、正しく自己認識し、自己分析し、自分をコントロールできるようになること。それができるようになるとなんか新しい世界が拓ける気がしている。もう35だけど、まだ35だ。たぶん我々の世代は年金とかもらえなさそうだし、体の動く限りは70ぐらいまでは働いてるんじゃないかなって思うと、まだまだ人生長い。宝くじも外れたので今年も真面目に働こう。

2017年の振り返り、あるいは2018年の抱負のようななにか

去年は子供が生まれて生活のリズムが大きく変わった。待望の子供が生まれたことは素直にうれしいのだけど、エンジニアとして趣味のコードを書く時間などはなくなり、35歳定年説を増々感じるようになった。
さっき1年前の抱負を読み返して、2017年は英語の勉強にずいぶん時間を使ったなと思った。まだ何にもなれていないのだけど。StackOverflowは1000 reputationsを達成してからはちょっとお休みしてる。StackOverflowは英語を書くことへの抵抗感は減らしてくれたが、いかせん回答できる質問を探したり、回答するために調べたり、英語学習という観点だとコスパはそんなによくはない。最近は移動中とかの隙間時間に英語のPodCastを聞いたりするのは継続できていて、それは来年も続けたい。聞いてるのはCHANGELOG.comとかgotime.fmとか。しかしまだ全然聞き取れない。youtubeで海外のカンファレンスの動画見るのはわりと理解できる。やっぱり音声だけど理解できないのは、耳がまだ慣れてないんだろう。家族のこととかを考えるとたぶん海外で働くというのは現実的ではないと思うので、OSS活動するのに役立つレベルの英語力があればよいかなぁというかんじ。TOEIC受けよかなって思ったときもあったけど、勉強のための勉強は続かない気がしていて、やっぱりコンテンツ自体が興味あるものじゃないといけないかなぁと思ってる。
OSS活動に関しては、年の前半は結構頑張ってたけど、子供が生まれてからは全然時間が取れず、最近全然できてない。世の中の子育てエンジニアはどうやって時間を捻出しているのか。最近は短期的な成果は捨てて、時間が取れないなりに個人的に興味のあるTerraformのコアのコードを読んだりしてる。たぶんなんらかのプロジェクトに一定の時間を投資すれば、なにがしかはできるだろうという漠然とした感覚はあるのだけど、投資できる時間の絶対量が減った今、戦略は必要である。ただコードリーディングで学ぶことも多いが、やっぱり書かないと覚えないので、定期的に何かを書くのは継続しないといけない。できればプライベートじゃなくて仕事でコード書く時間を増やしたいのだけど、いろいろな事情を勘案すると、コード書くよりも優先度の高いあれやこれやがあって、なかなか辿り着けない。
話があっちこっちに飛ぶが、最近の体力の衰えもよく感じる。今も正月にお酒を飲みすぎて頭が痛いと思いつつ、これを書いてるんだけど、アルコールの量を飲めなくなったし、消化スピードも遅いし、寝るのが1時すぎると翌日つらいし、ようするにヤバイ。筋トレ的な何かせねばと思いつつ、なかなか続かない。一方インフラの維持管理みたいな仕事は障害対応とかで体力勝負みたいなところがあって、家庭も持ったら増々難しくなる。なので今はそういうスキルを買われているけど、どちらかというソフトウェアエンジニアとしての仕事をできるようになっていかないといけない。というようなことを8月にも書いてたけど、あんまり進歩していない。今の会社の組織的な構造上どうしても自分がインフラの維持管理をせざるを得ないのもあるが、アプリケーションではなくミドルウェアレイヤのソフトウェアを仕事で書いてメシが食える人なんて一握りしかいないんじゃないかという気もする。何者にもなれない平凡なエンジニアは結局は、仕事の時間の一定量をコード書く時間に割り当てて、バランスを取りながらなんとかするしかないんだろう。仕事で求められていることと、やりたいことのギャップはなくなりはしないので、いかにやらなければしけないことをさっさと片付けて、趣味的なことに時間を使えるか。時間がないんじゃなくて作るしかないんだけど、それだけ時間を投資して何をしたいのかがまだぼんやりしている。道はまだ見えない。見えるまでは基礎力を高めるための素振りみたいなのをするのは悪くはない。
考えていることを書き出しながら考えるとまったくまとまらないけど、無理やりまとめると、英語、体力、素振り。

最近考えてること

先日子供が生まれました。めでたい。

というわけで、これからますます、時間の使い方を考えないといけない。
プログラマ35歳定年説みたいなのが言われる理由がなんとなくわかる。まだ35じゃないけど。30過ぎるとみんなライフステージとか仕事とかいろいろ周りの環境が変わっていくんだ。でもマネージメントなんてちっともやりたかないし、自分で手を動かしてるのが楽しいし、生存戦略みたいなのは常に考え続けてる。ネットを見渡してると自分はたぶん一流エンジニアにはなれそうにもないけど、好きなことをやって面白おかしく生きていくために、自分の居場所は自分で作っていかないといけない。家族もいるので今のところ海外で働くつもりはないけれども、エンジニアとしての格というかステージみたいなものを上げるために、英語は避けて通れないという思いは日に日に感じる。

というわけで、最近は空いてる時間の大半は英語の勉強をしてる。読むのはなんとなく意味がわかるけど、聞くのと書くのが絶望的なので、当面はそこに時間を割いてる。自分の場合は話す必要性は今のところあんまりないので、話すのは一旦置いておく。
聞くのはだいたい移動中とか作業しながらとかに英語でしゃべってるIT系のポッドキャストを聞いていて、寝る前にyoutubeで海外のカンファレンスの動画見たりとか、英語学習系のを見てみたりとかで、特にノルマは決めず、気分次第でとにかく耳を慣らす作戦。
書くのはStackOverflowに回答してみたり、洋書を気ままに写経してみたり。StackOverflowで英作文するとよくタイポするんだけど、最近その理由がなんとなく分かってきた。単に小中学校のときに漢字を書くの間違ったのと同じで、圧倒的に書く量が足りてないんだと思う。なので写経は意外と意味あるんじゃないかという気が個人的にしている。量は質に転化する。そのうち。コツコツ積み上げるしかない。

あともうひとつ考えてることは、仕事でGoのコードを書く機会を自発的に作っていくこと。インフラエンジニアという職種自体はそんなにすぐにはなくならんとは思うのだけど、その役割はどんどん変わっていくと思う。既存のソフトウェアの設定を組み合わせてシステムを作るという従来的なインフラエンジニアの重要度は下がっていき、Infra as Code のDSLが書けるだけのエンジニアの知識はすぐに時代遅れになり、クラウドネイティブなピタゴラスイッチを作ってみてもベンダーのふんどしで相撲を取ってるだけで、エンジニアリングとしての価値は低い。結局のところピタゴラなグルーコードのいらないインテリジェントで自律的なインフラを作るために、ミドルウェアレイヤのコードが書けるソフトウェアエンジニアみたいなのが希少価値が高くて、あるものを組み合わせるのではなくて、特定の問題領域に特化したソフトウェアを新しく生み出せる力がインフラレイヤでも相対的に重要度が増してくると思う。ミドルウェアの領域ではまだまだC/C++が現役だけど、最近Goの勢力が拡大してきているので、Go力を高めていきたい気持ち。でも、子供も生まれたし、趣味でコードを書く時間も減るので、仕事で日常的にGoのコードを書ける環境を作るために、仕事で新しく作るちょっとしたツールとかはGoで書いてる。で、汎用化してOSSとして切り出したりしてみたり。やっぱりなんだかんだ言って、仕事と趣味だと仕事の時間の方が圧倒的に長いわけで、趣味だけだと限界がある。なので如何に仕事でそういう機会を作っていくか、そのために普段からどういう仕込みをしておくかが大事。当面の課題は、次に回ってきそうな仕事を予測して、それを趣味的なアプローチで解決できるだけの事前の仕込みをいかにしておくかという戦略なのかな。

最近だとソフトウェアエンジニアリングに重点を置いたSREみたいなかっこいい呼び方があるけど、信頼性を第1目標に掲げる仕事って、かっこいいこと言っても障害コール対応は切り離せないし、そんな仕事があと30年もできるかというとちょっと自信がない。体力でカバーみたいなのって、システムの重要性が増すに連れて期待値が上がるし、非人道的で家庭を持ってるとさらにつらいと思うんよね。そーゆー自己犠牲で成り立つような場所を主戦場にせずに、もうちょっと抽象的なレイヤで仕事ができるようになりたいなと思うのだけど、雑な文章で特にポエムなのでまとまらないけど、そんなことを最近モヤモヤと考えている。

vimからneovimへの移行

vimからneovimへの移行をしてみた。作業メモ。

インストール

$ brew install neovim/neovim/neovim

.zshrc に以下を追加

export XDG_CONFIG_HOME=$HOME/.config

既存のvimの設定からシムリンクを貼る

$ ln -snfv ${HOME}/.vim ${HOME}/.config/nvim
/Users/m-morita/.config/nvim -> /Users/m-morita/.vim
$ ln -snfv ${HOME}/.vimrc ${HOME}/.config/nvim/init.vim
/Users/m-morita/.config/nvim/init.vim -> /Users/m-morita/.vimrc

起動してみる。なんかエラー出た。

$ nvim
/Users/m-morita/.vim/init.vim の処理中にエラーが検出されました:
行  317:
E518: 未知のオプションです: ttymouse=sgr
You need vim compiled with Python 2.6, 2.7 or 3.2 and later support
for Powerline to work. Please consult the documentation for more
details.
続けるにはENTERを押すかコマンドを入力してください

どうやらneovimではデフォルトでマウスをサポートしてるのでttymouseオプションなくしたっぽい
https://neovim.io/doc/user/nvim.html

.vimrc を以下のように修正

if !has('nvim')
  " neovimではデフォルトでマウスサポートしているので不要
  set ttymouse=sgr
endif

あとPythonサポートがないと言ってる。

もともとPowerlineとか入れてた手元のPythonは2系だったんだけど、あとでneocompleteをdeopleteについでに変えようと思ってたのでPython3系を入れておく。

$ brew install python3
$ python3 --version
Python 3.6.1
$ pip3 --version
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)

で、pip3でneovimを入れる

$ pip3 install neovim
$ nvim
Traceback (most recent call last):
  File "<string>", line 4, in <module>
ModuleNotFoundError: No module named 'powerline'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<string>", line 9, in <module>
  File "/Users/m-morita/.vim/bundle/powerline/powerline/vim.py", line 15, in <module>
    from powerline.bindings.vim import vim_get_func, vim_getvar, get_vim_encoding, python_to_vim
  File "/Users/m-morita/.vim/bundle/powerline/powerline/bindings/vim/__init__.py", line 44, in <module>
    vim_encoding = get_vim_encoding()
  File "/Users/m-morita/.vim/bundle/powerline/powerline/bindings/vim/__init__.py", line 25, in get_vim_encoding
    return vim.options['encoding'].decode('ascii') or 'ascii'
AttributeError: 'str' object has no attribute 'decode'
An error occurred while importing powerline module.
This could be caused by invalid sys.path setting,
or by an incompatible Python version (powerline requires
Python 2.6, 2.7 or 3.2 and later to work). Please consult
the troubleshooting section in the documentation for
possible solutions.
function provider#python3#Call の処理中にエラーが検出されました:
行   18:
Traceback (most recent call last):
  File "<string>", line 53, in <module>
  File "<string>", line 40, in powerline_troubleshoot
  File "/Users/m-morita/.vim/bundle/powerline/powerline/lint/__init__.py", line 12, in <module>
    from powerline.segments.vim import vim_modes
  File "/Users/m-morita/.vim/bundle/powerline/powerline/segments/vim/__init__.py", line 16, in <module>
    from powerline.bindings.vim import (vim_get_func, getbufvar, vim_getbufoption,
  File "/Users/m-morita/.vim/bundle/powerline/powerline/bindings/vim/__init__.py", line 44, in <module>
    vim_encoding = get_vim_encoding()
  File "/Users/m-morita/.vim/bundle/powerline/powerline/bindings/vim/__init__.py", line 25, in get_vim_encoding
    return vim.options['encoding'].decode('ascii') or 'ascii'
AttributeError: 'str' object has no attribute 'decode'
続けるにはENTERを押すかコマンドを入力してください

なんかpowerlineがエラーになるなぁ。

このエラー自体は単にモジュールが読み込まれていないだけっぽいけど、powerlineのissue眺めてたらそもそも現時点ではpowerlineはneovimに正式には対応してないっぽい(?)
https://github.com/powerline/powerline/issues/1287

上のissueでpowerlineじゃなくてairline使えって言われてる。
https://github.com/vim-airline/vim-airline

とりあえず無効化して先に進もう

" PowerLine
if !has('nvim')
  NeoBundle 'alpaca-tc/alpaca_powertabline'
  NeoBundle 'Lokaltog/powerline', { 'rtp' : 'powerline/bindings/vim'}
  NeoBundle 'Lokaltog/powerline-fontpatcher'
  let g:Powerline_symbols = 'fancy'
  set laststatus=2
endif

稼働確認してみる。

neocompleteが動いてなさそう。これはあとでdeopleteに置き換える予定なのでいいや。

deopleteの導入
.vimrc に以下を追加

if has('nvim')
  NeoBundle 'Shougo/deoplete.nvim'
  let g:deoplete#enable_at_startup = 1
endif

nvimを起動

$ nvim

:NeoBundleRemotePlugins を実行。

:NeoBundleRemotePlugins

nvimを再起動すればOK。

補完は速くなった気がする。快適。

airlineの導入

.vimrc に以下を追記

if has('nvim')
  NeoBundle 'vim-airline/vim-airline'
  NeoBundle 'vim-airline/vim-airline-themes'
  let g:airline#extensions#tabline#enabled = 1
  let g:airline_theme = 'distinguished'
  let g:airline_powerline_fonts = 1
  set laststatus=2
endif

テーマはどれにするか悩んだけど、distinguishedにするとNormalモードでバッファに未保存の状態でステータスバーの色が変わるので、わかりやすくてよさげなのでこれにしてみた。

Homebrewにコントリビュートした

Golangで書いた社内ツールをどうやって配布しようかなぁというのは悩ましい。一応Rubyの会社なので、全員がGoのビルド環境ない。できればGitHubのReleaseページにビルド済みのバイナリを添付してダウンロードさせたいところなんだけど、プライベートなリポジトリなのでGitHubの認証とかが必要。で、HomebrewにprivateなGitHubリポジトリからダウンロードする機能が欲しいなぁと思って、年末年始にbrew本体のコード読んでたら、なんか行けそうな気がしたので勢いでがっと実装してプルリクエストを投げてみた。メンテナの人にかまってもらって、レビュー指摘もらって、何回かやりとりした末にめでたくマージされた。
New feature: Allow download from private GitHub repository by minamijoyo · Pull Request #1763 · Homebrew/brew · GitHub

自作ツールを黙々と作るのもいいけど、他の人が作ってるツールにパッチ投げるのもよい。今年はコミュ力を上げていきたいのでOSSな活動は継続的にやっていきたい。

2017年の抱負

2016年は以前よりもコード書く機会が増えたり、OSSにパッチを送ってみたりするようになったりし始めたけど、正直まだまだ全然足りてなくて満足してない。

中長期的に見て英語ができないことが活動の範囲や選択肢を大きく制限していることを日に日に感じているので、やっぱりここらで英語をちゃんとやった方がよいんじゃないかと思ってる。というわけで、今年のテーマは英語である。新しいプログラミング言語を学ぶように、英語の文法をちゃんと勉強し直して、毎日何かを書いてみるようにしよう。

あと、最近ひとりで黙々とやっててもフィードバックがないとやっぱり寂しいし、コミュニティとか横の友達を増やしたいなぁとも思う。これは勉強会に行ってLTで発表したりとかで地道にやっていくしかないかなぁ。

やることを決める場合は、やらないことも決めたほうがよいと思う。

とりあえず最近形骸化してきた毎日コミットルールをやめようと思う。ここ数ヶ月Writing Code Everydayを意識してGitHubの芝もいいかんじに茂ってきて、コードを書くことに対する抵抗感みたいなのはずいぶん下がってきたので、一定の成果はあったと思うけど、毎日何かを書くというプレッシャーは、しょうもないREADMEの更新コミットを積んだりしてごまかしたりしている日もあったりして、あんまり本質的ではない日もあった。形骸化したルールは意味ないので廃止する。毎日じゃなくてももっと価値のあるコードを書こう。

もうひとつやめるのは、このブログの毎日更新。これはtwitterが会社の人に監視されているので言いたいことも言えないそんな世の中じゃポインズンって気分になって、ポエム的なことでも書ける場所がよいなぁと思って、ここ数ヶ月書いてて、これも書くことへの抵抗感を大いに下げたことには意味があったと思うけど、毎日分埋めるのに、書けなかった日はあとで思い出して書いたりしてたけど、あとから思い出せないことも多くて、自分で作ったルールで自分がストレスをかんじるとかあんまり健全でもなかった。というわけで、ここも何かポエムっぽいことを書きたくなったことに書くことにする。技術的なメモは引き続きQiitaに書くけど、数日前にちょっと書いたようにQiitaのContributionがいいねになったことはわりと不満で、しばらく英作文の練習を兼ねてstack overflowで遊んでみようかなぁと思ってる。

あと技術的な分野としては機械学習とかAIとかIoTとかフロントエンドあたりは自分で何か形にできる気があんまりしてないので、距離を置こうかなぁとなんとなくぼんやりと考えている。プログラミング言語的にはしばらくGoが手に馴染むようにしたいかなぁ。

とくにまとまらない文章だけど、推敲せずにポスト。コードも文章もアウトプットの瞬発力みたいなのも大事にしたい。

brewを改造してた

社内ツールを配布するためにprivateなbrew tap作ったんやけど、privateなGitHubReleaseページに上げたビルド済みのバイナリをダウンロードしたくて、brewを拡張して独自のDownloadStrategyを実装してダウンロードすることに成功した。これで使う分には十分なんだけど、upstreamにもパッチ送りたいけどテスト書いたりとかもうちょっとやることありそうなのでそれはもうちょいかかりそう。