SlideShare a Scribd company logo
Polyglot Adventures for the Modern Java Developer #javaone2017
#whoami
Mario-Leander Reimer
Chief Technologist, QAware GmbH
- Senior Developer && Architect
- 20+ years of experience
- #CloudNativeNerd
- Open Source Enthusiast
mario-leander.reimer@qaware.de
http://github.com/lreimer
http://speakerdeck.com/lreimer
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Which programming
language do real
developers use?
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
My #FirstSevenLanguages
• Pascal
• Basic
• C / C++
• Assembler
• PHP
• Java
• C#
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
My #LastSevenLanguages
• Java
• Groovy
• TypeScript
• Ruby
• Kotlin
• Scala
• Go
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
There is no unanimous opinion ...
• http://spectrum.ieee.org/computing/software/
the-2015-top-ten-programming-languages
• http://spectrum.ieee.org/computing/software/
the-2016-top-programming-languages
• http://redmonk.com/sogrady/2017/06/08/language-
rankings-6-17/
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
There is no best programming
language! Every language is
strong in a specific domain.
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
We are software craftsmen.
The IDE is our workbench.
Software Industrialization as
a key requirement for DevOps
and Continuous Delivery.
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
The software assembly line: produce
and deliver software continuously.
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Definition of Software Industrialization
• Automation of repetitive and laborious tasks
• Better software quality through a standardized
and streamlined tool chain
• A well integrated tool chain leads to a higher
productivity and happiness of your team
• Better cost efficiency and competitiveness
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
val softwareIndustrialization = everythingAsCode()
open fun everythingAsCode() =
everythingIsMadeFromCode()
&& everythingIsMadeByCode()
private fun everythingIsMadeFromCode() = true
private fun everythingIsMadeByCode() = true
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
So our polyglot
adventures begin.
The Quest for an ideal project archetype
• Which languages are used for the specific
domains in our projects?
• Which tools are used for Setup, Build, Code,
Test, CI, Infrastructure, Documentation?
• What are the the dos and don'ts of using a
specific language or technology?
+ some Wishful Greenfield Thinking!
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
Lightweight Developer Provisioning
• [ SEU ] German acronym; Software Entwicklungs-Umgebung
• Use a build tool for the automated creation and update of a
software development environment
• Software packages are expressed as dependencies
• Gradle tasks and Groovy are used instead of shell scripting
• The SEU definition is version controlled just like ordinary
source code
• Available open source at http://seu-as-code.io
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
plugins { id 'de.qaware.seu.as.code.base' version '2.4.0' }
import static de.qaware.seu.as.code.plugins.base.Platform.isMac
seuAsCode {
seuHome = { if (isMac()) '/Volumes/Everything-as-code' else 'Y:' }
projectName = 'Everything-as-code'
}
dependencies {
// list of software dependencies ...
software 'org.groovy-lang:groovy:2.4.7'
software 'org.scala-lang:scala:2.11.8'
software 'org.jruby:jruby:9.1.4.0'
}
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
Maven is good. Gradle is 100x faster.
• Very flexible. Gradle can build everything.
• Polyglot builds are supported easily.
• Succinct build scripts. Default conventions over
configuration.
• Incremental builds, reduced build times.
• New features: Kotlin build scripts, Composite Builds,
Parallel Downloads, ...
• Frequent releases. Mature and stable.
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
apply plugin: 'application'
apply plugin: 'war'
apply plugin: 'kotlin'
apply plugin: 'groovy'
repositories { jcenter() }
dependencies {
providedCompile 'fish.payara.extras:payara-micro:4.1.1.164'
// and many more ...
}
task everythingAsCode() << {
println 'Everything-as-code using Gradle @ JavaOne 2017.'
}
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
There is nothing
wrong with Java as
primary language!
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
But Kotlin is a serious
alternative worth considering
as primary language.
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
But why Kotlin? And not Scala, Clojure, et.al.
• Easy to learn for Java developers.
• Well-balanced universal language.
• Inbuilt Null safety & Syntactic sugar &
Excellent interoperability.
• JDK6 compatible. Small library size.
• Good IDE and tool support.
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
@JsonIgnoreProperties(ignoreUnknown = true)
data class Book(val title: String, val isbn: String, val author: String)
@ApplicationScoped
open class Bookshelf {
private val books = listOf(Book("The Hitchhiker's Guide to the Galaxy", "0345391802"))
open fun byIsbn(isbn: String): Book? = books.find { it.isbn == isbn }
}
@Path("books")
@Produces(MediaType.APPLICATION_JSON)
open class BookResource @Inject constructor(private val bookshelf: Bookshelf) {
@GET @Path("/{isbn}")
open fun byIsbn(@PathParam("isbn") isbn: String): Response {
val book = bookshelf.byIsbn(isbn)
return if (book != null) Response.ok(book).build() else Response.status(Status.NOT_FOUND).build()
}
}
@ApplicationPath("api")
class BookstoreAPI : Application() {
override fun getClasses() = hashSetOf(JacksonFeature::class.java, BookResource::class.java)
}
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
Welcome to JavaScript wonderland.
• Clear trend towards Single Page Web Applications
• A strange universe on its own!
• Take a currently hip JavaScript UI framework.
• HTML5 + CSS3 + ?
• ? = TypeScript or
• ? = ECMAScript2015 + Babel
• Build Backbone: node + npm + webpack
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
Groovy and Spock for Unit & Integration Tests
class BookshelfSpec extends Specification {
@Subject
def bookshelf = new Bookshelf()
@Unroll
def "Find book #title by ISBN #isbn"() {
when: 'we search a book by ISBN'
def book = bookshelf.byIsbn(isbn)
then: 'the title and author are correct'
book?.title == title
book?.author == author
where:
isbn || title | author
"0345391802" || "The Hitchhiker's Guide to the Galaxy" | "Douglas Adams"
"0345391829" || "Life, the Universe and Everything" | "Douglas Adams"
}
}
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Scala and Gatling for Load Testing
class BooksPerformanceTest extends Simulation {
val conf = http.baseURL("http://localhost:18080").acceptHeader("application/json")
val feeder = csv("books.csv").random
val scn = scenario("Book Search")
.exec(http("Get all books").get("/api/books"))
.during(30 seconds) {
feed(feeder)
.exec(http("Get book by title ${Title}").get("/api/books?title=${Title}"))
.pause(1 second)
.exec(http("Get book with ISBN ${ISBN}").get("/api/books/${ISBN}"))
}
setUp(scn.inject(atOnceUsers(10), rampUsers(50) over (30 seconds)))
.assertions(global.responseTime.max.lessThan(5000))
.protocols(conf)
}
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
Build Pipeline Definition via Jenkinsfile
#!/usr/bin/env groovy
node {
stage 'Checkout SCM'
checkout scm
stage 'Build/Analyse/Test'
sh './gradlew clean build'
archiveUnitTestResults()
archiveDistributions()
stage 'Dockerize'
sh './gradlew buildDockerImage'
stage 'Generate Documentation'
sh './gradlew asciidoctor'
}
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
Docker, Docker, Docker, ...
FROM qaware-oss-docker-registry.bintray.io/base/alpine-k8s-openjdk8:8u121
MAINTAINER M.-Leander Reimer <mario-leander.reimer@qaware.de>
RUN mkdir -p /app
ADD build/distributions/everything-as-code-1.2.1.tar /app
WORKDIR /app/everything-as-code-1.2.1
RUN chmod 755 bin/everything-as-code
EXPOSE 18080
CMD ./bin/everything-as-code
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Vagrant and Ruby for local VM setup
require 'yaml'
$setup = <<SCRIPT
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install -y ansible sshpass
SCRIPT
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty32"
settings = YAML.load_file 'src/vagrant/vagrant.yml'
config.vm.provider "virtualbox" do |vb|
vb.name = settings['vm']['name']
vb.gui = false
vb.memory = "512"
end
config.vm.provision "shell", inline: $setup
end
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Provisioning with Ansible (and Python)
---
# file: jenkinsci.yml
- hosts: jenkinsci
remote_user: root
tasks:
- debug: msg="Creating a Jenkins pipeline job on {{ inventory_hostname }}"
- jenkins_job:
name: Everything-as-code Pipeline
config: "{{ lookup('file', 'templates/pipeline-job.xml') }}"
url: "http://{{ inventory_hostname }}"
user: admin
password: admin
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Cluster Orchestration with Kubernetes
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: everything-as-code
spec:
replicas: 3
template:
metadata:
labels:
tier: backend
spec:
containers:
- name: everything-as-code
image: "qaware-oss-docker-registry.bintray.io/lreimer/everything-as-code:1.2.1"
ports:
- containerPort: 18080
env:
- name: PORT
value: 18080
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
Yes, we need documentation!
• And no, the source code is not enough.
• Writing technical docs with Word is ! " #
• Documentation should be located next to the
source code: change code, change docs.
• It should be easy, quick and fun to write.
• Support for code, images, UML diagrams, ...
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
// Beispiel Architektur-Dokumentation mit arc42 (https://arc42.github.io)
:imagesdir: ./images
= image:qaware-logo.png[QAware GmbH,2016] Everything-as-code
:toc-title: Table of Contents
:toc:
[[section-introduction-and-goals]]
== Introduction and Goals
The introduction to the architecture documentation should list the driving forces
that software architects must consider in their decisions.
=== Requirements Overview
=== Quality Goals
=== Stakeholders
<<<<
include::02_architecture_constraints.adoc[]
// further includes for the remaining sections
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
AsciidoctorJ and Gradle to the Rescue
plugins { id "org.asciidoctor.convert" version "1.5.3" }
asciidoctorj { version = '1.5.4.1' }
asciidoctor {
sourceDir 'src/docs/architecture'
resources {
from('src/docs/architecture') {
include 'images/**/*.png'
include 'images/**/*.jpg'
}
}
backends 'html5'
options doctype: 'article'
attributes 'source-highlighter': 'coderay'
}
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
Architecture documentation using Structurizr
def workspace = new Workspace("Everything-as-code", "The system context of Everything-as-code.")
def model = workspace.model
// create a model and the software system we want to describe
def bookApp = model.addSoftwareSystem("Book Application", "The best source to get info on books.")
// create the various types of people (roles) that use the software system
def anonymousUser = model.addPerson("Anonymous User", "Anybody on the web.")
anonymousUser.uses(bookApp, "Searches for books and views details.")
def browser = bookApp.addContainer("Web Browser",
"Allows users to view information about books", "Edge, Chrome, Firefox")
anonymousUser.uses(browser, "Views information from and makes requests to")
def webApp = bookApp.addContainer("Web Application",
"Hosts the browser-based web application and services", "Payara Fish")
browser.uses(webApp, "uses [JSON/HTTPS]")
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Architecture validation using QAvalidator
architecture(name: "Mail Example", prefix: "tview", reflexMLversion: "1.0") {
excludes "java.lang.*"
api "JavaMail" : "javax.mail.*"
component "Mail" {
api "IMail" : "de.qaware.mail.*"
impl ["de.qaware.mail.impl.*", "de.qaware.mail.impl2.*"]
uses "JavaMail"
component "MailSender" {
api ["de.qaware.mail.sender.*", "javax.mail.*"]
impl "de.qaware.mail.impl.javamail.JavaMailSender"
uses "JavaMail"
}
}
}
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
These slides were written in Markdown.
---
## [fit] These slides were written in Markdown.
- This is for real programmers! :smiley:
- Several open source projects available
- Use HTML and JavaScript alternatively.
---
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017
State of the art
software projects
are polyglot.
Use the right tool
for the job!
Use common sense!
The right language and tool depends on your
team, the project context and your customer.
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Fork me on GitHub.
https://github.com/lreimer/everything-as-code
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Please vote ! for
this session.
// JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
Polyglot Adventures for the Modern Java Developer #javaone2017

