Ver. 1

ビギナーズガイド

新しいプログラミング言語の覚え方

November 24, 2022

エンジニアをやっているとキャリアの全てが一つの言語で終わると言うことは実はほとんどありません。

プログラミングを学習し始めたころは当然最初に触った言語が初めて勉強するプログラミング言語になるかと思うのですが、 こちらの記事ではそれをより効率よくできるように抑えておくと良いことをまとめていきます。

この考え方は最初に学ぶ言語にも使えると思いますし、第二、第三の言語を覚える時にも役に立つ考え方になるでしょう。

言語を習得する時の流れ

下記が言語を習得する時の流れになります。

  1. 全体像の把握
  2. データ操作の方法を覚える
  3. クラスの構文を覚える
  4. よく使う処理(JSONへの変換、型変換、ファイルの入出力、HTTP通信)の書き方を確認する
  5. デバッグの方法を調べる、環境を整える
  6. 実際にコードを書いて動かしてみる
  7. その言語の特徴的な機能を学習してみる
  8. 書き方のバリエーションを増やす(公式ドキュメントを読み込む、他人のコードを読む、面接問題集を解いてみる、静的解析ツールをセットアップする)

流れとしてはまず一番最初に多くのプログラミング言語に共通する言語の構造をつかんでから勉強を始めると あとどれくらい勉強が必要で自分がどこでわかっていないのかがわかるようになるので、オススメです。

その後個別具体的な内容を順番に学習していきますが、後の流れは個別に説明を行っていきます。

1. 全体像を確かめよう

まずは全体像の把握ですが、ほとんどのプログラミング言語では下記の構文を1, 2時間程度で 入門書や、公式のドキュメントなどで確認を行っていきます。

構文は暗記すると言うよりは何度も使う中で自然と頭に入って引き出せるようになるのが大事なので、 最初の構文チェックの時は、「ふーん、こんな感じで書くのね」くらいの形で全体をざっと確認するようにすると良いです。

  1. 四則演算
  2. 論理演算の書き方
  3. 制御構文の書き方(for, while, if, switch 文)
  4. 関数の書き方
  5. クラスの書き方

このようにあらかじめ確認する書き方を網羅しておくと後から勉強し忘れていたみたいなことを防げるのでこのリストを頭の片隅において置けると良いです。

2. データ操作の基本を覚えよう

  1. で全体像をざっと把握できたら今度はデータ形式に着目して、その言語を勉強していきます。

データ形式と言うよりはデータ型なのですが、基本プログラムというのは特定のデータに何かしらの作用を加えることで欲しい結果を得るものです。

作用というと少し抽象的なのですが、もう少し具体的にして操作をまとめると下記のようになります。

  1. Create 作成
  2. Read 参照
  3. Update 更新
  4. Delete 削除

聞いたことのある方もいるかもしれませんがこの4つの操作でプログラミングのほとんどを表すことができます。

例えば文字列を例にとると (例は JavaScript で書いていきます。)

const furit = 'banana'

これで、任意の文字列を作成しています。初期化する、宣言するなどと言われることが多いですが、文字列オブジェクトを作成して変数に格納しているともいえます。 次に、文字列の先頭の 1 番目の文字列を抜き出すには、

fruit[0]

のようになります。これが 参照 Readにあたるでしょう。 そのほかにも後ろ 2 文字だけ抜き出すなども参照にあたります。

3 番目は更新ですが、文字列の場合はあまり複雑なことはないのですが、

let fruit = 'banana'
fruit = 'apple'

このように再代入すれば文字列を更新できます。(厳密には元の文字列を書き換えているというよりは新たな文字列を代入しているという方が正確です。)

最後に、Deleteは

let fruit = 'banana'
fruit = fruit.replaceAll(/[aiueo]/g, '')

// => bnn

このような元の文字列から特定の文字列を抜き出すようなものになります。 こちらのコードでは、文字列から母音を削除する処理をしています。(元の文字列の母音を空文字に置換しています。)

最初はわかりやすいように文字列で説明しましたが、人によっては配列やオブジェクトを例にとった方がわかりやすいかもしれません。 例えば、 JS の配列を例にとると配列の作成(宣言)は

/* No. 1 空配列を宣言 */
const list = []

// or

const list = new Array()

/* No. 2 都道府県の配列を宣言 */

const prefectures = [
  '北海道',
  '青森',
  '秋田',
  '山形',
   ..., // 省略
   '沖縄'
]

のように書くことができます。これがCRUD の C です。

配列のRを考えると次のようなものがあるでしょう

