Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

72
Confessions @szafranek of a Traitor How Objective C Made Me a Better JavaScript Programmer
  • date post

    20-Oct-2014
  • Category

    Technology

  • view

    2.425
  • download

    0

description

Lessons learned from my venture into Objective C, after years of working as a front-end developer. Slides from my talk at WebConf Riga 2012.

Transcript of Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Page 1: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Confessions

@szafranek

of a TraitorHow Objective C Made Me a Better JavaScript Programmer

Page 2: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Front-end developer, manager at Roche

Front-end architectat Nokia

Game developerat Wooga

Page 3: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

github.com/wooga/Pocket-Island

The last HTML5 project I was a part of is now available as open source.

Page 4: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

In May 2012, after 7 years of professional front-end development, I started to work on native iOS game.

Page 5: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

[self learn:@"Objective C"];

Page 6: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

We make our tools,our tools make us

Page 7: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

• C with class-based OOP• [syntax awkward:YES];• Compiled• No garbage collection!

Page 8: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

[Disclaimer]

I will not try to convince you that JavaScript should be more like other languages.Yet we can be more effective JS developers by learning something from others.

Page 9: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

JavaScript AD 2004

Page 10: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

-----------------------------------------------------------------Language files blank comment code-----------------------------------------------------------------Javascript 100 3764 1858 22258HTML 9 73 23 690Ruby 4 90 15 237Bourne Shell 2 13 0 27-----------------------------------------------------------------SUM: 115 3940 1896 23212-----------------------------------------------------------------

Codebase size of Pocket Island. The project didn’t use external libraries.

Page 11: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

-----------------------------------------------------------------Language files blank comment code-----------------------------------------------------------------Javascript 717 79132 184499 425289HTML 452 84159 4819 198471XML 133 2155 1391 122219Java 527 10215 6633 42287CSS 94 3067 2101 23727Ruby 33 599 146 1794XSLT 1 57 29 1453Bourne Shell 47 285 293 865Python 5 244 256 828XSD 2 0 2 244JSP 4 7 0 92DTD 1 37 32 92Perl 2 26 0 55DOS Batch 4 4 1 18-----------------------------------------------------------------SUM: 2022 179987 200202 817434-----------------------------------------------------------------

Codebase size of my previous JavaScript project. That one included several external libraries.

Page 12: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

JavaScript AD 2004

Page 13: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

JavaScript AD 2012

Page 14: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Building

Page 15: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer
Page 16: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

• minification• linting• unit testing• deployment• template processing• much more

Currently Grunt offers over 200 plugins.

Page 17: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Automate

* Let machines do what they're best at: * catching silly mistakes * optimization * boring but necessary tasks

Page 18: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer
Page 19: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Unit tests

Page 20: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Everybody has heard about unit tests, but have you actually seen or wrote them?

Page 21: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Bust

er.JS

Cross

chec

kDO

HEn

hanc

e JS

Fire

Unit

J3Uni

tJS

NUni

tJS

Spec

JSTe

stJS

Test

.NET

JSUni

tJS

pec

JasU

nit

Jasm

ine

Js-te

st-d

river

Js-te

st-r

unne

rM

ocha

Nod

euni

tQ

Unit

RhUni

tRh

inoU

nit

SOAte

stSi

non.

jsSu

itest

Test

.Mor

eTe

st.S

impl

eTe

stCas

eTe

stIt

Tyrt

leUni

tTes

ting

Vows

YUI T

est

jsUni

tTes

tjsU

nity

scre

w-u

nit

wru

Is the number of JS unit testing frameworks higher than the number of JavaScript developers writing tests?

Page 22: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

In Objective C world unit testing is supported out of the box.

Page 23: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

“No one pays you for testing”

The above quote comes from a PHP talk I listened to recently.

* Don’t ask your boss or client if you can write tests – tests are part of the code, not something extra* The point of writing tests is to make you faster at delivering quality product, not slower.* Tests enforce better coding style.

Page 24: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Getting started

Page 25: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

1) Pick any framework

buster.js, js-test-driver, QUnit, Jasmine are all good places to start.

Page 26: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

2) Start writing tests

Page 27: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Unit test is a function that tests

another function

Page 28: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

function factorial(n) { if (n == 1) { return 1; } return n * factorial(n-1);}

