Java屋さんの私がPythonをはじめる理由

# この記事について

対して詳しくもないのにやたらPython!Python!って言ってたら、
ある勉強会でPythonについてなんでもいいから語ってくれと言われネタをまとめたものです。
まともに長文のブログを書くの初めてなので文章の繋がりとかぐちゃぐちゃですみません。

# Pythonをやりたくなったきっかけ

Javaを15年ほどやってきて、Javaでの環境やビルド方法の面で時間がかかることが気になっていました。
また小さい会社で受託開発したいので素早く低予算で作る必要があり、
ビルド環境を用意するだけでまあまあなコストを使うのは効率的ではないと感じました。

## すべてをJavaで書く意味はない

我々技術者は、つい目の前の問題に対して自分ができる方法を使って対処しようとします。
プログラミング言語を選択するうえでそれは大きく影響するでしょう。
大規模なシステム構築のみならず簡単な機能でさえ今ある開発環境と知っている言語で実装しようとします。
確かにそれは合理的な点もあってJava技術者が溢れる今は技術者を簡単に調達できることや統一された技術によって保守しやすい面もあります。
また静的な型付けのため実行時のエラーを少しでも減らすことが大規模システムで利用されるひとつの理由かもしれません。
でもいまあなたが書けるというだけでJavaを選ぶのってどうなんでしょう？
あなたが書けるという理由でお客様のシステムをJavaで構築すべきなのでしょうか。

## それでもJavaで書くべきですか？(私がJavaを嫌がる点)

### 開発環境が複雑

ant, maven, gradleなどビルドを補助するものがありますが、難解な定義ファイルで大きいシステムになればなるほど複雑になります。
疎結合のための仕組みもわかるけど、疎結合であればあるほど複雑になりますね。
私はもう十数年もやってるしStruts全盛期より今は便利になっていることもわかります。
でもプロジェクトのみんながわかりやすいものではないですよね。

### 重い

Webアプリケーションの場合TomcatやWeblogicなどのアプリケーションサーバにデプロイするとき、依存するライブラリはjarやwarとなってすべてメモリ上に乗ります。
Javaで並列実行するバッチを実装する場合は単独プロセスとして実行するのは難しくなります。
プロセス単位でギガバイトサイズのメモリを使うとなればバッチでもアプリケーションサーバに乗せる必要があるでしょう。
並列実行するぐらいの大規模なシステムではバッチごとに依存関係を考慮し実行によってjarの依存を減らすというメモリ節約方法も現実的には難しいでしょう。

### 動作確認に時間がかかる

一か所修正するだけでビルドやデプロイに時間がかかります。
多くのエンジニアは機能を実装するとき繰り返しビルドと動作確認をしますが、
数秒～数十秒のビルド&デプロイも積み重ねると結構な工数です。
待ち時間のために工数がかかるのはとても勿体ない。
また時間がかかるのはエンジニアのストレスにもなります。
展開デプロイならもう少し早くはできますが、それだとリリース時と同じ状態ではないので別のトラブルが待っています。

# スクリプト言語ならという期待

以前、PHPでシステム開発したときに高速にデバッグできることを思い出しました。
スクリプト言語ならもっとスムーズに開発できるのに。そう思ったのがきっかけです。

そこで比較する言語は以下のものに絞りました。

* PHP (スクリプト言語)
* JavaScript (スクリプト言語)
* Python (スクリプト言語)
* Ruby (スクリプト言語)

# 各プログラミング言語の特徴(Java屋さん目線)

## Java

* 仕事は豊富(今はね)。
* 大型案件が多い。
  * 出向から逃れられない。
    * 若手はJavaを避ける。
      * 今後若いJava技術者減りそう？
    * 社内人材育成しづらい。
