彼らはなぜ学校でこれらのことを教えないのですか?[閉まっている]


118

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

  • ユニットテスト
  • バージョン管理
  • アジャイル開発

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

誤解しないでください。大学が常に流行のプログラミングの流行を教えるのは望ましくないと思いますが、教授は「コーディングを始める前に図を描く」以外のことを教えてはいけません。


47
ほとんどの教師は、バージョン管理や単体テストなどの最新のトレンドに遅れをとるほど長い間、実世界から離れていることがわかりました。

14
バージョン管理を「最新のトレンド」と呼ぶのが公正かどうかはわかりません。- SCCSは、1972年に開発されたen.wikipedia.org/wiki/Source_Code_Control_System
JeffH

2
彼らはこれらのことをRITで教えています。
geowa4

6
あなたが正しい。彼らは、データ構造、アルゴリズム、並行性、ネットワーキング、データベースの代わりにそれらのことを教えるべきです。つまり、誰もがそれらを学ぶ必要があるということです。
ハンフリーボガート

1
これはあなたが在籍している大学に大きく依存すると思います。少なくとも私が訪問している大学では、ユニットテストは最初から(すべてのCSの宿題(ベストプラクティスに従っていないが、それは始まりです))とバージョン管理の両方で、すべてのCS宿題の要件であると言えます。それ以外は、大学があなたに普遍的で抽象的な概念を教えるべきだという意見に同意します。テストを適切に把握するには、バージョン管理とアジャイル開発では多くの直接的な経験が必要ですが、いずれにしても、それを完全なカリキュラムに適合させることはできません。
ヨハネスルドルフ

回答:


188

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

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

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

フィールドの混乱もあります。ソフトウェア開発、つまりソフトウェア「エンジニアリング」は、コンピュータサイエンスとはまったく異なります。ソフトウェア開発者はコンピューターサイエンスの実用的な知識が必要ですが、アルゴリズムの複雑さの境界で作業したり、並列処理について推論したりすることは、プログラマーが毎日行うことではありません。同様に、実際の「コンピューターサイエンティスト」は、機能しないか、何もおもしろくない大量の使い捨てコードを作成し、実際のソフトウェア製品が提供するような厳密さの恩恵を受けることはありません。

インターネットとオープンソースコミュニティの出現により、これらの質問に最終的に回答するのに十分なデータが提供される可能性がありますが、回答が明日利用できたとしても、誰もが同意するところまで国際社会に浸透するには、おそらく100年かかります。学校で教えられるべきです。

最後に、いくつかの経済的な考慮事項があります。ソフトウェア開発に携わるほとんどすべての人が、専用のマシンに安価で簡単にアクセスして、必要な開発ツールを実行できるようになって以来、比較的短い時間でした。数十年前、マシンをテストの実行に完全に専念したり、ソースコードの無限の履歴を保存したりすることは、多くの人にとっては、非常に高額に思えました。


44

私たちの先生は:

  1. ユニットテストを試したことがない、
  2. バージョン管理の使い方がわからない
  3. 「アジャイル開発」についてさえ聞いたことがありません。

生徒は自分の手で問題を取り上げるべきです。私たちはそれをしました、そして、うまくいきましたね?


3
「私たちはそれをしました、そして、うまくいきましたね?」-私たちの一部...途中、先生たちができることをすべてしなかったために道に迷った人もいました。
AndreiRînea2009年

12
まあ、教師が何をしても、人々はまだ文句を言うでしょう。シャープは常に知識を求めており、うまくいきます。
Jeffrey Jose

私たちの教師はソフトウェア開発者ではなく、ソフトウェア開発の学位も取得しませんでした。私たちは、主に、実践よりも理論に重点を置いた、別の獣であるコンピュータサイエンスに取り組みました。
Dean J

1
@mislav:先生は誰ですか?
CesarGon 2011

43

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

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

