自分用メモ
随時追記していく
※参考:キタミ式イラストIT塾 基本情報技術者の内容まとめ
目次
コンピュータサイエンスとは?
情報と計算の基礎的な理論や、
これらのコンピュータ上への実装と応用に関する研究分野。
自然法則を発見する理学、便利なものを創り出す工学、
論理によって法則を導き出す数学といった
3つの領域にまたがってるのが特徴。
AIや自然言語処理、コンピュータグラフィクス、
プログラミング言語、ゲームデザイン、アルゴリズム、計算理論、
Webやインターネット技術など様々な下位領域がある。
※参考:デジタル用語の定義を簡単にまとめてみた
関係の深い学問分野としては、
経済学や数学、物理学や言語学などが挙げられる。
※参考:数学のカリキュラムまとめ
※参考:言語の概念を掴むコツは?概念世界や抽象具体の区別など
コンピュータサイエンスに携わる人が直面する課題
社会の大多数の人が使う大規模なサービス、
膨大なデータを使う大規模なデータ処理、
といった大規模なシステムをどのように実現するのか
実現したい事象は、本当に「実現すべき情報の動き」として表現できるのか。
どのように表現すれば、効率的な大規模システム構築に貢献できるか?
コンピュータサイエンスの下位領域
・科学技術計算
・人工知能
・計算言語学と自然言語処理
・コンピュータグラフィクス
・コンピュータビジョン
・コンピュータシステム
・ソフトウェア工学
・プログラミング言語
・HCI
・ゲームデザイン
・離散数学とアルゴリズム
・計算理論
・Webとインターネット技術


コンピュータサイエンスってなんだろう
「プログラミング教育」への関心が高まっている日本。社会におけるコンピュータ活用の重要性が増していることを反映し…
プログラマだったら知って欲しい知識
話題の技術というのは、昔から使われていた技術の焼き直しや、
言い方を変えただけ、というのはよくある事である。
こうした事に振り回されないためにも学習すべき。
※参考:クリエイティブ、プログラミング用語まとめ
①当然知ってて欲しい知識
・データ構造リスト、配列、ツリー、ハッシュ、スタック、キュー等の違いが説明でき、
これから組もうとするプログラムに対して、どれを使うべきか適切に選択できる
必要に応じて、それらを応用したデータ構造を自分で定義して使うことが出来る。
※参考:配列、連想配列、for文、foreach文の違いや関係性
・計算量(計算複雑性)
自分が書いたコードが、0(1)なのか、0(n)なのか
0(n^2e)なのか、0(n^m)なのか、0(n!)なのかを説明できる。
各種あるプログラミング言語のコレクション関連のライブラリで、
どの操作がどの計算量で終わるのかを理解した上で使う事ができる
計算複雑性のクラスの概要を知っていて、それぞれに例えばどういう問題
(巡回セールスマン、ナップザック、集合打など)があるのか、勉強した事がある。
※参考:コンピュータを使ってデータを表現する方法。文字コードやデータ容量も解説
・アルゴリズム
ソート、探索、文字列検索、データ符号化、圧縮、誤り検出、訂正など、
「なんで圧縮してもサイズが減らないのか(圧縮が無意味なのか)」
「なんでソートが遅いのか」などを適宜判断して修正できる。
※参考:アルゴリズムとは?プログラミングとの関係や記述方法
・数値計算
浮動小数点の仕組みと情報落ち桁等の理解、行列、線形代数、
モンテカルロ法、ニュートン法、オイラー法、ルンゲクッタなど。
「そういうのあったな」と頭の片隅に入れておいて
必要な時にググりつつ応用できる。
・グラフ理論
有向/無向グラフ、木、ループ、カット、彩色、結婚定理などの基礎の理解。
「そういうのあったな」と頭の片隅に入れておいて
必要な時にググりつつ応用できる。
・理論計算機
ステートマシン、オートマシン。チューリングマシン、正規表現、ラムダ計算など。
「そういうのあったな」と頭の片隅に入れておいて
必要な時にググりつつ応用できる。
※参考:JavaScriptの正規表現について
・セキュリティ、暗号化
公開鍵認証、共通鍵、ハッシュ(ダイジェスト)、署名、
乱数生成のためによく使われるアルゴリズムとその使い方。
アルゴリズムそのものに対する簡単な理解
(アルゴリズムを書ける必要はないが、だいたいどういう原理で
何をやってるのかを説明できる程度の知識)
※参照:脆弱性とセキュリティホールの違い。マルウェアやコンピュータウイルスの種類と対策方法
・プログラミングパラダイム
手続き、構造型、オブジェクト指向、関数型、静的型付け、
ダックタイピングなどがそれぞれどんな特徴を持ってるのか理解してること。
好みはあれど特定の1つが最強と思い込まず柔軟に使い分けられる寛容さ。
※参考:プログラミングの基礎知識。言語や仕組み、開発について
※参考:オブジェクト指向とは?クラスやインスタンス等の基礎知識を解説
・並列、非同期処理の基礎
並列処理と並行処理の違い、並列処理が困難であるという認識、
並列処理プログラムのデバッグが出来ること、スレッド、ブロッキング、
メッセージング、セマフォ、ミューテックスあたりの理解。
Future, Promise, async, awaitを使え、かつ裏で何をやってるのか説明でき、
どんなときに何を使うべきか、何を使ってはならないかを判断できる。
②出来れば知ってて欲しい知識
・ソフトウェア工学設計論、エンジニアリングなど。
ウォーターフォール、アジャイル、DDDやその実戦経験。
※参考:システムの開発の前工程や開発の流れ、開発手法について
※参考:WBSやプロジェクトマネジメントの内容まとめ
※参考:アローダイアグラムとは?記号や結合点、クリティカルパスについて
※参考:ITサービスマネジメントやITIL2つのガイドライン、SLAについて
・現代コンピュータの性能
どのメーカーでどんなCPUがあって、大体どれくらいの性能で、
シングルスレッド性能とコア数の違い、各種ストレージやメモリへの
大まかなアクセス速度の差などを理解して、どんなコードを書いたら
どのくらいの時間がかかるのか、といった見積もりができる。
・CPUの仕組み
どういう命令セットがあって、CPUにはどんなモジュールが乗っていて、
分岐予測やハイパースレッディングは何をやってるかが理解できる。
・OSの仕組み
メモリ空間、メモリ管理、仮想記憶、シグナル、IO、
割り込み処理、タスク管理、ファイルシステムなどを理解してる。
※参考:コンピュータの5大装置とは。記憶、演算、制御装置の詳細など
※参照:OS(オペレーティングシステム)とは?種類や機能、複数のOSを利用する方法
※参照:Windows7とWindows10の違いやアップグレード方法について
・ネットワーク
7階層モデル、IP, TCP, UDP, HTTP, HTTPSなど。
ネットワークが何故か繋がらない、上手く動かないといった時に
Wiresharkやtcpdumo, ngrep等でメッセージをダンプして原因を判断できる。
OSがネットワーク関連のリソースをどう管理してるか、大まかに理解している。
TCPの状態遷移を大まかに理解していて、netstatやnmpaなどの
基本的なコマンドを使用して知りたい情報を取得できる。
※参考:インターネットやネットワークの概要。Webサイトが公開される仕組みとは?
※参考:HTTPやプロトコルの概要。リクエストとレスポンスの関係など
※参考:TCP/IPモデルとは。5つの階層について解説
※参考:IPアドレスの概要や組織名の把握、グローバルローカル、IPv4とIPv6の違い
・セキュリティ
WifiやHTTPSでの鍵交換で何をやってるのか、どういうコードを書いたら
どういった脆弱性が生まれるのか、世間の攻撃手法として一般的なものは何で、
その対策としてどのような事をしておく必要があるのかを、ある程度語れる。
重要情報を平文で保存してない。方法の秘匿で担保するような方法や
ソースがバレたらクラッキングも容易にできる方法、バックドアを無闇矢鱈に使わない。
・統計、データマイニング、機械学習系の基礎知識
回帰分析、最小二乗法、ニューラルネット、SVMなど。


