モダンな技術系の議論でよく見かけてたけどずっと意味わからないまま放置していた用語を調べて解説する

ざっくりした記事です。
よくQiitaのトレンドで見ていたけど、ずっと意味がわからなかった技術用語が結構ありました。
個人的に用語集を作ってたんですが、それなりの量溜まってきたので、記事にしてみようと思いました。
ざっくり「フロント/バック共通」「フロント」「バック」という3分類でまとめてみました。

# フロント/バック共通
## 宣言的
出力の性質がどういうものなのかに着目し、それだけを記述させること。
（from 大川徳之「関数プログラミング実践入門 ──簡潔で、正しいコードを書くために」）　
対義語は命令的。

どうも関数型言語への理解がないので、関数型言語から来る用語が引っかかってました。
言葉自体は簡単なので、意味がわかるような、わからないような感じなんですが、調べるとやっぱ全然わかってなかったなと思いました。
以下４つの用語も関数型のプログラミングパラダイムを議論する際に使うような用語ですが、
最近のJavaScriptやSwift、Kotlinなど関数型っぽく書ける言語が増えてきた関係で、よく見るようになったのだと思われます。

## イミュータブル
変更不可な性質のこと。
immutable。
対義語はミュータブル。
一度初期化されたら、中身が変わらないことが保障されている性質。

## 状態
プログラムの中で変化する可能性がある要素。
状態遷移図やオートマトンで表現されるような概念。

## 副作用
プログラミングにおいて、「状態」を参照し、あるいは「状態」に変化を与えることで、次回以降の結果にまで影響を与える効果のこと。
（from 大川徳之「関数プログラミング実践入門 ──簡潔で、正しいコードを書くために」）

## ラムダ式
いろんな定義があると思いますが……
・「関数をリテラルとして表現したもの」（from 大川徳之「関数プログラミング実践入門 ──簡潔で、正しいコードを書くために」）
・プログラミングしてる感覚で言うと、関数を変数みたいに使えるやつ、って感じです。
・コード例を見たほうがわかりやすいかも……

```javascript:JavaScriptのアロー関数
let hello = (word) => {
  return "Hello," + word
}
console.log(hello("World!"))   //Hello,World!
```
※動作試してないので、動かなかったら教えてください

## クロージャ
プログラミング言語における関数オブジェクトの一種。
いくつかの言語ではラムダ式や無名関数にて利用可能な機能・概念である。
（by Wikipedia）

正直ラムダ式との違いはわからないのですが、クロージャの方が広い概念なんでしょうか？？？
Swiftのコード例をのせときます。

```swift:swiftの例
let hello = {
  return "Hello, World!"
}
hello()   //Hello,World!
```

## 動的型付け言語/静的型付け言語
コンパイル時に型が決まっている言語を静的型付け言語といいます。
逆に実行時にはじめて型が決まるものを動的型付け言語といいます。
インタプリタ型言語はだいたい動的型付けを採用しています。
Perl/PHP/Ruby/Javascriptなどですね。

動的型付け言語の方がコンパイルエラーでハジかれるケースが少ないので、
コーディングの自由が効くというメリットがありますが、その分バグが混入しやすくなり、安全性は下がります。
昔はWebに求められる信頼性がさほど高くなかったので、動的型付け言語の人気が高かったですが、
近年はWebシステムといえどもそう簡単にエラー起こせないようになっており、静的型付け言語への回帰が来てるというのがトレンドと思われます。

## 遅延評価
通常プログラミングは記述した順番に実行されます。
制御文によって順番は制御できますが、実行するタイミングになったら実行されます。
（当たり前のことすぎて何言ってんだって感じかもしれないですが）
しかしプログラム上の実行タイミングと、実際の実行タイミングをズラしたい場合があります。
イメージ的には、APIでデータを取得していて、そのデータを詰める変数は、アプリの起動処理中は別に要らなくて、
ユーザーがトップページから次に遷移したら表示すればよい、という風なケースです。
（実際は別クラスに分離するとは思いますが、あくまでイメージで）

プログラミング言語によっては、こういうプログラマーのワガママを叶える仕組みがあります。
それが遅延評価です。
Swiftで書くとこんな感じです。

```swift:遅延評価の例
lazy var hoge: Int
```

対義語は正格評価。

## スクラム開発
アジャイルの開発手法の１つ。
アジャイルもそうですが、実体はケースバイケースのように思われます。
理想的には、ラグビーのスクラムみたいに、開発チームが一丸となってプロダクトの継続的な改善に取り組む、
スクラムマスターというアジャイル魂の伝道師を立てる、
スプリントというショートタームを区切って、継続的インテグレーションを回してく、みたいな感じ。
僕自身スクラム開発をしたことがないので、正確な理解ではないです。
どうでもいいですが、僕の知り合いの一切技術知識ない新卒２年目がスクラムマスターにされた事案を知っています。

## テスタブル
テスト可能な、という意味の英語。Testable。
近年のプログラミングの文脈では、テストコードが書けるように設計されている、という解釈でよいかと。

## ドメイン
知識、影響、または活動の領域。
（https://qiita.com/nunulk/items/84438605eb4d75dbef00 ）
たとえば保険会社の保険販売ビジネスであったり、音楽ストリーム配信であったり。
イメージ的には、全世界が一つの枠にあるとしたら、その枠の中の一部を「ドメイン」として丸をつけて切り出しているような感じ、と理解している。

