爆速でプログラミング言語を習得するための手順 

# はじめに
![1452839.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406684/7ff5de9f-bebb-9be9-6a60-51005e49b907.jpeg)
この記事は、エンジニアが自身のスキルセットに無いプログラミング言語を
習得することを目的としております。

私はJavaの経験が長めでJavaGoldも取得したのですが、
今後は他のプログラミング言語も使用する機会が増えそうなので、
習得手順（我流）をメモがてら記事にしてみました。

# 習得手順
## １．プログラミング言語を選定する
~~業務で仕方なく・・・ならスキップ~~
人によって事情は異なりますが、
プログラミング言語を選定するうえで重要なのは「何が作りたいか」だと思います。

なので、今回は「何が作れるか＋何が得意か」という視点で
プログラミング言語と概要をザッと記載します。

※メリットとデメリットは更に深堀して調査＆考察ことをお勧めします。
　例えば、Javaのデメリットに「小規模システム開発に向いていない」とありますが、
　何故、向いていないのか？など。。
　⇒Javaの特徴の一つである「オブジェクト指向」が小規模なシステムでは活かされない。
　　小規模なシステムにJavaを用いると、ソースが長くなって複雑化しやすい。とか・・・。

### ①Webアプリ
ブラウザで動作するアプリです。
Webアプリ用の言語については、
フロントエンドとバックエンドの二つに分けることができますので、
「種類」として記載します。

#### JavaScript
・言語が作られた目的：Webサイトに動きをつけるため（当初）
・種類　　　　　　　：フロントエンド
・種別　　　　　　　：インタプリタ
・パラダイム　　　　：オブジェクト指向
・性質　　　　　　　：動的型付け
・メリット：
　講文が比較的わかりやすい
　環境構築が不要
　フレームワーク、ライブラリの種類が多い
　情報量が豊富
・デメリット：
　ブラウザによって挙動が異なる場合がある
　処理速度が他の言語より遅い
・特徴：
　HTMLで記述されたWebページに動的表現（カーソルを当てるとメニューが開いたり、
　ボタンをクリックするとポップアップが出たり）をする、というのが主な用途です。

　しかし、最近ではサーバーサイドJavaScriptや各種のライブラリが充実してます。
　また、モバイルアプリ（ハイブリッドアプリ）の開発も可能です。

#### PHP
・言語が作られた目的：ダイナミックなWebアプリ開発のため
・種類　　　　　　　：バックエンド
・種別　　　　　　　：インタプリタ
・パラダイム　　　　：オブジェクト指向
・性質　　　　　　　：動的型付け
・メリット：
　講文が比較的わかりやすい
　殆どのレンタルサーバーに標準インストールされている
　サーバーに配置したら動作する
　フレームワーク、ライブラリの種類が多い
　OSSが多い
　情報量が豊富
・デメリット：
　Webアプリしか開発できない
　処理速度が遅いため、大量データ処理に向いていない
・特徴：
　「MySQL」を始めとしたデータベースとの連携機能が強力で動作が高速なため、
　多くのWebアプリで使用されています。

　「Slack」や「WordPress」もこの言語で開発されています。
　殆どのレンタルサーバーに標準でインストールされており、
　実行環境の準備に手間がかからない点も便利な言語です。

#### Ruby
・言語が作られた目的：オブジェクト指向に基づいたプログラミングを行うため
・種類　　　　　　　：バックエンド
・種別　　　　　　　：インタプリタ
・パラダイム　　　　：オブジェクト指向
・性質　　　　　　　：動的型付け
・メリット：
　講文が比較的わかりやすい
　日本発のプログラミング言語のため、学習しやすい
　フレームワーク「Ruby on Rails」が超万能
・デメリット：
　処理速度が遅い（PHPよりも若干遅いとか）
　人によって書き方が大きく異なる
・特徴：
　日本発のプログラミング言語です。
　日本発の言語なので、最新情報やヘルプは日本語で参照することができます。
　他の言語はほぼ英語で記述されているので、
　その点でも日本人にとって学習しやすい言語ということができます。

　「クックパッド」、「価格.com」、「食べログ」などで使われています。

