---
# System prepended metadata

title: ICD社内技術教育の課題と対策
tags: [資料, ICD, 参考, 教育]

---

---
tags: ICD,教育,資料,参考
---

# ICD社内技術教育の課題と対策

## 前提条件
- 勉強会をやっても無駄
  - 自己学習しないのがほとんど
  - 自己学習しない相手に勉強会をやっても無駄
    - 勉強している雰囲気だけ
  - レベルがバラバラ
    - 纏めて実施すると、どこのレベルに合わせてもフィットしない層が残る
- 質問箱を作っても質問が来ない
  - いちいち皆に見られても恥ずかしくない質問文書を書くのは敷居が高い
  - 質問力が無い
    - 課題の本質を把握していない
    - 課題を適切な質問に纏められない
  - 今すぐ答えが欲しい
  - ネット調査力が低い
- コンテンツを作っても誰も見ない
  - コンテンツがマニアックすぎてニーズが無い
  - 一般的なコンテンツはネットか本の方がよくまとまっているので、リライトする気は起こらない（書きたく無い）
  - 勉強会と同様に各レベルに合わせたコンテンツが必要だが、全レベル向けのコンテンツなんぞ作ってらんない
  - ちっちゃい課題はネットに答えがあるが、大きく課題解決のヒントは無い
    - 設計指針
    - アンチパターン
    - 定番著書を読めとは言われるが、もうちょい具体的に何が書いてあるかを教えて欲しい（時間が無いのだよ）

- 実務に直結した事でしか学習しない
  - 実務以外のジャンルで自己学習出来る人はほとんど居ない
  - 実務に関する質問を外部には聞けない（営業機密）
  - 結局現場でやるしか無いが、効果的な育成ソリューションは現場には無い

## 問題点はどこにある？
- 何を勉強したら良いか分からない
- 現場で全然指導していない
- 現場の先達達がそもそも指導する力量が無い
- そもそも勉強する気がない（好奇心あるいは危機感）
- 勉強する時間が捻出出来ない
- 教えて貰う前提（受け身）
- 勉強する方向が間違えている
- 教えるにしてもレベル感がバラバラ
- 教えるべきジャンルが絞れない（現場差異が大きすぎる）
- 技術だけが勉強だと勘違いしている
- 組織としての育成計画が無い
- 事業計画があやふやなので育成計画が立ちられない
- 特定のできるメンバーに特化して現場リーダー級を育てるか、底上げをするか
## んで、どうするよ

- 階層別のコンテンツ
- ビギナー
  - 書籍が基本
  - 抑えるべきポイントと書籍での箇所
  - 各ツボの理由は丁寧に説明する
  - 添削は機械化したい
- 3〜5年目向け
  - 初めてシリーズ
  - アプリケーション設計
    - バッチ
    - 画面
    - API
    - 常駐プログラム
    - ジョブ実行
  - 外部IF設計
  - DB設計
  - WBS策定
  - テスト計画策定
  - 結合テスト
  - 開発支援環境構築
  - 監視
  - 自動運転
  - CI/CD

## まずはボリュームゾーンとニーズの把握

- 実力テストをするのだ
- で、各自のポジション・顧客ニーズとのギャップを把握
    - 費用対効果でやるべきことを決める
- フロント系はよくわからんので除外
- スマホアプリ開発も除外

### ジャンル

#### 要件定義

- 機能要件
    - 基礎データ
    - 対象顧客
    - システム化の目的
    - 既存システムの問題点
    - 機能拡張計画
    - システム開発のポイント
        - 品質
        - スピード
        - アジリティ
- 非機能要件
    - 拡張性
    - 保守性
    - 性能
    - セキュリティ
    - 可用性
    - 自動運転
    - 障害検知/通報
- アクターの明確化
- 移行要件
    - データ量
    - 切り替え許容時間
    - 並行稼働可否
    - 一括移行/順次移行
- アーキテクチャ
    - ３階層Web
    - pureバッチ
    - マイクロサービス
    - オンプレ/クラウド