More Related Content

PDF
Everything-as-code. Ein polyglottes Abenteuer
PDF
Everything-as-code - Polyglotte Softwareentwicklung
PDF
Everything-as-code. A polyglot journey.
PDF
Everything-as-code – Polyglotte Entwicklung in der Praxis
PDF
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers....
PDF
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.
PDF
Polyglot Adventures for the Modern Java Developer
PDF
Developing Skills for Amazon Echo
Everything-as-code. Ein polyglottes Abenteuer
Everything-as-code - Polyglotte Softwareentwicklung
Everything-as-code. A polyglot journey.
Everything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers....
Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.
Polyglot Adventures for the Modern Java Developer
Developing Skills for Amazon Echo

What's hot (17)

PDF
Node.js vs Play Framework (with Japanese subtitles)
PDF
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
PDF
#NoXML: Eliminating XML in Spring Projects - SpringOne 2GX 2015
PDF
Full Stack Scala
PDF
Antons Kranga Building Agile Infrastructures
PDF
Developing Modern Java Web Applications with Java EE 7 and AngularJS
PDF
Developing, Testing and Scaling with Apache Camel - UberConf 2015
PDF
AWS Developer Fundamentals
PDF
React && React Native workshop
PDF
Immutable AWS Deployments with Packer and Jenkins
PPTX
Akka.net versus microsoft orleans
PDF
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
ODP
Nexthink Library - replacing a ruby on rails application with Scala and Spray
KEY
Plone Interactivity
PDF
Choosing a Javascript Framework
PDF
Play Framework: Intro & High-Level Overview
PDF
Containerizing a Web Application with Vue.js and Java
Node.js vs Play Framework (with Japanese subtitles)
Spring Boot Omakase: A Fast-Paced “Chef’s Choice” Dive into Fun and Useful To...
#NoXML: Eliminating XML in Spring Projects - SpringOne 2GX 2015
Full Stack Scala
Antons Kranga Building Agile Infrastructures
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Developing, Testing and Scaling with Apache Camel - UberConf 2015
AWS Developer Fundamentals
React && React Native workshop
Immutable AWS Deployments with Packer and Jenkins
Akka.net versus microsoft orleans
Comparing Hot JavaScript Frameworks: AngularJS, Ember.js and React.js - Sprin...
Nexthink Library - replacing a ruby on rails application with Scala and Spray
Plone Interactivity
Choosing a Javascript Framework
Play Framework: Intro & High-Level Overview
Containerizing a Web Application with Vue.js and Java
Ad

