Category Archives: Java

Seasar Conference 2015に参加してLTをしてきました #seasarcon

2015/09/26、5年ぶりに開催された、
Seasar Conference 2015 Not 同窓会
に参加し、次のスライドでLT登壇してきました。

なぜLTをしたのか

僕はこれまでにもMayaa関係の勉強会登壇を繰り返してきました。

JJUG CCC 2013 Fall: テンプレートエンジンを利用してプログラマーとWebデザイナーが共同作業をする上で大切なこと
JJUG ナイトセミナー 2013/08: from JSP to Design-friendly Template Endine JSPからMayaaに移行した本当の話

このブログでも、Mayaaについての発信が多めです。

5年間Mayaaを使って思ったこと
Mayaaでm:idの解決の仕方を自分好みにカスタマイズする方法
MayaaなどRhinoを使っていてハマること。It is not a function, it is String
2年間Mayaaを使ってわかったこと その2
そろそろ2年間Mayaa使ってわかったことを書く
MayaaでHTML5のスマートフォンページを作る際にはまったこと
Mayaaファイルを命名規則から一括作成するEmEditorマクロ
MayaaでGuice2.0 AOPを使うとうまく動かない件〜解決編
MayaaでGuice2.0 AOPを使うとうまく動かない件

Mayaaは、自分が大変お世話になっているOSSで、不具合報告などでOSS活動にも関わらせていただくなど、技術者として成長させてもらった思い入れの強いライブラリです。

この日、作者である栗原 傑享さんや、現在メインコミッターを務められる須賀 幸次さんがいらっしゃるということで、彼らへの感謝の気持ちを表現したいという、実に個人的な動機がLTをした理由でした。

それにしては、Seasar Foundationの重鎮の方々に好意的に受け入れて頂いたようです。考えてみるとMayaaが生まれた土壌である、Seasarコミュニティの存在も肯定する内容でもあったからかなと思います。そういったわけでは、Seasarコミュニティーに対しても感謝の気持ちを明確に表すべきでした。この場を持って、感謝の意を表明致します。

なぜ今SeasarConなのか?

Seasar Conference は2010年を最後に開催されず、Seasar2も既に機能の追加が中断されていました。既に、JavaのトレンドはSpringやJava EEに移行しており、Seasarは時代の中でフェードアウトしたように見えていました。その中で、なぜ?今 Seasar Conference なのか?と多くの方が興味を持ったと思います。

蓋を開けてみると、5年前まで、あんなに先導的なメッセージを発信して日本のJava系エンジニアの最大のカリスマだったひがやすをさんが、どうも、中立的というか、大人な話し方をされている印象でした。まして、Seasar2のサポート終了(2016/09/26)を宣言される。あれあれ、なんか暗いぞ??

そこへ栗原 傑享さんの喝が入ります。どどどんな展開((((;゚Д゚))))ガクブル

5年間Seasar Conferenceが行われなかった裏で何が起きていたかについては、理事長の橋本さんのセッションで説明がありました。開催されなかった理由:

  • イベント駆動開発→開発駆動イベント→DIのメンテナンス終了、ワクワク感より調整の難易度が上回った
  • NPO運営はスポンサーに支えられている。ムーブメント、流行に乗る必要がある
  • NPO改名問題があった

NPO活動を行うにも、イベント一つ行うのも、裏での苦労が絶えないのだなあということが伝わりました。その一方で、福岡の方では「明星和楽」というイベントが行われ、これは「テクノロジーとクリエイティブ」にフォーカスしたイベントで、業界の流れがSIからスタートアップに向かう中での実験として成功だったそうです。

自分は新参者なので、知りませんでしたが、Seasarコミュニティを支えていた方々は、SIerの精鋭たちが中心であって、SeasarとSI・受託開発という枠組みは切っても切れない存在のようです。2010年頃には、ひがさんはSlim3をリリースしていてAppEngineなどでのスタートアップ志向にシフトしていたし、橋本さんの経営されるヌーラボは、Cacooなどのサービスを打ち出していたので、どちらかと言うと、サービス指向をもともと持っていた人たちだと思っていましたが、SIにおける、エンタープライズJavaからのニーズがSeasarの原点だったのです。

