🏡まったのブログ

【初学者向け】バグやエラーの解決のコツ

この記事はメンターマッチングサービスMENTAにて生徒さん向けにナレッジとして投稿したものです。 自分はシステム開発会社で働いたのは半年間のアルバイトくらいであとはほぼ独学ですが、MENTAにはそういう境遇に近い方が多いと思います。企業で20年のエンジニアキャリアがあるような人からすると間違った部分もあるかもですが、僕が5年間くらいググりながら解決していった経験をもとにコツをまとめました。

前提

そもそもですが、最近はググり力(調べて自分で解決できる力)が求められます。一方で「ググレカス」の時代からまた事情が変わり、ネット上のコンテンツに誤情報や汚いコード、バグを生みそうなやっつけ解決策も増えたので、経験者に聞いたほうがいいかどうか判断が難しくなりました。まぁとは言え基本はググるしかないのですが「なるべくキレイなコード、アーキテクチャ(構造)、命名規則」を意識しつつ知識やセンスを磨いていくしかないと思います(まぁ私もまだまだすぎるんですが)。 で、15分ググっても分からなければ普通は職場の先輩や上司に聞くんですが、ここにいる方はそういう環境ではないはずなので代わりにメンターにチャットしましょう、ということですね。ちなみにもしメンターがいない状況でも、teratailなどで時間をかけて丁寧に質問すると優しい偉い人が教えてくれます(が、詳しい人ほど初学者の気持ちが汲み取りにくくツンケンしてることも多いので、やはり無料ではサービスは期待しちゃダメということなのかもです)。 一方で開発者コミュニティに入ったり、Twitterで「#駆け出しエンジニアと繋がりたい」のハッシュタグで繋がって関係ができると優しく教えてくれる方も多いです(MENTAはある意味その関係構築をショートカットするサービスなのかも‥)。

基本的な解決までのフロー

基本は以下のような順に沿って試行錯誤すると解決までが早いかと思います。
  1. エラーメッセージを読む
  2. ググる
  3. 公式ドキュメントを見る・チュートリアルを試す・最低限の実装で試すなど
  4. 周辺知識が付いたので改めてググる
  5. 質問する or 寝て頭を整理する
人に寄りますが22時以降は脳も働いていないので、最後は諦めて寝た方が解決策を思いついたり二次被害を防ぐためにもオススメです。

頑張ってエラーメッセージを読む

まず多くの場合はエラーメッセージに解決法や原因、ヒントがだいたい書かれています。ただ基本的に英語&専門用語なので初学者には読むのが辛いわけですね。つい「出来ない」「動かない」と原因究明を放棄してググりたくなりますが、ここは地道に頑張って何が起きているのかをザックリでも掴むよう心がけると問題解決力が付いていくと思います。 さて、エラーメッセージの表示場所ですが、WordPressなどのWebサイトのフロント側の不具合は、ブラウザの検証メニュー(Dev Tools。Command+Shift+i)を開いてConsoleタブを見るとエラーメッセージが表示されます。

ググる

