SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Downloaden Sie, um offline zu lesen
Everything-as-code.
Polyglotte Entwicklung in der Praxis.
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 1
#whoami
Mario-Leander Reimer
Cheftechnologe, QAware GmbH
4 Vollblut Entwickler && Architekt
4 #CloudNativeNerd
4 Open Source Enthusiast
mario-leander.reimer@qaware.de
http://github.com/lreimer
http://speakerdeck.com/lreimer
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 2
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 3
Welche Sprache verwenden
echte Programmierer?
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 4
Meine #FirstSevenLanguages
4 Pascal
4 Basic
4 C / C++
4 Assembler
4 PHP
4 Java
4 C#
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 5
Meine #LastSevenLanguages
4 Java
4 Groovy
4 TypeScript
4 Ruby
4 Kotlin
4 Scala
4 Go
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 6
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 7
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 8
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 9
Es gibt keine einstimmige Meinung ...
4 http://spectrum.ieee.org/computing/software/
the-2015-top-ten-programming-languages
4 http://spectrum.ieee.org/computing/software/
the-2016-top-programming-languages
4 https://www.sitepoint.com/whats-best-
programming-language-learn-2015/
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 10
Die beste Programmiersprache gibt es nicht!
Auf den Kontext kommt es an.
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 11
Die IDE ist unsere Werkbank.
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 12
Unsere Definition von Software Industrialisierung
4 Hat nichts mit billiger Arbeitskraft zu tun!
4 Hoher Automatisiersgrad von arbeitsintensiven und
wiederkehrenden Arbeitsschritten
4 Höhere Software-Qualität durch abgestimmte Tool-Chain
4 Mehr Produktivität und Zufriedenheit der Teams
4 Bessere Kosten-Effizienz und Wettbewerbsfähigkeit
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 13
Wäre es nicht cool wenn ...
open fun everythingAsCode() : Boolean {
everytingIsMadeFromCode() && everythingIsMadeByCode()
}
val softwareIndustrialization = everythingAsCode()
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 14
The Quest for an ideal Polyglot Project Archetype
4 Welche Sprachen werden in unseren Projekten verwendet?
4 Welche Tools verwenden wir für Setup, Build, Code, Test,
CI, Infrastructure und Dokumentation?
4 Was davon hat sich bewährt und was eher nicht?
4 Gibt es bereits Best Practices für den Einsatz in der Praxis?
+ Wishful GreenfieldThinking!
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 15
SEU-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 16
Lightweight Developer Provisioning mit Gradle
4 [ SEU ] -> Software Entwicklungs Umgebung
4 Nutzung von Gradle als Build-Tool für das Setup und die
Aktualisierung unserer Entwicklungsumgebungen
4 Software-Pakete werden als Dependencies ausgedrückt
4 Gradle Tasks and Groovy Skripte statt Shell-Scripting
4 Versionskontrolle der SEU Definition und Skripte
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 17
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'
}
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 18
Build-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 19
Maven ist gut. Gradle ist besser.
4 Sehr flexibel und vielseitig einsetzbar.
4 Einfache Unterstützung für Polyglotte Projekte.
4 Build Skripte sind maximal kurz und prägnant.
4 Drastisch reduzierte Build-Zeiten durch Incremental Builds.
4 Zahlreiche neue Features: Composite Builds, Kotlin-basierte
Build-Skripte, Performance Verbesserungen, ...
4 Regelmäßige Releases. Stabil und ausgereift.
// OOP 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.163'
// and many more ...
}
task everythingAsCode() << {
println 'Everything-as-code @ OOP 2017.'
}
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 21
Main-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 22
Java ist nach wie vor die primäre Implementierungssprache!
Und das ist gut so!
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 23
Für die Mutigen: Kotlin als ernsthafte
Alternative zu Java.
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 24
Warum Kotlin? Und nicht Scala, Clojure, ...
4 Für Java Entwickler sehr schnell zu erlernen.
4 Sehr ausgewogene Universalsprache.
4 Null Safety + jede Menge andere nützliche Features.
4 JDK6 kompatibel. Kleine Library-Größe.
4 Sehr guter IDE Support.
4 Wishful GreenfieldThinking.
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 25
@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)
}
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 26
Frontend-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 27
Willkommen in der JavaScript Wunderwelt.
4 Ein Universum für sich!
4 Klarer Trend: Single Page Webapplikationen.
4 HTML5 + CSS3 + ?
4 ? = TypeScript oder
4 ? = ECMAScript2015 + Babel
4 Rückgrat des Builds: node + npm + webpack
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 28
Test-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 29
Groovy und Spock für 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"
}
}
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 30
Scala und Gatling für Last-Tests
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)
}
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 31
Pipeline-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 32
Definition der Build-Pipeline per 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'
}
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 33
Gradle und Docker to start Jenkins
task createJenkinsHome() {
mkdir("${System.getProperty('user.home')}/Jenkins")
}
task createJenkins(type: Exec, group: 'jenkinsci', dependsOn: createJenkinsHome, description: 'Create Jenkins') {
commandLine 'docker', 'run', '--name', 'jenkinsci', '-p', '8080:8080', '-p', '50000:50000',
'-v', "${System.getProperty('user.home')}/Jenkins:/var/jenkins_home", 'jenkinsci/jenkins'
}
task startJenkins(type: Exec, group: 'jenkinsci', description: 'Start Jenkins') {
commandLine 'docker', 'start', 'jenkinsci'
}
task stopJenkins(type: Exec, group: 'jenkinsci', description: 'Stop Jenkins') {
commandLine 'docker', 'stop', 'jenkinsci'
}
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 34
Infrastructure-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 35
Docker, Docker, Docker, ...
FROM qaware-oss-docker-registry.bintray.io/base/debian8-jre8
MAINTAINER M.-Leander Reimer <mario-leander.reimer@qaware.de>
RUN mkdir -p /app
ADD build/distributions/everything-as-code-1.0.0.tar /app
WORKDIR /app/everything-as-code-1.0.0
RUN chmod 755 bin/everything-as-code
EXPOSE 18080
CMD ./bin/everything-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 36
Vagrant und Ruby zum Setup lokaler VMs
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
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 37
Provisionierung mit Ansible (und 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
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 38
Cluster Orchestration mit 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.0.0"
ports:
- containerPort: 18080
env:
- name: PORT
value: 18080
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 39
Documentation-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 40
Ja, wir brauchen Dokumentation!
4 Und nein. Der Quellcode ist nicht genug!
4 Technische Dokumente mit Word sind ! " #
4 Dokumentation sollte neben dem Quellcode liegen:
change code, change docs.
4 Schnell und einfach zu schreiben.
4 Unterstützung für Code, Bilder, Diagramme
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 41
// 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
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 42
AsciidoctorJ und 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'
}
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 43
Presentation-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 44
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.
---
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 45
Heutige Projekte sind
vielsprachig.
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 46
Zeitgemäße Entwickler
müssen
vielsprachig sein!
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 47
Wir alle müssen unsere Hausaufgaben machen.
4 Entwickler: Be polyglot, keep learning!
4 Architekten: Die richtige Sprache ist stark abhängig
vom jeweiligen Projekt-Kontext. Choose wisely!
4 Project Managers: Give your techies freedom!
4 Universities: Unterrichtet vielsprachig!
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 48
Fork me on GitHub.
https://github.com/lreimer/everything-as-code
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 49
We are hiring.
http://www.qaware.de/karriere/#jobs
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 50
Q & A
// OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 51

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Developing Microservices with Apache Camel, by Claus Ibsen
Developing Microservices with Apache Camel, by Claus IbsenDeveloping Microservices with Apache Camel, by Claus Ibsen
Developing Microservices with Apache Camel, by Claus Ibsen
 
