なぜ学校ではこういったことを教えないのでしょうか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/79231

質問

夏の間、私は幸運にも Google Summer of Code に参加することができました。私はたくさんのことを学びました(おそらく大学の授業をすべて合わせて学んだ以上のものです)。私が学校でもっと早くに学んだことのいくつかをなぜ彼らが教えてくれないのか本当に不思議です。いくつか例を挙げると、

  • 単体テスト
  • バージョン管理
  • アジャイル開発

彼らは、データ構造やアルゴリズムなどの他のことを事前に教えるのにかなりの時間を費やしているように思えます。これらは早い段階で学ぶことが非常に重要だと今でも思いますが、なぜ彼らはその前にこれら 3 つをもっと教えないのでしょうか。それとも、私の学校だけがこのようなことをあまり教えていないのでしょうか?

誤解しないでください。大学が常に流行の最先端のプログラミングを教えることが望ましいとは思いませんが、教授たちは「コーディングを開始する前に図を描く」以外のことを教えるべきではないでしょうか?

役に立ちましたか?

解決

あなたの質問に対する最も簡単な答えは、コンピューター サイエンスとソフトウェア開発の分野はどちらも非常に新しく、あまり理解されていないということです。現代ではすべての科学および工学分野がより急速に進歩していますが、他の分野には活用すべき経験が数多くあり、それらがどのように機能するかについてははるかに広範な共通理解が存在します。

たとえば、最近の材料科学の進歩にもかかわらず、土木技術者は約 2000 年前から、倒れないアーチを構築する方法を知っており、これは大学で比較的ほとんど論争なく教え、学ぶことができるものです。ソフトウェア開発者が学ぶべきテクニックについては私も完全に同意しますが、この合意は個人的な経験と非公式の推論に基づいています。社会的に受け入れられた「ベストプラクティス」となるためには、収集に非常に費用がかかる定量的なデータが必要です。バージョン管理はどの程度役に立ちますか?それはどのように役立ちますか?単体テスト?さまざまなテクニックの有効性について推論することはできますが、実際にその有効性を決定的に証明するには非常に費用がかかります。完全で現実的なソフトウェア プロジェクトを最初から最後まで何度も、同等の専門知識を持つプログラマーのグループとともに、さまざまなテクニックを使用して実行する必要があります。少なくとも、既存のプロジェクトが公開したくないであろう既存のプロジェクトに関する大量のデータが必要になります。

土木技術者は、何千年もの橋を調べなければならず、多くの情報を持っています。一方、ソフトウェア開発者が持っている情報は数十年分しかなく、そのほとんどが秘密にされています。組織が開発者の有効性に関する情報を収集していても(ほとんどが情報を収集している)、それを収集して公開する動機がほとんどないためです。 't)。

分野の混乱もあります。ソフトウェア開発、またはソフトウェア「エンジニアリング」は、実際にはコンピューター サイエンスとは異なります。ソフトウェア開発者にはコンピューター サイエンスの実用的な知識が必要ですが、アルゴリズムの複雑さの境界で作業したり、並列処理について推論したりすることは、現役のプログラマーが毎日行うことではありません。同様に、本物の「コンピュータ科学者」は、単に機能しない、または何も興味深いことをしない使い捨てコードを大量に書き、実際のソフトウェア製品のような厳格さからそれほど恩恵を受けません。

インターネットとオープンソース コミュニティの出現は、これらの質問に最終的に答え始めるのに十分なデータを提供するかもしれませんが、たとえ明日答えが得られるとしても、それが国際社会に浸透して誰もが同意するまでにはおそらく 100 年かかるでしょう。学校で教えるべきだ。

最後に、経済的な考慮事項がいくつかあります。ソフトウェア開発に携わるほぼ全員が、必要な開発ツールを実行するための専用マシンに安価で簡単にアクセスできるようになってから、比較的短期間でした。数十年前、マシンをテストの実行のみに完全に専用にしたり、ソース コードの無限の履歴を格納したりすることは、多くの人にとって途方もなく高価だと思われたでしょう。

他のヒント

なぜなら、私たちの教師は次のように言うからです。

  1. 単体テストを試したことはありませんが、
  2. バージョン管理の使い方が分からず、
  3. 「アジャイル開発」なんて聞いたこともありません。

学生は問題を自分自身で解決する必要があります。それを実行したら、結果はうまくいきましたね。

レオナルド・ダ・ヴィンチはこう書きました。

科学のない練習に夢中になっている人は、ラダーやコンパスのない船に行くパイロットのようで、彼がどこに行くのか確実なことはありません。実践は常に理論の健全な知識に基づいている必要があります。

優れた学校では、理論 (データ構造、アルゴリズムなど) と実践 (単体テスト、バージョン管理など) の両方を教えています。これには、コインの両面を適切に教えることができるように、教員の適切な組み合わせが必要です。実務経験のない理論派ばかりの教員ではダメだ。同様に、実務家だけで構成された教員もだめです。ミックスが必要であり、優れた学校にはそれが備わっています。