Similar to Polyglot Adventures for the Modern Java Developer #javaone2017 (20)

PDF
Everything-as-code. Ein polyglottes Abenteuer. #jax2017
PDF
Everything-as-code. Eine vielsprachige Reise. #javaland
PDF
Everything-as-code - a polyglot journey.
PDF
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
PDF
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.
PDF
Everything-as-code - A polyglot adventure
PDF
Everything-as-code. A polyglot adventure. #DevoxxPL
PPTX
hacking with node.JS
PDF
Lightweight developer provisioning with gradle and seu as-code
PDF
Lightweight Developer Provisioning with Gradle
PDF
Cocoapods and Most common used library in Swift
PPTX
Enterprise JavaScript ... what the heck?
PPTX
A few good JavaScript development tools
PDF
Webpack Encore Symfony Live 2017 San Francisco
PDF
Having Fun with Play
PPTX
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
PDF
"Xapi-lang For declarative code generation" By James Nelson
PPTX
TypeScript - Silver Bullet for the Full-stack Developers
PDF
Parse cloud code
Everything-as-code. Ein polyglottes Abenteuer. #jax2017
Everything-as-code. Eine vielsprachige Reise. #javaland
Everything-as-code - a polyglot journey.
Everything as-code. Polyglotte Entwicklung in der Praxis. #oop2017
Everything-as-code: DevOps und Continuous Delivery aus Sicht des Entwicklers.
Everything-as-code - A polyglot adventure
Everything-as-code. A polyglot adventure. #DevoxxPL
hacking with node.JS
Lightweight developer provisioning with gradle and seu as-code
Lightweight Developer Provisioning with Gradle
Cocoapods and Most common used library in Swift
Enterprise JavaScript ... what the heck?
A few good JavaScript development tools
Webpack Encore Symfony Live 2017 San Francisco
Having Fun with Play
Alberto Maria Angelo Paro - Isomorphic programming in Scala and WebDevelopmen...
"Xapi-lang For declarative code generation" By James Nelson
TypeScript - Silver Bullet for the Full-stack Developers
Parse cloud code
Ad

