プログラマーのように考える方法—問題解決のレッスン

プログラミングに興味がある場合は、以前にこの引用を見たことがあるかもしれません。

「この国の誰もがコンピュータをプログラムすることを学ぶべきです。なぜならそれはあなたに考えることを教えるからです。」- スティーブ・ジョブズ

プログラマーのように考えるとはどういう意味なのか、疑問に思われたかもしれません。そして、どのようにそれをしますか?

基本的に、それはすべて、問題解決のためのより効果的な方法に関するものです。

この投稿では、私の目標はそのようにあなたに教えることです。

それの終わりまでに、あなたはより良い問題解決者になるために取るべきステップを正確に知るでしょう。

何でこれが大切ですか?

問題解決はメタスキルです。

私たちは皆問題を抱えています。大小。私たちがそれらをどのように扱うかは、時々、まあ…かなりランダムです。

システムがない限り、これはおそらく問題を「解決」する方法です(これは私がコーディングを始めたときに行ったことです)。

  1. 解決策を試してください。
  2. それでも問題が解決しない場合は、別の方法を試してください。
  3. それでもうまくいかない場合は、運が出るまで手順2を繰り返します。

ほら、時々あなたは運がいい。しかし、それは問題を解決するための最悪の方法です!そして、それは膨大な時間の無駄です。

最良の方法は、a)フレームワークを持ち、b)それを実践することです。

「ほとんどすべての雇用主は、問題解決スキルを最初に優先します。問題解決スキルは、ほぼ満場一致で、雇用主が求める最も重要な資格です。プログラミング言語の習熟度、デバッグ、システム設計よりも優れています。計算的思考や大規模な分解能力の実証、複雑な問題は、仕事に必要な基本的な技術スキルと同じくらい価値があります(そうではないにしても)。」—ハッカーランク(2018開発者スキルレポート)

フレームワークを持っている

適切なフレームワークを見つけるために、私はティム・フェリスの学習に関する本「4時間のシェフ」のアドバイスに従いました。

C.ジョーダンボール(Coderbyteの65,000人以上のユーザーのうち1位または2位)とV.アントンスプラウル(「プログラマーのように考える:創造的な問題解決の概要」という本の著者)という2人の本当に印象的な人々にインタビューすることになりました。 」)。

私は彼らに同じ質問をしました、そして何を推測しますか?彼らの答えはかなり似ていました!

すぐに、あなたもそれらを知るでしょう。

補足:これは、彼らがすべてを同じように行ったという意味ではありません。誰もが違う。あなたは違うでしょう。しかし、私たち全員が同意する原則から始めると、はるかに速くなります。

「新しいプログラマーが犯す最大の間違いは、問題を解決する方法を学ぶのではなく、構文を学ぶことに集中することです。」—V。アントンスプラウル

では、新しい問題が発生した場合はどうすればよいでしょうか。

手順は次のとおりです。

1.理解する

何が求められているかを正確に把握してください。あなたがそれらを理解していないので、ほとんどの難しい問題は難しいです(それ故にこれが最初のステップである理由)。

あなたが問題を理解するときを知る方法は?平易な英語で説明できるとき。

問題に悩まされていることを覚えていますか?それを説明し始めると、今まで見たことのないロジックの穴がすぐにわかりますか?

ほとんどのプログラマーはこの感覚を知っています。

そのため、問題を書き留めたり、図を落書きしたり、他の人にそのことを伝えたりする必要があります(または、ゴム製のアヒルを使用する人もいます)。

「簡単な言葉で説明できないと、理解できません。」—リチャード・ファインマン

2.計画する

計画なしですぐに解決に飛び込まないでください(そしてどういうわけかあなたがあなたの道を混乱させることができることを願っています)。ソリューションを計画してください!

正確な手順を書き留めることができなければ、何も役に立ちません。

プログラミングでは、これはすぐにハッキングを開始しないことを意味します。問題を分析し、情報を処理するためにあなたの脳の時間を与えてください。

良い計画を立てるには、次の質問に答えてください。

「入力Xが与えられた場合、出力Yを返すために必要な手順は何ですか?」

補足:プログラマーには、これを支援する優れたツールがあります…コメント!

3.分割する

注意を払う。これはすべての中で最も重要なステップです。

1つの大きな問題を解決しようとしないでください。あなたは泣きます。

代わりに、それをサブ問題に分割してください。これらのサブ問題は、はるかに簡単に解決できます。

次に、各サブ問題を1つずつ解決します。最も単純なものから始めます。最も単純なのは、あなたが答えを知っている(またはその答えに近い)ことを意味します。

その後、最も単純なのは、このサブ問題が解決されることは、他の問題が解決されることに依存しないことを意味します。

すべてのサブ問題を解決したら、ドットを接続します。

すべての「サブソリューション」を接続すると、元の問題の解決策が得られます。おめでとう!

この手法は、問題解決の基礎です。覚えておいてください(必要に応じて、この手順をもう一度お読みください)。

「すべての初心者プログラマーに1つの問題解決スキルを教えることができれば、それは「問題を減らすテクニック」になります。たとえば、あなたが新しいプログラマーで、10個の数字と数字を読み取るプログラムを書くように求められたとします。どの番号が3番目に高いか。まったく新しいプログラマーにとって、それは基本的なプログラミング構文しか必要としないにもかかわらず、難しい課題になる可能性があります。行き詰まっている場合は、問題をより単純なものに減らす必要があります。 3番目に高い数の代わりに、全体的に最も高い数を見つけるのはどうですか?まだタフすぎる?たった3つの数字の中で最大のものを見つけるのはどうですか?または2つのうち大きい方ですか?問題を解決する方法を知っているところまで問題を減らし、解決策を書いてください。次に、問題を少し拡大し、それに合わせてソリューションを書き直し、最初の場所に戻るまで続けます。」 —V。アントンスプラウル