コンピューターサイエンスは常にどこか矛盾しています。コンピューターに関する部分は科学ではありませんし、科学である部分はコンピューターに関するものではありません。

大学は「科学」の分野(アルゴリズム、データ構造、コンパイラなど)にもっと傾倒する傾向があります。なぜなら、これらの分野は現在の業界のベストプラクティスよりもはるかに「時代を超越した」ものであり、年々進化し変化する傾向があるからです。たとえば、バージョン管理はここ 5 ~ 10 年で驚くべき変化を遂げましたが、big-O は依然として big-O であり、ハッシュ、Btree、および再帰は 40 年前と同じように依然として便利です。彼らのアイデアは一般的に、基礎となるデータ構造が SHA-1 ハッシュの非循環有向グラフであり、開発者が懸命に取り組んできたと言われたときに、git などのツールを手に取り、それが何を意味するのかを理解できるように、十分な基礎を提供することです。システムコールの数を最適化して、IO バウンドになるようにします。

さて、最後の文を理解するために知っておくべきことをどこで学んだか考えてみましょう。答えが「大学」であれば、大学はきちんと仕事をしていることになります。

私はオレゴン工科大学の非常勤職員だったときにこれらのことを教えました。彼らはまばらに教えられます。

すべては一時的な流行です。大学を出て最初の1年は、大学生活全体よりも多くのことを学ぶことになります。コンピューターサイエンスはコンピューターとは何の関係もありません。

大学では、たくさんの道​​具が詰まった道具箱を用意しています。これはドライバー、つまり三日月レンチです。各ツールは大学で一度は使用できるかもしれません。あなたが現実の世界に入ったとき、それはあなたが本当に持っているものを知るときです。役立つものを残りから分類し、念のため自宅の作業台の上に置いておきたいものと、毎日ポケットに入れておくものを分類します。

TQM、ISO、CMM、アジャイルなどこれらはすべて流行であり、いつかは去っていきます。成功したものはどれも単なる常識を超えたものではありません。成功したエンジニアや企業はすべて、ある種の常識を使用しており、それが彼らを成功に導いたものであり、それに名前を付ける必要がある人はほとんどいませんでした。問題は、常識を売り込むことはできないということです。マネージャーは、キャッチーな名前がなければ、常識をトレーニングして購入しても、会社に自分の価値を証明することはできません。上司がニュース記事や雑誌で読んだという名前を付けておけば、マネージャーは自分の仕事を維持し、あなたはあなたの仕事を維持します。これらの慣行に従っていると主張する企業のうち、実際に実行している企業はほとんどありません。ほとんどの場合、コンサルタントに小切手を書き、年間または生涯の証明書をどこかのクラブに発行して、ウェブサイトにグラフィックを掲載したり、製品が入っている箱にラベルを貼ったりできるようにします。多くの人は、これは珍しいことだと主張するでしょう...そこに行った、見た、それは起こります。これはすべてビジネスの一部であり、利益を維持し、ドアを開けて照明を点灯し続けるためには、時には手を抜く必要があります。これらすべての実践の熱心な支持者たちは口を揃えて、前回のやり方は一時的な流行で、今回のやり方はそうではない、前回のやり方は本当にお金がかかりすぎて従うことができなかったが、今回のやり方はそうではない、と主張しています。最後のものはコンサルタントを雇ったばかりの偽物でしたが、これは本物です。プログラミング言語と同様に、これらも進化します。

ビジネスの現実、大学システム、そしてその中での自分の役割を理解する能力が鍵となります。人生のあらゆることと同じように、戦いを選択してください。あなたが必要としている、あるいは知りたいことを教えるのは、大学でも、企業でも、政府でも、その他の誰かの仕事でもありません。ナンバーワンを探すのがあなたの仕事です。同様に、これを行う時間を提供してくれた他の人を責めることはできません。あなたはそれをしなければなりません。あなたは馬から落ちます、あなたは犠牲者ではありません、立ち上がって再び乗りなさい、言い訳はありません、人生はそれに対して公平ではありません。独立しているふりをせずに、配布物を活用してください。そして、必ず会費を支払い、見返りとして何か(その時点でのあなたのベスト?)を与えずに、会社に配給品を食い散らかさないでください。

なぜ人々は cmm やアジャイル、あるいはその他のものが流行だと考えるのでしょうか?なぜ彼らはそうではないと思うのでしょうか?なぜ教授はあなたにそのようにプログラムを教えたのでしょうか?goto を避けるためか、定数を避けるためか、あれやこれやを避けるためか?より信頼性の高いコードが生成されるからでしょうか?コードのパフォーマンスが向上しましたか?ヒューマンエラーは減るでしょうか?それとも、論文やプログラムの採点が容易になり、研究により多くの時間が与えられるためでしょうか?それは、彼らがプログラミングの方法を知らず、そのテーマに関する他の人の本に従っているだけだからでしょうか?保守可能で信頼性が高く、パフォーマンスの高いコードを作成することはできないと教えられましたか?「2 つを選択する」ことさえできず、保守性が信頼性と高性能の両方を妨げるのではありませんか?場合によっては、パフォーマンスのために信頼性を犠牲にすることもあります。信頼性やパフォーマンスを気にせず、別の会計ソフトウェア プログラムのバージョン 117.34.2 からバージョン 118.0.0 に移行したい場合もあります。あなたのビジネス モデルは、バージョン アップグレードと技術サポートの販売であり、ソフトウェア開発者にとっては、同じコードを同じ方法で記述できる古いロボットなら何でもできます。燃え尽きたものを大学を卒業したばかりのものと交換し、アップグレードを販売し続けます。

