Movatterモバイル変換


[0]ホーム

URL:


PDF, PPTX9,798 views

Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか

Java Day Tokyo 2016 のセッション3-Eの資料です。Java8, Java9の新機能がシステムの設計にどういう影響があるのかを考えてみました。

Embed presentation

Download as PDF, PPTX
Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのかTIS株式会社アプリケーション開発センター川島 義隆Java Day Tokyo 2016 3-E
Javaの機能進化おさらい
Java8● Lambda expression● Method reference● Default methods● Stream API● Optional● Map#computeIfAbsent
Java9● Jigsaw● JShell● HTTP/2● SO_REUSEPORT
シンタックスの進化に目が奪われがちだけれども
設計のやり方もアップデートしましょう
Embrace nullJava8 〜
NullPointerExceptionの典型例HttpSession session = request.getSession();User user = session.getAttribute("user");if (user.isAdmin()) {// ...}ここでNullPointerException発生引数なしでgetSessionを呼ぶのでセッションがない場合は空のものが作られる空のSessionの場合、userはnullになる。
Guard against nullHttpSession session = request.getSession(false);if (session == null) {response.sendRedirect(LOGIN_URL);return;}User user = session.getAttribute("user");if (user == null) {response.sendRedirect(LOGIN_URL);return;}if (user.isAdmin()) {// ...}nullガード戦法Java有史以来、最も多く使われている戦術だが、ガードの漏れが検出しにくく、実際それが本番障害の原因としてたびたび登場している
OptionalOptional.empty(value)Optional.ofNullable(value)Optional.of(value)optional.get()optional.orElse(T other)optional.orElseGet(Supplier other)optional.orElseThrow(Supplier exceptionSupplier)ここの間が重要Optionalの生成Optionalから値の取り出し
Optionalの意義User user = Optional.ofNullable(request.getSession(false)).map(session -> session.getAttribute("user")).orElse(new AnonymousUser());if (user.isAdmin()) {// ...}Operation中にnullが出現しうる一連の操作を、Optionalで包みこむこと
Embrace null標準APIがOptional前提で設計されていないJavaにおいては、Optionalを使ってどうAPIを設計しようかと考えるよりも一連のnull発生箇所を包み込むことを主眼において考えた方が実用的である。ラムダの扱いをもう少し工夫した事例http://qiita.com/kawasima/items/744914c2fb0b81686a9c
MixinJava8 〜
Default method●インタフェースに実装が持てるようになった●インスタンス変数は当然ながら持てないdefault void forEach(BiConsumer<? super K, ? super V> action) {Objects.requireNonNull(action);for (Map.Entry<K, V> entry : entrySet()) {K k;V v;try {k = entry.getKey();v = entry.getValue();} catch(IllegalStateException ise) {// this usually means the entry is no longer in the map.throw new ConcurrentModificationException(ise);}action.accept(k, v);}}
Use caseミドルウェアパターンRequestTraceMiddlewareAuthenticateMiddlewareRequestwriteLog()setRequestTime()RequestwriteLog()setRequestTime()setUserPrincipal()適用するミドルウェアに応じて、メソッドを追加したい
多重継承できないJavaでは…従来は継承でやるしか無かったので、使う使わざるに関わらず、多くのメソッドを予め用意しておく設計が多いjava.sql.ResultSetは実に、193のメソッドをもつ更新可能ResultSetの機能や、全てのJDBC型のメソッドを持つため。
Mixin using default methodspublic interface Traceable {Logger LOG = LoggerFactory.getLogger(Traceable.class);default void writeLog() {LOG.info(toString());}}こういうインタフェースを用意して、implementsすれば、writeLogメソッドが使えるようになる。
Default methodでインスタンス変数を持てないことへの対策任意のデータを出し入れするインタフェースを用意して、public interface Extendable {Object getExtension(String name);void setExtension(String name, Object extension);}public interface Traceable extends Extendable {default void setRequestTime(Long time) {setExtension("requestTime", time);}}デフォルトメソッドではそのインタフェースとのやり取りをする。
private Map<String, Object> extensions;@Overridepublic void setExtension(String name, Object extension) {if (extensions == null) {extensions = new HashMap<>();}extensions.put(name, extension);}@Overridepublic Object getExtension(String name) {if (extensions == null) {extensions = new HashMap<>();}return extensions.get(name);}It's not beautiful, but pragmatic.実装をこんな感じにすれば、データを持つMixinが実現可能
適用するミドルウェアによってimplementsするインタフェースが決まる。ミドルウェアが要求するインタフェースを動的にMixinできるとよいのでは?
動的mixin予めインタフェースをimplementsしてなくても動的にimplementsして振る舞いを足す。Proxy.newProxyInstance(classloader,new Class[]{ Request.class, Traceable.class },new MixinProxyHandler());
Default methodの呼び出しMethodHandles.lookup().in(declaringClass).unreflectSpecial(method, declaringClass).bindTo(proxy).invokeWithArguments(args);MethodHanldeを使うと、実装してないクラスに対してもdefault methodが呼び出せる。http://qiita.com/kawasima/items/f735ef0c0a9fa96f6eb4
注意事項● Java8のJVM実装では、MethodHandleによるinvokeSpecialは非常に遅い。● 通常のリフレクションの10倍〜100倍のコスト開発時は、試行錯誤するので動的Mixinを使い運用時は、性能を優先し静的Mixinを使う。という戦術がよいのでは。
多重継承できないことに起因する- クラス数の増加- メソッドを沢山持つクラスを抑制できる。Mixinの効能
システム挙動の動的な変更(using REPL)Java8 or 9〜
Use caseアプリケーションの一部サービスを閉鎖し、Sorryページにリダイレクトする503Service Temporarily Unavailable
従来よく見られた設計こんなテーブルを用意し、閉塞するときにはフラグを"1"にアップデートする全リクエストにおいて、この閉塞テーブルを検索するSQLが実行されてしまう…機能ID閉塞フラグ閉塞�
管理用APIを用意するこれは最近のJavaでないとできないわけではないけれども…「閉塞状態であること」を永続化する必要はないのでメモリ内の閉塞フラグを書き換えてやればよいhttps://[host]:[port]/admin/service/close限られた工数で、管理用のAPI用意するのが難しい場合もある�@GETpublic String closeService(@QueryParam String serviceCd) {serviceClosingService.add(serviceCd);return "OK";}
REPLがあれば大丈夫(な日がくるかもしれない)
Enkanフレームワークの擬似REPLenkan> /middleware app listANY defaultCharset (enkan.middleware.DefaultCharsetMiddlewareNONE serviceUnavailable (enkan.middleware.ServiceUnavailableMANY stacktrace (enkan.middleware.StacktraceMiddleware@545872denkan> /middleware app predicate serviceUnavailable ANYenkan> /middleware app listANY defaultCharset (enkan.middleware.DefaultCharsetMiddlewareANY serviceUnavailable (enkan.middleware.ServiceUnavailableMiANY stacktrace (enkan.middleware.StacktraceMiddleware@545872dREPL上からMiddlewareの適用条件を操作できるhttps://enkan.github.io/
Enkanフレームワークの起動・再起動時間REPLからの起動 → 1~3 sec    再起動 → < 1secMTTRを短くしようという時代の流れの中で、アプリケーションの起動の速さはより重要になっていくhttp://www.slideshare.net/kawasima/enkankotowarirepl速さの秘密はこちらをご覧ください
JShellはどうなっているのか?●コマンドのカスタマイズはできない●動いているプロセスにアタッチできないhttps://bugs.openjdk.java.net/browse/JDK-8157208Java10では、このあたりが解消するかも。
Try ArtifactJShellの中で、Mavenの依存関係を動的に解決し、その機能を試してみることができる。-> /resolve org.apache.commons:commons-lang3:jar:3.4| Path /home/kawasima/.m2/repository/org/apache/commons/commons-lang3/3.4/commons-lang3-3.4.jar added to classpath->org.apache.commons.lang3.RandomStringUtils.randomAlphanumeric(10)| Expression value is: "peXXUYGin6"| assigned to temporary variable $1 of type Stringhttps://github.com/kawasima/try-artifact 現段階でのJShellカスタマイズ事例
Java9時代の無停止デプロイJava9 〜
Java8までの無停止デプロイServer#1WebApplicationLoad balancerServer#2WebApplication縮退しながら、1台ずつリスタート少なくとも2台の仮想サーバが必要�
Application serverの無停止デプロイ機能ServerWebLogic ServerWebApplication WebApplicationプロダクション再デプロイメント前述のサーバでやっていたことをWebLogic Serverの中で実現するアプリケーションの作りによってはメモリリークが発生してしまう�
ServerJava9時代ProcessWebApplicationProcessWebApplication同一サーバ内で同じポートをListenするプロセスを複数立ち上げ、順次再起動する
SO_REUSEPORT● 複数のプロセスから同じポートをListenできる– 従来は"Address already in use:bind"になっていた● 同じuidである必要がある。● Linux kernel 3.9より利用可能(WindowsではUnsupportedOperationException)
SO_REUSEPORTを使うコードServerSocketChannel serverChannel =ServerSocketChannel.open();serverChannel.setOption(StandardSocketOptions.SO_REUSEPORT, true);setOptionメソッドがJava 1.7からなので、各Webサーバプロダクト(Jetty, Undertow, and so on)は直ぐには呼び出せない
SO_REUSEPORT in Jettyclass ReusePortAvailableConnector extends ServerConnector {public ReusePortAvailableConnector(@Name("server") Server server) {super(server);}@Overridepublic void open() throws IOException {ServerSocketChannel serverChannel = ServerSocketChannel.open();serverChannel.setOption(StandardSocketOptions.SO_REUSEPORT, true);InetSocketAddress bindAddress = getHost() == null ? newInetSocketAddress(getPort()) : new InetSocketAddress(getHost(), getPort());serverChannel.socket().setReuseAddress(getReuseAddress());serverChannel.socket().bind(bindAddress, getAcceptQueueSize());serverChannel.configureBlocking(true);addBean(serverChannel);try {Field acceptChannel = ServerConnector.class.getDeclaredField("_acceptChannel");acceptChannel.setAccessible(true);acceptChannel.set(this, serverChannel);} catch (Exception ex) {throw new IOException(ex);
Falchion container● JVMプロセスのコンテナ● Anotherプロセスが起動するのを待ってから、古いJVMプロセスをKillできる。● SO_REUSEPORTとの組合せで、リクエストをロストすることなく、論理的なアプリケーションの再起動が可能になる。https://github.com/kawasima/falchionexperimental
Falchion ContainerFalchion container architectureJVM real processWebApplicationJVM poolJVM virtual processJVM virtual processJVM real processWebApplicationListen the same port
Monitoring JVM● JMXによるDropwizard Metricsの取得– Request数– Error数– スループット● jstatによるGC Metricsの取得
REST APIでの状態取得
アプリケーションの再起動がより手軽で身近なものにアプリケーションの再起動 = 一大事当然ながらご利用は慎重かつ計画的に…
JVM auto tuning● JVMのパラメータを少しづつ変えながら、性能の変化を計測する。●最適なものを選択– Full GC countを最小に– 1回あたりのFull GC Timeが最長のものが一番短く(Full GC Timeのマクシミン)JVMコンテナの活用可能性
『柔軟な設計』の変化
これまでに手にした武器●無停止デプロイの気軽さ●高速な起動●システムの挙動の動的変更
課題設定ETC割引の計算ロジックを実装します。– ただし、平日朝夕割引は実際には後日還元なのですが、ここでは他の割引と同じく即時適用かつ走行距離による還元率の変化はないものとします。– 走行記録は、24時間を超えないものとします。https://github.com/kawasima/kata/tree/master/ex01-business-ruleshttp://www.driveplaza.com/traffic/tolls_etc/ より。ルールは簡単のため多少いじっています。
割引ルール●平日朝夕割引– 平日「朝:6時〜9時」、「夕:17時〜20時」–地方部 – 当月の利用回数が5回〜9回 30%割引、10回以上 50%割引●休日割引– 普通車、軽自動車等(二輪車)限定–土曜・日曜・祝日–地方部– 30%割引●深夜割引–すべての車種– 毎日0〜4時– 30%割引
システム運用負荷を下げたいので…できるだけ止めずに
従来の柔軟な設計ルールをRDBMSに登録し、これを読み込んで、割引率を算出する。データを追加・変更すればシステム改修なしに、ルールの追加・変更が可能だ!!ルールIDルール名開始時刻1終了時刻1開始時刻2終了時刻2月曜日フラグ火曜日フラグ  ︙日曜日フラグ走行エリア割引率適用開始日適用終了日ルールID車種コード車種コード車種名ルール許容車種 車種
実際運用してみると発生する課題● 1つのルールで、時間帯を3つ以上持ちたいという要件。増えてくカラム。● 用意していない属性(排気量やハイブリッド車優遇など)を使ったルールの追加。増えてくカラム。プログラム改修。● 予期しないデータが入って、Exceptionが発生。増えていく再発防止策。●結局ルールを変更するのも開発チームに依頼してやってもらう運用に…
「自由度の高いシステムを作ったぜ」という思惑とは裏腹に…●高すぎる自由度は、十分にテストするのが難しいことを意味する●特にデータの組合せにテストケースが隠されると、十分なテストが出来てないことが多くなる
再起動が容易であれば…●ふつうにルールの変更にしたがい●コードを書いて●テストを書いて●安全に簡単にデプロイしてしまえばよい。
ルールの実装例public class DiscountInMorningOrEvening implements DiscountRule {private RulePeriod morning = new RulePeriod(6, 9);private RulePeriod evening = new RulePeriod(17, 20);@Overridepublic boolean isApplicable(HighwayDrive drive) {return ((!morning.isHoliday(drive) && morning.isIn(drive))|| (!evening.isHoliday(drive) && evening.isIn(drive)))&& drive.getRouteType() == RouteType.RURAL;}@Overridepublic long discountPercentage(HighwayDrive drive) {int count = drive.getDriver().getCountPerMonth();if (count >= 10) {return 50;} else if (count >= 5){return 30;} else {return 0;}
YAGNI has come to Java運用の大変さ(のイメージ)から、過剰設計になりがちだったJavaの世界も、今必要なものだけを設計し作ればよい時代に
まとめ
堅い、固い、硬いイメージのJavaも、工夫次第では、時代に合わせて柔軟な運用・設計が可能シンタックスのキャッチアップだけでなく、設計の手法のアップデートもお忘れなく

Recommended

PDF
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
PDF
ドメイン駆動設計 失敗したことと成功したこと
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
Spring Bootをはじめる時にやるべき10のこと
PDF
ドメイン駆動設計に15年取り組んでわかったこと
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
マイクロにしすぎた結果がこれだよ!
PDF
ドメイン駆動設計 の 実践 Part3 DDD
PDF
ドメイン駆動設計 本格入門
PDF
ドメイン駆動設計 基本を理解する
PDF
オブジェクト指向できていますか?
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PPTX
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
PDF
例外設計における大罪
PDF
正しいものを正しく作る塾-設計コース
PPTX
Metaspace
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
Dockerfile を書くためのベストプラクティス解説編
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
リッチなドメインモデル 名前探し
PDF
オブジェクト指向エクササイズのススメ
PPTX
Linuxのsemaphoreとmutexを見る 
PPTX
初心者向けMongoDBのキホン!
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
DockerとPodmanの比較
PDF
イミュータブルデータモデル(世代編)
PDF
イミュータブルデータモデル(入門編)

More Related Content

PDF
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
PDF
ドメイン駆動設計 失敗したことと成功したこと
PDF
ドメイン駆動設計のための Spring の上手な使い方
PDF
Spring Bootをはじめる時にやるべき10のこと
PDF
ドメイン駆動設計に15年取り組んでわかったこと
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
マイクロにしすぎた結果がこれだよ!
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計のための Spring の上手な使い方
Spring Bootをはじめる時にやるべき10のこと
ドメイン駆動設計に15年取り組んでわかったこと
コンテナの作り方「Dockerは裏方で何をしているのか?」
マイクロにしすぎた結果がこれだよ!

What's hot

PDF
ドメイン駆動設計 の 実践 Part3 DDD
PDF
ドメイン駆動設計 本格入門
PDF
ドメイン駆動設計 基本を理解する
PDF
オブジェクト指向できていますか?
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PPTX
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
PDF
例外設計における大罪
PDF
正しいものを正しく作る塾-設計コース
PPTX
Metaspace
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
Dockerfile を書くためのベストプラクティス解説編
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
リッチなドメインモデル 名前探し
PDF
オブジェクト指向エクササイズのススメ
PPTX
Linuxのsemaphoreとmutexを見る 
PPTX
初心者向けMongoDBのキホン!
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
DockerとPodmanの比較
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 本格入門
ドメイン駆動設計 基本を理解する
オブジェクト指向できていますか?
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
例外設計における大罪
正しいものを正しく作る塾-設計コース
Metaspace
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
Dockerfile を書くためのベストプラクティス解説編
Dockerfileを改善するためのBest Practice 2019年版
リッチなドメインモデル 名前探し
オブジェクト指向エクササイズのススメ
Linuxのsemaphoreとmutexを見る 
初心者向けMongoDBのキホン!
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
DockerとPodmanの比較

Viewers also liked

PDF
イミュータブルデータモデル(世代編)
PDF
イミュータブルデータモデル(入門編)
PDF
なぜデータモデリングが重要なのか?
PDF
キメるClojure
PDF
イマドキのExcelスクショの撮り方
PDF
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
PDF
たとえ日本人同士でも必要な異文化理解力
PDF
JobStreamerではじめるJavaBatchのクラウド分散実行
PDF
Boilerplate vs Magic
PDF
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
PDF
Antifragile Clojure
PDF
既婚プログラマの時間捻出術
PDF
元気玉的 分散テスト 実行システム TestStreamer
KEY
日本一細かいJavaOne2011報告
PDF
エスイーのしごと
PDF
Seasar conference 2015 sa-compojure
PDF
で、次は何がくるの? - 第2回 TIS Matsuri
PDF
SIerもはじめる わたしたちのDevOps #jjug_ccc
PDF
週刊Webサイトのアーキテクチャ
PDF
SIerにとっての越境 @ DevLOVE 199
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(入門編)
なぜデータモデリングが重要なのか?
キメるClojure
イマドキのExcelスクショの撮り方
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
たとえ日本人同士でも必要な異文化理解力
JobStreamerではじめるJavaBatchのクラウド分散実行
Boilerplate vs Magic
渋谷JVM#1 Immutable時代のプログラミング言語 Clojure
Antifragile Clojure
既婚プログラマの時間捻出術
元気玉的 分散テスト 実行システム TestStreamer
日本一細かいJavaOne2011報告
エスイーのしごと
Seasar conference 2015 sa-compojure
で、次は何がくるの? - 第2回 TIS Matsuri
SIerもはじめる わたしたちのDevOps #jjug_ccc
週刊Webサイトのアーキテクチャ
SIerにとっての越境 @ DevLOVE 199

Similar to Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか

PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PDF
Migration Guide from Java 8 to Java 11 #jjug
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
大規模ソフトウェア開発とテストの経験について
PDF
JSR 352 “Batch Applications for the Java Platform”
PDF
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
PDF
10のJava9で変わるJava8の嫌なとこ!
PPTX
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
PDF
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
PPT
Eclipse を使った java 開発 111126 杉浦
PDF
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
KEY
関ジャバ JavaOne Tokyo 2012報告会
PDF
今年はJava進化の年!今知っておくべき新しいJava
PDF
All I learned while working on a Scala OSS project for over six years #ScalaM...
PDF
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
PDF
JakartaOne Livestream Japan 2020
PDF
Javaの登場と発展
PDF
TDDBC osaka 2012/06/02
PDF
夏サミ 2012 [B-2]エンタープライズ開発におけるコラボレーション - JIRAによる顧客と開発チームのつなぎ方
PDF
デブサミ関西2012[A-2]エンタープライズ開発におけるコラボレーション - JIRAによる顧客と開発チームのつなぎ方
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
Migration Guide from Java 8 to Java 11 #jjug
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
大規模ソフトウェア開発とテストの経験について
JSR 352 “Batch Applications for the Java Platform”
JJavaプログラム実行の仕組みと、高速・安定動作に向けた取り組み
10のJava9で変わるJava8の嫌なとこ!
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Eclipse を使った java 開発 111126 杉浦
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
関ジャバ JavaOne Tokyo 2012報告会
今年はJava進化の年!今知っておくべき新しいJava
All I learned while working on a Scala OSS project for over six years #ScalaM...
JDK 13 New Features [MeetUp with Java Experts! @Gaienmae/Dojima 2019]
JakartaOne Livestream Japan 2020
Javaの登場と発展
TDDBC osaka 2012/06/02
夏サミ 2012 [B-2]エンタープライズ開発におけるコラボレーション - JIRAによる顧客と開発チームのつなぎ方
デブサミ関西2012[A-2]エンタープライズ開発におけるコラボレーション - JIRAによる顧客と開発チームのつなぎ方

More from Yoshitaka Kawashima

PDF
強いて言えば「集約どう実装するのかな、を考える」な話
PDF
ソフトウェアにおける 複雑さとは何なのか?
PDF
イミュータブルデータモデルの極意
PDF
それはYAGNIか? それとも思考停止か?
PDF
Tackling Complexity
PDF
ソフトウェア設計における 意思決定とそのレビューの秘訣
PDF
Mavenの真実とウソ
PDF
ブルックスのいう銀の弾丸とは何か?
PDF
Grokking Simplicity探訪
PDF
ソフトウェア開発における『知の高速道路』
PDF
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
PDF
アンチフラジャイルの世界
PDF
ウォーターフォールとアジャイルのフェアな比較
PDF
Are Design Patterns Dead?
PDF
Atomic Architecture
PDF
システムダウンのひみつ
PDF
Antifragile Java - Java Day Tokyo 2017 D1-E1
PDF
本番障害に至る病
PDF
How to find tech books
強いて言えば「集約どう実装するのかな、を考える」な話
ソフトウェアにおける 複雑さとは何なのか?
イミュータブルデータモデルの極意
それはYAGNIか? それとも思考停止か?
Tackling Complexity
ソフトウェア設計における 意思決定とそのレビューの秘訣
Mavenの真実とウソ
ブルックスのいう銀の弾丸とは何か?
Grokking Simplicity探訪
ソフトウェア開発における『知の高速道路』
思考停止しないアーキテクチャ設計 ➖ JJUG CCC 2018 Fall
アンチフラジャイルの世界
ウォーターフォールとアジャイルのフェアな比較
Are Design Patterns Dead?
Atomic Architecture
システムダウンのひみつ
Antifragile Java - Java Day Tokyo 2017 D1-E1
本番障害に至る病
How to find tech books

Javaの進化にともなう運用性の向上はシステム設計にどういう変化をもたらすのか


[8]ページ先頭

©2009-2025 Movatter.jp