seri::diary

日常

業務でコードを書く機会または時間が得られない場合の対処法について

これは何か

  • ソフトウェアエンジニア職(マネージャ職は含まない)として雇用されているにも関わらず,様々な理由で業務としてプログラミングができない状況に陥る期間がまれに*1存在する.
  • 本エントリでは筆者が考えた対処法を記す.

コードが書けない状況

  • 機会がない
    • 関わっているプロジェクトが何らかの要因により停滞しておりコードを書く必要のあるタスクが発生しない.リファクタリングやライブラリのバージョンアップ等をして時間を潰していたが大体やり尽くしてしまった
  • 時間がない
    • 実装しようとしている機能設計に関する議論が紛糾しており,他メンバーからの懸念を払拭するために検証作業を大量にやらなければいけない
    • documentを大量に書かねばならず,コードを書いてる暇がない
    • project management業を任されており,社内外の調整業務に忙殺されている
    • 大量のミーティングへの出席を要求されており,ミーティングそのものと付随する作業で1日が終わる
    • 日々障害対応に追われて1日が終わる
  • コードを書かないで検証する時間が長いプロジェクトに参加している
    • 自分の場合1カ月ぐらいECS上で検証して実現可能性を調査しないといけないプロジェクトに参加したことがあり,この期間はコードは環境構築のための簡単なシェルスクリプトぐらいしか書かなかった.
    • その他にも長期の障害調査,サービスのmigration作業,documentation作業にかかわる場合も該当する.

大雑把な対処法

  • 機会がない
    • 他の同僚のヘルプをしに行く
    • 埋もれているチケットを発掘して勝手にやる
    • CI/CDを改善する*2
    • 重そうなSQLを探して修正するもしくは当該のcolumnにindexを貼る*3
    • typoを探して直す*4
    • コメントの誤字脱字を直す
    • 使われていない定数・関数・クラスを発見して削除する*5
    • 使われていないテーブルを発見して削除する*6
    • 古いsyntaxで書かれている箇所を直す*7
    • コードを読みまくって少しでも気になる所のリファクタリングをする*8
    • プロファイリングしまくってボトルネックを探し出し取り除く*9
    • 「いつか使えると思うっす」とか言ってライブラリを生み出す*10
    • 社内で使っているが自分が気に入らないツールを勝手に置き換える or 書き換える*11
    • Dockerで動いてないものをDocker上で動くようにする
  • 時間がない
    • 誰かとタスクをシェアしてコードを書く余裕を作る
    • 急いで目の前のタスクを終わらせてコードを書く時間を捻出する
    • 自分が不要そうなミーティングは参加を断って出席しない*12
    • 残業してコードを書く時間を捻出する
  • 仕事でコードを書くのを諦める
    • 仕事を急いで終わらせてプライベートでコードを書く時間を最大化する*13
  • その他
    • 直属上司に相談する
    • 直属上司がだめなら上位上司に相談する
    • 他のマネージャに仕事をもらえないか相談する

*1:もしくは頻繁に

*2:経験上特にデプロイ周りは改善の余地が多いことが多い

*3:たくさん見つかると無限にやっていられて楽しいしweb applicationのレイテンシ改善効果が高い

*4:英文法の誤りを直してもよい

*5:たくさん消せると気持ちいい

*6:削除して問題が起きると怖いのでリネームして様子を見るだけでもよい

*7:かつてrspec2系で書かれたspecを全部rspec3系のsynctaxに直したことがある

*8:リスクが低いコードから少しずつやる

*9:以外と変なところで重くなっているぞ

*10:前職で暇だった時に2週間かけてJSONを生成する謎のDSLを書いたが誰にも使われなかった

*11:まずは長年メンテされてない社内ツールのような,皆の関心が低いものを狙う

*12:「あいつはそういう奴だ」で許される空気を作ろう

*13:悲しいけどこれが一番楽な気もする

outputは最大のinput

outputがないとinputできない

仕事でも勉強でも、日々何かをinput ∈ {調べる, 勉強する, 調査する, 聞いてみる, まとめる, やってみる} しないといけないケースが多い。今は学生なので日々やってることの9割はinputである。

ただ、他の人はどうかは知らないが、自分にはoutputのイメージがないとinputが続かないという問題がある。outputのイメージがないと途中で迷走してやる気がなくなってやめてしまったりすることが多い。

例えば「とりあえずScala勉強してみよう」みたいなのがすごく苦手で、具体的な成果として何をoutputするかが決まってないと続かない。例えば「とりあえずPlay Frameworkのチュートリアルやる」みたいなのがすごく苦手で、大抵途中で飽きてしまう。「今度Play使ったプロダクトの開発するからPlayチュートリアルやってCRUD一式を持つweb appを自分で作って概要を知る」とか、「こういう設計をしたいけど分からないので類似プロダクトのコードを読んで設計を理解して自分のプロダクトに反映させる」みたいな感じでないと続かないタイプである。

