新しいソフトウェア開発者に何を教えるべきですか? なんで?

業界のニーズによりよく応えるためには、コンピューターサイエンスを教える際に大幅な変更が必要です。

画像
コンピュータサイエンスは、ソフトウェアシステム開発の中心にあるべきです。 それ以外の場合は、個々の経験と実用的な方法に頼らなければなりません。最終的には、生産性が低く、信頼性の低いシステムが不当に高い価格で開発および保守されます。 生産慣行を改善する教育の変更が必要です。

問題

多くの場所で、コンピューターサイエンス教育と業界のニーズの間にギャップがあります。 次の状況を見てください。
有名なコンピューターサイエンスの教授(誇りを持つ): 「私たちはプログラミングを教えません。 コンピューターサイエンスを教えています。」
Production Manager: 「彼らはプログラミングができません。」

多くの点で、それらは両方とも正しいものであり、表面的なレベルだけではありません。 科学コミュニティの仕事は平凡なプログラマーを訓練することではなく、業界は「総合的に開発され、高度な教育を受けた思想家」と「科学者」だけを必要としません。

コンピューターサイエンスの別の教授: 「1行もコードを書いたことはありません。」
別のプロダクションマネージャー: 「コンピューターサイエンス部門の卒業生は受け入れません。 KN物理学の卒業生よりも、物理学者にプログラミングの方法を教える方が簡単です。

両方の視点は理にかなっていますが、理想的には、両方の視点は本質的に間違っているでしょう。 教授は、あなたが練習していないことを教えられない(そして多くの場合、あなたが練習したことがない)ため、ソフトウェアの品質要件が非常に低いという点でしか理解できないので、誤解しています。物理学者(およびコンピューターサイエンスの専門家ではない他の人)が処理できること。 明らかに、コンピューターサイエンスを研究するために多大な努力をした物理学者を意味するわけではありません。このようなスキルの組み合わせは私の理想の1つです。

KN教授(学生について): 「彼は業界で働くための招待を受け入れました。」
KNのもう1人の教授: 「残念です。 彼はとても有望だった。」

この矛盾は多くの問題の根底にあり、それらを解決する試みを複雑にします。
業界では、コンピューターサイエンス部門の卒業生がソフトウェアを開発する必要があります(少なくともそのキャリアの初めに)。 このソフトウェアは、多くの場合、確立されたコードベースの一部であり、高い信頼性要件を備えた組み込みシステムまたは分散システムに使用されます。 ただし、卒業生の多くは、趣味以外にソフトウェア開発の教育や経験を本質的に持っていません。 特に、プログラミングは、宿題をするための最小限の努力であり、体系的なテスト、テクニカルサポート、ドキュメント、および他者によるコードの使用を含む、より広い意味ではめったにありません。 また、多くの学生は、あるレッスンで学んだことを別のレッスンで学んだことと比較することはできません。 したがって、私たちはしばしば、アルゴリズム、データ構造、およびプログラミング技術で高い評価を受けている学生に会うことができますが、それでもデータ構造、アルゴリズム、およびソフトウェア構造をまったく考慮せずに、オペレーティングシステムに関するレッスンのすべての複雑さを理解します。 結果は、判読不能な混乱の不十分な表現です。

多くの人にとって、「プログラミング」は不道徳なハッキングと他の人のライブラリの使用の奇妙な組み合わせになっています(何が起きているのか非常にあいまいな考えを持っています)。 「技術サポート」と「コーディング品質」の概念は通常忘れられているか、よく理解されていません。 業界では、「システム」を理解し、「ソフトウェアを設計できる」卒業生を見つけるのが難しいという苦情が広まり、現実を反映しています。

しかし、私のコンピューターは最近クラッシュしていません

