この記事について
現代の技術を学ぶことが難しい理由、それらを習得して専門家になる最も簡単な方法を見つける方法を説明する試み。
この記事の対象者
読者を失望させないために、この記事の対象者をすぐに決定する必要があります。 まず第一に、この記事は、ソフトウェアの作成を独自にマスターしたいプログラマーに役立つかもしれません。 おそらく、プログラミングの教師に役立つでしょう。 同時に、彼女は、自分の道を歩み、物事の独自の確立された理解を持っている専門家のビジョンとは異なるかもしれない視点を説明します。
この記事はまた、緊急のアドバイスよりも多くの研究です。 これを考慮すると、読者が著者の観点から問題に対処しようとすることが必要になる場合があります。 また、トレーニングに直接関係するこの記事は、生産の観点から見ると役に立たず退屈に思えるかもしれません。
まえがき
情報技術は最近非常に進歩していますが、その開発と有資格の専門家になることは引き続き困難です。 著者はトレーナーインストラクターであり、プログラミングや関連トピックを習得するための最も便利な方法を生徒に見つけようと何度か試みました。 この記事は、この問題の単純な構造図を構築する試みです。
著者は、できるだけシンプルに記事を書き、彼のビジョンの重要な原則を示し、あらゆるレベルの専門家に有用な自己開発戦略を提供しようとしました。
著者はその作成時からC#言語を使い始めました。 これまで、著者はさまざまなITテクノロジー(機器、OSの内部機能、アセンブラー、C ++、COM、WinApi、ネットワーク、マルチスレッドなど)での幅広い経験を積んできました。取得したスキルは、C#、.およびそれらの新しいバージョン。 しかし、初心者の場合、学習にはさまざまななじみのない分野から多くの新しいテクノロジーを学ぶ必要があり、そのため学習は長く困難なプロセスになります。
最大の難易度
何かの研究で生じる最大の難しさは、膨大な数の異なる技術と、これらの技術を適用できる産業部門です。 また、この数は常に増加しています(いわゆる「技術的特異点」を参照)。
このような複雑な環境での方向付けは非常に困難になります。 簡単なルール、説明、戦略が非常に役立ちます。
男、道具、問題
トレーニングシステムの多くの重要なプロセスと要素を理解するために、Man-Tool-Problem接続を使用できます。
問題の分析の便宜上、次の仮定を受け入れます。
- 人間が主人公です。 人はツールを使用して問題を解決します。 ツールを使用するには、人が必要なスキルを持っている必要があります。
- 問題は人間にとっての主な仕事です-それには解決策が必要です。
- ツールは問題を解決する手段です。 各ツールは、特定の問題のみを解決するように設計されています。 つまり、すべての問題を解決できるツールはありません。 プログラミング言語は、ソフトウェア作成の問題を解決するために設計されたツールでもあります。
- 問題を解決する過程で、人間はそれと直接対話するのではなく、ツールを介して対話します(ツールは、人間と問題の直接的な対話よりも、人間と問題の対話を容易にすることが理解されます。
問題とツールの複雑さ
異なる問題には、異なる難易度の解決策があります。 家計を念頭に置くことは、市内の商品の配送を管理するよりもはるかに簡単な作業です。
説明を簡素化するために、問題の複雑さはその解決策の複雑さとしてのみ考えることができます。 次に、ツールの複雑さは、人間によるツールの使用の複雑さと考えることができます。 ツールが単純であればあるほど、人が使いやすくなります。
さまざまなツールを使用して、1つの問題を解決できます。 使いやすくするために、ツールはグループに分けることができます。
- 最も便利なのは、使いやすい複雑な問題の解決です。
- 中 -使用が難しく、複雑な問題を解決します。
- 役に立たない -単純な問題を解決するのは使いにくい。
難易度
人にとって最も重要なのは、ツールの使いやすさです。 ツールの複雑さは、遅延、悪い結果、および問題を解決できないことにつながる可能性があります。 言うまでもなく、ツールの欠如が問題を完全に解決できない理由になる可能性があります(ツールなしのソリューションは考えていません-これはすでに最も単純な問題のランクです)。 したがって、ツールを作成するときの主な基準は使いやすさです。
人にとって何かの複雑さは、次のように分類できます。
- 単純な要素が多すぎます。 これらの単純な要素は非常に単純であり、問題を解決するには複雑な構成が必要です。 アセンブラーやMSILなどの低レベル言語は、同様のタイプの複雑さを持つ言語の例です。 このレベルの複雑さは、機器が非常に多くの比較的単純なアクションを実行できるため、最も便利にハードウェアに実装されます。
- 少数のプロパティを持つ少数の要素。 これは人間にとって最も便利なレベルです。 このレベルは、高レベル言語の基本的な要素に帰することができます。
- プロパティが多すぎるアイテム。 このレベルの複雑さのツールは、狭い範囲のタスクを解決するように設計されており、タスクがわずかに異なる場合は調整が必要です。 ソフトウェアパッケージとライブラリは、このレベルの複雑さに割り当てることができます。
低、高、超高レベル
プログラミング言語の進化により、ハードウェアプラットフォームからのプログラミング言語の抽象化レベルが向上しました。
- 低レベル言語-機器の実装には便利ですが、単純な操作を実行する多数のチームがあるため、人間にとっては困難です。
- 高水準言語-人間の理解に便利で、プログラムをより速く開発できます。 しかし、これらの言語はハードウェアを実行するために実装するのが難しく、一般にコードの低速化とリソース消費の増加につながります。
- 非常に高度なプログラミング言語(VHLL)-非常に高度な抽象化を備えたプログラミング言語。 「方法」の原則が記述されている高レベルのプログラミング言語とは異なり、超高レベルのプログラミング言語では「必要なこと」の原則のみが記述されています。
プログラミング言語の通常の開発では、そのレベルは低いハードウェアレベルからの抽象化のレベルに対応しています。 抽象化が増えても、使用の複雑さが増すことはありません。 ただし、実際には理解が複雑になる場合があります。 抽象化のレベルを上げることは、ほとんどの場合、内部の複雑さを隠し、外部から使いやすくする大きな構造の作成に関連しています。
しかし、マイナスの副作用を避けるために適切に使用するには、開発者は構造の内部構造を知る必要があります。 そのため、ネットワークアプリケーションでソケットを使用する場合、適切なネットワークプロトコルとネットワーク操作の原則を知る必要があります。 彼らの理解がなければ、本当に高品質の製品を書くことはできません。 つまり、抽象化のレベルを上げると、単純に内部の複雑さが隠されますが、それは排除されません。
プログラミング言語の進化は継続的な改善を示していますが、長期にわたる開発では理解が単純化されていません。 ここで、ITによって解決される問題の範囲が大幅に拡大していることにも言及する必要があります。
この進化は単純なプロセスではありません。 ただし、このプロセスを理解するのに役立つ機能がいくつかあります。
- ハードウェアプラットフォームの進化により、ITセクター全体の成長が可能になりました。
- ITセクターの能力の向上により、これらのテクノロジーを使用して、ますます複雑化および複雑化する問題を解決できます。
- 複雑な問題は、内部的に複雑であるが使いやすいツールでのみ解決できます。 (ツールが使いにくい場合-必要ありません);
- 内部的に複雑なツールは、(内部的に単純なものよりも)作成するのが困難です。
- プログラミング言語の複雑さは、タスクの複雑さを反映しています。
プログラミング言語の複雑さ
最新のプログラミング言語の複雑さは、次の主な要因の結果でした。
- マルチスレッド。 コマンド実行の並列性は絶えず増加しており、デバイスの増加によりサポートされています。 これには、スレッドを同期してリソースを使用するための追加の努力が必要です。
- 標準ライブラリの複雑なコンポーネント。 標準ライブラリに埋め込まれ、多数のプロパティを持つコンポーネントが常に増加しています。 これらのコンポーネントが内部的にどのように配置されているかについての知識は、悪影響を避けるために必要です。
- マルチプラットフォームのサポート。 可能な限り多くのデバイス上でプログラムの正しい動作を必要とするデバイスとプラットフォームの品揃えは絶えず増加しています。 これは特にモバイルアプリケーションで顕著です。
- 進化。 特定のプログラミング言語は、他の言語の開発、機器の開発、さらには商業の影響を受けます(新しいバージョンは、市場で販売される新しい製品です)。
超高級言語
説明されたプログラミング言語の進化のプロセスは、多数のプロパティを持つ大きなコンポーネントの出現をもたらしました。 高レベル言語の開発は、小さなコンポーネント(コマンド)を大きな構造に統合することにより、低レベル言語に基づいています(たとえば、高レベル言語から低レベルへのコンパイルが使用されます)。 とりわけ、説明されているプロセスには慣性があり、最終的にはプログラミング言語をさらに高いレベルから、いわゆるスーパーハイに引き上げます。
前述のように、抽象化レベルが上がると、内部実装の複雑さを隠す大きな構造(言語要素、関数、ライブラリなど)が出現します。 ただし、高品質の製品を作成するには、使用する構造の内部実装、動作時間、消費メモリ、およびその他のプロパティを知る必要があります。 これにより、次の図に示すように、開発者にとって都合が良いよりも複雑度が高くなります。
この図は、単純な要素または要素のプロパティが多数ある場合の複雑さの増加を示しています。 ご覧のとおり、低レベル言語に対応する多くの単純な要素を持つタスクは、コンピューターの実行に便利です。 多くのプロパティを持つコンポーネントを使用したタスクは、1人の開発者にとっては困難ですが、開発者のグループがより簡単に習得できます。
戦略
エントリーレベル
プログラミングを学習するための最も簡単なレベルは、コンポーネントの数とこれらのコンポーネントのプロパティが開発者にとって理解しやすいレベルです。 通常、これらのコンポーネントは、算術演算、テキストの処理行、単純なデータの入力/出力など、単純な一般的な操作を反映しています。 ほとんどの本は、このレベルから物語を始めます。
初期段階で最も重要なことは、質問を理解することです-「次は何ですか?」これは、現在のポイントから開発をさらに見ることができる重要な戦術的な質問です。 「次は何?」という質問は、次の2つの重要なケースで発生する可能性があります。
- 開発者は、トピックまたは方法を誤解する問題(立ち往生する問題)に直面しています。
- 開発者は、研究できるトピックが多数あるという問題に直面しています(選択の問題)。
開発者がトピックにこだわっている場合、彼は学習の方向(ベクトル)を変更する必要があります。このトピックを学習する別の方法を見つけるか、学習する別のトピックを選択します。 開発者が選択の問題に直面している場合-彼は選択をしなければなりません。 つまり、停止することはできません。
開発者は、初期レベルを習得した後、次の2つの主な方向でさらに開発するための選択を行うことができます。
- 低レベルのプログラミング。
- 高レベルのプログラミング。
低レベルプログラミング
低レベルプログラミングは、ハードウェアに優しいプログラミングです。 システムプログラミングをマスターするには、低レベルの言語とプラットフォームを学ぶ必要があります。 低レベル言語の学習は複雑であるため、多数の小さな単純な要素と、それらをコンピューターシステムで整理する方法を学ぶ必要があります。
低レベルのプログラミングは特定の傾向です。 開発者自身がこの指示に従うことを決定する必要があります。 これは現在、開発者がめったに選択しない方向でもあります。
高レベルプログラミング
高レベルプログラミング-プログラミング。通常、人間の生活の大規模なプロセスを自動化するソフトウェアが作成されます。 機器の動作の最適化を心配することなく、適用された問題を解決することを目的としています。
そのようなシステムは高水準言語を使用します。 ここでの研究の複雑さには、(低レベルプログラミングと比較して)より大きな言語コンポーネントと一定量のプロパティの研究が含まれます。 そのため、たとえば、開発者は、コンテナ(配列、スタック、ハッシュテーブルなど)の内部構造とプロパティを知って、悪影響(高いメモリ消費、スローダウンなど)なしでそれらを使用する必要があります。
高レベル言語の開発により、コンポーネントコンポーネントの「サイズ」が増加し、それに応じて、プロパティの数(外部および内部)が増加します。 開発者の複雑さは、これらのコンポーネントとそのプロパティを調査する必要性、および新しいコンポーネントとバージョンの絶え間ない外観を監視する必要性の両方で増加します。
組織
上記の問題は解決できません。 ただし、適切なアクションを実行しないと、停止する可能性があります。 多くのアクションが知られており、明確です。 上記の説明により、これらのアクションの有効性と必要性を理解できます。
- 専門化。 最新のプログラミング言語、利用可能なコンポーネントおよびライブラリのすべての可能性を習得することは不可能であるため、スペシャライゼーションでは、1つまたは複数の領域(デスクトップアプリケーション、ネットワークアプリケーション、関数ライブラリなど)のみを選択し、それらのみで作業できます。
- 協力。 1人の開発者が多くの問題を解決することは専門化のため不可能です(説明したように、1人の専門家が幅広い技術を所有することは不可能です)。 したがって、次の必要なアクションが発生します-他の技術を所有する開発者との協力。
推奨事項
要約すると、次の重要な事実を強調できます。
- 自己開発と専門家の成長では、目的の開発の方向性に関する知識が必要です-高レベル(より抽象的な)プログラミング言語またはプラットフォーム/機器に近いタスク(たとえば、システムプログラミングまたはリアルタイムシステムプログラミング);
- 特定のトピックの学習中に動けなくなった場合、やめることはできません。このトピックの学習方法を変更するか、別のトピックを開始して、現在のトピックをより良い時期まで延期する必要があります。
- 選択の場合、停止することもできません-選択するだけです。 そして、決して多くの人がすべてをマスターすることができないという事実を恐れるべきではありません。
- 目標は、幅広いトピックを勉強することではありません。 特定の数のトピックを選択して専門化する必要があります。
- プログラミングをマスターする場合でも、協力は非常に重要です。 他の開発者とコミュニケーションを取り、フォーラムに参加する必要があります。
そして最も重要なことは、プログラミングを愛し、プログラミングを学び、プロになるために一生懸命働く意欲がなければ、あなたは成功しないでしょう。