/* No. 1 先頭の要素を取得 */
list[0]

/* No. 2 末尾の要素を取得 */
list[list.length - 1]

/* No. 3 配列の長さを取得 */
list.length - 1

/* No. 4 配列の要素の後ろ二つを取得 */
 list.slice(list.length - 2, list.length)

更新は

/* No. 1 3番目の要素を0に更新 */
const list = [1, 2, 3, 4, 5]
list[2] = 0

のように、添字を指定することで配列の n 番目の要素を変更できます。

最後の DELETE では、

/* No. 1 3番目の要素を削除 */
let list = [1, 2, 3, 4, 5]
list.splice(2, 1)

// list => [1, 2, 4, 5]


/* No. 2 末尾の要素を削除 */
let list = [1, 2, 3, 4, 5]
list.shift()

// list = [2, 3, 4, 5]

/* No. 3 末尾の要素を削除 */
let list = [1, 2, 3, 4, 5]
list.pop()

// list = [1, 2, 3, 4]

のようなになります。

これを下記のようなデータ型に対して学習するだけで言語への入門としては半分くらいは終わると言っても良いでしょう。

  1. 文字列
  2. Boolean
  3. 数値
  4. 配列
  5. オブジェクト(key と value からなるデータ、JSではオブジェクト、他言語ではハッシュや連想配列などと呼ばれます。)

Boolean は例外的に、CRUD のような操作に当たるものはないかもしれませんが、数値は四則演算を行うことでデータの作成・更新・削除が可能で、 配列やオブジェクトなどは配列を例に取ってみたようにそれぞれの操作方法を CRUD に分類して色々と調べてみることで、言語全体への慣れが出てくるはずです。

データ型の宣言(作成)の仕方と参照の仕方は最低限でも覚えておき、更新・削除の方法はその都度調べると言う形で進めていくのがこのステップでは良いでしょう。

実際に言語を学習する際は、上記のような簡単なコードでもしっかり画面に打ち込んで実行して期待通り動くか試してみると良いでしょう。 プログラミングは動かした分だけ身になるので、普段から記事を読んで済ませるだけでなく、実際にサンプルのコードを書いて動かしてみると良いです。

3. 関数の書き方を覚える

次に、覚える構文は関数です。関数は基本的に、関数名と返り値があるのでそれを確認します。 JavaScript では、

function sum (a, b) {
  return a + b
}

const result = sum(1, 2)
console.log(result) // => 3

のようになりますが、他言語では別の書き方になるので、都度関数の書き方を確認します。 JavaaScript には、アロー関数のような別の書き方、可変長引数のような知っていると便利な書き方も一緒に調べておくと後々便利でしょう。

4. クラスの書き方を覚える

次はクラスの構文です。

クラスには

  • インスタンスの初期化
  • コンストラクタ
  • デコンストラクタ
  • インスタンス変数
  • インスタンスメソッド
  • クラスメソッド
  • 継承
  • オーバーライド
  • ゲッター
  • セッター
  • プライベート/パブリックなどのアクセス制御

などなどの構文が言語ごとに決まっていますので、JavaScript ではこうやって書くけど、Ruby ではこう、 Go では構造体がクラスに近いものだなと言う形で理解していきます。 デコンストラクタや継承などその言語にないものもありますが、その時はその概念が存在しないこと、他の方法を調べます。

初めてのプログラミングの場合などはクラスを覚える理由がわからないかもしれませんが、それぞれの概念は必ずおさえておきましょう。 これから使うであろうほとんどのフレームワークはこのクラスを使った書き方がされているので、早めに理解していると新しいライブラリやフレームワークの学習が捗ります。

参考までに、JavaScript と Ruby のクラスの例を書いておきます。 ここでは、Animal クラスを宣言して、その子クラスであるDogクラスを宣言しています。 このようなクラスが書けて、呼び出して使えるようにざっとクラスの書き方を学べると良いです。

JavaScript の例

class Animal {
  // インスタンス変数 + プライベート変数
  #name = ''
  #birthday = undefined

  // 静的メソッド(クラスメソッド)
  static kind() {
    return 'Animal'
  }

  // コンストラクタ
  constructor({ name, birthday }) {
    this.#name = name
    this.#birthday = birthday
  }

  // ゲッター
  get name() {
    return this.#name
  }

  // セッター
  set name(value) {
    this.#name = value
  }

  // インスタンスメソッド
  say() {
    return ''
  }
}

// 継承
class Dog extends Animal {
  static kind() {
    return 'Dog'
  }

