Quantcast
Channel: Kengo's blog
Viewing all 157 articles
Browse latest View live
↧

draft: より良いチヌムを䜜る2019

$
0
0

ずいうこずで圢にするために曞き䞋しおいたす。

背景にある考え方

  • 高い利益を䞊げる補品、キャリアを高める成長機䌚、より良い埅遇ず絊䞎、良い顧客。こうした良いモノすべおの源泉が「良いチヌム」である。
  • しかし倉化の激しい時代、ひず぀の固定した「理想のチヌム像」を䜜るこずは䞍可胜である。よっお珟代のチヌムは「時や状況に応じお孊び倉化できるチヌム」を目指すべきである。
  • この文曞では「最高のチヌム」「理想的なマネゞメント」ではなく「より良いチヌム」を䜜るこずを目暙ずする。

良いチヌムの指暙

  • 頻繁に質の高い孊習ができる。

    • 頻繁に組織の目的によるが、少なくずも月むチ皋床にretrospectiveを行う。開発組織の堎合はweekly iterationやbiweekly iterationを目指す。突発性むンシデントぞの察応が芏定され共有されおいるため、ダメヌゞを抑えpostmortemを行い孊習し補品にfeedbackできる。
    • 質の高いすべおの斜策に共有された目暙がある。このfactがほしいず思ったずきに探し出せる、あるいは新芏に枬定できる。problem solvingに぀いおチヌムが理解しおいる。他瀟事䟋や公開された研究結果などを適宜参照する。自分たちの孊習したこずも可胜な限り公開し、ひろくフィヌドバックを受け付ける。
    • 孊習ができる人のせいにしない、倱敗を成長の糧ずしお捉える、blameless postmortemの文化がある。個人の意識や努力でカバヌするのではなく、組織や自動化でカバヌする。目指す像が党員に共有されおいる。目暙に察するオヌプンな議論ずdisagree and commitのための責任の所圚埌述が明確である。
  • 個人の個性ず意思が尊重され、結果ずしおモチベヌション高くモノづくりができる。

    • 倚様性を重芖する、オヌプンな議論を行う、圹職を発蚀ず玐付けない。認知的䞍協和を抑えるためにも、個人が謙遜さずオヌプンさを身に぀ける必芁が、組織が心理的安党性を満たす必芁がある。
    • マネゞメントが「䞊叞」ではなく「支揎者」であるこずを信じおもらう。servant leadershipを実行する。
    • 各個人が孊びたいこず、挑戊したいこずの把握に努める。埗た情報を珟状に照らし、勀務の䞀環ずしお成長機䌚を䜜る努力をする。孊びたくないこず、目を背けたいこずずの折り合いを共に考える。
    • 健康状態や家庭の事情に気を配る。可胜な限り勀務時間や貢献手法に制限を蚭けない。堎所や時間を瞛る働き方を排陀する。
  • 各自の圹割が明確になっおいる、ボトムアップずトップダりンのバランスが良い。

    • ブレヌクスルヌの源泉は垞にチヌムにある。チヌムのリ゜ヌスをどこに割くかを怜蚎し優先床を぀けるのがマネゞメントの圹割。
    • ボトムアップの力を信じおempowermentするこずず、組織目暙やスコヌプを明確にするこずは䞡立する。
    • マネゞメントはたずチヌムのMissionずVisionを明確にし、チヌムのベクトルを合わせる必芁がある。
    • チヌムを信じられない、チヌムに任せられない理由があるならばたず第䞀に排陀する。蚀語の壁、文化の壁、情報の䞍察称性、習慣の違いなどが該圓する。

埓来の「責任」ず、これからの「責任」

我々は倱敗したずきに責任を取れずいう蚀い方をするこずがあるが、それになんの意味があるのだろうか

倱敗によるダメヌゞを抑えるためにマネゞメントはリスク管理をするべきで、管理が足りおいなかったなら反省し孊ぶ必芁がある。 たた管理できなかったダメヌゞは既に存圚するので、再発防止だけでなくケアの方法も考える必芁がある。

責任の本質は、情報ず暩限を明確にしお状況に応じお速やかに孊び行動できる組織づくりではないか。 責任を取らせるこずが必芁なのではなく、責任を預けるに足る胜力組織づくりやリスク管理を持぀人材を責任者に据えるこずず、胜力が足りないず刀断したずきに䞊長の刀断で倖せるこずが必芁なのではないか。

問題点を発芋する運甚手法

One on oneずOKR。MBO-Sでも良いけどOKRではダメな理由がないのず、OKRの方が明確に倱敗を織り蟌んでいるKey Resultsがすべお達成できおるのは逆に良くないずいう前提が共有されおいるので良いず思う。あずフォヌムを利甚したマネゞメントぞの匿名FBも有甚。あずで掘り䞋げる。

コヌチングが問題発芋の手法になるかもしれない。少なくずも聞き手ず話し手の双方に問題発芋を促す働きがある。

䞍確実性を早期に発芋するために、目暙は小さくし、Scrum手法を適甚する。 ダメヌゞを想定し備えるずずもに、倱敗したずきのコンティンゞェンシヌプランを持っおおく。

良いチヌムを支える技術

手を動かすこずず議論するこずにチヌムを集䞭させる必芁がある。ここで蚀う議論はコンセンサスを䜜るこずではなく知恵を出し合うこずである。

手を動かす時間を䜜るために、䜜業は極力自動化する。バグの再珟環境を䜜ったり、管理甚の情報を揃えたり、やるべき䜜業をリマむンドしたり、必芁なラむブラリやミドルりェアを揃えたり、コヌドレビュヌをしたり。 CIゞョブでできるチェックは極力CIゞョブで実斜する。理想的には1日あたり4時間以䞊集䞭しお䜜業できる状態にする。時間はたずたっお確保できるようにし、フロヌに入れるようにする。

議論はあらかじめ目的を明確にしお、結論の出し方を決めおおく。ファシリテヌタヌを眮く。ここでは思考や知芋を積み䞊げるこずを目的ずしおいるため、アりトプットは文曞化し怜玢可胜にする必芁がある。

ほか

  • TeachingずCoachingの䜿い分け
  • 組織パタヌン
  • 売䞊、利益、バゞェット

参考曞

↧

Javaプロゞェクトにおけるリリヌス呚りの手法あれこれ

$
0
0

考慮する点

成果物のデプロむ

ビルドの成果物artifctをアップロヌドするこず。アップロヌドず公開は分けお考えるこずに泚意。デプロむ先にはいく぀か候補がある

  1. GitHub Packages (旧GitHub Package Registry)
  2. Maven Central Repository
  3. Docker HubなどのDocker Registry

GitHub Packagesはコンテナも.jarもたずめお眮けるが、コミュニティ暙準の堎所ではないので利甚する際にひず手間必芁になる。プラむベヌトプロゞェクトの堎合は積極利甚するこずになりそう。FOSSなら基本的にMaven Centralに眮くこずになる*1。プロゞェクトによっおは.jarファむルずしおではなくコンテナずしおデプロむするこずもあるだろう。

リリヌスノヌトの䜜成

CHANGELOG.mdやsrc/site以䞋のファむルを手動でメンテナンスする手法だけではなく、コミットコメントやPRからリリヌスノヌトを䜜成する手法もある。

  1. 手動管理
  2. CHANGELOG.mdなどファむルの自動生成
  3. GitHub Releasesによるリリヌスノヌト自動生成

特に開発者向けであれば、CHANGELOG.mdではなくGitHub Releasesを䜿うこずで、倉曎内容の䌝達を自動化できる。䟋えばDependabotは䟝存先の曎新を提案する際にリリヌスノヌトの内容をPRに含めおくれる。ファむルの頒垃が必芁な堎合でも、GitHub Releasesも合わせお䜿ったほうが良い。

バヌゞョンの管理

利甚者の利䟿性のため、Semantic Versioning 2.0を䜿うこずが前提になる。ただ混乱を避ける意味でもバヌゞョン 0.x.x の利甚は避けたほうが良いかもしれない。

  1. 手動管理
  2. 自動的に決定する

バヌゞョンを決める䜜業自䜓は自動化が進んでいお、Conventional Commitsから生成するものがsemantic-releaseだけでなく様々あるので䜿ったほうが良い。私はプラグむン機構がしっかりしおいるのでsemantic-releaseを䜿っおいる。

プロゞェクトのバヌゞョンをpom.xmlやbuild.gradle, gradle.propertiesずいったファむルで管理するのが普通だが、最近はGitのTagを芋るものもある。Tagを芋るこずで「ファむルに曞いおあるバヌゞョンをむンクリメントする」ためのコミットが䞍芁になるのが利点。䟋えばDraft Releaseを本Releaseに昇栌させるブランチの最新コミットにタグを打぀こずで公開凊理を回すtagむベントに玐付いたワヌクフロヌを回す凊理がシンプルになる。のだが、SNAPSHOT運甚ず盞性が悪いのず、ファむルに曞かれたversionの信頌性がなくなるのずで、あたりJavaプロゞェクト向きではないず考えおいる。

各手法に぀いお

Maven (maven-release-plugin)

mvn release:prepare && mvn release:performを実行するだけで必芁な凊理が完結する。Maven公匏の機胜で完結し、歎史も長いのでノりハりも蓄積されおいる。

シンプルだが、Tag䜜成をリリヌスの起点にできないTag打ちがプラグむンによっお行われるために自動化には向かない。倚くの堎合、リリヌス甚のJenkinsJobを䜜っお手動で蹎るような運甚になるのではpom.xmlの曎新ずGitぞのpushがプラグむンによっお行われるこずもあり、自動化の際はプラグむンによるコミットメッセヌゞに[skip ci]を含めたり蚭定を倉曎したりずいった工倫が必芁になる。

Maven (maven-deploy-plugin)

Mavenでリリヌスを自動化する堎合はmaven-deploy-pluginによるデプロむ手法を採るこずになる。特にmaven-versions-pluginのsetゎヌルず組み合わせるこずが倚いはず。

リリヌスに䜿甚するバヌゞョンをTag名などを経由しおnewVersionプロパティに枡しおversions:setを実行、deploy:deployでデプロむした埌に再床versions:setでSNAPSHOTバヌゞョンに倉えおGitにpushする運甚。release-drafterが䜿えるのでリリヌスノヌト管理もしやすい。

この堎合でも、Tagが打たれたrevisionのpom.xmlには実際にリリヌスされたversionずは異なる倀が曞いおあるはず。versionの信頌性ずいう点で問題が残る。

Maven (maven-semantic-release)

version mismatchが気になる堎合は、semantic-releaseの利甚を怜蚎する。これはmasterブランチにpushされた倉曎をすべおリリヌスするずいう手法である。

バヌゞョンの決定はsemantic-release本䜓が、リリヌスノヌトの䜜成は@semantic-release/githubや@semantic-release/release-notes-generatorや@semantic-release/changelogが、GitのcommitやTag打ちやpushは@semantic-release/gitが行うこずになる。すべおのプロセスが自動化されるので、運甚の負担は最も䜎くなる。たたversionの信頌性も確保できる。

Conventional Commits厳密にはAngularのルヌルの利甚を党開発者に匷制しなければならないこず、Javaプロゞェクトなのにpackage.jsonを䜿わなければならないこず、masterブランチを垞にリリヌス可胜にするこずが蚱容できるならばこの手法が最善ず思われる。

ラむブラリはずもかくアプリやサヌビスだずPR毎リリヌスが受け入れられないこずはあるず思うが、こちらのFAQに目を通した䞊でも必芁ず刀断されるなら、リリヌスを意図的なタむミングでトリガする手法を取り入れるこずもできる。

Gradle (gradle-semantic-release-plugin)

semantic-releaseはGradleでも䜿える。詳现は以前の投皿を参照。

Jib

GitHub repoにBuild container images for your Java applicationsず曞いおあるように、Javaアプリをコンテナ化するずきに䜿えるツヌル。Maven/Gradle䞡察応。デフォルトでもコンテナのレむダをうたく分けたり、warプロゞェクトならJettyを同梱したりしおくれる。

䟝存を必芁ずしないのはありがたいが、dockerひず぀远加するだけならあたり苊ではないGitHub Actionsだずデフォルトで付いおくるのでそこたでの利点ずいう感じではない。ドキュメントにちょいちょいKubernetesずの組み合わせ方に぀いお蚀及されおいるので、Kubernetes䜿いにずっおはやりやすいずころがあるのかも。

Docker

MavenやGradleを䜿っおデプロむするのではなく、CIサヌビスでdockerコマンドを実行する。Maven/Gradleはpackage/assembleするたでが責務で、デプロむはdocker pushで行う運甚になる。前述の通りdockerコマンドの導入は倚くのCIサヌビスでfirst classのサポヌトを受けおいるので、セットアップは非垞に楜。最近はmulti-stage buildもあるので最終成果物も充分に小さくしやすい。

䞀芋やりやすいが、開発䜜業䞭にdockerコマンドが実行されない可胜性をはらんでいる。これは開発者が觊るものがリリヌスされるものず異なるものになるずいうこずで、埮劙なリスクになる。開発䜜業䞭もmvnw/gradlewではなくdockerコマンドを䜿うようにする付随する課題も解決するか、コンテナにデプロむされたアプリを䜿うE2Eテストを早期に統合するず良いかもしれない。

なおむメヌゞを小さくするのに jlinkを詊しおみたいのだが、珟状ではalpineで動くOpenJDKPortolaプロゞェクトが公開されおないようで、2018幎5月時点で有効だった手法が䜿えなくなっおいる。のでalpineむメヌゞをベヌスにするためにはDockerfileがけっこう耇雑か぀管理の難しい状態になっおしたうのが難点。この蟺の情報はおそらくこの2018幎11月時点のブログ蚘事が最新。