- 開発言語
    - 言語
    - バージョン
    - ライブラリ
- ミドルウェア選定
    - OS
    - RDBMS
    - NoSQL
    - アプリケーションフレームワーク
    - ファイル転送
    - ジョブシケジューラ
    - システム監視
    - 改ざん検知
    - 脆弱性検知
- 開発支援
    - リポジトリ
    - 自動ビルド
    - Issue管理/ToDo管理
    - コミュニーケーション支援
    - ドキュメント作成
    - WBS管理
    - リモート作業支援
    - IDE
    - CI/CD
- システム設計
    - 実現方式
    - 構成設計
- アプリケーション設計
    - API仕様
    - プロトコル・ペイロードフォーマット
    - ファイル仕様
    - 機能仕様
    - 画面仕様
    - DB設計
    - 環境依存情報の外部化
        - 動的Config変更の可否
    - データライフサイクル
    - ログ設計
        - 様式
        - ローテート・保存期間
    - ジョブ設計
        - リラン
    - アプリケーションアーキテクチャ
    - アプリケーション実現方式
        - API
        - バッチ
            - 岡部ちゃんに送った設計観点を書く
        - 画面
        - ロギング
        - 外部システム通信
        - ファイル授受
        - トランザクション制御
        - 排他・一意性担保
        - バッチ多重起動抑止
        - 同一キートランザクション併走
    - リトライ/タイムアウト設計
- 設計アンチパターン
  - 一意性チェックの欠落
  - 不正アクセスチェック漏れ
  - 業務キーの重複保持
  - マスターテーブルの過度なFK/PK化によるマスター移行ミス
  - サーバーサイドのバリデート漏れ
  - cronでジョブ実行するな
  - Config粒度設計ミス
  - 過度な付与基準ありきのリテラル実装
  - リトライ設計漏れ
  - メッセージ文言の不統一
  - メッセージ丸め過ぎ
  - 自動化の計画化漏れ
  - 移行を舐めるな
  - プロセス多すぎ
  - URL設計
  - データ量とトラフィックを把握して設計していない
  - 環境依存情報のConfig追い出し指針が担当任せ
  - 開発者は運用フェーズには想像が及ばない
    - メッセージと一次切り分け
    - 障害時のリカバリ（DBバッチありき）
    - 止めるケースと止めずにエラーメッセージを出して継続するケース
    - Configのオンライン中差し替えは結構難しい
    - 間欠障害（リトライアブル）と恒久障害
    - Configミスをどこまで防ぐか
    - 外部システムに性善説を期待するな（ヌルポ）

- インフラ設計
    - オンプレ/クラウド
    - 認証
        - サーバ認証
        - API認証
        - ミドルウェア認証
    - サーバ構成
    - ミドルウェア構成
    - ネットワーク構成
    - アドレッシング
    - 名前解決
    - アクセス制限
    - ストレージ設計
    - システム監視
    - ジョブスケジューラ
    - ディレクトリ構成
    - 仮想化/コンテナ化
    - 構築自動化
    - インフラテスト
    - キャパシティプランニング
    - クラウドマネージドサービスの選定
    - アプリケーションアーキテクチャ
- 実装
    - 実装規約
    - Linter
    - もっといろいろあるだろう...
    - 言語別
        - Java/Spring
        - PHP/Laravel
        - Ruby/Rails
        - JavaScript/Node.js
        - SQL
        - Bash
        - Python
        - Swift/iOS
        - Kotolin/Android
- テスト計画
    - テスト範囲
    - テスト観点
    - テスト手法
    - 定量評価手法
- アプリケーションテスト(Unit/Integrate)
- システムテスト
    - 非機能テスト
        - 障害
            - 可用性
            - システム監視
        - 性能
        - 自動運転
        - 脆弱性診断
        - ヒートラン・連続運転
        - リリース手順検証
    - 機能テスト
    - 移行リハーサル
- 運用テスト
    - 業務シナリオテスト
    - システム運用業務テスト
