Slide 1

Slide 1 text

Forgetting JAVA Why Java Should Die in Flames and Take its Developers Along Piotr Limanowski @peel @peel #tricityjug 1

Slide 2

Slide 2 text

PART I IS JAVA DEAD? @peel #tricityjug 2

Slide 3

Slide 3 text

Nope. @peel #tricityjug 3

Slide 4

Slide 4 text

Java might be @peel #tricityjug 4

Slide 5

Slide 5 text

dy•ing (dīˈĭng) v. Present participle of die. adj. About to die: dying language. @peel #tricityjug 5

Slide 6

Slide 6 text

dying by "verbosity" "poor type inference" "weak type system" "low-level support for concurrency/parallelism" "dependency hell" "OSS mostly comes from android & enterprises" @peel #tricityjug 6

Slide 7

Slide 7 text

If programming is going to be the thing I spend my time on, it damn well better be awesome. — David Heinemeier Hansen @peel #tricityjug 7

Slide 8

Slide 8 text

But, really... @peel #tricityjug 8

Slide 9

Slide 9 text

Is Java dead? @peel #tricityjug 9

Slide 10

Slide 10 text

COBOL @peel #tricityjug 10

Slide 11

Slide 11 text

TO @peel #tricityjug 11

Slide 12

Slide 12 text

OTHER LANGUAGES @peel #tricityjug 12

Slide 13

Slide 13 text

COBOL TO JAVA TRANSPILER @peel #tricityjug 13

Slide 14

Slide 14 text

Why? @peel #tricityjug 14

Slide 15

Slide 15 text

Java does not change. @peel #tricityjug 15

Slide 16

Slide 16 text

Why not C then? @peel #tricityjug 16

Slide 17

Slide 17 text

source & binary compatible since @peel #tricityjug 17

Slide 18

Slide 18 text

FOREVER @peel #tricityjug 18

Slide 19

Slide 19 text

type erasure @peel #tricityjug 19

Slide 20

Slide 20 text

let's change @peel #tricityjug 20

Slide 21

Slide 21 text

attract those crazy, eager, young, passionate, enthusiastic — someone, somewhere, someday @peel #tricityjug 21

Slide 22

Slide 22 text

Y U NO CHANGE? @peel #tricityjug 22

Slide 23

Slide 23 text

missing: happiness @peel #tricityjug 23

Slide 24

Slide 24 text

PROFFESSIONAL SINNERS @peel #tricityjug 24

Slide 25

Slide 25 text

PROFFESSIONAL ENTERPRISE SINNERS @peel #tricityjug 25

Slide 26

Slide 26 text

