プログラミングの問題を解決しますか、それとも演習を完了しますか?(違いは重要です。)

人々は「問題」と「運動」という用語を同じ意味で使用する傾向があります。しかし、違いがあります—そしてそれは重要です。

ポールツァイツ教授が区別します。

5×5を取る。それは簡単で、それは練習です。5,490,900×496もそうです。少し難しく、解決に時間がかかりますが、何をすべきかはわかっています。それがポイントです。

「エクササイズは数学の問題であり、すぐに答える方法がわかります」と、Zeitzは問題解決に関する一連の講義で説明しています。「あなたはそれを正しく答えないかもしれません、実際あなたはそれを正しく答えることは決してないかもしれません...しかしどのように進めるかについては疑いがありません。」

問題はそうではありません。Zeitzによると、問題は「少なくとも最初は、答える方法がわからない数学の問題です」とのことです。

彼は数学の問題解決のレンズを通して問題と演習を定義しますが、それらはプログラミングにも適用できます。

私たちは毎日、問題解決スキルをプログラマーとして活用しています。コードのデバッグ、新しいトピックの学習、さらには問題の解決です。演習にはその場所がありますが、プログラマーとして問題を解決するための代替手段はありません。

エクササイズでエクササイズ

エクササイズの恩恵を受ける方法は2つあります。まず、新しいトピックを学ぶときに役立ちます。

私は今JavaScriptを学んでいて、それを行うために演習と問題を組み合わせて使用​​しています。演習は、パターンを確認し、概念と構文に慣れるために役立ちます。

これは、車の配列を使用する関数を作成するように依頼されたプロジェクトの演習の例です。

const cars = [ { id: 1, car_make: "Lincoln", car_model: "Navigator", car_year: 2009 }, { id: 2, car_make: "Mazda", car_model: "Miata MX-5", car_year: 2001 }, { id: 3, car_make: "Land Rover", car_model: "Defender Ice Edition", car_year: 2010 }, ... ] 

オブジェクトの配列をcar_modelキーで昇順で並べ替える必要がありました。

この演習が簡単だったと言っているのではありません。そうではありませんでした。時間がかかり、エラーメッセージがかなりの割合で表示されました。

ただし、最初から何をする必要があるかを知っていたので、演習としての資格があります。

最近、JavaScriptの配列について学びました。私はPythonでの経験からデータを並べ替えることに精通していましたが、JavaScriptでこれを行う方法を調査する必要がありました。明確な指示も役に立ちました。

しかし、コンセプトはまだ新しいものでした。それらを組み合わせる練習が必要だったので、この演習は貴重でした。繰り返しは親しみを育み、概念は私の心の中で固まり始めました。

あなたが得たものを維持する

演習は、学習した情報を新鮮に保つのにも役立ちます。

JavaScriptを学ぶとき、私が最初に学んだ言語であるPythonについて学んだことをすべて忘れたくありません。だから私はフラッシュカードプログラムのAnkiを1日に複数回使っています。

このコンテキストでは、演習は、大量の資料をまっすぐに保ち、重要な概念を思い出させ、特定のデータ構造またはアプローチをより快適に使用できるようにするのに役立ちます。これまでに得た知識体系のメンテナンス作業です。

私はこれまで何度も見た素材で満たされた1,000枚以上のカードを持っています。一部のカードには構文に関する質問があります。他の人は私にSQLクエリまたはコマンドラインまたはGitコマンドを書くように頼みます。他の多くの人は、「数字のリストを1桁の値だけ右に回転させる」などの演習でいっぱいです。

この演習はかつて私にとって問題であったことに注意することが重要です。あなたが十分に問題を起こすならば、それは運動になることができます。同時に、制約を追加することで、エクササイズを問題にすることができます。

エクササイズは滑りやすい坂道です。一方では、それらは学習目的に役立ちます。一方、エクササイズだけに固執することで快適になりやすいです。

それは欠点です:あなたの快適ゾーンにとどまる。

あいまいさへの対処

プログラミングは問題解決についてです。そして、問題を解決することはあなたをあなたの快適ゾーンのに連れて行くでしょう。これは良いことです。

私にとって、問題には2つの特徴があります。1つ目はあいまいさです。問題解決は、主にあいまいさを効果的に処理する方法に関するものです。

  • プログラムを実行するたびにエラーメッセージが表示されます。どうして?どうしたの?バグはどこにありますか?どうすれば修正できますか?
  • 新しい問題ステートメントを引き出します。あなたはそれを読んで、それを再読します。一見したところ、何が起こっているのか、ましてやそれを解決するために何をする必要があるのか​​がわかりません。胃の底に穴が開いている「ヘッドライトの鹿」の感覚を感じることさえあります。(あなたは良い問題を選びました!)
  • リレーショナルデータベースについて学ぶ必要があります。それはかなり広いです。どうしますか?最初に何に焦点を合わせるか?最も重要なことは何ですか?あなたは本当に、右知って何が必要なのか、今

これらの例はすべてあいまいさを伴います。そして、それらのすべてが解決する必要が問題をそれが見つけ、トラブルシューティングバグ、実際の問題を解決する、または新しいトピックを学んだかどうか、。  

To make progress, you research, experiment, pull out the facts, create a plan, and apply a variety of problem-solving tactics. In short, you learn to figure it out. The more time you spend with a problem and the different perspectives you gain, the more layers it reveals and the closer you get to the “aha” moment.

Embrace the Struggle

The other difference with problems is the struggle. It’s real.

Problem-solving will test your mental stamina and patience. Progress can be slow, and the process tedious. I’ve toiled away at problems for hours, days, and even weeks.

It’s not to say that exercises won’t challenge you. They can. It’s one thing when you know that you need to use a particular method; you just need to get it to work properly. That’s a challenge, which can sometimes be downright frustrating.

But it’s something else entirely when you have no idea what to do from the start, which may happen multiple times when solving a problem. To me, problems are a struggle.

The best solution is to endure it and get yourself unstuck. In my experience, the struggle means I’m learning a lot and the breakthrough is usually around the corner.

As you push through the mental discomfort, you’ll find yourself thinking creatively and devising solutions you never thought of before. (You surprise and impress yourself—you know more than you think!) You’re becoming a stronger programmer.

You’ll even find yourself having fun. Problem-solving is challenging, to be sure, and even frustrating at times. But it’s also incredibly rewarding.

It’s like crossing the finish line of a half-marathon. No doubt the past 13.1 miles were grueling, but crossing the finish line was worth it and I’d do it again. Solving a problem feels the same way.

Which Is It: Problems or Exercises?

When you crack open your laptop, are you going to solve problems or complete exercises?  

Exercises have benefits, and it’s fine to incorporate them into your programming sessions. I use exercises as a warm-up prior to a programming session. I’ll flip through an Anki flashcard deck for ten or fifteen minutes and work through some exercises. If I’m learning something new, like JavaScript, I may have an entire programming session devoted to exercises.

However, I devote time each day to solving problems—no matter what else I’m learning or building. Even on the days when I allocate a large chunk of time to exercises, I allocate plenty of time to solving problems, too.  

So when you’re about to start a programming session, be aware what you’re setting out to do: exercises or problems. And no matter what, make time for solving problems.

Problem-solving is a skill that takes a lot of practice and time to develop. The only way to get better is to work at it each day. It’s that important, and for good reason.

We solve problems each day as programmers, and in a variety of ways. Making time to problem-solve is a no-brainer; our work as programmers depends on it.

I write about learning to program, and the best ways to go about it (amymhaddad.com).