Upload
filippo-zanella
View
154
Download
0
Embed Size (px)
Citation preview
PRODUCT!THE ROAD TO PRODUCTION DEPLOYMENT
presented by / Filippo Zanella @r4m
WHO I AM
Ph.D. in Information Engineering at the, Visiting Researcher
at UC Berkeley and UC Santa Barbara.University of Padua
Founder of , full-stack engineer(RubyOnRails & Ember.js).
Sellf srl
President of the and Memberof the .
Fencing Club of MontebellunaRotary Club of Montebelluna
SELLF
Sellf helps people in sales monitortheir deals and manage their
activities to grow and close them.
Small business owners,professionals
and sales agentsusually struggle to keep their
business life organized,overwhelmed by spreadsheets, todo
lists, calendars and notes.
PROTOTYPINGBE STUBBORN ON VISION BUT FLEXIBLE ON DETAILS.
(JEFF BEZOS, AMAZON)
THE ARDUINO WAYA prototype is meant to be a test. Built using the most
"hacky" approach with the least amount of time to get initialfeedback on whether a concept is viable.
Copyright © 2006-2011 by John Szakmeister
CONCEPTHandmade sketch of the data visualization of the app.
BACKBONETry to de�ne as much as you can:
InfrastructureCommunication protocolDatabase schemaUX �ow
WIREFRAMESDetailed descriptions of the different views of the app.
(BALSAMIQ) MOCKUPS
MINIMUM VIABLE PRODUCTIF YOU AREN'T EMBARRASSED BY THE FIRST VERSION OF THE PRODUCT YOU'VE LAUNCHED TOO LATE.
(REID HOFFMAN, LINKEDIN)
MVPIt is built from the smallest set of features that delivers
customer early adopters value.More than 60% of features in software products are rarely or never used.
Prioritize each feature according to a few factors:
1. How important is this feature for �nishing the process?2. How often will the feature be used?3. How many users will use this feature?4. How much value will the feature bring to the customer?5. How risky is this feature?6. How much time does it take to be implemented?
SAAS, BAAS, PAAS, IAASSoftware as a Service (Sellf, Google Apps, GoToMeeting)Backend as a Service (Parse, Apprenda)Platform as a Service (AWS Beanstalk, Heroku)Infrastructure as a Service (AWS EC2, Microsoft Azure)
PRODUCTIT IS NOT ABOUT BITS, BYTES AND PROTOCOLS, BUT PROFITS, LOSSES AND MARGINS.
(LOU GERSTNER, IBM)
WHEN THE HEAT GETS HOTYou cannot survive with (too) buggy and clumsy code.
You slightly move from MVP and beta releases to a workingapp that your customer expect to be:
fastsecurestable
While you see your user base increasing, you see theirexpectations growing too.
SELLF 3.0
LOGGING & ALERTINGLog activities of your app to �nd:
failuresbugsheavy algorithmsexpensive queriesunwanted/unexpected behaviors
Set alerts to be noti�ed when speci�c events occur.
Building an ef�cient logging and alerting system allows yourteam to �nd and �x problems quickly.
USER BEHAVIOR MONITORINGWhat people really do with your application.
PERFORMANCE MONITORINGNobody writes slow code on purpose.
AVAILABILITY MONITORINGHow do you know when your app has an outage?
ERRORS HANDLINGAnticipate, detect, resolve BUGS.
NETWORK ERRORS$.ajax({ type: 'POST', url: '/some/resource', success: function(data, textStatus) { // Handle success }, error: function(xhr, textStatus, errorThrown) { if (xhr.status) { if (xhr.status === 403) { // Handle forbidden access error } else { // Handle generic error } } }});
PLATFORM ERRORS
FRAMEWORK ERRORS
LIBRARY ERRORS...
...LIBRARY REPLACEMENTIn the long run, libraries are like a stick in the mud:
not longer maintaineddegrade performancemissing custom needsnot easy to debug
YOUR ERRORSThe bloody asynchrony
callAction: function() { var _this, defer; _this = this; defer = Ember.RSVP.defer(); defer.promise.then(function() { if (_this && !_this.isDestroyed) { return _this.set('isLoaded', true); } }, function() { if (_this && !_this.isDestroyed) { return _this.set('isLoaded', false); } });}
MAINTAIN 3RD-PARTY SOFTWARE UPDATEDWhen the project relies on external software, it's useful to
leverage the updates, for:
Fix bugs (not caused by our app)Improve overall performancesAdding new featuresDeprecate old conventions
CHANGELOGRecord of all the changes made to a project.
Now the inline form can be use in addiction:
EXAMPLE OF BUMPINGPrior v1.11 in Ember's an if condition in a template was
limited to the following syntax:
{{#if isEnabled}} <a class="active" href="http://www.facebook.com">Facebook</a>{{else}} <a class="disabled" href="http://www.facebook.com">Facebook</a>{{/if}}
<a class="{{if isEnabled 'active' 'disabled'}}" href="http://www.facebook.com"
simpli�ng the number of lines of code, enhancing readabilityand allowing new behaviours.
SECURITYThe Gartner Group however estimates that 75% of attacksare at the web application layer, and found out "that out of
300 audited sites, 97% are vulnerable to attack".
The threats against web applications include:
user account hijackingbypass of access controlreading or modifying sensitive datapresenting fraudulent content
SQL INJECTIONA technique where malicious users can inject SQL commands
into an SQL statement, via web page input.Client<p>UserId: <br><input type="text" name="UserId" value="105 or 1=1"></p>
ServerSELECT * FROM Users WHERE UserId = 105 or 1=1
The SQL above is valid. It will return all rows from the tableUsers, since WHERE 1=1 is always true!
SSLThe Secure Socket Layer is a cryptographic protocol designedto provide secure communications over a computer network.
Serve everything over SSL.
PS: don't let your certi�cates expire.
SCALINGIt means rapid adaptation to a growing user activity.You need to push your system to a higher level, getting the best from your infrastructure.
APOCALYPSE NOWYou'll never be ready till the day you have to.
HARD STUFFSLoad balancing, caching, CDN, background jobs, ...
... sharding, master/slaves, ETAGs, etc.
TEAM GROWTHBeing agile is mandatory when your team growths to stay
focused in delivering real value to the company
No wasting time on unneeded planning docs.No delivering features that do not �t customers needs.
THE PROJECT TRIANGLE
OPTIMIZATION
IMPROVING PERFORMANCESAn optimization analysis should include:
network utilisationCPUmemory usagedatabase query
Optimizing is critical because it has an impact on the scalingfactor of the system!
CODING TRICKSParallel versus sequential assignment
var a, b = 1, 2 a= 1, b = 2
5821.3 (±6.0%) i/s 8010.3 (±5.5%) i/s
slow fast
40% faster!
LOADING TIMESGoogle Developer Tools (via Chrome)
UI DRAINING RESOURCEIn a single-page framework, template rendering choices can
make the difference in terms of RAM usage.
<ul> {{#each alumni as |alumnus|}} <li> <p>Hello, {{alumnus.name}}!</p> <!-- This is RAM consuming... --> <div>{{detailed-profile content=alumnus}}</div> </li> {{/each}}</ul>
UI DRAINING RESOURCEDestroy not visibile child views to free up their memory.
<ul> {{#each alumni as |alumnus|}} <li> <p>Hello, {{alumnus.name}}!</p> <!-- Show the details only when the alumnus is selected --> {{#if view.isSelected}} <div>{{detailed-profile content=alumnus}}</div> {{/if}} </li> {{/each}}</ul>
CROSS COMPATIBILITY
The (W3C), founded in 1994 topromote open standards for the , pulled ,
together with others to develop a standard forbrowser scripting languages called " ".
World Wide Web ConsortiumWWW Netscape
MicrosoftECMAScript
TEST DRIVEN DEVELOPMENTIf you avoid at the beginning TDD practices, you'll discover
that they are as much important as the app code itself.
Continuous integration and testing is a must sooner or later.
Tests can be applied to:
backend - just do it.frontend - think about it.mobile - forget it.
UNIT TESTSThey are generally used to test a small piece of code and
ensure that it is doing what was intended.
App.SomeThing = Ember.Object.extend({ foo: 'bar', testMethod: function() { this.set('foo', 'baz'); }});
module('Unit: SomeThing');
test('calling testMethod updates foo', function() { var someThing = App.SomeThing.create(); someThing.testMethod(); equal(someThing.get('foo'), 'baz');});
REFACTORINGImproving the design of code without changing its behavior.
Clarity enables performance:
long methodsspeculative codecomments
When you look back to your one-year old code you look at it with the same compassion with whom you look ata photo of you a few years before: you wonder how the hell you could get those clothes and that hairstyle.
REMOVE DUPLICATIONif (this.target.entity.is("decoration")) { this.target.entity.game.publish("decoration/showBoost", { entityView: this.target, x: this.target.entity.x, y: this.target.entity.y });}
var entity = this.target.entity;if (entity.is("decoration")) { entity.game.publish("decoration/showBoost", { entityView: this.target, x: entity.x, y: entity.y });}
USE MEANINGFUL NAMESvar p = this.current.params;var r = this.current.results;if (r.restProduct) { p.query = r.prestProduct;}
var params = this.current.params;var results = this.current.results;if (results.restProduct) { params.query = results.prestProduct;}
THANK YOU!