これらの質問に対する普遍的な答えはありません。自分の意見が何であるかを見つけて、それを受け入れ、それを擁護する必要があります。考えを変え、それを受け入れて、それを守りましょう。

すべてを疑ってください...コンロの熱い鍋に触れたら本当に火傷しますか?恐怖による心理的影響は、火傷以上のダメージを与えるのでしょうか?怪我をせずに答えをテストする安全な方法はありますか?

お金に余裕があるときは、寮の部屋でトランジスタ、キャップ、抵抗器などを購入し、最終的には溶かしてしまいましたが、それらはすべて独特の悪臭を放っていました。最初のトランジスタクラスの翌日にアンプを組み立てるよりも、ステレオ用のアンプを購入する方がはるかに安くて簡単です。もちろん Linus は例外ですが、オペレーティング システムを作成するよりも、単にオペレーティング システムを購入する方が簡単です。その間に学んだことは Linus が学んだこととは異なりますが、より多くのことを成し遂げることができます。

大学の内外の世界は、問題を解決するためにこれらの公式 (cmm、アジャイルなど) を採用し、次の公式が登場すると、同じ速さでそれらを廃止するでしょう。成功するためにバージョン管理を使用する必要はありません。使用した場合と使用しない場合と同じくらい多くの成功があります (実際、業界の年齢のせいで、これまでのところ、バージョン管理なしで成功した例はさらに多くあります)。同様に、最小限のテストで成功することもできます (コンピューター業界の本当に有名な企業を例として見てください)。自分のコードをテストすることによって成功することも、自分のコードを決してテストしないというルールに従うことによって成功することもできます。emacs を使用しても成功する可能性がありますし、vi を使用しても成功する可能性があります。どのような組み合わせが自分に合っているのかを判断し、運が良ければ自分に合った職場を見つける必要があります。時間の経過とともに、ツールから言語、プログラミング スタイル、不安、バージョン管理、ドキュメントなどに至るまで、何が効果的かは変化していきます。あなたは結婚して子供が生まれ、小さな新興企業の売れっ子プログラマーになる代わりに、退屈な仕事をしながら大きな健康保険に加入して大企業の片隅に隠れて子供たちを楽しみたいと思うかもしれません。

大学を出て社会に出たら、「昔の人」たちの話を聞き、一緒に働き、議論してください。彼らには数十年から数世紀にわたる経験があり、彼らが陥った罠をあなたは避けたり、自分で試したりすることができます(火傷するかどうかを知るために鍋に触る必要がないことに気づいているかもしれません)。ほとんどの人は、これらの流行の少なくとも 1 つまたは 2 つが去来するのを見たことがあるでしょう。特に、それらがどれほどひどい火傷を負ったのか、そしてそこから立ち直るために何をしたかを見たことがあるでしょう。彼らは、物事をテストするためのさまざまな方法を知っており、また、現れては消えたテスト スタイルの名前も知っています。何が機能し、何が機能しないのか。リスクはどこにあるのか、また、接線での時間の無駄を避ける方法。あなたが成長してベテランになったら、それを前に渡してください。自分の後に続く人たちに教えようとすることで、学んだことの対価を支払います。ただ魚を与えるのではなく、魚の釣り方を教えることを忘れないでください。そして、場合によっては、大火傷を負わないように、成功する前に失敗させなければなりません。

ここで私が本当に言いたかったのは、現在、私たちは並行宇宙の進化を目撃できる(そしておそらくそれに影響を与える)ことができる稀な状況にあるということです。はい、コンピューターサイエンスは、物理学と比較すると若い科学です。しかし同時に、それは何度も進化してきました。働いている場所や一緒に働く人によっては、ハードウェア エンジニアを観察できるかもしれません。ハードウェアの世界におけるプログラミング言語は確かに新しいものではありませんが、ソフトウェアの世界ほど急速には進化していません。ソフトウェアのスタートは数十年先を行っていました。ハードウェアは常にソフトウェア エンジニアを二級国民だと考えてきました。私たちの仕事は簡単ですが、彼らの仕事は難しいです。(実際には私はハードウェアとソフトウェアの両方のエンジニアであることに注意してください)。興味深いのは、彼らは現在、私たちが初歩的または幼児的問題と考えるものをまだ扱っているということです。なぜバージョン管理を使用する必要があるのでしょうか。このチップの開発に取り組んでいるのは私だけです。gcc やその他の安価なコンパイラ、または無料の IDE でのあなたの経験は、私が使用している高価なツールとは比べものにならないでしょう。会社があなたがそれを使用するのに十分な価値があると判断した場合、またはその使用方法さえ知っていれば、コピーを購入するでしょう。他にも言い訳はたくさんあります。私は、そのようなハードウェア エンジニア (卒業証書には電気エンジニアと書かれていますが、私の役職はソフトウェア エンジニアです) からすると、ほとんど挑戦的なことで、1 週間以内に vhdl と verilog の両方を学び、両方とも生産性を高めることができてうれしかったです。私はこれらの言語を学びたかったので、ツールが利用できるときは夜までオフィスに残って独学しました。その時点から、特にそのエンジニアは、私の言っていることは真実であり、言語は単なる構文であり、プログラミングの基礎は同じであり、ツールはすべて同じことを行うことに気づきました。リンゴとリンゴではなく、リンゴとリンゴです。

