派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】『プログラミング言語図鑑』の著者が教える「次の言語は何にする?」

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

8月24日に開催したイベントは、『プログラミング言語図鑑』の著者である増井敏克さんによるセミナー。「次の言語は何にする?」と題して、プログラミング言語の選び方、学び方などを教えていただきました。

■今回のイベントのポイントは……

・複数の言語を学んでいれば仕事の幅が広がる&人気に左右されない
・「ハノイの塔」のアルゴリズムで言語の違いを知る
・次に学ぶプログラミング言語を選ぶ際は、目的や環境などさまざまなことを考慮に入れる

どんなプログラミング言語から始めたらいいのか、2つめ、3つめにはどれを選べばいいのか、知っておきたい言語の選び方、学び方の指針がわかります。

【講 師】増井敏克さん

▲【講 師】増井敏克さん
増井技術士事務所代表。技術士(情報工学部門)。情報処理技術者試験にも多数合格。ITエンジニアのための実務スキル評価サービス「CodeIQ」にて、アルゴリズムや情報セキュリティに関する問題を多数出題。また、ビジネス数学検定1級に合格し、公益財団法人日本数学検定協会認定トレーナーとしても活動。著書に『おうちで学べるセキュリティのきほん』(翔泳社)、『プログラマ脳を鍛える数学パズル』(翔泳社)、『シゴトに役立つデータ分析・統計のトリセツ』(ソシム)、『エンジニアが生き残るためのテクノロジーの授業』(翔泳社)がある。

プログラミング言語の種類は、なんと1500個以上!

増井さんは、エンジニアのための実務スキル評価サービス「CodeIQ」にて、プログラミングの問題を作成し、出題しています。3年に渡り「今週のアルゴリズム」という問題を毎週作り、さまざまなソースコードを読んできました。そのため、必然的に多くの種類の言語が読めるようになったのだそうです。

当日の参加者に挙手をしてもらうと、ソースコードを書く機会がない人が全体の1/3ほど。言語を作っている人はゼロでした。

イメージ

ところで、プログラミング言語は世の中にどれくらいあるのでしょうか?
有名なものがスライドに映されます。

Java
・C
PHP
・Objective-C
C++
JavaScript
C#
・Python
・Visual Basic

ここで、「99 Bottles of Beer」というサイトが紹介されました。このサイトは、マザーグースの歌詞を出力するためのさまざまなプログラムコードが掲載されており、たくさんの言語が扱われています。少なく見積もっても、1500個以上のプログラミング言語でコードが書かれているそうです。

英語や日本語など、自然言語は人を相手にするため、相手が理解できないと意味がありません。ところが、プログラミング言語は、新たに作ってもコンピューターにだけ教えればいいので作りやすいのです。また、膨大な単語数が必要な自然言語に比べて、プログラミング言語は最低限あればいい。従って、次から次へとプログラミング言語は生まれ、どんどん増えていきます。

イメージ

複数の言語を学ぶメリットと言語による違い

さまざまなプログラミング言語が増えているなか、エンジニアは「ひとつの言語を徹底的にマスターする」「複数の言語が使えるようになる」のどちらがよいのでしょうか?増井さんは「ひとつの言語で生きていくのも悪くないが」と前置きしつつも、次のようにアドバイスをします。

「案件によって求められるスキルが異なります。例えば、C#を使った案件が常に一定数あるというわけではなく、増えたりも減ったりもします。人気の言語も変動していきますから、リスクはあります。仕事の幅を広げていくことを考えると、複数できた方が有利でしょう。複数の言語を学ぶと、違う視点で考えられるというメリットもあります」

イメージ

違う視点の例として、命令型(手続き型、オブジェクト指向)と宣言型(関数型、論理型)の違いが示されました。命令型では、処理の手順を記述するため、スライドの例ではループを回して最後に「合計金額」を返します。宣言型は、定義をコンピューターに伝えるので、変数を書き換えてループするようなことはしません。それぞれ異なる考え方なので、複数の言語を知っていると開発期間の短縮などにつながるかもしれません。

「ハノイの塔」のアルゴリズムで比べる言語の違い

イメージ

言語の違いは、書籍「プログラミング言語図鑑」でも紹介している「ハノイの塔」の例を使って説明されました。3本の棒と、大きさの違う円盤からなるパズルで、「円盤は1枚ずつしか動かせない」「小さな円盤の上に大きな円盤は置けない」というルールのもと、すべての円盤を移動することをゴールとします。円盤の枚数に応じて、すべての円盤を移動するまでの手順をプログラムによって調べます。手順を「a -> b」のように出力すると、これは「aの棒からbの棒へ円盤をひとつ動かす」ということを意味します。これらのアルゴリズムの説明をされてから、具体的なソースコードの紹介となりました。

C言語の場合は以下の通り。

#include <stdio.h>

void hanoi(int n, char from, char to, char via){
  if (n > 1){
    hanoi(n - 1, from, via, to);
    printf("%c -> %c\n", from, to);
    hanoi(n - 1, via, to, from);
  } else {
    printf("%c -> %c\n", from, to);
  }
}