なので何も考えずに勉強するだけ、というのもすごく苦手である。そのため、今取ってる講義は全部何らかの応用目的があるものだけに絞っている。とりあえず直近で使わないものは全部「競プロに使えそう」ぐらいなのだが、それでも「ただ単位のため」という目的しかないよりは遥かにマシである。

ささやかでもoutputしながらinputする

自分が普段採用しているスタイルはこれである。*1 以下は研究室で使っているpukiwikiに自分が調べたことをまとめているページである。 基本的に備忘録としてoutputしている感じだが、それ以外にも研究室の定例ミーティングで進捗を報告するときに「XXXについて調べました」というような報告をするときに、当該ページのURLを貼って報告する、という使い方をしている。

f:id:serihiro:20180602091248p:plain

あと今気づいたがMPIとかBLASみたいな、個別の研究に影響しない一般的な内容についてはあとで編集しなおしてQiita辺りに投稿してもいいかもしれない。

同様に論文も要約を書きながら読んでいる。

f:id:serihiro:20180602092142p:plain

論文をまとめるフォーマットはいろいろあるのだが、とりあえず自分の場合は以下のようにまとめている。

  • 3行でまとめると
  • この論文が批判していること
  • この論文の貢献
  • 以下要旨(ここはフォーマット決めてない)

f:id:serihiro:20180602092545p:plain

*1:もちろん具体的なソフトウェアを書くことがoutputの場合もあるが、直近だと具体的なブツが公開できてないので今回は説明を割愛。

健康面で気を付けていること

台風がいくつか過ぎ去ってようやく秋らしくなってきた気がする。
そのせいか身の回りでは体調を崩す人が多い。自分も微妙に体調が悪い日はたまにある。

20代の頃ならば何も考えていなくても体調は崩さないし、崩したとしてもすぐに治るから普段から気に掛けてはいなかった。しかし自分の場合、30歳になったのを境に、急に体調の治りが悪くなった。一度体調を崩すと同じ症状が最低2日は続く。頭痛、睡眠障害、異常なだるさ、消化器官の不調、あと典型的な風邪の症状。「あ、ヤバイな」と思った時にはそこから数えて最低2日は同じ症状が続くようになった。認めたくはないが、自分も老化という現象が自己主張をし始める年齢に来たのだなと思う。

これはいかんなと思って体調をようやく気遣うようになり、最近は周りが風邪引いたりしている中であっても体調を維持できている。備忘録として何に気を付けているか書き記しておきたい。

睡眠時間の確保

適切な睡眠時間については諸説あるが、自分は眠りが浅い日が多いのでその分時間でカバーできるように7時間半~8時間は寝るようにしている。具体的には23時ぐらいに寝て6時30分ぐらいに起きるのを標準としているが、コード書いてたり本読んでたりすると気が付くと日付を過ぎていることもあって、寝る時間はマチマチだったりする。それでも睡眠時間はできるだけ一定時間を確保できるように、なるべく早く寝ることに努めている。

睡眠時間よりも起床時間の方が重要だという話も読んだことがあるが、平日の1日を通してみると前日の睡眠時間が不十分だと明らかに日中に眠くなり、パフォーマンスが低下するため、どちらかと言えば睡眠時間の確保を優先していることが多い。

suimin-supple.com

運動する

とか言いつつ10月入ってから仕事の関係で一度もやってなかったりするのだが(よくない。。)、ジムで筋トレとジョギングを週1ぐらいでしている(た)。本当は毎日やった方がいいのだが、英語とか数学とかその他技術書読む時間を夜に確保したい関係でなかなか毎日は難しい状態である。

社会人になってから運動しなくなったという話以前に、そもそも大学入学以降は普段から全く運動などしていなかったのだが、30代になるとその弊害が顕著に出てくるらしい。なので30代になってから運動するのは結構必須っぽい気がする。*1運動の効果は言わずもがなだが、一番大きいのは体を動かすことでストレスが解消できる点だと思う。

この稼業は基本1日中座りっぱなしで、その上ストレスフルな状況に1日中晒されているので仕事終わりには相当ストレスが溜まっている状態になっていることが多い。
1日に受けた体と精神へのストレスはその日のうちに解消できるのが一番いいはずで、それを行う上で軽い運動をするのが一番効率がよいのではないだろうかということで、今後も続けていきたい所存。

野菜を意識して食べる

意識しないと肉ばかり食べてしまうので意識的に野菜を取るようにしている。

コンビニとかスーパーの出来上いのサラダばっか食べてて、本当はそれも添加物と残留農薬だらけであまり良くないんだろうなぁと思うが背に腹は代えられぬ。 一人暮らしなので個々に野菜買ってサラダ作っても食べきる前に野菜が傷む問題がどうしても解決しないので諦めている。