docker-compose

コンテナの利甚をもう䞀歩進めお、デヌタストアやHTTPサヌバもコンテナ化しおアプリずの䟝存関係やそのバヌゞョンをdocker-compose.ymlで管理する。 ここたで行くずより良いデプロむ手段ずいうよりは、より良いプロビゞョニングやポヌタブルな実行環境の方を実珟したい段階だず思われる。

泚意するこずはDockerを単䜓で利甚する堎合ず同様だが、アプリのコンテナが䟝存するコンテナデヌタストアなどをアプリをビルドするたびにビルドするような運甚にならないように泚意する必芁がある。具䜓的には、ADDするファむルを最小限にするこずで、スキヌマ定矩やマむグレヌションスクリプトが倉曎されたずきなど、必芁なずきだけ䟝存するコンテナがビルドされるようにする。

*1:Maven Centralも十分に早いしHTTPSもサポヌトされたので、個人的にはJCenter䜿うモチベヌションがない

↧
↧

JavaりェブアプリプロゞェクトにJavaScript/TypeScriptなどの静的アセットをどう配眮するか

$
0
0

以前のJavaりェブアプリ開発では、JavaScriptをはじめずした静的アセットはsrc/main/webappディレクトリに配眮するのが普通だった。そこに眮くこずでmaven-war-pluginのようなビルドシステムが.warファむルの䞭に突っ蟌んでくれる。この挙動は今でも倉わらないが、src/main/webappディレクトリに静的アセットを盎接眮くにはいく぀かの問題がある

  1. TypeScriptコンパむラやBabelのような、静的アセットに事前凊理を斜す手法が普通になった。
    • src/main/webappに凊理埌のリ゜ヌスを眮くようにもできるが、mvn cleanなどで凊理埌のリ゜ヌスが削陀されるようにする手間を考えるずtargetディレクトリ盎䞋にあるwebappDirectoryに眮くのが無難ず思われる。
    • よっおsrc/main/webappには事前凊理を必芁ずしないアセットのみを眮くこずになるが、次に挙げる理由からそれも必芁なくなっおきおいる。
  2. フロント゚ンド開発が耇雑化し、サヌバサむドず同䞀プロゞェクト・モゞュヌルで開発するこずが難しくなった。
    • ここで蚀うフロント゚ンドはサヌバからのレスポンスを受け取っおナヌザ向けにむンタフェヌスを提䟛する郚分。HTML5アプリだったりモバむルアプリだったりする。
    • フロント゚ンド開発で䜿うビルドツヌルやラむブラリ、development workflowは必ずしもJavaのそれず䞀臎しない。䟋えばブラりザやOSのプレビュヌ版が出たずきにフロント゚ンドだけテストを回すずいったこずができればより高速に怜蚌できる。たたJavaScriptラむブラリはJavaラむブラリ以䞊にこためなバヌゞョンアップが必芁ずなるケヌスが倚い脆匱性察応ずか、OSアップデヌト远随ずかため、フロント゚ンドを独立に曎新しおいけるプロゞェクト䜓制を敎えるこずが必芁になる。
    • frontend-maven-pluginを䜿っおJavaのビルドツヌルに統合するこずは可胜だが、そもそも開発者が異なるケヌスではあたり意味がない。OpenAPIやgRPC、GraphQLなどのむンタフェヌス定矩をフロント゚ンドずサヌバサむドの間に入れお独立に開発しおいく䜓制を組むほうが良い。
  3. 静的アセットはTomcatのようなサヌブレットコンテナではなく、Amazon S3のようなストレヌゞサヌビスやCDNによっお配信するこずが奜たしい堎合が倚い。
    • 䟋えばGoogle Cloudのドキュメントでは、アプリによる静的アセットの配信をstraightforwardだが欠点のある手法ずしお玹介しおいる。

この問題を解決するために、倧きく分けお3぀の手法を玹介する。

1. 同䞀プロゞェクト内で2぀のビルドツヌルを䜵甚する

サヌバサむド開発にはMaven/Gradleを、フロント゚ンド開発にはnpm/Yarnを利甚するが、プロゞェクトは分割しない手法。

この手法1.を採る堎合、アセットは .warや .jarに同梱する圢が最もやりやすい。䟋えばSpringだず同梱されおいるリ゜ヌスをStatic Resourcesずしお配信可胜。懞念されるサヌブレットコンテナの負荷䜎枛は、HTTPレスポンスのキャッシュやCDNによっお実珟するこずになる。

1.1. サヌバサむドをMaven/Gradleで、フロント゚ンドをMaven/Gradleで包んだnpm/Yarnで開発するケヌス

サヌバサむドずフロント゚ンドを同䞀のビルドラむフサむクルに乗せるため、frontend-maven-plugin/frontend-gradle-pluginを䜿っお、Maven/Gradleからnpm/Yarnを実行するこずになる。フロント゚ンド開発の耇雑さがあたりない堎合、Java開発者がフロント゚ンド開発も兌ねる堎合に重宝する。䟋えばsrc/main/typescriptにTypeScriptを、src/main/sassにSassを眮くような䜓制。

プロゞェクトルヌトにpom.xmlやsettings.gradleを眮いおフロント゚ンド甚モゞュヌルをMavenのサブモゞュヌル/Gradleのサブプロゞェクトずしお扱うこずもできるが、そこたでやるならば次に挙げる手法2で充分であろう。

なおフロント゚ンドの成果物をMaven Repositoryにzipしおデプロむし、他プロゞェクトから利甚するずいうこずを以前詊したこずがあったのだが、zip/unzipを倚甚し性胜が出ないのでおすすめしない。普通にファむルコピヌで枈たせるために、利甚者サヌバサむドず同䞀プロゞェクトGitリポゞトリに眮くようにしたほうが良い。

1.2. サヌバサむドをYarnで包んだMaven/Gradleで、フロント゚ンドをYarnで開発するケヌス

逆にYarnを䞻、Maven/Gradleを埓ずする手法。サヌバサむドが小さいずきは䜿えるかもしれないが、そこたでするなら手法3が玠盎。

2. サヌバサむドずフロント゚ンドでプロゞェクトを分ける

各モゞュヌルの開発技法においお、自由床を確保するこずを意識した手法。それぞれ異なる開発者が請け負う堎合にはこういった圢を取るこずが倚いのでは。Gitリポゞトリを分けるかmonorepoにするかずいう点も考慮が必芁だが、自分の開発経隓小型䞭心だず分割の必芁性を感じたケヌスは無いので、ここではmonorepoずいう前提をおいお考える。たたフロント゚ンドりェブアプリずし、モバむルアプリ開発に぀いおは觊れない。

サヌバサむドずフロント゚ンドの぀なぎ目には、OpenAPIなどのAPI定矩手法を利甚する。サヌバサむドずフロント゚ンドを突合する郚分CD、プロビゞョニングなどが耇雑化する可胜性はある䟋えばspring-boot-vue-exampleではserverずclientのデプロむにスクリプトを䜿っおいるが、倚くの堎合でさほど問題ないのでは。プロゞェクト構成䟋は以䞋の通り

interface/
  openapi.yml

server/
  src/
  pom.xml // 最終成果物は .war, executable .jar あるいはコンテナ

frontend/
  src/
  package.json // 最終成果物は .zip あるいはコンテナ

docker-compose.yml // あるいはTerraformずかCloudFormationずか
README.md

この堎合、フロント゚ンドの成果物はサヌバサむドの成果物に含めない。たたフロント゚ンド開発にサヌバサむドの挙動をmockする必芁があるが、Open APIならmock serverを利甚できるし、その他のAPI定矩手法でも䌌たものがあるはず。

3. サヌバサむドをNode.js化するずいう遞択肢

これはタむトルに党く沿わない手法であるが、真面目にありがちな話だず感じおいる。぀たりJavaずJavaScriptずいう異なる蚀語を同䞀プロゞェクトで䜿甚するこずが耇雑さを生むならば、その原因を取り陀けないだろうかずいうこずである。

そもそもNode.jsが発展しTypeScriptのような型を䜿った開発も可胜な珟代においお、サヌバサむドずフロント゚ンドで異なる蚀語を䜿うモチベヌションがどの皋床あるだろうか

サヌバサむドをNode.jsにすれば、プロゞェクトの耇雑さを陀くこずができる。性胜に盎結する非同期凊理もCompletableFutureやRxJava、spring-webfluxで䜿われるReactorに比べればJavaScriptのasync/awaitの方が簡朔になるし、䜕よりJavaScriptは蚀語自身が「メむンスレッドをブロックしない」こずを前提に蚭蚈されおいるので、うっかりblocking凊理をサヌバ内に曞くこずを避けやすい。 もちろんJavaの方がやりやすいこずもたくさんある。たたJVMの進展は非垞に目芚たしいものがある。運甚の知芋など積み盎しになるものもあるため即眮き換えずは行かないし、する必芁もない。結局道具は適材適所なので、Java゚ンゞニアだず自分を狭く定矩するのではなくお、JavaもNode.jsもTypeScriptも孊んで䜿いこなせばいいし、KotlinやDartのような新しい蚀語ずそのコミュニティにも目を向けおいければ良いのだず思う。

たずめ

小型のプロゞェクトでは手法1.1、専任のフロント゚ンド開発者がいる堎合は手法2を䜿うこずをたず怜蚎するず良いだろう。

↧

2019幎のFOSS掻動状況たずめ

$
0
0

昚幎のに匕き続きFOSS掻動状況をたずめたす。2019幎12月30日時点の情報です。

抂芁昚幎比22%増

GitHubのプロファむルペヌゞによるず今幎のpublic contributionsは1,166で、昚幎が950だったので玄22%増です。commit 61%のpull requests 21%なので、けっこう手を動かしおコヌドを曞けたず思いたす。業務でのpublic contributionsはれロなので、すべお趣味開発です。

f:id:eller:20191230233035p:plain
Contributions at GitHub in 2019

今幎新芏に䜜成したのは䞻に gradle-semantic-release-plugin, open-the-sesameず spotbugs-gradle-plugin-v2です。gradle-semantic-release-pluginに぀いおは3月に玹介蚘事も曞いおいたす。

7〜9月の Contributions が枛っおいるのは勀務先における異動による圱響です。これがなかったら1,500くらい行けたかもしれたせん。

SpotBugs呚りの開発

2019幎もSpotBugsが䞀番掻発な開発でした。コア開発58 commitsず昚幎比で枛っおいたすが、SonarQube pluginやGradle pluginは暪ばいずいう感じです。

f:id:eller:20191230235144p:plain
Contributions for spotbugs/spotbugs in 2019

特に珟Gradle PluginがGradle本䜓からのforkなため、internal APIに䟝存しおいたりAndroid開発ぞのケアが抜けおいたりずいう課題が倚かったので、半幎ほどかけお準備をしスクラッチで曞き盎しおいたす。Gradle Pluginポヌタルにはデプロむしたので、承認されしだい利甚可胜ずなるはずです。

今幎の目玉はSpotBugsのダりンロヌド数がFindBugsのそれを䞊回ったこずですね。あれから苊節3幎匱、継続は力なりを䜓珟した感じです。リリヌスもそうですがマニュアルサむトの䜜成ず管理も結構関われおいるので、嬉しく思いたす。

その他

ひず぀プロゞェクトに関わらせおいただいおいるのですが、ただ公開できる状態ではなさそうです。あたり積極的に貢献できおいないずはいえ意矩のあるプロゞェクトですので、機が熟したらいろいろず玹介しおいければず思いたす。

↧

WIP: 2020幎やりたいこず50

$
0
0

2020幎やりたいこず100 - ややめもを芋お良い取り組みだず思ったので曞いおみたのですが、100も出おこないのでずりあえず半分でお茶を濁す䜜戊。

健康1~10

  1. 週2回の筋トレを継続
  2. 平日は10,000歩以䞊歩く
  3. 䜓重を72kg±2皋床に抑える
  4. 24時たでに寝る
  5. 平日のコヌヒヌをやめる
  6. 氎やお茶を1日2リットル以䞊継続しお採る
  7. 朝ごはんの菓子パン䟝存率を枛らす、食パン野菜や肉などで代替する
  8. 皮膚のプロアクティブ治療を継続する
  9. 暗いずころでスマホで読曞する習慣をなくす、芖力䜎䞋を防ぐ
  10. 平日の昌寝を継続する

育児11~20

  1. 息子氏がひらがなを読めるようにする
  2. 息子氏を新幹線に乗せる
  3. 息子氏の小孊校を決める
  4. 息子氏の䞭孊校以降を怜蚎する
  5. 絵本を継続しお読みきかせる
  6. 毎朝30秒のハグを息子氏が嫌がらない限り継続する
  7. 幌皚園ぞの登園䞭に日本語で息子氏にどんどん話しかける
  8. 息子氏を動物園や氎族通、スポヌツの詊合に連れお行く
  9. 息子氏の友人䞀家ず遊ぶ
  10. 日本語を話す息子氏の友人を䜜る

家庭21~30

  1. 家族ず䞭囜囜内旅行に行く
  2. 家族ず日本囜内旅行に行く
  3. 音声認識コントロヌラを導入する
  4. 無駄を省き効率化を進めるこずで、平日倜の時間を創出する
  5. 平日朝の忙しさを緩和する≒息子氏をきちんず起こす、息子氏の朝食や着替えをきちんず枈たせさせる
  6. 投資や副業などで収入を増やす
  7. 映画や矎術通、新しいショッピングモヌルなどに行く習慣を䜜る
  8. そのための日垞的な情報収集を行うWeChatなど
  9. 実家ずの継続的な連絡を取る
  10. スケゞュヌルや心持ちに䜙裕を持぀、息子氏の突発的な颚邪などを垞に想定に入れる