int main(void){
  int n;
  scanf("%d", &n);
  hanoi(n, 'a', 'b', 'c');
  return 0;
}

「1枚より多く残っていたら」というif文により条件分岐しながら、上から下へ処理を記述していくのです。このような手法を用いて、論理的な構造を単純化して記述する方法を、構造化プログラミングと呼びます。

ここで、「Ideone.com」というサイトが紹介されました。コンパイラなどの環境を整備しなくてもソースコードを実行できる便利なサイトです。実際に、上記のコードをサイトに貼り付けて「stdin」から円盤の枚数を入力し、「Run」ボタンを押してみました。すると、結果が正しく返ってきます。

イメージ

次に、Javaのソースコードを紹介しました。

import java.util.*;

class Hanoi{
 private void hanoi(int n, char from, char to, char via){
  if (n > 1){
    hanoi(n - 1, from, via, to);
    System.out.println(from + " -> " + to);
    hanoi(n - 1, via, to, from);
  } else {
    System.out.println(from + " -> " + to);
  }
 }

 public static void main(String args[]){
  Scanner cin = new Scanner(System.in);
  if (cin.hasNext()){
    int n = Integer.parseInt(cin.nextLine());
    Hanoi h = new Hanoi();
    h.hanoi(n, 'a', 'b', 'c');
  }
 }
}

Javaはオブジェクト指向言語なので、クラスに対する制御を記述していきます。その後HaskellやWhitespaceでもソースコードを紹介し、それぞれの違いを見ていきました。

イメージ

次に学ぶプログラミング言語の選び方

プログラミング言語は、すでに述べたようにたくさんの種類がありますが、まず大事なのは「ひとつを使えるようになる」こと。正しく動くものを、自分で作れるようにしましょう。そして、「Hello World」が出力できるところから。さらに、最低限のアルゴリズムやデータ構造を知っておくとよいでしょう。ソートや探索のほか、配列やリスト、連想配列、構造体などを理解しておけば、2つめの言語をマスターするスピードが速まります。

1つめ、あるいは2つめ以降の言語を選ぶポイントはいくつかあります。

・身近に教えてくれる人がいる
身近に教えてくれる人がいれば、何かあったときに聞けるのでつまずくことが減ります。

・作りたいソフトを考え、適した言語を選ぶ
作りたいものを決めることが大切です。スマートフォンのアプリと、Windowsのデスクトップアプリでは、使用言語が異なります。

・実行環境、配布を整える
ソフトを開発する場合、配布も合わせて考えておいた方がよいでしょう。作ったものを誰かに使ってもらおうと考えたときには、バグがあったときの対応まで考えておく必要があります。

・開発環境を考える
開発するための環境も必要です。例えば、C#ならVisual Studioなどがありますが、会社のパソコンで使用が禁止されている場合もあります。WindowsやMacなど、開発する環境によって選ぶ言語が変わってくることもあります。

イメージ

ほかに、「今後注目されそうな言語」を選択するのもひとつの方法です。例えば、フレームワークが充実したものもひとつ。PHPなら、フレームワークが充実しており、一つも使っていない人はほとんどいないと思われます。また、統計や分析に有利なライブラリが用意されているR言語も最近の注目株です。Pythonは、ディープラーニングをはじめとしてさまざまなライブラリが揃っているため、人気が高く、書籍もよく売れているようです。

他には、それぞれの環境で「標準」とされているものも広まりやすいそうです。iPhoneアプリなら「Objective-C」から「Swift」へ、Androidアプリなら「Java」から「Kotlin」へと、標準として指定されることにより流れが変わっていきます。

新しい言語の学び方、学びの深め方

言語を覚えるには、とにかく手を動かすことが大切。現在はオープンソースも増え、たくさんのソースコードを読めますが、読むだけでなく書いてみましょう。サンプルコードを読む際にも、実際にキーボードで入力してみます。インデントの書き方や実行の手順などを学べると共に、実行すればエラーメッセージが出るはず。そのエラーメッセージを修正していくプロセスこそが大切なのです。

イメージ

書籍で学ぶ場合には、3冊用意してみましょう。それぞれのタイプは「入門書」「詳しい本」「逆引きの本」がおすすめ。それだけでわからない場合、動画サイトも便利です。「ドットインストール」「Schoo」「YouTube」などのサービスでは、レクチャー動画が無料で参照できます。

学んだことをブログなどでの記事にして、TwitterやFacebookで公開したり、ソースコードをGitHubなどに公開するのもおすすめです。アウトプットは考えを整理するのに役立ちます。

「これを学んでおけば絶対に大丈夫」という言語はありません。時代と共に流行もニーズも変わっていくもの。例えば、流行に乗るより、人と違う言語をマスターしている方がニーズの高い場合もあるかもしれません。ただ飛びつくのではなく、やりたいこと、目的、環境など、その言語を学ぶ理由を明確にすると、次に学ぶ言語が見つかるのではないでしょうか。