あとはまぁ添加物使ってないと主張する体に良さげな(オーガニックとかエスニックとかっていう冠詞がついた)店舗で食事をするとか。実際自分は週に1回はランチにサラダがやたら多いランチコースがあるアジア系料理のカフェで食事をしている。

あと野菜不足を補うためにベジールという野菜ジュースを定期購入して飲んでいる。これも効果があるかどうかは定かではないが一応飲み続けている。

www.oisix.com

瞑想

サーチ・インサイド・ユアセルフを読んでから習慣的に瞑想をするようになったが、果たして体調にまで効果があるかはよく分かっていない。

しかし、1日にあった出来事を振り返るための時間を強制的に取れたり、高ぶった感情を鎮めるため(まぁ仕事でイライラしてると結構眠れないものである)という目的においてはかなり効果があると感じる。

イライラしたらなぜイライラしているかを考える

自分の体はどうもストレスに弱いらしく、ストレスフルな状況になると体調を崩しやすくなる傾向にあるようだ。 なので、ストレスを強く感じてるなーと思ったらなぜストレスを感じているのか?を考えるようにして、できるだけ明確にするようにしている。

やり方として、今不満に思っていることをeditorでも紙でもホワイトボードでも何でもいいので書き出してみて、それを眺めて根本の原因を突き詰めていく方法を取っている。大体10個ぐらい書き出せばまぁ何となく原因らしいものは見えてくるので、それは解決すべき問題かどうか、そもそも自分に解決できるのかどうか、どういうやり方で解決するか、というのを考える。

この作業の結果、具体的な解決策が見いだせればそれを実行するし、自分の力ではどうにもならんなと思ったらまぁ諦めてしまうことにしている。仕事のストレスの原因のうち殆どは後者で、どうしようもなく遠い所で発生している問題が、たまたま担当者として自分の所まで降りてきただけだなということがよくある。

自分をほめる

これもストレス緩和のための施策の一つだが、ほめるのである。31歳のおっさんが、自分を。考えただけで気持ち悪いだろう。

でも自分をほめられるのは自分だけなのである。仕事や趣味の活動で他人にほめられた経験なんて殆どない。誰かをほめたことはあるが、それによって相手が満足したかどうかは定かではない。しかし、自分であれば、自分の行動を検証した上で納得のいく評価ができる。その上で、よくやったなと思ったら自分で自分をほめても良い、ということにしている。

ここまで書き出してみて我ながら気持ち悪いことしてるなぁと思うが、実際そうでもしなければやっていけないし、自分を褒めて、例えば本を一冊買うことを許可するとかSteamでクソゲー一本買うのを許可するなんてのは安いもんである。 いくら社会のために仕事をしているという大義はあっても、それを感じられるのは本当に稀である。めちゃくちゃ大変なプロジェクトを何とか達成したとしても必ずしもそれが客観的な評価につながることは稀である。でも一方で、検証した上で自分なりに評価されてもいいと(もしくは評価されるべきでないと)判断することはできる。

自分の一番の理解者は自分なのであると思う。だから、ほめるべき仕事をしたなぁと思ったら自分で自分をほめてやることにしている。結局、歳を取れば取るほどポジティブに自分を明示的に評価してくれる他人がいなくなっていくのが人生というものなのだろうとも最近思うようになった。*2 ちなみにこんな本もあるらしい。まだ読んでないけど。

併せて読みたい

眠くならない飲み物の摂取の仕方が参考になった。

blog.satotaichi.info

*1:のでジム通いは再開したい

*2:ドラえもんも「大人ってかわいそうだね。自分より大きなものがいないもの。よりかかってあまえたり、しかってくれる人がいないんだもの。」と言っていた。

Bluetooth + ノイズキャンセリングなヘッドホンBackBeat PROが良い感じだった

この記事は今年買ったもの Advent Calendar 2015の18日目の記事です。

今年買ったノイズキャンセリング+ワイヤレスなヘッドホンBackBeat PROがかなり良い感じだったので紹介します。

f:id:serihiro:20151217185115j:plain

なぜ買ったのか

  • 片道2時間という長時間通勤をするようになり、以下の問題が発生した
    • それまで使っていたワイヤレスイヤホンのバッテリー2時間では足りなくなってきた
    • 周囲の騒音に晒されている時間が増えてイヤホンだけではしんどくなってきた
  • バッテリー持ちの良いイヤホンを新調してもよかったが、もともとノイズキャンセリング商品に興味があったので買ってみる良いチャンスだと感じた

