タグ: エンジニアの勉強法

  • 勉強法(6) 効いたのは、技術そのものではなかった

    勉強法(6) 効いたのは、技術そのものではなかった

    この連載の最後に、身も蓋もない話を書きます。

    仕事につながった場面を振り返ると、効いていたのは技術そのものではありませんでした。

    この記事で扱うこと

    実際に役に立った3つ。どれも技術の名前ではなく、技術の扱い方の話です。このサイトで実際にやったことと対応させて書きます。

    1. 説明できること

    「なぜそうしたのか」を聞かれて答えられるかどうか。ここでいちばん差が出ました。

    動くものを作れる人は多い。ところが「その方法を選んだ理由」になると、急に答えが揃わなくなります。

    このサイトで言えば、同意の仕組みがそうでした。先に読み込んでおいて送信の可否だけ切り替える方法と、同意まで読み込まない方法がある。後者を選んだ理由は、前者だと自分のコードを全部読んでも「送っていない」と言い切れないからです。

    説明できる形を選ぶ、という選び方がある

    この判断は、技術的な優劣で決めていません。あとで説明を求められたときに答えられるかで決めています。

    仕事だと、この視点が要る場面のほうが多い。「動きます」で終わらせられる相手ばかりではありません。

    2. 引き継げること

    自分で書いていないコードを直す仕事が続いた時期があります。書いた人はもういない。仕様書もない。あるのは動いているコードだけ。

    そのとき欲しかったのは、常に判断の理由でした。

    コードから分かること コードから分からないこと
    何をしているか なぜその方法を選んだか
    どういう順番で動くか なぜこの順番でなければならないか
    この値を除外していること 除外しないと何が起きるのか

    右の列が分からないと、触っていいかどうかが判断できません。一見無駄に見える処理が、過去の不具合への対処だったということは珍しくない。理由が書いていないと、消して初めて分かります。

    いま自分が書くコードには、処理の説明ではなく理由を書いています。引き継ぐ側に回った経験が、そのまま書き方に効きました。

    3. 止まらないこと

    3つめは、壊れたときにどうなるかを先に決めておくことです。

    このサイトのCMSは共用サーバーにあって、混むと応答しません。最初はそれで公開作業ごと止まっていました。

    直したのは速度ではなく、失敗する前提で書き直したことです。

    場面 決めておいたこと
    CMSが500を返す 間を置いて投げ直す。ただし要求が違う場合は投げ直さない
    記事が取れない 0件のフィードを返す。エラーにしない
    同意の記録が読めない 「同意していない」扱いにする

    どれも「うまくいく道」ではなく、うまくいかなかったときにどちらへ倒れるかの話です。

    止まらない作りは、能力ではなく事前の判断

    特別な技術は使っていません。分からないときにどちらへ倒すかを、書く時点で決めただけです。

    決めていないと、そのときの都合で倒れます。都合で倒れたものは、あとから説明できません。

    3つに共通していたこと

    並べてみると、全部「あとから来る人」への態度でした。

    誰のためか
    説明できること 判断を求める相手
    引き継げること 次に触る人
    止まらないこと 壊れたときに困る人

    3つとも、書いている自分には直接の得がありません。書いた時点では、誰も困っていないからです。

    効いてくるのは、いつも後からでした。そして後から効いたものだけが、次の仕事につながっていました。

    技術が要らない、という話ではない

    誤解のないように書いておくと、土台としての技術は要ります。読めないコードは引き継げないし、仕組みを知らなければ壊れ方も予想できません。

    ただ、そこは足りていないと何も始まらないが、足りたからといって差がつく場所ではないという感覚です。差がついていたのは、同じものを作れる人どうしの間でした。

    今回の学び

    まず、動かせる人は多いということ。差がついていたのは動くかどうかではなく、なぜそうしたかを説明できるかどうかでした。

    次に、引き継ぐ側の経験が、書き方を変えること。読めないコードに困った経験がないと、理由を残す動機が湧きません。困った側に一度回ると、書き方が変わります。

    そして、効いてくるのは全部あとからだということ。3つとも、書いた時点では誰も困っていません。得が見えないうちにやっておいたものだけが、後で効きました。

  • 勉強法(5) 手順は残らない。判断は残る

    勉強法(5) 手順は残らない。判断は残る

    このサイトの作業は、かなりの部分をAIと一緒に進めています。

    気になっていたのは、それで自分に何か残るのかということでした。60本を超えた時点で、残ったものと残らなかったものがはっきり分かれています。

    この記事で扱うこと

    何が残って何が残らなかったか。そして、残るかどうかを分けていたのが何だったかです。

    残らなかったもの

    正直に書くと、手順は覚えていません。

    やったこと いま書けるか
    DNSにTXTレコードを足す 画面を見れば分かるが、手順は覚えていない
    構造化データの書き方 項目名を覚えていない
    日付を決まった形式に直す 曜日と月名の並びは調べ直す

    ここは開き直っています。調べれば出るものを覚えておく理由が薄いからです。AIと組む前から、この手のものは毎回調べていました。

    残ったもの

    残ったのは、「なぜそれを選んだか」のほうでした。

    たとえば、同意を取る仕組みを作ったとき。先に読み込んでおいて送信の可否だけ切り替える方法と、同意まで読み込まない方法があります。後者を選びました。

    理由は、前者だと自分のコードを全部読んでも「送っていない」と言い切れないからです。判断が相手の設定に移ってしまう。

    この判断は覚えています。手順は忘れても、何を基準に選んだかは残りました。

    残っているのは、迷った場所だけ

    並べてみると、覚えているのは全部迷った場所でした。

    すんなり決まったところは覚えていません。2つの案を比べて、片方を捨てた場所だけが残っています。捨てた理由が、そのまま基準になっているからだと思います。

    分かれ目は「確かめられるかどうか」だった

    残るものと残らないものを分けていたのは、時間でも回数でもありませんでした。自分で確かめたかどうかです。

    分かりやすい失敗があります。

    読了の判定が正しく動いているかを、ブラウザを自動で動かして確かめました。記事を最後までスクロールさせても、読了として記録されない。「不具合がある」と結論を出しかけました。

    念のためスクロールのイベント回数を数えたら、0回でした。自動で動かしているタブでは、そもそもイベントが発生していません。不具合が無くても同じ結果になります。

    確かめずに直していたら、動いているものを壊していた

    ここで分かったのは「読了が記録されない」ではなく、「この方法では確かめられない」ということだけでした。

    AIと組んでいると、答えは早く出ます。早く出た答えを確かめる手段を持っていないと、間違いも同じ速さで進みます。速いぶん、戻る距離も伸びます。

    この一件は強く残りました。自分で数えて、自分で結論を取り下げたからです。

    残す作業を、意識的にやっている

    放っておくと残らないので、2つだけ決めています。

    1つめは、コードに「なぜ」を書くこと。処理の説明ではなく、その選択をした理由と、選ばなかった案を書きます。書こうとすると、自分が理由を説明できるかが分かります。書けないときは、分かっていません。

    2つめは、記事にすること。このサイトの記事は、ほぼ全部が詰まった話です。人に読める形にするには、何が起きて、なぜそうしたかを順に並べる必要があります。並べられない部分が、理解の穴です。

    やらないと やると
    コードの「なぜ」 半年後に同じ場所で悩む 判断ごと残る
    記事にする やった記憶だけ残る 説明できない部分が見つかる

    どちらも、AIには代わりにやってもらえません。説明できるかどうかを確かめているのは自分の理解なので、代わりに書いてもらった時点で意味が無くなります。

    向き不向きはある

    全部が同じようにうまくいったわけではありません。

    手を動かして覚えるもの——たとえば攻撃の手順を実際に試すような学び方は、読んだだけでは半分しか入りませんでした。体で覚える部分は、代わりにやってもらうと何も残りません。

    逆に、調べれば分かることを大量に集めてくる作業は、任せたほうが早い。分ける基準は「自分の判断が要るかどうか」でした。

    今回の学び

    まず、手順は残らないが、判断は残るということ。覚えているのは全部、2つの案を比べて片方を捨てた場所でした。捨てた理由が基準として残っています。

    次に、確かめる手段を持っていないと、間違いも同じ速さで進むこと。早く答えが出ること自体は良いのですが、確かめずに進むと戻る距離が伸びます。速さの価値は、確かめ方とセットでした。

    そして、残す作業だけは自分でやる必要があること。理由を書く、記事にする。どちらも「説明できるか」を試す作業なので、代わりにやってもらうと試すもの自体が無くなります。

  • 勉強法(4) 教える側に回ると、穴が見える

    勉強法(4) 教える側に回ると、穴が見える

    プログラミングを教えていると、質問が2種類に分かれます。

    片方は調べれば答えが出ます。もう片方は、自分が何を根拠に答えているのか分からなくなります。

    この記事で扱うこと

    教える側に回って見えた、自分の理解の穴。答えられなかった質問の種類と、そのあと説明の仕方をどう変えたかです。

    答えられない質問は、いつも同じ形だった

    質問 答え方
    この書き方が分からない 調べれば出る。一緒に調べればいい
    エラーが出た 読めば書いてある。読み方を渡せばいい
    どっちがいいですか 答えが1つに決まらない

    3つめで詰まります。「そっちでいいと思います」とは言える。ただ、なぜそう思うのかを説明しようとすると、経験からそう思う、としか言えませんでした。

    自分が使えていることと、人に渡せることは別

    自分で書くときは迷いません。手が勝手に選んでいます。

    ところが理由を言葉にしようとすると出てこない。選べているのに、選び方を説明できない状態でした。使えてはいるが、分かってはいなかったわけです。

    教えやすいことと、実務で差が出ることがずれている

    教材にしやすいのは、正解のあるものです。文法、関数の使い方、エラーの読み方。手順が決まっていて、できたかどうかも判定できます。

    ところが、仕事で差が出るのはそこではありませんでした。

    教えやすいこと 実際に差が出ること
    書き方を覚える どこまで作り込むかを決める
    エラーを直す 同じエラーが起きない形にする
    言われたとおりに作る 言われていない前提を確認する

    右の列は、教科書の形になりにくい。正解が状況によって変わるので、「こうしなさい」と言えないからです。

    結論ではなく、後で起きることを渡す

    説明の仕方を変えました。それまでは「こう書くといい」と結論だけを渡していました。いまは「こうすると後で何が起きるか」を先に話します。

    たとえば、同じ設定値を2か所に書いた場合。その場では動きます。問題が出るのは、片方だけ変えたときです。

    「重複は避けましょう」だと、禁止として覚えて終わります。「今は動くが、変えるときに壊れる」だと、理由として残ります。次に似た場面が来たとき、自分で判断できる形になります。

    判断の材料を渡すと、質問が変わる

    この形にしてから、「どっちがいいですか」が「こっちだと後でこうなりますよね」に変わることが増えました。

    答えを渡していたときは、次も同じ質問が来ていました。材料を渡すと、途中まで自分で進んでから聞きに来ます。

    自分の側にも効いた

    説明のために言葉にしたことが、自分の作業にも戻ってきました。

    このサイトのコードには、処理の説明ではなく「なぜその選択をしたか」を書いています。1か所にまとめた理由、別のファイルに切り出した理由、選ばなかった案。

    これは人に説明するときに必要だった形と同じです。半年後の自分は、今の自分が何に困っていたかを覚えていません。困りごとごと残しておかないと、また同じ場所で悩みます。

    残す内容 あとで役に立つか
    何をしているか コードを読めば分かる
    なぜそうしたか コードからは分からない
    選ばなかった案 直すときに、戻って考えずに済む

    教える相手が、自分の穴を教えてくれる

    答えられなかった質問は、そのまま自分が言葉にできていない部分でした。

    1人で書いているかぎり、そこは表に出てきません。動いているからです。聞かれて初めて、説明できないことに気づきます。

    本を読んで穴を埋めたこともありますが、穴の場所を教えてくれたのは、いつも質問のほうでした。

    今回の学び

    まず、選べることと、選び方を説明できることは別だということ。手が勝手に選んでいるうちは、使えてはいても分かってはいませんでした。

    次に、結論より、後で起きることを渡すこと。「こう書きなさい」は覚えて終わりますが、「こうしないと何が起きるか」は判断の材料になります。渡す形を変えただけで、返ってくる質問が変わりました。

    そして、自分の穴は、自分では見つけにくいこと。1人で書いていると、動いている場所は疑いません。答えに詰まった質問の一覧が、そのまま埋めるべき場所の一覧でした。

  • 勉強法(3) 調べる場所が決まらない時間

    勉強法(3) 調べる場所が決まらない時間

    手が止まっている時間の中身を振り返ると、書き方が分からない時間はそれほど長くありませんでした。

    長かったのは、どこを調べればいいか決まらない時間のほうです。

    この記事で扱うこと

    「読めない」「分からない」を、調べられる形まで分解する話です。CMSベンダーにいたころの詰まり方と、いまも同じ構造で出てくることを書きます。

    3つのどれかは分かるのに、どれかが分からない

    製品のベースがRailsの会社にいました。仕事は管理画面やフロントの改修です。

    コードは目の前にあって、動いてもいます。それなのに読めない。理由を探していくと、こういう詰まり方でした。

    目の前の1行が、Railsが用意した仕組みなのか、Rubyの文法なのか、製品独自の実装なのかが区別できない。

    その行が何か 調べに行く先
    フレームワークの機能 そのバージョンのドキュメント
    言語の文法 言語のリファレンス
    製品独自の実装 社内のコードと、書いた人

    3つのどれかであることは分かります。どれなのかが分からない。結果として、調べ始める場所が決まりませんでした。

    検索の言葉すら決まらない

    調べるという行為は、探すものの見当が付いていて初めて成立します。

    見当が付いていないと、当てずっぽうで言葉を変えながら探すことになります。これが時間を食う。しかも、進んでいる実感が無いまま食います。

    「読めない」では、対処が決まらない

    この状態を「経験が足りない」で片付けていたうちは、何をすればいいか分かりませんでした。

    分解して「言語かフレームワークかの区別がつかない」まで持っていくと、読むべき本は1冊に決まります。フレームワークの本ではなく、言語そのものの本です。

    読んだあと、知識の量よりも先に変わったのは手が止まる回数でした。「ここは言語の書き方だ」と分かると、調べ先が決まるからです。

    分解の粒度は、対処が1つに決まるところまで

    「分からない」では何も決まりません。「読めない」でもまだ決まりません。

    「区別がつかない」まで下ろすと、やることが決まります。そこが止め時でした。それ以上細かくしても、やることは変わりません。

    いまも、同じ構造で出てくる

    これは過去の話ではなくて、今も形を変えて出てきます。

    最近だと、記事を投稿しようとしてサーバーに弾かれました。403が返るだけで理由は出ません。ここで手が止まる理由は、Railsのときとまったく同じです。原因がどこにあるか分からないので、調べ始める場所が決まらない。

    このときやったのは、本文を半分に割って試すことでした。知識を足したのではなく、「どこ」を絞り込んだだけです。2回割ったら、引っかかっている行が分かりました。

    Railsのとき 403のとき
    止まった理由 調べ先が決まらない 調べ先が決まらない
    やったこと 3つのどれかを見分ける 範囲を半分に割る
    必要だったもの 言語の知識 絞り込む手順

    片方は知識で解決し、もう片方は手順で解決しました。共通していたのは、詰まりを「どこ」の問題に置き換えたことです。

    教えていて気づいたこと

    プログラミングを教えていると、同じ止まり方をよく見ます。

    「動きません」と言われて画面を見ると、エラーは出ています。読めば書いてある。ただ、そのエラーが自分の書いた行の話なのか、道具の設定の話なのかが分からない状態です。

    このとき答えを教えると、その場は進みます。ただ次に同じ形で止まります。渡すべきだったのは答えではなく、「いまのは3つのうちどれだと思うか」という問いのほうでした。

    今回の学び

    まず、いちばん時間を食うのは、探す時間ではなく探す場所を決められない時間だということ。答えを見つけるのは、場所さえ決まればそれほどかかりません。

    次に、分解は「対処が1つに決まる」ところまでやること。「分からない」のままでは動けませんが、細かくしすぎても意味がありません。やることが決まった時点が止め時でした。

    そして、同じ詰まり方は、分野を変えて何度も出てくること。言語とフレームワークの区別も、403の原因の特定も、困っている形は同じでした。1回分解できると、次はそれが型として使えます。

  • 勉強法(2) 測らないと、分かったことにならない

    勉強法(2) 測らないと、分かったことにならない

    「分かった」と思った直後に、間違っていたことが何度かありました。

    いちばん効いたのは、自分の理解を外から確かめる手順を持つことでした。今回はその話です。

    この記事で扱うこと

    このサイトで実際にやった「確かめ方」を3つ。どれも、確かめていなかったら間違ったまま進んでいたものです。

    1. 数字を出したら、始まりと終わりを見る

    記事の読み進み具合を出すバーを作りました。動いています。そう思っていたら、開いた瞬間の数字が目に入りました。

    ページを開いた瞬間に9.5%を指していました。まだ何もしていません。

    調べると、計算そのものは正しかった。画面の下端を基準にしていたので、開いた時点で本文の一部がすでに映っていたのです。「画面に映った本文の割合」としては9.5%が正確な値でした。

    式が答えている問いと、表示が名乗っている問いが違った

    表示が名乗っていたのは「読み進み具合」です。読み進み具合なら、読み始める前は0のはずでした。

    計算間違いではなく、意味のずれです。数字が合っているかを確かめても見つかりません。「0から始まっているか」「最後で100になるか」という、両端を見る確かめ方でしか出てきませんでした。

    2. 試した環境が、確かめたい条件を満たしているか

    同じ読了判定で、もっと危ない間違いをしました。

    ブラウザを自動で動かして、記事を最後までスクロールさせました。読了として記録されません。「記録されない不具合がある」と結論を出しかけました。

    念のため、スクロールのイベントが何回起きたかを数えました。

    発火回数: 0

    自動で動かしているタブでは、スクロールのイベントがそもそも発生していませんでした。不具合が無くても、同じ結果になります。

    結論を取り下げるほうが、直すより先だった

    この時点で分かったのは「読了が記録されない」ではなく、「この方法では確かめられない」ということだけです。

    ここで直しにかかっていたら、動いているものを壊していました。試した環境が条件を満たしているかは、結果より先に確かめる必要がありました。

    そのあとは、ブラウザで試すのをやめて、実際の寸法を使って計算で確かめました。

    3. 原因が分からないときは、半分に割る

    コードを含む記事を投稿しようとしたら、サーバーに弾かれました。403が返るだけで、理由は何も出ません。

    本文は4500字あります。どこが原因かは分かりません。

    そこで、本文を4つに割って1つずつ試しました。

    試した範囲 結果
    1/4ずつ(4回) 2番目と3番目が弾かれる
    そのうち1つを8分割 2か所に絞れた
    怪しい行を単体で 2つの書き方に特定

    最終的に、引っかかっていたのは2つの書き方だけだと分かりました。理由を推測せずに済んだのは、割って試したからです。

    推測で当てにいくと、外れたことにも気づけない

    最初は「コードの記号が多いからだろう」と考えて、記号を別の表記に置き換えました。それでも弾かれました。

    置き換えが効かなかったこと自体が情報で、相手が表記を戻してから見ていると分かりました。推測が外れたと分かったのは、確かめる手順があったからです。

    確かめ方は、覚えるものではなかった

    3つ並べてみると、覚えている知識はほとんど出てきません。

    場面 やったこと
    数字を出した 両端の値を見た
    試したら失敗した 試し方が成立しているか数えた
    原因が分からない 範囲を半分に割った

    どれも技術というより手順です。そして3つとも、自分の理解を疑うところから始まっています。

    今回の学び

    まず、「動いた」は「合っている」ではないということ。進捗バーは最初から最後まで動いていました。動きを見ているかぎり、9.5%から始まっていることには気づけません。

    次に、確かめた結果より先に、確かめ方を確かめること。0回しか起きていないイベントを待っていたら、どんな実装でも同じ結果になります。出た結果を信じる前に、その試し方で違いが出るのかを見る必要がありました。

    そして、分からないときは推測ではなく分割すること。4500字から2つの書き方まで絞るのに、知識は要りませんでした。要ったのは、半分に割って試す根気だけでした。

  • 勉強法(1) 1つ作り切ると、広く当たる

    勉強法(1) 1つ作り切ると、広く当たる

    勉強法の本を読んで、思い出したことがあります。

    いま自分が手を出せる範囲は、勉強して広げたものではありませんでした。このサイトを1つ作り切る過程で、必要になって触っただけです。

    この記事で扱うこと

    ポートフォリオサイトを1つ作るのに、結果として何を触ることになったか。その一覧と、それが「順番に勉強する」やり方とどう違ったかです。

    触ることになったもの

    やりたくて始めた領域は、ほとんどありません。進めようとしたら、そこで止まったから触ったという順番です。

    領域 止まった場面
    DNS ドメインを繋いだら、wwwの有無で別のサイトとして扱われた
    TLS 証明書が発行されるまで、何が起きているのか分からなかった
    共用サーバー 混むと500が返り、公開作業ごと止まった
    WAF コードを含む本文を投稿すると、403で弾かれた
    CMSの設計 本文をコードに書くか、CMSに置くかで運用が変わった
    キャッシュ 常に最新を取る指定のせいで、初回表示が1.7秒かかっていた
    アクセス解析 入れる前に、何を数えたいのかを決める必要があった
    検索エンジン 同じ中身が複数のURLで見える状態を、56件指摘された
    アクセシビリティ 画面では分かる区別が、読み上げでは同じに見えていた
    CSS設計 角丸の値を、どこまで段階として揃えるかで迷った

    この一覧は、事前に立てた計画ではありません。詰まった順に並んでいるだけです。

    どの順で何が起きたのかは、公開するまでに、何をどの順でやったか に並べました。この表の各行が、4つの段のどこで出てきたのかが分かります。

    順番に勉強していたら、たぶん届いていない

    もし「Web開発を学ぶ」という目的で本を選んでいたら、上の表の上半分には行き着かなかったと思います。

    DNSもTLSもWAFも、作る話ではなく、公開してから出てくる話だからです。教材の多くは動くところまでを扱っていて、そこから先は自分のドメインを持たないと出てきません。

    「必要になっていない知識」は、読んでも残らない

    実は、DNSの説明は以前にも読んだことがありました。読んだ記憶はあるのに、いざ設定画面を前にすると手が止まりました。

    困っていない状態で読んだものは、知識としては入っても、使う場所と結びついていません。結びつけるのは、詰まった経験のほうでした。

    1つ作り切ると、全部が繋がって出てくる

    もうひとつ効いたのは、これらがばらばらに出てこなかったことです。

    たとえば「表示を速くする」という話。キャッシュの置き場所を変えたら、公開作業の途中でCMSへ問い合わせに行くようになり、共用サーバーが混んでいると公開ごと止まるようになりました。速度の話をしていたつもりが、失敗したときにどうなるかを一緒に変えていたわけです。

    速度とサーバーの安定性と公開の仕組みは、別々に勉強していたら別々の知識のままでした。1つのものを動かし続けていると、つながっている場所のほうから見えてきます。

    範囲が決まっているから、終わりがある

    「全部やる」ではなく「このサイトを動かし続ける」が目的なので、どこまでやるかが自然に決まります。

    やらなかったことも多い。データベースの設計も、大量のアクセスをさばく話も、チームで開発する話も出てきていません。出てこなかったのは、必要にならなかったからです。

    作り切る、の意味

    ここで大事なのは「作る」ではなく「作り切る」のほうでした。

    手元で動かすところで止めていたら、公開に関わる領域は一切出てきません。公開しても放置していたら、運用で出てくる問題に当たりません。

    実際、上の表のうち半分以上は公開したあとに出てきたものです。作り終えてからのほうが、触る範囲は広がりました。

    どこで止めるか 出てこないもの
    手元で動いた ドメイン、証明書、サーバー、公開の仕組み
    公開した 検索エンジン、解析、速度、壊れたときの対処
    使い続けている —

    証拠が残るのも、同じ理由

    この一覧は、そのまま記事の一覧でもあります。詰まった場面を1つずつ書いてきた結果、60本を超えました。

    「勉強しました」と言うより、詰まった場所と直し方が並んでいるほうが、何ができるかは伝わります。狙って作った実績ではなく、作り切る過程の副産物です。

    今回の学び

    まず、触る範囲は、目的の広さではなく深さで決まるということ。「広く学ぶ」と決めて広がったのではなく、1つを最後まで進めたら、必要な順に出てきました。

    次に、困っていないときに読んだものは、使う場所と結びつかないこと。同じ説明でも、詰まった後に読むと入り方が違いました。順番としては、詰まるほうが先でした。

    そして、「作る」と「作り切る」では、出てくるものが違うこと。手元で動いた時点で止めていたら、触ったのは表の下半分だけだったはずです。公開して、使い続けて、初めて出てくるものがありました。