  // オーバーライド
  say() {
    return 'wan wan'
  }
}

// インスタンスの初期化
const hachi = new Dog({ name: 'hachi', birthday: new Date() })

// getter の呼び出し
console.log(hachi.name) // => 'hachi'

// setter の呼び出し
hachi.name = 'hachi hachi'
console.log(hachi.name) // => 'hachi hachi'

// クラスメソッドの呼び出し
console.log(Dog.kind()) // => 'Dog'

// インスタンスメソッドの呼び出し
console.log(hachi.say()) // => 'wan wan'

Ruby の例

# クラス宣言
class Animal
  # ゲッター、セッターの宣言
  attr_accessor :name, :birthday

  # クラスメソッド
  def self.kind
    self.to_s
  end

  # コンストラクタ
  def initialize(params)
    # インスタンス変数の宣言
    @name = params[:name]
    @birthday = params[:birthday]
  end

  # インスタンスメソッド
  def say
  end
end

# 継承
class Dog < Animal
  # オーバーライド
  def say
    'wan wan'
  end
end

# インスタンスの初期化
hachi = Dog.new(name: 'hachi', birthday: Time.now)

# インスタンス変数の参照(getter の呼び出し)
puts hachi.name # => 'hachi'

# インスタンス変数の書き換え(setter の呼び出し)
hachi.name = 'hachi hachi'
puts hachi.name # => 'hachi hachi'

# クラスメソッドの呼び出し
puts Dog.kind

# インスタンスメソッドの呼び出し
puts hachi.say

5. デバッグの方法を調べよう

続いては、デバッグの方法についてです。一番手っ取り早いのは「JavaScript デバッグ」などと言語名で検索して、最近使われているデバッグのやり方を解説している記事を参考にすることです。

デバッグの仕方としては、

  1. プリントデバッグ
  2. ステップ実行
  3. 書き捨てのコードの書き方
  4. Web上の実行環境

あたりは知っておくと良いでしょう。

  1. については、誰もが最初に行うであろうデバッグ方法であろうと思いますが、JS なら console.log 、Ruby なら puts、Go なら fmt.Println などなど値を標準出力に表示するメソッドがあるのでそれを調べておくことです。

  2. については、特定のコードの箇所でプログラムの実行を止めて一行ずつ変数の中身などを見ながら挙動を確認する方法です。js なら debugger、Ruby なら byebug/debug など言語ごとにツールがあるのでそちらを実際に試してみて

ステップ実行の方法を探っておきます。 VSCode などのエディタを使っている場合はそちらでのデバッグ方法も一緒に調べておきましょう。

  1. 書き捨てのコードと言うのは、実際に作っているアプリのコードとは別に脇で挙動を確かめるコードのことです。コードの細かい挙動を確かめるときは実際に動かしてみて確かめるのが一番確実なので、

最小のコードを書いて挙動を確認します。例えば、ブラウザの検証ツール>コンソールタブでは直書きでJSを実行できるので、僕はよくそこで小さいコードを動かしてみて自分の書いたコードが正しく動くか確認します。 Rails では、rails console を開いてコマンド打ちながら検証をします。そのほか各言語で同じような方法があるのでこれもあらかじめ確認しておきます。

  1. Web上の実行環境ですが、これは3. と似ていますがブラウザ上でコードを実行できる環境を用意すると言うことです。とはいえ、自前で用意するのは面倒なのでそれ用の環境を調べておきましょう。

JSならCodepenCodeSandbox などが便利ですし、Go なら Go の Playground が便利です。 こちらは別にローカルでコードを書いて確かめても良いのですが、いちいちターミナル開いてファイル作ってなどなどしていると結構面倒なので、インストールの手間などを省いてコードを書き始めらる環境にアクセスできるようにしておくと良いです。 コードを書くハードルを下げることができるので、より確実な知識が身につきやすいです。

デバッグの方法ですが、プログラミングに慣れるまではコードの振る舞いの確認のやり方がわからなくてハマると言うことばかりなので、なるべく早い段階でこれらの方法を習得すると良いです。 勉強始めて数ヶ月立ったのに、コードに console.log 入れて動かして、思った出力が出なかったから別の場所にconsole.log 入れて動かしてみたいにしていると結構簡単に時間が溶けるので、 ステップ実行で一つずつ確認した方が、より解像度高く実行中の状態を確認できてコード全体の理解度が上がったりします。ステップ実行をすると変数の型やその実行可能なメソッドなども確認できるので、最初のうちは多用するのがおすすめです。

6. コードを書いて動かしてみよう