どうやって選んだのか

  • ノイズキャンセリングヘッドホンの売れ筋価格帯である2万円前後の商品はコード付きが多かった
  • しかし電車の中で使用する以上ワイヤレスがいい
  • ノイズキャンセリング + ワイヤレスでそれぐらいの価格帯だとソニーMDR-ZX770BNが2015年7月当時話題になっていてレビューがメディアに多く掲載されていたが、「品質は価格相当」「ノイキャン+ワイヤレスなら許せるレベル」みたいな論調が多く、どうも微妙な気がした(店頭で試したわけではない)
  • そんな時にBackBeat PROのレビューをたまたま読んだ所、音質もノイキャンの性能も悪くなく、バッテリー持ちは24時間あってヘッドホン使用時にもボタン一つで外部マイクをオンに出来たりとか色々通勤時に便利そうな機能があったので、思い切って購入した。

どこで買ったのか

Amazon

使ってみてどうか

価格は約3万円とソニーのMDR-ZX770BNより1万円弱高かったが、それ相応の価値はあると感じた。

  • 音質は3万円のヘッドホンの音かというとその辺は微妙だが、少なくとも電車での通勤時は問題なく使用できるレベル
  • ノイキャンはかなり優秀で、特に電車に乗っている時の低音をかなりカットしてくれる。電車に乗っている時にノイキャンをOFFにするとそのギャップにびっくりする
  • バッテリーの持ちは非常に良い。往復で4時間使ってもバッテリーは半分も減らない。また、3時間ぐらいの充電でフル充電できる。
  • 操作もシンプルで使いやすい。

気分が落ち込む原因と対策

こういうのブログに書くのどうなんだろうなって思ったのですが、後から読み返した時に何らかの役に立つかも知れないし、別にさらしてもまぁ問題はないだろうということで書いてみます。

概要

  • ここ2ヶ月ぐらい(今年入ってから?)気分が非常に落ち込んで何もやる気がでない日が週に1日~2日ぐらいあってあらゆるモチベーションがなくなって困っている
  • よくよく考えると色々自分の生活に問題がありそうだったので改善するようにした
  • 油断すると簡単に再発しそうなので日頃から気をつけたい

気分が落ち込む原因と考えられる生活習慣と対策

1日中誰とも会話しない(改善済み)

  • 独身リモートワーク生活だからしょうがないとか言ってる場合じゃない
  • ハングアウトで必ず毎日誰かと話す。最近は幸いにも業務で毎日Mtgが入って沢山会話できるようになって楽しい
  • コンビニの店員とか郵便局の局員とかだれでもいいので無駄にフレンドリーに接してみるだけでも大分違う
  • リアルで人間と触れ合うのはすごく大事!人は1人では生きていけないのだ!

毎日同じ食事メニュー(改善済み)

  • 忙しいのと寒くて外に出るのが億劫になるとなりやすい
  • 朝・夜は仕方ないケースがあっても、昼はできるだけ毎日別のものを食べるように心がける
  • 昼食というイベントを用意して「毎日何がしかイベントがある」という状態を保つだけで日々に張りが出る
  • 前職でも忙しい時に毎日コンビニばかり行ってたら毎日同じような感じになって辛い気分になった記憶がある

