kazokmr's Blog

試したこと、読んだこと、見たこと、聴いたことを書きたくなったら書くブログ

BDD in Action, Second Edition 第4章を読んだ

4章を読み終えたのでまとめ。*1

www.manning.com

さて4章は、3章で出てきたフィーチャーの詳細化の方法を説明しています。

3章で疑問に思ったフィーチャーの定義

3章でフィーチャーと特定された中には「これはフィーチャーなのか?」と思う物がありました。 kazokmr.hatenablog.com

この疑問について章の最初に触れており、フィーチャーに限らずこれらの概念として用いられる用語は、扱う方法論によって少しずつ定義が異なることがよくあり、混乱の基になっていると書かれていました。

そこでBDD(あるいは、この本)の中では、用語を次のように定義しています。

  • この本では、主にケイパビリティフィーチャーユーザーストーリー例(Example)の4つを用いて説明する。
  • ケイパビリティは、ユーザーやステークホルダーが「何かを行うための能力」を表し、ソフトウェアの実装に依存しない。
  • フィーチャー, エピック, ユーザーストーリーは、ケイパビリティをサポートするためのもの。 扱う規模が違うが概念はほぼ同じで「エピック => フィーチャー > ユーザーストーリー *2」となる。

フィーチャー

前章で利用したインパクマッピングにおいて、最後の成果物(Deliverable)をフィーチャーとします。 ちなみに、前段の影響(Impact)を、ケイパビリティとして扱います。

インパクマッピングから、フィーチャーを定義すると次のようになります。

Feature: "成果物(Deliverable) "
In order to "影響 (Impact)"
As a "関係者(Actors)"
I want to "成果物をビジネス用語で表す。"

起点となるGoalがここには現れませんが、「そのフィーチャー(Deliverable)は、ケイパビリティ(Impact)を関係者(Actors)に与えるために提供する。」と表現できるので、個人的にフィーチャーが考え易くなると感じました。

また、3章および元々のインパクマッピングでは「影響をHow、成果物をWhat」と説明しているが、フィーチャーを定義するときは「影響をWhat、成果物をHow」と表している。 これについては、目標を機転に成果物を特定していく時と、特定した成果物を表現する時の違いと考えればそれほど違和感を持たなかった。*3

フィーチャーとユーザーストーリーの違い

BDDでは通常、ユーザーストーリーは、フィーチャーを小さく分割して定義していくそうです。*4

ユーザーストーリーがフィーチャーと大きく異なる異なるのは「それ単独でリリースする価値があるかどうか?」と言う点であると説明されていました。*5

ユーザーストーリーの主な概念は(目的?)は次のようになります。

  • フィーチャ-における1つの事象、1つの側面を切り取ったもの
  • ステークホルダーとの会話をより良く進め易く、また、開発し易い大きさにしたもの
  • 1回のイテレーションでリリースできるサイズにしたもの

フィーチャーについてより深く考えていく過程で、思いついた具体的な状況や例を一つ一つをユーザーストーリーとすると作りやすいと感じました。

Real Options と Deliberate Discovery

訳すと「現実的な選択」と「意図的な発見」となるかなと思います。

ステークホルダーの目標を達成するためのケイパビリティに役立つと考えるソリューション、つまりフィーチャーを検討する中で不確実なことが出てきます。それらは大抵、自分たちの無知や誤解から生じます。このような不確実性に向き合って要件に対する共通理解を得るために、この2つの原則について説明しています。

Real Options (現実的な選択)

不確実性が原因で、最適だと考えるフィーチャーが思いつかない、あるいは確信が持てない場合に用いる代替案や保険的なフィーチャーを考えておく事を指します。

この目的は「決断を可能な限り先延ばしにする事」にあり、最適なフィーチャーを考える時間を確保することにあります。 そのためにReal Optionにはいくつかのルールがあります

  • Real Optionにも価値を持つ必要がある。
  • Real Optionに期限を設ける。
  • 何事もすぐに決断をしない。
  • でも、最適なフィーチャーである確信が持ったら、期限を待たずに実装する。
Deliberate Discovery (意図的な発見)

最適なフィーチャーを特定するために、無知なことを学んだり、誤解を無くして共通認識を持つ事を積極的に進める考え方で、不確実なことはプロジェクトのリスクになるので、早く解消する事を目的とします。

本に書いてあった説明だと、例えばバックログリファインメントで、どのフィーチャーから取り上げていくかを考えたときに、「最適な方法が明確なもの」よりも「不確実性というリスクを持つもの」から優先して取り掛かることで、プロジェクト全体の明確さを底上げした方がいいとありました。実際にはバランスが重要ではありますが。

この2つの原則を併用して、不確実性を取り除いた最適なフィーチャーを積極的に特定していくと良さそうです。

感想

これまでは最初から、断片的なユーザーストーリーを作ろうとして、ストーリーが上手く定義できなかったり整理できないことが多かったので、「ケイパビリティ -> フィーチャー > ユーザーストーリー」と順番に思考していくと作りやすそうだと感じだので、チャレンジしていきたい。

(おまけ) describe と illustrate

どちらも 「説明する」 と言う意味だが、この章では主にDescribeを使っていて、次の章からはIllustrateフェーズと呼ぶように後者が話の中心になる事を明示していたので、この意味の本質的な違いを調べてみました。

describe
  • 「詳細化する」と言う意味もある。
  • 大きなフィーチャーを小さく分割していき、ユーザーストーリーに分割していく流れは、まさに詳細化だと感じました。
illustrate
  • 「解説する」「例となる」と言う意味合いが強い。
  • 明確にするようなハッキリとさせる様子があると感じました。
  • 次章で紹介する例(example)などは正に、この意味合いになると思います。