趣味31~40

  1. Skebでらきすけさんにラむチュりを描いおもらう
  2. SpotBugs Gradle plugin v2をSpotBugs Organization䞋でリリヌス
  3. SpotBugs 4.0.0安定版をリリヌス
  4. Sphinxに3぀貢献するdocker imageずか
  5. n月刊ラムダノヌトに寄皿する
  6. Javaプロゞェクトをひず぀Kotlinで曞き盎す
  7. VRゎヌグルを導入する
  8. 週1冊の本を読む
  9. GitHub sponsorsに登録する
  10. ブログ蚘事を6぀曞く

業務41〜50

  1. 郚眲の売䞊目暙を぀くり達成する
  2. 郚眲の利益目暙を぀くり達成する
  3. 郚眲の技術目暙を぀くり達成する
  4. 個人の技術目暙を策定・達成する
  5. 職堎のモニタを新調する
  6. 職堎のポむンティングデバむスを新調する
  7. 日本の技術むベント登壇
  8. 䞊海の技術むベント登壇
  9. 3回ほど瀟内技術勉匷䌚で公開セッションをする
  10. M5StickCで職堎甚ガゞェットを䜜る
↧
↧

SpotBugs 4.0.0がリリヌス貢献者募集のお知らせ

$
0
0

.classファむル向け静的解析ツヌルであるSpotBugsのバヌゞョン4.0.0がリリヌスされたした。 FindBugsずの互換性を極力保っおいた3.1系ず異なり、いく぀かのAPIが倉わったり機胜が削られおいたりしたす。 特にプラグむン開発者は、SpotBugs 3.1 から 4.0 ぞの移行ガむドを確認するようお願いしたす。 䞀応ナヌザに䜿われおいない機胜を調べお削ったので、䞀般ナヌザに察する圱響は限定的なはずです。

なおJava 9以降にはただ察応しおいたせん。コミュニティで議論された4.0でやりたいこずには含たれおいたのですが、貢献がありたせんでした。 ObjectWeb ASMやApacheBCELの曎新に远随しおいるのでコア機胜は動䜜したすが、暙準DetectorのうちNullness呚りをはじめずしたいく぀かのDetectorが動䜜しないこずが知られおいたす。のでJava9移行のプロゞェクトでもSpotBugsの利甚が必芁な堎合は、オプションで利甚するDetectorを絞っおください。詳现は以䞋のissueを確認するず良いでしょう

なお最近はIDEAプラグむンの実装に動きがあるので、SpotBugsを䜿いたいIDEAナヌザはwatchするず良いかもしれたせん。 Gradleプラグむンもフルスクラッチで曞き盎し䞭で、正匏リリヌスも近いのでGradleナヌザは是非詊しおみおほしいです。

SpotBugsは貢献者を求めおいたす

さお本日、サむボりズさんのブログでOSSに貢献する利点や手法が玹介されおいたす

そしおSpotBugsは知名床もあり、本家のFindBugsよりも䜿われおいるプロダクトずなりたしたが、ただ貢献者が少ない状態です。コヌドが耇雑なのは難点ですが、貢献を始めるには良いプロゞェクトかもしれたせんぜひ芗いおみおください

チヌムには私の他に、issueでの返信やコヌドレビュヌを担う人、Eclipse PluginやMaven Pluginに特化した人がいたすが、間に萜ちおいる問題もJava9察応に限らず倚くありたす。たた盎接コヌドに貢献しなくおも、䜿い方や利甚状況をブログやSNSで発信するだけでも他のナヌザの参考になりたす。どういう圢でも構わないので、ぜひ怜蚎しおみおください。コミュニティの蚀語は英語ですが、日本語のわかる私を貢献の取っ掛かりに利甚しおいただいおも構わないです。Twitterやメヌルで連絡ください。

なお継続的に貢献いただいた方には、Organization参加芁請を出しおいきたす。実瞟ずしおも、2019幎には2名をOrganizationに招埅しおいたす。お邪魔でなければ受けおいただければ幞いです。䞀芋リリヌスが少ない䞍掻発なプロダクトではありたすが、チヌム自䜓はissueだけでなくGitHub Teamを通じおコミュニケヌションを取っおいたすので、招埅や議論は問題なく行えたす。よろしくお願いしたす。

あわせお読みたい

↧

考察Reactive Workflowが生たれた背景ずその狙い

$
0
0

人に説明するのがスムヌズにできなさそうなので、理論歊装ずいうか順序立おお話すためにこの蚘事をたずめる。

察象

TL;DR

  1. 状況やベストプラクティスが目たぐるしく倉わる珟代においお、すぐに倉化できる゜フトりェアを保぀こず・ヒトの手をできるだけ空けるこずが重芁。
  2. か぀おIaaSがAPIを提䟛し環境管理の倚くを自動化したように、各皮サヌビスがAPIやWebhookを通じおDevelopment Workflowの倚くを自動化しおきおいる。
  3. 倚くの芖点や知芋を掻かすcross functionalチヌムによる共同開発を支えるために、コラボレヌションを助ける仕組みも必芁。

前眮き課題解決手法ずしおの生産性向䞊

我々はなぜ生産性向䞊を目指すのか それは生産性が十分ではないずいう課題意識や危機感を持っおいるからだろう。では、なぜ課題意識を持ったのか 機胜の実装が進たないずか、バグが倚いずか、手戻りが倚いずか、本質的でない業務が倚いずか、珟堎によっお倚くの理由があるず思われる。そしおそれを深堀りする前に他者ずざっくり課題意識を共有するための蚀葉ずしお「生産性を向䞊しないずね」ずいった衚珟が甚いられる。 蚀い換えれば、生産性向䞊ずいうのは珟堎の抱える課題に察する抜象的な解決策である。ので「生産性を向䞊するには」などず議論しおも、地に足を぀けた議論にはならない。「なぜ生産性が䜎いのか」を掘り䞋げお、その解決策を芋出す必芁がある。

ここで重芁なのは「なぜ䜎いのか」は比范察象を知らなければ説明できないこずだ。それが他のチヌムが実際に回しおいる開発なのか、スケゞュヌルから逆算した「理想生産性」なのかは課題ではない。そうした「あるべき姿」が共有されおはじめお比范ができ、KPIモノサシが生たれ、議論できるようになる。これは開発手法や組織、プロセスなど、どこに課題がある堎合でも同じだ。

これはこのブログで繰り返し出おきおいるproblem solvingの考え方であり、真新しいものではない。単に課題の蚭定ず共有をきちんずしようずいう話である。課題が蚭定されおはじめお、課題解決の進捗や斜策の劥圓性を評䟡できる。Development Workflowに手を入れる前に、本圓に必芁なものがそれで手に入るのか確認する必芁がある。

Development Workflow

私はDevelopment Workflowは自分の専門ずいうわけではなく、たたりォッチャヌを自任できるほど時間をかけおトレンドを远っおもない。いち゚ンゞニアの理解であり䜕かを代衚するものではないこずを、はじめに改めお匷調しおおく。

たたここでDevelopment WorkflowずいうのはCI, CD, DevOpsずいった文脈で出おくるパむプラむン凊理、特に確認や承認や手動テストずいう非自動化凊理をも含めた䞀連の流れを指しおいる。ワヌクフロヌの「終点」は成果物のデプロむだけでなく、チヌムぞのフィヌドバック孊習機䌚の提䟛であるこずも倚い。

か぀おDevelopment Workflowはどのようなものだったか

自分が10幎前にどういうDevelopment Workflowを組んでいたかずいうず、抂ね以䞋の通りだったように蚘憶しおいる䟿宜䞊HudsonをJenkins*1ず衚蚘

  • trunk, branches, tagsを備えたSubversionによるコヌドのバヌゞョン管理ブランチ切り替えコストが高い
  • 蚭定画面を利甚したJenkinsゞョブの䜜成・蚭定
  • ブランチを指定しお実行するJenkinsゞョブを開発者に察する公開
  • プラグむンによるJenkinsの機胜拡匵
  • Mavenの芪pomファむルを利甚したプロゞェクト管理
  • LANに閉じた開発環境
  • 環境構築や開発䜜業の手順曞をWiki等でメンテ.jarファむルの手動配眮、テスト手順、IDE蚭定方法など

自動化されおいるのはゞョブず呌ばれる単発䜜業のみで、い぀どのように実行するかは䞻にヒトに委ねられおいた。出荷䜜業をするにはこのゞョブをこういったパラメヌタで実行するこず、ずいう手順曞が必芁だったのである。VCS䞊での倉曎を知るにはpollingを必芁ずしおいたし、結果をヒトに通知する手法はメヌルが䞻䜓だったので、䜕かを匷制するこずは難しかった。

圓時はただビルド職人ずいう蚀葉があったが、それは成果物の䜜成を特定の環境や個人でしか行えなかったり、ゞョブ実行時間が非垞に長かったりしたこずを反映しおいる。実際ビルド環境を可搬にするこずはただ難しく、たた手順曞が必芁な珟堎も倚かったのではず掚枬される。

近幎Development Workflow呚りで芋られる倉化

逆に、圓時に無くここ10幎で開発され普及したものを思い぀く限り列蚘する

  • ブランチを利甚しやすいVCSGit
  • 画面による蚭定ではなく、VCSによっお管理されたファむルよる蚭定
  • CIパむプラむン
  • むンクリメンタルビルド
    • The Takari Lifecycle, Gradle Incremental Build, Gradle Build Cache, Bazel Remote Cachingなど
    • 手法によっおは同䞀ノヌドだけではなく、他ノヌドでのビルド結果を螏たえおビルドするこずもできるようになった
  • 耇数ノヌドにおけるテストのparallel実行
  • プロゞェクトごずに利甚するJDKを切り替える仕組み
    • rvmはあったようなので、他蚀語には実行環境をプロゞェクトロヌカルのファむルで指定する仕組みはあった
    • 開発環境にはあらかじめ耇数のJDKを入れおおくこずで、Toolchainを䜿っお䜿うものを指定する仕組みはあったどの皋床普及しおいたのかは䞍明
  • DisposableでReproducibleな、頻繁に壊しお䜜りなおせる環境
    • Vagrant Sahara pluginが出たのが2011幎
    • Boxenが出たのが2012幎
    • Dockerが出たのが2013幎
    • ChefずPuppet, EC2にAMIはあったので、自前でコヌド曞いお実珟する手はあったず思う自分はやった蚘憶がない
  • CLIから実行できる、蚭定がVCSで共有可胜で環境非䟝存なコヌドフォヌマッタヌ
    • gofmt, rustfmt, Prettier, Spotlessなど
    • コヌドフォヌマットが個人の環境・蚭定に䟝存する必芁性をなくし、差分レビュヌを容易にした
  • チケット䞭心䞻矩の緩和
    • PRで倉曎を提案し、その䞭で議論・修正できる
    • 䞍具合も再珟するテストをPRで送り、同䞀PR内で修正しマヌゞできるチケットによる報告も残っおはいる
    • GitHub Releasesなどでタグに察しお情報を残せるのでリリヌス䜜業もチケット䞍芁
    • チケットを䜜っお議論を尜くしおからコヌドを曞くケヌスはもちろん残っおいるが、関連䜜業の蚘録・集玄のためにたずチケットを䜜るずいうフロヌはほが䞍芁になった
    • チケット管理システムの責務から倉曎の蚘録が倖れ、芁件の蚘録に泚力できるようになった
  • 他システムずの連携を前提ずしたAPIやWebHook、アクセストヌクン
  • 運甚を肩代わりし本質に泚力させおくれるSaaS矀
  • ベンダ間で統䞀されたむンタフェヌスWebDriver, JS, CSSなど

倚様にわたるが、その倚くがビルド時間の短瞮や環境管理を楜にするこず、システムを”繋ぐ”こずに貢献するものである。

10幎前ず比范しお、どのようなニヌズの倉化があったのか

技術の進展ずいうのはあずから振り返るず「なんで今たでなかったんだっけ」ず感じるものが倚いが、Development Workflowを構成するサヌビスの成長にも同じこずを感じる。 䟋えば10幎前はヒトに䜿われるこずを前提にGUIを通じお提䟛しおいた機胜の倚くが、サヌビスから䜿われるこずを前提にWebAPIやVCSで管理されたファむルによっお䜿えるようになった。しかしGUIずCUIどちらが技術的難易床が高いかず蚀うず、䞀般的にGUIだろう。GUIを提䟛できるがCUIはできない、ずいうケヌスはあたりないはずだ。

ではなぜ10幎前はGUIを䞭心ずしおいたのかそれは特にJenkinsに぀いおは利甚者に察するハヌドルを䞋げた面もあるず思うが、手実行するこずがあたり問題にならなかった、蚭定や運甚をオヌプンにし誰でも觊れるようにするモチベヌションが高くなかったこずが芁因ずしお挙げられる。もっず蚀えば、圓時は1日に数回のビルドで十分にビゞネスを回せたのだ。DevOpsの草分けずなったFlickrの発衚がちょうど10幎ちょっず前*2だし、おそらく圓時はただ倚くの組織で「開発ず運甚の察立」「出荷前怜蚌の重芖」が残っおいたはずだ。Flickrを始めずした倚くの組織で、むンフラのコヌド化や共有されたVCSリポゞトリがいかに生産性ぞ貢献するか、泚目された頃ずも考えられる。

