未経験が初学者コロシのIT用語をまとめてみました

# この記事の対象者

プログラミング初学者、またはこれから勉強を始めようとしている方々


# はじめに

プログラマーへの転職を決意し情報収集に励んでいた頃、こんな言葉をよく目にしました。<br>
####<b>「プログラミングの独学は９割の人が挫折する」</b>

母数が明確にされていないので、この数字に意味はあまりないのかもしれません。しかし、現在スクールの力を借りながら勉強している私は、「ここ、独学じゃ理解できたか怪しいな...」と思わず考えてしまった事が何度かあります。
なので、この言葉はある程度は正しいのでしょう。（流石に９割は誇張表現な気もしますが）
ではなぜ、プログラミングとはそこまで難しく思われがちなのでしょう？
コードのややこしさももちろんあるでしょうが、おそらく一番の理由は、専門用語の多さにあるのではないかと私は考えています。

例えば、プログラマー同士の間で交わされる言葉にこんなものがあります。

####<b>「APIを叩く」</b>

よく分からないですよね。叩けるものなので物理的な何かに思えます。
そこでAPIを調べてみると、wikiにはこう書いてあります。

>「各種システムやサービス（ハードウェア、OS、ミドルウェアおよびWebサービス等）を利用するアプリケーションソフトウェア (Application) を開発・プログラミング (Programming) するためのインタフェース (Interface) である。」

なんとか理解はできるかもしれませんが、100％の理解には及ばないでしょう。<b>ミドルウェア</b>という聞き慣れない単語を今度は調べる必要が出てきます。<b>OS</b>が分からないという方もいるかもしれません。
このように、ある用語を理解するためには、別の用語の知識が必要となっていることが、プログラミングというものをわかりづらくしているのではないでしょうか。

そこで今回は、プログラミングの勉強を初めて３ヶ月の私が、「これってよく聞くけどなんだったっけ？」と思いがちなIT用語を、勉強も兼ねて自分の言葉で簡単にまとめてみました。
これからプログラミングを勉強する方や、勉強を始めたものの分からない用語が多すぎて困っている方にとって、何かの参考になれば幸いです。

###※注意点
・私が勉強の過程で出会った用語を、あくまでも主観で選んでおります。
・ジャンル分け及び用語の順番についてはだいぶ大雑把です。
・Ruby及び、railsを中心に学んでいるため知識に偏りがあります。

#用語集

##webの基礎知識

パソコンやネットワークに関する基本的な用語です。
###OS
Operating Systemの略。パソコンをパソコンとして動かすために必要なソフトウェア。これが入っていないと始まらない。代表的なものとしては、windowsやMac OSがある。
###サーバー
簡単にいうと、我々のコンピュータに対して情報を送信してくれる機械のこと。クライアントがサーバーに対してリクエストを送り、サーバーがレスポンスを返すことでwebページを閲覧することができるようになる。