More from Mario-Leander Reimer (20)

PDF
Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.
PDF
A Hitchhiker's Guide to Cloud Native Java EE
PDF
Steinzeit war gestern! Die vielfältigen Wege der Cloud-nativen Evolution
PPTX
Das kleine Einmaleins der sicheren Architektur @heise_devSec
PDF
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
PDF
Cloud-native .NET-Microservices mit Kubernetes @BASTAcon
PDF
A Hitchhiker’s Guide to the Cloud Native Stack. #DevoxxPL
PDF
A Hitchhiker’s Guide to the Cloud Native Stack. #CDS17
PDF
Per Anhalter durch den Cloud Native Stack. #SEACONHH
PDF
Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017
PDF
Der Cloud Native Stack in a Nutshell. #CloudExpoEurope
PDF
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
PDF
Secure Architecture and Programming 101
PDF
Automotive Information Research driven by Apache Solr
PDF
Automotive Information Research driven by Apache Solr
PDF
Kubernetes 101 and Fun
PDF
Lightweight Developer Provisioning with Gradle and SEU-as-code
PDF
Secure JEE Architecture and Programming 101
PDF
Search-based business intelligence and reverse data engineering with Apache Solr
PDF
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI
Steinzeit war gestern! Vielfältige Wege der Cloud-nativen Evolution.
A Hitchhiker's Guide to Cloud Native Java EE
Steinzeit war gestern! Die vielfältigen Wege der Cloud-nativen Evolution
Das kleine Einmaleins der sicheren Architektur @heise_devSec
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Cloud-native .NET-Microservices mit Kubernetes @BASTAcon
A Hitchhiker’s Guide to the Cloud Native Stack. #DevoxxPL
A Hitchhiker’s Guide to the Cloud Native Stack. #CDS17
Per Anhalter durch den Cloud Native Stack. #SEACONHH
Per Anhalter durch den Cloud Native Stack (Extended Edition) #oop2017
Der Cloud Native Stack in a Nutshell. #CloudExpoEurope
A Hitchhiker’s Guide to the Cloud Native Stack. #ContainerConf
Secure Architecture and Programming 101
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache Solr
Kubernetes 101 and Fun
Lightweight Developer Provisioning with Gradle and SEU-as-code
Secure JEE Architecture and Programming 101
Search-based business intelligence and reverse data engineering with Apache Solr
Migrating a JSF-Based Web Application from Spring 3 to Java EE 7 and CDI