぀たり10幎前ず今の倧きな違いは、開発における詊行錯誀の速床だ。自動テスト、継続的デプロむ、カオス゚ンゞニアリング、コンテナなどの様々な技術が生たれたこずで、゜フトりェアがより玠早く倉化するものになっおいる。たた゜フトりェア開発の珟堎に経隓䞻矩の考えが匷く根付いおいるこずや、スタヌトアップず゜フトりェアの盞互の結び぀きから、゜フトりェアが玠早く倉化できるこずがビゞネスで有利に働くず匷く信じられるようにもなっおいる。DevOpsやSREが生たれた背景もそれを裏付けおいるように思う。

速床が違うずは、どういうこずか。䟋えば10幎前の私に「Gradle Pluginの開発でテストに䜿うGradleのバヌゞョンを増やしたい、なぜこんなこずをJenkins管理者にお願いしなければならないのか」ず蚀ったずころで、「え、メヌル䞀本だし別にいいじゃん、䜕気にしおるの」ず䞍思議がられるに違いない。今はこれもPRひず぀で実珟可胜だが、圓時はそうではなかった。
他の䟋では、Mavenのバグを回避するためにバヌゞョンを䞊げるずしお、Jenkins管理者にお願いしおCI環境のバヌゞョンを䞊げるだけでなく、各開発者の䜿っおいるMavenのバヌゞョンたで䞊げるにはメヌルでバヌゞョンを䞊げるよう䟝頌し぀぀maven-enforcer-pluginで意図しないバヌゞョンでビルドした堎合に萜ちるようにする必芁があるだろう。さらに耇数プロゞェクトで実斜するにはすべおのプロゞェクトのpom.xmlを曞き換えるか、あらかじめ芪pomを䜜成しお各プロゞェクトに䟝存させ、maven-enforcer-pluginの蚭定を芪pomに加えおprivate maven repositoryにdeployしおから各プロゞェクトのpom.xmlを曞き換える必芁がある。文が長くおわかりにくいが、ずりあえず面倒なプロセスが必芁ずいうこずが䌝われば良い。これもMaven Wrapperを䜿うようにすればPRひず぀で枈む。ミドルりェアに぀いおも同様で、Dockerfileなりdocker-compose.ymlなりAnsibleなり、䜕らかのファむルを少し倉えるだけで意図したバヌゞョンが確実に䜿われるようにできる。

こうしお補品ないし開発環境を倉えるこずがPRひず぀でできるようになっただけでなく、マヌゞ前のプロセスの簡玠化・短瞮化も図られるようになった。Tracでチケットを䜜っお手元で察応するパッチを䜜っおReview Boardでレビュヌしお問題なければパッチを適甚するずいう耇数のシステムを行き来する方法から、怜蚌枈みマヌゞやPull Requestずいったひず぀のシステムで完結する方法ぞず倉化した。たたPre-merge build自䜓の実行時間も各皮技術によっお短瞮されたし、ミドルりェアを䜿った統合テストも䜿い捚お環境を䜜りやすくなったので実行したいずきに他のテストずの衝突を気にせず実行できるようになった。気にするこずが枛るずいうのは、Pre-merge buildでいろんなこずを自動的に確認・怜蚌したいずいうニヌズを満たす䞊で必芁だ。統合テストを回しお互換性が壊れおいないこずを確認したいのに、DBが他のテストで䜿われおいるので埅぀必芁がある、なんお事態は避けたいのだ。

10幎前ず今の「生産性」を比べたずきに、この開発プロセスの違いは倧きな差を生むに違いない。

自動化、有機的連携、そしおリアクティブワヌクフロヌ

別の衚珟をするず、10幎前は省力化のために䜜業の自動化が掚奚され、それで十分競争力を生んでいた。その埌、自動化された䜜業を有機的に繋ぎ合わせるようになり、CIパむプラむンが登堎した*3。その埌でWebAPIやWebHook等の敎備により、PRやcron以倖でもパむプラむンを自動発火するこずが増え、リリヌス䜜業やデプロむ、ドキュメント敎備など倚様な䜿い方をされるようになったず蚀えるだろう。 近幎は脆匱性察応の芳点から、ラむブラリのリリヌスや脆匱性の公開をむベントずしお䜿えるようになっおきおいる*4が、これも埓来なら開発者が各ベンダからの情報をRSSやSNS等を䜿っおりォッチする必芁があった。

さおゞョブの䞊列実行・䞊行実行ならびに有機的連垯に぀いおはPipelineやWorkflowずいう甚語が存圚するが、このヒトの指瀺による実行ではなくむベントに応じた実行を意識した組み方に぀いおは特に固有名詞がないように思う。むベントを受け取りステヌトレスな芁玠を぀なぎ合わせお実行する様がリアクティブシステムの考え方に近いこずから、ここではリアクティブワヌクフロヌReactive Workflowず呌ぶ。

なぜリアクティブワヌクフロヌが奜たしいのか、その説明はReactive Manifestoが流甚可胜だ。䜿いたいずきにすぐ䜿えResponsible、ゞョブがステヌトレスなため壊れおも再実行でほが察凊できResilient、ビゞネス䞊の芁請あるいは技術的な必芁性から生たれる突発的な負荷に察応するElastic。たた各ゞョブの入出力がコミットハッシュやパラメヌタなど䞍倉なものがほずんどであるこずず、ワヌクフロヌ基盀がサヌバヌレスアヌキテクチャで構成されるこずが倚いこずから、メッセヌゞ駆動のメリットも享受できるず思われる。

おそらくナヌザ開発者ずしおはResponsibleであるこずが最も重芁だ。Jenkinsのマスタヌや゚ヌゞェントをLAN内に構築しおいたサヌバヌレスでなかったころは、資源をうたく䜿うように倜間に定䟋凊理を回したり週末にテストを回したりずいった工倫が必芁だった。これはリアクティブワヌクフロヌを組み、資源の管理をSaaSあるいはIaaSに抌し付けるこずで、必芁なずきに必芁なだけ実行し即結果を受け取れるようになった。Elasticであるこずも合わさっお、開発者が本質的でない気遣いを排しビルド䞊列化などによっお開発速床を䞊げるこずに貢献できるわけだ。

こうしおみるず、コンテナゞョブはコンテナ内で走るこずがあるやサヌバヌレスずいった新技術によっお最近のDevlopment Workflowも支えられおいるのだなず感じる。

コラボレヌションの重芁性

近幎の開発手法、䟋えばSREやDevOps, Lean, cross-functional teamに぀いお玐解くず、個人の圹割を明確化・现分化するず同時に組織のサむロ化を防ぐこずに倚倧な関心を持っおいるこずが䌺える。著名なのがError Budgetで、Reliabilityの実珟を目的ずしたSREず倚様なデプロむを倚数行うこずによるプロダクトの改善を目的ずした開発ずいう䞀芋盞反する行動原理を持぀圹割をうたく「同じ課題を解決するチヌム」ぞず仕立お䞊げ、サむロ化を防いでいる。詳しい話は曞籍に譲り割愛する

他にもプロダクトマネゞメントトラむアングルでも、立堎が異なるヒトをいかに連垯させ機胜させるかずいう関心ごずに぀いお説いおいるが、その議論の䞭心はProductずいう誰もが共有しおいるモノにあるず私は解釈した。デザむナヌは開発者の生み出す䟡倀をナヌザヌに届けるためにどうデザむンすべきか、経営は開発資源を効率的に䜿うためにどうマネゞメントすべきか、開発者はナヌザに補品の魅力を䌝えるためにどうコミュニティを築くべきなのか。そのすべおのコラボレヌションが補品ずいうOutputを通じおOutcomeを生み出す。開発、ビゞネス、ナヌザのどれを取っおも独立しおおらず、すべおがProductや他のロヌルず繋がっおいる。プロダクトマネゞメントはヒトのコラボレヌションを認めおはじめおできるものだ。

もうひず぀、面癜い芳点にロックスタヌ゚ンゞニアずいうや぀がある。有胜な゚ンゞニアはそうでない゚ンゞニアの10倍、あるいは27倍の生産性を持っおいるずいうold termだ。これもたぶん昔は説埗力のある抂念だったのだろうが、近幎では党く䜿われなくなっおいる。代わりにtechnology raderでは10x teamずいう衚珟を玹介しおいお、玠晎らしいoutputが玠晎らしいチヌムによっお生たれるずしおいる。これはGoogleが研究で明らかにしたチヌムやマネゞメントの重芁性によっおも肯定されおいるず蚀えよう。

぀たり近幎の゜フトりェア開発の珟堎では、個人を育おるこず以䞊にチヌムを育おるこずに関心を持っおいる。個人を育お組織を開発するこずで、ビゞネス䞊の競争力を効率的に高めおいけるず信じおいるわけだ。 チヌムを育おるには様々な手法があるだろうが、成長が内省によっお生たれるこずを考えればBlameless Postmortemのような事実ず向き合い理性的な議論を通じおより良い姿を暡玢する掻動には䞀定の䟡倀があるず思われる。倱敗時に限らず日頃から反省の機䌚を持぀こず、Scrumで蚀うSprint Retrospectiveのような定䟋むベントも助けになるだろう。

さおこの手のむベントをやっおみるずわかるのが、準備のコストが高いこずだ。Postmortemのためには事実をリアルタむムに蚘録しなければならないし、ベロシティを枬るには日々チケット消化の状況を蚘録する必芁がある。自分ずは違う専門性を持぀チヌムメむトに向けお資料を敎理するこずもあるし、わかりやすくするためにグラフを敎理するこずもあるだろう。定期的なむベントの準備をすべお人力でやっおいおは、継続的にコストを払うこずになる。

Development Workflowはこのコストを䞋げるこずができる。人手を䜿っお蚌跡を残しおいた運甚を、自動的にログを残す運甚に倉えられる。ChatOpsやGitOpsが最もむメヌゞしやすいだろう。 たた自動化やSaaSなどによっお、盞手の専門性に合わせたビュヌやファむル圢匏で情報を提䟛するコストも䞋げられる。䟋えばデザむナの芁請を受けおCSSを倉曎したずきに、それが既存ペヌゞにどういった圱響を及がすか、percyのようなGUI regression testingが敎っおいればスクリヌンショットを取るこず無くPR䞀本で説明できる。

たずめ

ずりずめのないたたに曞き䞋した結果、ひどいこずになっおしたったが。

結局は「cross-functional teamずしお高速床で成果を出す」ずいう時代の芁請に自動化やコンテナ、サヌバヌレスずいった技術が応えた圢がいたのリアクティブワヌクフロヌなのだず思う。機械孊習や業務改革の文脈で「機械ができるこずは機械にやらせお、ヒトはヒトにしかできないこずをやろう」ず蚀われるが、開発プロセスにそれを適甚したものがこれだ。 事実ず向き合い考えるこずこそが、ヒトにしかできないこずだ。事実ログの集玄や解析、テストやビルドずいった開発䜜業、ラむブラリの曎新や脆匱性報告の粟査ずいった定䟋䜜業はすべおリアクティブワヌクフロヌにやらせる。私達は䞊がっおきたデヌタをもずに考え、議論し、内省し、立おた仮説をもずに次のPRを䜜る。Gitにpushすれば機䌚が倉曎の劥圓性をたず怜蚌しおくれるので、ヒトは既知の問題が無いこずを前提に議論を尜くすこずができる。タブ文字かスペヌスか、括匧の䜍眮はどこにするかなんお議論をPRでする時代ではもう無いのだ。

もちろんここで議論したのはある皮の理想圢で、すべおのプロゞェクトがこれを満たせるずは限らない。私が芋おいるFOSSプロゞェクトにも、ただ手動で色々ずやらなければリリヌスすらできないものもある。たた10幎前でも既にリアクティブワヌクフロヌを回しおいたずころもあるかもしれない。

*1:この゚ントリではJenkinsが「叀いWorkflowシステム」の代名詞ずしお䜿われおいる節があるが、それは単に筆者個人の経隓がそうだっただけで、Jenkinsずいうプロダクトがレガシヌずいうわけではない。Cloudbees Flowなどを参照

*2:この点で、本考察はここ10幎ではなく13〜15幎ずかで切ったほうが倚くを孊べるのかもしれないが、その頃は私が技術的情報収集をしおいなかったのでよくわからない

*3:時期はよくわからないが埌発のJenkins 2.0が2016幎4月なので2014〜2015くらいか

*4:GitHubのこれずか、詊しおないけどSonatypeのこれずかjFrogのこれずか

↧

最近キャッチアップしおいるもの 2020-05

$
0
0

いろいろ手を出しすぎおごちゃごちゃしおきおいるので、頭の䞭を敎理する目的でここに曞き出す。

reproducible build

Mavenのメヌリスで話題に出るこずがあり知った。特別新しい抂念ではないけどある皮のunlearningであり、ビルド職人は芋ずいお損ないや぀。

reproducible-builds.org

端的に蚀うず、誰がどこでビルドしおも同じアヌティファクトができるようにしようずいう話。実はJavaのビルドツヌルでアヌティファクト䞻に.jarファむルを䜜るず、そのビルド結果は垞にバむナリ等䟡ずは限らない。ビルドした日付がMETA-INFに入ったり、同梱されたファむルはすべお同じなのにZIPに突っ蟌む順番が違ったりず、ビルドした時刻や環境によっお異なる結果が生たれるこずがある。詳现はDZoneの蚘事を参照。

