seri::diary

日常

cでwebサーバを書き始めた

趣味でcでwebサーバを書き始めた。 8月末ぐらいからちょっとずつ作業を進めていたのだが、とりあえずhtmlファイルをレスポンスするところまでは実装できたのでgithubに公開した。

github.com

名前の由来は旧日本海軍が第二次大戦時に開発したオートジャイロの名前を拝借した。何となく、サーバー系プログラムには空を飛んでる何かの名前を付ける習慣があると思っているのでその習慣に倣ってみた。

書き始めた理由は今年開催のいくつかのカンファレンスでOku Kazuhoさんのhttp2のセッションを聞いてhttp2の実装に興味が湧いたからなのだが、それ以前にhttpもよく分かってない。ということでhttpの勉強も兼ねてまずはhttp1.1サーバを書いてみようと思った。また、せっかく新しいものを書くなら使ったことがない言語にしよう、ということでcで書くことにした。あとパタヘネ読んでたら低レイヤーを触れる言語を1つはちゃんと書けないと理解できないことが沢山あるという危機感を感じたという理由もある。

今はまだhtmlファイルしか返せない(.htmlか.htm以外の拡張子を指定すると415を返す)し、 ../../tmp/hoge.html みたいなパスにアクセスされると一発でアウトみたいなセキュリティホールだらけなのだが 、一般的な静的ファイルを置いて使う程度には困らない程度のものに仕上げたいと思っている。実装予定のfeatureはREADME.mdに記載した。

あとcのノウハウが全然ないので手探りで書いてる感が半端ない実装状態である。char配列のバッファサイズとかかなり適当だし、どういう時にmalloc使うべきでどういう時に配列使えばいいかもよく分かってない。どう最適化すればよいのかも併せて勉強していく必要がある。あとMakefileも適当に書いているしgccのオプションも言われるがままにホイホイコピペしてきたものである。とりあえずgdbデバッグするために-g o0 は付けているが、これもホントはmake debug みたいなdebug用taskに分離して置いた方がいいのだろうか。周りにcでプロダクト書いてる人がいないのでこの辺の知見が得られなくて中々に辛い。

余談だが、趣味プロダクトが一つでもあると心が落ち着くというか、仕事で辛いことがあったり退屈していても、家に帰ってからあのバグを直そうとかあれを実装しようというポジティブな予定が持てて、精神衛生上良いのでオススメである。

自分にはもう一つの趣味プロダクトslidesearch.jpというwebサービスもあるので、こちらについてもたまにrailsとかgemのバージョンを上げたり細かいバグを直したりという作業を日課としている。大したUIはないのだが、自分の勉強のためだけにフロントをangular2で書き直してSPAにするかとか色々考えている。

周囲からの期待値を自分で決めて自分で動くということ

今の会社に入ってから新たに増えたタスクとして、「周囲からの自分に対する期待値を自分で決めて動く」というタスクがある

今までの会社でいえば、「お前に期待することはこういうことだから」というのを教えてくれる人がいた。その上で自分がやりたいことを踏まえてどういうことをやっていくかを決定してきた。 だから周囲の期待値は何となく見えていたし、自分でもそれについて納得しながら仕事をしてきた。言い方を変えれば「走るべきレールが決まっていてその上でいかにパフォーマンスを出すか」ということに集中していた。

それが今の会社では、誰もレールを引いてくれない状態になった。これは会社の方針として開発チームに意図的にマネージャーを置いていないからなのだが、この状況に当初は戸惑った。 自分の期待値は当然伝えられず、何をすべきか分からず、何を期待されているかすら分からず、さらに言えば、何故自分が今の会社に採用されたのかすらわからなかった。(一応聞いてはみたが、まぁそこまで自分である理由はなかった。)

ということで、「どうすれば自分がこの会社で価値を発揮できるか?」を自分で考える必要が出てきた。

入社して最初の3か月でやったことは、サーバーサイドチームの開発体制の見直し。 デプロイ頻度の固定化、相互レビューの導入、エラー監視のためのBugsnag導入、CircleCIの導入、定例ミーティングの導入、Hubot導入などなど、これまでいた会社でやってきて上手くいったことを導入して足場を整える仕事を中心に行った。「誰かにやれ」と言われたからやったのではなく、「今これをやれる知識があるのは自分しかいない」という自己判断の元行った行動である。誰も文句は言わなかったし、多少抵抗があった項目もあるが説得して導入していった。今でも適宜チーム内で話し合ってやり方は都度見直している。