*1:ちなみにこれを書いている時点で、次の5章までしか公開されていない。

*2:実際には、フィーチャーとユーザーストーリーには大きな性質の違いがあるのですが、それは後述します。

*3:後者において成果物を実装するコードと捉えればHowと言えるし、そのフィーチャーの目的と捉えれば影響すなわちケイパビリティをWhatと表現することはそれほどおかしくは無いと思う。

*4:他の方法には、大きなテーマからユーザーストーリーを考え出す方法があり、どちらから言えば自分はこの考え方だった。

*5:ちなみにビジネス価値はシステムが対象としている業界によって変わるので、ある場合はユーザーストーリーと定義された物が、違う状況ではフィーチャーとして価値が出せることもあります。

BDD in Action Second Edtion の3章を読んだ感想

BDD in Action Second Editionの3章を読み終わりましたので、この章の感想を記録しておきます。

www.manning.com

第3章は、Specurate(推測)フェーズとして、プロジェクトの最上位のコンセプトとなるビジョンをスタートに、ビジネスゴール, ケイパビリティ ,フィーチャー と順番に特定する方法を説明しています。

BDDのためというよりは、問題の解決方法を仮定するまでの考え方と色々なテクニックを紹介しています。

また章を通して「コミュニケーションを重ねること」と「解決方法を仮定して証明すること」の重要性を説いているようにも感じました。

ビジョン

ビジョンステートメントを作る。本の中では「キャズム」の著者が提唱し「アジャイル サムライ」のエレベーターピッチの書き方でも採用されているテンプレートを使っている。

ビジネスゴール

ビジョンに基づいて、達成したい事と達成する事で得られる利益を定義する。SMARTを活用した明確な目標を立てる。要求されたことの本質的なゴールを特定するために、その要求が「ビジョンにとってなぜ有益なのか?」を明らかにするためには、なぜなぜ分析を使っている。これについては「ザ・ゴール」を読むとよりわかりやすそう。

インパクマッピング

「ゴール -> 関係者(アクター) -> インパクト(影響/効果) -> 成果物」と関係性を定義することで、必要なケイパビリティあるいはフィーチャーを特定していく。

  • ゴール: ペインポイントとして、現在抱えている問題を解決する方法を定義する。 (もちろんSMARTやなぜなぜ分析も使って洗練させると良いと思う。)
  • 関係者: ゴールに関係するステークホルダーやユーザーを定義する。直接的/間接的を問わず、ゴールに対して恩恵を受ける人を考える。
  • インパクト: 関係者がそのように振る舞うことで、ゴールが達成できると仮定する行動を書く。
  • 成果物: その行動を起こすための「何か」を仮定する。ソフトウェアやツールで実現することにこだわる必要な無い。

インパクマッピングは、仮定の検証を繰り返す事でアップデートしていく。なので検証で判断するための測定基準も考える。

パイレートキャンバス

インパクマッピング、パイレートメトリクス、そして制約理論*1を組み合わせて、幅探索アプローチで(TODO: フィーチャーやケイパビリティ)を特定するやり方。

パイレーツメトリクスはAARRR*2と呼ばれる、Aqcuition(獲得)、Activation(活性化)、Retention(保持)、Referral(紹介)、Return(利益)の5つの視点で測定基準で分析を行うこと。本の中ではこれらの測定基準を使って、ToCにおけるボトルネック、つまり制約を特定していく。

パイレートキャンバスはこれを応用して、この5つの視点ごとに業務の制約とその制約を測る指標を考える。その後にこの制約と指標を目標にして、インパクマッピングと同じように関係者やインパクト、成果物を特定する。この成果物をエピックになる。

インパクマッピングとパイレートキャンパスの使い分け

明確で優先するべき目標が定まっているかどうかがポイントと感じた。目標に対する関係者・インパクト・成果物を特定するプロセスはどちらも同じなので、インパクマッピングはどのみち使っていくことになる。

パイレートキャンパスは目標を考えることから始めるので、多くの目標が生まれ、それぞれに対するインパクトや成果物を順番に特定する幅優先アプローチとなる。この方法は労力や時間は掛かるが、幅広いアイデアが生まれる可能性が高く、どの目標から優先して取り掛かるべきかが把握しやすいことが特徴。

パイレートキャンバスを使って、ペインポイントとなる潜在的な制約(ボトルネック)を特定し、それを向上させるためのケイパビリティ(エピック)について、ソフトウェアによる解決方法に拘らずに話し合って見つけていくやりとりは、劇中作とは言え興味深く読むことができました。

感想

相手の要望を初めから、ソフトウェアで解決する方法から考えたり、相手からも「ソフトウェアをこうして欲しい。」といった感じで要求されることが多いかった。これはつまり、Featureの要望や検討をしていると言うことになるのだが、正しいフィーチャーを特定するためには、まず「何ができるようになると嬉しいのか」といったケイパビリティを特定するプロセスが重要でした。

この章ではプロジェクトや企業のビジョンから、フィーチャーを特定するまでの説明だったが、ゴールとケイパビリティの特定に重点が置かれているように感じた。フィーチャーについては大枠を掴んだだけといった感じだったので、次章以降でこの荒削りなフィーチャーを洗練する方法を説明していくと思います。

英語の表現を日本語で表すのが難しい言葉が多くなってきた。そのまま英語で表現した方が意味がより理解できる気がする。この章は特にそれを感じた。

*1:ゴールドラット氏が著書「ザ・ゴール」で提唱した、Theory of Constrains。ちなみにこれを知るために「ザ・ゴール」と「ザ・ゴール2」のコミック版を買って読みました。