優れた学校は、理論(データ構造、アルゴリズムなど)と実践(単体テスト、バージョン管理など)の両方を教えます。これには、このコインの両面を適切に教えることができるように、適切な教員の混合が必要です。完全に理論的なタイプで構成され、実際の経験を持たない教員は、実行しません。同様に、完全に開業医で構成される教員は行いません。あなたはミックスが必要です、そして良い学校はそれを持っています。


1
私はあなたの言うことの主な目的に同意しますが、複数のバージョンを同時に管理することの問題は理解すべき重要な理論的要素であると私は主張します。対照的に、この問題を解決するためのCVSやSVNなどのツールの使用は、「実践」の領域にしっかりと属していることに同意します。
Andrew Swan

ただし、一般的な「ソフトウェア工学入門」タイプのクラスでは、2回以上の講義でバージョン管理を取り上げる必要はおそらくないでしょう。それが何をするか、基本的な使用法、おそらく分岐/マージについて少し説明します。
Adam Jaskiewicz、2009年

「チームソフトウェアプロジェクト」というクラスがありました。バージョン管理は対象としていませんでしたが、UML、ソフトウェア開発方法論、要件収集、ユニットテストなどは
対象でした

@アラン、どの学校について話しているの?
ライフバランス2015年

40

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

大学は「科学」の端(アルゴリズム、データ構造、コンパイラーなど)により傾く傾向があります。なぜなら、それらは年々進化し、変化する傾向がある現在の業界のベストプラクティスよりもはるかに「時代がない」からです。たとえば、バージョンコントロールは、過去5年または10年の間に驚くべき変化を遂げましたが、big-Oは依然としてbig-Oであり、ハッシュ、btree、および再帰は、40年前と同じくらい有用です。彼らのアイデアは一般に、基礎となるデータ構造がSHA-1ハッシュの非循環有向グラフであり、開発者が一生懸命働いていると言われたときにgitなどのツールを選択してそれが何を意味するかを理解できる十分な基盤を与えることですシステムコールの数を最適化して、io-boundになるようにします。

ここで、最後の文を理解するために知っておく必要があるすべてのことをどこで学んだかを考えてください。答えが「大学」であれば、彼らは大丈夫です。


13

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

カレッジは、ツールの完全なツールボックスを提供します。これはドライバー、つまり三日月形のレンチです。あなたは大学で一度各ツールを使用するようになるかもしれません。それはあなたが現実の世界に入るときであり、あなたが本当にあなたが持っているものを見つけるときです。万が一に備えて自宅でワークベンチに置いておきたいものや、毎日ポケットに入れているものから、便利なものを選別します。

Tqm、Iso、Cmm、Agileなど。これらはすべて流行り、流行り、成功したものは常識以上のものではありません。すべての成功したエンジニアと企業は、常識のフレーバーを使用しています。それが彼らを成功に導いたものであり、そのための名前を必要とする人はほとんどいません。問題は、常識を売ることができないこと、マネージャーがキャッチーな名前なしで常識をトレーニングして購入することによって会社にその価値を証明できないことです。上司がニュース記事や雑誌で読んだ名前を付けてください。マネージャーは彼らの仕事を続け、あなたはあなたの仕事を続けます。これらの慣行に従うと主張する企業のほとんどは実際にはそうしません。ほとんどはコンサルタントに小切手を書いて、年次または生涯の証明書をいくつかのクラブに渡して、ウェブサイトにグラフィックを貼ったり、商品が入っている箱にラベルを貼ったりできます。これはまれであると多くの人が主張します...そこにいると、それを見て、それが起こります。これはすべてビジネスの一部であり、収益性を維持し、ドアを開いたままにし、ライトをオンにしておくために、時々手抜きをしなければなりません。これらすべての慣行の筋金入りの信者はすべて、最後の1つは流行であり、これは無意味だと主張しました、最後の1つは本当に追跡するにはコストがかかりすぎて、この1つではありません。最後は偽のコンサルタントを雇っただけで、これは本物です。プログラミング言語と同様に、これらも進化します。最後は偽のコンサルタントを雇っただけで、これは本物です。プログラミング言語と同様に、これらも進化します。最後は偽のコンサルタントを雇っただけで、これは本物です。プログラミング言語と同様に、これらも進化します。

