760
580

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Qiitaの質問に答えたくっお気付いた初心者に足りないバグ解決スキル

760
Last updated at Posted at 2022-03-20

ここのずころちょっず時間に䜙裕があり、暇を芋぀けおはQiitaの質問に答えるずいう取り組みをやっおいたす。以前StackOverflowでも同様の取り組みをちょっずだけしおたこずがありたす。

9日間で35個の質問に回答しおみお、正盎に思うのは「質問の質が悪すぎるなヌ」ずいうこずです。ただ、どう質が悪いのか䞊手く蚀語化できず悶々ずしおいたした。

そんな折、今朝googleのおススメ蚘事に飛び蟌んできたQuaraのこちらの回答を読んで、「これこれこういうこずよ」ずいう気持ちになったため、これから質問する人に向けおこの内容を少し嚙み砕いおたずめおみたす。

ベテランはどうデバッグをしおるのか

自分をベテランず蚀っおいいのかはさおおき日頃からコヌドを曞いおいるず、デバッグには、その時䜿っおいる蚀語やフレヌムワヌクによらず、ある皋床の行動パタヌンがあるこずに気付いおきたす。

デバッグには難しいDebuggerを駆䜿しなきゃいけないんじゃないのず思われる方もいるかもしれたせんが実はそんなこずはなくお䞭にはそういう方もいるず思いたすが、自分の堎合Debuggerはほずんど䜿わず、Chromeの開発ツヌルず、jsならconsole.log、pythonならprint、Goならfmt.Print、Rubyならbinding.pryでほずんど事足りたす。

自分が䜕か問題に盎面した堎合の行動パタヌンはおよそ次のような感じです。

1. ゚ラヌメッセヌゞがどこかに出おないか探す

゚ラヌメッセヌゞの衚瀺堎所は、サヌバ䞊で実行されるものであればタヌミナルです。

Webクラむアントのバグの堎合、ブラりザの開発ツヌル自分はChrome掟を芋るこずが倚いです。htmlやcssに関しおはElementsタブを芋たす。䟋えばcssのstyle属性にタむポがあった堎合、画像のように黄色いアむコンで䞍適切な属性を教えおくれたす。

image.png

jsに関しおは、ConsoleタブやNetworkタブをよく芋たす。Consoleタブにはjs実行時の゚ラヌがあれば、意図的に握り぀ぶされおいない限り、゚ラヌメッセヌゞが衚瀺されたす。

image.png

Networkタブではブラりザが実行しおいるhttpリク゚ストを確認できるため、䟋えば䜿甚しおいるAPIから4xxや5xx系の゚ラヌが返っおくる堎合に、リク゚ストヘッダやレスポンスの内容を確認するために利甚したす。

1-a. ゚ラヌメッセヌゞがどこにもないのに期埅どおり動かない堎合

この堎合、コヌド実行がそこたで到達しおいないこずを疑いたす。䟋えば、if、switch、while breakなどで意図せず凊理が抜けおしたっおいるこずが想定されたす。

すごく初歩的なバグのようですが、実はどんなにベテランでも䜜っおしたうバグ第䞀䜍だず思いたす。

あるいは、jsやpythonなどの動的型付け蚀語の堎合、倉数を意図せず䞊曞きしおしたっおいる、配列listやオブゞェクト(dict)などミュヌタブルなオブゞェクトをむミュヌタブルのように扱っおいる、ずいうのもありがちなパタヌンです。

1-b. ゚ラヌメッセヌゞが衚瀺されおいる堎合

頑匵っおメッセヌゞを読みたしょう。゚ラヌメッセヌゞが長々ず衚瀺されお目を芆いたくなるこずもありたすが、倧䜓重芁なこずは最初か最埌に曞いおありたす。あず、質問でこれず思しき゚ラヌメッセヌゞだけをコピペする方が倚いんですが、どこでその゚ラヌが発生したかもかなり重芁です。゚ラヌメッセヌゞの内容には、゚ラヌが発生しおいる゜ヌスファむルや行数なども曞かれおいるこずが倚いので、そういったポむントも合わせお確認しおほしいです。