serihiro.hatenablog.com

また、もう一つの自分の役割として「コードの品質を担保する」というのがあると思っている。スタートアップならよくあることなのだろうが、今までスピード重視で書かれてきたコードベースは必ずしも綺麗ではなかった。Rails純正の機能を使えば解決できることを自前で処理していたり、そもそも問題を抱えたまま運用していたり、課題を結構抱えていた。

しかし、それは「課題」として認識されていないものが多かった。要するに、それを「課題」だと気づける人間がいなかった。自分は気づける人間だったので、その課題を直していくことが自分の役割だと今も考えている。

普段やりたくてもできないタスクを1日かけて消化する「改善部」イベントを企画してrubocopを導入したり(もちろん.rubocop.ymlは意味のある指摘だけに絞るようにいじり倒した上で)、普段からコードベースをいじるときに既存のコードでリファクタできるところはリファクタし、新規に書くコードは後から入ってくる人が真似したとしても負債が残らない、変なコードにならないようにすることを第一に考えてコードを書くようにしている。

レビューは自分一人だけでやってる訳じゃないのですべてのコードを見られる訳ではないが、自分がレビューするコードはなるべくそういう観点で見ている。もうスピードだけでコードを適当に書き殴ってプロダクトを作っていいフェーズの会社ではないからだ。ユーザーが増えるにつれて安定稼働への責任に重きをおく必要が高まっている。もちろん、この認識は自分がセールスやサポートの人と話をしていて思っているだけであるが。

今のところ、普段のタスクをやりつつ上記のようなことを念頭において仕事しているが、今のところ誰からも「それよりこういうのやってよ。」「お前最近価値のある仕事してないよ。」と言われることはないので周囲からの「実際の期待値」も「自分が考える周囲からの期待値」とそこまでズレてないようだし、自分の仕事はそこそこ会社に貢献できているのではないかと思っている。 この辺も誰からもフィードバックをもらったことがないので分からないが、とりあえず誰かから何か言われるまで、あるいは自分の仕事が意味がないと自分が感じるようになるまでは、今やっている草の根活動を続けようとは思うし、今後も必要そうなタスクが見つかったら開発チームに提案して自分でやってみようとは思う。

VP of Engineeringみたいなポジションの人がいる規模の開発組織だと、この一連の作業はそういうポジションの人がやるんだろうけど、ウチみたいなスタートアップにおいてはまだ自律的に各メンバーが考えて行動する必要がある。自分は少なくともそう考えているし、他のメンバーもそれぞれ必要だと思うことを自律的に考えてやっている節がある。どこまで今の体制で開発チームがスケールできるか分からないが、少なくとも自分で何が必要かを考えて動くというのは、自分の経歴としても良い経験だと考えているので、とことん必要なことを考えて自律的に動いてやろうと思っている。

転職にまつわる昔話

  • この文章は、昔某サービスで書いていた日記を改めて読んでみたら結構面白かったのでそのサービスが無くなる前にこちら転載したもの。
  • 一部修正済み。

こういう話、する相手も居ないけど自分の備忘録代わりに書いておく。

時は新卒で、SIerでSEやってていた頃。

なんとかして「エスイー」から「エンジニア」になりたかった俺は、片っ端から面接受けまくっていた時期があって、その中にはエンジニア派遣の会社もあった。正社員として雇用しつつも実質的には派遣、みたいな。社名は控える。

んで、書類送ったら普通に面接に来いと言われたので行った。

これこれの理由でエスイーからエンジニアになりたいんですよねぇという話をしたら、「そんな大手に勤めてるのにプログラマになりたいの?変わってるねぇ」と言われた。まぁそうだよね。下流に降ろうとしてるし、給料も下がるの覚悟な訳で。

その面接はなんか適当に終わって、その次は部長クラスが出てきた。

したら開口一番

「私、御社(自分の当時の勤務先)と仕事させて頂いてますよ」

まぁそうなるな。大量に派遣使ってる上流エスアイアーなので。

それはさておき、わたしゃエンジニアになりたいのですよ。

「うーん。紹介できなくもないですが、ホントに作業みたいな感じですよ」

構わんよ。コードが書けりゃ。

「うーん。。そうですねぇ。でもかなり貴方だとオーバースペックかも」

