わたしのマイルストーン

【備忘録】

[引用:]https://anopara.net/2019/05/11/basics-for-programmers/

A.セキュリティ・暗号化(1−5)

セキュリティ・暗号化
公開鍵認証、共通鍵、ハッシュ(ダイジェスト)、署名、乱数生成のためによく使われるアルゴリズムとその使い方。アルゴリズムそのものに対する簡単な理解(さらでアルゴリズムを書ける必要はないが、だいたいどういう原理で何をやっているのかを説明できる程度の知識)。

B.並列・非同期処理の基礎(1−7)

並列・非同期処理の基礎
並列処理と並行処理の違い、並列処理が困難であるという認識、並列処理プログラムのデバッグができること、スレッド、ブロッキング、メッセージング、セマフォ、ミューテックスあたりの理解。

Future, Promise, async, awaitを使え、かつ裏で何をやっているのか説明でき、どんなときに何を使うべきか、何を使ってはならないのかを判断できる。

C.OSの仕組み(2−3)

OSの仕組み
メモリ空間、メモリ管理、仮想記憶、シグナル、IO、割り込み処理、タスク管理、ファイルシステムなど。

D.ネットワーク(7階層モデル, IP, TCP, UDP, HTTP, HTTPSなど)(2−4)

ネットワーク(7階層モデル, IP, TCP, UDP, HTTP, HTTPSなど)
なんかよくわかんないけどネットワークがつながらない、うまくうごかない、みたいなときにWiresharkやtcpdump, ngrepなどでメッセージをダンプして原因を判断できる。OSがネットワーク関連のリソースをどう管理しているか大まかなところを理解している。TCPの状態遷移を大まかに理解していて、netstatとかnmapとか基本的なコマンドを使用して知りたい情報を取得できる。

>>>>>>>  以下、そのまま引用   <<<<<<<<<<

1.プログラマだったら当然知っててほしいと思う知識

1−1.データ構造

データ構造
リスト、配列、ツリー、ハッシュ、スタック、キューなどの違いが説明でき、自分がこれから組もうとしているプログラムについてどれを使うべきか適切に選択できる。

必要に応じてそれらを応用したデータ構造を自分で定義して使うことができる。

1−2.計算量(計算複雑性)

計算量(計算複雑性)
自分が書いたコードが O(1) なのか O(n) なのか O(n^2) なのか O(n^m) なのか O(n!) なのか … を説明できる。

各種あるプログラミング言語のコレクション関係のライブラリで、どの操作がどの計算量で終わるのかを理解した上で使うことができる。

計算複雑性クラスの概要を知っていて、それぞれに例えばどういう問題(巡回セールスマンとかナップザックとか集合打とか)があるのか、少なくとも一度は勉強したことがある。

探索や計算にめちゃめちゃ時間がかかる仕様が盛り込まれたときにそれを適切に説明し、場合によって然るべきインデックス等々を実装できる。

1−3.アルゴリズム

アルゴリズム
ソート、探索、文字列検索、データ符号化、圧縮、誤り検出・訂正など。「なんでソートが遅いのか」「なんで圧縮してもサイズが減らないのか(圧縮が無意味なのか)」などを適宜判断して修正できる。

1−4.グラフ理論

グラフ理論
有向・無向グラフ、木、ループ、カット、彩色、結婚定理とかの基礎の理解。「そういうのがあったな」と頭の片隅においといて必要なときにググりつつ応用できる。

1−5.セキュリティ・暗号化

セキュリティ・暗号化
公開鍵認証、共通鍵、ハッシュ(ダイジェスト)、署名、乱数生成のためによく使われるアルゴリズムとその使い方。アルゴリズムそのものに対する簡単な理解(さらでアルゴリズムを書ける必要はないが、だいたいどういう原理で何をやっているのかを説明できる程度の知識)。

1−6.プログラミングパラダイム

プログラミングパラダイム
手続き、構造型、オブジェクト指向、関数型、静的型付け、動的型付け、ダックタイピングなどがそれぞれどんな特徴を持っているか理解していることと、好みはあれど特定の一つが最強と思い込まず柔軟に使い分けることができる寛容さ。

1−7.並列・非同期処理の基礎

並列・非同期処理の基礎
並列処理と並行処理の違い、並列処理が困難であるという認識、並列処理プログラムのデバッグができること、スレッド、ブロッキング、メッセージング、セマフォ、ミューテックスあたりの理解。

Future, Promise, async, awaitを使え、かつ裏で何をやっているのか説明でき、どんなときに何を使うべきか、何を使ってはならないのかを判断できる。


2.できれば知っておいたほうが良いと思う知識

2−1.現代コンピュータの性能

現代コンピュータの性能
どのメーカーでどんなCPUがあって、だいたいどれくらいの性能で、シングルスレッド性能とコア数の違いを理解しているとか、各種ストレージやメモリへのおおまかなアクセス速度の差などを理解してどんなコードを書いたらどのくらい時間がかかるかという見積もりができる。

2−2.CPUの仕組み

CPUの仕組み
どういう命令セットがあって、CPUにはどんなモジュールが乗っていて、分岐予測やハイパースレッディングは何をやっているのかとか理解できる。

2−3.OSの仕組み

OSの仕組み
メモリ空間、メモリ管理、仮想記憶、シグナル、IO、割り込み処理、タスク管理、ファイルシステムなど。

2−4.ネットワーク(7階層モデル, IP, TCP, UDP, HTTP, HTTPSなど)

ネットワーク(7階層モデル, IP, TCP, UDP, HTTP, HTTPSなど)
なんかよくわかんないけどネットワークがつながらない、うまくうごかない、みたいなときにWiresharkやtcpdump, ngrepなどでメッセージをダンプして原因を判断できる。OSがネットワーク関連のリソースをどう管理しているか大まかなところを理解している。TCPの状態遷移を大まかに理解していて、netstatとかnmapとか基本的なコマンドを使用して知りたい情報を取得できる。


2−5.セキュリティ

セキュリティ
WifiやHTTPSでの鍵交換で何をやってるのかとか、どういうコードを書いたらどういう脆弱性が生まれるとか、世間での攻撃手法として一般的なものは何で、その対策としてどういうことをしておく必要があるのかなどをある程度語れる。重要情報を平文で保存しない。方法の秘匿で担保するような方法(方法やソースがバレたらクラッキングも容易にできる方法)やバックドアを無闇矢鱈につかわない。




この記事が気に入ったらサポートをしてみませんか?