ホームページ  >  記事  >  プログラミングで最も重要な能力「思考力」

プログラミングで最も重要な能力「思考力」

小云云
小云云オリジナル
2017-11-06 17:06:252381ブラウズ

あなたが本物の達人であることを示すために、さまざまなコードを書くことができますか?違います。本物の達人は、最も重要なプログラミングの考え方と技術を持っています。たとえ、今知っている技術がすべて時代遅れであっても、新しい技術をすぐに習得して、高品質のプログラムを書くことができます。

今日のフレームワークと一般的な言語は、多数の実用的なデータ構造、さらにはいくつかの古典的なアルゴリズムをカプセル化しており、バックグラウンド操作のデータベース バインディング、処理にもかかわらず、.NET を使用して Web サイトをドラッグ アンド ドロップするだけで非常に便利です。その後、これらの非技術的なコードを大幅に削減できる Linq と thinkPHP (PHP の MVC) に出会いました。あまり面白くありません。自分で小さなプログラムを書くよりもはるかに良いです。あるいは、ミニゲームが楽しいからです。
データ構造の先生がかつて「アルゴリズムは芸術だ」と言ったのを覚えています。すると、クラスのほぼ全員が軽蔑的な反応を示し、私はそのときその輝かしいメンバーの一人でした。そのため、データ構造についてはかなり勉強不足で、とても後悔しました。
アルゴリズムの本では、マインスイーパーのような古典的なゲームについて言及しています。コア アルゴリズムの 1 つは、各グリッドの周囲に地雷がいくつあるかを計算することです。
2 年間プログラミングをしている人なら、このようなアルゴリズムをすぐに思いつくと思います。2 次元配列を使用して各グリッドの情報を保存し (もちろん、鉱山はすぐに割り当てられます)、次に配列を走査してカウントします。 1 つの地雷を 8 方向に通過したときの周囲の状況を追跡し、その結果を現在通過している配列項目に保存します。もちろん、統計処理を関数呼び出しとして記述することもできます。これは考えるのが最も簡単なアルゴリズムです。
後で、これは少し無駄だと思いました。地雷があるかどうかを確認するには、周囲に地雷のない多くのグリッドを 8 方向にスキャンする必要があるためです。私が数えたかったのは、各周囲の地雷の数でした。もちろん、それは地雷なので、引き続き 2 次元配列を走査しますが、地雷を走査した場合にのみ値が計算されるという 2 番目のアルゴリズムを考え始めました。鉱山の周囲8方向のグリッド内の が +1 されるため、統計の数が大幅に削減されます。これは逆転の発想で考えるべきです。
Li Li でチェス プログラムを作成するとき、私の将軍または元帥が次のステップで食べられる状況にあるかどうかを判断する「将軍」アルゴリズムに遭遇します (チェスの用語では将軍と呼ばれます)。もちろん、非常に単純なアルゴリズムは、相手の現在存在し攻撃しているチェスの駒をたどって、次のステップで相手の将軍を殺すことが可能かどうかを確認することです。しかし、逆に考えることもできます。将軍が殺されそうな状態にあるかどうかを判断しているので、将軍から直接始めて、敵が「ポーン」、「車」、「大砲」のいずれかであるかどうかを判断します。 「彼の直線範囲内で、そして周囲の環境を判断してください。日本のグリッドの反対側に「馬」がいると思いますか?問題を逆に考えてください。

プログラミングの感覚

プログラミングで最も重要なことは、ある種の思考です。プログラミングの本当の楽しみは、すべてのプログラムが生きており、そのアルゴリズムが魂です。活力のあるプログラムを作ることは幸せなことです。もしあなたがプログラミングがつまらないと感じているなら、それはプログラミングのためのプログラミングではなく、いわゆる技術、いわゆるメソッドやパターンを実践しているからです。
武道のトレーニングが動きと切り離せないのと同じように、プログラミングはテクノロジーと切り離せません。
高レベルの武道家は、カンフーの最高レベルは、心の中に動きがないときだとよく言います。そして、このような動きのない状態は、何もできないという意味ではなく、何百もの思想の流派の長所を集め、何千もの動きを統合した結果、思考、動き、身体が高度に統合され、そしてそれらを好きなように使うことができます。すべての動きを学ぶことでこの状態に到達することはできません。動きの間の内部のつながりについての考え方を真に知り、それらを自分の考えにゆっくりと統合することによってのみ、これを達成することができます。