#### Java
・言語が作られた目的：ハードウエアに依存しない新しいソフトウエア開発プロセスの仕組みを生み出すため
・種類　　　　　　　：バックエンド
・種別　　　　　　　：インタプリタとコンパイラの特徴を併せ持つ中間言語
・パラダイム　　　　：オブジェクト指向
・性質　　　　　　　：静的型付け
・メリット：
　どのプラットフォームでも動作する
　フレームワーク、ライブラリの種類が多い
　実行速度が速い
・デメリット：
　学習コストが高い
　小規模システム開発に向いていない
・特徴：
　Webアプリの他にもAndroidアプリにも使用されており、
　どんなプラットフォーム上でも動作する汎用的な言語です。

　このような高い汎用性を実現しているのは、
　JVM層を介してプログラムが実行される仕組みにあります。

#### Go
・言語が作られた目的：エンジニアの生産性を向上するた
・種類　　　　　　　：バックエンド
・種別　　　　　　　：コンパイラ
・パラダイム　　　　：オブジェクトや継承を使わないオブジェクト指向
・性質　　　　　　　：静的型付け
・メリット：
　シンプルな仕様なので人による表記揺れがしにくい
　クロスコンパイル
　並列処理が言語レベルで備わっている
　実行速度が速い
・デメリット：
　継承がない
　ジェネリックがない
　例外処理機構がない
・特徴：
　Googleが開発したオープンソースの言語です。
　規模の大きなプロジェクトに向いており、
　システムやネットワーク、バックエンド、CUIツールでは定番言語の一つになりつつあり、
　日本でのユーザー数も増えているそうです。

　シンプルな仕様なので、「良くも悪くも、入社したてのGoogle社員でも、
　いきなり大規模システム開発に参加して、それなりの成果を出せる言語」
　という言い方をする方もいます。

### ②スマホアプリ
AndroidやiOSにインストールして動作するアプリです。

#### Kotlin
・言語が作られた目的：Javaをより簡潔で安全な言語を開発するため
・種別　　　　　　　：インタプリタとコンパイラの特徴を併せ持つ中間言語
・パラダイム　　　　：オブジェクト指向
・性質　　　　　　　：静的型付け
・メリット：
　どのプラットフォームでも動作する
　Javaと100％互換性がある
　Javaよりもシンプルなコード
　Androidアプリ開発に特化
・デメリット：
　学習コストが高い
　日本語の情報量が少ない
・特徴：
　~~Javaの進化系~~Javaベースの言語です。
　2017年にGoogleがKotlinをAndroidアプリの開発言語に追加したことにより、
　注目されるようになりました。

　AndroidOS用のアプリを開発する時の定番はJavaでしたが、
　近年はKotlinが定番の言語となってきましたね。

　Javaと100%の互換性を持っており、Javaと同じくJVM上で動作します。
　新しい言語を利用する場合、今まで利用していた言語のソースは使えなくなりますが、
　Java→Kotlinの置き換えなら比較的スムーズにいきそうですね。

#### Swift
・言語が作られた目的：iOS向けのネイティブアプリケーションを開発するため
・種別　　　　　　　：コンパイラ
・パラダイム　　　　：マルチパラダイム（命令型と関数型）
・性質　　　　　　　：静的型付け
・メリット：
　可読性が高く学習コストが低い
　処理が早い（Objective-CやPythonよりも早い）
　コーディング中に動作やロジックを確認できる
　C言語、Objective-Cと連携できる
・デメリット：
　iOSアプリしか開発できない（Windows/Androidアプリは開発不可）
　基本的にMacでしか開発できない
・特徴：
　Apple社が作ったプログラミング言語です。
　iOSアプリはObjective-Cで開発されていましたが、Swiftが出てきてからというもの、
　世の中的にはObjective-Cを廃止してSwiftに移行する流れになっていますね。

　前職でSwiftの研修を受け、その時に初めてSwiftに触れたのですが、
　構文がシンプルなので記述が簡単でした。
　（当時、標準ライブラリのメソッドが数百個ほどオーバーロードされていたのには驚きましたが）
　特にXcodeのGUIコンポーネントはAndroid Studioよりも直感的に作りやすく、
　デフォルトのデザインでもイケてた記憶があります。

