こんにちはmabuiです。
エンジニア歴は6年目、フリーランスエンジニアとして
週3~4 / 月72万の案件をメインに仕事しています。
イシューからはじめよ読んでて、はじめにで考えると悩むの違いの話でてきたけど、これエンジニアやってるとものすごく大事なことだよな〜って思う。
悩んでる時間は一切意味がないので、どんな方法使っても解決するため動くべき。— mabui (@mabui_x) 2018年8月11日
プログラミングをしていると、様々なところで行き詰まります。
特に仕事だとほとんどの場合、タスクに対してリミットがあり、
悩みに対して答えが出ない状況はどんどん精神的に
追い詰められていってしまいます。
自分もエンジニアを始めて2年目くらいまで何度も徹夜して悩み続けたり、
土日も出社して、同じクラスファイル読み続けたりしていましたw
この記事ではそのような前に進めない悩みに対しての
エンジニアとしての考え方・解決策を書いていきます。
考えると悩むの違い
以前ツイートしたイシューからはじめよの抜粋です。
・ 悩む=答えが出ないという前提の元に、考えるフリをすること。
・ 考える=答えが出るという前提の元に、建設的に考えを組み立てること。
この二つは似ているようで全然別物です。
悩むというのは答えが出ないという前提に立っているため、いくらやっていても
徒労感しか残らない行為であり、一切意味はありません。
自分が悩んでいると認識したら、すぐに別の行動に移りましょう。
意識の問題
時間は有限です。
リミットがまだあるというのは幻想で、無駄に悩んでいる間に自分の人生の時間、
すなわち寿命は確実に減っていきます。
目の前の問題を素早く解決することで他のことに時間を使えて、
自分の人生を長くすることができると意識しましょう。
まずはデバッグしまくること
まずデバッグしまくることで、自力で解決できる問題かどうかを切り分けましょう。
エラーログをまずググることで解答を探す、
怪しい箇所一行一行にログを仕込んで問題の起きている範囲を特定しましょう。
もし作業中の開発環境に不慣れで、そもそもデバッグの仕方が明確でない時は、
軽くググってから、詳しい人に早めにデバッグ方法を聞いたほうがいいです。
悩んでいることに気づいたら人に聞く
例えば30分たっても作業が進んでいない場合は、質問内容を整理して
先輩エンジニアを捕まえて聞きましょう。
そのくらい時間をかけて進まない物事は、今の自分のスキルでは答えが出ないもの
なので、それ以上の時間は無駄になっていってしまいます。
理解するまで聞く
質問したときに分からない単語が出てきた、話が理解できない時には
遠慮なくその場で理解できるまで聞き直しましょう。
こんな事も分からないのかと思う人も中にはいますが、
一切気にする必要はありません。
なぜならやったことがないことを分からないのは当然だからです。
メモをとる
箇条書きでメモをとって同じことは聞かないようにしましょう。
そして後から読んで理解できるようにメモを文章にして
後ほどまとめておくと良いです。
これは残業してもその日のうちにやるのがベストです。
タスクとして残すと気が重くなってしまいます。
のちの仕事をスムーズにするための、重要な時間の使い方だと認識しましょう。
頼る人がいない、わからなすぎてどうしようもない時の対処法
わからないことを書き出す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function TitleAppBar(props) { const { classes, title } = props; return ( <div className={classes.root}> <AppBar position="static"> <Toolbar> <Typography variant="title" color="inherit"> {title} </Typography> </Toolbar> </AppBar> </div> ); } |
例えばReactの上記コードが理解できないとして、
・ このコードは画面のどの部分なのか?
・ returnで何を返しているのか?
・ <Toolbar>
等、htmlタブのようなものは何なのか?
といった感じで、何が分かっていないかを書き出すことで整理します。
1 2 |
// TODO <Toolbar>等、htmlタブのようなものは何なのか? |
こんな風に、TODOとしてコードに残すのも効率がいい方法です。
わからないものを、一つずつ調べる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
fetch(endpoint).then((response) => { let json = response.json(); json.then((value) => { let data = value.data; for (let key in data) { let coin = data[key]; // レスポンスを連想配列に詰める。 dict[coin.rank] = { name: coin['name'], } } }) }); |
上記のコードが何をしているか全くわからないとして、
一行ずつわからないと思うところをそれぞれ調べていきます。
1 2 |
fetch(endpoint).then((response) => { |
この場合fetchメソッド、thenメソッド、((response) => {
の構文あたりです。
まずfetchメソッドを調べると、JavaScriptの標準メソッドで、
apiコールをする処理だとわかります。
返り値にPromiseというオブジェクトが帰ってきて、
JavaScriptのリファレンスでPromiseを調べると、
thenメソッドを使って非同期処理の完了、失敗のコールバックを受け取ることができるオブジェクトとわかります。
非同期処理、コールバックが分からない場合は都度また調べていきます。
そして((response) => {
の構文です。
こちらは同じくPromiseのリファレンス
に記述があり、同期処理の返り値を、アロー関数で扱っているものになります。
構文の調べ方は結構厄介で、なぜなら問題を言語化しにくく、ググりにくいからです。
別の調べる方法として、この場合JavaScriptの構文ということはわかっているので、リファレンスから調べていきます。
JavaScriptリファレンスの関数の項目
から調べていくと、() => {}
の構文の正体はアロー関数と呼ばれるもので、
通常の関数の短縮系だとわかります。
単純にして動かしてみる
上記のコードだと、返り値らしきものを一旦jsonという変数に入れているので、
そこだけを取り出して動かします。
1 2 3 4 5 |
fetch(endpoint).then((response) => { let json = response.json(); console.log(json); }); |
コードをシンプルにしてprintデバッグなどしてみると見通しが良くなっていいでしょう。また部分的にコメントアウトするのも便利です。
するとjsonもPromiseのオブジェクトということが分かり、thenメソッドを使って段階的に処理を実行していることが理解できます。
英文ドキュメントに当たった時、逃げない
楽だからと日本語ブログを辿り辿って、問題の解決にたどり着かず、
別の気になる話題を見にいってしまって時間が浪費されていくことは結構あります。
結局公式の英文ドキュメントを読むのが一番本質的で簡潔に書かれていて、解決の糸口になることはとても多いです。
何をしたら解決かを明確にする
その方法は本質的な解決策になっているのか
チャットやチケットベースで意思疎通が不十分な状態で依頼を受けた場合は、
そもそも依頼主の意図を明確に汲み取れているかを
確認することで解決できる事もあります。
対面で話しを聞いて本質的に達成したいことはなんなのかを確認し、
今詰まっている問題は本質的な問題なのかどうかを考えましょう。
本質的でない場合は、迂回策を考えて問題をなくす事もできます。
その方法でできるのかできないのか
そもそもその方法で達成可能なのかどうかを明確にしましょう。
〇〇なのでできないという理由が出てきたら、
その方法を追うのはやめて、別の方法を考えましょう。
助けを求めることは恥ではない
どうしようもない時は相談したいと言って周りに助けを求めましょう。
困っている人に対して優しく手を差し伸べない人は基本的にいません。
うまく問題を説明できなくてもプライドを捨てて、人に頼りましょう。
どう思われるかなんて、長いエンジニア人生で考えると瑣末な事です。
他人ができることは時間をかければ自分にもできるようになると確信しましょう。
まとめ
これまでの自戒も込めて、プログラミングにおける悩みに対しての
考え方、解決策を書きました。
エンジニアというのは日々問題解決の連続で、真面目な人ほど
息苦しく感じる時もあるかとは思いますが、
あまり自分を追い込みすぎず、時間をかけて着実にスキルアップしていきましょう。