function testFactorial() { assert.equals(120, factorial(5));}

test

implementation

Page 29: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

3) Automate with test runner

If you haven’t already picked a framework with integrated runner, like buster.js or js-test-driver, use testem to run your tests.

You will NOT keep writing tests if you don’t automate running them with Continous Integration tool like Jenkins.

Page 30: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Test runner

Unit testing framework

vs.

Page 31: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Modern test runners can execute your tests in a variety of JS environments.

Page 32: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

buster.jsFramework and runner... that doesn’t run on Windows. Yet.

Authors are working on it. Version 1.0 will run on Windows.

Page 33: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Cross-platform test runner

Needs test framework

testem

Page 35: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

http://szafranek.net/works/articles/javascript-unit-testing/

Page 36: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

http://bit.ly/writing-testable-javascript

Presentation contains practical example of making typical jQuery-based code testable.

Page 37: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Static analysis

Page 38: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Early warning system in an editor.

Page 39: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

jshint

jslint

Page 40: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Your sadly pathetic bleatings are harshing my mellow.

Douglas Crockford commenting on complaints about jslint being too restrictive.This quote was one of the reasons to create jshint.

Page 41: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

1) Make your intent obvious

Page 42: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Anything that isn’t crystal clear to a

static analysis tool probably isn’t clear

to your fellow programmers,

either.

Highly recommended article on the value of static analysis, by John Carmack:http://www.altdevblogaday.com/2011/12/24/static-code-analysis/

Page 43: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

2) Catch mistakes early

Page 44: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Integrate jslint or jshint with your editor.

Page 45: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Automate

Use continuous integration to run static analysis checks on your code.

Page 46: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Refactoring

Page 47: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Improvingthe design of codewithout changing its external behavior

Page 48: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Improvingthe design of codewithout changing its external behavior

Page 49: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Goals

Before starting refactoring, think for a moment what you want to achieve.

Page 50: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Remove duplication

Extract method, extract variable

Page 51: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

if (player.coins < budget.getMin()) { offerCredit();}if (friend.coins < budget.getMin()) { offerFriendCredit();}

var min = budget.getMin();if (player.coins < min) { offerCredit();}if (friend.coins < min) { offerFriendCredit();}

Page 52: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Make your intentclear obvious

Page 53: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

[taskShortcut performSelector:selector withObject:param];

Named parameters in Objective C encourage explicit naming.

Page 54: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

data, t, managerare not good names

formData, timeLeft, urlRouter are better

Page 55: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Explanatory variables

Page 56: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

button.setPosition(0, parseInt(parentDiv.height, 10) / 2 - parseInt(border.size, 10) / 2);

var verticalCenter = parseInt(parentDiv.height, 10) / 2 - parseInt(border.size, 10) / 2;

button.setPosition(0, verticalCenter);

It’s worth to introduce a variable to communicate intention clearly, even if it doesn’t reduce duplication.

Page 57: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Design patterns

Design patterns make the intent of the design easy to see.If you are using a pattern, make sure it’s communicated through naming.

Page 58: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Clean code first,optimization second

Page 59: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Premature optimization is the root of all evil.

Page 60: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Improvingthe design of codewithout changing its external behavior

Page 61: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Tests!

How do you verify that behavior didn’t change?

Page 62: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Tests?Refactoring without tests (aka “happy development”) is all too common.It’s not a very responsible thing to do.

Page 63: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

IDE

The problem with refactoring JavaScript:poor tool support -> makes refactoring require courage -> makes refactoring less likely to happen.

Search and replace doesn’t constitute “tool support” for refactoring – it’s only text-based and doesn’t guarantee that the semantics of your program will be preserved.

Page 64: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

My reaction to the word “IDE”...

Page 65: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

... was deeply rooted.

Page 66: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

WebStorm IDE has good support for essential refactorings.

Page 67: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer
Page 68: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

•Web Storm•...•...•...•Cloud9•...?

We need better and more tools for refactoring JavaScript!

Page 69: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Automate

Refactoring has to be performed by a human, but good tool (like WebStorm) can make it much safer and easier.

Page 70: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer
Page 71: Confessions of the Traitor: How Objective C Made Me a Better JavaScript Programmer

Refactoring

Unit testing

Static analysis

automate

automate

automate

@szafranek