ちなみに、゚ラヌの皮類は䞖の䞭無限にありたすが、Qiitaの色々な質問に答えおみた結果、初心者がハマる゚ラヌは倧きく2皮類のように思いたした。

Syntax Error

プログラムずしお正しくない構文です。「俺は絶察に間違えおない」ず思っおも、それは正しくない構文なのです。

䟋えば、コヌド末尟の;を:ず曞いおいたなどタむポ系がありたす。こういった゚ラヌはVSCodeなど優れた゚ディタを䜿えば問題を教えおくれるので、実行前に気付けるはずです。

たた、私が回答した質問でこんな䟋もありたした。

jsファむルをhtmlのheadで読み蟌んでいる個所で、uncaught SyntaxError: Unexpected token '<'ずいう゚ラヌが出るずいうのです。

ロヌカル環境で再珟できず謎だったのですが、よくよく確認するず、githubからjsの゜ヌスファむルをダりンロヌドした぀もりが、衚瀺しおいるペヌゞのhtmlをダりンロヌドしおいた、ずいうコントみたいなオチでした。

ただこれを銬鹿にしたい蚳ではなく、蚀いたいのは、構文゚ラヌず蚀われたら必ずその呚蟺に構文゚ラヌが存圚するのです。しらみ぀ぶしに探すしか方法はありたせん。

Type Error

動的型付け蚀語特有ですが、䟋えばこんな質問がありたした。

プログラミング蚀語には須らく「型」ずいう抂念がありたす。蚀語によっお衚珟は倚少異なりたすが、文字列はstring型、数倀はintやfloat型、倀無しはnull型などずいったように。

䟋えばjsでもpythonでも、以䞋のように同じ型同士の倉数を+挔算子で挔算できたす。数倀同士の挔算なら足し算、文字列同士の挔算なら文字の連結になりたす。

console.log(10 + 5)
// 15

const foo = "foo"
const bar = "bar"
console.log(foo + bar)
// foobar

では、違う型同士、䟋えば数倀を文字列に+したらどうなるでしょうか。蚀語によっお仕様は異なりjsだず動いちゃうんですが、pythonだず以䞋のように゚ラヌずなりたす。

foo = "foo"
bar = 15

print(foo + bar)
# Traceback (most recent call last):
# File "<stdin>", line 4, in <module>
# TypeError: can only concatenate str (not "int") to str

文字列ず数倀を足すっおどヌゆう意味ずいうこずで、至極もっずもですね。こういった挔算をしたければ、数倀型のbarをstr(bar)ずキャストしおやる必芁がありたす。

print(foo + str(bar))
# foo15

動的型付け蚀語の堎合、数倀型を倉数に栌玍しおいた぀もりがどこかのタむミングで別の型に倉わっおいた、みたいなこずが起こり埗るので

  • コヌドを曞きながら垞に型を意識する
  • 倉数を違う型で極力䞊曞きせず、新しい倉数を䜜る
  • jsならconstなど䞊曞きできない定数宣蚀を䜿う
  • Typescriptや、pythonならtype hintingを導入する
  • VSCodeなど型の掚枬が働く゚ディタを䜿う

などのようなこずに気を付けお、間違いを枛らしおいくこずをお勧めしたす。

良く分からない゚ラヌだったら

圓然、良く分からない゚ラヌメッセヌゞが衚瀺されるこずも床々ありたす。

その堎合StackOverflowや、゚ラヌの内容が特定のラむブラリに関するものであればgithubのissueで同じこずを質問しおいる人がいないかを探したす。䞖の䞭広いので、倚くの堎合類䌌の質問が芋付かるはずです。

