Java8のStreamを使ってみた。やっぱJava嫌い

やってみた。気付いたことを書く。

zipが無い

これが一番痛い。正式公開前のプレビュー版にはあったそうだが、実装が難しくて削除されたそうだ。zipは結構使用頻度高いでしょー。是非追加してほしかった。

Tupleがダサい

タプルは二つの要素(Pair)に限定される。Pairというクラスで実装される。以下のようなクラスがある。

Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair

ダサい。ScalaのようにTuple2<T1, T2>みたいな実装にはできなかったのだろうか?ここら辺は良くわからない。

collectがダサい

toList、toMap、toArrayみたいなメソッドが無い。代わりに、

aaa.stream().filter(x -> x.deptCode == "AA123").collect(Collectors.toList());

みたいに書く。まー、こういうふうな実装になったのは分からんでもないけどC#やScalaでtoList()とか簡単に書けるのを思い返すとちょっと…。

型推論が無い

結局、型推論が無い。型推論が無いのでList<SuperMiracleChoUltraSugoiEmployeeDtoEntity> list = ...みたいな風に書かないといけない。だるい。

使う前は「.stream()って書けばあと普通に使えるんでしょ?」と思っていたが、タプルが無い、C#のように簡易に書ける匿名クラスも無い、リストや要素を簡単に結合できない、型推論も無い、…と、想像してたよりもずっと使いづらいものでした。ラムダ式とStreamがあればいいんだ!と思っていたんだけど、そうでもなかったなあ…。

Javaで組むのはもう嫌だ

Java8が出てくれてよかったとは思う。それは職場の皆がJavaしか理解できないような状況のところで、ラムダ式やそれに付随する高階関数が使えるようになったから。C#やScalaのそれと比較して使い勝手が悪くとも、「Javaしか打てない環境」では圧倒的に価値がある。しかしながら自由に言語を選べるのであれば私は絶対にJavaなんて選ばない。Scala, Python, C#, JavaScript(&その他AltJS)あたりから適宜適したものをチョイスして開発をするだろう。

きしださんが、

Java8には型推論があるので型指定不要で変数が使えますよ

おかあさんに型推論をねだるとGroovyをわたされたり、おとうさんに型推論をねだるとScalaがやってきたり、プレステが欲しいって言ったのにWiiやXboxを買い渡される感を味わった人も多いのではないでしょうか。

と、面白いことを書かれています。その憤慨も分からんではないですが、私からするとやっぱりScalaで良いじゃんという気になります。

本来プログラミング言語なんてどうでも良いはず

本来、プログラミングというのは方法論であって、エンドユーザーから見たら足の裏にあるホクロや舌の裏のスジよりどうでも良い部分であると思います。そもそもそのソリューションにはプログラミングが不要だったりすることもあります。でも、この業界に居ると「そういうのはXXXというフレームワークでWebシステムとして実装するのが正だ」とまず方法論ありきで考える人が多いような印象を受けます。ユーザーが問題としていることに対して良いソリューションを構築するというのが目的なのに、それを考えているそぶりが見られません。

うちの会社では数万点のデータを1秒間隔で操作してまとめ上げて必要に応じて演算を加え、PC上の画面に表示するというような大規模なプログラムを「昔からこれでやってるから」という理由でC言語で組まされることもあれば、「対応できる技術者が居ないから」という理由でクソ古い時代のSeasar2でWebアプリを構築させられたりすることもあります。

これは究極的に言えば「技術者の稼働率を上げるため」に言語を選択しているのと同じです。理想的なのは目的に合った言語やフレームワークを選ぶことだと思うのですが、つまり経営的な都合が入っているともいえるでしょう。

とにかく私は「みんなのチームワークで成し遂げる」のが大事で、であるからこそ「みんなが理解できる標準的な言語・フレームワークを採用すべき」みたいな論理は嫌いです。はっきり言ってしまえば、なぜそうやって出来る人が下手な人に足並みそろえなければならないのでしょうかと思います。

下記のような記事がありました。

SI業界(日本)のJavaプログラマーにはオブジェクト指向より忍耐力が求められている?

Javaプログラミング能力認定試験なるものがあり、それの出題内容を見ると

あくまでもオブジェクト指向言語の試験であることが明記されているようですが、ダウンロードした設計書とコードを見ると、純然たる構造化のクラス設計で作られていることが一目瞭然でした。(中略)

ファイルから読み込んだレコードデータをオブジェクトに入れず、すべてString[ ]やString[ ][ ]などの配列として扱っている。(コレクションクラスはほとんど使われていない)単にグローバルメソッドのstatic importの目的のためだけにクラスを継承している。ポリモーフィズムは一切活用されていない。privateやpublicなどのアクセススコープの指定は(mainメソッド以外)一切ない。

というような内容だったそうです。そのうえで、この試験が実社会で価値のある認定試験であることを考えると、実社会の平均的なプログラミング能力とはこの程度ではないのか。日本のSI業界のPGを取り巻く環境の惨状を、今後もはたして放置しておいてよのか。と問題提起してらっしゃる。至極まっとうな意見であると思います。

しかし私は自己中心的なので「技術者は大切に育てていかなければならない」みたいな高尚な思想はありません。単純に興味がない。私は「チームワーク」という言葉が大嫌いですが、それは少なくとも私の職場でこれがまともに機能している例を見たことが無いからです。どのプロジェクトも結局優秀な人に仕事が集中し、時にはその人を潰すまで働かせるというパターンが多いです。

そのような環境で優秀な人にぶら下がっている人たちが「よし、俺たちも勉強して優秀なひとに追従できるよう頑張ろう」なんて思う訳がないのです。そして向上心を持たない人たちに何を教えようと無駄です。だからバカは一生バカのままだと思います。はっきり言って。

そしてもう一つ私が思うのが、私も同じくバカであるという事です。私が通った高校は九九が出来なくても入学できるような高校でした。かつ、私は高校2年生の終わりまで文系で、三角関数を覚えたのは高校3年生の夏でした。それからどうにかこうにか大学を出て、大学院を出て、Scalaでプログラム打ってるのです。だから、俺より良い高校/大学でて、かつ独身で子育てもしてなくて時間も金もたっぷりあるお前らだったらScalaくらいちょっと勉強したらわかるだろうがっ、このポンコツがっ、と日々思ってしまうのです。

せめて、私が一人で作って一人で運用するシステム位、私の自由にさせてほしいと思うのですがそれすら茶々を入れてくる人間も居て、本当に日々辟易としますね。

ユーザーの要望を聞いて、Webシステムを作り、サーバにデプロイし、その後もユーザーの反応を聞いて都度修正するという作業を通して携わりたいです。なんのしがらみも無くそのシーンにあったベストな方法でちゃちゃっと作り上げて継続的に改善していく。ちなみに、こういうふうに横断的にすべての事が出来る技術者を「フルスタックエンジニア」とか言うらしいですよ。はは、おもろ。

そうやって日々私が文句を言いながらも転職せずに今の会社にしがみつくのは、やはりネームバリューと社会的信用と金ですね。働く喜びはみじんも感じません。ソフトを作る喜びは趣味に求めることにしてから多少気が楽です。私は多分今後も転職はしないでしょう。起業はするかもしれませんが。社員私一人の自営業です。

起業できる目途が立つまでは会社にしがみついて生きようと思います。かしこ。