ソフトウェアに関する苦情は人気のある活動ですが、ほとんどのソフトウェアは過去10年間で改善されており、過去数十年間で改善されています。 残念ながら、これらの改善は途方もない代償を払って行われ、人間の努力とコンピューターリソースに表れています。 本質的に、無限レベルの動的チェックと巨大なテストを追加することにより、信頼性の低い部品からかなり信頼性の高いシステムを構築する方法を学びました。 コード自体の構造は変更される場合がありますが、必ずしも良いとは限りません。 多くの場合、多くのレベルのソフトウェアと複雑な接続(構造が類似している)により、たとえ有能であっても、システムを完全に理解することができません。 これは将来的には良い兆候です。システムの主要な側面を理解できず、測定することすらできません。

もちろん、十分に機能しない、ほとんど理解されていないシステムを構築するというプレッシャーに抵抗したエンジニアがいます。 コンピューター化された飛行機がcrash落せず、電話が機能し、郵便が時間通りに到着するという事実に感謝することができます。 彼らは、ソフトウェア開発を完全で信頼できる一連の原則、ツール、およびテクニックにする努力に賞賛に値します。 残念ながら、それらの少数で機能的に冗長でリソース集約型のソフトウェアは、ほとんどの人の想像力と思考に勝っています。

同様に、理論と実践の分離を提唱する教育者もいます。 また、称賛と積極的な支援に値します。 実際、私が知っているすべての教育機関には実務経験を目的としたプログラムがあり、一部の教授は特定のプログラムの開発に専念しています。 それにもかかわらず、この問題をより広く考えると、私は感銘を受けません-いくつかのプロジェクトまたは実践は良いスタートですが、バランスの取れたカリキュラムへの統合アプローチの代替ではありません。 「コンピューターサイエンス」ではなく「ソフトウェア開発」または「IT」という優先名は、将来の違いを意味する可能性がありますが、新しいインストールへの移行後にわずかに異なる形式で再び発生する問題の質は低くなります。

「産業」と「科学的コミュニティ」の私の特徴は似顔絵のようなものですが、経験の少ない人なら誰でも、それらに反映されている現実の部分を認識するでしょう。 私の視点は、生産研究者およびマネージャー(AT&T Bell Labsで24年間、うち7人が学部長)の視点であり、科学コミュニティ(工学部KNの学部)で6年間過ごしました。 私は頻繁に旅行し、毎年数十(ほとんどがアメリカ)の企業の技術者やマネージャーと真剣な議論をしています。 大学を準備する人と業界が必要とする人との間に矛盾があり、これは先住民とコンピューター業界の両方の実行可能性に対する脅威です。
コンピューティングプロセスのみに依存している多くの組織では、技術スキルのレベルが危険なほど低くなっています。

科学的/業界の不一致

そして、私たちは何ができますか? 業界は、最新のツールとテクノロジーを使用するための十分な訓練を受けた「開発者」を採用することを好みますが、研究機関の主な目標は、最高の教授をさらに訓練することです。 進歩のためには、これらの理想をより良く構築する必要があります。 業界に参入する卒業生はソフトウェア開発に精通している必要があり、業界は新しいアイデア、ツール、テクノロジーをより良く吸収するメカニズムを開発する必要があります。 新しい開発者は本質的に新しくより良いものを作成するのに制限されるため、優れた開発者を作成した文化に半スキルのプログラマが害を及ぼさないようにすることは無意味です。

スケーリングの問題を指摘しましょう。 多くの生産システムは数百万行のプログラムで構成されていますが、学生はKNコースで優等で卒業することができ、1000行を超えるプログラムを書くことさえできません。 すべての主要な制作プロジェクトに数人が参加しますが、多くのKNコースはチームワークが湿気を帯びていることを考慮して、個々の作業を奨励しています。 これを念頭に置いて、多くの組織は、開発者のスキルの重要性を最小限に抑えるために、ツール、テクノロジー、言語、および操作手順を簡素化することに重点を置いています。 これは人間の能力と努力の不合理な使用です。なぜなら、それは誰もがより低い共通分母に導くからです。