*2:これが海賊の雄叫びのようなことがパイレーツメトリクスの語源みたい

BDD in Action Second Edition の第2章の感想

第2章を読み終えました。この章から構成が初版と変わってきているなと感じました。*1

www.manning.com

この章ではプロジェクトのライフサイクル全体におけるBDDの使い方を理解する目的で、架空のプロジェクトを舞台にして話が進んでいきました。

また後半は実際にCucumberを使って、featureとグルーコード(Definition step)を起点に、テストしながらプロダクションコードを書き進めます。

実践部分は、掲載されているコードが間違っていたり(古い?)、所々説明が端折られていたので、実際に全部のテストを通すためには自分で考えながら進める必要がありました。 *2

英語を訳しながら進めたことや前述の様なこともあってか、BDDスタイルの書き方を やらされた感が強くあったり、スッキリしないところもあったので、これはまた自分なりにやり直してみたいと思います。

その他、この章で感じたこと

  • Cucumberの使い方ではなく、BDDの考え方を学ぶストーリーだったのが良かった。(とはいえ、DefinitionStepクラスのテストを通すためにはCucumberの初歩の使い方は知らないと詰まりそうですが。)

  • DefinitionStepを起点にコードを実装し始めるときは、Then -> When -> Given の順番に実装していくと良い。GivenとWhenは、前提と入力の位置付けなので、そこはリテラルな値やモック的なメソッドを仮実装したものを利用して、まずはThenを実証できる様にして置いた方が、組み立てやすいからと理解しました。

  • コードを実装していく所は基本的にTDDで進めるのですが、実装クラスに対応した「実装クラス名 + Test」の様なクラスを用意するのではなくストーリーレベルでテストクラスを作ったり、テストメソッドの中でWhenやThenの考え方を取り入れるなどBDDスタイルなテストコードの書き方も取り入れて、使い分けるのも良いと思う。

  • 真の要件を見つける時に利用していた、インパクマッピングも初めて知りましたが、Why->Who/Whose->How->What の流れで分解するやり方は問題の解決策を考えやすい方法だと感じましたし、本文を見ていて自分がWhatだと思っていたことはHowの段階であり、さらに分解して具体的にする必要があるんだと気付けました。

  • シナリオの記法は目的に応じて使い分けると良い。例えば、「ビジネスの目的のためにユーザーにさせたいシナリオなら、"Given ... When ... Then"」「ユーザーの目的のために達成したいシナリオなら、"As a … I want … so … that"」 と言った感じに分けて使うと良い。

  • 開発チームやテスターといったプロジェクト側のチームが「本当の要件を発見すること」を強調していて、顧客側から「こう言う問題をこう解決したい」の様に、要件だけでなく解決方法も指示されたことも多かったので、まずはそもそも問題の本質を自分達も一緒になって改めて考えることを気をつけないと再認識しました。

実体験で、本章の様な顧客との会話のやりとりは要件定義ミーティングでも頻繁にあったのですが、この様なミーティングは、毎週または隔週の数時間だけと限られていたので、正しい要件を見つけるには時間が全然足らなかった。さらには、実装する機能のボリュームはやたらと多かったので、こんな進め方だとそりゃ上手くいかないよな。と再認識した。

この辺の要件定義の進め方や正しい要件の見つけ方は、BDDの学習を通して、身に付けていきたいです。

*1:初版を読んだわけではなくて、目次のセクションや本文をざっと見たときの印象ですが。

*2:著者の方がGithubに最終形となるコードを上げているので、それも参考にしました。

BDD in Action 2nd Edition の 第1章を読んだ感想

これは、BDD in Action Second Edition の 第1章 "Building software that makes a difference" までを読み終えた感想文です。 www.manning.com

第1章は最初の導入部分として、BDDが生まれた背景、概要、原則について書かれています。*1 BDDというと専用フレームワークを使ったプラクティスの話が多く、この本も読み進めてするとCucumberを使った実践例が出てきますが、この1章では「なぜこのようなプラクティスを使うのか」と言ったBDDの概念や背景が中心になっているので、BDDのことをより深く知るための基礎が理解できたと思います。*2

この中で特に印象に残ったことをいくつか取り上げてみます。

BDDの原則

1.3.3 の BDD principle and practices は、1章の中でも特にボリュームがあり、内容的にもここで書かれていることがこの章で最も説明したいことだったのかなと思います。

BDDの活動の流れと成果の具体例は以下のようになります。

ビジネスのゴール -> Feature -> Examples -> Executable specification -> Low-level specifications -> Application code

  • Featureは、ビジネスのゴールを達成するための機能であり、ユーザーストーリーなどで説明します。

  • Examplesは、機能の使い方に関する具体的な例で、Gherkin形式(Given ... When ... Then...)で書かれたシナリオになります。

  • Executable specificationは、受け入れテストでシナリオに従って機能が正しく動作することを検証可能にしたもので、いわゆるテストコードになります。

  • Low-level specificationは、シナリオを元に必要なコンポーネントの仕様で、ユニットテストのテスト仕様書やテストコードを指します。

  • Application codeは、機能として動作するコードで、例えばテストコードを使ってTDDなどで開発したプロダクションコードを指します。

