Polyglot Adventures for the Modern Java Developer

Information about Polyglot Adventures for the Modern Java Developer

Published on October 4, 2017

Author: QAware

Source: slideshare.net

Content

1. #whoami Mario-Leander Reimer Chief Technologist, QAware GmbH - Senior Developer && Architect - 20+ years of experience - #CloudNativeNerd - Open Source Enthusiast [email protected] http://github.com/lreimer http://speakerdeck.com/lreimer // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

2. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

3. Which programming language do real developers use? // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

4. My #FirstSevenLanguages • Pascal • Basic • C / C++ • Assembler • PHP • Java • C# // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

5. My #LastSevenLanguages • Java • Groovy • TypeScript • Ruby • Kotlin • Scala • Go // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

6. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

7. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

8. 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 }

9. 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 }

10. We are software craftsmen. The IDE is our workbench.

11. Software Industrialization as a key requirement for DevOps and Continuous Delivery. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

12. The software assembly line: produce and deliver software continuously. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

13. 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 }

14. 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 }

15. So our polyglot adventures begin.

16. 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 }

17. 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 }

18. 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 }

19. 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 }

20. 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 }

21. There is nothing wrong with Java as primary language! // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

22. But Kotlin is a serious alternative worth considering as primary language. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

23. 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 }

24. @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 }

25. 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 }

26. 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 }

27. 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 }

28. 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 }

29. Docker, Docker, Docker, ... FROM qaware-oss-docker-registry.bintray.io/base/alpine-k8s-openjdk8:8u121 MAINTAINER M.-Leander Reimer <[email protected]> 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 }

30. 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 }

31. 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 }

32. 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 }

33. 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 }

34. // 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 }

35. 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 }

36. 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 }

37. 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 }

38. 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 }

39. State of the art software projects are polyglot.

40. Use the right tool for the job!

41. 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 }

42. Fork me on GitHub. https://github.com/lreimer/everything-as-code // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

43. Please vote ! for this session. // JavaOne 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware }

#whoami presentations

Zer 0 no zer(0 day)   dragon jar
25. 09. 2020
0 views

Zer 0 no zer(0 day) dragon jar

Related presentations


Other presentations created by QAware

The Cloud Native Stack
02. 05. 2016
0 views

The Cloud Native Stack

Cloud Native Unleashed
14. 06. 2016
0 views

Cloud Native Unleashed

Cloud-native Java EE-volution
08. 11. 2017
0 views

Cloud-native Java EE-volution

QAware Big Data Landscape 2018
09. 01. 2018
0 views

QAware Big Data Landscape 2018

Clusterless mit AWS Fargate
14. 11. 2018
0 views

Clusterless mit AWS Fargate

Machine Learning made easy
22. 02. 2019
0 views

Machine Learning made easy

Big Data Landscape 2019
25. 02. 2019
0 views

Big Data Landscape 2019

K8s is not for App Developers
14. 06. 2019
0 views

K8s is not for App Developers

Building ML Pipelines with DCOS
10. 07. 2019
0 views

Building ML Pipelines with DCOS

Modeling Moods
23. 09. 2019
0 views

Modeling Moods

GitOps: Pain 'n Gain
31. 07. 2020
0 views

GitOps: Pain 'n Gain

Hack Me If You Can
01. 10. 2020
0 views

Hack Me If You Can