でもXXXのYYYでしょ。悪くないと思いますが。

「うーん。場所もZZZ県ですし。いや、いいとこですけどね。会社からも近いとこにマンション借上げしてますし。」

良さそうじゃなイカ

と思った矢先

「でも私はおすすめしません」

マジかよ。

「今日私はseri_kさんと話してね、思ったんですよ。あなたのような人と直接仕事がしたいって。だからこの仕事は紹介したくないんですよ」

わしゃヒラのエスイーで、外注手配する部署じゃないぞ。。。

「seri_kさんは今の仕事に非常に悩んでるみたいですが、それは仕事に真剣に向き合っているからだと思いますよ」

人材会社らしいことをおっしゃる。

「だからもっかい考えてください。今日は結論を出しません。」

ということで終わってしまい、その後自分でも考え直して、時間がかかっても普通に正社員としてjoin出来るクチを探そうと思い直して自分から辞退した。

なお辞退するために送ったメールの返信でも「賢明な判断だったと思います」という返事をくれた。

それ以来、その部長クラスのオッサンとは一度も会ってないが、適当な担当者が面接していたら自分は今頃ZZZ県でYYYの開発しかできないオッサンになってたかも知れないしワープアになってたかも知れない。

安易な選択をせずに考え直させてくれたあのオッサンには感謝している。

あの人からしたら、ひとりでも多く派遣の頭数を揃えてクライアントに紹介出来た方が良かったはずだ。

しかしそれをせず、自分にとって結果的に良い選択をさせてくれた。

社会に出てから何度かこういう不思議な出会いがあったが、全く知らない人に対しても気をかけてくれることもある、という人の業の深さを知ったはじめての出来事だった。

キャリアを積み直せ

あまり過去を振り返って後悔していることはないんだけど、一つだけあるとしたら高校時代に将来の職業について何も考えずに大学を選んだことである。

某大学農学部に行ったのは、前提として高校を出たら国立の大学に行かないと親が許さない状況(考えてみれば姉二人は私立だったのだからおかしな話だ)、しかし興味のあることが生物ぐらいしかない。じゃあ農学部か、ぐらいの感じであった。結果としてどうなったかと言えば、卒業研究でリンドウの花弁の画像計測+判別分析を用いた予測モデルの構築という今の機械学習への興味に繋がる貴重な経験はできたのだが、結果としてそれを元に就職するほどの学術的知見はなく、SEとして就職してその後サービス開発屋になって現在に至る。

これまでのキャリアに何も不満はない。SIerで新卒入社→事業会社に中途入社というのは、数年前に流行ったSEのキャリア転換の典型そのもので、自分のキャリアは客観的に見ればうまく行っているのだと思う。幸いにして、現在は転職時にこちらが会社を多少選ぶくらいのことはできるぐらいのスキルも身についた。

悪くない。しかし、自分がここまでスムーズにキャリアを積めた要因は、これまで周囲から言われた評価を統合すれば、結局のところ「よく働く」以外の何者でもなかった。 単に会社員として優秀、というもの以外の何者でもない。実際、エンジニアとしてのスキルは非常に平凡で優れているとは決して思っていない。 エンジニアリングだけで見れば自分より優秀な人はたくさん見てきた。自分には、言ってしまえば、既存のフレームワークの上でビジネスロジックを実現するだけのスキルしかない。言語やフレームワークを乗り換えることはできる。むしろ得意な方だが、ゼロから何かを実装するスキルはない。だから誰かが作った環境の上に乗っかるしかない。ついでに言えば結局webアプリケーション以外の実務経験はないから知識が酷く隔たっていることも自覚している。

今の職場環境を考えれば非常に贅沢なことを言っているのはわかるのだが、今はそれが今後のキャリアにおける最大の不安である。結局のところ自分のような会社員として評価されるような人間はマネージャーになるしかないと薄々感じているが、正直に言えば「会社員として優秀なエンジニア出身のマネージャー」で終わりたくないと感じている。

今はエンジニアとして本当に難しい問題を解決する力が欲しい。最近、仕事でもパフォーマンスが問題になっている箇所について取り組んでいても、効率のいいデータ構造もアルゴリズムも知らない自分にはマシンリソースを増やすことで力技で解決することしかできないケースが増えている。費用対効果を考えたら時間をかけるよりマシンリソースを増やすことで対応する方が良かったりするのでビジネス的には間違ってないかもしれないが、永遠にマシンリソースを増やしていくことが本当に正しい解決策なのか。本当はもっと優れたアルゴリズムを書いて解決できそうな問題もあり、実際社内では将来パフォーマンスが問題になりそうでなんとかして書き直せないかという議論が度々起こるメソッドがある。しかし自分にはそれを解決できない。