製造業は、実績のある信頼性の高いツールとテクノロジーに依存したいと考えていますが、「問題の簡単な解決策」、「革新的なブレークスルー」、「キラーの追加」などの夢にも夢中です。 彼らは、プログラムの質の微妙な違いを考えるには高すぎる「夢想家」が率いる、最低限の資格を持つ交換可能な開発者と協力できることを望んでいます。 これは、基本的なツール(プログラミング言語やオペレーティングシステムなど)の選択における大きな保守主義と、モノカルチャーの夢(実装の準備とコストを最小限に抑えるため)につながります。 次に、これは巨大なプライベートで相互に互換性のないインフラストラクチャの開発につながります。開発者がアプリケーションやコンピュータシステムを作成するには、基本的なツール以外のものが必要です。 サプライヤーは、基本的な方法の共通性に加えて、開発者に何かを必要とします。 インセンティブシステムは、壮大な企業スキームと短期的な結果の両方を促進します。 最終コストは変動し、新しいプロジェクトの失敗率も変動します。

このような産業的現実やその他の同様の制約に直面している科学界は、独立した手段を講じて、できる限りのことを行います。理論的問題のための技術。 時代遅れのメソッドで書かれた巨大なソフトウェアデータベースを扱うプライベートメソッドは、このモデルには適していません。 業界と同じように、科学界も追いつくためのインセンティブシステムを開発しています。 これはすべて、明確に分散された科目の教育コースの継続的な改善を考慮して理想的です。 このように、科学分野の成功は牛のaddleとしての生産ニーズに適しており、業界は労働者の訓練と専門インフラの開発にお金を費やさなければなりません。

「業界が単に開発者にまともな給料を払えば、問題はないだろう」といつも誰かが言います。 それは役立つかもしれませんが、同じ仕事にもっとお金を払っても大した助けにはなりません。 合理的な代替手段として、業界には最高の開発者が必要です。 半熟練の交換可能な労働者によって制御されるコンベヤーとしてソフトウェアを開発するという考え方は、根本的に不完全で不合理です。 これにより、有能な人々の大半がこの分野から押し出され、学生が入ることができなくなります。 この悪循環から抜け出すには、教育機関は関連するスキルを持つ専門家をさらに卒業する必要があり、業界はこれらのスキルを使用するための方法、技術、プロセスを習得する必要があります。

プロフェッショナリズムの夢

「コンピューターサイエンス」はひどく誤解を招く用語です。 KNはもともとコンピューターに関するものではなく、もともと科学ではありませんでした。 むしろ、コンピューターユーザーと思考の仕組みについてであり、それにはコンピューティング(「アルゴリズム的および量的思考」)が含まれます。 多くの場合、コンピューターを使用して、科学、数学、および設計の機能を組み合わせます。 KNのほぼすべての人にとって、これは適用される球体です。「純粋なKN」は、適用されるアプリケーションから分離されていますが、原則として効果はありません。

アプリケーションを設計するKNスペシャリストと、同じものを設計する他の分野(医学や物理学など)のプロとを区別するものは何ですか? 答えは「完全な先住民族の本質に関する知識」でなければなりません。 この「本質」はどうあるべきでしょうか? 確立されたKNカリキュラムのほとんど-アルゴリズム、データ構造、コンピューターアーキテクチャ、プログラミング(基本)、いくつかの数学(証明および定量的推論に基づく初期推論トレーニング用)、およびシステム(オペレーティングシステムやデータベースなど) ) この知識を組み合わせて大きな問題に対処する方法の一般的なアイデアを得るには、各学生がいくつかのグループプロジェクトを完了する必要があります(これをソフトウェア開発の基本と呼ぶことができます)。 理論と実践のバランスが基本です。KNは原則と定理だけでなく、プログラムをハッキングするだけではありません。

明らかに、このエッセンスはコンピューター業界全体よりもはるかに「コンピューター指向」です。 したがって、CN内での追加の専門化(グラフィック、ネットワーク、ソフトウェアシステムアーキテクチャ、ヒューマンマシンインタラクション、セキュリティなど)がなければ、コンピューターとシステムの理論の専門家と呼ばれることはできません。 ただし、これではまだ十分ではありません。 コンピューターサイエンスの実践は本質的に適用され、学際的です。つまり、コンピューターとシステムの理論のすべての専門家は、他の分野(物理学、医療デザイン、歴史、会計、フランス文学など)で同等の最小限の知識を持っている必要があります。