- 管理
    - 構成管理
    - 品質管理
    - リスク管理
    - イシュー管理
    - 進捗管理
    - コスト管理
    - セキュリティ管理
    - コンプライアンス管理
- チームビルディング
    - 要員確保
        - 技術内容
        - プロジェクト概要
        - システム概要
        - 顧客特性
    - 育成・啓蒙
        - プロジェクト概要
        - セキュリティ
        - コンプライアンス
        - コモンセンス・ハラスメント防止
    - コミュニケーション
- BP管理
    - スキルシートの見方
    - 見極め方
    - 案件の説明方法
- 案件参画
    - 面談のコツ
    - アンチパターン
      - 身嗜み
      - やらされた
      - 全体と担当
      - 苦労とソリューション
      - 質問
- その他
    - AWS
    - Docker
    - VM
    - TCP/IP基礎
    - 基礎の基礎
        - コンパイラ/インタプリタ/JITとAOT
        - アルゴリズム
        - キャッシュ
        - 暗号
        - 冗長化
        - 同期/非同期
        - ハッシュ
    - API
        - REST
        - gRPC
        - SOAP
    - OS基礎
    - 抽象化
    - 文書作成力
    - 読解力
    - 相手の立場に立つ
    - 自己学習
    - 推論力
    - トラブルシュート
    - ダメ担当アンチパターン
    - ダメマネージャーアンチパターン
    - ダメリーダーアンチパターン
    - ダメコミュニケーションアンチパターン

- ツール紹介
  - IDE
    - Eclipse
    - VSCode
    - InteliJ
    - Netbeans
    - VisualSitudio
    - PyCharm
  - DB設計ツール
    - A5mk2
  - ブラウザツール
    - Redmine
    - Mattermost
    - KanBoard
  - リポジトリ
    - SVN
    - Git
    - 基本操作
    - 概念
    - コンフリクト
  - ハンズオン含む

- 調べる力
- 著名ソフトウェア紹介
- 言語あれこれ
- インタプリタとコンパイラ

## あったら便利なネタ集

- NextCloud
- 要件定義書サンプル
- 基本設計書サンプル
  - Excel版
  - MD版(CSSつき)
- API仕様書サンプル
  - Swagger版も
- ファイル仕様書
- メッセージID付与基準
- メッセージ仕様書
- A5MK2サンプル
- システム構成図
  - オンプレ
  - AWS
- ディレクトリ構成
- アカウント一覧
- プログラム一覧
- Config一覧
- ログ一覧
  - 監視・ローテート仕様付き
- 名称付与基準
- ansibleスクリプト
  - dir
  - svn/git
  - Jenkins
- build.gradle
- カバレッジ
  - Java
  - PHP
  - Python
  - Bash
  - JS
- bats/kcovによるBashテストとカバレッジ
- 開発支援ツールDockerインストール
- Dockerバックアップ
- 設計指針
  - DB
  - トランザクション
  - バッチ
- ガントチャートExcel
- リポジトリ作成
  - アカウント作成
- 通知
  - Matter/Slack通知基礎
  - Bot開発
  - ビルドエラー
  - コード・改行
- Stepcounter
- デリバリー自動化
- コマンド実行自動化
- E2Eテスト自動化
- 環境構築自動化
- CentOS(systemd付き)のDocker化
- Jenkins
  - パイプライン
- VSCode
- コミットロック
- 開発支援ツールアカウント統合管理
  - 作らねば
- 支援ツール導入
  - Matter
  - Redmine
  - Growi
  - Jenkins
  - IrohaBoard
  - OpenVAS
  - FESS
  - Knowledge
- toolsから汎用的に使えるのを汎用化
  - CheckEnv
  - DeployQA/Docker
  - ExecRemoteJOB
  - finis
  - ReleaseTool
  - EasyJTP/Prov
- CodeSnipets
  - Spring/Java
    - MessageLoggingFilter
    - REST Template
    - Plugin
    - 依存性逆転(DI)
    - コード構造
    - マルチプロジェクト
  - build.gradle(Groovy)
    - MANIFESTバージョン埋め込み
  - Python
  - Bash
  - VBA