2010年から、2015年の間に震災やスマホブーム、ソシャゲブーム、クラウドの興隆を経て、今時「受託かスタートアップか」という議論自体が古臭いと思いますが、Seasarというコミュニティは、その原点と、その名前が足かせとなって、進むべき方向性に難儀していたそうです。こういうことを赤裸々に話してくれたことに大変感謝します。

個人的には、僕のような、当時接点を持てなかった者がかつてSeasarで有名だった方々と繋がることができたのが大変ありがたく思いました。懇親会にも参加させていただきましたが、これからどうするのかというような議論が活発になされているようです。解散か?改名か?なにかの転換があるのか?Seasarの次の動向に期待したいです。

栗原さんの海外のIT事情の発表が面白かった

Mayaaの開発者にして、グルージェントの創業者で、サイオスの幹部として、現在はシリコンバレーに生活されてスタートアップをされている栗原 傑享さんの発表は刺激的でした。

アメリカでは、徹底的に生活の効率化が行われて、公共インフラが民間企業の寡占状態にある。例えば、警察を呼べばお巡りは来ずに、メールアドレスを聞かれて、CoplogicというWebサイトから被害届を出すように言われる。そのCoplogicは民間企業!部屋を探すときはcraigslistが必須。Coplogicもcraigslistもナニコノ垢抜けないデザインは!

「少年野球はミスも出やすいですから、基本積極プレーで」(引用:MAJOR 2nd 第25話)

これがアメリカのスタートアップのメンタルのようです。僕たちは、FacebookやGoogleといった超巨大な企業しか知らないために、すごいイメージがありますが、あれはメジャーリーグ、シリコンバレーのスタートアップは大半が少年野球!(マイナーリーグですらないのか。。。)彼らはCSSも書かずに平気で2塁まで突っ込んでいくんだそうです。

このメンタルでくると、要件定義をして、スケジュールを引いて、アサインして……のやり方では間に合わないのは確かですね。

