新卒研修のカリキュラムの要約
ダイアモンドヘッド株式会社 札幌開発の小菅です。社内で新卒研修を行う中でのカリキュラムにSQL(データベース)・Linux・プログラミングを準備しています。
これらテーマの研修を行う時に説明する頻度が高いのでnoteに内容を手短にまとめて説明を少しですが省略できるようにします。
(1) SQL(データベース)
数学(集合論)
リレーショナルデータベースと集合論。
数学(関係代数とリレーショナル理論)
http://www.f.waseda.jp/moriya/PUBLIC_HTML/misc/ILA/2002/database.pdf
リレーショナルデータベースと関係代数とリレーショナルデータ理論。
正規化
https://oss-db.jp/dojo/dojo_info_04
主キーと外部キーで関係性を保ちつつ、テーブルを正規化。
一貫性
ACID、データの保証、トランザクション。以下、ランザクション処理の意味が分かる有名な本(分厚い)。
チューリング完全
SQLでプログラミングができる。
OR Mapper(オブジェクト関係マッピング)
Object-relational mapping -> data mapper -> data access object
オブジェクト関係マッピング、データマッパー、データアクセスオブジェクトと比べると理解しやすい。
SQL
そして本題へ。TOPSICでSQL問題を大量に解く。
(2) Linux
Ubuntu(Linux)を使っている理由
本番環境がLinuxのため開発環境も揃えると不具合を減らせる。
最も使われているLinuxの1つがUbuntu。
WEB開発でUbuntuが広く使われている。
2年間のLTSでPC管理が楽。
運営母体で安定したリリースが行われている。
Ubuntu Desktopはデバイスサポートが一定充実している。
仮想環境とクラウドの相性が良い。
ウェブプログラマの成長とLinux環境の相性が良い。
インフラ構築やシステム開発でもLinuxの知識を活用できる。
ゲーム形式でLinuxに触れる
Terminus - テキストアドベンチャーでコマンドを学ぶ
Bandit - Level0から問題を進める
Linuxとプロセス
Memory、Thread、Signal、Socketを軽く話に上げる。
メモリ保護 - Wikipedia
POSIXスレッド - Wikipedia
シグナル (Unix) - Wikipedia
プロセス間通信 - Wikipedia - UNIXドメインソケット - Wikipedia
Linuxカーネル - Wikipedia
カーネルの仕組みについてを軽く話を上げる
UNIX哲学
全てのITエンジニアに通じる哲学の1つです。
StdIN、StdOUT、StdERR
Pipe
Shell
GNU/Linux
GNUプロジェクトはLinuxを学び進める上でヒントと示唆を与えてくれます。フに大きな影響を与えています。
GNUの背景を少し知ると、開発で良く目にするフリーソフトウェアとコピーレフトの哲学や、利用するライブラリのライセンスの理解へのヒントになります。
参考になる書籍
多数あるので省略。個人的なおススメは The Art of UNIX Programming。
(3) プログラミングそのもの
Statement
コードの1行(ステートメント)と1行に含まれる式(エクスプレッション)が持つ意味を理解してコーディングまたはコードリーディングするとの話。
Syntax
コードを行単位で意味を理解して行くためにはSyntax(シンタックス)の理解があるとスムーズとの話。
SyntaxはWords(単語) -> Phrases(フレーズ) -> Context(文脈)の3つに分解して理解することが出来ます。
Semantics
Syntaxにはプログラミング言語仕様に至るSemantics(セマンティックス)が反映されています。
Programming language specification
コードの1行をよりよく理解するにはプログラミング言語仕様を学ぶのも効果的です。
Data Structure
よく使われるデータ構造のArray(配列)やMap(マップ)やQueue(キュー)が果たす意味と役割を理解すると、その1行で何が行われているのかを理解し易くなります。
一般的なデータ構造とその操作方法は理解した方が好ましいです。
Condition
コーディングする上で、バグの発生が多くなりがちなのが条件文です。条件(論理演算、論理哲学、Bool代数)とは何かを一度理解をし直すとコーディングの助けになります。
論理演算と集合演算
論理哲学論考 / ウィトゲンシュタイン
Bool型
集合の操作する上で、条件文を隠蔽しバグを減らす分かりやすい例がIteratorです。
Patterns
コーディングする中で参考にするサンプルコードは、それぞれ単位や意味で以下のように分類して理解することが出来ます。
頻出するコードは先人たちが残した知識や答えの1つです。これらを活用できるようになると、より上手なコーディングが出来るようになります。
Review
コードを1行づつ読むコードレビューによってバグを減らせます。ソースコードレビューには種類があり、その中でも主に以下2つが使われます。
1行ずつ意味を理解しながらソースコード全体をレビューする。
効果が高いが時間が掛かる。
コーディング規約の徹底や設計の統一感を高められる。
変更差分を中心にレビューする。焦点を絞ってレビューできる。
時間は短いが効果が限定的。
根本原因の検出や解消が難しい。
インスペクションでコード全体の意味を理解し、広範囲に影響する不具合を解消した中で、ウォークスルーを繰り返し行う方法で不具合の総数を減らし、レビューの時間を節約するのが一般的です。
Coding - Programming
そして本題へ。後はTOPSICでAtCoderの問題を大量に解きます。
一回、ここまでです。