一年で使うようになった技術・ツールを３〜４行で説明する

# はじめに

未経験からSIerに転職し、一年で身に着けた中で主要な知識をでまとめました。
他にも書けそうな物もありましたが、ある程度相手に説明できる・基本すぎる物は外す・一年前(未経験時)より大幅に知識が増えている程度を目安に選定しました。認識が間違っている可能性もありますのでここが違う！って部分はご指摘下さい。

#技術

## 言語

### Java
静的型付け言語。型でエラー等が発見しやすいこと、業務システムが開発され始めた時期の導入実績が多いことから現在も大規模な業務アプリケーション等に使われる。Java仮想マシンを通して動作するためどの基板上でも動かせる。改修や解析をする場合かなり昔のバージョンが使われていることも多く、メソッドの違い・依存ファイルのアップデートなどを考えるのが大変。初期MinecraftはJavaが使われていた。

### C# 
Javaをマイクロソフトが使いやすく開発した言語。Javaにはない便利機能だったりVisualStudioが言語開発元と開発環境が同じ会社であるため非常に使いやすい。過去Windowsオンリーであったこともあり、現在C#をメインで使っている会社は業務系開発の請負をしているSIer的な会社が多い。近年はUnity(3Dのゲームエンジン)の開発がアツいためこの話題が多い。FGOはUnity2018が使われている。

### JavaScript
画面要素の入れ替え等のフロントエンド操作がメインの言語。Node.jsの登場でサーバー側でも動かせる言語に進化して利用の幅が広がった。リッチな動きが存在しない業務システムの場合も、画面を作る場合何かしらでほぼ確実に使うので早めに身に着けておくとよい。

### TypeScript
Microsoft開発のJavaScriptに型が付いた言語。最終的にはJavaScriptのコードに変換して使用するAltjsの一つで、その中でも型が利用できることの恩恵が大きいため利用者が増えている。フロントエンドフレームワークだとAngularでは必須、react/vueでも拡張で使用可能。型があるとバグ・エラー発見の効率が上がるので導入コストに対する効果が高く技術が進んでいる会社では結構採用されている。

### SQL
RDBからデータを取得するための言語(文)。多少違いは発生するがRDBであればだいたい書き方は同じか、互換の書き方が存在しているため一度覚えれば汎用的に使える。最近はSpring Data JPA(Java)などのSQL文を書かなくてもRDBからデータを取得できるORMやそもそもRDBを使わないケースも存在するが、SQLの考え方があると理解が深まるので一通り書ける知識があると良い。

## フレームワーク
### Spring (framework/Boot)
Javaでシェアが高いDIのフレームワーク。日本語の解説が多かったりバッチ処理とORMとかだいたい何でも揃っているので調べながらの開発が非常にしやすい。xmlがややこしいので構造を理解するのに苦労したため、もし言語を問わずDIの知識が身に着けたい場合SpringからよりはLaravel/Angular等のが構造的に理解しやすいと感じた。Bootはtomcatが組み込まれ起動設定が簡略化されているためロジック以外をあまり意識せずに開発できる。

### .NET
Microsoftの開発環境の総称(ASP.NETとか)。調べていてもあまり個人開発のイメージはなく業務系アプリケーションに使用されるイメージが強い。「.NET Framework 4.8」をもってメジャーアップデートが終了した(バグ修正・Windows搭載は継続)ようなので.NETしか認めない系の開発チームは除いて今ほど積極的に採用されなくなるかもしれない？既存システムでは結構多いので、改修や機能追加等で利用されることは多いです。

### Angular
googleが開発したJavaScriptフレームワーク。DIであること、ライブラリが公式に揃っていることで他のフレームワークよりも導入関連の選定時間は発生しないがTypeScriptが必須だったりDIの概念がわからないと使えなかったりするのでフロントエンド専門のエンジニアからいきなり始めるには学習コストが高いイメージ。TypeScript(Microsoft)+Angular(google)と考えると発展性はありそう。

### React/vue.js
両方ともJavaScriptフレームワークだが、Angularと違いライブラリの選定でカスタマイズできるため自分が目指したいモノに合わせやすい。ReactはNintendoSwichの画面表示系で使われていたり拡張でVR内で使える、Facebookが開発している等実績はあるが、vueは導入の簡単・柔軟さが他よりも高く利用率がめちゃめちゃ増えている。React、vueともに拡張でTypeScriptを使用できる。

## 管理系

### git
ソース管理ツール。PC内にローカルリポジトリ、サーバー上にリモートリポジトリを持ち、自分のPCにはコミット、リモートリポジトリにはプッシュすることで変更差分を保存することが可能。ローカルリポジトリへのコミットはゲームのセーブ、リモートリポジトリへのプッシュはセーブデータのアップロードを実施するイメージ。基本的にはコンソールからコマンドを使用するか後述のGUIツールを使用する。GitHubまたはGitLabを使うとブラウザからソースが確認可能。

###GitHub/GitLab
gitを使用したソース管理をGUIで確認できるツール。GitHubはWebサービスなのでオープンソースの開発や開発拠点が離れている場合に手軽に運用できる。GitLabは自社サーバー内に建てることが可能なためより堅牢な運用が可能。GitHubのプライベートリポジトリが有料から無料になったことによりあまり差を感じないので自分の使い方に合った物を選べるように両方使ってみると良い。

### Redmine
プロジェクト管理システムの1つ。チケットと呼ばれる作業単位(機能01、機能02、UT01、UT02....)を登録していき、％で進捗を入れたりかかった時間を登録して進捗をグラフ表示したりできるツール。プロジェクトごとにディレクトリを作成することができ、個別に全員が見たい情報をwikiとして作成できる。gitHub/Lubと連携してチケット番号にコミットを紐づけて管理することもできて便利。