前述のように、アメリカは公共インフラが徹底的に効率化され、民間企業の寡占状態にあります。この状況は、間違いなく未来の日本にもやってくる!今のうちにcraigslistをパクったら儲かるwwwまあ、100パーセント同じにはならないと思いますが。(^^;

個人的な考察:2010年から2015年という時代について思うこと

稚拙な考察ですが、2010年ごろ不況もあり、業務システムのIT化も既にコモディティ化が済んでしまった以降、今までの形態のSIerのニーズは減少し、クラウドなど黒船の到来によって、この世界は縮小するのは明らかでした。

では、多くのITエンジニアが職を失ったのかといえば全く逆で、未だに「エンジニアが足りない」と言っている。何が起きたかといえば、これまでよりも多くのことにWebやスマホなどのITが使われるようになった(リアルなお店でものが売れなくなった)と言われます。

しかし、この業界の流動性は非常に速く、今までみたいにじっくり良い物を作っていくより、手が早い方が求められました。そうすると、1からスクラッチでシステムを作るより、WordPressを改造して目的を実現するとか、既存の何かをいじって楽をできる方が重要で、そうなってくるともう言語やフレームワークがどうこう言っていられない。WordPressに乗っかるのか、Google Appsに乗っかるのか?

ただ乗っかっているだけだとプラットフォーマーに吸い取られる仕組みになっています。そこで自ら何らかのプラットフォーマーになるか、あるいはレベニューシェアなど成果にコミットする方向性がこれから成功する秘訣なのかなあと思います。

そう考えると、2010年と今とでも時代は全然違うなあと思います。

ここまで理解したところで、何もできていない自分に比べたら、Seasarの中心の方々は僕よりも何十倍も優秀な方々の集まりなので、一人ひとりはこの波の中で成功されているのでしょう。でも、Seasarという糊がなければ、彼らはつながらずSeasarは時代の流れの中で役割を終えようとしている中で、外部の者がどうこう言うことではありませんが、同窓会だったとしても十分に価値があったと思います。そこに行って、憧れの彼らが今どうしているのか、話を聞かせてもらえたことは、新参者の自分として、大変刺激的で大変貴重な一日でした。

今、自分の年齢はSeasarの人たちが活発に活動をされていた年齢くらいに位置します。同世代のエンジニアを見渡すとSeasarを作る人は出てこないだろうなあと思いますが、CEOやCTOを名乗っている友人もいますし、ある意味、スタートアップ時代を生きています。そんな中で、僕らは、一まわり上の方の貴重な経験をもっと吸収して、自分たちこそ時代を盛り上げていかなければならない時ではないでしょうか。

アキバのメイドさんにAndroidを教えてもらってきた\(^o^)/

建国記念日に、日本がハジマター\(^o^)/

2015年2月11日、とてもおもしろいイベントに参加してきたので紹介します!

日本Androidの会秋葉原支部・コスプレ理系女子普及部 第33回定例会

会場は女中酒場幻橙館 大正ロマンがコンセプトのお店です。

IMG_20150211_164050

店長の鈴峰桐さん、Androidの会秋葉原支部長の肩書を持たれているらしいです。カッコイイ

IMG_20150211_224137

今日で卒業されるメイドさんが2人のいて、会の途中では涙涙(ノД`)シクシク 手紙の読み上げなども、、、なんか濃い!

でも、楽しい( ・∀・)!!

一般的な勉強会のイメージ

勉強会といえば、怖いおにいさんが参加されていて、誰かが甘いことを言うと強烈にマサカリを投げてくる殺伐としたイメージがあります。

例えばこんなコード

i = i + 1;

いや、 i++; って書こうよ(*´Д`)

さらに

if (i == 7) { i = 0: }

(つд⊂)ゴシゴシ

i %= 7;

せめて、

if (i >= 7) i = 0;

そうでないと、なんかの原因でiが同時に2回足されて8を超えたら永久に増え続けることが心配で心配で夜も(ry

でもね、それで( ・∀・)イイ!!

例えば参加者の声:「他の勉強会では、ついていけなかったけどここでは優しくてついていけました!」

この日はプログラミング未経験の方、中学1年生の男の子も参加されていました。みんな初心者に優しい!(僕もAndroidは初心者です)一人でも遅れた人がいると、みんなで待ってくれる!

IMG_20150211_183412

僕のMacがフリーズしちゃった時も、再起動するまで待っててくれた!( ;∀;)感動

WIN_20150212_004748

最終的に、みんなプログラミングの課題を終わらせることができた!
もし、<=とか+=とか%とか、使う演算子増えればそれだけ説明も増やさなきゃいけないし、そしたら終わった感動みんなで味わえなかったよね。

プログラミングはもっと楽しく!もっとかわいく!

配布資料のサンプルコードみてください!なんかカワ(・∀・)イイ!!

もちろん現場では難しいことを考えることも必要。だけど、そんな怖いプログラミング楽しいか?初めてホームページを作った時の楽しかった気持ちを忘れていないか!

懇親会が楽しい!

懇親会ではメイドさんとチェキもできて楽しい!料理も美味しかったです!

B9jxp0kIcAEiO-x.jpg-large

楽しい建国記念日をありがとう!

次回情報

次回は3/29に開催されるようですよ!もちろん僕も参加します!

告知サイトはこちらです。
日本Androidの会秋葉原支部・コスプレ理系女子普及部 第34回定例会

10年間Javaを書いていた僕が Effective Java 第2版を読み返して新人に薦められるのかを考えてみた

これは Java Advent Calendar 2014 の13日目です。昨日は @skrb さんの「Duke で Swing」、明日は @bitter_fox さんです。

いきなりですが、テーマ変更します。ごめんなさい。Mayaaのことは書きません。

実は登録時には「Mayaaのことを書く」みたいなことを書いていました。確かにMayaaを扱って通算5年、かなりマニアックなことを書くこともできますが、マニアックなことを書いても誰も相手してくれないと思うので、そういうのは別の日にひっそりと書こうと思います。

そこで方針を変えようと思った時、僕の勤務先では開発者同士のコードレビューが盛んに行われ、特に現場に古くからいた僕は後から入ったほぼ全員の人のソースコードのレビューを求められて、日々の時間の多くをレビューに費やしていることを思い出しました。レビューを行う際はどうしてもこのコードは良いとか悪いとか自分なりにジャッジしなければなりません。それはその場の感覚で行っていましたが、何らかの指針を持っているはずです。そこで、それについて書いてみようと思います。

ネタとしては、駆け出しの頃読んで感動した、ある本を再読し、それを元に自分の今のコーディングに対する考え方を書いてみたいと思います。ある本とは、そうです。Effective Javaです。

よく「新人Javaエンジニアは Effective Java を読め」と言われてきました。

Effective Javaは一時絶版になりましたが丸善出版が再版してくれたため、また新人プログラマーにすすめることができるようになりました。以前からJavaで仕事するなら読んでおいた方が良いと言われる定番の一冊です。

僕は2004年ごろ初版を、2008年に第2版が英語で出たときは毎日少しずつ訳しながら読みました。(結局全部訳し終わる前に日本語版が出ちゃったのですが。。。)

初版は2001年、第2版は2008年の出版です。さすがに2014年現在では古いと言わざるをえません。しかし、プログラミングで大事なことは文法よりもその後ろにある思想にあると思います。

なおここから先は、あくまで僕の視点からのコメントです。立場の違う方からは違う意見も出ると思います。注意して書きますが、明らかに間違ってる場合はご指摘いただければ、幸いです。また、時間の都合上全部は無理で、はじめの方のちょっとだけになると思いますがご了承ください。

2014/12/15 追記:この記事に対して下記のブログから反響をいただいています。

この記事を公開後、Otchyさんがブログに記事を書いてくれました(ありがとうございます)。こちらも併せて読んでいただくことをおすすめします。

Indeed.comのJavaコード

僕の立ち位置

個人的な感想を述べる都合上、予め自分の立場を明かします。
* 2004年よりJavaを使ったECサイト開発に従事し本格的にJavaコードを書き始める
* Java EEサーバーのようなエンタープライズ向け製品は使用していない
* 開発者2名という小さなチームで自社プロダクトを開発していた
* 今は10数名の開発者がコードを書いていて、自らもコードを書きつつ、レビューをしている

ちなみにタイトルで10年やってるとは言っていますが、Java7ですら今年になってから使い始めたレベルなので偏っていると思います。もっと短い経験でも僕よりJavaに詳しい方はいっぱいいると思います。

項目別コメント

項目 1 コンストラクタの代わりに static ファクトリーメソッドを検討する

項目 2 数多くのコンストラクタパラメータに直面した時にはビルダーを検討する

これら2つを組み合わせると「流れるようなインターフェース」と呼ばれたかっこいいAPIを実現できます。しかしこのようなAPIは使用者に対して、例えば「Hogehogeクラスのサブクラスは必ずコンストラクタを使わずにnewInstance()メソッドを使うこと」などの情報を徹底周知する必要があります。それを行う明確な理由があるなら採用するべきです。

OSSライブラリではインターフェースダサダサでは使ってもらえないので、より美しいインターフェースにすることで、利用者の同意を得るというプロセスになると思います。

JavaBeansパターンは暗黙に使い方を示しているところがあるので、可変性に注意して使えばカジュアルで良いと思います。

型パラメータの省略ができるというファクトリーメソッドのメリットは、ダイヤモンド演算子によってJava7ではなくなりましたね。

項目 3 private のコンストラクタか enum 型でシングルトン特性を強制する

enumシングルトンを見たことがありません。そもそも純粋なシングルトンが必要なケースってあまり良いイメージがないですがどうなのでしょうか?

項目 4 private のコンストラクタでインスタンス化不可能を強制する

個人的にはRhinoで

var Util = new Packages.my.domain.HogehogeUtil;

では何故か上手く行かず、

var Util = new Packages.my.domain.HogehogeUtil();

と書く都合上、この方法は使いません。別にユーティリティクラスのインスタンス化を制限しなくてもいいんじゃないかなあと思います。

項目 5 不必要なオブジェクトの生成を避ける

new String("hoge")や、new Boolean(true)のような明らかな悪手は取るべきではないですが、ストイックにインスタンス化を削減する努力が必要なのであればある程度は許容しても良いと思っています。

項目 6 廃れたオブジェクト参照を取り除く

項目 7 ファイナライザを避ける

同意

項目 8 equals をオーバーライドする時は一般契約に従う

項目 9 equals をオーバーライドする時は、常に hashCode をオーバーライドする

ほんとこれ、理解できない人はequalsをOverrideしないでくださいレベルです。

項目 10 toString を常にオーバーライドする

欠点の一つとして掲げられている「一度形式を明示すると未来永劫形式を変更できない」がまさに怖いことと、文字列化することが嬉しくないクラスもあるので、何も「常に」toStringを記述する必要はないのではないかと思います。一方で文字列表現が妥当(例えばHTMLパーサで要素型など)な場合は迷わずtoStringが書けると思います。

項目 11 clone を注意してオーバーライドする

タイトルは注意してと書いてありますが、本文を読むと「使うな」と言わんばかりに読めます。これを読んだあとのJava初級者は可変恐怖症、継承恐怖症を患うと思います。実際は、Java標準ライブラリでも開発しない限り問題に当たることはまれなので、cloneを絶対に作るなとは思いません。cloneの用途としては、そのオブジェクトの型が分かっていない時も、同じ型のインスタンスを作ることができるもっとも簡単な方法だと思います。

やはりタイトル通り「注意してオーバーライドする」が妥当なのだと思います。

項目 12 Comparable の実装を検討する

ほんとこれ、昔ドハマりしたので、イコールじゃないもののcompareToに0なんて返さないように気をつけてください。

項目 13 クラスとメンバーへのアクセス可能性を最小限にする

項目 14 public のクラスでは、public のフィールドではなく、アクセッサーメソッドを使う

項目 15 可変性を最小限にする

この章を読んだ学習者は、明日からprivateばかり書く可能性があります。privateにしておけば安全だと言わんばかりです。そんなとき僕は「なぜprivateなのか考えてprivateにするべき」といいます。例えば、継承されることを前提としたクラスのスーパークラス側にこんな記述があったとします。

class A {
    protected void foo() {
        hogehoge(1);
    }
    private void hogehoge(int x) {
        // ~省略~
    }
}

サブクラスでfooをOverrideしようとすると、どうなるでしょうか?

class B extends A {
    @Override
    protected void foo() {
        hogehoge(2);
    }
}

これはコンパイルエラーになります。hogehogeがprivateだからです。ではこの時「とにかくprivateにすべし」メンタルを持ったプログラマーはどんな対応を取るでしょうか?こんなコードを書いたりします。

class B extends A {
    @Override
    protected void foo() {
        hogehoge(2);
    }
    private void hogehoge(int x) {
        // ~省略~ (スーパークラスのhogehogeのコピペ)
    }
}

そして、後に、別のプログラマーがhogehogeはをprotectedに変更したらどうなるでしょうか?privateからスコープを広げたのだから通常は問題がないと思うはずです。しかし、これはコンパイルエラーになります。「サブクラスがスーパークラスのメソッドを隠蔽している」ということになるためです。

実際はこの場合、Aというクラスを定義した時点でhogehogeはprivateにするべきではありませんでした。

このようにprivateは、不用意に使いすぎると、コードのコピペを促し、また、隠蔽されているからと品質の悪いコードがリリースされる可能性さえあります。なので自分は「どうしてもprivateにするべき事情がある場合に限って、privateにするべきだ」と言う言い方で、後輩たちを指導しています。

可変性についても同じです。僕も一時、不変性バンザイ厨になりました。でも実際はシリアライズ・デシリアライズ・リフレクションあらゆる方面からその不変性を揺るがしてくるので、今は諦めて「可変性に注意する」という立場にシフトしています。

項目 16 継承よりコンポジションを選ぶ

これは、なんというか、個人的にはJavaが悪いと思っています。ラッパークラスは僕もよく作りますが、これを作りたい場合、Eclipseなどの開発環境を使えば自動的に生成することもできますが、微調整するときに、大量のメンバーをポチポチコピペしてラッパークラスを作る必要があり、時間がもったいないしミスも起こりやすいです。そんなことをしているから、Javaは生産性が悪いと言われても、返す言葉がないのですよね。

個人的には、ライブラリ開発者はコンポジションを使って良いが、一アプリケーション開発者は、なるべくこのような努力をしなくても開発ができるようにフレームワークを設計するべきだと思っています。

項目 17 継承のために設計および文書化する、でなければ継承を禁止する

個人的には継承の禁止は継承を禁止するべき必要がある時にのみクラスにfinalを付けるべきだと思います。

まとめ

このあと項目 78までありますが、概ね言いたかったことを書けたと思うので、割愛します。
読み返してみるとこの本はかなり防御的に偏っている気がしました。この本の指示を従って書くと良いのは次のような事例では良いかと思いました。

  • 一人又は少数のJava言語に精通した人が開発し、多くの人が利用しているライブラリ
  • 仕様がほぼ確定し、リリース後に試行錯誤はあまりしない

一方で、多くの人は次のケースの現場でコードを書いているのではないでしょうか?

  • 複数の人が開発し、全ての人がEffective Javaを読んでいるわけでもなく、かつ、全てのコードを一人の人がレビューしているわけでもない、ゆるやかに共同作業しているケース(Web系の現場でありがち)
  • それが最終的なアプリケーションとしてリリースされるのみでjarファイルが静的にどこか別のプロジェクトでライブラリとして再利用されるわけではない
  • 一回のリリースで完成させるのではなく、反復的にリリースすることでフィードバックを得ながら開発方針を修正している

つまり多少厳密でなくても高速に開発サイクルを回すことを優先したい場合は、ここで推奨されているスタイルをある程度崩す勇気が必要だと思いました。どこまで崩すかの判断には崩すことのメリット・デメリットを理解していなければなりません。それには、多くの現場を経験し、多くのコードを書いた経験が必要でしょう。たった一冊の本を読んだだけで体得できるものではないでしょう。

では、Effective JavaはJava学習者にとって良書なのでしょうか?

この本はJavaでコードを書く上の罠をよく示しています。罠は知らないで踏むと大変危険です。そういった意味で、Effective Javaを読んだレベルになって初めて議論に参加できるステージに立てるのだと思います。新人プログラマーの方々にはやはり、早く一緒に議論がしたいという願いを込めて、Effective Javaを推薦したいと思います。

追記

検索していたら訳者の柴田さんがこんなことを書かれているのを見つけました
『Effective Java 第2版』は、やはり初心者向けではない [プログラミング言語Java教育]

この「クラスが適切にパラメータ化されていれば、ClassCastException がスローされます。」の1文を読んですぐに理解できる受講生はいません。この1文を理解するのに必要な知識はすでに学んでいるのですが、その知識を応用して、すぐに理解するのは非常に難しいようです。

ああ、確かにこういうところわかりにくいかもしれないですね。Genericsの章はずっと先にあるので、なるほど、言われてみればそうだなあと思います。むしろ、こういうレベルまで細かく見れる人は全然問題無いと思います。多くの場合、枝葉のことは分からず、とにかく「Effective Javaに書いてあった」という理由で判断してはいけないと思うだけであり、かつて自分はそうであったという戒めでもあるのです。

多くのハウツー本は、斜め読み+気になった箇所だけ精読というスタイルの読み方が良いと思っていますが、Effective Javaに関しては、斜め読みだけでは不十分で、何度も読み返して良い本だと思いました。