一般的には、これら 2 つの並行業界の一方が、言語、プログラミングの習慣、ソース管理、テスト、ツール、プログラミング環境などに関して他方よりも多くの経験を持っているというメッセージを送るのはまだ困難です。私が解決しようとしている問題は、開発中のハードウェア設計を取得し、プロセッサのシミュレーション (仮想マシン) と連携できる手頃な価格の機能シミュレータを作成して、ハードウェアのテストとテストの開発を開始できるようにすることです。シリコンに移行するずっと前に、ソフトウェアを納品できるようになります。いいえ、これに関して「新しい」ことは何もありませんが、最新のコードを取得し、コードの変更を追跡して、どこに時間を集中する必要があるかを確認するメカニズムがありません。ハードウェアへのユーザー (プログラミング) インターフェイスを定義するドキュメントを追跡するメカニズムがありません。1 つのゴールデン コピーはバイナリ形式で誰かの電子メールの受信箱にあり、変更されるときだけ変更されます。何が起こっているかを知るために Verilog を読む必要はありません。ちょっと待って、その Verilog は何年前のものですか?私があなたのために一週間費やしたそのバグは、3週間前に発見され、修正されましたか?それでは、私たちはどこかの休暇スポットに飛んで、6か月間パーティーをして、ハードウェア担当者がタスクを完了して壁を越えて私たちにそれを投げるのを待ちますか、それとも、この機会を利用して、忍耐強く楽観的になり、ハードウェア担当者に次のことを教えるように努めますか?それほど煩わしくなく、仕事をこなし、仕事をバックアップし、ピアレビューのために自分の内容を共有できる常識的な方法があります...

ハードウェア エンジニアは、あなたと同じように、ピカピカの新しいツールの箱を持って大学を卒業したことを思い出してください。あなたは 17 の異なるプログラミング言語を学びましたが、そのうち 1 つだけを使用することができ、キャリアの中で残りの言語は大学を卒業した後に発明されることになります。彼らは大学を卒業すると、微積分と相対性理論について、各元素に電子が何個あるか、ガウス面の周囲の電荷を計算することについて知っていることを話すことができます。しかし、彼らのキャリアの大部分は、1、0、または、そして、そうではありません (共通しているのは、コンピュータについて本当に知っておく必要があるすべて、1、0、そして、またはハードウェア エンジニアまたはソフトウェア エンジニアではないということです)。物理学の基本法則である微積分を前提とすると、電子はプログラミング言語ほど速くは変化しません。しかし、プログラミングの基本はどの言語でも同じであり、今後も変わりません。それを知って大学を辞めたのでしょうか、それとも、あれこれ考えて Java は C++ とは異なり、優れていると考えて大学を辞めたのでしょうか?

他のビジネスと同様、大学の仕事は利益を上げ続けることです。大学は適切な学生を雇用し、適切な研究費と適切な種類の研究をもたらして大学の利益を上げなければなりません。大学は適切な学生を集め、適切な卒業生を輩出するために適切な授業を提供しなければなりません。そうすれば、数十年が経つにつれて、大学の近くの雇用主だけでなく、願わくば遠方の雇用主も、この大学が生産性と収益性の高い従業員を輩出していると認識してくれるでしょう。(はい、適切な量のテレビ放映時間、適切な知名度、スポーツ収益を得るために、適切なスポーツに適切なアスリートを引き付ける必要がある場合もあります)。C++ と Java を教える大学もあれば、まったく教えない大学もあります。CMM を発明する人もいれば、アジャイルを教える人もいますが、そのどちらもしない人もいます。大学に少しでも価値があるのであれば、そこには学ぶべき何かがあるはずです。彼らは学ぶべきことをすべて教えてくれるわけではありませんが、役に立つことはあるでしょう。滞在中に、さまざまな形の工具を適切な数だけ工具箱に集めてください。大学を辞めて就職する。もしあなたのツールボックスが最悪なら、別の大学を探して、最初の大学については絶対に言及しないでください。それが大丈夫なツールボックスであれば、それらのツールを使用して、自分の時間に新しいツールをいくつか作成してください。それがかなり良い道具箱である場合は、その大学とあなたがあれこれ学んだ優れた学問について良いことを言い、彼らがあなたに与えてくれたものを学校に返してください。大学ツールのユニバーサル カタログにあるすべてのツールを入手できなかったとしても、特定のサブセットを使用して終了することになります。卒業しなくても…