これらの活動や成果に対するプラクティスやルールを、本の中で述べています。特に参考になった内容の幾つかを意訳すると以下のようになります。

  • ビジネスを理解する学習曲線は、初期に大部分のことを理解できるような対数的ではならないし、ましてや線形的に伸びるものでもない。時間と共に伸びたり停滞したりを繰り返しながら成長するので、要件の定義はプロジェクトの終盤まで繰り返し少しずつ行う。

  • ビジネスユーザー側の代弁者としてユーザーアナリストが要件を聞いて、開発者やテスターに伝えるのではなく、3者がプロジェクトの初期段階から協力しあい、ステークホルダーやエンドユーザーも一緒に話し合って、ビジネスのゴールやFeature、Examplesを作っていく。

  • ビジネス側は作って欲しい機能について、問題解決方法だけを提示して開発チームに作らせがちだが、開発チームと必要なことについて話し合うことや、開発チームの専門的な設計知識の恩恵を受けられるようにする。

  • テスターはExamplesを考えるときに、コーナーケース や エッジケースを思いつき、ユーザーに質問することができ、有益な例を追加することができるので、プロジェクトの初期から参加することは非常に価値があることである。

  • 自動化したテストを書くのではなく、"実行可能な仕様書" を書くようにする。同様にBDDにおけるユニットテストは、ただ単にクラスファイルやメソッド、ファンクションをテストするということではなく、コードの目的やコードをどのように使うかの例に従って動作することを検証する。

これらのプラクティスは、以前から様々な所で聞いたことがありましたが、BDDにおけるプラクティスの目的をベースにより深く理解することができました。

BDD以外の技術やプラクティスとの関連性

読んでいて「ここはあの技術のことだな」ってわかることや、実際に本の中で言及しているモノあり、BDDの概念と目的の元、多くのプラクティスを取り入れていると思いました。

BDDはTDDの実践例として考案されたのが始まりで今では別のプラクティスとして捉えられている。とはいえBDDがTDDに置き換わるプラクティスということではなく、TDDはコードの品質にフォーカスし、BDDはプロダクトの品質にフォーカスしているので両方を使い分けることが重要です。

また、ビジネスで使われる用語や語彙を使ってExamplesを作るプラクティスなどは、同時期に考案されたDDDのユビキタス言語と共通する物がありました。

そのほかにもビジネスアナリスト、開発者、テスターの三者が協力して、ビジネス側のステークホルダーやエンドユーザーと一緒にFeatureやExamples を作るのは、ユーザーストーリーマッピングスリーアミーゴスの考え方と一致します。

もちろん、これらの根底にはアジャイルやイテレーティブな開発手法が関わっています。

2nd edition では、DevOpsやScaled AgileにおけるBDDの実践方法についても書かれる予定になっています。


次の第2章では、要件分析から自動化されたユニットテスト、受け入れテスト、機能的なテストカバレッジレポートと言ったプロジェクトの全体的な活動を通して、BDDのより実践的な例を説明するようなので、また読み終えた後にナレッジの整理のためにまとめたいと思います。*3

*1:この Second Editionは、MEAP という執筆中の内容が読めるプログラムであり完成版では無いのですが、1章は初版から図は差し替えられていますが、文章はほとんど同じでした。

*2:私自身はBDDを業務で実践したことはなく、概要を聞きかじったり、CucumberのHPのチュートリアルに触れたことがある程度です。

*3:ちなみに自分の裏のテーマとして英語の技術書を(ツールを利用しつつも)自分で翻訳しながら読み進めているので、読むペースがかなり遅いです。この1章も外出自粛のGW期間中だったからまとまって読みことができました。これを仕事の中でも進められるといいのですが、今のところはそういう訳には行かないので2章を読み終えるのにも1ヶ月以上かかりそうです。幸いにも(?)この本自体も現時点でまだ4章までしか公開されていませんが。

なぜ「Javaが有償化する」と誤解されてしまうのか考えてみる

追記:対象としているJavaエンジニアの範囲を大袈裟にしすぎたかなと感じましたので、その辺を修正しました。

なぜ書いたのか

タイトルの件ですが、有識者の方々が様々な媒体や場所で発信をされているおかげで、以前に比べて少なくなったと感じてはいるものの、まだ時々誤解を持たれているJavaが有償化する」と呟かれているエンジニアの方もたまに見かけます。

Oracle JDK 8およびOpenJDK 11、それぞれ最後の無償アップデートがリリースされ、これから有償または無償のLTSでアップデートを受け続けるか、OpenJDK 12に移行するのかといった選択を決めていく状況になる時にまだこのような誤解を持ったままでいいのかなと感じました。

そこで自分の経験を基に誤解をする側の立場になって、なぜ「Javaが有償化する」という誤解が生まれたのかを考察してみようと思いました。

尚、この内容は個人の見解で、間違った認識な所もあると思います。 また無駄に問題提起をしている箇所もあると思いますので、ご意見・ご感想を頂けるのもありがたいですが、スルーしてもらった方が良いかもしれません。

前提と仮定

考察に入る前に自分が認識は以下の通りです。これが間違っていたらご指摘ください。

  • JavaソースコードはOpenJDKプロジェクトがベースで誰でも使える。
  • OracleのHPからダウンロードしているJDKはこのソースコードから生成したもの
  • Javaの新バージョンリリースから半年間は、Oracleが生成したのと同じJDKここから無償で入手できる
  • 半年より先は、"新バージョンのJDKを入手する"、"Oracleから有償のLTSを受けてJDKをアップデートする"、"Oracle以外のベンダーの無償または有償のJDKを入手する"などの大きく3つの選択肢がある。
  • 有償になったのはOracleが生成したJDKの利用も含むサポート
  • Javaソースコードは今も昔も無料で使えて、誰でもJDKを作れる。
  • だからJavaは有償化なんてしていない