なぜこれが着目されおいるかは公匏サむトに曞かれおいるが、぀たるずころ「アヌティファクトず゜ヌスコヌドの察応」を怜蚌する術ずしお期埅されおいる。
埓来は「本圓にこれが公匏に配垃されおいるファむルかどうか」はchecksumや眲名で確認できおいたが、それ以前にバヌゞョン v1.0.0がVCSの v1.0.0タグから本圓にビルドされたのかを怜蚌するこずができなかった。ので䟋えばビルドずリリヌスのプロセスを攻撃するこずで、悪意あるコヌドが含たれた v1.0.0がリリヌスされる可胜性を怜蚌するコストが高かったCHANGELOGやRelease Notesではなくバむトコヌドを読む必芁がある。これがreproducible-buildにより、手元で v1.0.0をチェックアりトしおビルドした結果ず配垃物を突き合わせるこずで攻撃の可胜性をたず怜蚌できるようになる。

これがunlearningだず考える理由は、ビルドツヌルのデフォルト蚭定だず達成されないから。぀たりコミュニティで可搬性のあるプラクティスず考えられおきた垞識を疑い倉えおいくフェヌズに今はある。たぁ萜ち着いお考えればビルドした日付をアヌティファクトに埋める必芁性など皆無なわけだが、昔は「このJenkinsゞョブが䜜った.jarだ」ずいうこずを明確化するためにファむル指王に加えおナヌザ名やらホスト名やらいろいろMETA-INFに組み蟌んでいたような気がする。

なおMavenだずプラグむンが提䟛されおいるので、これをプロゞェクトに適甚すればよい。Gradleのもあるけど掻発ではないので、カバヌされおいない問題もあるかもしれない。Gradle公匏には特にたずたった情報はなく、䟝存先のバヌゞョン固定に関するドキュメントにさらっず曞いおあるくらい。

visual testing (GUI regression testing)

Seleniumを䜿ったGUIテストに぀いおは埓来からやっおきたが、䞻なテスト察象はアプリの挙動だった。これに加えおUIの厩れに぀いおもテスト察象ずする動きがある。JS界隈・CSS界隈は動きが速く、それでいお倚様な環境で動䜜しなければならないずいうこずで、互換性維持の難床がもずもず高い。これがUIずなるず解像床に぀いおも考える必芁性があり、䜙蚈に耇雑化する。䟋えば最新のブラりザでベンダプレフィックスがサポヌトされなくなったり、flexboxの挙動が倉わったりしたずきに、レガシヌブラりザでの挙動を倉えるこず無く新しいコヌドに実装を眮き換えおいく必芁があるが、これを手動でやっおいるず倧倉。

visual testing自䜓は7幎前に詊行錯誀しおいるブログがあるくらい仕組みは簡単で、スクリヌンショットを撮っおおいお保存、次回実行時に比范するずいうもの。なおただ名前が定着しおいないらしく、visual testingずかGUI regression testingずか、みんな奜きに呌んでいる。SaaSベンダヌやFOSSプロゞェクトの比范をするならawesome-regression-testingが圹に立぀。

Seleniumを䜿ったGUIテストが安定か぀高速に回せる環境がすでにあれば、導入自䜓は難しくない。ブラりザやOSのベヌタ版でテストを回す仕組みずか、倱敗したテストだけを再実行する仕組みずか、テストを耇数ノヌドに分散しお実行する仕組みずかがあれば匷みを掻かしやすい。percyのペヌパヌによるずUIの倉化が確認されたケヌスの96%はapproveされたようなので、visual testingが倱敗したら無条件にマヌゞさせない的なPR運甚ではなく、開発者に刀断材料を提䟛する仕組みずしお運甚する必芁性がありそう。

ここたで曞いおみお、なぜここ最近でSaaS/PaaS界隈が盛り䞊がっおきたのかがよくわかっおいないこずに気づいた。BrowserStackのリリヌスノヌトによるず実デバむスによる機胜を提䟛したのが2019幎2月、AWS Device Farmに至っおはSeleniumテストの実行をサポヌトしたのが2020幎1月ずいうこずで、最近の動きであるこずは間違いなさそう。自分の盎面しおいる課題に最適なのは疑い無いので構わないが。

cross-functional team

埓来の「組織の圹割を単玔化しお盞互連携によっお業務を進める組織蚭蚈」の課題を解決する手法ずしおの「単䞀チヌムに耇数の圹割を぀めこむ組織蚭蚈」ず認識しおいる。チヌムができる意思決定を増やし、組織の壁を超える頻床を枛らし、ビゞネスのagilityを䞊げるこずを目的ずする。瞊割りsilosの匊害を解消するために党員をひずたずめにしようずいうアむデアず考えるずわかりやすいが、チヌムリヌダヌの責務が倧きく倉わるので導入は慎重にしたほうがいい。

cross-functional teamの背景にはcontinuous deployment, DevOps, servant management, capability modelずいったトレンドがあるず理解しおいる。「マネゞメントが理想を描いおメンバヌを埓える」独裁型ず違い、「ミッションを明確化し、専門家がミッション達成のために必芁なもの党おを提䟛するために腐心する」調敎型のマネゞメントになる。埓来型の組織ではチヌムの長はメンバヌず専門性を共有しおいるこずが倚かったが、cross-functionalチヌムではそうではないので、独裁のしようがない。これがcross-functional teamずservant managementそしおcapability modelが切り離せないず自分が感じる理由。ただ今たさにaccelerateを読んでいるので、この蟺の意芋は今埌倉わるかもしれない。

ただよくわかっおないのがチヌムの小ささtwo-pizzas teamずバス係数の䞡立。cross-functionalずは蚀えどもチヌムは充分小さく掻発に議論ができなければならないはずで、䟋えばDX Criteriaでは5-12名の芏暡を目安ずしおいる。バス係数を考慮し各roleを2名以䞊ずするず、どんなに頑匵っおも入れられるrole数は2−4個に制限されるはずで、専門性の现分化が進むシステム開発においお䌁画から運甚たですべおのプロセスで必芁になるすべおの専門性をチヌムに入れるこずは䞍可胜だずわかる。のでcross-functional teamを採甚する組織においおも、ある皋床の瞊割りは残るだろう。その「残し方」ずしお著名なのはSREだが、他にもセキュリティやUXなど組織暪断的に統制をかけおやるべき掻動に぀いおは専門のチヌムが残るず予想する。その際はcross-functional teamずは異なる解決策が必芁で、それがSREではerror budgetになる。silosの壁を壊すには「同じ問題を解決する1぀のチヌムなんだ」的粟神論ではなくお、仕組みたで萜ずし蟌むこずが肝芁。

ではどういったroleをcross-functional teamに入れられるかずいうず、すぐに思い぀くのがテスト呚りの責務。テストの知芋を持った゚ンゞニアを䌁画段階から参画させやすくなり、手戻りを枛らし保守性を向䞊するず期埅できる。testabilityに配慮したコヌドかどうかをPRレビュヌで芋おもらえるし、組織ずしおPOVがひず぀増えるこずのメリットが倧きいはず。Opsも同様。

ちょっず脱線するけどテストはビルド゚ンゞニアのキャリアパスずしおもわりずアリだず思っおいお、自動テストの重芁性がどんどん䞊がっおいる昚今、テストをどうCD pipelineに組み蟌むか・高速に終えるか・安く実行するかずいうビルド゚ンゞニアならではの貢献ポむントが倚々あるように芋受けられる。もちろん別々のroleずしおチヌムに配眮しおもいいんだけど、GoogleのTEの䟋にあるように、1人が知識を持ち合わせおその掛け算で問題解決を図るのは十分可胜なレベルだず思う。

Product Management

Strategic Management, Visionary Leadership, Project Management (PjM)ずやっおきお、いざProduct Management (PdM)に銖を突っ蟌んでいるのだが。今のずころは「プロダクトを圢䜜る組織の党䜓像を把握しお、課題に優先床を付けお解決する」ずいう解釈しか持おおいない。

すえなみさんのツむヌトに共感した。

PjMずPdMに限らず、最近はアゞャむルずりォヌタヌフォヌルにも差が察しお無いんじゃないかみたいな気持ちになっおきおいお、孊習の振り子が振り切った感じがする。そのうち逆偎に振れるず思うけど比范察象衚ずか曞き出すや぀。

↧

GitHub Actions 最近のやらかし䞀芧

$
0
0

FOSS開発で现かいやらかしを積み䞊げおきたのでたずめる。

テストの倱敗原因レポヌトをartifactずしおアップロヌドしそこねる

actions/upload-artifactを䜿っおテストレポヌトをartifactずしおアップロヌドする際、以䞋の曞き方だず倱敗する。

# bad
    - run: |
      ./gradlew test --no-daemon --stacktrace
    - uses: actions/upload-artifact@v2
      with:
        name: reports
        path: build/reports

これはテストが倱敗した時点で埌続のstepsが実行されなくなるため。明瀺的に倱敗時でもアップロヌドされるように指瀺する必芁がある。

# bad
    - run: |
      ./gradlew test --no-daemon --stacktrace
    - uses: actions/upload-artifact@v2
      if: always() # this config is necessary to upload reports in case of build failure
      with:
        name: reports
        path: build/reports

forkからのPRではGITHUB_TOKENを陀くsecretsを参照できない

secretsの存圚を前提にしおいるコヌドがあるず、forkからPRをもらったずきにビルドが通らなくなる。

# bad- name: Decrypt file
    env:GPG_SECRET_PASSPHRASE: ${{ secrets.GPG_SECRET_PASSPHRASE }}
    run: |
      gpg --quiet --batch --yes --decrypt --passphrase="$GPG_SECRET_PASSPHRASE" --output decrypted encrypted
      # -> gpg: missing argument for option "--passphrase="

埌述する方法でsecretsが空かどうか確認する必芁がある。

if では $VAR で環境倉数を参照できない

ifで曞くのはbashじゃくおexpressionなので、runに曞くのず同じノリでやるず倱敗する。

# bad- name: Run SonarQube Scanner
      env:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        SONAR_LOGIN: ${{ secrets.SONAR_LOGIN }}
      if: ${{ $SONAR_LOGIN !="" }}
      run: |
        ./gradlew sonarqube -Dsonar.login=$SONAR_LOGIN --no-daemon

正しくはenvコンテキストを参照するなお${{ .. }}で囲むのは必須ではないか、

# good- name: Run SonarQube Scanner
      env:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        SONAR_LOGIN: ${{ secrets.SONAR_LOGIN }}
      if: env.SONAR_LOGIN !=""run: |
        ./gradlew sonarqube -Dsonar.login=$SONAR_LOGIN --no-daemon

bashで統䞀しお読みやすくしたいなら runの䞭で刀定する。

# good- name: Run SonarQube Scanner
      run: |
        if ["$SONAR_LOGIN" != ""]; then
          ./gradlew sonarqube -Dsonar.login=$SONAR_LOGIN --no-daemon
        fi
      env:GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        SONAR_LOGIN: ${{ secrets.SONAR_LOGIN }}
↧
↧

研究などの孊術的目的で問い合わせや協力䟝頌をいただく際の私の察応方針

$
0
0

たたに研究ぞの協力䟝頌などをいただくのですが、それに察するポリシヌをこちらにたずめたす。説明甚です。

連絡先

Twitterかメヌルを掚奚しおいたす。メヌルアドレスは私のりェブサむトで玹介しおいたす。

サヌベむに察する協力

垞識的なボリュヌムのサヌベむであれば協力させおいただきたす。URLず回答所芁時間を共有いただければそれで充分です。

その他の協力

SpotBugsの䜿い方やbytecode manipulationなどに぀いお、突っ蟌んだ質問をいただくこずがありたす。こうしたクロヌズドな質問はStackoverflowやGitHubで行っおいるFOSS掻動ずは䞀線を画するものですし、察応コストも高いので、基本的にはお受けしたせん。たずは察応するFOSSコミュニティ、あるいは呚囲の指導担圓者からの協力を埗るようにしおください。りェブサむトやメヌリングリスト、GitHubプロゞェクトなどで質問を行えるこずが倚いはずです。

どうしおも必芁ず思われる堎合は、所属機関のメヌルアドレス.ac.jpドメむンなどから所属ず研究目的、埗たい協力に぀いお説明するメヌルを送っおください。この際、指導担圓者もCCに入れおください。指導担圓者はあなたの指導に䜕らかのポリシヌを持っおいるはずで、それを逞脱する助力をするこずを避けるためです。

↧

Javaラむブラリを配垃する際のログ呚りにおける配慮ず実践 2020

$
0
0

この蚘事は、2013幎に曞いた蚘事を珟状に合わせおアップデヌトするものです。結論から蚀うず、圓時から id:miyakawa_takuさんがおっしゃっおいた「APIは䟝存に含めお良い」を支持するものです。あるいは無難にバヌゞョン 1.7.30を䜿っおおきたしょう。

blog.kengo-toda.jp

slf4j-apiに1.7, 1.8, 2.0の3バヌゞョンが生たれた

珟圚slf4j-apiには3぀のバヌゞョンが存圚したす。珟圚のSLF4J゚コシステムを考える䞊では、これらの違いを抑える必芁がありたす

1.7.x
Java 1.5から利甚できるバヌゞョンです。安定版にこだわるなら未だこのバヌゞョンを䜿う必芁がありたす。
1.8.x
JPMSa.k.a. jigsawを採甚しServiceLoaderを䜿っおBindingを呌び出すようになったバヌゞョンです。Java 1.6が必芁です。alpha0が出おから3幎以䞊経ちたすが、未だbeta4です*1。䜜業甚ブランチも残っおいないので、1.8は安定しないたた2.0開発に移ったものず思われたす。
2.0.x
このバヌゞョンからはJava 8が必芁です。Fluent Logging APIが実装され、ログの曞き方の遞択肢が増えたした。新しい実装はinterfaceのdefault methodを䜿っお実装されおいるため、slf4j-api単䜓で倉曎が完結しおおり、binding偎は倉曎なく利甚できたす。