ああ、もう始めさせないでください

以前、評判の高い大学のCS部長に、オブジェクト指向プログラミングは単なる「流行」なので、C++のような一時的な空想の授業は提供していないと言われたことがあります。

なぜこれらのことを教えないのかというと、大学は学問の基礎を教えるためにあるのであって、必ずしも業界のベストプラクティスを教えるわけではないからです。

最も簡単な答えは、あなたはコンピューター サイエンスを勉強していて、あなたが挙げたものはコンピューター サイエンスの学問分野とはあまり関係がないということです。ソフトウェア開発はあなたがやりたいことかもしれません する コンピューター サイエンスでは、これまでに学んだことを基礎にして構築されます...しかし、コンピュータ サイエンスとソフトウェア開発は同じものではありません。

バージョン管理や効果的な単体テストの作成方法を教えたクラス...それはあなたに教えることになります 貿易, 、つまり、(良い)ソフトウェア開発です。

そうですね、大学では本当に普遍的なことを教える必要があるのです。アジャイル開発のようなものはまだかなり新しいもので、インターネット上でどれほど話題になっているにもかかわらず、どこでも使われているわけではないため、クラス全体の生徒に教えても、アジャイル ショップにたどり着いた少数の人々にしか恩恵を及ぼさない可能性があります。

しかし、バージョン管理は最近では許しがたいものになっています。これはコンパイラとほぼ同じくらい便利なツールであり、CVS は約 20 年以上前から存在していることを誰もが理解する必要があります。この概念は、大学を卒業したプログラマーであれば少なくとも理解する必要があります。幸いなことに、大学でグループワークを行っている場合は、バージョン管理についてすでに知識があり、グループにバージョン管理を使用するよう説得している人に出会うことができるかもしれません。あの人が私のグループにいてくれてよかったとわかっています。

単体テストも同様に許しがたいものです。唯一言えるのは、この本はまだテスト駆動開発について書かれておらず、100% のコード カバレッジを目指すと、価値がある以上に困難が伴う場合があるということです。ただし、単体テストは非常に価値があるため、ソフトウェア エンジニアリングのコースで取り上げる必要があります。この情報の一部は一部の大学に流入していると思いますが、まだすべての大学に届いていないだけです。

確かに、なぜそうではないのでしょうか?CS の学位を取得したときの私の経験もほぼ同じでした。その理由は、私の知る限り、プログラミングを教える人はプログラミングをしていないからです。認定のためにそのようなことを教える必要はなく、教師もそれに慣れておらず、学生はコースワークの一部として重要なプロジェクトを開発することはありません。CS 理論や Java 構文を教えるのとは対照的に、実際にプログラミングを教える動機はありません。

それは大学によって異なります。私は 2003 年にオーストラリアの大学を卒業しました。その間に私たちは、UML、単体テスト、XP (およびその他のアジャイル手法) に加えて、Z、アルゴリズムとデータ構造、オペレーティング システムなどのすべての正式なものを学びました。

ただし、単体テストについては詳しく説明されておらず、単に 1 回の講義に対して合格サービスを支払うだけでした。「単体テストとは何か」ということだけではなく、効果的な単体テストの書き方を学べたら良かったと思います。

バージョン管理に関しては、2年目以降のプログラミングプロジェクトではバージョン管理(CVS)を使用していました。

私もグリフ氏の意見に強く同意します。CS は非常に未熟な分野で、実際に誕生してから 50 年ほどしか経っていないため、何を学ぶべきか、何が一時的な流行に過ぎないのかがわかりません。150年も経てば、事態はもっと落ち着いてくるかもしれない。失敗した現実世界のプロジェクトの数を見れば、この業界が未熟であることが明らかです。建築プロジェクトの 80% が失敗した場合を想像してみてください。

コンピュータ科学者は、自分たちはエンジニアではなく数学者であると考えているため、エンジニアリング部分よりも数学部分を教えることを好みます。テスト、バージョン管理、ドキュメントは、他のエンジニアリング分野と同様に、一時的な流行を過ぎています。

これらすべては、ソフトウェア開発実践に関する 1 つのクラスで簡単に (浅く) カバーできます。それは CS の目的ではないため、ほとんどの CS カリキュラムには含まれていませんが、その内容についてある程度取り上げることは役立つと思います。私の学校にはそのような授業がありました。バージョン管理についてはカバーしていませんでしたが、UML、要件の収集、開発方法論 (さまざまなアジャイルおよびウォーターフォール)、単体テスト、統合テストなどはカバーしており、プロジェクトを開発するには 4 ~ 5 人のチームで作業する必要がありました。 (Java におけるかなり単純な Clue のパクリ)。さらにソフトウェア エンジニアリングのクラスが必要だと感じた場合は、選択科目として受講できます。