さて誤解のポイントは、下から3つ目の
"有償になったのはOracleが生成したJDKの利用も含むサポート"
な訳ですが、これがなぜJavaが有償化と捉えられるのか3つの視点で考えてみました。

  1. Javaを使うときにJDKはどうやって入手するか
  2. Javaは誰のものと考えているか
  3. どこのライセンスが変わったのか

前置きが長くなってしまいました。

JDKはどこから入手するか?

これはほとんどが「OracleのHP」からダウンロードしていたのでは無いかと思っています。エンジニアの大多数が使っているであろうWindowsなら尚更です。
OSがLinux系やMacであれば、yumとかapt、brewなどを使うことでそこまでダウンロードサイトを意識することは少ないのかもしれませんが、Windowsだとそのようなパッケージ管理ソフトも無いので、Oracleダウンロードサイトからの入手も多くなると思います。

じゃあ、今まで無償でダウンロードできていたページで「これからはダウンロードしたければ、Oracleの有償サポートに入ってね」となると、Javaが有償化したと思われるのは仕方が無いと感じます。

個人的には、Oralce JDKjdk.java.netからダウンロードできるJDKが、Oracleが生成したものなのですから、最初の半年間だけでも両方ともOracleのHPから直接ダウンロードできればわかりやすいのかなと思いました。

Javaは誰のものか?

こう聞かれた時に多分「Oracleのもの」って答える人が多く、もう少し付け加えると「JavaOracleが開発してオープンソースで提供している、無料で使えるプログラミング言語」のような認識ではないかと思います。

なので、OracleのHPからダウンロードできるJDKを"Javaの正規品"のように考えていて、OpenJDKに至っては"OracleJavaをコピーして無償で提供している派生品"くらいに考えているエンジニアは少なくないと思っています。少なくとも昔の私はそう考えていました。

こうなると、"JavaOracleのもの" > "Javaを使いたければOracleから入手する" > "Oracleから入手するには有償サポートに入らなければならない" > "Javaが有償化したと思い込む" といった誤った認識の連鎖が生まれてしまうのは容易に想像できてしまいます。

まぁこれらは全て間違った考えなので正していくしか方法は無いのですが、効果的に知らしめる方法が必要だと思います。

JVM言語には関係ないのか?

ScalaやKotlinを使えば有償にならない」のようなニュアンスのことを話される方をたまに見かけるのですが、 少なくとも書いたコードをコンパイルして実行するにはJVMは必要なので、JDKを入手することになります。
(Scalaのダウンロードページは「はじめにJava 8 JDKをインストールしてね。ダウンロードはここだよ」って感じでOracleのHPへのリンクがありますし。)

で「"JVM言語なら関係ない"と言うエンジニアはどこからJDKを入手しているのか?」と言う疑問が出てくるわけですが、これは当人に聞かないとわからず小心者の私にはできないため、私はScalaやKotlinを職場で使ったことが無いので憶測で考えてしまったのですが、入手先どうこうよりそもそも以下のような認識なのかな?と感じました。

  • Java言語を使うことだけが有償で、JVMを使うことは無償のまま(だからOracle JDKも使える)
  • JVMはダウンロード済みJDKを使うだけだから関係ない。(JDKのバージョンアップを考慮していない。)

要するに「都合の良い解釈をしてしまっているだけなでは?」と考えられますが、そこを辿ると、今回の有償の対象が"Javaソースコード"だと認識してしまっているのでは無いかとも考えられました。

私自身の経験も含めてオープン"ソース"と言う言葉から、ライセンスの対象になるのはソースコードだけだと考えてしまうことがあります。
つまり、実際は『OracleのHPからダウンロードできる、Oracleが生成したJDKがライセンスを変更した』が正しいのですが、それを『Javaソースコード自体のライセンスが変更になった』と誤解していることも考えられるわけです。

JVM言語を例にして憶測で話してしまいましたが、考察したかったのは"Javaソースコード"のライセンスの誤認識だったわけです。

誤解を無くすためにするべきこと

冒頭にも書いた通りJava界隈の有識者の方々は毎日のように正しい情報を発信したり、誤った発信をしている人には指摘をしているのを見かけますが、それだけでは足りないと感じています。
それは、このような発信を受け取っているJavaエンジニアの数はそれほど多く無いと思っているからです。

例えば前職ではJavaを使っていたエンジニアは社内に数十人はいたと思うのですが、私以外にJJUGなどのイベントに参加している人は知らなかったです。
ここから考えられることとして、正しい情報を受け取っている人の背後には、正しい情報を知らないエンジニアが大勢いると言うことなのです。正しい情報を得ずに仕事で使っているエンジニアは自分が思っている以上にいると言うことです。 (もちろんこのような会社ばかりだとは思いませんが、実はJavaのことよく知らずに使っているJavaエンジニアの数は想像以上に多いとも思っています。)

なので自分達が得た正しい情報を身近な組織やチームに発信をすることが大事なのではないでしょうか?

  • 少なくとも開発チームのテックリーダーは、正しい情報を取得することを心がける。
  • 正しい情報を持っている人は、少なくとも社内やチーム内にその情報を発信する。
  • 自分たちのプロダクトのJDKの選択を社外にアウトプットする

今回このブログを書こうと思った理由もそんな所で、既に今回の変更の詳細については昨年の時点で社内Wikiでは発信していていたのですが「自分や組織が理解出来ていれば良い」だと誤解は解消されないからと感じたからでした。

じゃあ自分の組織はどうしているか?

今の会社はリセラーで直接の開発はしていませんが、販売しているメーカーからは、Oracle JDK(有償)とAdoptOpenJDK(無償)の2種類を動作サポートとするようです。 また製品の既存バージョンに対しては引き続きJava 8のみをサポートし、次の新バージョンからJava 11も動作サポートするようです。すなわちJava 8または11のLTSを対象にして製品開発が進められていくと考えられます。

