(ソフトウェア)エンジニアへの道
考えてみるとITは広範囲かつそこそこ深い知識が要求される業界だなと思ったので、(ソフトウェア)エンジニアとして必要っぽい知識をまとめる。
チェックリスト的な感じでやっていきます。
はじめに
以下の大項目に分けて必要な知識・スキルをリストアップしてゆく。
- SHAKAIJIN(社会人)的なスキル
- コンピューターの基本的な使い方
- Linuxのインストールや設定
- ミドルウェアのインストールと設定
- 開発環境関連
- コマンドラインインターフェース
- プログラミング・マークアップスキル
- データベース・SQL
- クラウド活用
- セキュリティ関連
SHAKAIJIN(社会人)的なスキル
ここでいうShakaijinスキルには「メールの書き方」や「チャットツールの使い方」等が含まれる。
- 電子メールのto,cc,bccの意味を理解しており、使いこなせている。
- チャットツールの使い方をある程度知っている。
- コピー機、プリンタ、FAX、電話の使い方を知っている。
- オフィススイート(MS Office等)ソフトウェアの使い方をある程度知っている。
- 工数の見積もりができる。
- 必要な機材を発注する、または、発注を依頼する方法を知っている。
コンピューターの基本的な使い方
最近はパソコンを触らない人が増えているということを耳にしたので、とりあえず。
- Wifiの設定ができる。
- PCにログインしてブラウザを起動し、そのあとブラウザを閉じてOSをシャットダウンすることができる。
- 自分にとって必要なアプリケーションのインストール方法を知っている。
- キーボード、マウス、USB、外部メディアを正しく取り扱うことができる。
- PCの管理者として、ユーザーの追加・権限設定・パスワード設定等ができる。
- メモリ増設、HDD交換、Windowsのクリーンインストールなどができる(可能なマシンであれば)
- ルーターの役割を知っている。
- DHCPを知っている。
- グローバル(パブリック)IPとローカル(プライベート)IPについて理解している。
- IPアドレスについて理解している。
- ポート番号について理解している。
- Static IPアドレスの設定方法を知っている。
Linuxのインストールや設定
インフラエンジニア寄りの内容。
- Ubuntu,CentOS等のLinuxをベアメタル(実マシン)でインストールできる。
- Ubuntu,CentOS等のLinuxを仮想マシン上でインストールできる。
- LVM(論理ボリューム)を設定することができる。
- SELinux、AppArmorの有効・無効の切り替え方が分かる。
- ネットワークの設定方法が分かる。
- iptables等によるファイアウォール(パケットフィルタ)が正しく設定できる。
- ユーザーの追加、権限設定(sudo等)を正しく実施することができる。
- サービス(デーモン)の登録、削除、起動設定の変更等ができる。
- パッケージマネージャでアップデートを施す方法を知っている。
- タイムゾーン、時刻合わせ、ロケールの設定ができる。
- cronの設定ができる。
ミドルウェアのインストールと設定
インフラエンジニア寄りの内容。
- 何か一つのHTTPサーバーのインストールと設定ができる。
- 何か一つのRDBMSのインストールと設定ができる。
- 何か一つのNoSQLのインストールと設定ができる。
- システムの動作に必要なDockerイメージを展開することができる。
- アプリケーションの動作に必要なライブラリをインストールし、設定することができる。
- SSL証明書を取得し、HTTPサーバーに設定することができる。
開発環境関連
開発環境を構築してプログラマとして作業に取り掛かる能力。
- 開発に用いるプログラミング言語を実行する環境が構築できる。
- エディタ、IDEを適切に設定し、使いこなすことができる。
- Git等のソースコード管理ツールを使いこなすことができる。
- 開発環境からリポジトリにアクセスできる状態にすることができる。
- エディタやIDEをプログラミング環境として快適な設定にカスタマイズすることができる。
- ユーザー別の権限設定等、リポジトリの設定ができる。
コマンドラインインターフェース
Linuxのコマンドライン操作がある程度できると良い。
- コマンド cd,ls,cp,mkdir,rmdir,rm,pwd,top,ps,cat,less,パイプ、リダイレクトの使い方が分かる。
- sudoコマンドの使い方がわかる。
- vi,vim,nano,emacs等のエディタで設定ファイルなどを書き換えることができる。
- apt,yum,reboot,halt,systemctl,serviceコマンドを知っている。
- ssh,scp,rsyncの使い方がわかる。
- 圧縮解凍系のコマンドを知っている。
- findコマンドを使いこなせる。
- 環境変数の設定方法が分かる。
- 簡単なシェルスクリプトが書ける。
- 自分にとって使いやすいシェルに切り替える方法を知っている。
プログラミングスキル
プログラミング言語に依らず、わりと普遍的なものをリストアップ。
- 変数のスコープを理解している。
- FizzBuzzが書ける。
- ファイル操作(読み込み、書き込み)ができる。
- ループ構文が書ける。
- エラトステネスの篩が書ける。
- 複雑なデータ構造を自由自在に操作することができる。
- 再帰呼び出しが書ける。
- 例外処理が書ける。
- オブジェクト指向プログラミングができる。またはパラダイムを理解している。
- 関数型プログラミングができる。またはパラダイムを理解している。
- プログラム側からRDBMSにアクセスする方法を知っている。
- クエリビルダまたはORマッパーを使うことができる。
- DBへの問い合わせ時にSQLインジェクションが発生しない安全な実装方法を知っている。
- DBのトランザクションと排他制御について知っている。
- いわゆる「N+1問題」を理解しており、回避することができる。
- リソースの適切なロック方法(ファイルやRDBMSの排他制御等)を知っている。
- 簡単な電子掲示板を実装することができる。
- JSONやXML、YAML等のデータをプログラムで読み書きする方法を知っている。
- 既存のフレームワークを使ってアプリを一通り作ることができる。
- バッチ処理を書くことができ、適切なタイミングで実行することができる。
- ユニットテストを考慮してクラスや関数の適切な設計ができる。
データベース・SQL
エンジニアにとっては最も重要な能力かもしれない。
- RDBMSユーザーの作成、権限設定ができる。
- DBの作成、テーブルの作成方法を知っている。
- DBのダンプ、リストア方法を知っている。
- プライマリキー、ユニーク制約、not null制約、外部キー制約について理解している。
- 普段使っているRDBMSのフィールドの型を理解している。
- 必要なフィールドにindexを貼ることができる。
- explainの内容を理解し、遅い部分を特定し、改善する方法を提示できる。
- 簡単なinsert,select,update,delete文が書ける。
- 複雑なwhere句が書ける。
- 複雑なjoin(inner,left,cross等含む)が書ける。
- group byを使いこなせる。
- havingを使いこなせる。
- case式を使いこなせる。
- 副問い合わせを使いこなせる。
- RDBの正規化を理解している。
- システムの要件と規模にあった適切なテーブル設計ができる。
- 非機能要件にあった適切なDBメンテナンス、バッチ処理を設計することができる。
クラウド活用
AWSが主流ではあるが、あくまでもクラウドサービス全般を使いこなすということで。Dockerやk8sは割愛。
- DNSの設定方法を知っている。
- 組織の設定としてユーザー権限を適切に設定する方法を知っている。
- クラウドコンソール上でVMを立ち上げることができる。
- 立ち上げたクラウドVMにsshでログインし、ネットワーク設定やアップデートなどの作業ができる。
- VMのスナップショットイメージを作成することができる。
- クラウド基盤上で仮想ネットワークやファイアウォールを設定することができる。
- 必要であればPaaS,SaaS,ストレージサービスなどを立ち上げて利用することができる。
- サーバロードバランスの設定ができる。
- サービスを無停止でスケールさせる手段を知っている。
セキュリティ関連
この辺りは必要最低限のものをリストアップ。
- 公開鍵暗号方式について理解している。
- 中間者攻撃について理解している。
- SSL(TLS)について理解している。
- コマンドインジェクションの原因と根本的な対策方法を知っている。
- SQLインジェクションの原因と根本的な対策方法を知っている。
- XSSの原因と対策方法を知っている。
- CSRFの原因と対策方法を知っている。
- パスワードを平文で保存せずにシステムを作る方法を知っている。
以上!
next: 沖縄のコロナ
updated at : 2020-07-08 16:40:14
author : Toshiaki Yokoda