私が受講したクラスでは一度もバージョン管理について言及されたことはありませんでしたが、ほとんどの友人は個人的なプロジェクトやクラスの課題などにバージョン管理を使用していたので、私たちがバージョン管理に触れていなかったわけではありません。自分で拾わなかった人たちは、チームの課題でクラスメイトに強制的に使わせられました。

大学は概念や理論を教えることを目的としています。それらは自分では習得するのが難しいものだからです。バージョン管理はツールであり、習得するのは非常に簡単です。少し使ってみて、ウェブ上のチュートリアルを読んだら、準備は完了です。SVN から何かをチェックする方法を理解するために講義や宿題が必要な場合は、実際には難しいことで多くの苦労をすることになります。

大学では授業以外にも学ぶ方法がたくさんあるということを忘れないでください。それを利用してください。授業に参加したり施設を利用したりするのに多額のお金を払っているのですから、その価値を最大限に引き出してLUGやACMの会議に参加したり、プロジェクトチームに参加したり(プログラマーを必要とするロボットを構築しているMEが常にいます)、あるいは人文科学部のサーバーを管理する仕事。材料工学棟の積み込みドックからコンピューターをゴミ箱に捨て、寮の高速インターネット接続を使って Linux ISO をダウンロードして、遊んでみましょう。

問題は、大学がプロになるために教える必要があると考えておらず、代わりにプログラミングの学術的な側面に焦点を当てていることだと思います。業界で使用されている最新の方法や技術については、学術的にも興味深いものであるため、少なくとも参照する必要があると思いました。

私たちのコースでは、プロジェクトに費やした時間の記録や優れたコメントなどを扱うパーソナル ソフトウェア プロセスについて教えられましたが、バージョン管理などの専門的な基本については言及されていませんでした。

私はそれらすべてを大学で学びました。おそらく選択したコースにもよるでしょうか?私のコースは非常に多様でした (ソフトウェア デザイン、UI デザイン、e コマース、AI、関数型プログラミングなど)。ソフトウェア デザインでは、デザイン パターンと単体テスト (さまざまなものが関係する 1 つの大きなプロジェクト) を経験しました。UI デザイン...私たちは 3 人のグループでプロジェクトに取り組んでいました。バージョン管理がなければ何もできなかったので、それを実現しました。そして、アジャイル開発については教授たちが継続的に教えてくれましたが、それを使用するかどうかは各グループに任せていました。

多くの大学生が「簡単な」コースや、高い GPA を獲得できるコースを受講していることがわかりました。また、自分が学びたいことに集中し、どの分野に興味を持ちそうなのかを主に模索している人もいます。そして、自分が何に興味があるのか​​を正確に知っている人もいます...彼らがコースを多様化しない傾向があることを除けば、それは良いことです。

なぜこれらのことが最初に教えられないのかに答えると、次のようになります。学部プログラムでは通常、修士課程の学生になるための訓練が行われます。自分でコースを選択し始めてから(これは通常、後年に行われます)、学界の外で使用されるものについて学ぶことを選択できるようになります。これが、アルゴリズム、データ構造、未解決の問題の提示などに焦点を当てる理由です。

個人的には、彼らがこれをやっているのは良いことだと思います。プログラミングは、私たちの多くが思っているほど簡単ではありません。多くの人がそれに苦労しています。私としては、こうした人々には、Perforce が何であるかを理解する前に、まず for ループがどのように機能するかを理解してもらいたいと思っています。

ほとんどの学校は商業ではなく学術であるため、そのようなトピックは教えません。つまり、これらはアイデアや理論を教えることを目的として設計されており、キャリアを訓練するものではありません。QA の概念全体は、数学的証明を渡すこと以外、コンピューター サイエンスとは何の関係もありません。さらに、QA の実践や開発ワークフローは開発会社ごとに大きく異なるため、学校で教えるのは時間とお金の無駄です。

私はアジャイル開発を除いて、これらすべてを 1 年生のときに学びました。

私見ですが、重要なのは適切な学校を選択することです。トップ 10 に入れば、すべてのことをすぐに学ぶことができます。

CS 教育全般に関して言えば、私たちは基本的に教授に多くのこと (あらゆる種類の言語、データ構造、実行時の効率、ビット レベルで実際に動作する方法など) を教えることを求めています。私は、なぜ子供たちはソフトウェア エンジニアリングについてもっと学ぼうとしないのかと疑問を提起したいと思います。

あなたは 3 つを挙げましたが、そのうちのいくつかはコンピュータ システムを理解する上でそれほど重要ではないと思います (バージョン管理など)。これらは仕事の一部であり、知らなくても優れたプログラマーやコンピューター科学者になれるのです。

単体テストについても同様です。なぜ単体テストを選ぶのでしょうか?ユーザビリティテスト、システムテスト、ユーザー受け入れテスト、工場受け入れテストの方が重要なのでしょうか?まあ、コードがメンテナンス部門に出荷された時点で仕事が完了したと考えない限り、それらは問題ありません:)