昔のプログラマーの中には、プログラミングに関して最もタブーなことはやりすぎても十分ではないということをよく教えてくれる人がいます。
知識が増えたからといってマスターになるわけではありませんし、知識が少なくなっても初心者になるわけではありません。プログラミングは思考に重点を置いており、この思考によってこのテクノロジーをどの程度深く理解できるかが決まります。
思考とは? 問題を解決するための考え方、計画する能力、分析する能力、問題を解決するためのアイデアを素早くまとめる能力です。それはアルゴリズム、パターン、またはフレームワークである可能性があります。
これらのアイデアには数年の経験が必要です。

オブジェクト指向の考え方は現在、C の多数の関数ライブラリ (または Java のパッケージ) 以来、この考え方の表面的な理解について簡単に説明します。オブジェクト指向のクラスがあるようですが、この記述は少し突飛です。Java を学ぶか C++ を学ぶかに関係なく、最も重要なことは、問題を考えるのに C++ と Java を使用することです。そしてオブジェクトをプリミティブとして使用して問題に対処します。
私が最後に面接に行ったとき、面接官は私にオブジェクト指向の継承、ポリモーフィズム、カプセル化機能について話すよう求めました。
私は、これら 3 つの特徴を分析するために私が書いた簡単な戦車戦闘プログラムについて彼に話しました。
継承: この概念は非常に理解しやすいです。サブクラスは、サイズ、健全性、移動、衝突判定などの基本的な戦車の特性とメソッドを実装する戦車の基本クラスなど、親クラスのすべての共通メンバーを継承します。将来的には、ファントム タンク (レッド アラート) などの独自のタンクを設計する必要があります。これを解決するには、親クラスを継承し、ファントム メソッドを追加するだけです。継承の利点も明らかです。タンクに共通するほとんどの特性とメソッドは基本クラスに書き込まれているため、将来新しいタイプのタンクを設計する場合は、それらを継承するだけで済み、コードの大部分が不要になります。 。したがって、継承が最も単純で実用的です。
ポリモーフィズム: 狭義には、同じメソッドが異なるパラメーター リストを持つようにする、親クラス メソッドのオーバーロードとして理解できます。ポリモーフィズムはオブジェクト指向の本質だと思います。このクラスにはパラメーターを必要とするメソッドがあります。このパラメーターは、タンク クラスまたはバレット クラスではありません。もちろん、move() メソッドを呼び出す必要があります。次のような強力なオーバーロード関数を使用して、このメソッドをオーバーロードすることができます。 mObj パラメータの型を変更した以外は何も変更されていないようです。しかし、問題は解決しました。この異常なメソッドの実装が 10,000 行である場合、1 つのオーバーロードには 20,000 行が含まれることになります。将来的に飛行機クラスにも move メソッドが追加された場合は、再度リロードする必要があります。継承 + インターフェイスを使用する方がはるかに簡単です。ImoveObj というインターフェイスを作成し、その中で移動メソッドを定義するだけです。このインターフェイスは、someFun (ImoveObj mObj) { としてメソッドを継承します。 ….}; 後 mObj パラメータとして機能するクラスがいくつ追加されても、ImoveObj インターフェイスを継承するだけで済みます。 (ファクトリ パターンを使用したことのある人は、これが一般的すぎると感じます。実際、これはポリモーフィズムの基本的な理解でもあります。)
カプセル化: クラスを使用するには、これを理解するのは簡単です。このクラスのメソッド。このメソッドの具体的な実装を理解する必要はありません。インターフェイスは開発者の設計仕様であり、開発者はインターフェイス内の内容を実装します。インターフェイスはユーザーへの指示でもあり、クラスのユーザーに、このクラスがどのようなメソッドを実装しているのかを伝えます。ユーザーは、そのメソッドを使用できる限り、その実装を理解する必要はありません。
どれも簡単な基本ですが、これらをしっかり理解すれば、注入、反転、マッピングなどを学ぶことはそれほど難しくありません。
オブジェクト指向のほかに、インターフェース指向、アスペクト指向(アスペクト)などもあります。どのような考え方でプログラムを行う場合でも、核となるのは関数と切り離せないアルゴリズムです。アルゴリズム。
プログラミングで最も重要なのは思考であり、技術が能力を決定し、思考が能力の深さを決定します。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。