上記を踏まえた上で、今年に入ってからもう一度本当に「エンジニアとして」のキャリアを積み直すために動いている。具体的にはこのブログでも何度か書いてるが、具体的にパタヘネ本とその他資料で大学のCS専攻の学部卒業と同レベルの知識を積み直す。だいぶ忘れている高校数学をやり直す。(今は数ⅡB辺りか。この辺の勉強方法についても別途記す)TopCoder,Hackerrankの問題解きつつアルゴリズムについて勉強する。昔とった杵柄、機械学習をゼロから勉強し直す。データサイエンティストになるつもりはないが、今関心がある大量のデータを効率的に処理する処理、及びそこから必要な知識を得てデータを活かすことをスキルとする場合において機械学習は必須であると考えた。また、機械学習と統計の違い、ディープラーニングとNNの関係すらちゃんと理解していないエンジニアが多いということに最近気づいたので、まだこの分野では頭一つ抜けるチャンスがあるのではないかという打算もある。

その先に何があるか。独学では正直限界があるのと、時間が十分に取れないということから、一度サービス開発屋としての仕事から離れて時間を取って勉強したいと考えている。具体的には大学院進学を真面目に考えている。問題は果たして金銭的になんとかなるのか?というのと、卒業後にちゃんと再就職できるかという点。この2点については今後対策を検討していく。幸い、前者については試算した限りでは今のペースの貯金で数年貯金すれば学費を払いつつ引っ越しもしつつ2年間無職でも食いつなぐことができそうな目処が出ているので、どちらかと言えば問題は後者か。

普通30にもなれば結婚して家庭を持って、そんな大きなチャレンジはできなくなる年齢かも知れない(でも最近は晩婚化進んでるしそうでもないか?)。幸い自分には今は仕事しかない。仕事しかないのなら、できるところまで突き詰めて生きていくしかない。

会社で朝活を始めた

一人でも相変わらず何か勉強的な何かを続けてはいるのだが、社内slackで朝活の機運が高まったのでオフィスで朝活をやることにした。毎週水曜日の朝9時から10時まで。

朝活といっても今の所はただ集まって各々がやりたいことをするのみに留まっている。自分はひたすら高校数学の問題集を解いていた。他の二人はhackerrankの問題を解いたり朝lintをしたりしていたようだ。参加者も自分を含めて3人しかない。いつ無くなるかも分からない。人が増えればなにかテーマを決めてLTをする時間を取ってもいいかもしれない。

仕事以外のことをする時間を取ることが今の自分には必要だと感じる。仕事だけをしていると人生が不安になる。今後何をして生きていけばいいのか、もはや分からなくなりつつもあるのだが、仕事だけではなく何か一心不乱に取り組めるものがあると救われる気がしている。今の自分にとってそれがCSだったり機械学習だったり数学だったりギターだったりする。

やる気がしない時

どうしようもなく仕事したくない時もある。明確な理由もないのだが(多分)、まぁそういう時もあるということだろう。

それでも明日は月曜日だし会社には行かなくてはいけない。けれども行きたくない。

それでも大体仕事に行けてしまうのは出勤のための準備と通勤のための移動が作業興奮につながって意外となんとかなってしまうとかの体の仕組み的なものもあるだろうが、なんとなしにもうそういう儀式を経て仕事に向かうことが習慣化されていることによる「慣れ」の方が大きいんだろうなと思う。考えてみれば「朝起きて決まった時間に決まった場所に行く」というのは小学校の頃から続けている訳だ。

話を戻すと、目の下の問題は明日は月曜日だが会社に行きたくない。パタヘネ本を読みながらアセンブラを書いていたい。データサイエンティスト徹底入門を読みながらRをいじっていたい。線形代数の参考書を読んで手で問題を解いていたい。

そんな時どうするか。自分の場合

  • 機械的に手を動かせばいいレベルまでタスクを明確にしてから着手する。仕事が終わったらさっさと帰ってやりたいことをやる。
  • 全然関係ないことをする。最近はジムに通っているのだが無酸素運動有酸素運動の両方をそれなりにやって肉体的に疲労させると気分は幾分かマシになることに気づいた。
  • やる気がでない理由を論理的に考えて原因を突き止める努力をする
  • やる気が出るようになるまでダラダラ仕事して待つ