私が日常的に使用している他の概念について考えてみましょう。これらは、ソフトウェアとコンピュータ システムの基礎を理解しようとしている学生にはほとんど役に立ちません。

  • コメントの良い習慣
  • 標準への準拠 (国際標準だけでなく、チームのコーディング標準)
  • ドキュメンテーション
  • 変更管理 (相違点を保存するバージョン管理と必ずしも同じではありません。これは、何かを変更した内容とその理由についてのことです)
  • ユーザビリティ開発

上記はすべて「ソフトスキル」です。 必要 良いコードを書くために。

ただし、データ構造やアルゴリズムなどの「難しい」スキルが欠けている場合、良いコードを書く可能性はほぼ不可能です。

学生と同じように、大学もそれぞれ異なります。一部の大学、より正確には、一部の教授は変化に抵抗したり、怠け者です。幸いなことに、ほとんどはそうではありません。理論、概念、歴史などはあらゆる CS カリキュラムにとって重要かつ不可欠です。しかし、学生の労働環境への準備も同様です。当然のことですが、私の地域のコミュニティカレッジでは、最新かつ応用可能な CS コースを提供しています。大規模で確立された名門大学ではそうではありません。

それは単純に、データ構造とアルゴリズムがコンピューティングの中核を構成しており、それによってはるかに重要だからです。単体テスト、バージョン管理、およびアジャイル手法は単なる取引ツールにすぎません (そして、必要に応じて、仕事中にそれらを習得することが期待されています)。

優れた CS プログラムでは、将来のすべてのプログラミング教育の基礎となる基礎を教える必要があると思います。アジャイルのような開発方法論やバージョン管理ツールは流行のようなものです。彼らは行ったり来たりします。また、学術的なものではなく、業界の現場で使われることが多いので、実際に仕事で学ぶであろう内容を大学が取り上げるのは珍しいと思います。それが正しいとは言いませんが、おそらくそれが学問的な考え方です。

私はあなたの言うことに同意します。私は最近ソフトウェア開発の世界で働き始めましたが、大学では教えられなかったアジャイル開発についてすでに学び始めています。

実際のところ、大学の教授たちは新しい開発技術について必要以上に追いついていないのかもしれません。また、カリキュラムには他にもっと重要なことがあると感じるかもしれません。

大学の講師はソフトウェアの書き方については知りません。ただソフトウェアを研究し、教え、時には論文が出版されるまでしか機能しないコードを大量に書き出すだけです。

タイタスのような人々のおかげで、プログラミングを真に理解する学者が得られるようになりました - このトピックに関する彼のコメントをここで読んでください

私が学生だったとき、私はエクストリーム プログラミングに関する本を図書館で読み、クラスでそれについて簡単に議論しました。同じクラスでは、ソフトウェア開発の「ウォーターフォール モデル」に準拠することが要求され、「コンパイル」はそのステップの 1 つです。自分の。

あなたのキャリアがうまくいくように、学位を卒業できることを願っています。あなたの名前の後に文字があると嬉しいです。:)

あなたが言及した 3 つのこと (単体テスト、バージョン管理、アジャイル開発) はすべて、フローニンゲン大学のコンピューティング サイエンス プログラムである程度教えられています。それが良いことなのかどうかは、未解決の質問として残しておきます。しかし、「実践的なこと」を教えてくれる大学がないというのは真実ではありません。

これらは、専攻を変更する前の CS プログラムでの私の限られた経験と、大手ソフトウェア会社でのインターンとしての経験に基づいています。作成しなければならないプログラムのほとんどは自動テストを必要とするほど大きくないため、単体テストは教えられません。すべてを手動でテストできるように、特定の入力セットが保証されています。ほとんどのプロジェクトは自動テストを実行するスクリプトを使用して採点されるため、テストを自動化する方法を教えると、コードをざっと見て int foo1; がないことを確認することができ、プロジェクトの採点が妨げられる可能性があります。int foo2;そして適切なインデントを使用します。

なぜバージョン管理が教えられないのかはわかりませんが、おそらくプロジェクトの規模が原因の一部でしょう。私はバージョン管理ができるほど大きなプロジェクトを持ったことはありませんでした。大まかに言うとコードが 1000 行を超え、書くのに 1 学期かかりました。必要に応じて自分で教えてくれるだろうと彼らは考えているのでしょう。私が行ったグループ プロジェクトはすべてペア プログラミング プロジェクトであるはずでした。両方が同じコンピューターを使用しているのに、なぜバージョン管理を使用するのでしょうか?

なぜアジャイル開発が教えられないのかはわかりませんが、おそらくプログラムのサイズに関しても同じことに戻ってしまうでしょう。アジャイル開発は、パーソナル コンピュータや小規模サーバー上で実行される新しいソフトウェアでは一般的ですが、IBM メインフレームなどのシステムや、文書化が重要な銀行や医療などの問題領域では一般的に使用されません。また、多くの教授が訓練を受けた約 20 年前にはアジャイル開発が存在しなかったという事実もおそらく関係しています。