ビジネスの現実、大学のシステム、およびその中でのあなたの役割を理解するあなたの能力が鍵となります。人生のあらゆるもののように、あなたの戦いを選択してください。大学や企業、政府など、あなたが知りたいことや知りたいことを教えるのはあなたの仕事ではありません。ナンバーワンを探すのはあなたの仕事です。同様に、あなたはこれを行う時間をあなたに提供したことで他の誰かを責めることはできません、あなたはそれをしなければなりません。あなたは馬から脱落します、あなたは犠牲者ではありません、立ち上がって立ち直ります、言い訳はありません、人生はそれと公正な取引ではありません。配布資料を活用してください。独立しているふりをしないでください。そして確かにあなたの会費を払ってください、彼らに見返りに何か(当時のあなたの最高ですか?)

なぜ人々はcmmやアジャイル、あるいは他のどれかが流行していると思いますか?なぜ彼らはそうではないと思いますか?なぜ教授はあなたにそのようにプログラムを教えたのですか?後藤を避けるため、または定数を避けるため、またはこれとそれを避けるために?より信頼性の高いコードを生成するためですか?より良いコードを実行していますか?人的エラーを減らしますか?それとも、論文やプログラムを採点する方が簡単で、研究に時間をかけることができるからでしょうか。それは彼らがプログラムする方法を知らず、その主題について誰か他の人の本をフォローしているだけなのですか?彼らはあなたがあなたが保守可能で信頼できる高性能コードを持てないことを教えましたか?信頼性とパフォーマンスの両方を維持するために、保守可能な「任意の2つを選択する」ことさえできませんか?パフォーマンスの信頼性を犠牲にすることもあります。信頼性やパフォーマンスを気にせず、バージョン117.34から取得したい場合もあります。バージョン118.0.0へのさらに別の会計ソフトウェアプログラムの2。あなたのビジネスモデルは、バージョンアップグレードとテクニカルサポートを販売することであり、ソフトウェア開発者の限りでは、同じコードを同じ方法で書くことができる古いロボットがやってくれます。燃え尽きたものを大学の新鮮なものと交換し、アップグレードの販売を続けます。

これらの質問に対する普遍的な答えはありません。自分の意見が何であるかを調べ、それと共存し、それを守る必要があります。心を変え、それと共存し、それを守ってください。

すべてに質問してください...私がストーブの上の鍋に触れると、私は本当にやけどしますか?恐れることによる心理的影響は、単に火傷を負うだけでなく、より多くの損害を引き起こしますか?傷つくことなく答えをテストする安全な方法はありますか?

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

大学の内外の世界は、問題を解決するためにこれらの式(cmm、アジャイルなど)を採用し、次の問題が出てきたときと同じくらい速くそれらを落とします。成功するためにバージョン管理を使用する必要はありません。成功しない場合と同じくらい多くの成功があります(実際には、業界の時代のせいで、これまでのところバージョン管理なしの成功は数多くあります)。同様に、最小限のテストで成功することができます(例として、コンピューター業界で非常に大きな名前を見てください)。自分のコードをテストすることで成功することができます。また、自分のコードをテストしてはいけないというルールに従うことで成功することができます。emacsを使用して成功することができ、viを使用して成功することができます。あなたはどんなミックスがあなたのために働くかを決めなければなりません、そして、あなたが幸運であるならば、あなたに同意する働く場所を見つけてください。

大学を出て現実の世界に入ったら、「古いタイマー」に耳を傾け、一緒に働き、議論します。彼らは数十年から数世紀にわたる総合的な経験を持ち、自分で回避したり、自分でテストしたりできるトラップに陥っています(たぶん、鍋に触らずに火傷をする必要があることに気づくかもしれません)。ほとんどの人は、これらの流行の少なくとも1つまたは2つが行き来するのを見てきました。特に、それらがいかにひどく燃やされ、そしてそこから回復するために何をしたかを見ています。彼らは物事をテストする多くの異なる方法を知っており、また出て行ったテストスタイルの名前も知っています。何が機能し、何が機能しないか。リスクはどこにあり、接線で時間を無駄にしないようにする方法。成熟して古いタイマーになったら、それを前に渡します。あなたに続く人々を教えることを試みることによってあなたが学んだことのお金を払ってください。釣り方を教えることを忘れないでください。彼らに魚を与えないでください。そして、時には彼らが成功する前に彼らを失敗させなければならず、彼らがあまりにもひどくやけどをしないようにしてください。

