プログラミング知識の分類

2年前、プログラミング知識の分類に関する記事を書きました。 それはコンピュータ科学の独学での関心と私の活発な活動の結果でした。 私は記事を書いて、それを忘れました。 私はHabréに公開するつもりはありませんでした。 最後に、それは私の個人的な経験と知識に基づいており、非常に主観的であることがわかります。



最近、「プログラミングの学習方法」という質問を絶えず聞かれる中で、この資料を思い出して読み直しました。 すでに2年が経過し、経験が補充され、知識が追加され、見解が変わりました。 しかし、この記事の関連性は失われていません。また、変更したいものはほとんど見つかりませんでした。 彼女はまだ出版に値するように思えました。 そして、おそらく、彼女は自分の専門能力開発において誰かを助けるでしょう。



しかし、素材を「開始」する前に、別の小さな余談があります。 一般的に私がこれをすべて書いた理由について。 実際、IT分野で教育を受けた旧ソ連の国々では非常に厳しい状況にあります。 一方では、適切なレベルで専門家を訓練する訓練プログラムはありません(おそらく、エラーに起因する例外はほとんどありません)。 一方、独学の幅広い可能性のため、プログラマーは大学で勉強することを急ぐことはありません-誰もができるだけ早く練習を開始することに熱心です。 多くの場合、一方向のみが研究され(たとえば、PHP + Mysql-最も人気のある)、戦いが行われます。 さらに、これはすべて終わります。 その結果、基本的なことを知らない膨大な数のプログラマーがいます。 したがって、コードの品質に関する問題、およびサイクリングに関するアルゴリズムの効率に関する問題。



しかし、プログラミングは本格的な知識の領域であり、エンジニアリングトレーニングも必要です。 建設や通信のように。 はい、教育なしで自分で家(大邸宅)を建てることができます。 また、PHPとHTMLに関する本をいくつか読んで、ほとんどのサイトを上げることができます。 しかし、基本を知らずにGoogleを書くのと同じように、特別な準備なしに高層ビルを建てることはできません。



コンピュータサイエンスの独学の機会は膨大です。 不足している唯一のものは、体系的な準備です。 何を、どのような順序で学習するかを理解する方法は? この資料は、コンピューターサイエンスの知識の分野を整理し、本を学習するためのプログラムを作成するのに役立つと思われます。 書籍の選択は別のトピックであり、記事には含まれていませんが、コメントで議論できます。



行こう



時々、彼らは私がプログラマになるために何を学ぶ必要があるかを私に尋ねます。 質問はややナイーブです、なぜなら 私の意見では、普通に答えることは不可能です。 つまり まず、どのようなプログラマーになる必要があるかを把握する必要があります。 とにかくプログラマーですか? さらに、「労働力」だけでなく、有能な親愛なる専門家も市場で需要があります。 最初と2番目の知識と経験のパッケージは大きく異なります。



しかし、そのようなあいまいな質問にもかかわらず、それに対する答えを与えることはまだ可能です。 何らかの形でプログラミングに関連する知識の最大値を説明できます。 実際、彼らは通常、「プログラマー」という言葉がその名前に現れる専門分野の大学でこの最大限を教えようとします。



私は大学でプログラマーとして学び、その後大学で学びました。 いわゆるコンピュータサイエンスに関連する学問の理解と関係の棚を少しだけ置いたのは大学でした。 そこに与えられた知識は、大げさではなく、少し時代遅れではありませんでしたが、彼らの体系的なアプローチはうまく形成されていました。 卒業後の長年の練習の後、私は学問分野の大学分類は非常に優れており、プログラマーが知っておくべき質問に答えることができるという結論に達しました。



もちろん、すべてを知ることは不可能です。 はい、必要ありません。 さらに、いくつかの問題は深く理解する必要がありますが、他の問題は理解のかなり表面的な概要を持っています。 したがって、専門分野によっては、関連性の高い分野とそうでない分野があります。 しかし、システムエンジニアからWeb開発者まで、あらゆるソフトウェアエンジニアにとって、それらのほとんどすべてに共通の基本知識が必要です。