Machine Learning Platform in LINE Fukuoka
Machine Learning Platform in LINE FukuokaMachine Learning Platform in LINE Fukuoka
Machine Learning Platform in LINE Fukuoka
 
Ratpack Web Framework
Ratpack Web FrameworkRatpack Web Framework
Ratpack Web Framework
 
Mobile Library Development - stuck between a pod and a jar file - Zan Markan ...
Mobile Library Development - stuck between a pod and a jar file - Zan Markan ...Mobile Library Development - stuck between a pod and a jar file - Zan Markan ...
Mobile Library Development - stuck between a pod and a jar file - Zan Markan ...
 
Developing and deploying serverless applications (February 2017)
Developing and deploying serverless applications (February 2017)Developing and deploying serverless applications (February 2017)
Developing and deploying serverless applications (February 2017)
 
Building Web Apps in Ratpack
Building Web Apps in RatpackBuilding Web Apps in Ratpack
Building Web Apps in Ratpack
 
ThoughtWorks Technology Radar Roadshow - Perth
ThoughtWorks Technology Radar Roadshow - PerthThoughtWorks Technology Radar Roadshow - Perth
ThoughtWorks Technology Radar Roadshow - Perth
 
Magic of web components
Magic of web componentsMagic of web components
Magic of web components
 