ここで私が本当に言いたかったのは、今、パラレルユニバースの進化を目撃できる(そしてそれに影響を与える可能性がある)まれな状況です。はい、コンピューターサイエンスは物理学と言うより若い科学です。しかし同時に、それは何度も進化してきました。作業場所や作業相手によっては、ハードウェアエンジニアを観察できる場合があります。ハードウェアの世界のプログラミング言語は確かに新しいものではありませんが、ソフトウェアの世界ほど速く進化していません。ソフトウェアは数十年前から始まりました。ハードウェアは常にソフトウェアエンジニアを2等市民と考えてきました。私たちの仕事は簡単です、彼らの仕事は難しいです。(私は実際にはハードウェアとソフトウェアの両方のエンジニアです)。おもしろいのは、現在、彼らは私たちが初歩的な問題や幼児の問題と見なすことに対処しているということです。バージョン管理を使用する必要があるのはなぜですか?このチップで作業しているのは私だけです。あなたがgccや他の安価なコンパイラーや無料のIDEでのあなたの経験は、私が使用する高価なツールと比較できないかもしれません。そして、他の言い訳の長いリスト。私はvhdlとverilogの両方を学び、そのようなハードウェアエンジニアからのほぼ勇敢なものから1週間以内に両方で生産的になる喜びを持っていました(卒業証書で電気技師は私の職務はソフトウェアエンジニアであると言いましたが)。私はこれらの言語を学びたかったのですが、ツールが利用できるようになったとき、私はオフィスに泊まり、独学しました。その時点から、そのエンジニアは特に、私が言っていることが真実であることに気づきました。言語は単なる構文であり、プログラミングの基本は同じで、ツールはすべて同じことをします。そのリンゴとリンゴはリンゴとオレンジではありません。

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

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

他のビジネスと同様に、大学の仕事は収益性を維持することです。彼らは、適切な学者を雇って、適切な学生と適切な研究費と適切な種類の研究の両方をもたらし、大学の利益を上げる必要があります。彼らは適切なクラスを提供して適切な学生をもたらし、適切な卒業生を生み出す必要があります。そうすれば、数十年が経つにつれて、大学の近くの、そしてうまくいけば遠くの両方の雇用主が、この大学が生産的で利益のある従業員を生み出していることを認識できるようになります。(はい、時にはあなたは、適切な量のテレビ時間と適切な量の名前認識とスポーツ収入を得るために、適切なスポーツで適切なアスリートを引き付ける必要があります)。C ++とJavaを教える大学もあれば、まったく教えない大学もあります。CMMを発明する人もいれば、アジャイルを教える人もいれば、どちらもしない人もいます。大学に価値があるとしたら、あなたが学ぶべきことがあるでしょう。彼らはあなたが学ぶべきすべてをあなたに教えるわけではありませんが、彼らは何か有用なものを持っています。あなたがそこにいる間に何かを学び、道具箱にさまざまな形の道具を合理的な数だけ集めてください。大学を出て就職する。ツールボックスに問題がある場合は、別の大学を見つけて、最初の大学については言及しないでください。それが問題のないツールボックスである場合は、それらのツールを使用して、自分の時間にいくつかの新しいツールを構築します。それがかなり良い道具箱であるならば、あなたがこれとそれからそれを学んだその大学と良い学者について良いことを言い、彼らがあなたに与えたものに対して学校に返済してください。大学のツールのユニバーサルカタログですべての可能なツールを入手できなかったとしても、特定のサブセットを使用することになります。卒業しなくても…


