Technology,
a means to
an end.
Thibault Imbert
1996 - Discovered BASIC on my dad’s T07.


1998 - Started playing with Flash in my bedroom
!
2004 - Teaching programming
!
2008 - Joined Adobe (France)
!
2010 - Moved to San Francisco (PM for Flash Player)
!
2014 - Working on next-gen web authoring tools/services
projectparfait.adobe.com
CSS Shapes
Blend modes
Masking
justinjackson.ca/words.html
Technology
to serve a goal.
Focus on the goal, implementation is a detail.
detail.
C++, Objective-C, ActionScript, JavaScript, Java, C#…
Don’t place a technology.
Use the best one to do the best job.
DHTML!
Flash
Ajax!
Flash
Silverlight!
Flash
Familiar?
Native!
HTML/JS!
It is about the result, the end goal.
Technologies, come and go.
So I should not care?
Be passionate, stay curious,
and always assume you don’t know.
"The most dangerous thought you can have as a creative
person is to think you know what you're doing.” - Bret Victor
JavaScript will win.
C++ will win.
Obj-C will win.
Dart will win.
Why should one win?
There is no safe bet.
By being religious, you barricade yourself.
You stop learning and start having
preconceived ideas.
JavaScript is for “scripting” only.
asmjs.org
an extraordinarily optimizable, low-level subset of JavaScript
JavaScript is not object-oriented.
ES6
//	
  entities.js	
  
module	
  entities	
  {	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  export	
  class	
  Person	
  {	
  
!
	
  	
  	
  	
  	
  	
  private	
  message	
  =	
  "Hi	
  my	
  name	
  is	
  ";	
  
!
	
  	
  	
  	
  	
  	
  constructor	
  (public	
  name,	
  public	
  age,	
  public	
  town){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  this.name	
  =	
  name;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  this.age	
  -­‐	
  age;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  this.town	
  =	
  town;	
  
	
  	
  	
  	
  	
  	
  }	
  
!
	
  	
  	
  	
  	
  	
  talk(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  this.message	
  +	
  this.name;	
  
	
  	
  	
  	
  	
  	
  }	
  
!
	
  	
  	
  	
  	
  	
  get	
  isAbove18(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  this.age	
  >=	
  18;	
  
	
  	
  	
  	
  	
  	
  }	
  
}
But what if I want static-typing?
www.typescriptlang.org
//	
  entities.js	
  
module	
  entities	
  {	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  export	
  class	
  Person	
  {	
  
!
	
  	
  	
  	
  	
  	
  private	
  message	
  :string	
  =	
  "Hi	
  my	
  name	
  is	
  ";	
  
!
	
  	
  	
  	
  	
  	
  constructor	
  (public	
  name:	
  string,	
  public	
  age:	
  number,	
  public	
  	
  
town:	
  string){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  this.name	
  =	
  name;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  this.age	
  =	
  age;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  this.town	
  =	
  town;	
  
	
  	
  	
  	
  	
  	
  }	
  
!
	
  	
  	
  	
  	
  	
  talk(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  this.message	
  +	
  this.name;	
  
	
  	
  	
  	
  	
  	
  }	
  
!
	
  	
  	
  	
  	
  	
  get	
  isAbove18(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  this.age	
  >=	
  18;	
  
	
  	
  	
  	
  	
  	
  }	
  
}
Which will generate plain ES5 compatible JS
var	
  Person	
  =	
  (function	
  ()	
  {	
  
	
  	
  	
  	
  function	
  Person(name,	
  age,	
  town)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.name	
  =	
  name;	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.age	
  =	
  age;	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.town	
  =	
  town;	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.message	
  =	
  "Hi	
  my	
  name	
  is	
  ";	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.name	
  =	
  name;	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.age	
  -­‐	
  age;	
  
	
  	
  	
  	
  	
  	
  	
  	
  this.town	
  =	
  town;	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  Person.prototype.talk	
  =	
  function	
  ()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  return	
  this.message	
  +	
  this.name;	
  
	
  	
  	
  	
  };	
  
!
	
  	
  	
  	
  Object.defineProperty(Person.prototype,	
  "isAbove18",	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  get:	
  function	
  ()	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  return	
  this.age	
  >=	
  18;	
  
	
  	
  	
  	
  	
  	
  	
  	
  },	
  
	
  	
  	
  	
  	
  	
  	
  	
  enumerable:	
  true,	
  
	
  	
  	
  	
  	
  	
  	
  	
  configurable:	
  true	
  
	
  	
  	
  	
  });	
  
	
  	
  	
  	
  return	
  Person;	
  
})();	
  
Challenge, run the original Space Invaders ROM in JS
Ported in an hour to JavaScript
Chose the best option (for me)
to get the job done.
C# is for Windows developers only
Xamarin
C++ is way too low-level.
C++11
#include	
  <iostream>	
  
#include	
  <stdint.h>	
  
#include	
  <iostream>	
  
#include	
  <vector>	
  
#include	
  <algorithm>	
  
!
int	
  main(int	
  argc,	
  const	
  char	
  *	
  argv[])	
  
{	
  
	
  	
  	
  	
  std::vector<uint32_t>	
  data	
  =	
  {	
  234,	
  76767,	
  43,	
  343,	
  4322,	
  33,	
  122	
  };	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  std::sort(data.begin(),	
  data.end(),	
  []	
  (uint32_t	
  a,	
  uint32_t	
  b)	
  {	
  return	
  a	
  <	
  b;	
  });	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  for	
  (auto	
  i	
  =	
  data.begin();	
  i	
  <	
  data.end();	
  i++)	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  std::cout	
  <<	
  *i	
  <<	
  std::endl;	
  
	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  class	
  MyClass	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  public:	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  MyClass(size_t	
  size)	
  :	
  m_size(size)	
  {	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  MyClass(const	
  char	
  *str)	
  :	
  MyClass(strlen(str))	
  {	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  size_t	
  Size()	
  {	
  return	
  m_size;	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  private:	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  size_t	
  m_size;	
  
	
  	
  	
  	
  };	
  
	
  	
  	
  	
  	
  
	
  	
  	
  	
  MyClass	
  obj("Hello!");	
  
	
  	
  	
  	
  std::cout	
  <<	
  obj.Size()	
  <<	
  std::endl;	
  
	
  	
  	
  	
  return	
  0;	
  
}
I am a web guy, doing scripting, cool
native stuff is hard.
Starry Night by Petros Vrellis
openFrameworks
Functional programming languages are not for real world usage.
Imperative programming is:
I want a latte.
Heat some milk.
Put it into a cup.
Brew some coffee with a stovetop Moka pot.
Pour the coffee into the heated milk.
Thank you.
Functional programming is:
I want a latte.
Thank you.
Have a look at F#
let numbers = [ 0..2..20 ]
!
val numbers : int list = [0; 2; 4; 6; 8; 10; 12; 14; 16; 18; 20]
var value = Math.abs ( Math.round ( Math.sqrt ( 3.56 ) ) );
let result =
3.56
|> System.Math.Sqrt
|> System.Math.Round
|> System.Math.Abs
let numbers = [ 0..3..30 ]
let square x = x * x
!
let sumSquare nums =
let mutable buffer = 0
for i in nums do
buffer <- buffer + square i
buffer
!
let result = sumSquare numbers
let sumSquare nums =
nums
|> Seq.map ( fun x -> x * x )
|> Seq.sum
Multicore and web apps? No way.
&
myPA	
  =	
  [1,	
  2,	
  3];	
  
	
  	
  
//	
  incrementation	
  is	
  parallelized	
  on	
  the	
  GPU	
  
myPlusPA	
  =	
  myPA.mapPar(val	
  =>	
  val	
  +	
  1);	
  
myPA	
  =	
  [1,	
  2,	
  3];	
  
	
  	
  
//	
  incrementation	
  is	
  parallelized	
  on	
  the	
  GPU	
  
myPlusPA	
  =	
  myPA.mapPar(val	
  =>	
  val	
  +	
  1);	
  
OpenCL (behind the scene)
Multicore and web apps? No way.
River Trail
bit.ly/qme8BY
You may never use these, but they will
make you a better developer, so keep
learning new stuff.
Creativity, but stepping back from technology.
Goal
Experiment
Fail
Iterate
Not good!
Not good
Looks good!
Looks good!
Success is not an event, it is a process.
James Clear.
@thibault_imbert
Thank you!

Technology: A Means to an End with Thibault Imbert

  • 1.
    Technology, a means to anend. Thibault Imbert
  • 2.
    1996 - DiscoveredBASIC on my dad’s T07. 
 1998 - Started playing with Flash in my bedroom ! 2004 - Teaching programming ! 2008 - Joined Adobe (France) ! 2010 - Moved to San Francisco (PM for Flash Player) ! 2014 - Working on next-gen web authoring tools/services projectparfait.adobe.com
  • 3.
  • 4.
  • 5.
  • 7.
  • 8.
  • 9.
    Focus on thegoal, implementation is a detail.
  • 10.
  • 12.
    C++, Objective-C, ActionScript,JavaScript, Java, C#…
  • 13.
    Don’t place atechnology. Use the best one to do the best job.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
    It is aboutthe result, the end goal.
  • 22.
  • 23.
    So I shouldnot care?
  • 24.
    Be passionate, staycurious, and always assume you don’t know.
  • 26.
    "The most dangerousthought you can have as a creative person is to think you know what you're doing.” - Bret Victor
  • 27.
    JavaScript will win. C++will win. Obj-C will win. Dart will win. Why should one win? There is no safe bet.
  • 28.
    By being religious,you barricade yourself.
  • 29.
    You stop learningand start having preconceived ideas.
  • 30.
    JavaScript is for“scripting” only.
  • 32.
    asmjs.org an extraordinarily optimizable,low-level subset of JavaScript
  • 33.
    JavaScript is notobject-oriented.
  • 34.
  • 35.
    //  entities.js   module  entities  {                    export  class  Person  {   !            private  message  =  "Hi  my  name  is  ";   !            constructor  (public  name,  public  age,  public  town){                      this.name  =  name;                      this.age  -­‐  age;                      this.town  =  town;              }   !            talk(){                      return  this.message  +  this.name;              }   !            get  isAbove18(){                      return  this.age  >=  18;              }   }
  • 36.
    But what ifI want static-typing?
  • 37.
  • 38.
    //  entities.js   module  entities  {                    export  class  Person  {   !            private  message  :string  =  "Hi  my  name  is  ";   !            constructor  (public  name:  string,  public  age:  number,  public     town:  string){                      this.name  =  name;                      this.age  =  age;                      this.town  =  town;              }   !            talk(){                      return  this.message  +  this.name;              }   !            get  isAbove18(){                      return  this.age  >=  18;              }   }
  • 39.
    Which will generateplain ES5 compatible JS
  • 40.
    var  Person  =  (function  ()  {          function  Person(name,  age,  town)  {                  this.name  =  name;                  this.age  =  age;                  this.town  =  town;                  this.message  =  "Hi  my  name  is  ";                  this.name  =  name;                  this.age  -­‐  age;                  this.town  =  town;          }          Person.prototype.talk  =  function  ()  {                  return  this.message  +  this.name;          };   !        Object.defineProperty(Person.prototype,  "isAbove18",  {                  get:  function  ()  {                          return  this.age  >=  18;                  },                  enumerable:  true,                  configurable:  true          });          return  Person;   })();  
  • 41.
    Challenge, run theoriginal Space Invaders ROM in JS
  • 42.
    Ported in anhour to JavaScript
  • 44.
    Chose the bestoption (for me) to get the job done.
  • 45.
    C# is forWindows developers only
  • 50.
  • 52.
    C++ is waytoo low-level.
  • 53.
  • 54.
    #include  <iostream>   #include  <stdint.h>   #include  <iostream>   #include  <vector>   #include  <algorithm>   ! int  main(int  argc,  const  char  *  argv[])   {          std::vector<uint32_t>  data  =  {  234,  76767,  43,  343,  4322,  33,  122  };                    std::sort(data.begin(),  data.end(),  []  (uint32_t  a,  uint32_t  b)  {  return  a  <  b;  });                    for  (auto  i  =  data.begin();  i  <  data.end();  i++)  {                  std::cout  <<  *i  <<  std::endl;          }                    class  MyClass  {                  public:                          MyClass(size_t  size)  :  m_size(size)  {  }                          MyClass(const  char  *str)  :  MyClass(strlen(str))  {  }                          size_t  Size()  {  return  m_size;  }                  private:                          size_t  m_size;          };                    MyClass  obj("Hello!");          std::cout  <<  obj.Size()  <<  std::endl;          return  0;   }
  • 55.
    I am aweb guy, doing scripting, cool native stuff is hard.
  • 57.
    Starry Night byPetros Vrellis
  • 58.
  • 59.
    Functional programming languagesare not for real world usage.
  • 60.
    Imperative programming is: Iwant a latte. Heat some milk. Put it into a cup. Brew some coffee with a stovetop Moka pot. Pour the coffee into the heated milk. Thank you.
  • 61.
    Functional programming is: Iwant a latte. Thank you.
  • 62.
  • 63.
    let numbers =[ 0..2..20 ] ! val numbers : int list = [0; 2; 4; 6; 8; 10; 12; 14; 16; 18; 20]
  • 64.
    var value =Math.abs ( Math.round ( Math.sqrt ( 3.56 ) ) ); let result = 3.56 |> System.Math.Sqrt |> System.Math.Round |> System.Math.Abs
  • 65.
    let numbers =[ 0..3..30 ] let square x = x * x ! let sumSquare nums = let mutable buffer = 0 for i in nums do buffer <- buffer + square i buffer ! let result = sumSquare numbers
  • 66.
    let sumSquare nums= nums |> Seq.map ( fun x -> x * x ) |> Seq.sum
  • 67.
    Multicore and webapps? No way.
  • 68.
  • 69.
    myPA  =  [1,  2,  3];       //  incrementation  is  parallelized  on  the  GPU   myPlusPA  =  myPA.mapPar(val  =>  val  +  1);  
  • 70.
    myPA  =  [1,  2,  3];       //  incrementation  is  parallelized  on  the  GPU   myPlusPA  =  myPA.mapPar(val  =>  val  +  1);  
  • 71.
  • 72.
    Multicore and webapps? No way.
  • 73.
  • 74.
    You may neveruse these, but they will make you a better developer, so keep learning new stuff.
  • 75.
    Creativity, but steppingback from technology.
  • 78.
  • 82.
    Not good! Not good Looksgood! Looks good!
  • 84.
    Success is notan event, it is a process. James Clear.
  • 85.