夏の間、私は幸運にもGoogle Summer of Codeに参加することができました。私は多くのことを学びました(おそらく、私の大学のすべての授業の合計で学んだよりも多くのことを学びました)。でも、なぜ学校でもっと早く学んだことのいくつかを教えてくれないのだろうと本当に思っています。いくつか例を挙げると:
彼らはかなりの時間を費やして、データ構造やアルゴリズムなどの他のことを前もって教えているように思えます。私はまだそれらを早い段階で学ぶことが非常に重要であると思いますが、なぜ彼らは彼らの前にこれらの3つのことをもっと教えないのですか?それとも、このようなことをあまり教えていないのは私の学校だけですか?
誤解しないでください。大学が常に流行のプログラミングの流行を教えるのは望ましくないと思いますが、教授は「コーディングを始める前に図を描く」以外のことを教えてはいけません。
あなたの質問に対する最も簡単な答えは、コンピュータサイエンスとソフトウェア開発の分野はどちらも非常に新しいものであり、あまりよく理解されていないということです。現代ではすべての科学および工学分野がより急速に進歩していますが、他の分野ではより多くの経験を生かしており、それらがどのように機能するかについてはるかに広い共通の理解があります。
たとえば、最近の材料科学の進歩にもかかわらず、土木技師は約2000年の間、転倒しないアーチを構築する方法を知っていました。これは、比較的論争の少ない大学で教えて学べるものです。ソフトウェア開発者が学ぶべきテクニックについてはあなたと完全に同意しますが、この合意は個人的な経験と非公式な推論に基づいています。社会的に受け入れられている「ベストプラクティス」となるためには、収集に非常に費用がかかる可能性がある定量的なデータが必要です。バージョン管理はどの程度役立ちますか?それはどのように役立ちますか?ユニットテスト?さまざまな手法の有効性については推論できますが、実際に有効性を証明するには非常に費用がかかります。さまざまな手法を使用して同等の専門知識を持つプログラマーのグループで、最初から最後まで完全で現実的なソフトウェアプロジェクトを何度も実行する必要があります。少なくとも、既存のプロジェクトについては、それらのプロジェクトではリリースしたくない大量のデータが必要です。
土木技術者には、何千年にもわたる橋があり、多くの情報が含まれています。一方、ソフトウェア開発者は情報を収集していても、組織が開発者の有効性に関する情報を照合して公開する動機はほとんどないため、数十年の情報しか持っておらず、そのほとんどは秘密にされています。 't)。
フィールドの混乱もあります。ソフトウェア開発、つまりソフトウェアの「エンジニアリング」は、コンピュータサイエンスとはまったく異なります。ソフトウェア開発者はコンピューターサイエンスの実用的な知識が必要ですが、アルゴリズムの複雑さの境界で作業したり、並列処理について推論したりすることは、プログラマーが毎日行うことではありません。同様に、実際の「コンピュータサイエンティスト」は、機能しないか、何もおもしろくない大量の使い捨てコードを作成し、実際のソフトウェア製品が提供するような厳密さからはそれほど利益を得ません。
インターネットとオープンソースコミュニティの出現により、これらの質問に最終的に回答するのに十分なデータが提供される可能性がありますが、回答が明日利用できたとしても、誰もが同意するところまで国際社会に浸透するには、おそらく100年かかります。学校で教えられるべきです。
最後に、いくつかの経済的な考慮事項があります。ソフトウェア開発に携わるほとんどすべての人が専用のマシンに安価で簡単にアクセスして、必要な開発ツールを実行できるようになったので、それは比較的短い時間でした。数十年前、テストを実行するためだけにマシンを完全に専念したり、ソースコードの無限の履歴を保管したりすることは、多くの人にとっては、非常に高額に思えました。
私たちの先生は:
生徒は自分の手で問題を取り上げるべきです。私たちはそれをしました、そして、うまくいきましたね?
レオナルド・ダ・ヴィンチは書きました、
科学なしで練習に夢中になっている人は、ラダーやコンパスなしで船に乗り込み、彼がどこに行くのか確実ではないパイロットのようなものです。実践は常に理論の健全な知識に基づいているべきです。
優れた学校は、理論(データ構造、アルゴリズムなど)と実践(単体テスト、バージョン管理など)の両方を教えます。これには、このコインの両面を適切に教えることができるように、適切な教員の混合が必要です。完全に理論的なタイプで構成され、実際の経験を持たない教員は、実行しません。同様に、完全に開業医で構成された教員は行いません。あなたはミックスが必要です、そして良い学校はそれを持っています。
コンピュータサイエンスは常にいくぶん矛盾しています。コンピューターに関する部分は科学ではなく、科学に関する部分はコンピューターではありません。
大学は「科学」の端(アルゴリズム、データ構造、コンパイラーなど)により傾く傾向があります。なぜなら、それらは年々進化し、変化する傾向がある現在の業界のベストプラクティスよりもはるかに「時代がない」からです。たとえば、バージョンコントロールは過去5年または10年で驚くべき変化を遂げましたが、big-Oは依然としてbig-Oであり、ハッシュ、btree、および再帰は、40年前と同じくらい有用です。彼らのアイデアは一般的に、基礎となるデータ構造がSHA-1ハッシュの非循環有向グラフであり、開発者が一生懸命働いていると言われたときにgitなどのツールを選択してそれが何を意味するかを理解できる十分な基盤を与えることですシステムコールの数を最適化して、io-boundになるようにします。
ここで、最後の文を理解するために知っておく必要のあるすべてのことをどこで学んだかを考えてください。答えが「大学」であれば、彼らは大丈夫です。
すべてが一時的な流行です。大学での最初の1年は、大学でのすべての年よりも多くのことを学びます。コンピュータサイエンスはコンピュータとは何の関係もありません。
カレッジは、ツールの完全なツールボックスを提供します。これはドライバー、つまり三日月形のレンチです。あなたは大学で一度各ツールを使用するようになるかもしれません。それはあなたが現実の世界に入るときであり、あなたが本当にあなたが何を持っているかを見つけるときです。万が一に備えて自宅でワークベンチに置きたいものと、毎日ポケットに入れているものから、便利なものを選別します。
Tqm、Iso、Cmm、Agileなど。これらはすべて今後流行し、成功するものはどれも、常識以上のものではありません。成功したすべてのエンジニアと企業は、常識のフレーバーを使用しています。それが彼らを成功に導いたものであり、そのための名前を必要とする人はほとんどいません。問題は、常識を売ることができないこと、マネージャーがキャッチーな名前なしで常識をトレーニングして購入することによって会社にその価値を証明できないことです。上司がニュース記事や雑誌で読んだ名前を付けてください。マネージャーは仕事を続け、あなたはあなたの仕事を続けます。これらの慣行に従うと主張する企業のほとんどは実際にはそうしません。ほとんどの人がコンサルタントに小切手を書き、彼らの年次または生涯の証明書をいくつかのクラブに渡して、ウェブサイトにグラフィックを入れたり、製品が入った箱にラベルを付けたりできるようにします。これは珍しいと多くの人が主張します...そこにいて、それを見て、それが起こります。これはすべてビジネスの一部であり、収益性を維持し、ドアを開いたままにし、ライトをオンにしておくために、時々手を抜く必要があります。これらすべての慣行の筋金入りの信者はすべて、最後のものは流行であり、これは無意味であり、最後のものは本当に高価すぎて従うことができないと主張しています。最後は偽のコンサルタントでしたが、これは本物です。プログラミング言語と同様に、これらも進化します。
ビジネスの現実、大学のシステム、およびその中でのあなたの役割を理解するあなたの能力が鍵となります。人生のあらゆるもののように、あなたの戦いを選択してください。大学や企業、政府など、あなたが知りたいことや知りたいことを教えるというのは、その仕事ではありません。ナンバーワンを探すのはあなたの仕事です。同様に、あなたはこれをする時間をあなたに提供したことで他の誰かを責めることはできません、あなたはそれをしなければなりません。あなたは馬から脱落します、あなたは犠牲者ではありません、立ち上がって立ち直ります、言い訳はありません、人生はそれと公正な取引ではありません。配布資料を活用してください。独立しているふりをしないでください。そして確かにあなたの会費を払ってください、彼らに見返りに何か(当時のあなたの最高ですか?).
なぜ人々はcmmやアジャイル、または他のいずれかが流行であると思いますか?なぜ彼らはそうではないと思いますか?なぜ教授はあなたにそのようにプログラムを教えたのですか?後藤を避けるため、または定数を避けるため、またはこれとそれを避けるために?より信頼性の高いコードを生成するためですか?より良いパフォーマンスのコード?人的エラーを減らしますか?それとも、論文やプログラムを採点する方が簡単で、研究に時間をかけることができるからでしょうか。彼らがプログラムする方法を知らず、彼らが主題について誰か他の人の本をフォローしているだけなのですか?彼らはあなたがあなたが保守可能で信頼できる高性能コードを持てないことを教えましたか?信頼性とパフォーマンスの両方を維持するために、保守可能な「任意の2つを選択する」ことさえできませんか?場合によっては、パフォーマンスの信頼性を犠牲にします。時々、信頼性やパフォーマンスを気にせず、さらに別の会計ソフトウェアプログラムのバージョン117.34.2からバージョン118.0.0に移行したいだけです。あなたのビジネスモデルは、バージョンアップグレードとテクニカルサポートの販売に基づいており、ソフトウェア開発者の限りでは、同じ方法で同じコードを書くことができる古いロボットがやってくれます。燃え尽きたものを大学の新鮮なものと交換し、アップグレードの販売を続けます。
これらの質問に対する普遍的な答えはありません。自分の意見が何であるかを見つけ、それと共存し、それを守らなければなりません。心を変え、それと共存し、それを守ってください。
すべてに質問してください...私がストーブの上の鍋に触れると、私は本当にやけどしますか?恐れることの心理的影響は、単に火傷をするだけではなく、より多くの損害を引き起こしますか?傷つくことなく答えをテストする安全な方法はありますか?
余裕があれば、寮の部屋でトランジスター、キャップ、抵抗器などを購入し、最終的に溶かしました。これらすべてに独特の悪臭があります。ステレオ用のアンプを購入する方が、最初のトランジスタクラスの翌日にアンプを作成するよりもはるかに安価で簡単です。 Linusは例外ですが、オペレーティングシステムを記述するよりオペレーティングシステムを購入する方が簡単です...そのときに学んだことはLinusが学んだこととは異なりますが、より多くのことを成し遂げることができます。
大学の内外の世界は、問題を解決するためにこれらの式(cmm、アジャイルなど)を採用し、次の問題が出てきたときと同じくらい速くそれらを落とします。成功するためにバージョン管理を使用する必要はありません。成功しない場合と同じくらい多くの成功があります(実際には、業界の時代のせいで、これまでのところバージョン管理なしの成功はたくさんあります)。同様に、最小限のテストで成功することができます(例として、コンピューター業界で非常に有名な企業を見てください)。自分のコードをテストすることで成功することができます。また、自分のコードをテストしてはいけないというルールに従うことで成功することができます。 emacsを使用して成功することができ、viを使用して成功することができます。あなたはどんなミックスがあなたのために働くかを決定しなければなりません、そしてあなたが運が良ければあなたに同意する仕事をする場所を見つけなければなりません。ツール、言語、プログラミングスタイル、恐怖、バージョン管理、ドキュメントなど、時間の経過とともに変化します。結婚して子供が生まれ、その大きな会社の隅に隠れて、退屈な仕事のある健康保険パッケージで、小さなスタートアップのホットショットプログラマーではなく、子供たちを楽しんでください。
大学を出て現実の世界に入ったら、「古いタイマー」に耳を傾け、一緒に働き、議論します。彼らは数十年から数世紀にわたる総合的な経験を持っています。自分で避けたり、自分でテストしたりするために陥りがちな罠があります(たぶん、鍋を触って火傷をする必要がないことを知っているかもしれません)。ほとんどの人は、これらの流行の少なくとも1つまたは2つが行き来すること、特にそれらがいかにひどく燃えているか、そしてそこから回復するために何をしたかを見てきました。彼らは物事をテストするための多くの異なる方法を知っており、来ては消えてしまったテストスタイルの名前も知っています。何が機能し、何が機能しないか。リスクはどこにあり、接線で時間を無駄にしない方法。成熟して古いタイマーになったら、それを前に渡します。あなたに続く人々を教えることを試みることによってあなたが学んだことの支払いをしてください。魚を与える方法を教えることを忘れないでください。そして、時には彼らが成功する前に彼らを失敗させ、彼らがあまりにもひどく火傷しないようにしなければならない。
ここで私が本当に言いたかったのは、今、私たちはパラレルユニバースの進化を目撃できる(そしておそらくそれに影響を与える)まれな状況にあります。はい、コンピューターサイエンスは物理学と言うより若い科学です。しかし、同時にそれは何度も進化してきました。どこで働いているか、誰と一緒に作業しているかによって、ハードウェアエンジニアを観察できる場合があります。ハードウェアの世界のプログラミング言語は確かに新しいものではありませんが、ソフトウェアの世界ほど速く進化していません。ソフトウェアは数十年前から始まりました。ハードウェアは常に、ソフトウェアエンジニアを二流市民と見なしてきました。私たちの仕事は簡単です、彼らの仕事は難しいです。 (私は実際にはハードウェアとソフトウェアの両方のエンジニアです)。おもしろいのは、現在、彼らはまだ私たちが初歩的な問題や幼児的な問題と見なすことに対処しているということです。バージョン管理を使用する必要があるのはなぜですか?このチップで作業しているのは私だけです。あなたがgccや他の安価なコンパイラーや無料のIDEでの経験は、私が使用する高価なツールと比較することはできません。そして、他の言い訳の長いリスト。私はvhdlとverilogの両方を学び、1週間以内にそのようなハードウェアエンジニアのほぼ勇敢な仕事から両方で生産性を高められたことを喜びました(卒業証書で電気技師が私の肩書きがソフトウェアエンジニアであると言いましたが)。私はこれらの言語を学びたかったのですが、ツールが利用できるようになったとき、私はオフィスに泊まり、独学しました。その時点から、そのエンジニアは特に、私が言っていることが真実であり、言語は単なる構文であり、プログラミングの基礎は同じであり、ツールはすべて同じことをすることに気付きました。そのリンゴとリンゴはリンゴとオレンジではありません。
一般に、これら2つの並列業界の1つは、言語、プログラミングの習慣、ソース管理、テスト、ツール、プログラミング環境などにおいて、他の業界よりも多くの経験を持っているというメッセージを送信することは依然として困難です。私が解決しようとしている問題は、開発中のハードウェア設計を採用し、プロセッサのシミュレーション(仮想マシン)と連携できる手頃な機能シミュレータを作成して、ハードウェアのテストとテストの開発を開始できるようにすることです。シリコンに移行するずっと前の成果物ソフトウェア。これには「新しい」ものは何もありませんが、最新のコードを取得したり、コードの変更を追跡したりして、時間を集中する必要がある場所を確認するメカニズムはありません。ハードウェアへのユーザー(プログラミング)インターフェイスを定義するドキュメントを追跡するメカニズムはありません。ゴールデンコピーの1つは、バイナリ形式で誰かの電子メールの受信トレイにあり、変更されるのは、ベリログを読んで何が起こっているのかを調べる必要がない場合のみです。待って、そのverilogは何歳ですか?私が一週間あなたに費やしたそのバグは3週間前に理解して修正されましたか?ハードウェア担当者がタスクを完了し、壁を越えて私たちにそれを投げるのを待つ6か月間、休暇の場所とパーティーに飛びますか、それとも、この機会に忍耐強く楽観的になり、彼らに彼らに教えることをしますか?邪魔にならない常識的な方法があり、彼らは仕事をしたり、仕事をバックアップしたり、ピアレビューのために自分のものを共有したりできます...
あなたと同じように、ハードウェアエンジニアは大学を卒業して、光沢のある新しいツールの箱を持っていたことを思い出してください。あなたは17の異なるプログラミング言語を学びましたが、そのうち1つしか使用できません。キャリアを終えた残りの言語は、大学を卒業した後に発明されます。彼らが大学を去ったとき、彼らは微積分と相対論について彼らが知っていることをあなたに告げることができます、そして、要素のそれぞれにいくつの電子があり、ガウス表面の周りの電荷を計算します。しかし、彼らのキャリアの大部分は1、0、および(そして私たちに共通しているもので、ハードウェアやソフトウェアのエンジニアではなく、コンピューターについて知っている必要があるすべてのものです)です。物理学、微積分の基本的な法則が与えられれば、電子はプログラミング言語ほど速く変化しないでしょう。しかし、プログラミングの基本はすべての言語で同じであり、今後も続くでしょう。 JavaはC++とは異なり、これとその他の理由で異なるので、それを知って大学を離れましたか?
他のビジネスと同様に、大学の仕事は収益性を維持することです。彼らは適切な学者を雇って、適切な学生と適切な研究費および適切な種類の研究の両方をもたらし、大学の収益を上げる必要があります。彼らは適切なクラスを提供して適切な学生をもたらし、適切な卒業生を生み出す必要があります。そうすれば、数十年が経つにつれて、大学の近くの、そしてうまくいけば遠くの両方の雇用主が、この大学が生産的で利益のある従業員を生み出すことを認めるでしょう。 (はい、時には適切なスポーツで適切なアスリートを引き付けて、適切な量のテレビ時間と適切な量の名前認識とスポーツ収益を得る必要があります)。 C++とJavaを教える大学もあれば、教えない大学もあります。 CMMを発明する人もいれば、アジャイルを教える人もいれば、どちらもしない人もいます。大学に価値があるとしたら、あなたが学ぶべきことがあるでしょう。彼らはあなたが学ぶべきすべてをあなたに教えるわけではありませんが、彼らは何か有用なものを持っているでしょう。あなたがそこにいる間に何かを学び、道具箱にさまざまな形の道具を合理的な数だけ集めてください。大学を出て就職する。ツールボックスに問題がある場合は、別の大学を見つけて、最初の大学には言及しないでください。それが問題のないツールボックスである場合は、それらのツールを使用して、自分の時間にいくつかの新しいツールを構築します。それがかなり良い道具箱であるならば、あなたがこれとそれからそれを学んだその大学と良い学者について良いことを言って、彼らがあなたに与えたものに対して学校に返済してください。大学のツールのユニバーサルカタログですべての可能なツールを入手できなかったとしても、特定のサブセットを使用することになります。卒業しなくても….
私はオレゴン工科大学の非常勤のときにこれらのことを教えました。彼らは、まばらに教えられます。
ああ、神様は私を始めさせないで
私はかつて評判の良い大学でcsの学部長にオブジェクト指向プログラミングは単なる「流行」だったので、C++のような空想のクラスを提供しなかったと教えてくれました
なぜ彼らがこれらのことを教えていないのかについては、まあ、大学は必ずしも業界のベストプラクティスではなく、規律の基礎を教えるためにそこにあります
最も簡単な答えは、あなたはコンピュータサイエンスを研究していて、あなたが挙げたものはコンピュータサイエンスの学問分野とはあまり関係がないということです。ソフトウェア開発は、コンピュータサイエンスではdoのようなものかもしれません。これは、学んだことのブロックに基づいて構築されるものです...しかし、コンピュータサイエンスとソフトウェア開発は同じものではありません。
バージョン管理、または効果的な単体テストの作成方法を教えたクラス... trade、つまり(良い)ソフトウェア開発を教えてくれます。
まあ大学のことは、彼らは本当に普遍的なことを教える必要があるということです。アジャイル開発のようなものはまだかなり新しく、インターネット上で話題になっているにもかかわらず、どこでも使用されているわけではないため、クラス全体の学生に教えることは、アジャイルショップに着いた少数の人々にのみ利益をもたらす可能性があります。
しかし、バージョン管理は最近では許されないものです。これは、コンパイラとほぼ同じくらい便利なツールであることを誰もが理解する必要があるものであり、CVSは約20年以上前から存在しています。概念は、少なくとも大学を去るプログラマーによって理解される必要があります。幸いにも、大学でグループ作業を行っている場合、幸運なことに、バージョン管理についてすでに知っている誰かと上陸して、グループにそれを使用するよう説得することができます。その人が私のグループにいてくれてうれしいです。
単体テストも、言い訳のできないものです。私が言っている唯一のことは、この本はまだテスト駆動の開発に関するものであり、100%のコードカバレッジを常に追求することは、時々、それが価値があるよりも厄介になる可能性があることです。しかし、単体テストは非常に価値があり、ソフトウェアエンジニアリングコースでカバーする必要があります。このようなもののいくつかは、いくつかの大学に導入されていると思いますが、まだすべての大学に到達していません。
確かにそうではありませんか?私のCSの学位を取得する私の経験はほとんど同じでした。その理由は、プログラミングを教える人は、私の知る限り、プログラミングを行わないからです。認定のためにそのようなものを教える必要はありません、教師はそれに慣れていない、そして学生はコースワークの一部として重要なプロジェクトを決して開発しません。 CS理論やJava構文を教えるのとは対照的に、実際にプログラミングを教える動機はありません。
大学によって異なります。 2003年にオーストラリアの大学を卒業しました。その間に、UML、ユニットテスト、XP(およびその他のアジャイル手法))と、Z、アルゴリズムとデータ構造、オペレーティングシステムなどのすべての正式なものを学びました。
ただし、ユニットテストについては詳しく説明していません。1回の講義で合格テストを実施しただけです。 「単体テストとは」だけではなく、効果的な単体テストの書き方を学べたら良かったと思います。
バージョン管理に関しては、2年目以降のプログラミングプロジェクトでバージョン管理(CVS)を使用していました。
私もグリフが言ったことに強く同意します。 CSは非常に未熟な分野であり、実際には過去50年間だけであり、私たちが何を学習すべきか、そして何が流行しているのかを私たちは知りません。それに150年を与えれば、物事はさらに落ち着くかもしれません。失敗した現実世界のプロジェクトの数は、これが未成熟な産業であることを明らかにしています。建築プロジェクトの80%が失敗したと想像してみてください!
コンピューター科学者は、エンジニアではなく数学者であると考えているため、工学の部分よりも数学の部分を教える方を好みます。テスト、バージョン管理、および文書化は、他のエンジニアリング分野の場合よりも、流行を超えていません。
これらすべては、ソフトウェア開発プラクティスの単一クラスで(浅く)簡単にカバーできます。それはほとんどのCSカリキュラムの一部ではありません。それはCSの目的ではないためですが、その内容をある程度カバーすることは有用だと思います。私の学校にはそのようなクラスがありました。バージョン管理はカバーしませんでしたが、UML、要件収集、開発方法論(さまざまなアジャイルとウォーターフォール)、ユニットテスト、統合テストなどをカバーし、プロジェクトを開発するために4〜5人のチームで作業する必要がありました(Javaでのかなり単純な手がかり)。さらにソフトウェアエンジニアリングのクラスの必要性を感じた場合は、選択科目として利用できました。
私が取ったどのクラスでも一度バージョン管理について言及したことはありませんが、ほとんどの友人はそれを個人的なプロジェクトやクラスの割り当てなどに使用していたため、それに触れたことがないわけではありません。自分で拾わなかった人は、チームの割り当ての過程でクラスメートにそれを使用することを余儀なくされました。
大学は、概念と理論を教えることを目的としています。なぜなら、それらは自分で習得することが難しいものだからです。バージョン管理はツールであり、簡単に入手できます。少し使用して、Webでいくつかのチュートリアルを読んでください。 SVNから何かをチェックアウトする方法を理解するための講義や宿題が必要な場合、実際には難しいことについて多くの問題が発生します。
大学の授業以外のことを学ぶ方法はたくさんあります。それを利用してください。クラスに参加して設備を使用するために多額の費用を払っているので、価値のあるものをすべて搾り取り、LUGとACMの会議に参加するか、プロジェクトチームに参加する(常に、プログラマーを必要とするロボットを構築しているMEがいる)か、人文学部のサーバーを管理する仕事。マテリアルエンジニアリングの建物の荷積み用ドックからコンピュータをトラッピックし、高速インターネット接続でLinux isoをダウンロードして、遊んでみてください。
あなたは3と名付けましたが、そのうちのいくつかは、コンピュータシステム(バージョン管理など)を理解する上でそれほど重要ではないと思います。これらは仕事の一部であり、あなたはそれを知らなくても良いプログラマー/コンピューター科学者になることができます。
同様に単体テスト-なぜ単体テストを選ぶのですか?確かに、ユーザビリティテスト、システムテスト、ユーザー受け入れテスト、工場受け入れテストの方が重要ですか?まあ、それらはコードが保守部門に出荷されたらジョブが完了したと見なさない限り:)
私が日常的に使用している他の概念について考えてみてください。これは、ソフトウェアとコンピュータシステムの基本に慣れる学生にとってはほとんど役に立ちません。
上記はすべて「ソフトスキル」であり、優れたコードを作成するために必要することはできません。
ただし、データ構造やアルゴリズムなどの「ハード」スキルが不足している場合、優れたコードを作成するチャンスはほとんど不可能です。
問題は、大学はあなたがプロであることを教える必要があると感じているのではなく、プログラミングの学問的な側面に焦点を合わせていることだと思います。業界で使用されている最新の方法や手法にも言及する必要があると思いました。これらも学術的な興味があるからです。
私たちのコースでは、プロジェクトに費やされた時間の記録、優れたコメントなどをカバーするパーソナルソフトウェアプロセスを学びましたが、バージョン管理などの専門的な基礎については触れていません。
アジャイル開発を除いて、私はそのすべての新入生年を学びました。
正しい学校、IMHOを選ぶことがすべてです。トップ10に入ると、すぐにそのすべてを学べます。
CS Education全般に関して言えば、基本的には教授に多くのことを教えるよう求めています(あらゆるフレーバーの言語、データ構造、実行時の効率、ビットレベルで実際にどのように機能するか)。私は質問をしたいと思います、なぜ子供たちはソフトウェア工学についてもっと学ぶために自分自身を引き受けないのですか?
それは単に、データ構造とアルゴリズムがコンピューティングの中核を構成しているため、はるかに重要だからです。単体テスト、バージョン管理、アジャイル方法論は、取引のツールにすぎません(必要に応じて、仕事でそれらを選択することが期待されています)。
私はそれらすべてを大学で学びました。多分それはあなたが選ぶコースに依存しますか?私のコースは非常に多様でした(ソフトウェアデザイン、UIデザイン、eコマース、AI、関数型プログラミングなど)。 Software Designは、設計パターンと単体テスト(さまざまなことを含む1つの大きなプロジェクト)に触れていました。 UIデザイン...私たちはプロジェクトに取り組んでいる3人のグループでした。バージョン管理なしでは何もできなかったので、それを手に入れました。そして、アジャイル開発は私たちの教授が継続的に私たちに話したものでしたが、彼らはそれを使用するためにそれを各グループに任せました。
多くの大学生が「簡単な」コースまたは高いGPAを与えるコースを受講したことがわかりました。他の人々は、彼らが学びたいものに焦点を合わせて、彼らが興味を持っている分野を見つけるために大部分を探っています。そして、彼らが興味を持っていることを正確に知っている人たちがいます...彼らは彼らのコースを多様化しない傾向があることを除いて、それは良いことです。
学生と同じように、大学もそれぞれ異なります。一部の大学、より正確には、一部の教授は変化に対して抵抗力があるか、怠惰です。幸い、ほとんどはそうではありません。理論、概念、歴史などは、CSのカリキュラムにとって重要かつ不可欠です。しかし、それは彼らの労働環境のために学生を準備しています。当然のことですが、私の地域のコミュニティカレッジでは、最新の適切なCSコースを提供しています。大規模で確立された一流の大学ではそれほどではありません。
ほとんどの学校は貿易ではなく学問的であるため、彼らはそのようなトピックを教えていません。つまり、アイデアや理論を教えるためのものであり、キャリアを積むためのものではありません。 QAの全体的な概念は、数学的証明を通過すること以外はコンピュータサイエンスとは関係ありません。さらに、QAの実践と開発ワークフローは開発会社によって大きく異なるため、学校でそれらを教えることは時間とお金の浪費です。
なぜこれらのことが最初に教えられないのかを知るために:学部課程は通常、修士課程の学生になるためのトレーニングを行います。自分のコースを選択し始めて(通常、後の年に起こります)初めて、学外で使用されるものについて学ぶことを選択できます。これが、アルゴリズム、データ構造、未解決の問題の提示などに重点を置いている理由です。
個人的には彼らがこれをやっているのは問題ないと思います。プログラミングは、私たちの多くが考えているほど簡単ではありません。多くの人がそれに苦労しています。私はむしろこれらの人々が最初にforループがどのように機能するかを理解してから、Perforceであるモンスターを理解します。
あなたが言及する3つのことすべて(ユニットテスト、バージョン管理、アジャイル開発)は、フローニンゲン大学のコンピューティングサイエンスプログラムである程度教えられています。それが良いことかどうか、私は未解決の質問として残しておきます。しかし、「実用的なもの」を教えている大学はありません。
これらは、専攻を切り替える前のCSプログラムでの限られた経験と、大手ソフトウェア会社でのインターンとしての私の経験に基づいています。作成する必要のあるプログラムのほとんどは自動テストを必要とするほど大きくないため、ユニットテストは教えられません。特定の入力セットが保証されているため、すべてを手動でテストできます。ほとんどのプロジェクトは、自動テストを実行するスクリプトでグレーディングされているため、テストを自動化する方法を教えると、プロジェクトのグレーディングが妨げられる可能性があります。 int foo2;適切なインデントを使用します。
バージョン管理が教えられない理由はわかりませんが、その一部はおそらくプロジェクトのサイズです。バージョン管理を行うのに十分な大きさのプロジェクトはありませんでした。概して、1000行を超えるコードを意味し、学期全体を書きました。あなたがそれを必要とするなら、彼らはあなたがあなたにそれをあなた自身に教えるだろうと思います。私が持っていたグループプロジェクトはペアプログラミングプロジェクトであるはずでしたが、両方が同じコンピューターでバージョン管理を使用しているのはなぜですか?
なぜアジャイル開発が教えられないのかはわかりませんが、おそらくプログラムサイズで同じことに戻ります。アジャイル開発は、パーソナルコンピューターや小さなサーバーで実行される新しいソフトウェアでは一般的ですが、IBMメインフレームなどのシステムや、銀行や医療など、ドキュメントが重要な問題領域では一般的に使用されません。また、アジャイル開発は、多くの教授が訓練された20年ほど前のことではなかったという事実とも関係があります。
アジャイルプログラミングは流行ではないと思いますが、同時に、教師がプロジェクトを提供してそれを学習できるようにする方法を考えるのは難しいでしょう。プロジェクトAのビルドを提供しない限り、プロジェクトBはaを展開します。問題は時間と範囲です。 4か月のコースでは難しいでしょう。
バージョン管理と単体テストの方法は常に変化しており、言語やそれらを定義する人に依存しています。
データ構造とアルゴは、クラス設定で作業できるものです。正直なところ、彼らはユニットテストとバージョン管理を理解するためにかなり多くの努力を払っています。大学の一部は、自分自身を教えることを教えることです。コラージュにはまったく同じ権限がありません。または、少なくとも同じ程度ではありません。私見では。
優れたCSプログラムは、将来のすべてのプログラミング教育の基礎となる基礎を教える必要があると思います。アジャイルのような開発方法論やバージョン管理ツールは流行のようなものです。彼らは行き来します。また、アカデミックなものではなく、業界の設定で使われる傾向があるため、大学でこのようなことを学ぶことはめったにないと思います。私はそれが正しいとは言っていませんが、それはおそらく学問的な考え方です。
私はあなたの言っていることに同意します。私は最近ソフトウェア開発の世界で働き始めたばかりで、大学で教えられたことのないアジャイル開発についてすでに学び始めています。
問題の事実は、大学の教授が必要以上に新しい開発技術に追いついていないことかもしれません。彼らはまた、カリキュラムに他のより重要なことがあると感じているかもしれません。
大学の講師はソフトウェアの書き方を知りません。ソフトウェアを研究し、教えるだけです。時々、論文が発表されるまで機能する必要があるコードを打ち消します。
Titusのような人々のおかげで、真にプログラミングを学べる学者がいます- このトピックに関する彼のコメントをここで読んでください
私が学生だったとき、私は図書館でエクストリームプログラミングについての本を読んで、それをクラスで短期間で話し合いました。ソフトウェア開発の「ウォーターフォールモデル」に準拠することを要求したのと同じクラスで、「コンパイル」はそのステップです。自分の。
あなたのキャリアで最高です、あなたの学位を卒業してくれることを願っています。あなたの名前の後に手紙があることは素晴らしいことです。 :)
あなたがどのようなコンピュータサイエンスプログラムをやっているのかによって、研究科学を目指すものもあれば、実装側を狙うものもあると思います。私は特に、学術界に留まっている教授しかいない特定の学校には反対しました。あなたが彼らが教えるものを「使用」していない教授がいない場合、それらはすべて文字通り頭の中にあります。
プラグイン:デポール大学でコンプサイエンスの理学士号とソフトエンジニアリングの修士号を取得していた私は、パートタイムを教えていたインストラクター/教授から主に教えられました。クラスに関連付けます。また、これはほとんど通勤/パートタイムの学校であり、ほとんどの学生は彼らが学んでいることを使うことに仕事をしています。
学習プロセスはまだすべての理論から始まりますが、通常、「実際にこれを仕事で使用している人はどれくらいいますか?」典型的な答えは「使用しますが、単純化された方法で」であり、実際の現実のシナリオに進みます。
私の学校教育の間、ユニットテストは常に存在していました。彼らはあなたをJavaから始めましたが、すべてのプロジェクトにANTとJUnitを使用させました。これは、ビルド構成と単体テストの良い出発点でした。
エクストリームプログラミングは、私が受講したクラスの約3つか4つに含まれていました。それらはすべて、ペアプログラミングからユニットテストまで(上記を参照)、12の異なる側面から始まったことを覚えています。そして今、焦点はアジャイルにあるようです。
ですから、簡単に言えば、他の学校よりも実用的なアプローチをしている学校は他にもあります。
ほとんどの大学のソフトウェアプロジェクトは、1つのクラスの範囲内に収まる必要があります。つまり、1〜4人の経験の浅いプログラマーが関与する5〜6週間のプロジェクトが効果的です。ユニットテストとソース管理は、それを超えて、より多くの人が関わる長期的なプロジェクトにスケールした場合にのみ、説得力のある効果を発揮します。その結果、無意味な要件のように思えない方法でクラスプロジェクトにそのようなテクニックを組み込むことは困難です。
主な理由は、多くの(ほとんど?)大学が、自分たちが職業学校とは異なる目標を持っていると考えているためです。そのため、彼らは学生に学習方法と、その分野の基本原則を教えることを望んでいます。さらに、アルゴリズムとデータ構造は任意のプログラミング言語に適用され、特定のツールに依存しません(卒業によってまだ使用されている場合とされていない場合があります)。
コンピュータサイエンスでは、これはアルゴリズム、データ構造、コンピュータ理論、コンパイラ理論などを意味します。あなたがリストしているのは、プログラミングの方法や問題の解決方法などの理解ではありません。プログラミングの実践(それはちなみに、プログラマーとして働くつもりのある大学の誰にとっても素晴らしい本です)。現在、これの多くはエントリーレベルのコードモンキーポジションでは使用されないため、一部の人々はそれを役に立たないと考えています。同意しません。非常に役立つと思います。ただし、CSの学位を取得した後、プログラマーとして働くために必要なすべてのことを知っているという意味ではありません。
これは、あなたが言及したことが役に立たないと言っているのでもありません。彼らです。あなたがそれらを学ばなければプログラマーとして働くことに苦労するでしょう、そして私は彼らが少なくともある程度は大学で教えられるべきだと思います。アートの学部のプログラミングを見るのと同じように、バージョン管理やユニットテストなどを教え、ペイントブラシとは何か、さまざまな場合にどのブラシを使用すべきかを教えます。
ユニットテストとバージョン管理はどちらも、私が大学に通った2年目のコンピューターサイエンスコースで教えられました。ユニットテストは、ホワイトボックスとブラックボックスの違いを含むテストの一部に分類されました。3年目のプログラミングの割り当てのマークのかなりの部分は、ユニットテストから簡単に取得できる優れたエラー処理に使用されました。
アジャイル開発は、私が考えるアカデミックな環境で教えるのはかなり難しいかもしれません。私は理論的にウォーターフォール法について学びましたが、卒業して現実の世界に移動して初めて、アカデミアとは異なる可能性があるまで、フィールドでそれを見ることはできませんでした。 3年目に、私はすべての奇妙なエラーのケースを実行し、割り当てがセマフォについて教えてくれたことの心に触れたことのない割り当てにほぼ合格しました。
また、アジャイルはどのくらいの期間使用されており、どのような形のアジャイルですか?私が見たものから、それの多くの異なる実装があります。
理想的には、彼らがそれらのことを教える時間がないか、ほとんどの学生が学ぶのが難しいアルゴと言語を教えることがより重要であるかのどちらかだと私は推測しています。
学校は自己学習の反対であり、これらのこと(バージョン管理、単体テスト)は最も簡単に学ぶことができるため、最も能力のない生徒でも最も重要な基本的なプログラミングとアルゴリズムを実行できることを確認する必要があります。後で「周りのもの」を実行します。
あなたが話しているこれらの事柄は時間とともに変化し、ツールなどを変更することは困難です。大きな教育構造は、それをシンプルに保つことを好みます。