12

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


3
あなたは異常です。そして、とても良い人であることに感謝します。
ミーエンも'09

クラスのタイトルは何でしたか?
Dean J

11

最も簡単な答えは、あなたはコンピュータサイエンスを研究していて、あなたが挙げたものはコンピュータサイエンスの学問分野とはあまり関係がないということです。ソフトウェア開発、コンピューターサイエンスを使って行うものかもしれません、学んだことのブロックに基づいて構築するものかもしれませんが、コンピューターサイエンスとソフトウェア開発は同じものではありません。

あなたに教えることになるバージョン管理、またはどのように効果的なユニットテストを書くことあなたを教えクラス... 貿易、すなわち、(良い)のソフトウェア開発を。


10

ああ、神様は私を始めさせないで

私はかつて評判の良い大学のcsの学部長にオブジェクト指向プログラミングは単なる「流行」だったので、C ++のような空想のクラスを提供しなかったと教えてくれました

なぜ彼らがこれらのことを教えていないのかについては、まあ、大学は、必ずしも業界のベストプラクティスではなく、規律の基礎を教えるためにそこにあります


2
別の言い方をすれば、大学は彼らの役割を(正しくまたは誤って)職業訓練ではなく学術教育を提供することと見なしています。だからこそ、多くの新卒者は、実際のプログラミング(たとえば、保守可能なコードの作成)の技術についてほとんど知りません。
アンドリュース

そして今、多くの大学で(少なくとも最初の数年間は)彼らが教えているのはJavaです。ああ、皮肉。
Matthew Schinckel、2008

彼はいつOOPが流行したと言ったのですか?Javaが登場するまで、OOPは必要な知識よりも一時的なものでした。
Andrew Prock

@ [drewster]:1994年ですが、Javaを信用しすぎていると思います。OOPは、プログラミング言語の進化における論理的な進歩です。それを歴史のどの段階でも「流行」と呼ぶ(1994年にははるかに少ない)ことは、CS学部長にとっては淡い色を超えたレベルの無知を示​​しています。
スティーブンA.ロウ

2
アカデミックと実世界/実用との間の誤った二分法とは何ですか?「実際の」作業で使用しているほとんどすべてのアイデアは、学術コミュニティからのものであるか、それによって改善されました。GOTOの欠如はどこから来たと思いますか?オブジェクトは1967年にコンピューティングサイエンティストから来ました。多くのCSの人々はOOPの利点を明確にしておらず、それはまだ決定されていません。業界はそれが役立つと考えていますが、そうでなければ証明される失敗したプロジェクトがたくさんあります。

9

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

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

単体テストも、言い訳のできないものです。私が言っている唯一のことは、この本はまだテスト駆動開発について出ていて、100%のコードカバレッジを求めることは、常にそれが価値があるよりももっと面倒になることがあるということです。しかし、単体テストは非常に価値があり、ソフトウェアエンジニアリングコースでカバーする必要があります。このようなもののいくつかは、いくつかの大学に導入されていると思いますが、まだすべての大学に到達していません。


大学のコースではバージョン管理は必要ありません。彼らは「ビジュアルスタジオの使い方」も教えるかもしれません。仕事に就いたときはそのままにしておくとよいでしょう。テストに関しては、単体テストは必ずしも最良ではありませんが、すべての形式のテスト実践の少なくとも少しを教える必要があります。
gbjbaanb 2009年

@gbjは同意しました。私が就職するまではバージョン管理が何であるかわからなかったので、すぐにメリットがわかり、1日で習得しました。学校のIMOで教えるには、もっと重要なことがたくさんあります。
temp2290 2009年

7

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


6

コンピュータ科学者は、エンジニアではなく数学者であると考えているため、工学の部分よりも数学の部分を教える方を好みます。テスト、バージョン管理、および文書化は、他のエンジニアリング分野の場合よりも、流行を超えていません。


では、ソフトウェアエンジニアだけを雇い、コンピュータサイエンティストは雇わないでください。;-)
アンドリュース