経験豊富な教育者は、 「しかし、それは不可能です! 学生の誰もが4年間でこれをすべてマスターできるとは考えられません これらの教師は正しい。何かを変えなければならないだろう。 私は、コンピューターサイエンスの分野の専門家の最初の学位は、修士学位である必要があります-修士学位としてではなく、1年または2年の追加の研究を伴う修士学位である必要があります。 研究を行うことを計画している人々は、いつものように、哲学博士の学位を求めます。

多くの教授は、 「私にはプログラミングの時間がありません!」と反対します。それでも、ソフトウェアの専門家になりたい学生を訓練する教授は時間を見つけ、彼らの教育機関は彼らにプログラミングを奨励する方法を見つけるべきだと思います。 KNの最終的な目標は、より良いシステムの作成を支援することです。 手術を教えるために長い間患者を見ていなかった人を信頼していますか? 鍵盤に触れたことのないピアノ教師をどう思いますか? 本から必要な知識に加えて、KNを教えることは、完成したシステムにこの知識を適用し、プログラミングの美学を評価する能力を学生に与えるべきです。

私はプロという言葉を使います。 これは多くの意味と隠された意味を持つ言葉です。 医学や技術などの分野では、ライセンスを意味します。 ライセンスは非常に陰湿でエキサイティングなトピックです。 しかし、私たちの文明はソフトウェアに依存しています。 実際、誰もが自分の裁量で、企業ポリシーに基づいてプログラムの主要部分を変更できることが重要ですか? そうだとすれば、50年後にも重要になりますか? 何百万人もの人々が依存している一部のソフトウェアに保証がないことは重要ですか? 実際、問題は、ライセンスに基づくプロフェッショナリズムが知識、方法、技術の大部分に依存していることです。 免許を持つエンジニアは、受け入れられた技術と材料を使用して建物が建設されたことを保証できます。 CNの能力に関する一般に受け入れられている概念の欠如を考慮して(以前に想定したように)、これをコンピュータープログラムに適用する方法がわかりません。 今日、私は人々のグループを選択してライセンステスト(または、より現実的には、医療委員会などのさまざまな専門分野のテストセット)を設計する方法を知りません。

不適合を解消するために、業界は何ができますか? 「業界」と「業界のニーズ」を特徴付けることは、教育機関について話すことよりもはるかに困難です。 最終的に、教育機関には、目標を達成するための比較的標準化された構造と比較的標準化されたアプローチがあります。 業界ははるかに多様です。大小を問わず、営利目的または非営利目的、複雑または通常の建設システムへのアプローチなどです。 したがって、薬の処方を開始することさえできません。 それにもかかわらず、私は教育機関/産業間の不一致に直接関係する1つの観察を持っています:計算のみに依存している多くの組織は、技術的スキルのレベルを著しく低下させました:

プロダクションマネージャー: 「技術的な知識を探すことは生き残るために重要です。」
継続性と、新しい人材を採用および育成するためのインフラストラクチャなしでは、組織は成功し続けることができません。 ソフトウェア開発に関心のある教育者との相互作用の増大は、双方にとって生産的です。 共同研究と、単純なトレーニングコースを超えた継続教育に重点を置くことは、この点で大きな役割を果たすことができます。

おわりに

やってみなければなりません。 開始するまで、インフラストラクチャは引き続きリソースをきしみ、膨張させ、吸収します。 徐々に、一部が予期せぬ破壊的な方法で破壊されます(インターネットルーティング、オンラインバンキングシステム、電子投票、電力網管理など)。 特に、教育機関と産業界のギャップを両側で変化させることで狭めなければなりません。 コアおよび専門分野と応用分野に基づいて、先住民族のトレーニングの構造を定義し、一部のソフトウェア、少なくともそれを生産する先住民族の少なくとも一部の専門家のライセンスに徐々に焦点を当てることを提案します。 これは、技術専門家の生産/教育資格を高めることに偏りがあります。

Source: https://habr.com/ru/post/J105544/


All Articles