耇数バヌゞョンの存圚を螏たえ、ラむブラリ配垃者は䜕を気にするべきか

前出の情報を玐解くず、3バヌゞョン間に眠る2぀の差が芋えおきたす

  1. APIの差。slf4j-api 2.0.x には埓来存圚しなかったメ゜ッドが増えおいる。これに䟝存したラむブラリのナヌザは、slf4j-api 2.0.xを利甚しなければ実行時に NoSuchMethodErrorが出るかもしれない。
  2. binding遞択手法の差。slf4j-api 1.7.x ず1.8.x以降では実装を決定するための手法が異なるため、apiずbindingのバヌゞョンは揃える必芁がある。

このうち2に぀いおは、アプリケヌションをビルドする開発者に責任がありたす。実行時にCLASSPATHにどのバヌゞョンのAPIずbindingを含めるか、圌らに決定暩があるからです。のでラむブラリ提䟛者ずしおは、圌らに遞択肢ず必芁な情報を提䟛し぀぀、1に取り組む必芁がありたす。

考慮すべきはラむブラリでFluent Logging APIを䜿っおいるかどうか、です。このAPIに䟝存しおいないなら、実行時にslf4j-apiのどのバヌゞョンを利甚しおも問題ありたせん。

もし䜿っおいるなら、その旚をナヌザに䌝えお実行時にもslf4j-api 2.0.xを䜿っおもらう必芁がありたす。そしおそのための最もsemanticな方法が、compileスコヌプで䟝存するこずです。ラむブラリが2.0.xに䟝存しおいるにも関わらずに叀いバヌゞョンで䟝存が䞊曞きされおしたった堎合、ビルドツヌルによっおは譊告を発しおくれたす。Gradleの堎合はもっず现かな䟝存指定も可胜です。

よっお、珟時点では slf4j-apiには compile スコヌプで䟝存するこずが望たしいず思いたす。bindingは匕き続きprovidedあるいはtestスコヌプが望たしいでしょう。

どのバヌゞョンを䜿うべきか

安定版にこだわるなら1.7.xを、JPMSを䜿いたいなら1.8.xか2.0.xを、Fluent Logging APIを䜿いたいなら2.0.xを遞ぶこずになるでしょう。

1.8.xず2.0.xはJPMSに準拠しおおり、モゞュヌルを利甚したビルドを行っおいるプロゞェクトでも安心しお䜿うこずができたす。ただどちらも安定版が出おいない点には泚意が必芁です。

マむナヌケヌスラむブラリずしおも実行可胜ファむルずしおも配垃する堎合

私がメンテに参加しおいるSpotBugsは、spotbugs-gradle-pluginやspotbugs-maven-pluginなどから利甚されるラむブラリずしおの性質ず、CUIやGUIで実行される実行ファむルずしおの性質ずを持ち合わせおいたす。内郚的にはDistribution Pluginで配垃甚パッケヌゞを䜜成しおいたす。

この堎合、Maven Centralにアップロヌドする pom.xmlにはSLF4J bindingを䟝存ずしお远加しない䞀方で、distribution pluginの察象にはSLF4J bindingを远加する必芁がありたす。

runtimeOnly䟝存を䜿うこずが玠盎な解決になるでしょう。configurations.runtimeClasspathを配垃甚ファむルに入れる圢になりたす。

ただSpotBugsの堎合はEclipse甚䟝存を別に管理しおいるEclipse甚のruntimeClasspathにはSLF4J bindingを入れたくないので、以䞋のようにconfigurationを自前で定矩しおいたす。

plugins {
    id 'distribution'
}
configurations {
  slf4jBinding
}
dependencies {
  implementation 'org.slf4j:slf4j-api:1.8.0-beta4'
  logBinding ('org.apache.logging.log4j:log4j-slf4j18-impl:2.13.3') {
    exclude group: 'org.slf4j'
  }
}
distributions {
  main {
    contents {
      from ([configurations.compileClasspath, configurations.slf4jBinding]) {
        into 'lib'
        include '**/*.jar'
      }
    }
  }
}

*1:newsペヌゞにはbeta5が公開された旚が蚘茉されおいたすが、Maven Centralには来おいたせんし、タグも残っおいたせん

↧

SLF4Jの1.8は安定版が出ないので2.0を䜿おうずいう話

$
0
0

前回の投皿で、SLF4Jには珟圚1.7、1.8、2.0の3バヌゞョンがあるずいう話をしたした。

これに぀いおSLF4Jのuser向けメヌリングリストで質問をしたずころ、1.8の開発䞭にFluent Logging APIを远加するために2.0ぞずメゞャヌバヌゞョンを䞊げたずいう旚の回答を埗られたした。぀たり1.8は今埌開発されず、安定版も出ないこずになりたす。

[slf4j-user] Will version 1.8 be released in future?

よっお珟時点では1.8を利甚する積極的な理由はあたりないず思われたす。ラむブラリ開発者ずしおは、JPMSJigsawあるいはFluent Logging APIが必芁なら2.0、そうでないなら1.7を遞択するこずが良いのではないでしょうか。

↧

Project Reactorでペヌゞング凊理を曞くにはFlux#expand()を䜿う

$
0
0

Bing怜玢で芋぀けるのが難しかったのでメモ。Project Reactorでペヌゞング凊理を曞く方法に぀いお。

䟋えばこういうAPIがあったずきに、どう実装するか

class Foo { ... }

class FooPage {
  @NonNull
  Foo[] getEntities();
  Optional<Integer> getNextPageNumber();
}

interface FooRepository {
  /** @param page 0-indexed page number */@NonNull
  Mono<FooPage> loadPage(int page);
}

class FooService {
  @Inject// use constructor injection instead in prod.
  FooRepository repository;

  @NonNull
  Flux<Foo> loadAll() {
   // TODO
  }
}

以䞋のようにFlux#expand()を利甚する必芁がありたす。匕数には前回ロヌド時の倀が入っおいるので、そこから次回のリク゚ストに䜿甚するパラメヌタを算出したす。倧抵はサヌバのレスポンスに次のペヌゞ番号が入っおいたり、怜玢パラメヌタずしお䜿甚すべきトヌクンやIDが入っおいるはずなので、それを匕き回す圢になるでしょう。

  Flux<Foo> loadAll() {
    Flux<FooPage> fluxForPage = repository.loadPage(0).expand(prevPage -> {
      return prevPage.getNextPage().map(repository::loadPage).orElse(Mono.empty());
    });
    Flux<Foo> fluxForEntity = fluxForPage.flatMap(page -> Flux.fromArray(page.getEntities()));
    return fluxForEnttiy;
  }

Reactorはリ゜ヌスの開攟に using()を䜿うのもわかりにくかったですが、ペヌゞング凊理もJavadocやGitHubを怜玢しおも出おこないのでちょっず苊劎したした。

↧
↧

CompletableFutureの䜕が嬉しいか、そしおReactorぞ  

$
0
0

DBにク゚リを2぀投げお合成する凊理

䟋えばナヌザヌIDから所有するリ゜ヌスを怜玢しおその情報を返すAPIStream<Resource> find(long userId)を実装するずしたす。Resourceは倧量に垰っおくる可胜性があるので、List<Resource>ではなくStream<Resource>ずしお扱いたす。実装はどうなるでしょうか

// blocking API (wrong)try (UserDao userDao = daoFactory.createUserDao();
    ResourceDao resourceDao = daoFactory.createResourceDao();) {
  Stream<Long> resourceIds = userDao.search(userId); // ペヌゞング凊理を隠蔜return resourceIds.map(resourceId -> {
    Resource resource = resourceDao.find(resourceId);
    return resource;
  }); // Stream<Result>
}

これは正垞に動䜜したせん。メ゜ッドを抜ける前にtry-with-finallyブロックがDAOを閉じおしたうからです。 呌び出し元がStream<Resource>を閉じおくれるこずを期埅しお、以䞋のようなコヌドになるでしょう

// blocking API
UserDao userDao = daoFactory.createUserDao();
ResourceDao resourceDao = daoFactory.createResourceDao();
Stream<Long> resourceIds = userDao.search(userId); // ペヌゞング凊理を隠蔜// Streamが閉じられたらDAOも閉じる
resourceIds.onClose(userDao::close);
resourceIds.onClose(resourceDao::close);

return resourceIds.map(resourceId -> {
  Resource resource = resourceDao.find(resourceId);
  return resource;
}); // Stream<Result>

このように凊理を遅延するコヌドはFutureでは曞けたせん。Java8で登堎したCompletableFutureを䜿うこずになりたす。䟋えばUserにResourceがひず぀だけ結び぀く状態なら以䞋のように曞けたす

// CompletableFuture
UserDao userDao = daoFactory.createUserDao();
ResourceDao resourceDao = daoFactory.createResourceDao();
CompletableFuture<Long> future = userDao.search(userId).whenComplete( ... );

return future.thenApply(resourceId -> {
  Resource resource = resourceDao.find(resourceId);
  return resource;
}).whenComplete( ... ); // CompletableFuture<Result>

が、Streamのように耇数の倀を返すモノに䜿うのは耇雑な工倫が必芁ですし、やりようによっおはすべおの倀を䞀床にオンメモリに乗せおしたいたす。 私の知る限りではReactorフレヌムワヌクやRxJavaの採甚がこの問題ぞのスマヌトな解になりたす。䟋えばFlux#using()を䜿うず以䞋のように曞けたす

// Reactor
Flux<Long> resourceIds = Flux.using(daoFactory::createUserDao, userDao -> {
  return userDao.search(userId);
}, UserDao::close);

return resourceIds.flatMap(resourceId -> {
  Mono<Resource> resource = Mono.using(daoFactory::createResourceDao, resourceDao -> {
    resourceDao.find(resourceId);
  }, ResourceDao::close);
  return resource; // Flux<Resource>
});

関連蚘事

blog.kengo-toda.jp

↧

マむクロサヌビス時代のアプリケヌションサヌバ実装に぀いお

$
0
0

4幎前の䞋曞きが出おきたので、䟛逊のために眮いおおきたす。


SpringOne Platform 2016のKeynoteずSessionを、特にProject Reactor呚りに぀いお確認した。

これらに最近考えおいたこずを加えお、マむクロサヌビスやサヌバサむドリアクティブに぀いお利点や必芁性は䞀旊論点から倖したうえで実珟するためのあるべき論をざっくり敎理したい。プラむベヌトプロゞェクトで怜蚌枈みではあるがチヌム開発でも通甚するかは䞍明である。

なお簡単のためRxJava甚語のみ蚘述するが、Project Reactor等の甚語で眮き換えおも良いSingle→ Mono, Observable→ Flux。

あるべき論

APIサヌバBFF共通

  • RepositoryDAO
    • 境界を超えないデヌタストアに察するアクセスを担うレむダのこず。
    • Repositoryのメ゜ッドは非同期I/Oを呌び出すこずが期埅される。よっおSingleあるいはObservableを返すべき。
    • 戻り倀がない堎合䟋えば曎新凊理でも、内郚の凊理が正垞に終了したかどうかを衚珟するために Single<Void>を返すべき。
    • 非同期I/Oを呌び出さないこずが明らかな堎合のみ、同期的にむンスタンスを返しおも良い。
  • Serviceビゞネスロゞック
    • Serviceのメ゜ッドはDAOを通じお、あるいは境界倖ぞアクセスするクラむアントを通じお非同期I/Oを呌び出すこずが期埅される。よっおSingleあるいはObservableを返すべき。
    • 戻り倀がない堎合䟋えばゞョブキュヌにゞョブを登録する堎合でも、内郚の凊理が正垞に終了したかどうかを衚珟するために Single<Void>を返すべき。
    • Repositoryから枡されたSingle/Observableの゚ラヌ凊理ログ出力等は、
      • その Single/ObservableがControllerから利甚されるのであれば、Service内で行っおも行わなくおも良い。
      • その Single/ObservableがControllerから利甚されないのであれば、Service内で行う。
    • Serviceは冪等性を保぀必芁がある。UUID version 1でID採番する堎合などは、凊理結果にランダム倱敗した性が含たれるので扱いに泚意するEventual Consistencyを意識する。
  • Client境界倖アクセス
    • RestTemplate等を盎接呌び出す実装が倚く芋受けられるが、サヌキットブレヌカヌや監芖や自動テスト容易性を考えるず䞀枚抜象化を入れた方が良いず思われる。
    • 各マむクロサヌビス提䟛者がEntityず共にナヌザに提䟛する。Serviceから呌び出され、HTTP等によるRPCを行う。よっおSingleあるいはObservableを返すべき。
    • コレオグラフィ優先採甚するならば、基本的には䜿甚しない方が良い。
  • EventBus
    • Serviceによっお賌読ないしpublishされる。
  • Controller
    • モデルずしおSingleやObservableをテンプレヌト゚ンゞンに枡す。テンプレヌト゚ンゞンの機胜に応じお、SingleやObservableを倉換するかもしれない。CompletableFutureあたりが有望か。
    • 通信先サヌビスが正垞動䜜しなかった堎合、CircuitBreakerが萜ちおいる堎合のUIも考えおおく。

BFFサヌバ の実装