まとめ

今回のJavaのリリース方針とサポートプランの変更は、Javaエンジニアの半数ひょっとするかなりの人数が誤った情報を信じ、正しい情報は自分自身で取りに行かないといけない状況になってしまっていると感じています。 なので情報を得た人達が積極的に正しい情報を発信したり、誤解に気づけたなら誤解した理由を発信することも大事だと思いますので、このブログを見て共感いただけたなら社内にも社外にもどんどん発信してもらえればいいなと思います。

(追記) こちらの記事を読んでコメントを下さった @yamadamn さんからこんな返事を頂きました。

確かにきしださんやViViさんが仰るように「全て理解しているけど、これまで考えなくて良かったことを検討・対応・調整しなければいけなくなった」といった業務としてのコストが掛かることで"実質有償化"と捉えている方もいそうですね。
逆にOpenJDKの選択肢が増えたことで、どれを選べばいいかを考える必要もありますので。

参考

この話を読んでも理解できないことは以下です。
私のこの記事を読んでも、以下のような実際にこれからもJavaを使っていくために必要な情報の答えは得られないと思いますので、こちらのリンクなどをご覧いただければと思います。

Oracle Java SE Supportロードマップ | Oracle 日本

Java SE 一般的なFAQ | Oracle 日本

JDK:新しいリリースモデル解説 @ 富山 BuriKaigi 2019

JDK、Oracle JDK、OpenJDK、Java SEってなに? - Qiita

Javaは今も無償です - Google ドキュメント

JDKの長期商用サポート(LTS)の提供ベンダー比較(無償利用についても言及あり) - Qiita

Javaはオラクルのもの?」、「いいえ、これからもJavaコミュニティのものです!」――Javaエバンジェリスト寺田佳央氏が、Javaの現在、未来を語る | Oracle 日本

JJUG CCC 2018 Fallに参加しました

今年もJJUG CCC に参加してきました。 例年に比べて遅めの開催だったので外は寒かった。 http://www.java-users.jp/ccc2018fall/#/www.java-users.jp

ふつうのJavaアプリ開発のための自動テスト戦略

speakerdeck.com

自動テストを高速化するために、テスト設計を見直したお話。

最近ではTDDなども認知されて来て、テストコードを書くのも当たり前になって来たと思いますが、それ故に、テスタビリティを考えた設計や構造にしないと、テストの実行時間だけが増えるだけで、継続的な改善が出来なくなり、本来の自動テストの目的が失われてしまいます。

ここでは特にテスト時間が長くなる主な要因の、Springコンテナ起動やDBとの接続先などの環境周りについて改善したことを紹介していました。

レイヤー階層にして、フレームワークや環境に依存しないモジュールを多く作ることが大事で、恐らくそれはDDDなどのドメイン層のようなビジネスロジックに切り出すことなんだなと思いました。

ドメイン駆動設計とSpring Bootを活用したアプリケーション開発

speakerdeck.com

SpringBootのチュートリアルを進めて「SpringBoot完全にマスターした」状態で、業務アプリケーションを開発していったら、ドメインモデル貧血症に陥ってしまった。そこからDDDでどうやって改善していったかと言うお話。

恐らくリクエスト単位にSpringBootに依存しているファイルにビジネスロジックを作ってしまい、テストもしづらく、要求の変化に対応しにくい作りになってしまったのだと思います。

自分も以前の現場で、Strutsを利用したアプリケーションで、Actionクラスに沢山ロジックを詰め込んで、環境依存も激しいスパゲッティコードばかりのシステムに携わって似たような経験をしたことを思い出しました。

フレームワークで何でもやろうとせずに、フレームワークに任せるべき所とフレームワークに依存しない業務や振る舞いをしっかり把握して、構造化するためにもDDDを知ることが大事だと改めて認識しました。

The Silence of the Lambs: Promoting and Inspecting Source Code and Binaries, in Continuous Delivery Pipelines

http://www.java-users.jp/ccc2018fall/#/sessions/849342fa-7bfc-417f-96b5-71f76df70c2c

海外のJavaチャンピオンの方による、ソースコードとバイナリファイルに対する静的解析の部分に焦点を当て、Jenkin pipelineを使ったデモを見せて頂きました。

ソースコードの静的解析に使っていたSonar Qubeは知っていましたが、バイナリファイルの解析に使っていたTwistlockは初めて知りましたが、システムに使っているライブラリやDockerコンテナにインストールされているソフトウェアのバージョンを読み取り、脆弱性情報を検知してくれるようでした。コードの静的解析は良く使われますが、バイナリレベルで脆弱性を解析まで出来るとより、信頼性の高いシステムがリリースできると思うのでツールを知ることが出来て良かったです。

www.twistlock.com

海外のエンジニアのセッションを通訳無しで聴くのは初めてでした。 正直、話の半分以上は聞き取れなく問いかけられていた事やジョーク的な話題が理解できなかったのが悔しかったです。

思考停止しないアーキテクチャ設計

www.slideshare.net

川島さんによるアーキテクチャ設計で考慮するべき内容をまとめたお話。難しい内容でしたが、自分達のこれまでのシステム設計ではここでお話しされていたことはほとんど考慮していなかったなと反省しました。

様々な視点で考えられるパターンがあり、パターンごとにトレードオフがあって、単純にこれをやればOKみたいな選択(つまりこういう考えが思考停止かな)は無いよと言うのが良くわかりました。

今の仕事や立場では自分でアーキテクチャを設計することがほとんど無いのですが、いずれ携わることもあると思いますのでその時に向けて少しでも勉強しておきたいと思います。