ここまで準備ができたらあとはコードを書いて動かしてみるのみです。最初は簡単なコードから書き始めて、徐々に複雑なアプリを作っていくようにしましょう。 最初はスムーズにコードが書けないので、一ファイルで完結するようなコードを書きましょう。それが終わったら複数ファイルにしてみてディレクトリで区切ってみたいにしていくと徐々に新しい言語で複雑なコードをかけるようになってきます。

この段階では新しい言語の習得がメインなので、画面もDBも全部あるようなしっかりしたアプリを作ると言うより LeetCode などアルゴリズム系の言語の細かい挙動がわかるコードを書くようにすると良いです。 (アルゴリズム系のものは最初から解き方がわかっているけど、その言語では解いたことがないやつを選べると良いでしょう。) あまり複雑なアプリだとハマって調べることに時間を使いすぎて全然コードを書いていないと言うような感じになってしまうので、言語を指に馴染ませる感じでタイプできるコードを書くと良いでしょう。

新しく触る言語だと、頭でロジックはわかるけどそれを正しいコードにできない(シンタックスに慣れていない)と言うところを解消すると言うのが第一なので、それを念頭にどんどんコードを書いていきましょう。

7. 言語に特徴的なことを調べる

6 までしっかりやり切ればあとは経験を積むだけと言うところなのですが、さらにその言語を追求するためにはより発展的な内容やその言語に特徴的な機能を触るようにするとその言語への理解が深まっていきます。 JS なら async/await や クッキーの操作、DOM操作 など ブラウザに依存した内容の学習であったり、非同期通信などがありますし、Ruby ではメタプログラミング、Go なら ゴルーチン などそれぞれ特徴的な機能があるので、 それを一つずつカバーするようにしていくとその言語の習熟度が高まるでしょう。

この辺りの勘所は何か一つ言語を深くやり込むとそのほかの言語にも同様の機能へのあたりが付きやすくなるので、複数言語を学ぶにしても一つはメインの言語を決めると良いでしょう。

8. 書き方のバリエーションを増やす

その他、より言語について知る方法としては、

  1. 公式のドキュメントを隅々まで読む
  2. 静的解析ツールをセットアップする
  3. 積極的にコードレビューをする
  4. OSSのコードを読む
  5. 面接の問題集を解いてみる

などがあります。

  1. 公式のドキュメントはやはり体系的に網羅された情報が乗っているので、時間ができた時にまだ読んでない部分を読んでみるだけでもより細かく

言語を理解できるでしょう。2. の静的解析ツールは JS であれば Eslint、Ruby であれば rubocop など静的解析ツールがあるのでそれらを自分のプロジェクトにインストールするだけで、 良くない書き方をしている部分を指摘してくれます。それを順番に解決していくことで良い書き方が身につくのでこれも言語の理解を深めるのに良い手順になります。

  1. のコードレビューでは、すでに現場に入っている場合は現場で積極的にコードを見て、「自分だったらどう書くか?」「自分の知らない書き方はないか?」と言う観点でコードレビューをするようにすると、

コードリーディング力や言語自体を深めることができます。これと同様に 4. OSSのコードを読むのもコードの理解を高めるのに有効です。自分の使うOSSであればそのOSSに対する理解を深めることもできるので一石二鳥でしょう。

その他だと、「javascript interview questions」などと調べると面接で聞かれる言語に対する質問が出てくるのでそれらを順番に解いてみると言うのは自分の知らない or 理解のあやふやな部分を炙り出すのに有効です。

まとめ

以上、ここまでの

  1. 全体像の把握
  2. データ操作の方法を覚える
  3. クラスの構文を覚える
  4. よく使う処理(JSONへの変換、型変換、ファイルの入出力、HTTP通信)の書き方を確認する
  5. デバッグの方法を調べる、環境を整える
  6. 実際にコードを書いて動かしてみる
  7. その言語の特徴的な機能を学習してみる
  8. 書き方のバリエーションを増やす(公式ドキュメントを読み込む、他人のコードを読む、面接問題集を解いてみる、静的解析ツールをセットアップする)

流れが習慣的にできるようになるとどの言語も数日でプロジェクトに入る準備はできるようになるでしょう。 もちろん数日で言語をマスターすると言うことができないですが、始める前の準備としては十分であとは 7, 8 のステップを習慣的に行ってレベルアップしていけばそこまで長くかからず、その言語に習熟できるはずです。

こういったある程度の枠組みがあると新しい言語の習得にも尻込みしなくなるのでぜひ参考にしてみてください。

目次