　あと、80歳を過ぎてからSwiftの学習をスタートして5ヶ月でアプリをリリースし、
　WWDCにも登壇して話題になった[若宮正子さん](https://tech-camp.in/note/technology/40688/)とか強烈でしたね。

### ③AI/機械学習アプリ
与えられたデータから、推論・判断などといった知的な処理を行うアプリです。
siriの音声認識やカメラの画像認識などの技術が有名ですね。

#### Python
・言語が作られた目的：高い生産性と、読みやすいコードのため
・種別　　　　　　　　：インタプリタ
・パラダイム　　　　　：オブジェクト指向
・性質　　　　　　　　：動的型付け
・メリット：
　利用用途が広い
　コードが短い
　C/C++のライブラリと連携できる
・デメリット：
　実行速度が遅い（Rubyよりも若干遅いとか）
　記述の自由度が低い
・特徴：
　Webでも使われておりますが、
　データ・サイエンスやビッグデータ、
　AIなどの分野でもよく活用されている言語です。

　AI分野の標準ライブラリやフレームワークの他、
　オープンソースの外部ライブラリが多く公開されていますので、
　「AI/機械学習アプリ」に分類しました。

#### R言語
・言語が作られた目的：統計解析のため
・種別：インタプリタ
・パラダイム：関数型
・性質：動的型付け
・メリット：
　統計解析に便利な機能が多い
　コードが短い
・デメリット：
　統計解析しかできない
　統計学の学習が必要
・特徴：
　R言語は統計学の分野において力を発揮する言語で、
　機械学習のなかでもデータ分析を得意としています。

　AI/機械学習アプリ開発といえばPysonかR言語の2択だとよく言われていますが、
　使い分けをすることが大事かと思います。

## ２．いろいろ開発する
習得するプログラミング言語を選定したら、
次は実際に手を動かしてプログラミングします。

### ①Hello Worldする
[こんな感じで](https://qiita.com/melty_go/items/c977ba594efcffc8b567)Hello Worldを行います。

「Java HelloWorld」とかでググれば色々な手段がヒットします。
開発環境は比較検討して自身に合うものを選定します。

Hello World行うまでに、
言語のインストールや開発環境の選定や構築などといった
多くの学びがありますので、単純なようで重要な作業です。

### ②ググりながらアプリを開発する
アプリを開発しながら言語機能をおさえます。
　【おさえたい言語機能】
　　・型
　　・基本講文（if、for文など）
　　・クラス/構造体
　　・ファイル、DB、http等とのIO
　　・文字列操作
　　・よく使う標準ライブラリ
　　・言語固有の機能

開発完了までに、書籍やネットには載っていないようなエラーが少なからず発生しますので、
エラーを解決することにより応用力も身につくと思われます。

問題は何のアプリを開発するかですが、
参考までに以下をオススメします。

#### ■Webアプリ（フロントエンド）
　・ストップウォッチ
　・メモ帳 or Todoリスト（ローカルセッションなどに保存）
　・[**こういった外部API**](https://qiita.com/mikan3rd/items/ba4737023f08bb2ca161)から結果を受け取って整形して表示するアプリ

　デザイン、イベント処理、セッション管理、外部APIとのやりとりができたらいいと思います。

　Todoリスト的なWebアプリ（フロントエンド＋バックエンド）なら
　[**こちらの記事**](https://qiita.com/melty_go/items/1432da74804a9dca112a)が参考になるかと思います。

#### ■Webアプリ（バックエンド）
　・クライアントからリクエストを受け取り、レスポンスデータをJSON形式で返却するアプリ
　・クライアントからリクエストを受け取り、リクエストデータをDBに保存するアプリ
　・Webスクレイピングしてデータを整形し、DBに保存するアプリ
　　※基本的にはローカルファイルに対してスクレイピングをした方がいいです。
　　　逮捕者が出た事例があるので（[Librahack事件](https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B%E4%B8%AD%E5%A4%AE%E5%9B%B3%E6%9B%B8%E9%A4%A8%E4%BA%8B%E4%BB%B6)）

　DBとの通信、http通信ができたらいいと思います。
　
　私の場合は、クライアントからリクエストを受け取ったらWebスクレイピングし、
　JSON形式に整形してサーバー上のファイルに保存し、
　そのファイルの内容をJSON形式でクライアントに返却するアプリを開発しました。

#### ■スマホアプリ
　・メモ帳 or todoリスト
　・[外部API(Google APIなど)](https://akira-watson.com/android/google-maps-api-v2.html)と通信するアプリ
　・カメラ/Push通知/加速度センサーなど、スマホの機能を利用したアプリ

　各UIコンポーネントとAPIとの通信とスマホ固有の機能が一通り扱えれば良いと思います。

　私は過去に、メモ帳（メモをファイルに保存）、
　Google Map上にピンを立ててメモを書き込めるアプリ（Google Maps APIと連携）、
　パンチングマシーン（加速度センサーから加速度取得して画面表示）
　などを個人で開発しました。
　AndroidのUIはシングルスレッドモデルだというのを知らずに、
　２つ以上の描画の同時更新でつまづき、並列処理で解決とかして苦労しました。

#### ■AI/機械学習アプリ
　AI/機械学習アプリの開発経験は無いのですが、
　0から作るのはハードルが高すぎますので、
　私ならツールやライブラリやAPIを駆使して以下のようなアプリを開発します。

　・画像から文字をおこすアプリ
　・日本語の音声から文字を起こすアプリ
　・[誰も勝てない○×ゲーム](https://book.mynavi.jp/manatee/detail/id=76390)

　画像認識、音声認識、自然言語処理、時系列処理が一通りできたら良いかなと思います。
　言語よりもAI/機械学習の知識が必要になりますねこれは。

　前職の貸与PCでIBM Watsonの開発環境を構築しましたが、
　転職と重なり開発できなかったことを思い出しました。

　近日中に音声から文字を起こすアプリとか作って公開します。

### ③フレームワークを使わずにアプリを開発して公開する
選定した言語を業務で使用するのであればもう十分かもしれませんが、
足りない場合はアプリを開発して公開します。

実際の現場では各言語のフレームワークのスキルも必須になることが多いですが、
言語を学習するうえではフレームワークを使用しない方が良いと考えているので、
あえて使わずに開発します。

# 開発して公開してみた
　・アプリ名：[パワーあんてな](https://power-antenna.com/)
　・概要　　：ブログのRSS<font color="Red">\*</font>を自動で収集し、一覧表示するWebアプリ。
　　　　　　　RSSから最新情報を閲覧するサービスを提供する。
　　　　　　　新規のRSSを保存した場合、<a href='https://twitter.com/intent/follow?screen_name=PowerAntenna' target="_blank" rel="noopener noreferrer">Twitter</a>で通知する。
　　　　　　　<font color="Red">\*RSSとは、ブログの記事のタイトル、内容、URL、投稿日時などが記載された文書</font>![pa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406684/a049a3e2-70de-4c57-a39e-3b29eb200854.png)

## 機能
　●バッチ
　　・外部のブログからRSSを収集し、DBに保存する
　　・新規のRSSを保存したらTwitterで通知する
　●バックエンド
　　・DBから取得したRSSをJSON形式にして返却する
　　・ブログ記事へのリンクのクリック数をDBに保存する
　　・ブログ記事のアイキャッチ画像を取得する
　　・アイキャッチ画像をOGPに設定する（クローラ用）
　●フロントエンド
　　・ブログ記事へのリンクを作成し、画面に表示する
　　・ブログ記事へのリンクのクリック数を画面に表示する
　　・ブログ記事へのリンク情報は、任意でローカルストレージに保存できる
　●その他
　　・レスポンシブ対応とする
　　・クロスブラウザ対応とする

## 開発環境
　・サクラエディタ
　・WinSCP
　・Chrome Developer Tools
　・Safariデベロッパーツール
　（VSC+XAMPPの開発環境構築を後回しにした結果）
## 開発言語
　●フロントエンド
　　・HTML（少し経験有）
　　・CSS（少し経験有）
　　・JavaScript（経験有）
　●バックエンド、バッチ
　　・PHP（ほぼ経験無）

## 感想
バックエンドはGoにしたかったのですが、
レンタルサーバーにインストールされていなかったので諦めました。

結果、RubyかPHPの2択になり、パフォーマンスが若干高く、
今回こっそり使用することになったWordPressやMySQLとも連携しやすいPHPを選定しました。

何はともあれ、`言語機能を一通り使用する`というのを意識して開発しましたので、効率よく習得できたかと思います。

また、公開したWebアプリについては利用者数が徐々に増加しており、
Googleアドセンスの審査に合格しましたので、
一定の有益性と品質の確保もできたかと思います。

# おわりに
勉強方法は人それぞれですが、
結局は書籍とかネットで調べるだけでなく、手を動かすことが習得への近道かと思います。

プログラム言語は上述のもの以外にも200種類以上あり、
機能を全て完璧に把握するのは難しいうえ、
本質としては以下3点に集約されるからです。
　①逐次処理（先頭から順番に処理する）
　②条件分岐（if文など）
　③繰り返し処理（for文など）

弘法筆を選ばずなエンジニアになりたいですね。