どうも。つじけ(tsujikenzo)です。今日は単発で、「プログラミングのスキルアップに第3言語を学んでみよう(Java編)」をお送りします。
ノンプロ研ZoomIn
「ノンプログラマーのためのスキルアップ研究会」は、ノンプログラマーがプログラミングをはじめとするITスキルを学び合うコミュニティです。
ノンプロ研では、毎月1度、有志によるLT大会が行われます。今回久しぶりに登壇しましたので、資料を残しておきたいと思います。
また、JPINという夜間インターンプログラムに参加してJavaを学んでいます。
こちらも合わせてご紹介させていただきます。
今日のアジェンダ
- 第3言語とはなにか
- Javaってどんな言語
- Javaをまなんでまなんだこと
第3言語とはなにか
わたしにとって、プログラミングをまなぶ目的は、時間コスト削減です。
プログラミングと人類がどう関わりあうのか、という文脈では、プログラミングの本質は「人類のムダなコストを省くこと」だと思っています。
そんなわたしのような社会人ノンプログラマーにとって、第1および第2~3言語をまなぶ、ということはどういうメリットがあるのかを、お伝えしたいと思います。
第1言語をまなぶ
わたしはVBAのレコーディングマクロをコピペで動かす、プログラミング初心者でした。(制御構文が書けませんでした。)
ちゃんとプログラミングの勉強をした第1言語は、Google Apps Script(以降、GAS)です。
GASを選んだ理由は、パソコンがないと作業ができないExcelとVBAから、インターネットがあればどこでも作業ができるスプレッドシートと、定期的にプログラムを実行できるGASに切り替えたかったからです。
GASをまなんだおかげで、メール送信やフォーム集計など、かなりの業務効率化を実現しました。
第1言語を選ぶうえでオススメなのは、日々の業務時間を短縮してくれるプログラミング言語です。
第2言語をまなぶ
GASでかなりの業務効率化を行いましたが、ブラウザ操作やPDF操作などは手作業のままでした。
そこで、業務効率化により空いた時間をさらに学習に投資して、第2言語としてPythonやVBAの勉強をしました。
Pythonでは、一時期大ブームになったデータアナリティクスの学習も行いました。
初級程度で終えましたが、データアナリティクスが中小企業の経営にどう関わってくるのか、を判断できるようになりました。
PythonやVBAなどの第2言語は、「本当に必要なものは、プロに開発をお願いしよう。」というのが今の基本スタンスです。
言語を理解して要件定義を素早くできることが、見積もり単価を下げることにつながっています。
第3言語をまなぶ
第1言語と第2言語で、「動くもの」はなんとか作れるようになりました。
便利な関数は再利用しようと考えてパーツ化しましたし、アプリケーションも多くなってきました。
はじめは、「増えたものを整理する」ことを試みます。
ソースコードのフォルダ分けをしたり、ドキュメントを用意したり、パーツに名前を付けたりする作業です。
しかし、パーツ化して整理したところで、肝心のソースコードを見てみてると、ロジック部分に何を書いているのかさっぱりわからないのです。
//素データの精査に入っていく
for(let i=1;i<=dataLastRow;i++){
let value = ss.getRange(i,1).getValue();
//商品Aを検索する
let select = value.match(/商品A.*/g);
//10,000以上の値段
let fee = value.match(/\d{2,}(?:,\d{3})/g);
//商品Aと10,000以上のデータのみで作業する
if(select&&fee){
//条件をさらに満たしたものを正規化していく
let oneSelect =select[0].slice(0,-2);
let id = value.match(/m\d{11}/g);
let oneId =id[0];
//newDataに素データのIDが有るか無いか検索をかける
そこで「どうやったら後で読みやすいプログラミングができるんだろう。」「書き方をマニュアルなどで強制するのではなく、自然と同じような書き方になるプログラミング手法ってないんだろうか」と思い始めました。
つまり、「共通したプログラミングの設計手法」 の習得です。
そのときに出会ったのが、みなさん大好きオブジェクト指向プログラミング(以降、OOP)です。
OOPをまなぶために選んだのが、第3言語であるJavaです。
Javaってどんな言語
公式アピール
Javaの正規販売業者はアメリカのオラクル社です。
オラクル社によると、全世界の3億のコンピュータデバイスでJava実行環境が動作しており、全世界の200万の人員がJava開発環境を使用しているようです。
そんなオラクル社は、公式サイトでJavaをこのように説明しています。
Javaは、コストを削減し、開発者の時間枠を短縮し、イノベーションを促進し、エンタープライズアーキテクチャ、財務、およびHRに最適なプログラミング言語としてアプリケーションサービスを改善します。 Javaは、製造・自動車・保険・公共部門などの多くの業界で使用されています。
ここで注目したいのが、ひとこと目にJavaは 「コストを削減するプログラミング言語なんだ」 と言っていることです。
オブジェクト指向
Javaはカプセル化、継承、ポリモーフィズムなどのプログラミングにおける技術や概念を導入しています。
これらの技術や概念は、「同じ処理は重複して書かない」とか、「一部を変更しても全体に変更の影響を与えない」などにより、コスト削減を実現しています。
Write Once, run Anywhere
Javaには「一度プログラミングを書いたら、どこでも動くよ」という特徴を売り文句にしています。
Windows用に書いたプログラムが、MacやLinuxや、一般家電商品の中でも動けば、とても楽です。
ほかにも、コストを削減するための、さまざまな仕組みがあります。(詳細は割愛します)
Javaってどこに書くの?
VBAはExcel、GASはスプレッドシートのコンテナバインドスクリプト、PythonはJupyterNoteBookやVS Codeなど、ソースコードを書く場所をイメージできますが、Javaはあまりなじみがないかもしれません。
Javaの、もっとも原始的なソースコードを書く場所と動く場所は、みなさんが使っているパソコン上です。
JDKというJavaの開発環境(アプリケーションのようなものです)をダウンロードしてインストールすると、メモ帳とコマンドプロンプト(Macだとメモ帳とターミナル)だけで、Javaは動きます。
インターネットには、「Javaをタイピングして実行してみよう!」というサービスがありますので、写経が好きな方はこちらもオススメします。
他には、eclipsのようなIDE(統合開発環境)が無償で提供されていますので、オススメです。
ただし、eclipsは便利すぎて、まなびの機会が失われている可能性もあります。
「コンパイル」を理解するためには、メモ帳とコマンドプロンプトで学習してみて、後ほどIDEに移行するのもいいかもしれません。
Javaをまなんでまなんだこと
Javaをまなび始めてまだ日が浅いですが、Java Silverという認定試験を取得したり、書籍を読んでまなんだことがあります。(Javaをまなぶと、読める本が増えるのでとても楽しいですよ!)
設計とは目的を達成すること
設計には、「アプリケーションの品質を高める」という目的があります。
品質にも「高セキュリティ」や「保守が楽」や「移植しやすい」や「効率がいい」など、さまざま価値があります。
なので、アプリケーションにどんな品質を求めるのかを考えることが、設計の第一歩となります。
2つの設計アプローチ
プログラムは、上から下に順次流れていくので、必要な処理を上から書くと楽です。
単に、Hello, world!を出力するだけなら、以下のように書くのが楽です。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
ちなみにこれを「構造化プログラミング」だとか「手続き型」だと呼ぶことに、あまり意味はないと思います。(正確には命令型プログラミングです。)
そもそも「サブルーチンやモジュール」といった要件を満たしていませんし、「べた書きプログラミング」とでも呼ぶ方がいいと思います。
この設計の目的は、「処理を目で追いやすく、すぐ動くコードを書きたい」 です。
さて、このプログラムを、OOPで書くとどうなるでしょうか。
プログラムの部品は、2つに分けられそうです。
package hello;
class Launcher {
public static void main(String[] args) {
Service service = new Service();
service.hello();
}
}
package hello;
class Service {
void hello() {
System.out.println("Hello, world!");
}
}
まったく同じ結果(Hello, world!)を出力するコードですが、oopでは、
- LauncherクラスとServiceクラスを分けた
- クラスをPackage化した
- アクセス修飾子(デフォルト)を使って、外部のPackageから呼び出せないようにした のような設計をしています。
この設計の目的は、「どこに何が書いてあるかわかりやすくし、修正や拡張が楽で安全になるコードを生み出す」 です。
設計とコスト
べた書きで書く設計は、学習コストが低く、プログラミング初心者でも書きやすい設計です。
規模の小さなプログラミングに適していて、すぐ動くことが最大のコストパフォーマンスです。
OOPによる設計は、学習コストは高くなりますが、大規模なプログラミングにも耐えられる設計です。
それぞれ、メリットデメリットをまとめてみました。
設計の目的を意識して、どちらを採用したほうがいいのか、柔軟に考えるのがいいのかなと思いました。
まとめ
以上で、「プログラミングのスキルアップに第3言語を学んでみよう」をお届けしました。
プログラミングを設計するときは、必ずOOPがいい、という話ではありません。
むしろ、「Javaのような静的型付け言語ってイマイチだよね」ということで注目を浴びたのが、JavaScriptのような動的型付け言語のスクリプト言語です。
スクリプト言語には、解決したい課題が別にあり、最適なプログラミング設計方法はOOPではありません。
では、JavaScriptやGASにとって、最適なプログラミング設計方法とは、どのようなものでしょうか。
わたしは、第3言語をまなぶことで、第1言語を改めて勉強しなおすきっかけを発見しました。
これから、少しずつブログにも書いていきたいと思います。