それらのいずれかが「エンジニアリング」の定義を満たすと思う場合、私は心配しています。それらはエンジニアリングではなくスキレットの定義を満たしています。
Benjamin R

6

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

ただし、ユニットテストについては詳しく説明していません。1回の講義で合格テストを実施しただけです。「単体テストとは」だけではなく、効果的な単体テストの書き方を学んだとしたらすばらしいでしょう。

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

私もグリフが言ったことに強く同意します。CSは非常に未熟な分野であり、実際には過去50年間だけであり、私たちが何を学ばなければならないのか、そして何が流行しているのかはわかりません。それに150年を与えれば、物事はさらに落ち着くかもしれません。失敗した現実世界のプロジェクトの数は、これが未成熟な産業であることを明らかにしています。建築プロジェクトの80%が失敗したと想像してみてください!


5

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

私が取ったどのクラスでも一度バージョン管理について言及したことはありませんが、ほとんどの友人はそれを個人的なプロジェクトやクラスの割り当てなどに使用していたので、それに触れたことがないわけではありません。自分で手に取らなかった人は、チームの割り当ての過程でクラスメートにそれを使用することを余儀なくされました。

大学は、概念と理論を教えることを目的としています。なぜなら、それらは自分で習得するのが難しいものだからです。バージョン管理はツールであり、簡単に入手できます。少し使用して、Webでいくつかのチュートリアルを読んでください。SVNから何かをチェックアウトする方法を理解するための講義や宿題が必要な場合、実際に困難なことで多くの問題が発生します。

大学以外でクラスの外で物事を学ぶ方法はたくさんあることを覚えておいてください。それを利用してください。クラスに参加して設備を使用するために多額の費用を払っているので、価値のあるものをすべて搾り取り、LUGおよびACMミーティングに参加するか、プロジェクトチームに参加する(プログラマーを必要とするロボットを構築しているMEが常にいる)か、人文学部のサーバーを管理する仕事。マテリアルエンジニアリングの建物の荷積み用ドックからコンピューターをトラッシュピックし、高速インターネット接続でLinux isoをダウンロードして、遊んでみてください。


非常によく言いました!できる限り牛乳を。
AndreiRînea2009年

3

問題は、大学があなたにプロであることを教える必要があると感じているのではなく、プログラミングの学問的な側面に焦点を合わせていることだと思います。少なくとも業界で使用されている最新の方法や手法についても言及する必要があると思います。これらも学術的な興味があるからです。

私たちのコースでは、プロジェクトに費やされた時間の記録、適切なコメントなどをカバーするパーソナルソフトウェアプロセスを学びましたが、バージョン管理などの専門的な基礎については触れていません。


3

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

同様に単体テスト-なぜ単体テストを選ぶのですか?確かに、ユーザビリティテスト、システムテスト、ユーザー受け入れテスト、工場受け入れテストの方が重要ですか?まあ、コードがメンテナンス部門に出荷されたら、ジョブが完了したと見なさない限り、そうです:)

私が日常的に使用している他の概念について考えてみてください。これは、ソフトウェアとコンピューターシステムの基本に慣れる学生にとってはほとんど役に立ちません。

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

上記はすべて「ソフトスキル」であり、優れたコードを記述する必要ありません。

ただし、データ構造やアルゴリズムなどの「ハード」スキルが不足している場合、優れたコードを書くチャンスはほとんど不可能です。


2

私はそれらすべてを大学で学びました。多分それはあなたが選ぶコースに依存しますか?私のコースは非常に多様でした(ソフトウェアデザイン、UIデザイン、eコマース、AI、関数型プログラミングなど)。Software Designは、設計パターンと単体テスト(さまざまなことを含む1つの大きなプロジェクト)に触れていました。UIデザイン...私たちはプロジェクトに取り組んでいる3人のグループでした。バージョン管理なしでは何もできなかったので、それを手に入れました。そして、アジャイル開発は私たちの教授が継続的に私たちに話したものでしたが、彼らはそれを使用するために各グループに任せました。

