プログラミング初心者
言語習得

プログラミング初心者こそ早い段階から複数言語に触れて欲しい3つの理由

これはGeek Women Japan Advent Calendar 2017 4日目の記事です。
GeekWomenJapan Advent Calendar 2017

はじめに

こんにちは、@chanmitsu55です。
プログラミング初めて半年以上経ちますが、この記事がQiita初投稿になります。

ざっくり自己紹介しておくと今年の3月頃から独学でプログラミングを学び、Pyhton->Go->Rustの順にこれまで3つの言語を触ってきました。
使用暦で言うとPython半年以上、Goは3ヶ月、Rust1ヶ月くらいです。
(正直Rustは新しい概念が多く、理解できたとは言えない状況です。つらい〜😞)
ちなみに業務としてはSQL叩いてログ分析するのがメインなデータアナリストです。
スクリプトちょろっと書く位でいわゆる開発業務ではありません。

初心者があれこれ複数の言語に手を出すのって効率悪いんじゃないの?って思っていたんですが、1つの言語を一定レベルまでキャッチアップできていれば学習コストはそこまでかからず、むしろ新しい視点で学べることが多かったという気づきからこの記事を書こうと思いました。
(ここでいう一定レベルの定義が難しいですが、個人的には基本的な型、関数、ライブラリが使えて簡単なツール/アプリ開発まで実装できるレベルだと思ってます)

2つ目、3つ目の言語として何を選ぶかは開発したいモノに合わせて好みで良いと思います。
ただ、どうせなら用途の違う言語を学んだほうが楽しいです。
スクリプト言語を触っている人が新たにキャッチアップするなら低レイヤ言語(GoとかRust)や関数型言語(HaskellとかLisp)といった別ジャンルに手を出すのをオススメします。

私は最初がPythonだったので、もっと低レイヤな言語を学ぼうとGo(流行っていたという理由も大きいが)を選び、システムプログラミングに興味が湧いたのでRustにも手を出した、という感じです。

 要約

早い段階で複数言語に触れると何が嬉しいか?理由は以下の3つです。

理由1:公式ドキュメントを参照する癖がつく
理由2:比較することで言語仕様の理解度が格段に上がる
理由3:多言語への心理的ハードルが下がる

以下、具体例と共に説明していきます。

理由1:公式ドキュメントを参照する癖がつく

  • 2つ目以降の言語は基本的に普段使っている言語との差分を学習していくスタイルになります

自分の場合は「Pythonで使ってるこの標準ライブラリ/関数ってGoだとどう動かすんだろう」というやり方でコードを書いていたのでググる際には各言語のドキュメントの該当箇所を自然と比較するようになりました。
個人的に2つ目以降の言語習得はドキュメント比較して既存のコードを書き直すのが最も効率が良いキャッチアップ法だと思ってます。

返り値設定が必要か、メソッドの書き方がどうなっているか、といった比較をひたすら繰り返していると、結果的にググる際には「まずドキュメントを参照するか」という癖がつきました。
この習慣身につけておくとあの構文はドキュメントのこの辺りに書いてあったなと、どこに何が書いてあったかぼんやり分かってくるので後々ググる時に楽。
プログラミングを学んでいる早い段階で公式ドキュメントを読む癖を身につけておくのは多くの人が語ってるように非常に大事な習慣です。

理由2:比較することで言語仕様の理解度が格段に上がる

具体例を2つ挙げると・・・

  • 静的、動的な挙動を知る
    簡単な例で言うと、動的言語であるPyhonと強い静的型付け言語であるGoを同時に学ぶことで「型の拡張性」「保守性の高さ」といった特徴を掴めます。
hello.py
a = "hello"
b = 1
a = 2 # string -> intに型変換可能

  同じことをGoでやると

hello.go
a := "hello"
b := 1
a = 2 // コンパイルエラー
  • 複雑なデータ型のまとめ方
    RustやGoはStructという構造体を扱えるが、Pythonではclassの中にデータ構造を定義して構造体のように扱えます。
user.py
class User:
    def __init__(self):
        self.name = 'chanmitsu55'
        self.tel = 123456789

chanmitsu = User()
print('User information: {}, {}'.format(chanmitsu.name, chanmitsu.tel))
# User information: chanmitsu55, 123456789

  Rustの方が見た目的にはシンプルです。

user.rs
struct User {
    name: String,
    tel: i32,
}

fn main() {
    let user = User { name: "chanmitsu55".to_string(), tel: 123456789 };
    println!("User information {}, {}", point.name, point.tel);
    // User information: chanmitsu55, 123456789
} 

理由1では比較する際の手段としてドキュメント見比べるのが良いよって話をしたんですが、理由2では言語仕様を比べるのが良いよ!って話です。
具体例を挙げるとキリがないのですが、ある言語でインスタンスどうやって作るか実装方法が理解できなくても、別の言語で実装すると案外スッと理解できたりします。これも早い段階でいろんな言語触ることの醍醐味。

理由3.他言語への心理的ハードルが下がる

  • 自分の知らない言語で書かれていても「たぶん理解できるはず」と思える

心理的抵抗感はどんどん排除していきましょう。
例えば自分はPython/Go/Rustをやってもいまいちオブジェクト指向が理解できずふわふわした状態でクラスや構造体を定義していたのですが、以下のJAVA本を読んでオブジェクト指向にかなり自信がつきました。
個人的にこの本を超えるわかりやすさで書かれたPython本は今のところ無いと思います。
スッキリわかるJava入門 第2版 スッキリわかるシリーズ
(ちなみに↑の本はJAVA未習得でも容易に読めます)

もし、Pythonしかやっていなかったら「JAVAで学ぶの難しそう」と尻込みして、オブジェクト指向を習得するのは大分先になってたかもしれません。
英語が読めると情報収集力が上がるのと一緒で、言語に縛られないように意識するだけで触れる情報量が格段に増えます。

まとめ

ということで長々書きましたが、以下の3つが早い段階で複数言語に触れることをオススメしたい理由です。
理由1:公式ドキュメントを参照する癖がつく
→各言語ごとのライブラリ/関数の比較する中で公式ドキュメントに触れる機会が増え、公式ドキュメントに抵抗が無くなる

理由2:比較することで言語仕様の理解度が格段に上がる
→いまいち分からない概念は他の言語で実装すると理解できたりする

理由3:多言語への心理的ハードルが下がる
→知らない言語でもとっつきやすくなるため情報収集先が広がる

おわりに

プログラミングは何かを実現するためのツールなので可能な限り、効率よく習得したいですね

明日は@kuniyoshi_asamiさんです!