プログラマだったら当然知ってるよね?という知識一覧
Twitterで「〇〇ができるという人が面接に来たけど、『じゃあXXXやYYYって知ってます?』というと知らな
コンピュータサイエンスを学ぶ意義
技術を採用する時に「◯◯で採用されてるから」とか、
「最新技術だから」という理由で選択したり、
長くメンテンナンスしなければいけないアプリの設計が
上手く出来ない時に、以下の内容を確認して欲しい
①先の技術を読めるようになる
これが、コンピュータサイエンスの基礎が出来る意義Web系の人は、新技術ばかり追いかける一方、
コンピュータサイエンスの基礎をきちんと学んでない事が多い
ITの世界では日々新しい技術が開発され、
エンジニア向けにも様々な手法やライブラリがリリースされている
このうち、どれが使え、どれが伸びていくのかの評価をするには
コンピュータサイエンスの知識が必要になる
特に計算量、理論計算機やソフトウェア工学を理解してないと
今出てる技術を正しく評価する事はできない
そうなると「みんなが使ってるから」「流行ってるから」
という理由で新技術を採用して、用途に合わない結果となり
開発や実行パフォーマンスに出ない事が起こる
②寿命の長いコードを書けるようになる
コードの寿命は抽象度の高さにある程度比例する自分が書いた1年前のコードは、理解が難しい
この時に抽象度の高い、見通しの良いコードが書けてると良い
設計に近い人は理論計算機科学を学ぶ事によって
長期的にメンテナンスしやすいシステムを構築出来るようになる
コンピュータサイエンスを学ぶことはキャリアには即効性はないが、
中長期には実務の上で評価に繋がる事になる
コンピュータサイエンスは一度きちんと学べば
長期的に効果があるので、時間帯効果は良い
この記事へのコメントはありません。