###ミドルウェア
OSとアプリケーションの間に存在するソフトウェア。真ん中なのでミドル。アプリケーションやOSには出来ない処理を担当する。
ミドルウェアの例として、web3層構造と呼ばれているものがあり、これはAPサーバー、DBサーバー、WEBサーバーに分かれている。
参考URL:[ミドルウェア(Web、AP、DB)について知ろう | Think IT（シンクイット）](https://thinkit.co.jp/article/11837)

###プロキシ
プロキシサーバの略。内部ネットワークから外部のインターネットに接続する際に、仲介をしてくれるサーバーのこと。自分の代わりに相手サーバーにリクエストを送ってくれるので、自分の身元を隠したり場合によっては通信速度が向上することもある。

###IPアドレス
ネットワークに接続するときに個々に割り振られる番号。192.168.18.8みたいな感じの数字の羅列で表現される。IPv4とIPv6という形式があるが、これはIPv4のIPアドレスがほぼ全て割り振り済なためにIPv６という新しい数字の羅列を追加した。090 070みたいなもの。現状IPv6はほとんど使用されていないので無視して大丈夫らしい。

グローバルIPは、地球上のネットワークに接続する際の身分証明（マイナンバーや免許証番号みたいな感じ？）のようなもので、全世界で一意である。
対して、プライベートIPは家庭内や社内ネットワークに接続する際の身分証明（社員番号みたいな感じ？）である。

###ポート番号
パソコン同士が通信を行う際は、パソコンの中のさらに特定のソフトウェア同士が通信を行うことになる。その際IPアドレスだけでは、通信を行うパソコンは解っても、どのソフトウェアと通信すればいいのか分からなくなってしまう。
なので、ソフトウェアごとにポート番号を割り振り、識別している。
IPアドレスやドメインが住所ならば、ポート番号は部屋の玄関のドアのようなものである。
また、1023番以下のポート番号は使用頻度が高く、よく使われるためウェルノウンポートと呼ばれている。
参考URL:https://pasomaki.com/web-port-number/

###DNS
Domain Name Systemの略。IPアドレスとドメインを紐づけるもの。
Webページにアクセスした際、http://　以下のドメインをIPアドレスに変換してくれている。

###ドメイン
インターネット上の住所みたいなもの。IPアドレスもそうなのだが、IPではわかりづらいため人間が読みやすい文字列に変えたもの。
http://〇〇〇〇 の、〇〇〇〇の部分がドメイン。ちなみに好きな名前のドメインを取得するためにはお金がかかる。

###IDS、IPS
どちらもセキュリティ対策機能の一種。通信を検知し、異常があるかどうかを判断する事ができる。２つの違いとして、IDSでは異常を検知した場合、通知だけを飛ばして通信自体はそのまま通すが、IPSでは通信自体を遮断してくれる。

###WAF
より高機能なセキュリティ対策機能。IDS、IPSでは通信に異常があるかどうかを検知することはできるが、送られてくるデータに異常があるかを検知することはできない。データに異常があるかどうかを検知してくれるのがWAFである。
データ自体を監視してくれるので、より高機能だがその分費用がかかるらしい。



##プログラミング全般
言語に拘らない共通の知識です。

###ターミナル
macに標準搭載されている、文字によってパソコンに命令を下せる機能

###エディタ
コンピュータ上で、テキストファイルを閲覧、作成、編集、保存するためのツール。プログラミングでは主にこのエディタを使ってコードを書いていくことになる。代表的なエディタとして、Atom、VSCode、Vimなどがある。

###Vim
エディタの１つ。最大の特徴はすべての操作をキーボードで行う事ができるという事。それゆえマウスが不要。
AWSなどのクラウドサーバを使って作業する際、接続したサーバーのファイルを編集するのにVimのようなコマンドラインエディタが必要になる。
癖が強いが使いこなせると強いらしい。
なのでプログラマーの中にはたくさんのvimmerがいる。

###API
Application Programming Interfaceの略。ソフトウェア同士やプログラム同士をつなげるための窓口みたいなもの。外部に公開されている事が多く、これにより、異なるソフトウェア間でチャット機能を共有したり、例えばgooglemapを全く別のアプリケーションに組み込んだりする事が可能。

###JavaScript
プログラミング言語の一つ。JSと呼ばれる。
フロントサイドの言語であり、サイトに動きをつけることができる。サーバーサイドで使われることもあり（後述するNode.jsなど）、これひとつでwebサービスを作り上げることもできる。汎用性が非常に高いため、あらゆるところで使用されている。
また、たくさんのフレームワークが作られており、有名なものとしてはJQuery、Vue.js、Reactなどがある。

###Ajax
Asynchronous JavaScript + XMLの略。
JSとXMLを使った非同期処理のこと。通常の同期処理では、全ての情報を通信しているため、リクエストを送信した後にレスポンスが返ってくるまで待たないといけない。
しかし、非同期処理だと、JSによって通信なしでフロントサイドを変更&バックサイドで一部の情報を通信することにより、レスポンスが返ってくるのを待つことなく次の操作が可能となる。

###Node.js

サーバーサイドのJSの実行環境。
JSはブラウザ上で動作するプログラムであり、その為パソコンのOSにアクセスすることができない。
Node.jsを導入することにより、JSでもOSのファイルなどにアクセスすることや、ネットワーク通信などの機能を扱うことができるようになる。
参考URL
https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb


###npm
Node.jsのパッケージマネージャー。node.jsをインストールするとデフォルトでついてくる。

###Yarn
JSのパッケージマネージャー。npmに比べて速度や安全性の面で優れている。

###DB
データベースの略。データの集合体でありデータベース管理システム（DBMS）によって管理されている。DBとDBMSを合わせてデータベースシステムと呼ぶ。
代表的なものに、OracleやMySQLやPostgreSQL、SQLiteなどがある。
ちなみにrailsのgemに記載されているsqlite3やmysqlなどは、アプリケーションとDBを繋ぐアダプターであり、DBではない。

###SQL
上記のデータベースを操作するため言語の一つ。
ISOで規格化されており、SQLを覚えることによりあらゆるデータベースを操る事ができるようになる。
これも間違われがちだが、SQLはあくまでデータベースを操作するための言語であり、データベースのことではない。

###AWS
Amazon Web Servicesの略で、Amazonが展開しているクラウドコンピューティングサービスのこと。０からインフラを整えるとなると相当な初期費用がかかってしまう。その点、AWSを使うと必要な分だけリソースを使用する事ができ、またセキュリティ設定やパフォーマンスの改善もAWS側行う事ができるので、webサービスを開発するハードルがグッと下がる。railsチュートリアルでは、まずAWSを使った環境構築から始めることになる。ちなみに膨大な数の機能があり、AWSに関連した資格も複数ある。

###フレームワーク
その名の通り、プログラミング言語を使ってサービスを開発するための「枠組み」となるライブラリのこと。
プログラミング言語はあくまでも「言語」であり、これを使ってサービスを１から作り上げるというのはなかなか大変。そこで、その言語でよく使うコードや機能をブラッシュアップし、サービス開発の一連の流れを枠組みとしてまとめたものをフレームワークと呼ぶ。Rubyでいうrailsである。

###ライブラリ
フレームワークと混同されがちだが、こちらはある言語においてよく使う機能を一つにまとめたものである。いわば部品を集めたものであり、枠組みとして作られているわけではないため、これ単体で作動することはない。

フレームワークとライブラリの違いについてはこちらの記事がわかりやすいです。
[Part1　ソフトウエアのフレームワークとはなにか | 日経クロステック（xTECH）](https://xtech.nikkei.com/it/article/lecture/20070205/260697/)

###カーネル
OSの中核となる部分。ハードウェアとソフトウェアの架け橋的存在。
その機能は多岐に渡り、メモリーの管理やプロセスの管理などを行ってくれる。これにより、ソフトウェアはメモリーなどを気にする事なく力を発揮することができる。
なお、後述するlinuxではカーネルを直接ユーザーが操作することはできず、間にシェルを挟む。

###Linux
オープンソースのUnix系OSであるが、狭義にはOSを構成するカーネルのことを指す。(Linuxカーネル)
オープンソースであるがゆえに、誰でもソースコードを取得することができ、それを変更したり再配布することも可能。そのため、様々な派生系のOSが誕生している。（これをLinuxディストリビューションと呼ぶ）

###ubuntu
前述したLinuxディストリビューションの一つ。一般のユーザーがlinuxを使う際に一番に名前が挙がるLinuxディストリビューションでもある。

参考URL
[Ubuntuとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word15508.html)
」気になれるIT用語辞典](https://wa3.i-3-i.info/word15508.html)

###シェル
ユーザーがOSと対話するための窓口。ユーザーの操作をOSの中核であるカーネルに伝えたり、カーネルのレスポンスをユーザー側に伝えたりする役割を持っている。
OSの安全性を高める効果もあるため、貝殻でOSを包み込んでいるイメージ。

###bash
前述したシェルプログラムの1つ。
shというシェルを強力にしたもの。
ちなみにshはshellの略称である。

###zsh
前述したシェルプログラムの1つ。
ちなみに、1つのPCには複数のシェルが入っており、ユーザーはどれを使うか選ぶことができる。途中で変えることもできる。

###Docker
大雑把に言うと、アプリの起動や開発に必要な環境を一つにまとめたコンテナ及び、そのコンテナを簡単に作成し利用できるようにしたもの。

仮想化との違いとメリット

仮想化: カーネル＋コマンド&ライブラリ
コンテナ:コマンド&ライブラリ

コンテナは、ホストOSとカーネルを共有するのでコンテナ内にカーネルが不要。
そのため仮想化に比べて軽量。さらに、チーム開発の際に開発環境に差異が出にくい。
仮想化、コンテナ、Dockerは言葉で説明しただけではイメージが掴みづらいため、イラストを使って勉強した方がわかりやすいかもしれない。私は下の記事を参考に勉強しました。

https://tech-lab.sios.jp/archives/18811

###sudo 
unix系で使えるコマンド。
スーパーユーザーの権限でコンピュータに命令を飛ばす際につける接頭語。
「super user do」の略だと思われる。

###yml
ファイルの拡張子。
yamlは、ファイルの名前とデータ形式のことであり、ymlはyamlファイルにつく拡張子である。

##Ruby、Ruby on rails関連の知識
Ruby、Ruby on railsを学ぶ上でよく見かける用語やコードです。
###bin/rake
railsでrubyのタスクを命令する時にコードにつける接頭語。ただしrails5.0からはrailsをつけるだけで全部OK！
ブログとかでbin/rakeと書かれているのは昔の記事だから。

###bundler
rubyのgemは、gem install 〇〇で個別にインストールすることが可能。
しかし、それだとgemの相性問題が起こったりする。
bundlerは、gemの互換性を保ちながら導入や管理を行ってくれるソフト。
Gemfileに導入したいgemを記述し、bundle  installをする。
アプリケーションのGemfileにgemを記載すると言う特性上、導入するgemをアプリケーションごとに管理することが可能。

###bundle（bundle exec）
上記で説明したbundlerを使用する際の接頭語。これをつけないと、システム側のgemを使うことになる。
システム側に全く同じgemが入ってなければ当然エラーが起こる

###migration
日本語訳の意味は、「移動、移行」
ざっくり言うとrails内のコードをデータベースに移すための機能。
通常、データベースを作成するためにはSQLを一から発行する必要がある。しかし、railsではスクリプトファイルにデータベースを作成したり変更するためのrailsのコードを記載し、それを`rails db:migrate`コマンドで実行することでデータベースを作成したり変更することができる。この機能をマイグレーションと呼ぶ。


###gemfile.lock
前述した通り、gemには依存関係が存在するが、railsではbundle installをすることにより自動的に依存関係を調整して互換性を保ってくれる。その調整を記録したファイルがgemfile.lockである。

###active records
Rails の強力な機能の一つ。簡単にいうとrubyのコードをSQLに変換してくれる機能。これにより、rubyのコードを使ってSQLを発行してデータベースの閲覧や編集、保存を行う事ができる。
`User.update`でデータを更新できたり、`User.find_by`でデータベースからデータを引っ張ってこれるのも全てこのactive recordsがSQLに変換してくれているからである。

###schema
日本語で図式や計画といった意味。railsでは、schema.rbというファイルに`rails db:migrate`によってDBに加えられた変更が記録される。