How to generate a REST CXF3 application from Swagger ApacheConEU 2016
How to generate a REST CXF3 application from Swagger ApacheConEU 2016How to generate a REST CXF3 application from Swagger ApacheConEU 2016
How to generate a REST CXF3 application from Swagger ApacheConEU 2016
 
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
Erik Wendel - Beyond JavaScript Frameworks: Writing Reliable Web Apps With El...
 
Secured API Acceleration with Engineers from Amazon CloudFront and Slack
Secured API Acceleration with Engineers from Amazon CloudFront and SlackSecured API Acceleration with Engineers from Amazon CloudFront and Slack
Secured API Acceleration with Engineers from Amazon CloudFront and Slack
 
Developing faster than ever (Liferay DEVCON 2017)
Developing faster than ever (Liferay DEVCON 2017)Developing faster than ever (Liferay DEVCON 2017)
Developing faster than ever (Liferay DEVCON 2017)
 
Build reactive systems on lambda
Build reactive systems on lambdaBuild reactive systems on lambda
Build reactive systems on lambda
 
Cloud-native Java EE-volution
Cloud-native Java EE-volutionCloud-native Java EE-volution
Cloud-native Java EE-volution
 
Ansible @ Red Hat | December 2015 Ansible Meetup in Melbourne
Ansible @ Red Hat | December 2015 Ansible Meetup in MelbourneAnsible @ Red Hat | December 2015 Ansible Meetup in Melbourne
Ansible @ Red Hat | December 2015 Ansible Meetup in Melbourne
 
Ratpack Web Framework
Ratpack Web FrameworkRatpack Web Framework
Ratpack Web Framework
 
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
 
Build a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless FrameworkBuild a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless Framework
 
Understand How Node.js and Core Features Works
Understand How Node.js and Core Features WorksUnderstand How Node.js and Core Features Works
Understand How Node.js and Core Features Works
 
Pipelining DevOps with Jenkins and AWS
Pipelining DevOps with Jenkins and AWSPipelining DevOps with Jenkins and AWS
Pipelining DevOps with Jenkins and AWS
 

Andere mochten auch

Secure Architecture and Programming 101
Secure Architecture and Programming 101Secure Architecture and Programming 101
Secure Architecture and Programming 101
QAware GmbH
 

Andere mochten auch (20)

Per Anhalter durch den Cloud Native Stack (extended edition)
Per Anhalter durch den Cloud Native Stack (extended edition)Per Anhalter durch den Cloud Native Stack (extended edition)
Per Anhalter durch den Cloud Native Stack (extended edition)
 
Developing Skills for Amazon Echo
Developing Skills for Amazon EchoDeveloping Skills for Amazon Echo
Developing Skills for Amazon Echo
 
Secure Architecture and Programming 101
Secure Architecture and Programming 101Secure Architecture and Programming 101
Secure Architecture and Programming 101
 
Der Cloud Native Stack in a Nutshell
Der Cloud Native Stack in a NutshellDer Cloud Native Stack in a Nutshell
Der Cloud Native Stack in a Nutshell
 
Azure Functions - Get rid of your servers, use functions!
Azure Functions - Get rid of your servers, use functions!Azure Functions - Get rid of your servers, use functions!
Azure Functions - Get rid of your servers, use functions!
 
Cloud Native Unleashed
Cloud Native UnleashedCloud Native Unleashed
Cloud Native Unleashed
 
