Web Technologies
current state & what's coming
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2119540/01_grey_selleo_xlarge.png)
customers
developer preferences
technology trends
chooses ...
how to make wise decisions?
making wiser decisions
Text
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2119540/01_grey_selleo_xlarge.png)
What we do?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2504620/this-is-the-web.png)
What we do?
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2504620/this-is-the-web.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2504623/this-will-bethe-web.png)
THIS ALREADY HAPPEN
Client Side
Technologies of Choice
Server Side
Technologies of Choice
Quality Assurance
3rd party integrations
Web & Mobile Solutions
Server Side
Technologies of Choice
Language / Frameworks
business logic, api
Data Storage /
Search Engine
Cloud Infrastructure
computing power, PaSS, IaSS, private clouds, orchestration, auto scaling, storage, cdn
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120315/2000px-Ruby_on_Rails_logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120318/220px-Postgresql_elephant.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120328/elastic-logo-200.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120331/heroku.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120337/AmazonWebservices_Logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120318/220px-Postgresql_elephant.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120328/elastic-logo-200.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120331/heroku.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
Server Side
Technologies of Choice
Language / Frameworks
business logic, api
Data Storage /
Search Engine
Cloud Infrastructure
PaaS, IaaS, auto scaling, storage, cdn
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120315/2000px-Ruby_on_Rails_logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120318/220px-Postgresql_elephant.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120328/elastic-logo-200.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120331/heroku.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120337/AmazonWebservices_Logo.svg.png)
-
Scala / Elixir
-
Clojure
-
Rust
-
Redis
-
PostgreSQL FTS
-
Citus Data
Private Clouds on dedicated hardware
vm | JVM | BEAM | JVM, JS | compiled |
syntax | JAVA (+) | *Ruby | *LISP | *C++ |
concurency | actor model | actor model | STM | ownership model |
framework | Play | Phoenix | Compojure* / Reagent* | Iron |
who use it | EPFL $2.3mln ERC Typsafe Inc. |
Jose Valim Plataforma. Community |
Clojure Community | Rust Community $Mozilla |
st stable rel. | 2006 (v2.*) | 2014 | 2009 | 2015 |
typing | static | dynamic* | dynamic | static |
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120446/scala-logo-croped.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120449/elixir.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120452/Clojure-Logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120458/rust-logo-512x512.png)
Community
github stars
-
16_300 - rust
-
9_521 - ruby
-
6_700 - elixir
-
6_002 - scala
-
4_961 - clojure
-
2_788 - iron
-
30_710 - ror
-
6_046 - phoenix
-
7_775 - play
-
2_870 - compojure
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120446/scala-logo-croped.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120452/Clojure-Logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120458/rust-logo-512x512.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
3.24 | 156 | 3.70 | 142 / 5.5 |
4.29 | 121 | 1.61 | 76 / 2.1 |
5.75 | 354 | 1.70 | 56 / 1.8 |
11.52 | 686 | 8.21 | 45 / 1.4 |
14.07 | 607 | 2.14 | 61 / 2.0 |
18.93 | 1,013 | 2.90 | 44 / 1.1 |
48.92 | 937 | 0 | 47 / 1.2 |
57.98 | 243 | 0 | 170 / 4.4 |
exec (s) | mem (kb) | comp (s) | loc / size (kb) |
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121064/C.sh-600x600.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121066/Erlang_logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121073/Java-Logo.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121108/js.jpg)
import scala.actors.Futures._
object binarytrees {
def report(name: String, depth: Int, check: Int) =
println(name + " of depth " + depth + "\t check: " + check)
def main(args: Array[String]) = {
val n = try{ args(0).toInt } catch { case _ => 1 }
val minDepth = 4
val maxDepth = n max (minDepth+2)
val threads = 3 // More than 3 tends to overwhelm GC
report("stretch tree", maxDepth+1, Tree(0,maxDepth+1).isum)
val longLivedTree = Tree(0,maxDepth)
var depth = minDepth
while (depth <= maxDepth) {
val iterations = 1 << (maxDepth - depth + minDepth)
val limits = (0 to threads).map(_*iterations/threads).sliding(2).toList
val check = limits.map(i => future(Go(i(0)+1,i(1),depth).calc))
report(iterations*2 + "\t trees", depth, check.map(_()).sum)
depth += 2
}
report("long lived tree", maxDepth, longLivedTree.isum)
}
}
case class Sum(var sum: Int) {
def +=(i: Int) = { sum+=i; this }
}
case class Go(i0: Int, i1: Int, depth: Int) {
def calc = (Sum(0) /: (i0 to i1))((s,i) =>
s += Tree(i,depth).isum + Tree(-i,depth).isum
).sum
}
final class Tree(i: Int, left: Tree, right: Tree) {
def isum: Int = if (left eq null) i else i + left.isum - right.isum
}
object Tree {
def apply(i: Int, depth: Int): Tree = {
if (depth > 0) new Tree(i, Tree(i*2-1, depth-1), Tree(i*2, depth-1))
else new Tree(i, null, null)
}
}
extern crate typed_arena;
use std::thread;
use typed_arena::Arena;
struct Tree<'a> {
l: Option<&'a Tree<'a>>,
r: Option<&'a Tree<'a>>,
i: i32
}
fn item_check(t: &Option<&Tree>) -> i32 {
match *t {
None => 0,
Some(&Tree { ref l, ref r, i }) => i + item_check(l) - item_check(r)
}
}
fn bottom_up_tree<'r>(arena: &'r Arena<Tree<'r>>, item: i32, depth: i32)
-> Option<&'r Tree<'r>> {
if depth > 0 {
let t: &Tree<'r> = arena.alloc(Tree {
l: bottom_up_tree(arena, 2 * item - 1, depth - 1),
r: bottom_up_tree(arena, 2 * item, depth - 1),
i: item
});
Some(t)
} else {
None
}
}
fn inner(depth: i32, iterations: i32) -> String {
let mut chk = 0;
for i in 1 .. iterations + 1 {
let arena = Arena::new();
let a = bottom_up_tree(&arena, i, depth);
let b = bottom_up_tree(&arena, -i, depth);
chk += item_check(&a) + item_check(&b);
}
format!("{}\t trees of depth {}\t check: {}",
iterations * 2, depth, chk)
}
fn main() {
let n = std::env::args_os().nth(1)
.and_then(|s| s.into_string().ok())
.and_then(|n| n.parse().ok())
.unwrap_or(10);
let min_depth = 4;
let max_depth = if min_depth + 2 > n {min_depth + 2} else {n};
{
let arena = Arena::new();
let depth = max_depth + 1;
let tree = bottom_up_tree(&arena, 0, depth);
println!("stretch tree of depth {}\t check: {}",
depth, item_check(&tree));
}
let long_lived_arena = Arena::new();
let long_lived_tree = bottom_up_tree(&long_lived_arena, 0, max_depth);
let messages = (min_depth..max_depth + 1).filter(|&d| d % 2 == 0).map(|depth| {
let iterations = 1 << ((max_depth - depth + min_depth) as u32);
thread::spawn(move || inner(depth, iterations))
}).collect::<Vec<_>>();
for message in messages.into_iter() {
println!("{}", message.join().unwrap());
}
println!("long lived tree of depth {}\t check: {}",
max_depth, item_check(&long_lived_tree));
}
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120446/scala-logo-croped.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121226/Screen_Shot_2016-01-11_at_18.24.46.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121254/tokio.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121254/tokio.png)
Ruby 3.0 is scheduled to 2020
(Summer Olympics in Tokyo)
- 3.0 x times faster then 2.0 and
- modern concurrency approach
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
class String
BLANK_RE = /\A[[:space:]]*\z/
def blank?
BLANK_RE === self
end
end
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120458/rust-logo-512x512.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
extern "C" fn fast_blank(buf: Buf) -> bool {
buf.as_slice().chars().all(|c| c.is_whitespace())
}
class String
BLANK_RE = /\A[[:space:]]*\z/
def blank?
BLANK_RE === self
end
end
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120458/rust-logo-512x512.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120312/1024px-Ruby_logo.svg.png)
extern "C" fn fast_blank(buf: Buf) -> bool {
buf.as_slice().chars().all(|c| c.is_whitespace())
}
class String
BLANK_RE = /\A[[:space:]]*\z/
def blank?
BLANK_RE === self
end
end
fast_blank (C) 10 x faster then ruby
rust implementation > c implementation
customers
developer preferences
technology trends
chooses ...
Client Side
Technologies of Choice
Web Browser Apps
frameworks*
Mobile Apps
Desktop Apps
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121399/css3_logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121108/js.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121401/HTML5_Logo_512.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121404/highcharts.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121406/Boostrap_logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121411/AngularJS-Shield-large-282x300.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121419/ember.js.emberjs.com.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121426/reactjs.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121430/cordova_256.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121435/electorn-logo-2.png)
-
Ionic ^2 (angular.js)
-
Foundation For Apps (angular.js)
-
Ember CLI Cordova
-
...
-
.. framework or lib
-
Photon (ui)
-
...
-
.. framework or lib
-
how
-
...
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121411/AngularJS-Shield-large-282x300.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121419/ember.js.emberjs.com.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121426/reactjs.png)
http://smashingboxes.com/ideas/choosing-a-front-end-framework-angular-ember-react
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121648/angular.vs.ember.vs.react.png)
number issues | 875 (943) | 214 (-100) | 480 |
Github Stars (since Oct '15) | +4000 (+5000) | +2000 | +11000 |
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2504584/Screen_Shot_2016-04-20_at_08.19.11.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2504591/Screen_Shot_2016-04-20_at_08.24.02.jpg)
customers
developer preferences
technology trends
chooses ...
customers
developer preferences
technology trends
chooses ...
Quality Assurance
Testing Tools
api / business logic / client side
Peer Review
Infrastructure
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123205/rspec.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123214/mocha1.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123211/jasmine.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123212/chai-logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123218/karma.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123226/phantomjs-logo.png)
- Code Review
- Pull Request Workflow
- Pair Programming
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123230/GitHub-Mark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123239/travis-retina-logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123241/gemnasium.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123242/rubymine.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123244/vim.sh.png)
- Virtual Development (conteiners)
- In Cloud Development
3rd Integrations
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2123304/wordle.png)
customers
developer preferences
technology trends
chooses ...
vendor lock-in
What to choose
Language
JavaScript
Ruby
Rust
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2339389/es6.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2236971/1024px-Ruby_logo.svg.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120458/rust-logo-512x512.png)
What to choose
Server Side Framework
Ruby
on
Rails
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2120315/2000px-Ruby_on_Rails_logo.svg.png)
What to choose
Client Side Framework
Angular
Ember
React*
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2504693/angular.io.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121419/ember.js.emberjs.com.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2121426/reactjs.png)
Coder Dojo
every Thursday at 4 PM
1 Maja 17 - Mikstura.IT
- JavaScript & Ember.js
- Ruby &Ruby on Rails
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2504591/Screen_Shot_2016-04-20_at_08.24.02.jpg)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2504584/Screen_Shot_2016-04-20_at_08.19.11.jpg)
Angular 2
one time - 23rd April, 9 AM
1 Maja 17 - Selleo
- Introduction to Angular 2
![](https://s3.amazonaws.com/media-p.slid.es/uploads/433646/images/2236995/01_grey_selleo_xlarge.png)
Than you!
Any Questions?
Selleo web technologies of choice
By Michał Czyż
Selleo web technologies of choice
current status & (potential) future choices
- 1,404