前の段落で、「ソフトウェアエンジニア」という用語を具体的に紹介しました。 どういうわけか、プログラマは必ずしもエンジニアではないことがわかります。 ウィキペディア定義からも、エンジニアは主にデザイナーです。 これが作成者、つまり システムを設計します。 しかし、プログラミングの実践では、設計は必ずしも必要ではありません。 コーディングで十分な場合もあります。この一連のテクノロジーを使用して、機能するものを作成します。 典型的な例は、ダミー、プレスリリース、drupalなどの企業またはマーケティングサイトの群れです。 これは技術者レベルであり、エンジニアではありません。 これは中等教育のレベルです。 また、プログラミング言語のコースを修了した後でも技術者として働くことができますが、そこでは強力な理論的基礎は必要ありません。



そして、ソフトウェアエンジニアに戻り、プログラマが研究している分野のグラフを提供したいと思います。 一部の分野は他の分野の知識を積極的に使用していること、または他の分野から成長していることさえ明らかです。 したがって、「上位」の主題を完全に理解するには、下位のある程度の理解が必要です。



グラフはオブジェクト(分野)で構成され、レベルに分かれています。 最も低い-一般的なベース -一般に、コンピュータサイエンスとは関係ありません。 これは、コンピュータサイエンスの分野が何に基づいているかを示すためだけに与えられています。



分野間の接続には、使用(通常の矢印)と拡張(矢印のアウトライン)の2種類があります。 使用は、別の主題の断片化された知識、および拡大の必要性を意味します-少なくともレビューが必要ですが、拡張可能な分野の完全な知識。



CS(コンピューターサイエンス)の第1レベル- 特別なベース 。 これは、4つの面のプログラマーにとっての発射台です。



  1. コンピューターの算術ベース (数値システムと数値による演算、論理演算)。
  2. コンピューターの物理的基礎 (半導体、トランジスター、論理素子、回路、集積回路);
  3. アルゴリズムの理論 (アルゴリズムとデータ構造、複雑さ、効率、メモリ内の情報の表現方法);
  4. プログラミング言語 (PLのタスクと概念、レベル、言語の種類、抽象化、抽象化のレベル、翻訳/コンパイル、テンプレート、原則、パラダイム-レビュー)。




特別な基盤は、より高いレベルの分野が構築される基本的な理論的知識を提供します。 平均的なプログラマーは、特別な基盤のすべての主題の概要知識を必要とします。 一部の専門分野では、アルゴリズムの理論を深く理解する必要があります(主にさまざまな種類のライブラリの開発者向け)。



より高いレベルは、プログラミングの基本的な分野です。 したがって、私はこのレベルの財団と呼びました。 以下が含まれます。



  1. コンピュータアーキテクチャ (プロセッサ、マイクロアーキテクチャ、メモリ、バス、入力/出力);
  2. 情報処理情報理論、統計、モデル、データ検索、言語的側面、テーブルプロセッサによる情報処理);
  3. C / C ++の基本(基本的な言語機能、構文、ポインタ、入力/出力、配列、STLの基本)。




基本に続くのはレベル1です。 これは最初に適用されるレベルであり、特に短気な人はこのレベルを習得して商慣行を開始できます。 5つの分野が含まれます。



  1. ASMの基本 (プログラミングの方向でのコンピューターアーキテクチャの開発、最も単純なドライバーとアルゴリズムの作成、C / C ++でのアセンブラーの挿入);
  2. C / C ++ (OOP、アプリケーション開発、ライブラリ、WinAPI、make utils、並列プログラミング)。
  3. オペレーティングシステム (OSアーキテクチャ、プロセス、プロセス間通信、スレッド、計画、メモリおよび周辺機器の操作、POSIXシステム);
  4. システム分析 (対象領域、ビジネスプロセス、フロー、図、システム分析の原則と理論);
  5. データベース (セット理論、DBMSの種類、リレーショナルDBMS、データモデル、SQL、特定のデータベース)。