## クラウドサービス
### AWS
アマゾンのクラウドサービス。機能が多すぎてインフラ系であればだいたい実装できるがサービスごとの違いを検討して進めていかないとオーバースペックになってしまうこともある。GCP等よりも使い込まれているのでネット上の情報が多く、企業でも資格推奨など導入に力を入れているところが多い。

### GCP
googleのクラウドサービス。機能がアマゾンと比べて纏まっているのでインフラ構成によるサービスの判断がしやすい。日本語の情報料以外はAWSとクリティカルな差はないので、AWSとどちらも使ってみてサービスによって使い分けて使いやすいほうを選択する。
(個人的にはGCPの操作画面が見やすいので好きです。)

### heroku
Salesforce社が運用している、開発したWebアプリケーションをデプロイするとOS〜インフラの設定を実施しなくても公開まで実施してくるPaaS(Platform as a Service)の一種。知識がなくても構造によってはgit pushするだけで公開できるがトラブル時に対応できなくなるので使いながら処理がどう動いているかを考えて使うと勉強になる(コンテナとかcronとか)。プラグイン多くて便利。

### Firebase
googleのPaaS(mBaaS?)。無料範囲が広い+NoSQLが機能として使えるのでRDB使わないならherokuじゃなくてFirebaseの方が便利。herokuはサービス的にも長いので検索知識的にはheroku、運用目線で考えるなら無償範囲的にFirebaseが良さそう。比較記事を探していたらnowという別のサービスも見つけたので試してみたい。

## その他技術
### DB
RDBMSに対しSQL文を発行し、検索条件に当てはまるデータを引っ張ってくる運用が基本。大規模なデータやスケール変化に対応するためNoSQLと呼ばれる方式が取り入れられ始めているが、いくつかの方式があり明確な定義は無い。AmazonのDynamoDBがNoSQL系DBとしてはシェアが高く、KeyAndValue型の構造になっている。RDBMSよりも疎結合となるため、設計時データの持ち方を考える必要がある。

### VM/Docker
多くのレガシーな業務システムはVMを使用しクラウドサービス上に仮想のPCを立て、その中にredhatやcentOS等のLinuxを入れることでサーバー環境を構築している。VMとは別の仮想化技術としてDockerがあり、Dockerエンジンの中で設定ファイルを元に仮想化するので環境の差異を気にせず、性能もVMとほとんど同じ状態で手軽に仮想化ができるようになるため技術的に進んだ企業ではDockerの運用が主流になっている。

### Node.js
サーバーでJavaScriptを動かせるようにする環境。Node.jsを導入するとnpm(ノードパッケージマネージャ)が使えるようになり、コンソールコマンドだけであらゆる拡張機能やフレームワークなどをダウンロードしバージョンの管理をすることができる。

# ツール
## 開発環境
### Eclipse
Java用の統合開発環境。拡張でPHP等もできるけど癖があるのであまりおすすめしない。無料開発環境の中ではシェアが高く、調べると日本語の解説も色々出てくるため便利。少し重い、たまにエラー吐く、無骨な感じ等思うけどなんだかんだで慣れると使いやすい。日本語化ツールのPleiadesのロゴが毎回かっこいい

### Visual Studio
Microsoftが開発している統合開発環境。.NETの開発をする場合使用する。色々な機能が内蔵されているため使いこなせれば便利だと思うがEclipse→VisualStudioに触れた身としては機能が多すぎて逆に難しかった。

### Visual Studio Code(VScode)
コーディング用のエディタ。プラグインが豊富+動作が軽い+設定をGitHub経由で保存できるプラグインが存在するなど拡張で非常に使いやすくなる。ショートカットがVisualStudioライクなので慣れるのに少し時間がかかったが慣れてしまえば最強のエディタな気がする。

## 開発支援

### 各種CLI(npm/yarn/git等)
共通言語基盤、クリック等じゃなくてコマンドで入力するための言語を拡張するためのもの。コンソール等からCUI(キャラクタユーザインタフェース)を使用してコマンドで操作することと、コマンドによっては実行結果が表示されない（内部では変更されている）ため確実に確認しながら作業する必要があるがコマンドを覚えるとキーボード操作だけでいろいろな操作が完結するため便利。

### A5M2
データベースのデータをSQLで表示できるツール。主要なDBがすべて使用できる+変数設定を行えるので検索したいSQLをタブ毎に入力しておき、1か所変更するだけで全箇所適応するなどができるので便利。ER図を作ったり抽出したデータをExcelで出力することも可能なので、二次加工も簡単。

### SourceTree
git用のGUI。シェアが高いので困ったときに検索しやすい+無償で使えるので導入しやすい。VScodeのプラグインで基本はgit管理をしているので、プルしたい時とかブランチを切りたい時間違えないように使っている。無料で使えるがアカウント作成が必要なため、会社で導入実績がない場合は確認が必要になる。

### iTerm2
MacBookAirを購入した際コンソール操作が確実に必要になるため入れた。全画面でコンソールを半透明表示+ショートカットで隠せる機能が便利なのでそれだけで導入する意味があった。WindowsはだいたいGUIで何とかなってしまうのでこちらはもっと使いこなしたい。

# おわりに
これ以外にもいろいろなツールや知識を身に着けましたが、一度自分の言葉で書いてみると理解度が浮き彫りになってよかったです（曖昧なところは一応調べながら書いたのでそれもプラスになりました）。来年度よりSIerからWeb系エンジニアに転身することとなったため、より知識を増やして来年のカレンダーでは同じ題でどこまで深く書けるか試してみたいと思います。