多くの大学生が「簡単な」コースまたは高いGPAを与えるコースを受講したことがわかりました。他の人々は、彼らが学びたいものに焦点を合わせて、彼らが興味を持っている分野を見つけるために大部分を探っています。そして、彼らが興味を持っていることを正確に知っている人たちがいます...彼らは彼らのコースを多様化しない傾向があることを除いて、それは良いことです。


問題は、それらのクラスが少なくとも私の学校では高レベルのクラスであることです。私はそれらが最初に教えられるべきものの1つであるか、少なくとも中級レベルで教えられるべきだと感じています。
Jason Baker、

2

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

個人的には彼らがこれをやっているのは問題ないと思います。プログラミングは、私たちの多くが考えているほど簡単ではありません。多くの人がそれに苦労しています。私はむしろこれらの人々が最初にforループがどのように機能するかを理解してから、Perforceであるモンスターを理解します。


2

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


2

アジャイル開発を除いて、私はそのすべての新入生年を学びました。

正しい学校、IMHOを選択することがすべてです。トップ10に入ると、すぐにそのすべてを学べます。

CS Education全般に関しては、基本的に教授に多くのことを教えるように求めています(すべてのフレーバーの言語、データ構造、実行時の効率、ビットレベルで実際にどのように機能するか)。私は質問をしたいと思います、なぜ子供たちはソフトウェア工学についてもっと学ぶために彼ら自身にそれを取りませんか?


2

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


2

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


1

優れたCSプログラムは、将来のすべてのプログラミング教育の基礎となる基礎を教える必要があると思います。アジャイルのような開発方法論やバージョン管理ツールは流行のようなものです。彼らは行き来します。また、アカデミックなものではなく、業界で使われる傾向があるので、大学でこのようなことを学ぶことはめったにないと思います。私はそれが正しいと言っているわけではありませんが、それはおそらく学問的な考え方です。


申し訳ありませんが、アジャイルとバージョン管理は、組立ラインまたは微積分の発明が流行であった以上の流行ではないと思います。現実の世界ではプログラミングを根本的に変えるものを設計していますが、大学は小さな講義スタンドで現実にあまりにも触れていないため、私たちが前進していることに気付いていません。
オースティン

1

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

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


1

大学の講師はソフトウェアの書き方を知りません。彼らはそれを研究し、それを教え、時々、論文が発表されるまで機能する必要があるコードを打ち消します。

Titusのような人々のおかげで、プログラミングを真に巧みに学んでいる学者がいます- そのトピックに関する彼のコメントをここで読んでください

学生時代、私は図書館でエクストリームプログラミングに関する本を読んでいましたが、それをクラスで短期間で話し合いました。ソフトウェア開発の「ウォーターフォールモデル」に準拠することを要求するクラスと同じで、「コンパイル」はその一歩です自分の。

あなたのキャリアで最高です、あなたの学位を卒業してくれることを願っています。あなたの名前の後に手紙があることは素晴らしいことです。:)


1

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


1

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

バージョン管理が教えられない理由はわかりませんが、その一部はおそらくプロジェクトのサイズです。バージョン管理に十分な大きさのプロジェクトはありませんでした。概して、1000行を超えるコードを意味し、学期全体を書きました。あなたがそれを必要とするなら、彼らはあなたがあなたにそれをあなた自身に教えるだろうと思います。私が持っていたグループプロジェクトはペアプログラミングプロジェクトであるはずでしたが、両方が同じコンピューターでバージョン管理を使用しているのはなぜですか?

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


>両方が同じコンピューターでバージョン管理を使用するのはなぜですか?私はコンピューターで1人でもバージョン管理を使用します!それ以外の場合、ブランチとパッチリリースをどのように管理するか、または以前のバージョンのファイルを表示しますか(最後の変更が壊れる前に戻って)?
アンドリュース

アンドリューの同上。私の仕事はすべて私のラップトップで行われ、そのほとんどが単独で行われていますが、私はSCMツールを多用しています。古いコードのバックアップ、リビジョン管理、分岐とマージ、パッチ。これらはすべて、ソースコードだけでなく、生成されたコンテンツにも使用する理由です。
Matthew Schinckel、2008