## ドメイン駆動開発（ドメイン駆動設計）
ソフトウェアの実装対象を「ドメイン」としてモデル化して、それに沿って実装していく開発手法。
Eric Evansが提唱した。
今本読み中なので、詳細については勉強中です。

# フロントエンド
## React/Redux
リアクト/リダックス

Reactは、Facebookのエンジニアが２０１３年に発表した、JavaScriptのライブラリ。
実際のDOMを操作するのではなく、仮想DOMを操作することで、リッチなWebコンテンツも高速で描画するぜ！　という設計（らしい）。

ReduxはFacebookの提唱するFluxというアーキテクチャを実現するためのフレームワーク。
単一方向のデータフローを実現するために、MVCではないアーキテクチャを提唱している。

なんとなくセットでReact/Reduxと出てくることが多いですが、別にセットで使うことを強制されているわけではなくて、それぞれ単独で使うことも可能です。

## TypeScript
型があるJavaScript。
実体はJavaScriptだが、限りなく静的型付き言語っぽい使い方ができる。
ただどの程度型付けを厳密に行うかで宗教論争になっている印象。
Microsoftによって開発・メンテナンスされており、オープンソース。

## Nuxt
ナクスト。
Vue.jsアプリケーションを構築するためのフレームワークです。

## Flutter/Electron/Xamarin
それぞれクロスプラットフォーム開発のフレームワーク。

Flutterは、Googleが中心となってGitHub上でオープンソースなプロジェクトとして開発されている、モバイル向けアプリケーションのフレームワークです。
AndroidとiOSのアプリを単一のコードベースで開発できます。

Electronは、Webの技術（HTML5やJavaScript）で作ったものをデスクトップアプリケーション化（Windows/Mac/Linux）できるもの。
有名所だとSlack（のPC版）やAtomなどがElectronを使って開発されている。

Xamarin（ザマリン）はMicrosoftが買収した会社であり、同名の製品。
.NET Framework（C#やVB.NET）で作ったアプリをデスクトップアプリケーション化（Windows/Mac/Linux）及びモバイルアプリケーション化（Android/iOS）できるすごいやつ。

あくまで僕の印象ですが、最近はXamarinは下火で、クロスプラットフォーム開発したいならFlutterを選択する人が多い気がします。

## Realm
Realm: レルム
SQLiteなどに代わる、モバイル向けのDBMS
Android/iOS両方ある

## Firebase
Googleに買収された会社及びサービス。
いわゆるmBaaS（mobile backend as a Service）。
Web/スマホアプリのバックエンドをいい感じに補ってくれるサービスがいっぱいある。

# バックエンド
## Go言語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/4b8869b5-39bd-ebe1-7420-9420cea38da1.png)
Googleのエンジニアが開発した、オープンソースのプログラミング言語。
並列プログラミングがやりやすいらしく、モダンなバックエンドだとGoとPythonを扱っているところが多いと思います。

## Rust
オープンソースのプログラミング言語で、Mozillaが支援している。
速度、並行性、安全性を言語仕様として保証する、
C言語、C++に代わるシステムプログラミングに適したプログラミング言語を目指している、とのこと。
（by wikipedia）
C言語をモダンにしました、みたいなイメージ。
熱狂的なファンが多いが、使っている現場はあまりないのでわ……という印象です。

## コンテナ
もうブームというよりかは定着した技術のような気もします。
仮想化技術です。
仮想化技術誕生前は、インフラレベルで全く同じ環境を構築するのは、
（特に分散システムでは）困難だったのですが、コンテナ技術を使うことで、
OSから上のレイヤーを仮想的に構築することが可能となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/36fd5ac6-6dd2-70f8-b484-d66309c77ec3.png)
https://knowledge.sakura.ad.jp/13265/

ホスト型やハイパーバイザ型の仮想化は、ホストOSまで起動していたので、起動がめちゃくちゃ遅かったのですが、
コンテナはホストOSは自分が稼働している環境のOSをそのまま使うので、動作が軽量という特徴があります。
デメリットとしては、ホストOSと別のOSで動かしたいコンテナを生成できないという弱点はあるものの、そこは大して困らないですね。

## Docker
オープンソースのコンテナ管理ソフトウェア。

## Kubernates
読み方がイマイチ定まっていないが、たぶんクーべネティスでいいはず。
オープンソースのコンテナオーケストレーションシステム。
コンテナオーケストレーションシステムってなんだよ、と最初思ったが、
Dockerは便利だけど、自ホスト外と連携しなければならないとなったとき、管理が煩雑になるので、そこをいい感じにやってくれるツール

[3分で分かった気になる、Kubernetes とは？](https://qiita.com/r548/items/e6d1e4dcfdd9f8a7874d)

## Ansible
Redhatが開発したオープンソースの構成管理ツール。
サーバを立ち上げる際、あらかじめ用意した設定ファイルに従って、ソフトウェアのインストールや設定を自動的に実行する事が出来る、とのこと。
（by wikipedia）
ChefとかPuppetとかも似たようなツールだと思ってますが、Qiitaのトレンド見てるとAnsibleがよく出てくる気がします。

# まとめ
以上、よく見かけてたけどずっと意味わからないまま放置していた用語の調査記録でした。
８割ぐらい自分で手を動かして試してみるところまではいけておらず、めっちゃ調べて書いたものなので理解が浅くて恐縮です。
なにか間違えあったら、コメントor編集リクエストお願いします〜🐧🙏🐧🙏🐧🙏