* パッケージ管理ツールが好きになれない。
  * ant, maven, gradle
  * [jEnv](http://www.jenv.be/)ならいいのか？
* デバッグ面倒
  * いちいちwar作ってデプロイ
  * 展開デプロイでもいいけどね。

## PHP

悪くはないんです。でも。。Webページの延長上というイメージです。
HTML生成以外では使いたくない。
PHP: Hypertext Preprocessorなんですよね。
悪くはないんです。。

```php
<?php
// この囲い方がHTMLとロジックを混ぜる前提っぽく見えてちょっと拒絶反応してしまいます。
?>
```

* クラス書くときJSPにClass宣言をするようで違和感がある。
* スクリプトレット必須なのが違和感がある。
* タグと処理が混ざる書き方が多い。
* 綺麗に書く意識少ない(勝手な)イメージ。
* 動けばいい的なエンジニアが多い(勝手な)イメージ。
* 初心者の導入がしやすいらしいが私は正直書きにくい。
* なぜか単価低い(やってることあまり変わらないのに)
  * 単価低いから早く作らねばならないから低品質になる
* テンプレートエンジンとか使わない？
  * 意識高い人や現場は使ってると思う

### (おまけ)PHPが元気な理由

WordPressというCMS界最強のライブラリがある

* [日本国内では94% (2019/01現在)](https://trends.builtwith.com/cms/open-source/country/Japan)
* [世界では72% (2019/01現在)](https://trends.builtwith.com/cms/open-source/)
* [【圧倒的なWordPressシェア】世界と日本で有名なCMSシェアを徹底比較！](https://webst8.com/blog/wordpress-cms-share/)
* [CMSを比較 | 世界シェアから見るおすすめツール紹介・導入前に検討すべきこと](https://boxil.jp/mag/a3813/)


## JavaScript

最初最有力候補でした。Webシステムの呪縛である？JavaScriptだけど、マスタできればついに一つの言語でWebシステム作れるわけですよ。ただ、書きたくないし読みたくない。

* Webアプリケーションを作るときほぼ必須となる言語。
* これまではフロントエンドの処理を行うために使われてきた。
* 正直読みづらい、書きたくない。
* Node.jsを使う事でフロントエンドとバックエンドで言語統一できるのは素晴らしい。
  * 大量リクエストでハードなI/Oの処理が得意
  * 1リクエストごとが重いCPU使いまくる処理は苦手
* ElectronでWindowアプリケーションも作れる
  * ChromiumとNode.jsによってWeb技術を使ってWindowアプリケーションが作れる
  * 代表例: Atom(テキストエディタ)

# Python

今の一番のお気に入りです。何よりも読みやすいのが気に入っています。
プログラムは書くことより読むことの方が圧倒的に多いですからね。
それ以外では今人気の機械学習に強いのところもいいですね。

* 読みやすい(保守しやすい)
* 機械学習得意。
* プログラミング学習の基礎で選択される
  * 教育現場ではScratch卒業後はPython
* Linux標準搭載
  * centos(python 2.7)
  * ちょっとしたバッチ作りやすい
* 世界的な人気すごい
* 2018年は案件が東京ばかり(2019年に期待)
* switchない(これはちょっと驚き)
* アクセス制限弱い
  * protectedない
  * privateもクラス名含めて書くとアクセスできる
* オーバーロードがない(これはびっくりした)
  * 可変長引数とメソッド内の条件分岐で対応する・・・いや、まあできるけど・・

# Ruby

Pythonと同等の候補としてRubyを検討していたのですが、
調査すればするほど微妙に思えてきました。

* Railsは本当にすごい
* 複数行コメントがちょっと微妙

```ruby
=begin
これはナイでしょう・・・
と思ってしまった
IDEならショートカットキーひとつでできるのかな？
=end
```
* ブロックの最後をendで閉じるのが気に入らない。
  * lua言語とかvbっぽい
  * 初心者にはこの方が見やすいかも
* 一時期Pythonといい勝負してたけど落ち目
* 日本語記事・書籍多い(made in japan)
  * 売りの一つが日本人が作った言語
* 日本国内のみ利用率高い。
* 定数は上書きすると警告出る。
  * 英語大文字はじまりだと定数と扱われる
* 文法上他の言語と順序逆 (10.times do |num|)
* 書き方多い(こう書いてもいいというのが多い)

```ruby
list.times{|num|
  p "test"
}
list.times do |num|
  p "この書き方もOK"
end
```
```ruby
puts "hello"
puts "セミコロンつけてもいい";
```
```ruby
for i in 0..4 do
  puts "for文"
end
for i in 0..4
  puts "do省略できるんかい"
end
```

# 言語比較(Python目線)

* 最も読みやすい(個人的に)
* 単価も結構高い？
* 今後10年ではPythonできる人増える予想
  * 教養としてプログラムを勉強する人がPythonを勉強しているから。
* ランキング1位か2位(スクリプト言語では間違いなく1位)

### 言語ランキング

では言語ランキング見てみましょう。

* [2018年Qiita流行語大賞](https://qiita.com/dcm_chida/items/15b9e7e835e3e5f9d5e5)
  * Pythonの躍進ぶっちぎり
* [qiitaタグ・ランキング](https://qiita.com/)
  * pythonとrubyいい勝負か
* [トレンドはどの言語！？GitHubユーザーのプログラミング言語ランキングを要約してみた！](https://findy-code.io/engineer-lab/github-programming-language-ranking)
  * 年々の動向が見れる
  * Rubyはベクトルが衰退方向
* [What Programming Language Does Your Country Like?](http://fossbytes.com/what-programming-language-does-your-country-like/)
  * 各国の人気(日本だけRuby人気)
* [2018年の人気プログラミング言語を徹底比較！](https://techacademy.jp/magazine/8735)
  * PythonとRubyいい勝負か
* [What are the most popular programming languages for 2018?](https://usersnap.com/blog/programming-languages-2018/)
  * JavaとPythonをやっていればOKということだ
* [GitHut](https://githut.info/)
  * JavaとPythonをやっていればOKということだ
* [TOIBE](http://www.tiobe.com/tiobe-index/)
  * JavaとPythonをやっていればOKということだ
* [2017年、人気のプログラミング言語トップはPython。C、Javaが続く](https://www.publickey1.jp/blog/17/2017pythoncjavagoogle_trendstwittergithubstackoverflow.html)
  * Pythonがトップ(この記事で私は喜んだ)
  * 最新はこちら[The 2018 Top Programming Languages - IEEE Spectrum](https://spectrum.ieee.org/at-work/innovation/the-2018-top-programming-languages)
* [PYPL PopularitY of Programming Language](http://pypl.github.io/PYPL.html)
  * Pythonがトップ
* [web framework benchmarks](https://www.techempower.com/benchmarks/)
  * でもベンチマークでは上位にいけない

## 言語比較

* [どれ使うべき？3大WebフレームワークRails・Django・Laravelを徹底比較してみた](https://paiza.hatenablog.com/entry/2018/05/07/paizacloud_web_application_frameworks)
  * Djangoは生成コード少なくてすっきり勉強にも基礎がわかってよさそう
* [最高のプログラミング言語（または私は如何にして心配するのを止めてコードを愛するようになったか）](https://postd.cc/the-best-programming-language-or-how-to-stop-worrying-and-love-the-code/)
  * ちょっと古い記事だけど

# Python利用のデメリット

* 速度遅い(pypyなど利用して高速化考慮すべき)
* 日本語記事少ない(がんばれ)

# Pythonでやってみたこと

## micro web-framework (RESTful framework)

bottleを使ってWebアプリケーション。
DBはSQLiteを利用。
フロントエンドはvue.jsで実装しました。

**タイピングゲーム**

![pluplu.png](https://qiita-image-store.s3.amazonaws.com/0/224453/dec9e9e8-6ae0-e057-4869-6d0465dfeaf1.png)

## ゲーム

pygameを使ってゲームを作成しました。
子供達にゲーム制作を教えるのにまず自分が作ってみました。
以下の記事の通りにつくってみました。

* [Pythonでゲーム作りますが何か？](http://aidiary.hatenablog.com/entry/20080507/1269694935)

**インベーダゲーム**

![invader.png](https://qiita-image-store.s3.amazonaws.com/0/224453/1c032cb9-e922-7501-6f28-b19d3ea53bc5.png)

## Excel出力

xlsxwriterを使って請求書をExcelで出力してみました。

**請求書**

![seikyu.png](https://qiita-image-store.s3.amazonaws.com/0/224453/6640e852-c83f-f33c-c692-49684672e784.png)

# 業界の動向に思うこと

### Java屋さん今後減るのでは？

* Javaを選択するだけで大型案件で大変な仕事の可能性高い
* リモートワークほぼない
* ということは若手は避ける
* 時間かかるJavaを敢えて選ぶ必要ある？一部だけでいいのでは？
  * がっつりSVFで帳票出力したいならJava
  * スクリプト言語ではスピードがちょっとというときJava？(他いいのあるのでは？)
  * 他思いつかない

### (ちなみに)初心者でRubyやる人多い

* 日本語ドキュメント多いからやりやすそうというイメージ？
* SQL書かなくてもいいから？(Railsね)
* Webアプリケーション作りやすい？(Railsね)

RailsがいいからRuby使うのイメージ。

### Webシステムの今後(個人的思考)

* さくっと素早く作るならスクリプト言語
  * マイクロサービシズやるなら特にそうかな
* 世界のPython波が日本にも来ると思われる
  * 東京の流行は1年遅れて大阪に来る(勝手な自論)
* JavaやRubyやってたら今後が心配
* Goも追い上げてくるはず
* PythonとGoの2強になりそう

# 言語別技術

~~PHPとRubyの情報少な過ぎてすみません。~~
コメントで教えて頂いた情報を加筆しました。みなさんありがとうございます。

|-|PHP|Python|Ruby|Java|
|:--|:--|:--|:--|:--|
|CMS|[WordPress](https://ja.wordpress.com/), [Drupal](https://www.drupal.org/)|[Mezzanine](http://mezzanine.jupo.org/), [django-cms](https://www.django-cms.org/en/),[Wagtail](https://wagtail.io/)|[Refinery](https://www.refinerycms.com/), [島根県CMS](https://github.com/NaCl-Ltd/pref-shimane-cms),[浄瑠璃](https://joruri.org/), [ぞめき](https://zomeki.jp/),[白鷺](https://www.ss-proj.org/)|[Liferay](https://www.liferay.com/ja/home)|
|Web Framework|[Laravel](https://laravel.com/), [CakePHP](https://cakephp.org/jp)|[django](https://www.djangoproject.com/), [Bottle](https://bottlepy.org/docs/dev/), [Flask](http://flask.pocoo.org/)|[Rails](https://rubyonrails.org/), Sinatra|[Play](https://www.playframework.com/), [Jersey](https://jersey.github.io/), [Spring](https://spring.io/)|
|package manager|[composer](https://getcomposer.org/)|pip, Pipenv|gem|maven, gradle|
|IDE|[PhpStorm](https://www.jetbrains.com/phpstorm/)|[PyCharm](https://www.jetbrains.com/pycharm/)|どれが有名?|[Eclipse](https://www.eclipse.org/)|
|code checker|[PHPStan](https://github.com/phpstan/phpstan)|pycodestyle, autopep8|どれが有名?|CheckStyle(in Eclipse)|

# まだまだPython初心者なのでPythonならどうなの？と思うこと

Pythonは始めたばかりなのでいろんなことについて知らないことだらけです。

* パッケージ管理簡単？
  * pythonでもnexus使うのか？
  * いまナウなヤングはPipenv？
  * Anacondaはなんか用途が違う気がする
     * Web環境つくるのにAnacondaはinstallするの？
* IDEはなにがいいのか(いまはAtomで実装中)
  * [PyCharm](https://www.jetbrains.com/pycharm/)
     * 月額$8.90 (1,000円ぐらい)
     * Djangoでブレークポイント貼れるのかな？
  * [Jupyter](http://jupyter.org/)
  * [Wing](https://wingware.com/)
  * [PyScripter](https://sourceforge.net/projects/pyscripter/)
  * Eclipse(Plugin PyDev入れる)
     * 動かすのにJava必要だからいやだ
* ログ出力はなにがいいのかな
* メモリ使用量はどうか
* DjangoとかBottleとかFlaskとかイベントはスレッド？
* コーディング規約のCheckerはこの辺？
   * pep8 → pycodestyleになった模様
   * pep257 → pydocstyleになった模様
   * yapf
   * autopep8
   * pyflakes

# 他にも気になる言語

### Go

* 高速！
* 構造体・ポインタ使う
* マルチスレッド得意
* 学習コスト高い(C言語並み)

# 勝手に点数表(5点満点)

※他にも気になるGo言語も参加

|-|Python|Ruby|PHP|Java|Go|備考|
|:--|:--|:--|:--|:--|:--|:--|
|速度|3|3|3|5|5|Goの速度はJava並み?|
|コード見やすい|5|4|1|3|3|Pythonが見やすくてPHPはメンテしたくない|
|学習簡単|5|4|4|3|2|Goはちょっと難しい|
|オブジェクト指向|3|5|4|5|2|純オブジェクト指向ならRuby。Goでは構造体。|
|機械学習|5|2|2|3|2|Python以外ならR言語|
|世界人気ランキング|5|2|4|5|3|Goが急上昇中。|
|国内人気ランキング|2|4|5|5|1|日本はまだまだPHPで作る気の模様。|
|年収|4|3|1|4|5|機械学習案件なら高い。PythonとGoはWeb案件少ない。|
|地域|東京ばかり|東京ばかり|大阪でもある|大阪でもある|東京ばかり|大阪新しいのやる気ない。|
|単純点数合計|32|27|24|33|23|単純に合計して判断できるものではないが目安として。|

# まとめ

1. 人気度ではJava屋さんが次に選択すべきは間違いなくPython
  * JavaはもうできるからJavaが必要なら使うだけ
  * 第二言語に選ぶならPythonでしょ
1. Pythonを生で使うのは速度不足
  * pypyに期待
1. 今は日本国内で人気のRubyだがRailsがなければ価値半減ので微妙
  * 周りがRubyを見ているうちに力をつけよう(と思うことにします)
1. CMSではWordPressに勝てないか
  * Python製の"いい"CMSがあれば間違いなくWeb界もNo.1
1. Rubyも開発スピードを考えると選択肢として"あり"
1. 結局は技術から選ぶのではなく要件に合わせて技術を選べるようになるべきか