val virtues = "crazy" :: "eager" :: "young" :: "passionate" :: "enthusiastic" :: "happy" Nil virtues.dropWhile(wat) def wat = { @peel #tricityjug 26

Slide 27

Slide 27 text

PART II THE SINS @peel #tricityjug 27

Slide 28

Slide 28 text

IGNORANCE @peel #tricityjug 28

Slide 29

Slide 29 text

shell @peel #tricityjug 29

Slide 30

Slide 30 text

multiplexer tmux shell ZSH w/ prezto editor spacemacs sane defaults: skwp/dotfiles @peel #tricityjug 30

Slide 31

Slide 31 text

test feedback REPL @peel #tricityjug 31

Slide 32

Slide 32 text

REPL driven development @peel #tricityjug 32

Slide 33

Slide 33 text

1. experiment in repl 2. write test 3. [opt] how to make test pass in repl? 4. implement 5. refactor @peel #tricityjug 33

Slide 34

Slide 34 text

gui git client? @peel #tricityjug 34

Slide 35

Slide 35 text

then how about... @peel #tricityjug 35

Slide 36

Slide 36 text

smart prompt multiple sessions session preserving quick file changes project generation finding files | operator microservices @peel #tricityjug 36

Slide 37

Slide 37 text

CLI ALL THE THINGS @peel #tricityjug 37

Slide 38

Slide 38 text

Java can't into shell. Properly. @peel #tricityjug 38

Slide 39

Slide 39 text

Grass is always greener: codegangsta/cli @peel #tricityjug 39

Slide 40

Slide 40 text

package main import ( "os" "github.com/codegangsta/cli" //THIS ) func main() { app := cli.NewApp() app.Name = "greet" app.Usage = "fight the loneliness!" app.Flags = []cli.Flag { cli.StringFlag{ Name: "lang", Value: "english", Usage: "language for the greeting", }, } app.Action = func(c *cli.Context) { name := "someone" if len(c.Args()) > 0 { name = c.Args()[0] } if c.String("lang") == "spanish" { println("Hola", name) } else { println("Hello", name) } } app.Run(os.Args) } @peel #tricityjug 40

Slide 41

Slide 41 text

Commander.rb Shell scopt.scala @peel #tricityjug 41

Slide 42

Slide 42 text

version management @peel #tricityjug 42

Slide 43

Slide 43 text

$ rvm install 2.2.3 $ rvm use 2.2.3 $ cd .. $ rvm install 2.2.4 $ rvm use 2.2.0 --default @peel #tricityjug 43

Slide 44

Slide 44 text

jenv.io @peel #tricityjug 44

Slide 45

Slide 45 text

distribution @peel #tricityjug 45

Slide 46

Slide 46 text

OS packages self-contained fatjars containers @peel #tricityjug 46

Slide 47

Slide 47 text

App Servers are DEAD @peel #tricityjug 47

Slide 48

Slide 48 text

Server version dependency? @peel #tricityjug 48

Slide 49

Slide 49 text

Server monitoring? @peel #tricityjug 49

Slide 50

Slide 50 text

Call home @peel #tricityjug 50

Slide 51

Slide 51 text

Dead man's switch @peel #tricityjug 51

Slide 52

Slide 52 text

Status page @peel #tricityjug 52

Slide 53

Slide 53 text

DEV W/O OPS @peel #tricityjug 53

Slide 54

Slide 54 text

snowflake dev @peel #tricityjug 54

Slide 55

Slide 55 text

every hour is Ship It hour @peel #tricityjug 55

Slide 56

Slide 56 text

Continuous Delivery — Humble, Jez; Farley, David, Addison-Wesley, 2011 @peel #tricityjug 56

Slide 57

Slide 57 text

Release It! — Nygard, Michael, Pragmatic Publishing, 2007 @peel #tricityjug 57

Slide 58

Slide 58 text

2007 @peel #tricityjug 58

Slide 59

Slide 59 text

bulkheading @peel #tricityjug 59

Slide 60

Slide 60 text

circuit breakers @peel #tricityjug 60

Slide 61

Slide 61 text

@peel #tricityjug 61

Slide 62

Slide 62 text

Logging (frameworks) @peel #tricityjug 62

Slide 63

Slide 63 text

Timestamp | Status | Entity Id | What happened | What did user do @peel #tricityjug 63

Slide 64

Slide 64 text

EASY NOT SIMPLE @peel #tricityjug 64

Slide 65

Slide 65 text

Build tools @peel #tricityjug 65

Slide 66

Slide 66 text

Maven ... @peel #tricityjug 66

Slide 67

Slide 67 text

Maven 17 ... 1565 @peel #tricityjug 67

Slide 68

Slide 68 text

1565 @peel #tricityjug 68

Slide 69

Slide 69 text

! Separation? @peel #tricityjug 69

Slide 70

Slide 70 text

Gradle 1 apply plugin: 'java' @peel #tricityjug 70

Slide 71

Slide 71 text

GREAT SUCCESS @peel #tricityjug 71

Slide 72

Slide 72 text

$ ls gradlew/ src/ build.gradle gradle.properties gradlew gradlew.bat settings.gradle @peel #tricityjug 72

Slide 73

Slide 73 text

Ant 25 ... 233 @peel #tricityjug 73

Slide 74

Slide 74 text

If I knew then what I know now, I would have tried using a real scripting language — James Duncan Davidson (creator of Ant) @peel #tricityjug 74

Slide 75

Slide 75 text

XML @peel #tricityjug 75

Slide 76

Slide 76 text

Grass is always greener: Rake @peel #tricityjug 76

Slide 77

Slide 77 text

rails/rails 67 lines of code @peel #tricityjug 77

Slide 78

Slide 78 text

task default: %w[test] task :test do ruby "test/unittest.rb" end @peel #tricityjug 78

Slide 79

Slide 79 text

Sample @peel #tricityjug 79

Slide 80

Slide 80 text

Grass is always greener: Mix (Elixir) @peel #tricityjug 80

Slide 81

Slide 81 text

mix new my_project --module MyProject vim mix.exs mix deps.get npm install @peel #tricityjug 81

Slide 82

Slide 82 text

Dependency management @peel #tricityjug 82

Slide 83

Slide 83 text

1565 XML @peel #tricityjug 83

Slide 84

Slide 84 text

Grass is always greener: Bundler @peel #tricityjug 84

Slide 85

Slide 85 text

$ gem install bundler $ bundle init source 'https://rubygems.org' gem 'nokogiri' gem 'rails' gem 'rack', '>=1.0' gem 'thin', '~>1.1' gem 'globalid', github: 'rails/globalid', branch: 'master' @peel #tricityjug 85

Slide 86

Slide 86 text

Grass is always greener: Mix (Elixir) @peel #tricityjug 86

Slide 87

Slide 87 text

$ mix phoenix.server defmodule Chat.Mixfile do use Mix.Project def project do [app: :chat, version: "0.0.1", elixir: "~> 1.0", elixirc_paths: ["lib", "web"], compilers: [:phoenix] ++ Mix.compilers, deps: deps] end def application do [mod: {Chat, []}, applications: [:phoenix, :phoenix_html, :cowboy, :logger]] end def deps do [{:phoenix, "~> 0.17"}, {:phoenix_html, "~> 2.1"}, {:phoenix_live_reload, "~> 1.0"}, {:phoenix_ecto, "~> 0.9"}, {:postgrex, ">= 0.0.0"}, {:cowboy, "~> 1.0"}] end end @peel #tricityjug 87

Slide 88

Slide 88 text

Web Frameworks @peel #tricityjug 88

Slide 89

Slide 89 text

(Don't) fight the HTTP @peel #tricityjug 89

Slide 90

Slide 90 text

Java EE is a dead fish ! @peel #tricityjug 90

Slide 91

Slide 91 text

@Spring @peel #tricityjug 91

Slide 92

Slide 92 text

Thanks to @Annotations, @Progress is @Unstoppable! — annotationmania.com @peel #tricityjug 92

Slide 93

Slide 93 text

spring boot w/ velocity @peel #tricityjug 93

Slide 94

Slide 94 text

Dropwizard no magic involved @peel #tricityjug 94

Slide 95

Slide 95 text

Grass is always greener: Phoenix @peel #tricityjug 95

Slide 96

Slide 96 text

$ mix phoenix.new hello_phoenix $ cd hello_phoenix $ mix phoenix.server @peel #tricityjug 96

Slide 97

Slide 97 text

FALSE IDOLS WAY TOO OFTEN @peel #tricityjug 97

Slide 98

Slide 98 text

GOF Design patterns @peel #tricityjug 98

Slide 99

Slide 99 text

It's good to know them. @peel #tricityjug 99

Slide 100

Slide 100 text

It's essential to understand them. @peel #tricityjug 100

Slide 101

Slide 101 text

FINALE @peel #tricityjug 101

Slide 102

Slide 102 text

Update your tools Look beyond the fence Question everything Kill the old Have fun @peel #tricityjug 102

Slide 103

Slide 103 text

One last thing... @peel #tricityjug 103

Slide 104

Slide 104 text

_INASWAN @peel #tricityjug 104

Slide 105

Slide 105 text

HAVE FUN @peel #tricityjug 105

Slide 106

Slide 106 text

HAKUNA MATATA THANKS @peel #tricityjug 106