Microservices @ Work - A Practice Report of Developing Microservices
Microservices @ Work - A Practice Report of Developing MicroservicesMicroservices @ Work - A Practice Report of Developing Microservices
Microservices @ Work - A Practice Report of Developing Microservices
 
JEE on DC/OS - MesosCon Europe
JEE on DC/OS - MesosCon EuropeJEE on DC/OS - MesosCon Europe
JEE on DC/OS - MesosCon Europe
 
Lightweight developer provisioning with gradle and seu as-code
Lightweight developer provisioning with gradle and seu as-codeLightweight developer provisioning with gradle and seu as-code
Lightweight developer provisioning with gradle and seu as-code
 
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrAutomotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache Solr
 
Leveraging the Power of Solr with Spark
Leveraging the Power of Solr with SparkLeveraging the Power of Solr with Spark
Leveraging the Power of Solr with Spark
 
Automotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache SolrAutomotive Information Research driven by Apache Solr
Automotive Information Research driven by Apache Solr
 
Vamp - The anti-fragilitiy platform for digital services
Vamp - The anti-fragilitiy platform for digital servicesVamp - The anti-fragilitiy platform for digital services
Vamp - The anti-fragilitiy platform for digital services
 
A Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native StackA Hitchhiker's Guide to the Cloud Native Stack
A Hitchhiker's Guide to the Cloud Native Stack
 
Chronix as Long-Term Storage for Prometheus
Chronix as Long-Term Storage for PrometheusChronix as Long-Term Storage for Prometheus
Chronix as Long-Term Storage for Prometheus
 
The Cloud Native Stack
The Cloud Native StackThe Cloud Native Stack
The Cloud Native Stack
 
Der perfekte Microservice
Der perfekte MicroserviceDer perfekte Microservice
Der perfekte Microservice
 
Hands-on K8s: Deployments, Pods and Fun
Hands-on K8s: Deployments, Pods and FunHands-on K8s: Deployments, Pods and Fun
Hands-on K8s: Deployments, Pods and Fun
 
Kubernetes 101 and Fun
Kubernetes 101 and FunKubernetes 101 and Fun
Kubernetes 101 and Fun
 
CQRS basierte Architekturen mit Microservices
CQRS basierte Architekturen mit MicroservicesCQRS basierte Architekturen mit Microservices
CQRS basierte Architekturen mit Microservices
 

Ähnlich wie Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.

Parse cloud code
Parse cloud codeParse cloud code
Parse cloud code
維佋 唐
 
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
Marcel Bruch
 

Ähnlich wie Everything-as-code. Polyglotte Software-Entwicklung in der Praxis. (20)

Everything-as-code. Eine vielsprachige Reise. #javaland
Everything-as-code. Eine vielsprachige Reise. #javalandEverything-as-code. Eine vielsprachige Reise. #javaland
Everything-as-code. Eine vielsprachige Reise. #javaland
 
Everything-as-code - Polyglotte Softwareentwicklung
Everything-as-code - Polyglotte SoftwareentwicklungEverything-as-code - Polyglotte Softwareentwicklung
Everything-as-code - Polyglotte Softwareentwicklung
 
Everything-as-code. Ein polyglottes Abenteuer
Everything-as-code. Ein polyglottes AbenteuerEverything-as-code. Ein polyglottes Abenteuer
Everything-as-code. Ein polyglottes Abenteuer
 
Everything-as-code. Ein polyglottes Abenteuer. #jax2017
Everything-as-code. Ein polyglottes Abenteuer. #jax2017Everything-as-code. Ein polyglottes Abenteuer. #jax2017
Everything-as-code. Ein polyglottes Abenteuer. #jax2017
 
Polyglot Adventures for the Modern Java Developer #javaone2017
Polyglot Adventures for the Modern Java Developer #javaone2017Polyglot Adventures for the Modern Java Developer #javaone2017
Polyglot Adventures for the Modern Java Developer #javaone2017
 
Polyglot Adventures for the Modern Java Developer
Polyglot Adventures for the Modern Java DeveloperPolyglot Adventures for the Modern Java Developer
Polyglot Adventures for the Modern Java Developer
 