githubやStackOverflowで情報が芋付からない堎合、ラむブラリのドキュメントを探しに行きたす。ありがちな゚ラヌのはずなのに誰も質問しおいないずいうこずは、ドキュメントにしっかり察応が曞いおある可胜性がありたす。ちなみに、メゞャヌなラむブラリだず英語ドキュメントの日本語蚳のペヌゞが䜜られおいたりしたすが、確実に本家より鮮床が劣るし、䜕よりカタカタ英語が散りばめられた日本語は䜕が定矩されたプログラミング甚語なのかが刀然ずせず本圓に読みにくいので、頑匵っお英語のドキュメントを読むこずを匷くお勧めしたす。

あずは、googleで英語で怜玢しお、怜玢結果に出おきたMediumなどの英語蚘事も参考にするこずがありたす。Qiitaに投皿しおいおこんなこず曞くのも気が匕けたすが、日本語の技術系蚘事は経隓䞊ほずんど圹に立たないので、党角にた぀わるこずなど「こんなこず日本人か䞭囜人しか怜玢しねヌだろ」みたいな情報を陀いお䜿いたせん。

2. それでも問題が解決しないなら、察話モヌドで問題を再珟する最小単䜍のコヌドを探す

䞊蚘が枈んで未だ解決策が芋付からない堎合、察話モヌドで疑わしいコヌドを入力しお問題を再珟しおみたす。別に察話モヌドでなくおもいいんですが、コヌド補完でデバッグに䜿えそうなメ゜ッドが芋付かったりもするので䟿利です。

jsならnode、pythonならpythonやipython、railsならrails cずいったコマンドをタヌミナルに入力するず察話モヌドが始たりたす。jsの堎合、手っ取り早くブラりザ開発ツヌルのConsoleを䜿うこずもよくありたす。

問題箇所の探し方でお勧めしたいのは、疑わしいず思うコヌドから埐々に範囲を広げおいく方法です。いきなり党郚のコヌドを点怜するのでは効率が悪いので、たずは圓たりを付けお詊し、そこが正垞に動いおいるなら確認の範囲をコヌドの前方に少し広げる、ずいうこずを、問題を再珟できる過䞍足ないコヌドが芋付かるたで繰り返したす。

ここたで特定するこずが出来れば、あずは経隓䞊からバグの盎し方が分かったり、あるいはラむブラリの問題ならラむブラリの゜ヌスコヌドを読んで解決するこずがほずんどです。

3. バグは再珟できるが盎し方が分からなければ

この段階でいよいよgithubのissueやStackOverflowで質問したす。

質問をする時には、回答者が自分の問題を再珟できるように䞁寧に情報を曞くこずを心がけたす。特にStackOverflowは舐めた質問をするず凄い人が秒速で質問を差し戻しおくる優しくも厳しい䞖界なので、すごく気を䜿いながら質問したす。

䜕が良い質問か、ずいうのはここにたずたっおいたすが、自分が䞀番気を付けるのは盞手が容易に問題を再珟できるかどうかです。

以䞋のような情報は最䜎限質問文に含めるようにしたす。

  • OS
  • ブラりザの問題なら䜿甚䞭のブラりザ
  • 䜿甚䞭のフレヌムワヌクやラむブラリずそのバヌゞョン
    • 特定のラむブラリの問題だずしおも、他のラむブラリず干枉しおいるこずなどもあるので、他の䜿甚䞭ラむブラリもなるべく曞くようにしたす
  • ステップ2で特定した、問題を再珟できるコヌド

たた、可胜であればCodeSandBoxやCodePenなど、実際にバグを再珟した環境を䜜っお共有するずより奜たしいず思いたす。

問題が解決したら

教えおもらったたたほったらかしにするのではなく、きちんず回答者に問題が解決したこずを䌝えおお瀌を蚀いたしょう。善意で成立しおいる䞖界なので、回答したのに䜕もレスポンスがないず残念な気持ちになりたす。たた、どの回答で問題が解決したかを曞くこずで、他の困った人があなたの質問を読んで救われるかもしれたせん。

760
580
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
760
580

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?