質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.35%

  • プログラミング言語

    560questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

エンジニアに必要なコンピュータサイエンス

受付中

回答 3

投稿 2017/12/05 16:28

  • 評価
  • クリップ 8
  • VIEW 736

tomagurosu

score 5

ある方から
コンピュータサイエンスを学んでいるか否かで3年後、5年後で書けるコードの質が変わってくる。
と話してもらったことがあります。
文系でプログラムを独学でやってきて楽しくなってきたので仕事にしたいと考えています。

仕事にするからにはレベルの高いエンジニアになりたいんですがやはりこの方が言うようにコンピュータサイエンスを学ぶかどうかで将来到達できるレベルは変わってくるんでしょうか?

と言っても自分の中ではその人の話にとても納得してしまったので必要になってくるレベルまでコンピュータサイエンスも学びたいと考えているのでオススメの書籍、学習コンテンツがあれば教えて頂きたいです

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+5

コンピュータサイエンスを学んでいるか否かで
3年後、5年後で書けるコードの質が変わってくる

大筋同意ですが、「コンピュータサイエンス」という言葉が何を指すかは、
人によってかなり幅がある気がします。ここでは、私の解釈を書きます。


  • サイエンスの中で、コンピュータで処理するのに適した領域
  • コンピュータ理論の中で、サイエンスにまで抽象化した領域

大別すると上の二種類で、前者はグラフ理論などの離散数学
後者はオートマトン、チューリングマシンなどの計算機科学

オートマトンの学習では最初見たとき、「ababab」などの文字列を生成するとか、
無機質な例が多いので、「一体これで何ができるのか?」と思いました。

しかし後に、BNFと合わせて、言語処理系の基本だと思うようになりました。
DSLや自然言語処理のように、言語処理は意外と使い道があります。


また、コンピュータサイエンスに入れるかどうか微妙ですが、
微積分、確率統計、線形代数などの普通の数学や、
ソートや探索など、普通のアルゴリズム

これらも、土台になる基礎的知識なので、有用です。
流行の機械学習も、その中身は結局、機械に統計をやらせてます。

新・明解 Javaで学ぶアルゴリズムとデータ構造

アルゴリズムの入門書に関しては、上記が図解が多いので、分かりやすいです。


コンピュータサイエンスも学びたいと考えているので
オススメの書籍、学習コンテンツ

MITで教えていたSICPなど、名著はたくさんありますが、
難解なので、ここではもっと平易な本を紹介しておきます。

名著はゆくゆく読むとしても、
最初の一冊は平易な方がモチベーションが保ちやすいですから。

「複雑ネットワーク」とは何か 複雑な関係を読み解く新しいアプローチ (ブルーバックス)

上記の本は、これ一冊読んだだけで、すぐに何か実装できるわけではないんですが、
コンピュータサイエンスで何ができそうか、というイメージがつかみやすいです。
たとえば、SNSに新機能をつけるときなど、ネットワークの理解で差が出るかもしれません。

また、ゲーム理論なども、面白い題材がたくさんあります。
これは別に文字通りのゲームだけじゃなくて、
オークションなどのビジネスにも応用できます。

投稿 2017/12/06 00:00

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

「アルゴリズムとデータ構造」なんていうそのまんまなタイトルの本もありますが、コンピューターサイエンスを実際のプログラミングに活かす上では、この2つが軸となってきます。

アルゴリズムを変えれば、処理速度が決定的に違ってきますので、アルゴリズムの選択で実用的な速度が出るかが決まってきます。O(n^2)のような、件数に対する処理速度の関係も、忘れてはいけないものです。

データ構造は、(特にファイルやデータベースに保管するものの場合)一度決めてしまえば、後々まで響いてきます。RDBMSを「ただのデータ置き場」として使うのと、リレーションをフル活用するのとでは、できることすら違ってきます。

投稿 2017/12/05 16:48

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

LLmanさんに続いて追加補足しようかと思います。

「コンピュータサイエンス」についてですが日本語では、計算機科学(computer science)、と言われます。

この他に(あるいは包含もしくは分野が重複する形で)、計算科学(computational science)、情報学(information science)、情報科学(Informatics)、情報工学(information engineering)、ソフトウェア工学(software engineering)、と言われるような分野があります。

科学と工学をきっちりと線引きするのは難しいですが、科学は物事や現象理解に注力し、工学は手法の効率性や新しい物事の創成に注力する傾向があります。

分野にもよりますが、ある程度はハードウェアの知識もあったほうがソフトウェアの理解も進みます。
私が講義で出す簡単な例ですが、現在のノイマン型コンピュータ上のプログラミングでは厳密には0.1+0.1を計算できません。この理由はデータを二進数で扱っているためですが、なぜ二進数がコンピュータにとって便利なのかはハードウェア(トランジスタ)の仕組みを知っているとすんなり理解できます(これらのようなバックグラウンドがあると、実数計算に気を使うようになりますし、Excel上の計算でも実数計算には誤差が発生することを理解できます)。

プログラミングを上達させたい、という目的があるならば、LLmanさんが言われた離散数学や情報理論のバックグラウンドは将来的に必ず役に立つと思います(特に通信技術、暗号技術、音声処理などに深く関わってきます)。私は大学の情報工学科の出身ですが、論理学(logic、最低でも一階述語論理)のバックグラウンドがあるとアルゴリズムの構築に役立ちます。また計算理論のバッググラウンドがあると計算量の話やチューリングマシンの話、関数型言語の理解などの助けになります。計算可能性の話が理解できるとコンピュータに解ける問題とそうでない問題、の見分ける力が養えます。組み合わせ数が爆発するような問題の解決方法などはいろいろな分野に応用可能でしょう。

tomagurosuさんがいうところの「コンピュータサイエンス」が教えられているような大学の学科ではこれらの科目はおそらく必修科目ですので、一見、プログラミングに直接関係ないようなものでも、実はいろいろ関係していたりするので、これらを強制的によく知る先人(先生)から一気に体系的に教えてもらえる、というのは後々自分で独学を進めるにしろ、それなりにその後の学習速度を増す効果はあるかと思います(例えばいろいろな数学の記号が概念を理解できているだけでも将来的な独学が加速できるかと思います)。

ただ、将来最終的に到達できるレベル(分野によると思いますが)がこれらの学問の基礎を全て学習したかどうかで決まるとは私は思いません。ご参考になれば幸いです。

投稿 2017/12/07 00:27

編集 2017/12/07 00:36

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

ただいまの回答率

91.35%

関連した質問

同じタグがついた質問を見る

  • プログラミング言語

    560questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。