Recently uploaded (20)

PDF
KodekX | Application Modernization Development
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
Spectroscopy.pptx food analysis technology
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Machine learning based COVID-19 study performance prediction
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Encapsulation_ Review paper, used for researhc scholars
KodekX | Application Modernization Development
Unlocking AI with Model Context Protocol (MCP)
Spectroscopy.pptx food analysis technology
MYSQL Presentation for SQL database connectivity
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Machine learning based COVID-19 study performance prediction
Review of recent advances in non-invasive hemoglobin estimation
Dropbox Q2 2025 Financial Results & Investor Presentation
Digital-Transformation-Roadmap-for-Companies.pptx
Building Integrated photovoltaic BIPV_UPV.pdf
MIND Revenue Release Quarter 2 2025 Press Release
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Empathic Computing: Creating Shared Understanding
Advanced methodologies resolving dimensionality complications for autism neur...
Mobile App Security Testing_ A Comprehensive Guide.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Encapsulation_ Review paper, used for researhc scholars

Polyglot Adventures for the Modern Java Developer #javaone2017

  • 2. #whoami Mario-Leander Reimer Chief Technologist, QAware GmbH - Senior Developer && Architect - 20+ years of experience - #CloudNativeNerd - Open Source Enthusiast mario-leander.reimer@qaware.de http://github.com/lreimer http://speakerdeck.com/lreimer // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 3. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 4. Which programming language do real developers use? // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 5. My #FirstSevenLanguages • Pascal • Basic • C / C++ • Assembler • PHP • Java • C# // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 6. My #LastSevenLanguages • Java • Groovy • TypeScript • Ruby • Kotlin • Scala • Go // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 7. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 8. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 9. There is no unanimous opinion ... • http://spectrum.ieee.org/computing/software/ the-2015-top-ten-programming-languages • http://spectrum.ieee.org/computing/software/ the-2016-top-programming-languages • http://redmonk.com/sogrady/2017/06/08/language- rankings-6-17/ // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 10. There is no best programming language! Every language is strong in a specific domain. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 11. We are software craftsmen. The IDE is our workbench.
  • 12. Software Industrialization as a key requirement for DevOps and Continuous Delivery. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 13. The software assembly line: produce and deliver software continuously. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 14. Definition of Software Industrialization • Automation of repetitive and laborious tasks • Better software quality through a standardized and streamlined tool chain • A well integrated tool chain leads to a higher productivity and happiness of your team • Better cost efficiency and competitiveness // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 15. val softwareIndustrialization = everythingAsCode() open fun everythingAsCode() = everythingIsMadeFromCode() && everythingIsMadeByCode() private fun everythingIsMadeFromCode() = true private fun everythingIsMadeByCode() = true // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 17. The Quest for an ideal project archetype • Which languages are used for the specific domains in our projects? • Which tools are used for Setup, Build, Code, Test, CI, Infrastructure, Documentation? • What are the the dos and don'ts of using a specific language or technology? + some Wishful Greenfield Thinking! // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 19. Lightweight Developer Provisioning • [ SEU ] German acronym; Software Entwicklungs-Umgebung • Use a build tool for the automated creation and update of a software development environment • Software packages are expressed as dependencies • Gradle tasks and Groovy are used instead of shell scripting • The SEU definition is version controlled just like ordinary source code • Available open source at http://seu-as-code.io // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 20. plugins { id 'de.qaware.seu.as.code.base' version '2.4.0' } import static de.qaware.seu.as.code.plugins.base.Platform.isMac seuAsCode { seuHome = { if (isMac()) '/Volumes/Everything-as-code' else 'Y:' } projectName = 'Everything-as-code' } dependencies { // list of software dependencies ... software 'org.groovy-lang:groovy:2.4.7' software 'org.scala-lang:scala:2.11.8' software 'org.jruby:jruby:9.1.4.0' } // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 22. Maven is good. Gradle is 100x faster. • Very flexible. Gradle can build everything. • Polyglot builds are supported easily. • Succinct build scripts. Default conventions over configuration. • Incremental builds, reduced build times. • New features: Kotlin build scripts, Composite Builds, Parallel Downloads, ... • Frequent releases. Mature and stable. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 23. apply plugin: 'application' apply plugin: 'war' apply plugin: 'kotlin' apply plugin: 'groovy' repositories { jcenter() } dependencies { providedCompile 'fish.payara.extras:payara-micro:4.1.1.164' // and many more ... } task everythingAsCode() << { println 'Everything-as-code using Gradle @ JavaOne 2017.' } // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 25. There is nothing wrong with Java as primary language! // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 26. But Kotlin is a serious alternative worth considering as primary language. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 27. But why Kotlin? And not Scala, Clojure, et.al. • Easy to learn for Java developers. • Well-balanced universal language. • Inbuilt Null safety & Syntactic sugar & Excellent interoperability. • JDK6 compatible. Small library size. • Good IDE and tool support. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 28. @JsonIgnoreProperties(ignoreUnknown = true) data class Book(val title: String, val isbn: String, val author: String) @ApplicationScoped open class Bookshelf { private val books = listOf(Book("The Hitchhiker's Guide to the Galaxy", "0345391802")) open fun byIsbn(isbn: String): Book? = books.find { it.isbn == isbn } } @Path("books") @Produces(MediaType.APPLICATION_JSON) open class BookResource @Inject constructor(private val bookshelf: Bookshelf) { @GET @Path("/{isbn}") open fun byIsbn(@PathParam("isbn") isbn: String): Response { val book = bookshelf.byIsbn(isbn) return if (book != null) Response.ok(book).build() else Response.status(Status.NOT_FOUND).build() } } @ApplicationPath("api") class BookstoreAPI : Application() { override fun getClasses() = hashSetOf(JacksonFeature::class.java, BookResource::class.java) } // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 30. Welcome to JavaScript wonderland. • Clear trend towards Single Page Web Applications • A strange universe on its own! • Take a currently hip JavaScript UI framework. • HTML5 + CSS3 + ? • ? = TypeScript or • ? = ECMAScript2015 + Babel • Build Backbone: node + npm + webpack // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 32. Groovy and Spock for Unit & Integration Tests class BookshelfSpec extends Specification { @Subject def bookshelf = new Bookshelf() @Unroll def "Find book #title by ISBN #isbn"() { when: 'we search a book by ISBN' def book = bookshelf.byIsbn(isbn) then: 'the title and author are correct' book?.title == title book?.author == author where: isbn || title | author "0345391802" || "The Hitchhiker's Guide to the Galaxy" | "Douglas Adams" "0345391829" || "Life, the Universe and Everything" | "Douglas Adams" } } // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 33. Scala and Gatling for Load Testing class BooksPerformanceTest extends Simulation { val conf = http.baseURL("http://localhost:18080").acceptHeader("application/json") val feeder = csv("books.csv").random val scn = scenario("Book Search") .exec(http("Get all books").get("/api/books")) .during(30 seconds) { feed(feeder) .exec(http("Get book by title ${Title}").get("/api/books?title=${Title}")) .pause(1 second) .exec(http("Get book with ISBN ${ISBN}").get("/api/books/${ISBN}")) } setUp(scn.inject(atOnceUsers(10), rampUsers(50) over (30 seconds))) .assertions(global.responseTime.max.lessThan(5000)) .protocols(conf) } // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 35. Build Pipeline Definition via Jenkinsfile #!/usr/bin/env groovy node { stage 'Checkout SCM' checkout scm stage 'Build/Analyse/Test' sh './gradlew clean build' archiveUnitTestResults() archiveDistributions() stage 'Dockerize' sh './gradlew buildDockerImage' stage 'Generate Documentation' sh './gradlew asciidoctor' } // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 37. Docker, Docker, Docker, ... FROM qaware-oss-docker-registry.bintray.io/base/alpine-k8s-openjdk8:8u121 MAINTAINER M.-Leander Reimer <mario-leander.reimer@qaware.de> RUN mkdir -p /app ADD build/distributions/everything-as-code-1.2.1.tar /app WORKDIR /app/everything-as-code-1.2.1 RUN chmod 755 bin/everything-as-code EXPOSE 18080 CMD ./bin/everything-as-code // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 38. Vagrant and Ruby for local VM setup require 'yaml' $setup = <<SCRIPT sudo apt-add-repository ppa:ansible/ansible sudo apt-get update sudo apt-get install -y ansible sshpass SCRIPT Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty32" settings = YAML.load_file 'src/vagrant/vagrant.yml' config.vm.provider "virtualbox" do |vb| vb.name = settings['vm']['name'] vb.gui = false vb.memory = "512" end config.vm.provision "shell", inline: $setup end // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 39. Provisioning with Ansible (and Python) --- # file: jenkinsci.yml - hosts: jenkinsci remote_user: root tasks: - debug: msg="Creating a Jenkins pipeline job on {{ inventory_hostname }}" - jenkins_job: name: Everything-as-code Pipeline config: "{{ lookup('file', 'templates/pipeline-job.xml') }}" url: "http://{{ inventory_hostname }}" user: admin password: admin // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 40. Cluster Orchestration with Kubernetes --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: everything-as-code spec: replicas: 3 template: metadata: labels: tier: backend spec: containers: - name: everything-as-code image: "qaware-oss-docker-registry.bintray.io/lreimer/everything-as-code:1.2.1" ports: - containerPort: 18080 env: - name: PORT value: 18080 // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 42. Yes, we need documentation! • And no, the source code is not enough. • Writing technical docs with Word is ! " # • Documentation should be located next to the source code: change code, change docs. • It should be easy, quick and fun to write. • Support for code, images, UML diagrams, ... // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 43. // Beispiel Architektur-Dokumentation mit arc42 (https://arc42.github.io) :imagesdir: ./images = image:qaware-logo.png[QAware GmbH,2016] Everything-as-code :toc-title: Table of Contents :toc: [[section-introduction-and-goals]] == Introduction and Goals The introduction to the architecture documentation should list the driving forces that software architects must consider in their decisions. === Requirements Overview === Quality Goals === Stakeholders <<<< include::02_architecture_constraints.adoc[] // further includes for the remaining sections // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 44. AsciidoctorJ and Gradle to the Rescue plugins { id "org.asciidoctor.convert" version "1.5.3" } asciidoctorj { version = '1.5.4.1' } asciidoctor { sourceDir 'src/docs/architecture' resources { from('src/docs/architecture') { include 'images/**/*.png' include 'images/**/*.jpg' } } backends 'html5' options doctype: 'article' attributes 'source-highlighter': 'coderay' } // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 46. Architecture documentation using Structurizr def workspace = new Workspace("Everything-as-code", "The system context of Everything-as-code.") def model = workspace.model // create a model and the software system we want to describe def bookApp = model.addSoftwareSystem("Book Application", "The best source to get info on books.") // create the various types of people (roles) that use the software system def anonymousUser = model.addPerson("Anonymous User", "Anybody on the web.") anonymousUser.uses(bookApp, "Searches for books and views details.") def browser = bookApp.addContainer("Web Browser", "Allows users to view information about books", "Edge, Chrome, Firefox") anonymousUser.uses(browser, "Views information from and makes requests to") def webApp = bookApp.addContainer("Web Application", "Hosts the browser-based web application and services", "Payara Fish") browser.uses(webApp, "uses [JSON/HTTPS]") // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 47. Architecture validation using QAvalidator architecture(name: "Mail Example", prefix: "tview", reflexMLversion: "1.0") { excludes "java.lang.*" api "JavaMail" : "javax.mail.*" component "Mail" { api "IMail" : "de.qaware.mail.*" impl ["de.qaware.mail.impl.*", "de.qaware.mail.impl2.*"] uses "JavaMail" component "MailSender" { api ["de.qaware.mail.sender.*", "javax.mail.*"] impl "de.qaware.mail.impl.javamail.JavaMailSender" uses "JavaMail" } } } // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 49. These slides were written in Markdown. --- ## [fit] These slides were written in Markdown. - This is for real programmers! :smiley: - Several open source projects available - Use HTML and JavaScript alternatively. --- // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 51. State of the art software projects are polyglot.
  • 52. Use the right tool for the job!
  • 53. Use common sense! The right language and tool depends on your team, the project context and your customer. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 54. Fork me on GitHub. https://github.com/lreimer/everything-as-code // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }
  • 55. Please vote ! for this session. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }