Web Technologies
current state & (potential) new stuff
customers
developer preferences
technology trends
chooses ...
how to make wise decisions?
making wiser decisions
Text
Client Side
Technologies of Choice
Server Side
Technologies of Choice
Quality Assurance
3rd party integrations
Web & Mobile Solutions
?
other
don't fit
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
Server Side
Technologies of Choice
Language / Frameworks
business logic, api
Data Storage /
Search Engine
Cloud Infrastructure
PaaS, IaaS, auto scaling, storage, cdn
-
Scala / Elixir
-
Clojure
-
Rust
-
Redis
-
PostgreSQL FTS
-
Mongo DB
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 |
Community
github stars
-
14_864 - rust
-
8_899 - ruby
-
5_526 - scala
-
5_932 - elixir
-
4_961 - clojure
-
2_446 - iron
-
29_115 - ror
-
7_276 - play
-
5_061 - phoenix
-
2_783 - compojure
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) |
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));
}
Ruby 3.0 is scheduled to 2020
(Summer Olympics in Tokyo)
- 3.0 x times faster then 2.0 and
- modern concurrency approach
class String
BLANK_RE = /\A[[:space:]]*\z/
def blank?
BLANK_RE === self
end
end
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
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
extern "C" fn fast_blank(buf: Buf) -> bool {
buf.as_slice().chars().all(|c| c.is_whitespace())
}
http://www.sitepoint.com/ruby-can-be-faster-with-a-bit-of-rust/
customers
developer preferences
technology trends
chooses ...
Client Side
Technologies of Choice
Web Browser Apps
frameworks*
Mobile Apps
Desktop Apps
-
Ionic ^2 (angular.js)
-
Foundation For Apps (angular.js)
-
Ember CLI Cordova
-
...
-
.. framework or lib
-
Photon (ui)
-
...
-
.. framework or lib
-
how
-
...
http://smashingboxes.com/ideas/choosing-a-front-end-framework-angular-ember-react
number issues | 875 (943) | 314 | 480 |
Github Stars (since Oct '15) | +3200 (+2600) | +500 | +4800 |
customers
developer preferences
technology trends
chooses ...
Quality Assurance
Testing Tools
api / business logic / client side
Peer Review
Infrastructure
- Code Review
- Pull Request Workflow
- Pair Programming
- Virtual Development (conteiners)
- In Cloud Development
customers
developer preferences
technology trends
chooses ...
3rd Integrations
customers
developer preferences
technology trends
chooses ...
vendor lock-in
?
Internet of Things
Big Data / Rich Data
Machine Learning
Fully Fledged Frameworks
Server Less Applications Development
Server Less Applications Development
Fully Fledged Frameworks
Fully Fledged Frameworks
Internet of Things
SDK: embedded C, JS, Arduino Yun
?
Internet of Things
Big Data / Rich Data
Machine Learning
Fully Fledged Frameworks
Server Less Applications Development
customers
developer preferences
technology trends
chooses ...
vendor lock-in
technologies of choice for `web` development
By Michał Czyż
technologies of choice for `web` development
current status & (potential) future choices
- 1,322