1日中外に出ない(改善済み)

  • 忙しいのと寒くて外にでるのが(ry
  • コンビニでもなんでもいいから毎日外に出る
  • 時間がなければ近所を歩くだけでもする
  • とにかく外に出よう!

運動不足(WIP)

  • 川崎に住んでた頃はほぼ毎日ジョギングか散歩していたのを盛岡寒い&雪積もってる&仕事忙しいみたいな理由でサボってた
  • 実際雪積もっててあまり出歩きたくない気持ちが高い
  • 同僚に相談したら「ラジオ体操いいですよ」というので毎朝ラジオ体操始めたら非常に調子が良い

ぶっ続けで仕事してしまう(WIP)

  • つい仕事し過ぎて気が付くと23時とかよくあってそういう日が続くと段々疲れが溜まり続ける
  • 適当なところで休む、サボる。オフィスで働いていた時はおそらく1日30分は同僚と雑談していたが、それがなくなるとエンドレスで仕事しがち
  • 「早くやらなきゃ」という強迫観念を感じ始めたら「ちょっと待て、ホントに急ぐ必要あるのか?まったりやってもいいんじゃないか?他にやるべきことがあるんじゃないか?」と自問する

過去の失敗を振り返ってくよくよしない(WIP)

  • 「なんであんなことしたんだろう?」ってなるから

未来のことを考えて不安にならない(WIP)

  • 「大丈夫かな?アハ~ン」不安になるから
  • 今後どうやって生きようとか難しいことを考え過ぎない
  • 最近「自分はどういう風に死ねば満足なのだろうか」ということばかり考え過ぎて自分を追い詰めている

リードエンジニアを3ヶ月やって得た開発マネジメントに関する教訓

ここ3ヶ月ぐらい同じRails案件でリードエンジニアとして仕事をしています。 何気にマネジメント的なことをやるのが初めてだったので色々と戸惑うことがありましたが、だいぶ慣れてきて知見が溜まってきたので、自分のしごとの振り返りも兼ねてまとめておきます。

リードエンジニアのお仕事とは

会社やチームによって全くと言っていいぐらい異なると思いますが、私の場合は以下の様なことをしてきました。

開発スタート時

要件確認

  • 仕様書を読んで全体像やどこから着手するかなどを考える

Railsアプリのベース部分の実装

  • rails new
  • DB周りの設定
  • 初期モデルクラスをDB定義に基づいて作成
  • factoryも使いそうなものについてのみ作成
  • rspecrails_config等諸々の設定
  • ローカル環境動作用のseedsを整備
  • 使いたいGemを追加
  • 共通で使うCoffeeScriptのライブラリを思いつく限り実装
  • CoffeeScriptの実装方針が人によってブレるとイヤだったので早い段階でサンプルになるような実装を入れた

情報共有

  • 開発環境構築に必要な情報をgithubwikiやREADME.mdに記載
  • 連携する外部APIなどを事前に検証し、問題がある場合は関係者に確認して解決して対応方法をwikiに記載

開発中

コア機能の実装

  • ひと通りのControllerとviewを実装してひと通り画面が動くように。細かい調整は個別にissue立ててメンバーに割り振り
  • 要件がふわっとしててクライアントに確認が必要な機能や重たい機能の実装

issue量産

  • 各機能ごとに親issueを切り、それに紐づく子issueを作って管理した。

例: 「A機能」が親issueで「Aデータ登録」「Aデータ編集及び削除」「Aデータ一覧」「Aデータ詳細画面」「AデータValidation」が子issueといった具合

その時description内で #100みたいに親issueのIDを参照させておくと、親issueの一覧に子issueのリストが表示される格好になるので進捗管理に便利である。

  • タスクはなるべく親機能ごとに割り振ったがデッドロックになってしまう所もあってやりながら調整した。

他のメンバーのレビュー

  • Railsのレベルはバラバラだったので、Rails経験が浅いメンバーには「何故こうしないといけないのか?」と細かく説明するコメントをつけるよう心がけた
  • 要件自体があまりしっかり決まっていなかったので、かならずローカル環境で動作させて、動作自体に違和感がないかまで含めてチェックした
  • specが落ちていたらまずspecが通るように直してもらってからレビューした
  • Turbolinksの動作原理を理解していないメンバーが数人いたようなので参考資料を読んでもらうよう頼んだりもした

クライアントとのコミュニケーション

  • 要件で不明確な部分の質問
  • 工数的に厳しい場合の代替案の提案
  • 問い合わせ対応

インフラ作業

  • サーバに入れるのが自分だけだったので追加でimageMagickをインストールしないといけないとか、ステージング環境のログを見るとかは全部自分でやっていた

得た教訓

開発方針を統一できるように最初の段階でサンプルになるような完璧な画面を作ってしまうべき

specをどの程度の粒度で書くか、とかConcernに何を載せるか、といった「決め事」が統一出来ずに開発後半では画面によって大分差が出てしまった。

大体のメンバーは自分が実装した所を手本に進めてくれていたが、それも完璧ではなかったので(例えばValidationは後で実装する、とか書いてたらそれまで真似してvalidation処理抜けの画面が量産されて死ねた)、やはり最初に完璧な手本となる画面を実装してしまうべきだった。

特にRailsだと、この機能はControllerにベタ書きか、それともconcernに切り出すか、みたいな判断基準が人によってかなり差がある。

放っておくとfat controllerになったり機能が重複しまくってたりということがいとも簡単に起きて後で泣きを見る羽目になるので、なるべくそういう事故を防ぐためにも最初にサンプルとなる実装をリーダークラスの人間が実装してしまうべきだと考える。

issueを細かく切りすぎず、ある程度大きいまとまりでどばっと渡してしまうべき

これは完全に失敗だったなと思ったのだが、とある機能の画面で以下のようにissueを分けて、それぞれ別の担当者に振ったことがある

  • A入力画面の細々した修正
  • A入力確認画面の細々した修正
  • A入力プレビュー画面の細々した修正
  • A入力最終確認画面の細々した修正
  • A登録画面の細々した修正

そしたら本来共通で実装すべきユーティリティ系のクラスをそれぞれが別々に実装したり、前後の画面で辻褄が合わなくなって自分が全部調整する羽目になったりと、あとで整合性を取るのに凄く労力を要してしまった。

他にあまりタスクが無い時期だったのと、ベースとなる部分は全て自分が実装し終わっていたので大丈夫かと思っていたが、完全に判断ミスだった。

画面の前後でちょっとずつ実装スタイルが違うよりはA機能全体で統一性が取れていた方がレビューもラクだしコードの変な重複が発生する可能性も低い。

実際、開発後半はある程度デカい機能をまるっと投げて、PRのdescriptionでtaskをチェックボックス付きリストにしてもらってそれを一個ずつ消化してもらうスタイルに変えた。上記の例で言えば「A機能の登録・編集・削除全部」みたいな粒度である。そしたら開発効率も品質もかなり上がったように思う。

開発の進め方は最初にきちんとルール化しておくべき

PR駆動の開発の仕方が理解できていないメンバーがいたりして、まぁそんな初歩的なことを教えるのも失礼だし、慣れれば勝手に他の人に合わせてくれるだろと思ったら、数週間経っても全くPRも作らないしcommitも適当だしみたいなスタイルで開発を進め始めたメンバーがいた。

さすがに一人だけ足並みそろえていないのはまずいので、口酸っぱく「作業が終わったらPRを出してください」とか「commitはもっと細かく入れてください」とか「間違ったcommitが入っていないかチェックしてからPRを出してください」とか言い続けて改善してもらったのだが、これが普段の業務において意外なほど大変だった。

少しイライラもしていたのだが、見かねたマネージャーに「長年やってきた人のスタイルはそう簡単に変わりません」と窘められることもあった。確かにその通りだし、自分もたまたまPR駆動で開発するのに慣れているから出来ているだけということもあるだろう。

そんな訳で、今後は開発スタート時にその辺の教育コストを削減できるように、Githubの使い方やらPR駆動のスタイルなどをまとめたドキュメントを作っておいて、それを最初に参照してもらった上でスタートできるようにしようとしている。

具体的には以下のような感じでまとめていく予定である。

丁寧にレビューすれば人は育つ(と思った)ので時間かけてでも丁寧にレビューすべき

何度もレビューの指摘→修正のやり取りをしないといけないケースもあって、そういう時はさすがに「もうめんどいから俺で巻き取るか」といった感情が芽生えてきやすい。この案件もそういう時が何度もあった。

でも、それをやって自分一人で全部巻き取っていたら開発はスケールしないし、費用対効果も悪い。なのでなるべく「一度指摘したことは2回目以降はちゃんとやってもらいたい」と思い、レビュー時に指摘する時も

「これだとXXのケースで動かないので○○としてください」

だけで終わるのではなく、

「これだとXXのケースで動かないので○○としてください。なぜなら△△で□□でほげほげで。。」

みたいな感じで、なるべく理由もセットで指摘するようにした。

そうすれば似たような場面でも応用効かせてくれるかという期待を込めていたのだが、実際一ヶ月も一緒に開発していると段々と効果が現れたのか、同じ指摘は段々と2回しなくても勝手にちゃんとやってくれていたりというケースが増えてきた。

もちろん変わらない人もいたが、一部のメンバーはちゃんと一度指摘したことを守ってくれるようになったので、レビューする側としてはかなり楽になってきた。

ただ、これらの指摘事項は当然自分自身が実践するべきで、多少めんどくさいからと自分が手を抜いていたら「アイツ他人には厳しくて自分は甘えてんじゃん」ということで効果は半減していたように思う。そういうこともあって、なるべく他人に厳しくする分自分のコードにも厳しい目で実装してきたつもりだが、これは自分自身のトレーニングにもなって良かったと思う。

レビューばかりすると自分の担当分が進まない

PRでレビューを依頼されるとすぐに対応して次のタスクを振りたくなるものだが(少なくとも私は)、レビューばかりしていて本業が進まない、という典型的なパターンに自分もハマりかけた。

これに対する解決策としては以下の様なことで対応してきた

  1. すぐにレビューしなくてもやることがすぐ枯渇しないように常に大量にタスクを積んでおく
  2. 本当にすぐ見ないといけないレビューでなければ後に回す
  3. 自分の1日の作業時間においてレビューに割く時間と作業に割く時間を決めておき、それを守る

一番のリスクは「自分がレビューしないことでそのメンバーのタスクが進まない」というロック状態を作り出してしまうことだが、それを回避する方法としては1が意外と有効だった。

レビューする時間を短縮するというのは品質に関わるので避けた方がよく、どちらかと言えば期限を決めてタスクをどかどかと積んで「上から順番にやっていって~」という風に任せてしまった方がラクだと感じた。

この方法を行うリスクとしては、知らないうちに進捗が悪くなっているとか、間違った設計で実装を進めてしまっているということがあるが、なるべくはやくWIP PRを出してもらうことで大体解決していた。

若者と転職

このエントリーはしょぼちむ Advent Calendar 2014 の21日目の記事です。
前日は @fukai_yasu さんの記事でした(まだ未登録?)。その前は@setoazusaさんのしょぼちむにテストファーストについて説明してみるでした。

しょぼちむご本人とは東京で働いていた頃に3回ぐらいプライベートでお酒の席でご一緒させて頂いたぐらい?の関わりでしょうか。何となくjava一派ということで仲良くさせて頂いていました。

お酒の席ではしょぼちむ氏に「いつ辞めるの?」と転職を持ちかけるネタでいじるのが一部界隈では定番なようなので、「若者と転職」というタイトルで駄文を書かせて頂きます。
しょぼちむ氏の参考になれば幸いです。

概要

私は2014年12月現在で28歳になります。
23歳で社会人になったので社会人としては丸5年半やってきたことになりますが、この5年半で3回転職をしています。
平均すれば1つの会社に1年と10ヶ月弱しか勤めていません。
人によっては「だから今どきの若者は…」と眉をひそめられそうな数字ではありますが、それぞれの転職には私なりの考えがあってのことだったりするので、その辺の考えについて説明しつつ、自分の転職感について述べたいと思います。

自分のこれまで

私の社歴をざっくり説明すると以下のようになります。

  • 2009年4月〜2011年11月 某SIerでSE
  • 2011年12月〜2012年12月 某制作会社でエンジニア兼SEのような何でも屋
  • 2012年12月〜2014年6月 某自社サービス会社で自社サービスの開発エンジニア
  • 2014年7月〜 ハートレイルズwebサービス受託開発エンジニア

過去3回の転職の経緯についてはそれぞれ退職or入社エントリーを書いてるのでそちらを参照ください。

それぞれの会社で働いて得られたものをまとめてみると以下のようになります。

SIer

  • 社会人としての基礎スキル(特に電話の取り方からタクシーの乗り方までビジネスマナーについて細かく叩きこまれたのは後々役に立った)
  • IT全般の広く浅い知識
  • 分かりやすいドキュメントと分かりにくいドキュメントの違い
  • 伝統的な日本企業ってこういうものなのかという知見
  • SI業界の現状と課題
  • Oracleを触る貴重な経験

某製作会社

  • 社員5人の会社で働く経験
  • 「自分1人しかエンジニアがいない」という後がない状況での開発をしたことによる精神的な耐性
  • PHPで何でも作る経験(画面からバッチまで)
  • 謎設計の自社フレームワークに泣く経験
  • 前任者が書いたクソコードと戦う力
  • クソコードからドキュメントを起こして正しい仕様を整理しなおしてバグを直してリファクタリングする経験
  • レコメンドエンジンの知識(代理店販売してたので導入サポートをしていた)
  • Objective-Cを1ヶ月で勉強して初めて作って納品したiphoneアプリがいきなり有料アプリとして販売されるというロックな経験
  • 要件定義〜見積もり〜設計〜開発〜テスト〜納品までを全部一人でやるという全フェーズの経験
  • アメリカ人との英語でのメールコミュニケーション(代理店販売しているパッケージ仕様の問い合わせを英語でやってた)

某自社サービス会社

  • 「システムを作ること == お金になる」が成り立たない世界でのエンジニアの会社への貢献
  • 公開中のサービスを◯◯時間バグらせて放置すると☓☓万円の損害になるというお金の考え方
  • ざっくりとした仕様から自分で必要な機能を考えて作る経験
  • すさまじい無茶ぶりにどうにかこうにか頭を捻って形にしてリリースする経験
  • 営業、マーケティング、運用サポート、経理といったエンジニア以外の色んな職種の人の役割、コミュニケーションの取り方
  • 毎月中途採用社員が10人ずつ入ってくる急成長する企業で働くという経験
  • java
  • struts2
  • spring
  • SAStruts
  • dbflute
  • aws
  • fluentd
  • mongodb
  • solr
  • elasticsearch
  • kibana
  • チケット駆動開発の経験
  • gitでやらかした時にどうにかするスキル
  • コードレビューをする、されるという経験
  • 開発現場から離れた技術サポートの仕事の経験
  • 社内外向けの勉強会を会社のオフィス使って開催してアウトプットする経験
  • 40人が参加する開発合宿を企画運営する経験

3回転職をしてみて思ったこと

最初のSIerについては面白くなくて飛び出した感が強いのも正直な所なのですが、振り返ってみればこれまで務めてきた会社で学びがなかったものは一社もなく、それぞれの企業で自分が出来ることを増やした上で転職してきたのだなと今にして思います。

転職する目的というのは人によって沢山あると思いますが、何にせよ「プラス思考の目的」が無いと上手くいかないのではないかと思っています。

給料が安い、仕事が面白くない、人間関係が悪い、といったマイナス思考の目的だけで飛び出しても、また次の会社で同じトラブルがあった時に対処する術を身につけていないのでまた辞めるしかありません。 Team Geek にも書いてありますが、組織というのは組織の問題を解決してくれる人を求めている訳で、自分が課題だと感じたことにどうアプローチしてきたかという実績が無いと企業から見て魅力的な人材にはなれません。

それは本人にとっても会社にとっても不幸だと思うので、自分は必ずプラス思考の目的が無ければ転職はしませんでした。
プラス思考の目的があれば、直面した課題を上手く解決するモチベーションが湧くか、プラス要素で相殺して我慢できます。 (自分は我慢できないタイプなので大抵課題には口を出してしまうのですが…)

最初のSIerには2年半いて、最初の1年目にして「仕事が面白くない…つらい…」とずっとぼやいていましたが、自分がやりたいこと、目指したいことがはっきりするまで辞めませんでした。 それは前述したように、マイナス思考の目的だけで飛び出しても問題は解決しないし、なんかカッコ悪いと感じたからです。(なお、当時見つけた「やりたいこと」は自分でインフラの面倒もコードも書けるようになってwebサービスを作ることでした)

転職するという行為自体について考えれば、文字通り職場を変えることになるので基本的にリスクが大きいわけです。何度その会社の社員と面接をしても、その会社の空気や思想というのは入社して働いてみないと分かりません。

だから、自分が実現したいことがはっきりとしていて、その会社に転職すれば自分にとってプラスになる、と思えるのであれば積極的に転職すれば良いのではないでしょうか、というのが自分の考えです。

逆に、そういうのが見えなければ転職すべきではなく、するべきは自分が感じている課題を解決することだったり、自分のキャリアを考えることだと思います。

課題を解決するために

いくつか方法があるかと思いますが、自分にとって良かったと思えた方法が、他社の人にその人の会社の状況について聞いてみることです。 隣の芝は青いと言いますが、自分が抱えている問題が自分の組織だけの問題なのか、はたまた他も同じような課題があるのかという判断は社外の人と話さないと区別がつきません。

エンジニアの場合、大抵twitterFacebookやっているので、面識がない人でもコンタクトを取るのはさほど難しくありません。(実際、一度も会ったこと無いのにいきなりDM送って飲みに行って仲良くなったエンジニアが何人かいますw)勉強会の懇親会とかでも良いと思います。

あとは転職エージェントにコンタクトを取ってキャリアについて相談してみるのも良いと思います。自分も2回目の転職は転職エージェントに相談した上で紹介してもらっています。

対象は誰であれ、自分一人で抱えていても仕方がないのでなるべく普段接していない人との接触が重要かと思います。内輪だと大抵愚痴大会になってしまうのでw

自分のこれから

どんだけ年を取っても、自分が手を動かす、あるいは常に動かすことができるエンジニアとしてのスキルと知識を保ち、それらをコアにビジネスにコミットしていける人間でありたいと考えています。

今は自分が持っているスキルを「お客様の事業を行うためのwebサービスの受託開発」という形で発揮し、お客様の様々な事業に関わりながらwebサービスでどういう価値を社会に提供出来るのか、ということについて勉強している最中です。

とにかく案件の数をこなして、

  • それを自分がどれくらいのスピードとクオリティで開発できるのか
  • どう開発したら上手くプロジェクトが回せるのか
  • チームの生産性を上げるにはどうすればいいのか
  • どうやってメンバーのスキルを上げていくのか

ということについての方法を学びたいと考えています。

自分が目指すポジション

ここ5年以内に目指すキャリアパスとしてはエンジニアのマネージャーとしてのポジションを目指しています。プロダクト開発をリードする立場というよりは、チーム内のメンバーのマネジメントをするポジション、のようなイメージです(伊藤直也さん的な?)

ビジネスより技術が好き!でスタートしたこのキャリアですが、結局ソフトウェアは人が開発するものであって、どんな開発現場でも人の問題が絡んできます。社員のほとんどがエンジニアという現職でも人の問題は起きるし、これまでの経験においても人の問題でプロジェクトが上手くいかなかったりしました。

そういう時に、エンジニア間で起きる問題を上手く解決し、適切にリスクを考慮して意思決定をしてくれた人が前職には数名いたのですが、彼らのような振る舞いはどんな開発チームにいっても必要になる振る舞いで、またそれが出来る人が非常に少ないと感じています。 大体エンジニアは自分含めて変な人が多いですし、そういう人の気持ちを理解できる立場でありつつ、上手くまとめて開発をワークさせる仕事はビジネス的に価値があると感じているし、何よりそういう人に自分が憧れました。

そういうポジションで働くことが出来るのが今の会社なのか、はたまた別の会社になるのか分かりませんが、その時はその時で自分にとって最善の選択をしたいと思います。

自分がなりたい自分になるために

これまでの自分の転職の目的は、どれも「自分がチャレンジしたいことをするため」という感じでしたが、それが実現できたのも自分がそれぞれの企業でスキルを磨いてきたからだと思っています。 なんだかんだでエンジニアはスキルが重要なので、やりたいことをやろうと思ったら常に自分を成長させ続ける必要があると考えています。

@kwappa さんの「The Art of Job Hopping」というスライドにも以下のように書かれています。

I'm happy because I could escape
I could escape because trained day by day

日々努力を怠らず、これからも一人のエンジニアとして自分を鍛錬し続けたいと思います。