今こそStream API入門

www.slideshare.net

桜庭さんによるStream APIラムダ式の概要と使い方のお話。

「本当は別の内容でCfPを出したけど、JJUGの会長からStreamの話をして欲しいと言われた。」そうなのですが、その辺も含めStreamやラムダ式がまだ広く普及していない現状があるのかなと感じました。

自分自身も仕事で書くコードでは使ったことがなく、書籍やブログを見て触れた程度しかなく、なかなか慣れていなかったので復習も兼ねて聴きました。

「これまでのfor文を使ったイテレーターとの違いと言った視点からのStreamのメリットの説明」と「仕組みの理解は後回しでいいので取り敢えずStreamを書いて慣れよう」と言った話で Stream APIラムダ式への抵抗感を減らしてから、使い方の説明に入ったのでとてもわかりやすかったです。

また、BGMやスライドの画像の中にStreamやラムダ式に関する小ネタが仕込まれているのも楽しかったです。

例題を使った説明では、慣れないうちは中間操作の記述を飛ばしてforEachで処理を書き、処理を少しずつ中間操作に変えて変えて行って、forEachでの処理が無くなるまで繰り返す考え方はとても覚えやすいと感じました。

また「Streamの例外処理への対応が難しくて困っているが、どうするといいか?」と言う質問に「eitherパターン」を紹介されていました。ちょうど前日に会社でStreamを使っている同僚からも同じように例外処理に困っている話を聞いていたので、質問された方共々、大変助かりました。

Migration Guide from Java 8 to Java 11

www.slideshare.net

久保田さんによる、Java 8 から Java 11への以降方法の仕方や注意点のお話です。 今の自分のお仕事で紹介しているA社のツールは現行バージョンはJava 11をサポートしないようで、どの製品も次のバージョンからの対象となるようなのですが、会社で開発しているアドオンなどは近いうちに新バージョンへの対応と合わせてJava 11への移行を検討しなければいけないと思うので聴きました。

説明の中では大きく2つの移行パターンとして「Java 8でコンパイル済みのアプリケーションをJava 11で実行する」と「Java 11でコンパイルし直して実行する」が紹介されていました。自分の中では基本的に後者のJava 11でコンパイルし直すことしか頭になかったので、前者の方法についてなるほどなと思いました。もちろんどちらの方法でもメリット・デメリットがあるわけですが。

またJava 8では使えていたAPIなどが廃止になっているものも多く注意が必要なのとテストが重要なことも理解できました。また今後のリリースサイクルを考えた時にLTSで同じバージョンを数年使う方法もありますが、いざ新しいバージョンに切り替えた時に同じようにAPIが廃止になっていることもあるのかなと思うと、一概にLTSに頼るのではなく半年ごとのバージョンアップで定期的にテストしながら移行するのが結果的に楽になるのかも感じました。

コードをどまんなかに据えた設計アプローチ

speakerdeck.com

irofさんのセッション。設計・ドキュメント・コードはどれも必要なモノやプロセスであることを再認識した上で、プログラマーの欲求や無駄を考えてコードを中心に設計とドキュメントを回していく方法をお話されていました。

従来からの『設計する -> ドキュメントを書く -> コードを書く』の流れを改善していく中で「コード = ドキュメント」と言う考えが増えて来ていると自分は考えています。そこには無駄を減らしたいと言う思いと共にコードを書く時間をふやしたい、綺麗なコードを書きたいという思いや欲求があるからだと思います。

ですが実際はコードがドキュメントの代わりを完全に請け負えることはなく、わかりやすさと言う意味ではコードよりもドキュメントの方が良いのですが、無駄とか欲求を理由にドキュメントを作らないことを正当化しようとしているだけなのかもしれません。また、これはアジャイルマニフェストの「包括的なドキュメントよりも動くソフトウェアを」を誤解したり都合よく解釈して、"アジャイルはドキュメントがいらない"と定義してしまうことと同じと感じました。

お話の中では、ドキュメントが必要である現実から逃げずに、コードを中心とした逆転の発想で『コードによる設計』と言う考えを提示し、コードから意図を汲みやすくする方法やJIGと言うツールを使って書いたコードからドキュメントを出力する方法を説明されていました。

個人的にはこれに加え、テストしやすい設計とコードも意識して取り組んで行きたいなと思いました。

マイクロソフト牛尾さん渡米直前記念」  外資系企業で働くエンジニアの生産性向上物語

http://www.java-users.jp/ccc2018fall/#/sessions/b0657145-4de3-4a64-b02b-83fbc2fdc6b9

牛尾さん、今月末に米MSの部署に異動され、生活拠点もアメリカに移されるんですね。そんな背景の中、同じくMSの寺田さんとのトーク形式で日本のエンジニアに向けて、とても面白くまた考えさせられるお話が聞けました。あっという間に時間も過ぎてしまい、もっと聴きたかったので、牛尾さんが日本に戻られた時などにまたお二人のトークセッションを聴きたいです。

トークの内容は主に「キャリア形成」「情報発信」「英語によるコミュニケーション」の3つで、セッションタイトルにもある”生産性向上”に繋がるようなお話が間接的に聞けた気がしました。