エラーメッセージでググる 注意点としてはエラーメッセージ全文よりもエラーの内容文でググったり、なるべくダブルクォーテーションや自分の環境依存の部分は含めないで検索すると答えにたどり着きやすいです。 英語でググってみる Webの場合は世界中で同じ問題に誰かがぶつかっていて、Stackoverflowなどで英語で質問回答がなされていることが多いので、日本語より英語でググる方がいい結果がでたりします(doesn't workやnot working, disable xxx, how to ~みたいな言い回しをよく使います)。

公式ドキュメントから情報を探す

ググることの問題は古い情報や誤情報がヒットしたりすることで、頻繁にアップデートがある言語やシステムだと一度公式ドキュメントを開いてその中で検索するか、もしくは(サイト内検索は使えるレベルでないことも多いので)各カテゴリーを俯瞰し1つずつ理解しながらほしい情報がどこにあるかを見極めていくしかないですかね。 よく「公式ドキュメントで殴る」と言うように、初学者にとって公式ドキュメントはとっつきづらいです。基本は熟練者や玄人がすぐに仕様ややり方を参照できるように作ってあるので、Webやプログラミングの基礎知識、別言語での実装経験などがないと専門用語だらけでいきなり置いてけぼりにされます。 なので最初はQiitaやググって出てきた個人ブログを頼りに理解していくしかないですが、「公式ドキュメントをちゃんと読めてなくてやり方を間違っていた」というのはよくあるので、解決しないたびに頑張って一度は見に行ってみて全体を理解する癖をつけるようにした方がいいかと思います。 未だに僕も公式ドキュメントは辛いし、あんなの1から順番に読むのはホント強強じゃないと無理なのでは‥。

チュートリアルを試す

WordPressだとチュートリアルとかそういったのは無いですが、例えば誰かが上手く言ったブログややり方を書いていたら、一旦自分の仕様は無視してその人と同じ通りやってみる。これで動けば言語やプラットフォームの仕様が変わったり、自分の環境構築に問題があるわけではないことがわかります。

最低限の実装で試す

作りたいものや実装したい機能があるとき、なるべくまず最低限の実装を順番にしていくとミスやエラーを防ぎやすいです。ToDoアプリを作っているならこんな感じ。
  1. 入力フォームを1つだけ表示する
  2. 入力されたデータをデータベースに保存する(セキュリティ設定はまだしない)
  3. そのデータを画面上で表示する(ユーザーによるフィルターなどはまだかけない)
Git管理をしているなら、1, 2, 3のたびにコミットをしておくと先々上手く動かなくなったときに「ここまでは正常に動いている」というところまですぐ戻れるので、早めにGitは導入した方がいいでしょうね。

キャッシュを消したりエディターを開き直す

システムやエディターも万能ではないので、昔の古いファイルが残っているとかあるあるです。WordPressでいうとキャッシュや圧縮系のプラグインをすべて停止し、サーバー側のキャッシュもクリアしてみるとか。iOS開発でいうとXcodeを開き直したりクリーンビルドしてみたり、DerivedDataを消したりとかですね。

環境やライブラリをインストールし直す

なんか色々やりながら作ってたら「一見問題なさそうなコードなんだけどエラーが出る」とかで2,3日も解決しないことがよくあります。WordPressだといろんな会員システム系のプラグイン入れて変な固定ページやフィールド欄が沢山できてしまったとか、プログラミングだとインストールしたライブラリのバージョンが違うとか、ググって出てきた方法を試してデータベースや設定、スキーマがぐちゃぐちゃとか。こういう時は1からインストールし直した方が早かったりします。

サーバーのメンテやダウンを疑う

サーバーの管理画面でメンテのお知らせがないか見たり、Twitterでサーバー名で検索したり。ごくまれにChromeブラウザのアップデートによる不具合とかもあります。またあんまり言いにくいですが、お花の名前のサーバーはよくメンテなどで関係ない部分にも不具合でるとか多い‥。

teratailで質問する

もう1日格闘してもわからんという時は(職場の先輩・上司やメンターがいない場合)はteratailで質問するのもありです。ただ結構「背景・環境・試したこと・問題のコード」など回答者が正確に状況を把握するために整理することが多いので30分とかかかります(雑な聞き方だと偉い人たちに叱られます😃)。 なので質問するのも面倒なのですが、質問文を整理する中で解決のヒントや原因、まだ試してないことなどが見えることもあるので、2日以上ググり続けるよりは聞いちゃうのがおすすめです。 ただすごい人ほどコミュニケーションがツンケンしたりするので、顔の見えないネット上のやりとりですし「優しい人に答えてもらえたらラッキー」くらいの気持ちでやるのがいいかと(ただし親身になってもらった人には感謝の気持ちを伝える姿勢を忘れずに)。

寝る

人間寝たら思考が整理されるので、翌朝にあっさり解決するというのはあるあるです。22時以降とか、深夜帯に頭もあまり回っていないなかでググったりコード見てもいいことないので潔く寝ましょう。 クライアントさんへの納品期限とかあるかもですが、寝ぼけてサイトやシステムを壊して二次被害を起こすと本末転倒なので、一旦20時くらいで「こうこうこういう理由で今日は厳しい可能性が高いです‥」と正直に早めにお伝えしておくと気持ち的にも楽です。 開発者やWeb担当者だけでなく、サーバーやブラウザ、WPなどのプラットフォーム、使用するプラグインやライブラリなど、あらゆるところに不具合の種があり、またシステムとはやはりバグは避けられない(銀行システムや医療システムとかの重みを感じる‥)ので、予めそういうものだという認識を自身とクライアントさん双方が持って置けるとスムーズにお仕事できると思います。

最後に

色々書きましたが、僕もこの考え方が一般的なのか、強強エンジニアからみてどうなのかとかよくわかりません。ただ「作りたいものがあって、そのための道中で遭遇したバグやトラブルに向き合う中で、そもそものWebの仕組みや言語の深い仕様などを学ぶ機会になり、それが本質的なスキルアップに繋がる」のだとはやってて感じます。なので教科書を見ながら体系的に学ぶよりも、これの繰り返しで成長できると思って長い時間をかけてやってけばいいのではないでしょうか!少なくとも僕はそっち派です!