JavaOne 2017 Wrap Up
Last year, at JavaOne 2016, I had the honor of unlocking the JavaOne Rockstar achievement. 2017 was my first JavaOne after that, and I can say that the experience wasn't any different from the previous sixteen or so years I've been blessed to speak: exhausting, informative and inspiring. This blog post reviews the sessions I attended and presented and shares my thoughts and notes if I have them.
Sessions
The Sunday of JavaOne has always been a day for the Java community to shine and share their work and highlights from the previous year. This year, the day was formally labeled "Developer Community Day". Some differences from last year: it was not formally billed as "NetBeans Day", all the talks were from non-Oracle speakers, all from the community, there was a whole lot of JUG content, there were several "career focused" talks.
Sunday
Java, the JCP, and You [CON2197]
Heather Vancura, director of the JCP, asked me to co-present at this session about how to get involved in the JCP, the official way that the community brings its ideas into the Java platform. The JCP is better than ever at this job, so with Java EE moving to the Eclipse Foundation as EE4J, it is a very exciting time for the Java Community Process.
Event Sourcing with JVM Languages [CON5074]
Rahul Somasunderam shared his experiences working with Event Sourcing, a technique of treating logs as the source of truth for a software system, rather than some other kind of persistent store such as a database. Rahul has created the Grooves framework to provide this abstraction. Here are my raw notes. The presentation is available in the content catalog link above. The presentation source is available at bit.ly/2017-es
- Some code examples that basically show how to do ORM using this thing.
There is an API for querying, creating snapshots, using annotations.
Handling Errors. Allows best effort approach.
- Some code examples that basically show how to do ORM using this thing.
There is an API for querying, creating snapshots, using annotations.
Handling Errors. Allows best effort approach.
Needed a java based event sourcing solution, looked around in 2016, nothing fit.
Definition: treat your database like you treat your logs.
Everyone is comfortable looking at logs. Log files: you can create entrys and read them. You cannot update or delete entries.
Bad example 1: bank account balance. @Transactional usage.
Scan of old school German bank passbook. Great example of a log. This is what event sourcing should be doing in any domain.
But that was banking. If you look at your logs and debug your application, you are doing event sourcing in your mind. Banks defined their business model hundreds of years ago.
Aggregate: Account. Events: Transcation, AtmWithdrawl. Snapshot: AccountSummary.
Computing snapshots: S sub N = f(S0, E1..EN)
The way to take your log and play it forward.
Incremental snapshots. Use an existing Snapshot as an input entry in computing a new snapshot.
Revert. You can't delete events but you can have new events that represent deletes.
Bad Example 2: Joins in event sourcing.
Grooves domain objects: Aggregates. Also uses RxJava Observables.
Great example: Lance Armstrong Tour de France victories. Question: How many Tour de France victories does he have? The answer depends on when you ask the question.
Be very careful what your events look like. It's very hard to modify them.
Non event sources of data. When the intent of the user is not clear from the datasource.
Other Sessions of Note:
Mon: 17:30 CON7474 ES, Distributed Systems, and CQRS with Java EE.
Tue: 13:15 CON4083 Async by Default, Synchronous when Necessary
Wed: 14:45 CON4277 Three Microservices Patterns to Tear Down Your Monoliths
Needed a java based event sourcing solution, looked around in 2016, nothing fit.
Definition: treat your database like you treat your logs.
Everyone is comfortable looking at logs. Log files: you can create entrys and read them. You cannot update or delete entries.
Bad example 1: bank account balance. @Transactional usage.
Scan of old school German bank passbook. Great example of a log. This is what event sourcing should be doing in any domain.
But that was banking. If you look at your logs and debug your application, you are doing event sourcing in your mind. Banks defined their business model hundreds of years ago.
Aggregate: Account. Events: Transcation, AtmWithdrawl. Snapshot: AccountSummary.
Computing snapshots: S sub N = f(S0, E1..EN)
The way to take your log and play it forward.
Incremental snapshots. Use an existing Snapshot as an input entry in computing a new snapshot.
Revert. You can't delete events but you can have new events that represent deletes.
Bad Example 2: Joins in event sourcing.
Grooves domain objects: Aggregates. Also uses RxJava Observables.
Great example: Lance Armstrong Tour de France victories. Question: How many Tour de France victories does he have? The answer depends on when you ask the question.
Be very careful what your events look like. It's very hard to modify them.
Non event sources of data. When the intent of the user is not clear from the datasource.
Other Sessions of Note:
Mon: 17:30 CON7474 ES, Distributed Systems, and CQRS with Java EE.
Tue: 13:15 CON4083 Async by Default, Synchronous when Necessary
Wed: 14:45 CON4277 Three Microservices Patterns to Tear Down Your Monoliths
Secrets of Rock Star Developers (and How to Become One!) [CON7615]
I was invited to co-present at this session by my good friend Bruno Souza regarding some lessons in my book Secrets of the Rock Star Developers. Bruno also invited Yuji Kubota, a developer from NTT in Japan. Yuji shared his experiences in achieving developer proficiency in spite of his complete hearing impairment.
Powerful Lessons from Top Java EE Experts [CON7624]
I was invited to participate in this panel discussion by Elder Moraes, who is now working for Oracle to continue to advance Java EE 8 in the community in Brazil. I was a bit skeptical about the prospects of this panel because Elder had invited fourteen (14!) people to be panelists. Perhaps he did not expect us all to show up, but 13 of us did.
My records show Elder, Adam Bien, Bruno Souza, David Heffelfinger, Edson Yanaga, Ivar Grimstad, Steve Millidge, Kevin Sutter, Reza Rahman, and Ruslan Synytsky
With that large number of people, and only an hour, it was a wonder we were coherent at all, but I guess it speaks to the quality of the Java EE community's ability to collaborate that we had a productive and informative session. Of course, the big news was the decision by Oracle to invest in handing off the IP of its Java EE JSRs, as of version Java EE 8, to the Eclipse Foundation to be the basis of a new top level project there: EE4J.
Monday
I started the day off with booth duty. This year, the conference was back at Moscone, but at Moscone West. The exhibit area was much larger than the hotel space at the Hilton Union Square from previous years. My booth demo was a part of the new Serverless Fn project booth, but it was only runnable when I was in the booth, as it was a last minute addition.
Servlet 4.0: A New Twist on an Old Favorite [CON2022]
This was one of my three conference sessions I had the opportunity to present. The slides are in the content catalog at the previous link, and the video is at YouTube. With the announcement of EE4J, Oracle is getting out of the business of leading Java EE specs, so this was very likely the last time I presented about Servlet at JavaOne. You never know what the future holds, but I approached it that way and gave it my all. I hope that comes across in the video.
Java Keynote
This was the big one. The full video is at YouTube. Big announcements included:
EE4J
Debut of the Fn Project
Demonstration of Project Jafar, Cloud Performance Tuning and flight recorder
Demonstration of Oracle Wercker cloud container native development pipeline system. Wercker allows you to build, deploy, and operate Kubernetes based containerized cloud applications.
Java SE 9 final release overview
Announcement of new release model for Java: every 6th months. This brought along with it a new naming scheme: YY.M. That means the next release is 18.3.
There was also an interesting keynote from Intel VP of System Technologies Michael Green. Mr. Green's keynote starts at 34:59
There were some nifty demos at the beginning of the keynote.
Building a Serverless State Service for the Cloud with Java 9 [CON3920]
This session is the one I was most excited to give, because it is the future for me at Oracle. After being allowed to finish Java EE 8 (thanks in no small part to the community and Oracle's attentiveness to it), I was given the opportunity to join the team responsible for Oracle Coherence. This team is building a new state service for the cloud, based on Coherence, but with a much simpler API. In fact, you can think of it as an API-less service since it will be exposed with cloud enabled implementations of existing Java 8 collections data structures, with some additions for things not present in the case of an entirely local collection. Unfortunately, this talk was not recorded, but the slides are available in the content catalog link above.
Tuesday
I did another spell of booth duty in the morning, as well as a panel discussion on the DevLive stage with Heather Vancura, Antoine-Sabot Durand, and Linda DeMichiel. The interview is at YouTube.
Ignite Session [IGN7979]: Java Your Next Theremin, among other talks
Kevin Nilson, leader of the Silicon Valley JUG and wonderful guy organized an "Ignite Session" again. I'd never done one before, but after the one I attended at DevoxxUS in April I felt I could do it. The idea with an Ignite session is you get 5 minutes to present your talk. In that five minutes you get 20 slides, each advancing every 15 seconds, on auto-advance. I gave a talk about building a Theremin.
Wednesday
Contemporary Java Web Applications with JSF 2.3 [CON2023]
This was the most monentous talk for me personally. Fifteen years, six months, and seven days after giving my first JavaOne talk about JSF I gave what is likely to be my last, for the same reason as with Servlet. But don't dismay, the future is bright for JSF. JSF is in the first batch of projects to be handed off to EE4J, and it will very likely be taken forward by JSF community expert Arjan Tijms.
Slides are above and video is on YouTube.
Thursday
Not having to deliver any sessions, speak to any customers, do any booth duty, or sit-in for any guest spots, I was able to attend sessions today.
Java Community Keynote
This fun keynote is available at Oracle.
Services, Assemble! Apply MVP Principles to Create Microservices Without Chaos [CON1706]
This talk by my friend Mark Heckler talked about how to apply MVP (Minimum Viable Product) principles to create cutting-edge Microservices without chaos with Spring Cloud/Netflix OSS
Here are my raw notes.
@MkHeck
Glad you're here to the end.
Listed some Pivotal products: Spring.
Who am I silde.
Likes Microservices, becuse it addresses many of the problems of the Monoliths.
Analogy of Microservices to the Avengers. Together they are more than the sum of the parts. They come together to form a resilient system.
Enablers: Monoliths are simpler from the outside. Microservices introduces a lot of complexity. Enablers: Spring Boot and Spring Cloud. Spring Boot is your onramp in becoming productive in the cloud. Any place you can deploy a JVM, you can deploy Spring Boot.
Spring Cloud OSS
Operational: config, service registry, circuit breaker, load balancer, intelligent router, asyc messaging, distributed tracing, security/oauth.
Impl: Spring Cloud Config, Netflix Eureaka, Netflix Hystrix, Netflix Ribbon, Netflix Zuul, Spring Cloud Stream, Spring Cloud Sleuth, Spring Cloud Security
With a good circuit breaker, you can nest them.
Demo: start.spring.io. Lots of extolling the virtues of this web app.
application.properties, renamed to bootstrap.properties
Pointed out 80/20 rule.
Zuul plays a role of deompising a monolith.
Container: Check! But What About Persistent Data, Big Data, and Fast Data?! [CON1439]
This session, by two of the engineers behind Mesosphere and Apache Mesos, used the 16 bit video game "The Secret of Monkey Island" to explore the challenges in running stateless services at scale in the real world that has state. Here are my raw notes.
Joerg Schad and Johaness Unterstein
Monkey Island theme.
It all began with a monolith
Hardware, OS, app
Hardware, OS, web app
add horizontal scaling: Hardware, OS, app
add services under web app.
Add VMs under OS, and IaaS underVMs
Replace web app with finer services: Microservices. Predefined interfaces where each is defined to do one thing pretty good.
Add containers on top of OS: Put more services on each OS node. Spreadsheet scheduling.
Container scheduling comes into play. Resource management.
Service management: collections of containers. Excellent pictures of containers from container ships sitting in row boats.
Health and readiness checks. Health check, "I am ready to serve traffic".
But how do we get containers into production
DC/OS maven plugin: mvn docker:build docker:push dcos:deploy
Or mvn package dcos:uploadArtifact dcos:deployUCR
MapReduce is crunching Data
Data Processing: SMACK stack. 1. Events 2. Ingest (Kafka) 3. Store (Cassandra) 4. Analyze (Spark) 5. Act (Akka)
Demo of running DC/OS on AWS.
Modern Java Recipes [CON1416]
The last session of the show, for me, and for many folks, was given by my fripnd and fellow NullPointer Ken Koussen. Ken is an excellent instructor and is so good at explaining complex topics. Ken has a new book of the same name as this talk, and he was kind enough to sport me a copy in exchange for a meal at cash-only Tommy's Joynt.
Here are my raw notes.
Ken Koussen
A few slides of self promition.
github.com/koussen/java_8_recipes
github.com/koussen/java_9_recipes
The Basics
streams, lambdas, method references
Beyond the basics
Lazy Streams
The peek method
Strings as Streams
anyMatch, allMatch, noneMatch
collect and reduce
flatMap vs. Map
Optional
Functional interfaces
taken as given
Steam produces sequence of elements. Does not store them. Does not modify them. Produces new items. Operations lazy when possible. Once you hit a terminal, that stream is done.
If you use a stream in a method, it should be created in that method.
operations from source to pipeline. No items are pulled from source until terminal operation is reached.
Shows the lazyness. findFirst() is a short circuiting terminal operations.
Debugging with the peek() method. IntelliJ has a nice plugin called StreamDebugger.
peek() is like .map(n -> { sop(n.entry); } );
Strings as Streams
aside: of() method.
Workaround. chars() and codePoints() on String.
codePoints() returns a stream.
s.toLowerCase().codePoints().filter().collect(appendCodePoint).toString()
Three argument Collect.
I was literally the last person to leave the conference baggage area, as shown in this pic of my lone bag with a member of the Marriott Hotel Staff.
Goodbye JavaOne. I hope to see you again next year.