GoTheDistance

ござ先輩と言われています。(株) クオリティスタートという会社をやっています。

Javaで「はじめてのプログラミング」を教えるのはキツイと思った話

2017年4月から人生初めての新人研修講師を務めさせて頂くことになりました。プログラミング入門がテーマです。

先方は昨年までJavaでカリキュラムを組んでいたんですが、JavaをやめてPythonでやらせてもらえないかと提案し快諾頂きました。プログラミングの入門書を書いたから特に感じることなんですけど、Javaはプログラミングの初学者に向いていない言語だと思います。

クラスありきの言語設計

それがJavaの良いところでもあると思いますが、プログラミング自体が初めての方を対象に考えた場合、はじめの一歩として不適切だと感じます。

Hello Worldが重たすぎる

お馴染みのHello Worldです。初めてのプログラミングで以下のコードを見たら、何のことやら分からないでしょう。

public class Test {
    public static void main(String[] args) {
       System.out.println(“Hello World!”);
    }
}

これをどうやって初心者に説明したら良いのか… クラス/関数/引数/配列/名前空間等/エントリポイント等の概念が全部まとめて出てきます。とりあえず「おまじない」で通すとしても、はじめの一歩からおまじないというパワーワードに逃げるのは筋が悪い。PythonPHPならprint/echoするだけなので、体で覚えやすい。

Javaコンパイルが必須

コンパイルのような環境構築を伴う作業は、ハードルが高い。環境変数をセットしてjavacコマンドを叩くなんて、人生でターミナル起動したことがない人には恐れ多い。IDEをインストールしろって初学者に言い放つのは「とりあえずこの栄養ドリンクをがぶがぶ飲めや」って話に近い。

その点、インタラクティブシェルがある言語はやりやすいです。そこで練習してから、ファイルを指定して実行できるようになれば良い。

サーブレットが鬼門となる

これは聞いた話なんですけど、サーブレット(Servlet)が鬼門になるそうです。【Java/Web再入門】その2.サーブレットを作ってみよう - KnowledgeFortよりServletのサンプルコード引用させて頂き、簡略化しました。

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet002 extends HttpServlet {

	@Override
	public void doGet(HttpServletRequest aRequest, 
                                HttpServletResponse aResponse) {
		try {
			aResponse.setCharacterEncoding("UTF-8");
			aResponse.setContentType("text/html");
			PrintWriter _writer = aResponse.getWriter();
			_writer.println("Hello World");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return;
	}
}

これが正しいかは置いといて、あまり直感的じゃないです。HTTPやHTMLが理解できていないと、上記のコードの意味はわからない。わかってから書けよって話は、初学者にはちょっと可哀想。サーブレットを動かすための環境設定も必要で、動かす前に覚えないといけないことが多くて大変です。クラスローダーも理解しないといけない。

Pythonだとすげー簡単です。ビルトインサーバの機能を使いつつ、マイクロフレームワークWelcome | Flask (A Python Microframework)を使えばこれだけで同じことが出来ます。

  @app.route('/')
  def hello():
     return 'Hello World'

プログラミング入門と言語の入門は別の話

これは自分が本を出した問題意識に直結しますが、プログラミングの学習には「プログラムに落とすための考え方」と「プログラミング言語の仕様、動くコードの書き方」の2つがあります。プログラミング自体の入門と、プログラム言語の入門は、別の話です。Javaが初心者に向かないと感じたのは、前者を学ぶのにJavaの思想が前に出すぎているからです。プログラムを書く考え方が怪しい状態で、Javaの思想や仕組みを理解しないと動くコードが書けないのは可哀想だと思いました。

プログラミングでいちばん重要なのは、論理に落とし込む文章化能力だと思います。アウトラインを描き上げる力が最も大切。それがないと、プログラミング言語が提供する技術で何を表現したら良いか、判断がつかないからです。掛け算と一緒で、ゼロに何をかけ合わせてもゼロなんで。

企業向けの研修では未だにJavaが主流のようだけど、個人的にJavaでプログラミングの入門を上手く説明できる自信がありません。はじめの一歩にJavaは正直オススメできないし、そのスタンスでご納得頂いてお仕事を頂いてきたので、「実はオレもそう思ってたんだ」層に届けばと思って、記事書きました。

プログラミングの入門書を書きました

Pythonの書き方は僕よりも優れたプログラマの方がたくさん本を出されています。サクッと「プログラミングってなんだろう、どーゆーことをするんだろう」という要点をつかみたい方には、手前味噌も良い所ですけど自信を持って自著をおすすめします!

独習Python入門――1日でプログラミングに強くなる!

独習Python入門――1日でプログラミングに強くなる!

SQLを学習できるWebサービスを作りました。