jestでUnhandledPromiseRejectionWarningが出たら失敗させる
Promiseが未処理だと起こるこれ。
UnhandledPromiseRejectionWarning: Unhandled promise rejection
jestに限らないがこれが出ると原因の特定が難しい。せめて作業中に失敗するのであれば、作業中のdiffを見れば原因の特定が想像つくが、exitcodeが0なのでテストが通ってしまうのでマージされてしまうことが多々あった。なのでこれが出たらすぐ失敗させるようにした。
process.on('unhandledRejection', (err) => { fail(`UnhandledPromiseRejectionWarning: Unhandled promise rejection. ${err}`) })
転職活動日記①
前回、面接大失敗した企業は当然落ちた(笑)。
落ちた反省として、興味のない企業を受けても結局面接で答えられないと知ったので選考する会社をちゃんと選ぶようにした。しかも、仕事の合間に面談は結構疲れる。それから4社に話聞いて、1社だけ受けた。
基本的に上場企業に絞ってるからそこまでハズレはないかなと思っていたが、話を聞く限りやばそうな雰囲気出てる会社は以外に多い。
選考しなかった3社の理由
- 過渡期なので残業は多い
いやマジ何時間働いてるか恐怖でしかない
- フロントエンドの組織をこれから立ち上げる
いやフロントエンドの動きが鈍化してから3年ぐらい立つけど、遅すぎない?
- うちはチーム毎に好きな技術使ってるからスキルある
プログラミングテストがあって受からなきゃ面談すらできない。受かって面談したら「うちは昔から高度なことしてる」とか言わねーし、技術的なこと1ミリも話さないし「うざぁぁぁ」って思った。
超有名企業なので、受けても落ちる可能性は高いし、ちょっと嫌だなと思ったら精神衛生上受けない方が良い。興味ないとはいえ、落ちたらダメージ負うことがわかった(笑)
SIerからWEB志望で転職活動してたときは、めちゃくちゃナメられてたけど、今はほぼ100%書類は通るし対応も良いので変な感じ。たぶんこいつらは人によって態度変えてんだろうなぁ〜ってもの直感でわかる(笑)
残り1社は技術負債は残りつつも、課題感や今後の目標など正直に話してくれて、1万人ぐらいいる企業だから受けてみた。したらわりとあっさり受かった。2社目で受かっちゃったので戸惑ってるが、超迷ってる。
マネジメント志望と伝えてるので、プログラミングができなくなるかもしれない。志望したくせにプログラミングやりたい気持ちは心のどっかで捨て切れてないので、あと3社ぐらい話聞いて結論出そうと思っている。
今になって思うが、結局フリーランスって働き方は、かなり魅力的。
みんなの洋楽ランキングを超絶アップデートした
長かった〜(3週間)
「いいね!した曲の一覧が見れるようにしよう」
とひょんなことから大規模リファクタした。マジ週5で働いて、子育てして夜中やるみたいな感じで超疲労。
もうやるだけやった(迫真)
やったこと(フロントエンド)
webpackを3から4にバージョンアップ
これやらないといろいろあかん。(主にTypescript最新)。webpack4からUglifyEsPlugin
とか使わなくてもminify出来るのでかなりシンプルになったりといろいろ良くなったのでwebpackをゴリゴリに変更した。というのもASP.NET Core 2.1で Reactテンプレート使って作成したもののwebpackやらpackageやらいらないものが多すぎたので削ぎ落とさないとアップデートするのが大変だった。
typescript3.6.3から4.0.3、react 16.9.0から16.13.1へ
今まで地味〜にアップデートしていたのでそこまで苦労せず。
axios導入
ライブラリ使わずにFetch APIを使ってきたのだが、Jsonパースするのにいちいち面倒だったりと使い心地が悪いのでaxiosを導入。インタセプタを使うためってのが一番の理由。Fetch APIにもインタセプタあると思うけど、調べる必要性が感じられず。
redux導入
リアルタイムにいいね !のstateを描画したかったので、この際にredux入れるかぁって感じで導入。最近のトレンドでFluxを多用するのはどうなの?って風潮だし個人的にもそこは同意なので必要がなければ入れないつもりだったけど、1アプリにグローバルな状態は大体必要になる。
ESLint導入
prettierしか入れてなかったけど、どうせリファクタするなら入れるかと思い導入。typescriptにESLint入れるのはちょっと一手間。調べればいくらでも出てくるから良いけど、1から調べるのは仕事じゃなきゃやりたくないなぁ。
any撲滅
と言いながらもESLintルールに"@typescript-eslint/no-explicit-any": 0
が入ってるんだけど(笑)。Typescript信者じゃないし、最近のトレンドについていくためだけに使ってるって感じもあるからルールで縛られなくても良いかなと思って無効化した。とカッコつけたものの、結局はリファクタに心折れたときに無意識に無効化してた(笑)。まぁ、1年振りぐらい見ると本当にわからないから知らない人が書いたコード見るなら型はあった方が良いなぁ〜と思った。過去の自分は他人だと感じた。
ちょっと拘った実装
検索フォームの遅延リクエスト
入力する度にリクエストを投げるといろいろ死ぬので、入力完了を遅延させている。
一般的なテクニックとしてはスタックアルゴリズムで入力時にpush、setTimeout
でpopしていくって感じだけど、それを意識せずに使いたかったのでこんな感じで使えるようにした。結局はスタックを隠蔽して戻りをPromiseにしたってだけだが。300msは人間が入力完了する平均的な時間らしい。
<input onChange={onChange} /> const interval = 300 // ms const input = new Input(interval) onChange = async (e) => { if (await input.on()) { // 入力完了 } }
ローディング
今までは思考停止して
this.setState({ loading: true }) // 通信 this.setState({ loading: false })
って感じだったけどあまりにも冗長すぎるし何よりダサいのでちょっと真剣に考えた。上記のように通信ごとに括ってローディングを設定するのが嫌だったので以下のようにした
<Loading>
// 通信後に表示されるJSX
</Loading>
インタセプタでリクエスト数をreduxで保持、終了したらデクリメント。リクエスト数 > 0であればローディング表示みたいな。
複数のコンポーネントでリクエストが送信されてると詰むので頭の中にある案を実装したかったがやりすぎ感が強いので困ったら考える。本当は最低何msローディングを表示させるかとかオプションあるけど割愛する。
renovate導入→廃止
どうせ動作確認しなきゃだし、いらんな。って感じで廃止。便利そうに見えて全く便利じゃなかった。
やったこと(バックエンド)
Roslynator導入
C#の静的解析はディファクトスタンダードなものがないので、CLIでも使えるRoslynatorを導入。
github.com
う〜〜〜〜ん。。macだとcliが全く使いもんにならん(多分Linuxも)。Windowsであれば良いかもって感じ。現在のC#はWSL2で使い分けるのが楽しい開発スタイルだと思う(※WEBにおいては)。
パッケージはアップデートせず
やったことなのにやってないことを書くのはどうなのって感じだけど、.NET CoreとC#の魅力をちょびっとだけ。基本的に.NET Coreのコアアップデートで破壊的変更は結構少なめ。C#に関しては全くない。とにかくアップデートの容易さとLTSが3年と長期間サポートが魅力。今回、ここら辺の変更がなかったのでフロントエンドに注力出来たというのもある。言語仕様的にもある程度トレンドには乗っかってるし、バージョンアップによる変更がないのでなんか知らないけどパフォーマンスよくなってる的な感覚がある(実際に向上はしている模様)。とにかくライブラリや周辺ツールは貧弱の極みみたいな感じなので悪いところをあげたらキリないが、保守が他言語に比べてほぼないようなもんなのでモダンを維持し続けられるのは最高。ツール郡が貧弱すぎるので、構成するのが難しいのでおすすめは出来ないが、Rails等、フレームワークのアップデートに苦戦してる現場をみてるとやはりそこの容易さは強み。
ステージング環境導入
Azure App Service Linuxの無料プランがあるのでそこにデプロイしてる。releaseブランチにマージされたらステージングデプロイ。masterブランチはプロダクションって感じで。今回、超絶アップデートしたので流石に動作確認は必要だなと思い導入。CIはGithub Action
tekitoumemo.hatenablog.com
やってみて
みんなの洋楽ランキングは5万UU、15万PVで会員数も非公開ながらとそこそこスケールしてるので、継続的なアップデートとバグを生みにくい構成作りが必要なり、60点ぐらいの構成は組めたと思う。あとはテスト系の土台作りとコンテナ化かな。コンテナ化はGCPに移したいからってのがあるが、経費的にもAzureでも安いし大きな問題が起きてないのであと回しに。テスト系はやる気が起きない(笑)2020年はGihub Actionからフォーマッター、静的解析、コアアップデート等土台の再構築をやった年となった。機能的な面では去年と全く変わってないが、まぁ良いでしょう。あとは年末〜年明けに向けてアクセスが増加するので、様子をみつつスケールしていく感じで今年はおわろうかなと思います。
面接まじむずい
前回、昔に受けたかった企業に書類が通ったという内容を書いた(スカウトだったのでほぼ100%通るのだが)。で、面接をやったが、まじでなにも答えられず当然落ちた。落ちた理由は明確で圧倒的に熱量が足りなかった。答えられなかった質問を上げて、答えられない理由を考えてみる。
当社の数あるサービスからなぜ、このサービスを選んだか?
A. スカウトにきた求人がそのサービスだったから。
とは答えられず、「スキルセットが一致した」みたいなことを答えた。他のサービスでも良いのか?って聞かれたから「他のサービスの求人があるのは知らなかった」って答えた。
なぜ、フリーランスをやめて転職するのか?
転職する意思は50%ぐらいで、良いところがあれば程度なので「特に理由は考えてなかった」って答えた。現時点ではこの回答しかないが、もうちょっと言い方があったかもしれない。
弊社に入ってやりたいことはあるか?
これも「特に考えてなかったので、ちょっと考える」と言って、大規模サービスなので安定して機能を提供していきたいと答えた。あなた自身はやりたいことはあるかと深堀されたが、いやっ、ねぇよ。。流石に「特に考えていません」って言った。
弊社に入ってどのようなキャリアを考えているか?
これも超詰まる。適当に開発経験してPMになりたいとか言っておけば良いのだろうか?ぶっちゃけ入ってからロールモデル見つけて、キャリアを考えるものだと思っているからなにも知らない状態では全部嘘になる。結局、大規模サービスなので安定して機能を提供していきたいと答えた。それキャリアプランじゃないからw
総括
圧迫感も全くなく、良い面接してもらえた。最後の質問で「ないですw」って笑っちゃったけど、呆れられながらも嫌な顔されなかったので良い企業だと思う。
やはり熱量が足りない
とにかくテンプレ質問にまったく答えられなかった。今の仕事も自分でアポ取ってこぎつけたりと、より良い条件の仕事を常に探しているだけなのでその仕事でなければならない理由なんて全く考えてなかった。転職とフリーランスで委託先が変わる違いは、マインドが変わるか変わらないかの違いだと思う。フリーランスであれば自分が得することだけ考えれば良いが、転職は自分の利益とどれだけ貢献出来るかを考えなければいけない。テンプレ質問なので、これの解を用意すれば良いのだが、人間って嘘はなかなか付けないものなのでマインドから変えてく必要がありそうだなと感じた。マインド面に関しては、全く良い方向性が見つからないのでエージェントのカンセリングを受けて、思うことがあればまた書こう。面接まじむずい
転職活動中
現在、フリーランスになり3年目。報酬や働き方についてはなにも困ってないのだけれども、もう30だし、あまり魅力的な働き方でもないなと感じている。そんなこんなで、今は働きながら3年間ぐらいかけて良いところがあれば所属する方向で転職活動をしている。というかし始めた。
誘い
社会人になって年数を重ねたせいか、いくつか誘ってもらえてる。今の現場、前職の同僚の会社、新卒で入社した取引先などいくつかあるが、あまり魅力的に感じていない部分となんとなくエージェントを介さないと人間関係の面で足かせとなりそう。
転職活動
まだ1社しか受けてないが、基本的には上場している企業を受けようと思ってる。もちろんベンチャーも魅力的であるし、あまり経歴がよくない自分にとっても好条件な会社に入りやすいと思う。ただ、前職を経験して、経営が関わる距離が近いとその分ノイズが多い。それで誰でも知っているサービスの会社に応募してみた。ちなみにこの企業は6年前の転職活動中に受けたいなと思ってた企業だったが、応募資格すらなかった。もちろん、入社難易度が高く、高学歴、高経歴がほとんどなので、wantedlyのエントリ数も多いので書類からダメだろうと思ったら、ものの数時間で通った。学歴や経歴がなくてもフリーランスで活動してること、リーダー経験が豊富(みんな嫌がるからやらされてた)なことが影響しているのだろう。仮に受かったとしてもいろいろ調整しながら進めたいので、条件が会うまで地道に活動しようと思う。