4.スタック?

今までに、あなたはおそらくそこに座って「ねえリチャード...それはクールですべてですが、私が立ち往生していてサブ問題を解決することさえできない場合はどうなりますか??」

まず、深呼吸します。第二に、それは公正です。

でも心配しないで、友達。これは誰にでも起こります!

違いは、最高のプログラマー/問題解決者は、イライラするよりもバグ/エラーに興味があるということです。

実際、ワーミーに直面したときに試すべき3つのことがあります。

  • デバッグ:ソリューションを段階的に進めて、どこが間違っているのかを見つけようとします。プログラマーはこれをデバッグと呼びます(実際、これはデバッガーが行うすべてです)。
「デバッグの技術は、プログラムに指示したと思っていたものではなく、プログラムに実際に指示したことを理解することです。」— Andrew Singer
  • 再評価:下がってください。別の観点から問題を見てください。より一般的なアプローチに抽象化できるものはありますか?
「問題の詳細に迷い、より一般的なレベルで問題を解決する一般原則を見落とすことがあります。[…]もちろん、これの典型的な例は、連続する整数の長いリストの合計、1 + 2 + 3 +…+ nであり、非常に若いガウスがすぐに認識したのは、単にn(n + 1)/ 2でした。 、したがって、追加を行う必要があるという労力を回避できます。」—C。ジョーダンボール

補足:再評価のもう1つの方法は、新たに開始することです。すべてを削除し、新鮮な目でやり直してください。私は真剣です。これがどれほど効果的であるかにあなたは唖然とします。

  • 研究:ああ、古き良きグーグル。あなたはその権利を読んだ。あなたがどんな問題を抱えていても、誰かがおそらくそれを解決したでしょう。その人/解決策を見つけます。実際、問題を解決したとしても、これを実行してください。(他の人の解決策から多くを学ぶことができます)。

警告:大きな問題の解決策を探さないでください。サブ問題の解決策のみを探してください。どうして?苦労しない限り(少しでも)、何も学ばないからです。あなたが何も学ばなければ、あなたはあなたの時間を無駄にしました。

練習

たった1週間で素晴らしいとは思わないでください。あなたが良い問題解決者になりたいのなら、たくさんの問題を解決してください!

練習。練習。練習。「この問題はで簡単に解決できる」と気付くのは時間の問題です。

練習方法は?wazooにはオプションがあります!

チェスパズル、数学の問題、数独、囲碁、独占、ビデオゲーム、クリプトキティ、bla…bla…bla…。

実際、成功した人々に共通するパターンは、「ミクロの問題解決」を実践する習慣です。たとえば、Peter Thielはチェスをし、ElonMuskはビデオゲームをします。

「バイロンリーブスは、「3〜5年後にビジネスのリーダーシップがどのようになるかを知りたい場合は、オンラインゲームで何が起こっているかを見てください。」今日に早送りします。Elon [Musk]、Reid [Hoffman]、Mark Zuckerbergなど多くの人が、ゲームは会社を設立する上での成功の基盤であると述べています。」—メアリーミーカー(2017年インターネットトレンドレポート)

これは、ビデオゲームをプレイするだけでよいという意味ですか?どういたしまして。

しかし、ビデオゲームとは何ですか?そうです、問題解決です!

だから、あなたがすべきことは、練習するための出口を見つけることです。多くの微小な問題を解決できるもの(理想的には、楽しむもの)。

たとえば、私はコーディングの課題を楽しんでいます。毎日、少なくとも1つの課題(通常はCoderbyte)を解決しようとしています。

私が言ったように、すべての問題は同様のパターンを共有しています。

結論

それはすべての人々です!

これで、「プログラマーのように考える」とはどういう意味かがよくわかります。

また、問題解決は、育成するための信じられないほどのスキル(メタスキル)であることも知っています。

それだけでは不十分であるかのように、問題解決スキルを実践するために何をすべきかを知っていることに注目してください。

ふぅ…かなりかっこいいですよね?

最後に、私はあなたが多くの問題に遭遇することを望みます。

あなたはその権利を読んだ。少なくとも今、あなたはそれらを解決する方法を知っています!(また、すべてのソリューションで改善することを学びます)。

「ある障害物をうまく乗り越えたと思ったとき、別の障害物が現れます。しかし、それが人生を面白く保つものです。[…]人生はこれらの障害を打破するプロセスです—私たちが突破しなければならない一連の要塞線。毎回、あなたは何かを学びます。毎回、あなたは強さ、知恵を発達させます。 、そして展望。毎回、競争のもう少しが落ちます。残っているのはあなただけです。あなたの最高のバージョンです。」—ライアン・ホリデイ(障害は道です)

さあ、いくつかの問題を解決してください!

そして幸運を祈りますか?

特別な感謝C.ヨルダンボールとV.アントンSpraulへ。ここでのすべての良いアドバイスは彼らから来ました。

読んでくれてありがとう!楽しんだら、5秒間に何回叩けるか試してみてください。それはあなたの指にとって素晴らしい有酸素運動であり、他の人が物語を見るのを助けるでしょう。