次のレベル- レベル2-は前のレベルを開発します。 ちなみに、コンピューターネットワークは、最初にオペレーティングシステムを習得することが望ましい(ただし、必須ではない)という理由だけで、それに参加しました。 それにもかかわらず、開発によって、この主題は最初のレベルに近くなります。



レベル2に含まれるもの:



  1. ソフトウェア開発ソフトウェアライフサイクル、開発段階、ソフトウェアプロジェクトの基礎、ツール);
  2. データ分析 (データマイニング、OLAP、機械学習、ニューラルネットワーク、AI);
  3. コンピュータネットワーク (スタックレベルTCP / IPおよび/またはISO / OSI“ from and to”、プロトコル、C / C ++のネットワークプログラミング);
  4. マネージコードを使用したプログラミング言語 (マネージコード、仮想マシン、ガベージコレクター、単体テスト、C#またはJavaでの実際の実践);




レベル3は、平均的なプログラマーの最後のレベルです。 これは最もボリュームがあり、ソフトウェア開発に直接関係する分野のみが含まれています。 合計で6つありました。



  1. UIおよびユーザビリティの開発 (ユーザーインターフェイスの構築の原則);
  2. チームおよびプロジェクト管理 (開発方法論およびその他の管理問題);
  3. ソフトウェアテスト (概要:テストの種類、ツール);
  4. Webテクノロジー (HTTPプロトコル、Webサーバー、CGI、キャッシングとプロキシ、クライアントプログラミング);
  5. 分散システム分散システムのアーキテクチャ、ネットワークコンポーネントのプロトコル、ツール、原則、分散システム構築のアプローチ、フォールトトレランス、ビッグデータ、高負荷);
  6. インタプリタプログラミング言語 (機能、2つまたは3つの言語の基本、1つまたは2つの言語の練習:JS、PHP、Python、Ruby)




上記のすべてが高度な専門知識です。 概して、このレベルは無制限に拡張でき、関連する分野とソフトウェア開発の最も複雑な側面が追加されます。 コンパイラの開発、オペレーティングシステムの開発、大規模なソフトウェアおよびハードウェアシステムのアーキテクチャの構築、または特に高負荷向けに設計されたアーキテクチャの3つの例を挙げました。 グラフの下位レベルへの依存は描画されませんでした、なぜなら Generalベースまで、すべてのレベルを通過する矢印が多すぎます。 おそらく、広範な依存関係は専門家の質問の兆候の1つです。 それは、専門家レベルが最も幅広い知識と優れた経験を必要とすることを確認するだけです。



コラムで興味深いのは、被験者の学習の優先順序だけでなく、次のことも示していることです。



  1. 特定の専門分野では、どの分野がより必要であり、どの分野があまり役に立たないかを理解することができます(専門分野の主な主題を選択し、他者との関係と遠隔性を見てください)。
  2. 基本原則からではなく、応用知識(PHPなど)から始めると、コンピューターサイエンスの学習方法を理解できます。接続に沿って左右に移動できます。実際、これは私の個人的な開発パスでした(そして、私はそれを呼ぶことはできません)最も簡単で、最も効率的かつ最適です)。




グラフはモデルです。 良いモデルは通常、一度に多くの質問に答えます。 現実に近い、良いグラフを作成するタスクを自分で設定しました。 当然、それは私の個人的な経験に基づいており、理想的であると主張していません。 私はそれを最も客観的にしようとしました。 また、これはプログラマー向けのグラフであることを思い出させてください。 つまり テスター、システム管理者、およびプログラミングに近い他の職業にとっては、多かれ少なかれ似ていますが、明らかに異なります。







PSプログラマー知っておくべきこと、知らないことをテーマに、ホリバーを開発しないという真剣な要求。 これはすべての人の個人的な選択であり、記事はそれに関するものではありません。 ここに知識の分類とそれらの間の関係があります。 これは誰にとっても興味深いものではなく、誰もが必要とするわけではありません。



All Articles