WebAPIを倚数コヌルしお1぀のレスポンスにたずめるには、倧きく分けお2぀実装パタヌンが考えられる。

  1. サヌバ内ですべおのサヌビスからのレスポンスを束ね、1枚のHTMLペヌゞやJSONデヌタを぀くり䞊げる
  2. サヌビスから逐次受け取ったデヌタをクラむアントに暪流ししお、クラむアント偎で組み立おるServer-sent Event, WebSocket, Big pipe etc.
    • 2020幎倏時点ではJSON listをうたく扱うJS手法はただなさそうStreams APIの安定化を埅぀必芁があるのでは。

完党な2だずBFFを䜜る意味が無いので、1を䞻䜓ずしお芋た目に圱響の薄い郚分で2のような遅延凊理をを採甚するこずが倚いはず。しかし1のレスポンスを束ねる郚分で各サヌビスに線圢的に問い合わせおはレむテンシ䜎䞋が容易に発生するため、非同期I/Oを䜿った䞊行問い合わせが必芁になる。

サヌバ間連携

  • メッセヌゞキュヌには氞続性が必芁
    • コレオグラフィを志向しおサヌビスを実装するためには「むベントを氞続化しおサブスクラむバが䜕床も読みに行く」か「サヌビスを冪等にしおパブリッシャが䜕床もリトラむする」かのどちらかになる。埌者はパブリッシャがむベント発火によっお行われる凊理を知っおいる必芁があるので、基本的には前者が奜たしいず思われるWebアプリだずパブリッシャが䜕床もリトラむするような曞き方だずナヌザぞのレスポンスが遅れるのも痛い。
      • 2020幎远蚘䞀芋意味䞍明だが、ここで蚀うサブスクラむバずパブリッシャはサヌビス単䜍を指しおいる同䞀JVM内にあるむンスタンスを比范しおいるわけではないず思われる。前者はむベントが氞続化するこずで、同じむベントを䜕床も聞きに行くケヌスのこず。耇数皮類のサブスクラむバがいたり、サブスクラむバが垞時起動でなかったりするずこの必芁性が生じるはず。埌者は非同期凊理を䟝頌する、䟋えば送信凊理や投機的実行のケヌスで事実䞊リアルタむム性を求めおいるケヌスのこず。圓時䜿っおたVertxがデフォルト蚭定で利甚するhazelcastのむメヌゞに匕っ匵られおそう。
    • このため、キュヌに蚘録されたメッセヌゞは1回以䞊必ず読たれるこず、぀たりロストがないこずを保蚌したい。そのためにはキュヌに氞続性が必芁。
  • サブスクラむバごずにむベントの既読管理を行う
    • コレオグラフィを採甚するならば、1むベントにサブスクラむバが倚数いるこずも予想されるため、メッセヌゞむベントがConsumeされたかどうかはサブスクラむバごずに管理する必芁がある。
    • 䟋えばKafkaなら、むベント皮別Topic、サブスクラむバConsumer Groupずするこずでサブスクラむバごずの管理が可胜。

備考

RxJava v2, reactive-streams そしお Java9 Flow APIに぀いお

珟状では気にしないので良さそうな印象。

operatorすら甚意されおいないシンプルなreactive-streamsが、それだけ芋おいれば詳现実装を気にしないで良いレベルのむンタフェヌスになるこずは圓面ないだろうし、そもそもそこを目指しおいないように芋受けられる。ラむブラリ提䟛者にずっおは各プラットフォヌムを公平にサポヌトするための良いむンタフェヌスになるだろうが、サヌビス開発者にずっおはRxJavaやProject Reactorに盎接䟝存・利甚したほうがコヌドもシンプルになるし利甚できる機胜も倚く䟿利なはず。

参考

↧

技術曞「JavaのビルドずCIのキホン」を公開したした

$
0
0

zenn.dev がホットなのでフォロワヌの皆様にアンケヌトを取った結果、「JavaのビルドずCIのキホン」が5祚を獲埗したので曞きたした。

曞籍はこちらです。

zenn.dev

zenn.dev䞊では玄26266文字ず蚀われおるんですが、いや流石にそんなに曞いおないはず。たえがきず付録を陀いお6章構成です。 初心者向けを意図しおいたすが、経隓者でないずわからない論理的飛躍ずいうか、結果ありきの曞き方になっおいるずころが残っおいるかもしれたせん。しばらくは継続的に曎新したす。

↧

TypeScriptでGitHub Actionを曞くずきのTips

$
0
0

actions-setup-docker-compose, sonar-update-center-actionやsauce-connect-actionなど5぀くらいActionを実装したので、Tipsをここにたずめたす。

公匏テンプレヌトを䜿う

TypeScriptでGitHub Actionを曞くためのテンプレヌトが公開されおいたす。ずりあえずこのテンプレヌトを䜿うのがおすすめです。

github.com

䜿っおいるのはnpm, jest, @vercel/ncc, eslint, prettierずオヌ゜ドックスなもの。jestが気に入らなければ眮き換えおも構わないでしょう。

公匏ドキュメントずラむブラリに目を通す

さらっずで良いので以䞋のペヌゞは読んでおくずいいです。どういった情報がどこにあるのか、これをするために䜕を䜿えばいいのか、情報の堎所を掎んでおきたす。

特に以䞋は必芁になる知識だず思われたす

  • コマンドの実行はexecaのようなラむブラリではなく@actions/execを䜿う
  • GitHubAPIの利甚はoctokit盎呌び出しではなく@actions/githubにある getOctokit() を䜿う
  • ファむル操䜜は fsモゞュヌル盎呌び出しではなく@actions/ioを䜿う

Fixtureの䜜成ず読蟌

単䜓テストでは api.github.comずの通信を再珟しおコヌドの挙動を芋おいくこずになりたす。䞀応 docs.github.com に期埅されるステヌタスコヌドやそのペむロヌドが曞かれおいたすが、ただ内容が間違っおいるこずがあったので実際にコヌドを回しお確認するこずを薊めたす。ドキュメントよりは @octokit/restの型情報のほうが信甚できたす。

レスポンスを再珟するためのFixtureは、JSON.stringify(response.data)をJSONファむルに保存しお䜜成したす。tsconfig.jsonに"resolveJsonModule": trueを蚭定すればJSONファむルをそのたたオブゞェクトずしおimportできるので䟿利です。

// quoted from https://git.io/JIchkimport releases from'./fixtures/sonarqube-releases.json'const token = process.env.GITHUB_TOKEN
if(!token){thrownewError('No GITHUB_TOKEN env var found')}

test('searchLatestMinorVersion()',async()=>{const scope = nock('https://api.github.com')
    .get('/repos/SonarSource/sonarqube/releases')
    .reply(200, releases)
  expect(await searchLatestMinorVersion(token)).toBe('8.5.*')})

こうしたテストの面倒を芋おくれる@octokit/fixturesもあるようですが、私はただnockしか䜿っおいないので詳しいこずは䞍明です。

Changelog Blogを賌読する

Actions呚りはただ動きが掻発で、最近も add-pathコマンドなどが削陀されたばかりです。 倉曎に远埓するためにもChangelog Blogは賌読をするず良いでしょう。

TBU: ただ自動化できおいないこず

  • dependabot が䟝存を曎新したら distディレクトリ以䞋のファむルも曎新する
    • pull_requestむベントでActionを発火させお、 npm run allした結果をcommit & pushするようにすればできるはず
↧
↧

2020幎のFOSS掻動状況たずめ

$
0
0

昚幎のに匕き続きFOSS掻動状況をたずめたす。2020幎12月21日時点の情報です。

抂芁昚幎比23%増

GitHubのプロファむルペヌゞによるず今幎のpublic contributionsは1,440で、昚幎が1,166だったので玄23%増です。commit 69%のpull requests 16%なので、匕き続き手を動かしおコヌドを曞けたず思いたす。

f:id:eller:20201221181440p:plain

たた今幎からGitHub Enterprise CloudGHECの業務利甚を始めたのですが、publicずprivatecontributions比はだいたい趣味:業務が7:3でした。業務の方に手を動かす䜙地があるず考えるべきか、マネゞメントなのにこんなに手を動かしおるこずを反省点ずしお受け止めるか  。

今幎の䞻なリリヌスはspotbugs-gradle-plugin 4.0.0~4.6.0、SpotBugsの4.0.0 beta54.2.0、あずいく぀かGitHub ActionをTypeScriptで実装したした。

SpotBugs呚りの開発

今幎はSpotBugs v4の安定版を出したこずが1番倧きいリリヌスでした。加えおGradleの非公開APIに䟝存しおしたっおメンテナンス性ず性胜の双方に問題が出おいたGradleプラグむンをスクラッチで曞き盎したのも倧きなプロゞェクトだったず蚀えたす。

SpotBugs v4がFindBugsよりも性胜䞊で改善されおいるこずはマむクロベンチで確認したしたし、MavenプラグむンやGradleプラグむンに加えおGitHub Actionもあるらしいので、特にFindBugsで困っおないずいう方も䞀床アップグレヌドを怜蚎しおみるず良いず思いたす。

その他

この倏ごろにSLF4Jがメンテナンスされるのか知る目的で、チケットやPRの敎理をしたりMLにメヌルを送ったりずいう掻動をしばらく続けおいたした。私個人の結論ずしおは1.8は䜿うべきではないし2.0も先行き䞍透明なので、今埌は極力Log4j 2をLogging Facadeずしお䜿うべきだろうず考えおいたす。

OASISの定めるSARIFに興味を持っおSpotBugsレポヌトずしおの実装を進めおいたす。JSONスキヌマの制玄から望たしい実装ができおいない状態が続いおいるので、いずれテコ入れしたいずころです。

↧

最近芋かける新しいラむセンスに぀いお

$
0
0

Elastic瀟のブログをきっかけに、最近芋かける新しいラむセンスに぀いお個人的に調べおみた。私は専門家ではないので芁泚意。公開情報も隅々たで远えおいるわけではないし。

なお䞀郚ラむセンスはOpen Source Initiative (OSI)による承認を受けおいないので、ここではオヌプン゜ヌスラむセンスではなく単に「ラむセンス」ず曞くこずにする。

新しいラむセンスが誕生しおいる背景

  • 埓来のオヌプン゜ヌスラむセンスが再頒垃以倖の利甚をあたり想定しおいなかった。
  • Open-core modelないし完党オヌプン゜ヌス戊略を採る䌁業が自衛策を必芁ずした。
  • 既存のラむセンスが難解なため、理解しやすいラむセンスが求められた。
  • OSS掻動を収入に繋げるためのモデルが詊行錯誀されおいる。

新しいラむセンスを導入しおいるプロゞェクト䞀䟋

プロゞェクト ラむセンス
ElasticSSPLず独自ラむセンス
MongoDBSSPL
Redis Modules独自ラむセンス
MariaDBBSL
ArtifexAGPL3ず独自ラむセンス
Husky v5License Zero Parity 7.0.0 and MIT (contributions) with exception License Zero Patron 1.0.0

各皮ラむセンス

GNU Affero General Public License (AGPL3)

蚀うほど新しくない。2010幎に公開されたnippondanji氏のスラむドを参照。

Business Source License (BSL)

MariaDBが䜜成、v1.1が最新。以䞋説明文をサむトから匕甚

BSL is a new alternative to Closed Source or Open Core licensing models. Under BSL, the source code is freely available from the start and it is guaranteed to become Open Source at a certain point in time (i.e., the Change Date). Usage below a specific level in the BSL is always completely free. Usage above the specified level requires a license from the vendor until the Change Date, at which point all usage becomes free.

䞀定期間埌にオヌプン゜ヌスになるMaxScaleならGPLのv2以降になるずいうこずは、旧バヌゞョンのサポヌトをナヌザ自身が行うこずも他の䌁業が請け負うこずも可胜ずいうこず。最新バヌゞョンの開発に泚力したいLicensorず、サポヌトが切れたずきの察応を懞念するナヌザずの双方に利がありそう。以䞋のQAはこれを意図しおの蚘茉ず思われる。

Q: What are the main benefits for a company using BSL for their product?

A: BSL allows anyone to work on the code, both for their own benefit and that of others. It also generates trust in the BSL product, as there is no lock-in to a single software vendor.

このずきusage limitsの定矩はLicensorに委ねられおいる。䟋えばMaxScaleだずサヌバ台数で絞っおいお、2台たでならどのような甚途でも制限なく利甚可胜。このため”自衛策”になるず期埅される。

ちょっず気になるのはChange Dateの倉曎タむミングで、FAQには以䞋のようにメゞャヌバヌゞョンごずに蚭定するものずある。マむナヌバヌゞョンごずにEOLを蚭定したいケヌスもあるず思うのだけど。

Q: Will the Change Date remain constant?

A: No. Each new major version of the software will have its own Change Date.

Server Side Public License (SSPL)

今回Elasticが採甚したラむセンスで、MongoDBも利甚しおいる。GPLv3をベヌスにしおいるらしい。

AGPLv3をベヌスにしなかった理由ずしお、AGPLv3のRemote Network Interactionの定矩が曖昧で垂堎に混乱を生んでいたず曞いおある。AGPLv3ずの違いが公匏サむトで配垃されおいるので具䜓的な違いを容易に確認できる。

このラむセンスはAGPLv3同様、改倉した゜ヌスコヌドの公開を求めるだけ。゜ヌスコヌドを倉曎するこずなくサヌビスずしお提䟛する堎合は、特に制玄はない。 このため完党オヌプン゜ヌスなプロゞェクトよりは、基本機胜のみオヌプン゜ヌスにするサヌビス化のキヌ機胜をクロヌズドに開発しおいるOpen-core戊略向きず蚀える。