コードが単体テストや受け入れテストに合格したかどうかで採点されない理由はありません。

1

主な理由は、多くの(ほとんどの)大学が、自分たちが貿易学校とは異なる目標を持っていると考えているためです。このように、彼らは学生に学習方法とその分野の基本原則を教えたいと考えています。さらに、アルゴリズムとデータ構造は任意のプログラミング言語に適用され、特定のツールに依存しません(卒業でまだ使用されている場合とされていない場合があります)。

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

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


1

あなたがどのようなコンピューターサイエンスプログラムに参加しているのかは、研究と科学の側面を目指すものと、実装の側面を対象とするものがあると思います。アカデミックな世界に留まっている教授しかいない特定の学校に対しては、特に断りました。あなたが彼らが教えるものを「使用」していない教授がいない場合、それらはすべて文字通り頭の中にあります。

プラグイン:デポール大学でコンプサイエンスの理学士号とソフトエンジニアリングの理学修士号を取得し、パートタイムを教えるインストラクター/教授からほとんど教えられました。クラスに関連付けます。また、これはほとんど通勤/パートタイムの学校であり、ほとんどの学生は彼らが学んでいるものを使用する仕事をしています。

学習プロセスはまだすべての理論から始まりますが、通常、「実際にこれを仕事で使用している人はどれくらいいますか?」典型的な答えは「使用しますが、単純化された方法で」であり、実際の現実のシナリオに進みます。

私の学校教育の間、ユニットテストは常に存在していました。彼らはあなたをJavaから始めましたが、すべてのプロジェクトにANTとJUnitを使用させました。これは、ビルド構成と単体テストの良い出発点でした。

そして、Extreme Programingは私が受けたクラスの約3つか4つに含まれていました。私はそれらがすべて、ペアプログラミングからユニットテスト(上記参照)までの12の異なる側面から始まったことを覚えています。そして今、焦点はアジャイルにあるようです。

ですから、簡単な答えは、他の学校よりも実用的なアプローチをとっている学校があるということです。


1

ユニットテストとバージョン管理は両方とも、私が大学に通った2年目のコンピューターサイエンスコースで教えられました。ユニットテストは、ホワイトボックスとブラックボックスの違いを含むテストの一部に該当し、3年目のプログラミングの割り当てのマークのかなりの部分は、ユニットテストから簡単に発生する可能性のある優れたエラー処理に使用されました。

アジャイル開発は、私が考えるアカデミックな環境で教えるのはかなり難しいかもしれません。私は理論的にウォーターフォールの方法について学びましたが、卒業して現実の世界に移動して初めてア​​カデミアとは異なる可能性があるまで、フィールドでそれを見ることはできませんでした。私はセマフォについて私が教えようとしたことの中心に触れたことのない場合、ほとんどの場合、割り当てに合格します。

また、アジャイルはどのくらいの期間使用されており、どのような形式のアジャイルですか?私が見たものから、それの多くの異なる実装があります。


1

アジャイルプログラミングは流行ではないと思いますが、同時に、教師がプロジェクトを提供してそれを学習できるようにする方法を考えるのは難しいでしょう。プロジェクトAをビルドしない限り、プロジェクトBはaを展開します。問題は時間と範囲です。4ヶ月のコースでは難しいでしょう。

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

データ構造とアルゴは、クラス設定で作業できるものです。正直なところ、彼らはユニットテストとバージョン管理を理解するためにかなりの努力を必要とします。大学の一部は自分自身を教えることを教えることです。コラージュにはまったく同じ権限がありません。または、少なくとも同じ程度ではありません。私見では。


うーん、カレッジと大学は同じ意味だと思いました。ネイティブスピーカーではありませんでした。

米国のどこにいるか(国別)によって同じですが、カナダでは異なります。私がコラージュと呼んでいる州では、実際にはジュニアコラージュと呼ばれていると思います。オーストラリアでは、タフ(
ゆるい
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.