Everything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der PraxisEverything-as-code – Polyglotte Entwicklung in der Praxis
Everything-as-code – Polyglotte Entwicklung in der Praxis
 
Everything-as-code. A polyglot journey.
Everything-as-code. A polyglot journey.Everything-as-code. A polyglot journey.
Everything-as-code. A polyglot journey.
 
Everything-as-code - a polyglot journey.
Everything-as-code - a polyglot journey.Everything-as-code - a polyglot journey.
Everything-as-code - a polyglot journey.
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPL
 
Everything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventureEverything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventure
 
Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013Rspec and Capybara Intro Tutorial at RailsConf 2013
Rspec and Capybara Intro Tutorial at RailsConf 2013
 
hacking with node.JS
hacking with node.JShacking with node.JS
hacking with node.JS
 
How to build Sdk? Best practices
How to build Sdk? Best practicesHow to build Sdk? Best practices
How to build Sdk? Best practices
 
Cocoapods and Most common used library in Swift
Cocoapods and Most common used library in SwiftCocoapods and Most common used library in Swift
Cocoapods and Most common used library in Swift
 
Parse cloud code
Parse cloud codeParse cloud code
Parse cloud code
 
Enterprise JavaScript ... what the heck?
Enterprise JavaScript ... what the heck?Enterprise JavaScript ... what the heck?
Enterprise JavaScript ... what the heck?
 
"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson"Xapi-lang For declarative code generation" By James Nelson
"Xapi-lang For declarative code generation" By James Nelson
 
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
JUG Münster 2014 - Code Recommenders & Codetrails - Wissenstransfer 2.0
 
TypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack DevelopersTypeScript - Silver Bullet for the Full-stack Developers
TypeScript - Silver Bullet for the Full-stack Developers
 

Mehr von QAware GmbH

"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
QAware GmbH
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
QAware GmbH
 

Mehr von QAware GmbH (20)

50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf50 Shades of K8s Autoscaling #JavaLand24.pdf
50 Shades of K8s Autoscaling #JavaLand24.pdf
 
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
Make Agile Great - PM-Erfahrungen aus zwei virtuellen internationalen SAFe-Pr...
 
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN MainzFully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
Fully-managed Cloud-native Databases: The path to indefinite scale @ CNN Mainz
 
Down the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile ArchitectureDown the Ivory Tower towards Agile Architecture
Down the Ivory Tower towards Agile Architecture
 
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!"Mixed" Scrum-Teams – Die richtige Mischung macht's!
"Mixed" Scrum-Teams – Die richtige Mischung macht's!
 
Make Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform EngineeringMake Developers Fly: Principles for Platform Engineering
Make Developers Fly: Principles for Platform Engineering
 
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit PlaywrightDer Tod der Testpyramide? – Frontend-Testing mit Playwright
Der Tod der Testpyramide? – Frontend-Testing mit Playwright
 
Was kommt nach den SPAs
Was kommt nach den SPAsWas kommt nach den SPAs
Was kommt nach den SPAs
 
Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo Cloud Migration mit KI: der Turbo
Cloud Migration mit KI: der Turbo
 
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See... Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
Migration von stark regulierten Anwendungen in die Cloud: Dem Teufel die See...
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
 
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
Endlich gute API Tests. Boldly Testing APIs Where No One Has Tested Before.
 
Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!Kubernetes with Cilium in AWS - Experience Report!
Kubernetes with Cilium in AWS - Experience Report!
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAPKontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
Kontinuierliche Sicherheitstests für APIs mit Testkube und OWASP ZAP
 
Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.Service Mesh Pain & Gain. Experiences from a client project.
Service Mesh Pain & Gain. Experiences from a client project.
 
50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling50 Shades of K8s Autoscaling
50 Shades of K8s Autoscaling
 
Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.Blue turns green! Approaches and technologies for sustainable K8s clusters.
Blue turns green! Approaches and technologies for sustainable K8s clusters.
 
Per Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API GatewaysPer Anhalter zu Cloud Nativen API Gateways
Per Anhalter zu Cloud Nativen API Gateways
 
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
Aus blau wird grün! Ansätze und Technologien für nachhaltige Kubernetes-Cluster
 

Kürzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

Kürzlich hochgeladen (20)

GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 

