ある方から
コンピュータサイエンスを学んでいるか否かで3年後、5年後で書けるコードの質が変わってくる。
と話してもらったことがあります。
文系でプログラムを独学でやってきて楽しくなってきたので仕事にしたいと考えています。
仕事にするからにはレベルの高いエンジニアになりたいんですがやはりこの方が言うようにコンピュータサイエンスを学ぶかどうかで将来到達できるレベルは変わってくるんでしょうか?
と言っても自分の中ではその人の話にとても納得してしまったので必要になってくるレベルまでコンピュータサイエンスも学びたいと考えているのでオススメの書籍、学習コンテンツがあれば教えて頂きたいです
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
コンピュータサイエンスを学んでいるか否かで
3年後、5年後で書けるコードの質が変わってくる
大筋同意ですが、「コンピュータサイエンス」という言葉が何を指すかは、
人によってかなり幅がある気がします。ここでは、私の解釈を書きます。
- サイエンスの中で、コンピュータで処理するのに適した領域
- コンピュータ理論の中で、サイエンスにまで抽象化した領域
大別すると上の二種類で、前者はグラフ理論などの離散数学、
後者はオートマトン、チューリングマシンなどの計算機科学。
オートマトンの学習では最初見たとき、「ababab」などの文字列を生成するとか、
無機質な例が多いので、「一体これで何ができるのか?」と思いました。
しかし後に、BNFと合わせて、言語処理系の基本だと思うようになりました。
DSLや自然言語処理のように、言語処理は意外と使い道があります。
また、コンピュータサイエンスに入れるかどうか微妙ですが、
微積分、確率統計、線形代数などの普通の数学や、
ソートや探索など、普通のアルゴリズム。
これらも、土台になる基礎的知識なので、有用です。
流行の機械学習も、その中身は結局、機械に統計をやらせてます。
アルゴリズムの入門書に関しては、上記が図解が多いので、分かりやすいです。
コンピュータサイエンスも学びたいと考えているので
オススメの書籍、学習コンテンツ
MITで教えていたSICPなど、名著はたくさんありますが、
難解なので、ここではもっと平易な本を紹介しておきます。
名著はゆくゆく読むとしても、
最初の一冊は平易な方がモチベーションが保ちやすいですから。
「複雑ネットワーク」とは何か 複雑な関係を読み解く新しいアプローチ (ブルーバックス)
上記の本は、これ一冊読んだだけで、すぐに何か実装できるわけではないんですが、
コンピュータサイエンスで何ができそうか、というイメージがつかみやすいです。
たとえば、SNSに新機能をつけるときなど、ネットワークの理解で差が出るかもしれません。
また、ゲーム理論なども、面白い題材がたくさんあります。
これは別に文字通りのゲームだけじゃなくて、
オークションなどのビジネスにも応用できます。
投稿2017/12/05 15:00
総合スコア5592
0
LLmanさんに続いて追加補足しようかと思います。
「コンピュータサイエンス」についてですが日本語では、計算機科学(computer science)、と言われます。
この他に(あるいは包含もしくは分野が重複する形で)、計算科学(computational science)、情報学(information science)、情報科学(Informatics)、情報工学(information engineering)、ソフトウェア工学(software engineering)、と言われるような分野があります。
科学と工学をきっちりと線引きするのは難しいですが、科学は物事や現象理解に注力し、工学は手法の効率性や新しい物事の創成に注力する傾向があります。
分野にもよりますが、ある程度はハードウェアの知識もあったほうがソフトウェアの理解も進みます。
私が講義で出す簡単な例ですが、現在のノイマン型コンピュータ上のプログラミングでは厳密には0.1+0.1を計算できません。この理由はデータを二進数で扱っているためですが、なぜ二進数がコンピュータにとって便利なのかはハードウェア(トランジスタ)の仕組みを知っているとすんなり理解できます(これらのようなバックグラウンドがあると、実数計算に気を使うようになりますし、Excel上の計算でも実数計算には誤差が発生することを理解できます)。
プログラミングを上達させたい、という目的があるならば、LLmanさんが言われた離散数学や情報理論のバックグラウンドは将来的に必ず役に立つと思います(特に通信技術、暗号技術、音声処理などに深く関わってきます)。私は大学の情報工学科の出身ですが、論理学(logic、最低でも一階述語論理)のバックグラウンドがあるとアルゴリズムの構築に役立ちます。また計算理論のバッググラウンドがあると計算量の話やチューリングマシンの話、関数型言語の理解などの助けになります。計算可能性の話が理解できるとコンピュータに解ける問題とそうでない問題、の見分ける力が養えます。組み合わせ数が爆発するような問題の解決方法などはいろいろな分野に応用可能でしょう。
tomagurosuさんがいうところの「コンピュータサイエンス」が教えられているような大学の学科ではこれらの科目はおそらく必修科目ですので、一見、プログラミングに直接関係ないようなものでも、実はいろいろ関係していたりするので、これらを強制的によく知る先人(先生)から一気に体系的に教えてもらえる、というのは後々自分で独学を進めるにしろ、それなりにその後の学習速度を増す効果はあるかと思います(例えばいろいろな数学の記号が概念を理解できているだけでも将来的な独学が加速できるかと思います)。
ただ、将来最終的に到達できるレベル(分野によると思いますが)がこれらの学問の基礎を全て学習したかどうかで決まるとは私は思いません。ご参考になれば幸いです。
投稿2017/12/06 15:27
編集2017/12/06 15:36総合スコア98
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「アルゴリズムとデータ構造」なんていうそのまんまなタイトルの本もありますが、コンピューターサイエンスを実際のプログラミングに活かす上では、この2つが軸となってきます。
アルゴリズムを変えれば、処理速度が決定的に違ってきますので、アルゴリズムの選択で実用的な速度が出るかが決まってきます。O(n^2)
のような、件数に対する処理速度の関係も、忘れてはいけないものです。
データ構造は、(特にファイルやデータベースに保管するものの場合)一度決めてしまえば、後々まで響いてきます。RDBMSを「ただのデータ置き場」として使うのと、リレーションをフル活用するのとでは、できることすら違ってきます。
投稿2017/12/05 07:48
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/01 05:04