その主な理由は、多くの(ほとんどの?)大学が専門学校とは異なる目標を持っていると考えているためです。そのため、彼らは生徒に教えたいと考えています どのように学ぶか, 、および規律の基本原則。さらに、アルゴリズムとデータ構造はあらゆるプログラミング言語に適用され、特定のツール (卒業までにまだ使用されている場合と使用されていない場合があります) に依存しません。

コンピューターサイエンスでは、アルゴリズム、データ構造、コンピューター理論、コンパイラー理論などを意味します。あなたが列挙している内容は、プログラミングの方法や問題の解決方法などの理解に関するものではありません。プログラミングの実践について書かれた本です (ちなみに、この本はプログラマーとして働きたいと考えている大学生にとって素晴らしい本です)。さて、この多くはエントリーレベルのコードモンキーの立場では使用されないため、役に立たないと考える人もいます。私は同意しません。非常に使えると思います。ただし、CS の学位を取得した後、プログラマーとして働くために必要なすべてを知っているという意味ではありません。

だからといって、あなたが言及したことが役に立たないと言っているわけではありません。彼らです。これらを学ばないとプログラマーとして働くのに苦労するでしょうし、少なくともある程度は大学で教えるべきだと私は思います。私は、美術の学部でプログラミングを学ぶのと同じように、バージョン管理や単体テストなどを教えたり、ペイント ブラシとは何か、さまざまな場合にどのブラシを使用するべきかを教えることを考えました。

それはあなたが参加しているコンピュータ サイエンス プログラムの種類によって異なると思います。研究と科学の側を目指すものと、実装の側を目指すものがあります。学術界に留まった教授のみが在籍する特定の学校については、特別にお断りしました。自分の教えていることを「使っていない」教授がいないなら、文字通り、そのことはすべて彼らの頭の中にあります。

プラグ:デポール大学で Comp Sci の学士号とソフト工学の修士号を取得した私は、主にパートタイムで教える講師や教授から教えを受けました。私としては、前日の逸話を話してもらい、それについて話してもらいたかったので、私にとっては問題ありませんでした。それをクラスに。また、この学校は主に通勤・定時制の学校であるため、ほとんどの生徒が学んだことを活かして仕事に就いています。

学習のプロセスはまだすべての理論から始まりますが、その後、私たちは通常、「あなたの仕事で実際にこれを使用している人は何ですか?」と尋ねられます。そして、典型的な答えは「私たちはそれを使用しますが、剥がれたものやよりシンプルな方法で」です。その後、実用的な現実世界のシナリオに入ります。

私の学校教育中、単元テストは常に存在していました。彼らは Java から始めましたが、すべてのプロジェクトで ANT と JUnit を使用するように指示されました。これは、ビルド構成と単体テストの良いスタートでした。

そして、エクストリーム プログラミングは、私が受講したクラスのうち 3 ~ 4 つほどに含まれていました。それらはすべて、ペア プログラミングから単体テスト (上記を参照) まで、12 の異なる側面から始まったことを覚えています。そして現在はアジャイルに焦点が当てられているようです。

したがって、簡単な答えは、「はい」です。他の学校よりも実践的なアプローチをとっている学校は存在します。

単体テストとバージョン管理はどちらも、私が大学に通っていた 2 年生のコンピューター サイエンス コースで教えられました。単体テストは、ホワイト ボックスとブラック ボックスの違いも含まれるテストの一部に該当し、3 年生のプログラミング課題の得点の大部分は、単体テストから容易に得られる適切なエラー処理に当てられました。

アジャイル開発を学術的な環境で教えるのはかなり難しいと思います。私はウォーターフォール手法について理論的には学びましたが、実際にそれを実際に見ることができたのは、大学を卒業して、学界とはまったく異なる現実の世界に移ってからです。3 年生のとき、私は奇妙なエラーのケースをすべてこなし、セマフォについてその課題が私に教えようとしていたことの核心に触れることはなかったものの、ほぼ合格する課題でした。

また、アジャイルはどのくらい前から存在していますか?また、アジャイルのどの形式を指しますか?私が見たものとは異なる実装がたくさんあります。

アジャイル プログラミングが流行だとは思いませんが、同時に、それを学習できるように教師がプロジェクトを与える方法を考えるのは難しいと思います。彼らがあなたにプロジェクト A のビルドを与えない限り、プロジェクト B はその上に拡張します。問題は時間と範囲です。4ヶ月コースでは厳しいでしょうね。

バージョン管理と単体テストの方法は常に変化しており、言語またはそれらを定義する人に依存しています。

データ構造とアルゴは、クラス設定で作業できるものです。正直なところ、単体テストやバージョン管理よりも理解するのにかなりの労力がかかります。大学の一部は、自分自身を教えることを教えることであることを忘れないようにしてください。コラージュには同じ使命がまったくありません。あるいは、少なくとも同じ程度ではありません。私見では。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top