見出し画像

新卒研修のカリキュラムの要約

ダイアモンドヘッド株式会社 札幌開発の小菅です。社内で新卒研修を行う中でのカリキュラムに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

GPLを採用したことがLinuxを共有の物として開発することを推進させた、とされている。また、Linuxの開発とインターネットの発展が時期的に一致したことも、Linuxの開発コミュニティ形成に寄与した。

また、開発に際して、よりオープンな開発体制をとり、現在バザール方式と呼ばれている、誰でもLinux Kernel Mailing Listへのバグ報告や修正、機能拡張パッチを公開でき、その中から最終的にリーナスと彼が任命したメインテナーがコーディネータとなって、公式版のLinuxカーネルの質を保っている。

カーネルの仕組みについてを軽く話を上げる

UNIX哲学

 一つのことを行い、またそれをうまくやるプログラムを書け。協調して動くプログラムを書け。標準入出力(テキスト・ストリーム)を扱うプログラムを書け。標準入出力は普遍的インターフェースなのだ。

全てのITエンジニアに通じる哲学の1つです。

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

コーディングする中で参考にするサンプルコードは、それぞれ単位や意味で以下のように分類して理解することが出来ます。

  • Snippet

  • Idiom

  • Practice(最近は練習問題の意味が強いかも?競プロはここ)

  • Pattern(Design Pattern / Best Practice)

頻出するコードは先人たちが残した知識や答えの1つです。これらを活用できるようになると、より上手なコーディングが出来るようになります。

Review

コードを1行づつ読むコードレビューによってバグを減らせます。ソースコードレビューには種類があり、その中でも主に以下2つが使われます。

  • Inspection

    • 1行ずつ意味を理解しながらソースコード全体をレビューする。

    • 効果が高いが時間が掛かる。

    • コーディング規約の徹底や設計の統一感を高められる。

  • Walk through

    • 変更差分を中心にレビューする。焦点を絞ってレビューできる。

    • 時間は短いが効果が限定的。

    • 根本原因の検出や解消が難しい。

インスペクションでコード全体の意味を理解し、広範囲に影響する不具合を解消した中で、ウォークスルーを繰り返し行う方法で不具合の総数を減らし、レビューの時間を節約するのが一般的です。

Coding - Programming

そして本題へ。後はTOPSICでAtCoderの問題を大量に解きます。

一回、ここまでです。