これらのことを試す。そうするとある程度はマシなレベルにまで戻る。

いきなり何を書いてるんだという話だが、別にうつ病とかそういうものではなくて単純に日曜の夜だから憂鬱になってるだけじゃないかという説もある。

最近忙しかったのでKPTした

4月末~6月上旬までかなりタイトなスケジュールのプロジェクトを担当していたのだが、そろそろ終わりが見えてきたので個人的な仕事の進め方に関するKPT

Keep

  • 1番リスクが大きくて難しい所の作業を1番最初にやることで心理的な余裕が確保できた
    • 他のタスクも優先度の高さと技術的難易度を優先して進めることであとで設計を見直したりする余裕を確保することができた
  • 労働時間を延ばさないと間に合わないことが分かっていたが、終業を延ばすのではなく始業を平均2時間ほど早めて対応した
    • AMはmeetingが殆どないので集中して作業する時間が取れたので1日全体で見たときの作業効率がかなり高まった
    • 終業を延ばさなければいけない場合であってもAMに貯金があるのであまり終業は遅くならなくて済んだ日が多かった(退社時刻は平均して21時前後、1番遅い退社が23時過ぎだったと思う)
  • 色々あってプロジェクトの途中でリリース時に積むべき機能量の折衝をしないといけなくなったが、他のメンバーが判断できるレベルの十分な説明はできた(と思う)
    • プロジェクト始まる前にこれができればbetterだったが今回は色々あったので仕方がない

Problem

  • 5月中旬ぐらいまではうまくやっていたがその辺りから精神的・肉体的に疲弊してミスが増え生産性が落ちた
    • 「ちょっと疲れてきたかな?」と思った辺りで無理をしない、疲れを残さない対策を講じるべきだった
  • プロジェクトの全貌を掴んでいない状態から作業に入ってあとから出てきた追加タスクにうまく対応できなかった
    • 「ちょ、それもやるの!?」みたいなのがいっぱいあとから出てきたが、これは自分ではどうにもならなかった気もするが今考えたら早い段階でプロジェクトの全体像を全員が正しく共通認識として持つように提案をすべきだった
  • プロジェクトの目的とスケジュールがなぜ決まっているのかを正しく認識していなかったので感情的に納得できないまま自分が作業しておりストレスを感じながら作業していた(プロジェクト序盤
    • 最初に聞いておくべき。自分が入社する前から存在していたプロジェクトで回りは暗黙の了解みたいなので知ってたようだが、それを知ってそうな人全員に問いただせばこの辺は分かったはず。

Try

  • 自分が理解できてきない部分はプロジェクトが動き出す前にステークホルダーに確認すべきだった
    • とはいえ、仕事なので理解できなくてもやらなくてはいけないケースもある。そこは大人になって対応したい。(とは言え今回は自分が入社前から決まっていたことなので特殊ケースだと思う)
    • こういう事態を防ぐためにもプロジェクト発足時から積極的に不明なことはクリアにしていくようプロダクトマネージャーやプロジェクトマネージャー、経営陣に働きかけていきたい。
  • どんなに余裕がないときでも適度にサボる
    • 仕事しすぎた
    • 仕事しすぎると生きてるのが楽しくなくなって「なんで生きてるんだっけ?」「自分ってこの会社で何がしたいんだっけ?」的な哲学的なことを考え始めて時間を浪費してしまうのでよくない。
  • 自分が忙しいからといってイライラしない
    • ごめんなさい
  • 自分がだけがつらいと思わない
    • 考えてみれば今回のプロジェクトは色々あって関係者全員が何らかの形で辛かったのではないかと思う
  • リソース不足かどうか?は常に気を配り、足りなくなる前にヘルプを出す
    • 今回は割とギリギリのタイミングでヘルプを依頼して間に合った感じだがもっと早くヘルプの声をあげていても良かったのではないかと思う。
  • プロジェクトの進め方についてよくないと思う部分は積極的に改善案を出す
    • 全くの新機能が追加された上にサーバサイド、ios、webの整合性を完璧に取った状態でリリースしなければならないプロジェクトはまだ会社としても経験値が低い。やり方は都度考えていく必要がある。