Everything-as-code. Polyglotte Software-Entwicklung in der Praxis.

  • 1. Everything-as-code. Polyglotte Entwicklung in der Praxis. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 1
  • 2. #whoami Mario-Leander Reimer Cheftechnologe, QAware GmbH 4 Vollblut Entwickler && Architekt 4 #CloudNativeNerd 4 Open Source Enthusiast mario-leander.reimer@qaware.de http://github.com/lreimer http://speakerdeck.com/lreimer // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 2
  • 3. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 3
  • 4. Welche Sprache verwenden echte Programmierer? // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 4
  • 5. Meine #FirstSevenLanguages 4 Pascal 4 Basic 4 C / C++ 4 Assembler 4 PHP 4 Java 4 C# // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 5
  • 6. Meine #LastSevenLanguages 4 Java 4 Groovy 4 TypeScript 4 Ruby 4 Kotlin 4 Scala 4 Go // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 6
  • 7. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 7
  • 8. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 8
  • 9. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 9
  • 10. Es gibt keine einstimmige Meinung ... 4 http://spectrum.ieee.org/computing/software/ the-2015-top-ten-programming-languages 4 http://spectrum.ieee.org/computing/software/ the-2016-top-programming-languages 4 https://www.sitepoint.com/whats-best- programming-language-learn-2015/ // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 10
  • 11. Die beste Programmiersprache gibt es nicht! Auf den Kontext kommt es an. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 11
  • 12. Die IDE ist unsere Werkbank. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 12
  • 13. Unsere Definition von Software Industrialisierung 4 Hat nichts mit billiger Arbeitskraft zu tun! 4 Hoher Automatisiersgrad von arbeitsintensiven und wiederkehrenden Arbeitsschritten 4 Höhere Software-Qualität durch abgestimmte Tool-Chain 4 Mehr Produktivität und Zufriedenheit der Teams 4 Bessere Kosten-Effizienz und Wettbewerbsfähigkeit // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 13
  • 14. Wäre es nicht cool wenn ... open fun everythingAsCode() : Boolean { everytingIsMadeFromCode() && everythingIsMadeByCode() } val softwareIndustrialization = everythingAsCode() // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 14
  • 15. The Quest for an ideal Polyglot Project Archetype 4 Welche Sprachen werden in unseren Projekten verwendet? 4 Welche Tools verwenden wir für Setup, Build, Code, Test, CI, Infrastructure und Dokumentation? 4 Was davon hat sich bewährt und was eher nicht? 4 Gibt es bereits Best Practices für den Einsatz in der Praxis? + Wishful GreenfieldThinking! // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 15
  • 16. SEU-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 16
  • 17. Lightweight Developer Provisioning mit Gradle 4 [ SEU ] -> Software Entwicklungs Umgebung 4 Nutzung von Gradle als Build-Tool für das Setup und die Aktualisierung unserer Entwicklungsumgebungen 4 Software-Pakete werden als Dependencies ausgedrückt 4 Gradle Tasks and Groovy Skripte statt Shell-Scripting 4 Versionskontrolle der SEU Definition und Skripte // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 17
  • 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' } // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 18
  • 19. Build-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 19
  • 20. Maven ist gut. Gradle ist besser. 4 Sehr flexibel und vielseitig einsetzbar. 4 Einfache Unterstützung für Polyglotte Projekte. 4 Build Skripte sind maximal kurz und prägnant. 4 Drastisch reduzierte Build-Zeiten durch Incremental Builds. 4 Zahlreiche neue Features: Composite Builds, Kotlin-basierte Build-Skripte, Performance Verbesserungen, ... 4 Regelmäßige Releases. Stabil und ausgereift. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 20
  • 21. apply plugin: 'application' apply plugin: 'war' apply plugin: 'kotlin' apply plugin: 'groovy' repositories { jcenter() } dependencies { providedCompile 'fish.payara.extras:payara-micro:4.1.1.163' // and many more ... } task everythingAsCode() << { println 'Everything-as-code @ OOP 2017.' } // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 21
  • 22. Main-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 22
  • 23. Java ist nach wie vor die primäre Implementierungssprache! Und das ist gut so! // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 23
  • 24. Für die Mutigen: Kotlin als ernsthafte Alternative zu Java. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 24
  • 25. Warum Kotlin? Und nicht Scala, Clojure, ... 4 Für Java Entwickler sehr schnell zu erlernen. 4 Sehr ausgewogene Universalsprache. 4 Null Safety + jede Menge andere nützliche Features. 4 JDK6 kompatibel. Kleine Library-Größe. 4 Sehr guter IDE Support. 4 Wishful GreenfieldThinking. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 25
  • 26. @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) } // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 26
  • 27. Frontend-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 27
  • 28. Willkommen in der JavaScript Wunderwelt. 4 Ein Universum für sich! 4 Klarer Trend: Single Page Webapplikationen. 4 HTML5 + CSS3 + ? 4 ? = TypeScript oder 4 ? = ECMAScript2015 + Babel 4 Rückgrat des Builds: node + npm + webpack // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 28
  • 29. Test-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 29
  • 30. Groovy und Spock für 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" } } // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 30
  • 31. Scala und Gatling für Last-Tests 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) } // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 31
  • 32. Pipeline-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 32
  • 33. Definition der Build-Pipeline per 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' } // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 33
  • 34. Gradle und Docker to start Jenkins task createJenkinsHome() { mkdir("${System.getProperty('user.home')}/Jenkins") } task createJenkins(type: Exec, group: 'jenkinsci', dependsOn: createJenkinsHome, description: 'Create Jenkins') { commandLine 'docker', 'run', '--name', 'jenkinsci', '-p', '8080:8080', '-p', '50000:50000', '-v', "${System.getProperty('user.home')}/Jenkins:/var/jenkins_home", 'jenkinsci/jenkins' } task startJenkins(type: Exec, group: 'jenkinsci', description: 'Start Jenkins') { commandLine 'docker', 'start', 'jenkinsci' } task stopJenkins(type: Exec, group: 'jenkinsci', description: 'Stop Jenkins') { commandLine 'docker', 'stop', 'jenkinsci' } // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 34
  • 35. Infrastructure-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 35
  • 36. Docker, Docker, Docker, ... FROM qaware-oss-docker-registry.bintray.io/base/debian8-jre8 MAINTAINER M.-Leander Reimer <mario-leander.reimer@qaware.de> RUN mkdir -p /app ADD build/distributions/everything-as-code-1.0.0.tar /app WORKDIR /app/everything-as-code-1.0.0 RUN chmod 755 bin/everything-as-code EXPOSE 18080 CMD ./bin/everything-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 36
  • 37. Vagrant und Ruby zum Setup lokaler VMs 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 // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 37
  • 38. Provisionierung mit Ansible (und 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 // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 38
  • 39. Cluster Orchestration mit 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.0.0" ports: - containerPort: 18080 env: - name: PORT value: 18080 // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 39
  • 40. Documentation-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 40
  • 41. Ja, wir brauchen Dokumentation! 4 Und nein. Der Quellcode ist nicht genug! 4 Technische Dokumente mit Word sind ! " # 4 Dokumentation sollte neben dem Quellcode liegen: change code, change docs. 4 Schnell und einfach zu schreiben. 4 Unterstützung für Code, Bilder, Diagramme // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 41
  • 42. // 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 // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 42
  • 43. AsciidoctorJ und 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' } // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 43
  • 44. Presentation-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 44
  • 45. 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. --- // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 45
  • 46. Heutige Projekte sind vielsprachig. // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 46
  • 47. Zeitgemäße Entwickler müssen vielsprachig sein! // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 47
  • 48. Wir alle müssen unsere Hausaufgaben machen. 4 Entwickler: Be polyglot, keep learning! 4 Architekten: Die richtige Sprache ist stark abhängig vom jeweiligen Projekt-Kontext. Choose wisely! 4 Project Managers: Give your techies freedom! 4 Universities: Unterrichtet vielsprachig! // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 48
  • 49. Fork me on GitHub. https://github.com/lreimer/everything-as-code // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 49
  • 50. We are hiring. http://www.qaware.de/karriere/#jobs // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 50
  • 51. Q & A // OOP 2017 // Everything-as-code -> { created with ❤ and ☕ by @LeanderReimer @qaware } 51