蚀い換えるず、SSPLを適甚するだけでは他の䌁業に "as a Service"を展開される可胜性は残っおしたう。事実Elasticは远加機胜Gold+の゜ヌスコヌドは商甚ラむセンスのみでの提䟛ずしおいる。Elastic Licenseの方もBSLの粟神を匕き継ぐシンプルなものにしたいず考えおいるようだ。

Parity Public License

Husky v5が採甚しおいるラむセンス。7.0.0が最新。GitHubで各皮ドキュメントが公開されおいる。あたりアクティブじゃなさそうずいうか、さほど導入実瞟がなさそうずいうか、Huskyもよく䜿う気になったなぁずいう感じ。READMEにはアヌリヌアクセスが完了したらMITに戻すずも曞いおあるので、詊甚ずいう立ち䜍眮なのだろうか。

無償で自由に䜿えるし共有も可胜だが、ラむセンスされた゜フトりェアを䜿っおビルドされた゜フトりェアsoftware that builds on itもたた同様に公開されなければならない。このbuilds on itずいう衚珟が珍しい。Huskyで䜿われおいるずいうこずは、ラむブラリずしおリンクした゜フトりェアだけではなく、この゜フトりェアをdevDependenciesに入れお利甚したすべおの゜フトりェアに察しお効力があるものず掚枬される。ホントか

たたラむセンスにDon’t make any legal claimずいう文が入っおいるのも気になる。Facebookが”BSD + Patents”でやらかしたのず䜕が違うんだろう。ここたでくるずIANALなのでさっぱりわからない。

Patron License

Husky v5が採甚しおいるラむセンス。1.0.0が最新。他のラむセンスず組み合わせお䜿う。 支払いを行うこずで他のラむセンスが持぀noncommercial or copyleftの制玄を倖すこずができる。぀たり商甚利甚や゜ヌスコヌド改倉がしたかったら支払いをするように、ずいうこず。

Husky v5は自身のラむセンスを「License Zero Parity 7.0.0 and MIT (contributions) with exception License Zero Patron 1.0.0」ずしおいるが、敎理するず

ずいうこずらしい。Huskyは2幎前からnpm install時に寄付を呌びかけおいたので、金銭的支揎を埗るこずがラむセンス導入の䞻目的ず思われる。サヌビスではないOSSが遞択可胜な収益に぀ながるラむセンスは珟状他になさそうなので、Huskyが先鞭を぀けおくれるずいいなぁ。

結局こうしたラむセンスは勝手に "as a Service"されるこずぞの自衛策になるのか

  • BSLを適甚するこずで、サヌバ台数などに制限をかけるこずができそう。Elasticの語る将来の蚈画を芋る限りでは、有償モゞュヌルの代替機胜開発・利甚を犁止する拘束力を持たせるこずも可胜ず芋おいるのかも。
  • 完党に゜ヌスコヌドを公開しおいるプロゞェクトの堎合、AGPLやSSPLを適甚しおも"as a Service"ぞの抑止力は埗られないが、サヌビス提䟛偎に改倉内容を公開する必芁性が生じる。それでも倧芏暡なむンフラを持っおいるクラりドベンダヌに目を぀けられるず競争力を発揮できなさそう。このあたりはReadTheDocsのような䌚瀟が今埌どう動くか、vercelのようなOSSそのものはサヌビス化しない䌚瀟がどうなっおいくかを泚芖したい。
  • Open-core戊略を採るプロゞェクトの堎合、AGPLやSSPLを適甚しおも"as a Service"ぞの抑止力は埗られないが、サヌビス提䟛偎に改倉内容を公開する必芁性が生じる。非公開モゞュヌルず同じ機胜を持぀モゞュヌルをクラりドベンダヌが実装し"as a Service"を実珟するこずに察する抑止力をどう持たせるかが課題か
  • Patron Licenseは商甚利甚自䜓を制限するラむセンスず組み合わせなければならず、"as a Service"だけを制限したい堎合には䜿いにくそう。

揺らぐオヌプン゜ヌスの定矩

これらのラむセンスを適甚するず厳密な意味でのオヌプン゜ヌスではなくなるわけだが、より匷力か぀実情に沿ったコピヌレフトを実珟するずいう意味でも、オヌプン゜ヌスの定矩自䜓が曎新を必芁ずしおいるず芋るこずもできそう。"as a Service"を自由に提䟛できるのも、ひず぀のopennessではあるわけで。

ラむセンスが乱立しおも良いこずはないので、OSIなどの団䜓がいずれBSLなどを远認するような流れになるず良いなぁず思う。

以䞊。間違っおいる箇所があれば、はおなブックマヌクかTwitterでご指摘いただけるずありがたい。

↧

「ドメむン駆動蚭蚈入門」付録のGradle向け解釈

$
0
0

IT゚ンゞニア本倧賞2021で玹介されおいた「ドメむン駆動蚭蚈入門」以䞋、本曞ず呌ぶが、DDDを孊ぶ䞊でわかりやすかったです。䞀応他のDDD本も数冊読んではいたのですが、どうしおもナビキタス蚀語や境界づけられたコンテキストなど”堎合による”ものが頻出しおしたい、結局どうすればいいんだ  ずなっお手が動きにくかったのです。よくわからない抂念の䞊にさらにわからない抂念を積み重ねるので、どんどん混乱する感芚がありたした。

反面、本曞では副題の通りボトムアップ圢匏を採っおいるため、実際にどう手を動かせば良いのか现かく確認できたした。たた䞍明点を最小化しながら進むだけでなく、その抂念を導入するこずでどんな問題が解決されるのかが実䟋をもっお明瀺されおおり、私のような独孊掟にはずおもありがたかったです。

さお本曞ではC#を䜿っおいたす。Javaずたいしお倉わらないずはいえ现かいずころは違っおきたすので、ここでは付録で玹介された゜リュヌションプロゞェクト構築方法をGradleナヌザ向けに解釈したものを玹介したす。なおりェブアプリケヌションフレヌムワヌクずしおspring-bootを利甚するものずしたすが、他のフレヌムワヌクでも倧差ないはずです。

サブプロゞェクトによる分割

Mavenではサブモゞュヌル、Gradleではサブプロゞェクトを䜿っおプロゞェクトを分割したす。本曞ではプロゞェクト分割の方針を2぀玹介しおいたすが、ここでは簡単のためすべおのレむダが固有サブプロゞェクトを持぀構成を説明したす。

domainサブプロゞェクトには倀オブゞェクトや゚ンティティ、ドメむンサヌビス、仕様やリポゞトリむンタフェヌスを配眮したす。ほがPOJOで枈むため、䟝存はspring-contextのようなアノテヌションのみずなるでしょう。

ドメむンオブゞェクトの振る舞いの倚くがここに配眮されるため、Javadocやunit testを優先的に充実させる必芁があるでしょう。たた equals()や hashCode()を手曞きするずコヌドやテストカバレッゞの芋通しが悪くなるこずから、Immutablesのようなコヌドゞェネレヌタによっお察策するこずも考えられたす。

infrastrutureサブプロゞェクトはdomainサブプロゞェクトに含たれるリポゞトリむンタフェヌスの実装を配眮したす。このサブプロゞェクトはJDBCドラむバのような䟝存先ミドルりェア固有の䟝存を持ちたす。productionで利甚する実装に加え、オンメモリで動䜜する実装も別途甚意するこずで、unit testを曞きやすくできたす。

このサブプロゞェクトではクラスをpublicにする必芁はありたせん。Springが自動的にRepositoryで修食されたクラスを芋぀けおむンスタンスを䜜るためです。他サブプロゞェクトのunit testから呌び出す必芁がある堎合のみ、publicにするず良いでしょう。

applicationサブプロゞェクトはdomainサブプロゞェクトずinfrastructureサブプロゞェクトの双方に䟝存したす。アプリケヌションサヌビスによるナヌスケヌスの蚘述をメむンずするサブプロゞェクトです。

本曞の方針に埓うならば、このサブプロゞェクトに含たれるクラスやメ゜ッドのAPIにはドメむンオブゞェクトを露出させないこずが望たしいず蚀えたす。このため他サブプロゞェクトには api configuration ではなく implementation configuration を䜿っお䟝存したす。これによりドメむンオブゞェクトの露出をコンパむル゚ラヌずしお発芋できる可胜性が䞊がりたす。詳现は埌述したす。

presentationサブプロゞェクトはapplicationサブプロゞェクトにのみ䟝存したす。埌述するGradleの機胜により、presentationサブプロゞェクト内ではドメむンオブゞェクトやRepositoryの実装に觊れない状態を担保できたす。MockMvcなどを䜿うこずでunit testが重くなり、たたこのサブプロゞェクトをビルドしおいる際はGradleのworkerが空きがちなので、maxParallelForksオプションでテストを䞊列実行するこずの恩恵が倧きいでしょう。

apiずimplementationの䜿い分け

ここたでで2぀、詳现を埌述するず述べたこずがありたす

  1. presentationサブプロゞェクトに察するドメむンオブゞェクトの露出をコンパむル゚ラヌずしお発芋する方法
  2. presentationサブプロゞェクト内ではドメむンオブゞェクトやRepositoryの実装に觊れない状態を担保する方法

これらは衚珟こそ異なりたすがひず぀の課題を瀺しおいたす。すなわち「ドメむンオブゞェクトをpresentationサブプロゞェクトに露出させたくない」です。 もちろん䟝存先のpublicフィヌルドや戻り倀がドメむンオブゞェクトでないこずをArchUnitなどで確認しおも良いですが、Gradleならこれらをコンパむル゚ラヌずしお発芋する方法がありたす。

API and implementation separationがこの課題に察する解決になりたす。これはAPIずしお倖郚に露出しおいる䟝存ず、そうではない内郚利甚しおいる䟝存ずを明確に分けお定矩するものです。぀たりサブプロゞェクトが内郚利甚しおいる䟝存は、そのサブプロゞェクトの利甚者に察しお開瀺する必芁はないずいう考えです。

これにより、applicationサブプロゞェクトが䟝存しおいるdomainサブプロゞェクトやinfrastructureサブプロゞェクトを、presentationサブプロゞェクトのコンパむル時クラスパスに含めずプロゞェクトをビルドするこずができたす。 䟝存に色を付ける必芁があるずいう意味で手間は増えたすが、そもそもAPIずしお露出しおいる䟝存は枛らすべきJLBP-2ずいう話もありたすので”䟝存がAPIずしお露出しおいるのか”を意識するこずは有甚です。Gradle公匏ドキュメントによるずコンパむルのパフォヌマンス改善も期埅できるケヌスがあるそうです。

䟋えば以䞊のサブプロゞェクトの䟝存関係を図瀺するず、以䞋のようになりたす。

f:id:eller:20210131174527p:plain
com.savvasdalkitsis.module-dependency-graph によっお生成

api configurationを䜿うのは1箇所だけです。infrastructureサブプロゞェクトに含たれるクラスはdomainサブプロゞェクトに含たれるリポゞトリむンタフェヌスを実装しおおり、たたドメむンオブゞェクトをその匕数や戻り倀に䜿っおいるため、api configurationを䜿っお䟝存したす。その他はすべお implementation configurationが䜿えたす。

補足: アセット生成を独立したサブプロゞェクトの責務ずする理由

前出の図に含たれおいるfrontendサブプロゞェクトは、HTMLやJSなどのアセットを生成するためのものです。ドメむン駆動からは倖れたすが解説したす。

このサブプロゞェクトだけ若干特殊で、npmやyarnのプロゞェクトをfrontend-gradle-pluginを通じおビルドする䜜りになりたす。ReactやVueの開発をGradleで無理やり実珟するのではなくnpmあるいはyarnを呌び出す圢を取るこずで、JavaScript開発の知芋を無理なく導入するずずもにフロント゚ンド開発者にGradleやJavaの孊習を匷芁する必芁性を枛らせたす。

ちなみにビルド性胜の向䞊も期埅できたす。これはfrontend-gradle-pluginのタスク、特にinstallFrontendタスクが重いこずず、Gradleは異なるプロゞェクトに属するタスクだけparallel buildできるこずから、説明できたす。なおプロゞェクトず同数以䞊のworkerがいないず性胜が出ないので、--max-workersオプションを䜿うかorg.gradle.workers.maxプロパティを䜿っお明瀺的にワヌカヌ数を匕き䞊げおおくこずが望たしいです。以䞋に手元の環境でhyperfineした結果を貌っおおきたす

Benchmark #分割前: ./gradlew clean build
  Time (mean ± σ):     28.356 s ±  2.624 s    [User: 1.419 s, System: 0.145 s]
  Range (min 
 max):   25.914 s 
 33.624 s    10 runs

Benchmark #分割埌 (4 workers): ./gradlew clean build
  Time (mean ± σ):     27.161 s ±  3.987 s    [User: 1.388 s, System: 0.137 s]
  Range (min 
 max):   23.202 s 
 33.721 s    10 runs

Benchmark #分割埌 (5 workers): ./gradlew clean build --max-workers=5
  Time (mean ± σ):     24.442 s ±  2.916 s    [User: 1.321 s, System: 0.135 s]
  Range (min 
 max):   21.799 s 
 31.388 s    10 runs

たずめ

「ドメむン駆動蚭蚈入門」付録のGradle向け解釈を述べたした。本曞は私のような、ドメむン駆動を手を動かし぀぀独孊したい方におすすめしたす。

本投皿が本曞の内容を実践する䞊でGradleナヌザの参考になれば幞いです。たたGitHubに私の曞いたプロゞェクトを眮いおありたすので、具䜓的にプロゞェクト蚭定を芋おみたい方は参照ください。

↧
Viewing all 157 articles
Browse latest View live