キャリア形成の話では「働き方改革を知りたければ、外資系とか他の会社に入って肌で感じるといい。」とか、「転職について難しく考えすぎでは?自分がどうしたいか目標を建ててそれを達成するための行動をとればいいんじゃないか」とか。情報発信ではブログの使い分けをお話されて、通常のブログは注目されるような記事を書くことを心掛けているが、自分のための技術的な記録はqiitaに書いている。また英語のブログも書いているが海外のエンジニアはそれを意外と読んでいることが多いそうです。英語の話が一番多かった気がしていて「英語が出来ないことで技術を身に付けることに不利が出てしまう」ことや「英語を母国語として使ってない国の中でも日本語が英語と離れた言葉になっている」など話され、牛尾さんも寺田さんも決して若い頃から英語が出来たわけでなく、仕事の中でどんどん英語でコミュニケーションを取るようにしたとのことでした。

全体感想

今回は自分が取り組んでいる技術や、仕事で検討していることを中心に聞いたこともあり、どれもすごく勉強になりました。

また、特にテストやDDDといったキーワードで話を聞いていて、次回に向けて自分もちょっと話できたらいいなと思い浮かんだことがあったので、もしタイミングが合えばCfp出してみようかなと思っちゃいました。

初めて在宅勤務をしたので感想を書いてみる

先日、私用のため早めに帰りたい時があったので、通勤時間を勤務時間に回そうと思って上司に相談したらOKが出たので初めての在宅勤務を行いました。

要約

  • 周りを気にせずリラックスして仕事ができる
  • 会社の文化として時間管理より成果を重視してないと返って働きづらい
  • "仕事してます"アピールのため、普段よりチャットへのコメントが多くなって「ウザくなってる?」とか考えてしまう
  • とはいえ普段は会話で完了してしまうやりとりが、コメントとして残るので見方によってはいいと思う。

在宅勤務制度について

内容は会社に許可をもらっていないのでボカしますが、その日の労働管理は以下のように行います。

  • 労働時間:出退勤をWebで申告する
  • 在席状況:業務開始と終了、外出時は社内チャットで報告する
  • 作業報告:社内のWikiに日報を入力する(フォーマットは自由)

感想

ストレスフリーでリラックスして仕事ができる

家で仕事をするので普段感じるストレスが無くなるのは良かったです。

通勤が無くなるので、時間的な余裕を持って仕事ができました。 更に行き帰りの満員電車の疲労も無いのが大きいですね。

また周りを気にしないでいいのも楽でした。 ラフな服装と楽な体制で仕事したり、家にあるマッサージ機を使いながら進めたり。 お菓子や飲み物を取るのも普段より多かったですね。

オマケでいうと、共働きなので、宅配便や郵便物に対応できたり、洗濯物が干せたり、普段は学童に行ってる子供がまっすぐ家に帰らせることができたりするのも良かったです。

自分のペースで仕事ができる

この日は、頭は使うけど比較的単純な作業だったので集中して進めたいなって思ったので、話しかけられたり、周りの雑音(っていうと失礼かもですが)をシャットダウンできるのが良かったですね。 在宅でもコミュニケーションが必要なら、チャットやメール、Web会議が使って行えますし。

つい「仕事してます」アピールをしたくなってしまう

これはもうこれまでの会社や業務の影響、自分の性格によるものなんですが、周りに自分の姿が見えないので”サボってる”とか"生産性が悪くなっている"とか思われたくなくて、自分の存在をアピールして「ちゃんと仕事してるよ」ってアピールをしちゃうんですよね。

普段よりもwikiのページに反応してコメント出したり、メールに対してすぐ返信したり、チャットに大した事じゃないのにコメントしたり。

今の会社って裁量労働制では無いのですが、普通にみなさん遅くきたり、早く帰っても何も言われないし、むしろ気にして無いんですよね。みんなが同じ感じだから。 僕自身もそこは自分のペースで仕事するのが好きだから、周りがどういう働き方してても気にならないんですよね。

なので他の人が普段よりコメントが多いと「そんなアピールいらないよ」って思っちゃうのに、ついつい自分もコメントが多くなっちゃうんですよね。

で、何が言いたいかって、働き方改革で在宅勤務の採用を考えているって所が多いと思うんですけど、 労働時間の管理を重視して、PCの稼働とか監視とかを考えていると上手くいかないと思うんですよね。 普段よりも緊張しちゃったり、窮屈に感じて返って生産性が悪くなるんじゃ無いかと。

またその考えに派生して在宅勤務は、普段より仕事の作業量を少なくしてもいい気がしますね。

コメントする事で自分の考えがデータに残る

無駄なコメントが多くなる一方で、普段だと会話だけで終わってしまうことでも、何らかのデータとして残るんですよね。なので後でその時の発言を見直したりできるのが少し良いかもと思いました。

会話が苦手な自分としても、コメントで文章を見直しながら伝えたい事を整理できるので、在宅の方がコミュニケーションをしっかり取れているような気もします。

その他、在宅勤務してみて気づいた事

家にモニタが無いのでデュアルモニタで仕事ができない

まぁこれは在宅勤務の回数が増えるようなら買えば良いだけの話ですが。

ただ家のmacを立ち上げながら、デュアルPC状態で仕事できるのでそれはそれで便利でした。 (会社のネットワークには繋げられないので、用途は限られますが。)

行きつけのコーヒーショップに行けなくなった

会社に向かう途中で、アイスコーヒーを買うのがほぼ日課で、最近顔パスでアイスコーヒーを出してくれるようになったんですよ。 それが出来なくなるのがちょっと心残り。 おまけに家の近所にはそういう場所が無い。

まとめ

自分の性格的にも在宅勤務がマッチしてると思ったので、使える時はどんどん使って行きたいです。

ただ、会社の人と顔を合わせたい時もあるので、完全在宅勤務にはしたく無いですね。(週1−2日、会社に行くくらいがちょうど良いかも)

在宅勤務を行うには、監視したり・監視されているような感覚は無くして、個人のペースに任せることが重要だと思いました。