Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Architecting is Difficult: Breaking Borders, Ap...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Jack Franklin
April 15, 2014
Technology
130
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Architecting is Difficult: Breaking Borders, April 2014
Jack Franklin
April 15, 2014
More Decks by Jack Franklin
See All by Jack Franklin
Advanced React Meetup: Testing JavaScript
jackfranklin
1
280
Components on the Web: Frontend NE
jackfranklin
1
850
ReactiveConf: Lessons Migrating Complex Software
jackfranklin
0
530
Front Trends: Migrating complex software
jackfranklin
1
860
Migrating from Angular to React: Manc React
jackfranklin
1
220
Half Stack Fest: Webpack
jackfranklin
4
600
FullStackFest: Elm for JS Developers
jackfranklin
1
270
Codelicious: Intro to ES2015
jackfranklin
0
460
PolyConf: Elm for JS Developers
jackfranklin
0
310
Other Decks in Technology
See All in Technology
書籍セキュアAPIについて
riiimparm
0
210
AI時代のPlaywright活用(システムテストを自動化する ー 実行エンジンにPla ywrightを選んだ理由)
ynisqa1988
2
930
Network Firewallやっていき!
news_it_enj
0
260
kaonavi Tech Night#1
kaonavi
0
160
「守りたい体験」を渡すだけで E2E を生成させられるようになった話
hinac0
2
1k
「顧客の声を聞かなければ何も始まらない」 ── 顧客の声から生まれた『AI返信補助機能』の開発プロセス / AICon2026_shikata_imai
rakus_dev
1
270
AI工学特論: MLOps・継続的評価
asei
4
1k
どこまでAIに任せるか 〜確率論と決定論の境界決定〜
shukob
0
440
reFACToring
moznion
0
180
AIツールを導入しても生産性はあがらない? カオナビが直面した 3つの壁と乗り越え方。/ Overcoming 3 Barriers to AI-Driven Productivity at kaonavi
kaonavi
0
160
AI Native なプロダクト組織の立ち上げ方 : 生産性 100 倍への挑戦
mikesorae
0
1.2k
[Droidcon Orlando '26] The Android Lens: Applying Mobile Forensics to AI Performance
amanda_hinchman
1
110
Featured
See All Featured
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
550
Writing Fast Ruby
sferik
630
63k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Designing for Timeless Needs
cassininazir
1
390
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
310
Marketing to machines
jonoalderson
1
5.6k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Transcript
Architecting is Difficult
@Jack_Franklin — Student (for one more month) at University of
Bath — (Soon to be a) developer for @GoCardless — Blogger at javascriptplayground.com, tilvim.com — Google Developer Expert on the Chrome team — Does a pretty epic Gangnam Style with @benmacgowan
Any fool can write code that a computer can understand.
Good programmers write code that humans can understand. -- Martin Fowler.
Audience Participation
None
What makes code difficult to work with?
You're never going to get it right first time
Defer concrete decisions as late as possible - you'll never
again know less about the problem than you do right now and the correct abstraction will become clearer over time. -- Andy Appleton
Tests
drive your API design you can try things out at
no cost
difficult to test? difficult to use a good sign something
isn't quite right
confidence when refactoring (more on this later) you'll know when
you broke something
Naming Conventions
There are only two hard things in Computer Science: cache
invalidation and naming things. -- Phil Karlton
There are only two hard things in Computer Science: cache
invalidation, naming things and off by one errors. -- ??
prefer verbosity because auto complete
be consistent use the same nouns and verbs
Coding Standards http://editorconfig.org Pick a standard and stick to it
Single Responsibility
Do one thing And do it well
Not good class EmailSender def initialize(csv) def parse_csv_for_emails def send_email
end
Better class EmailSender def initialize(csv) def parse_csv_for_emails Parser.new(csv).emails def send_email
end class Parser def initialize(csv) def emails end
Decoupled Components
Ye know too much class EmailSender def initialize(csv) def parse_csv_for_emails
Parser.new(csv).emails def send_email end class Parser def initialize(csv) def emails end
Ignorance is bliss class EmailSender def initialize(emails) def send_email end
class Parser def initialize(csv) def emails end emails = Parser.new(csv).emails EmailSender.new(emails).send_email
Separate Aggressively
don't be afraid to create classes / objects It's easier
to merge two small things than split one large thing
Refactoring
None
Refactoring Alter code without changing behaviour You have to have
tests!
Code smells Some code which may indicate a problem
You don't fix code smells. You look at them and
see if they indicate a problem you can fix. -- Joe Ferris
Spot the smell 1
var googleMapPin = function(x, y) {...}; var getLatLong = function(x,
y) {...}; var user = { coordinates: [x, y]; };
Data Clumps Continually passing round two (or more) variables as
arguments.
var googleMapPin = function(coords) {...}; var getLatLong = function(coords) {...};
var user = { coordinates: coords }; var coords = { x: 1, y: 2 };
Implicit Knowledge The relationship of x and y was implicit.
By extracting the coords object, we make it explicit.
Implicit Knowledge Seek to remove all implicit knowledge in a
system. If I was handing it over to you, what would I need to explain?
Spot the smell 2
var drawGraph = function(graphWidth, graphHeight) { var width = 165
+ graphWidth; var height = 170.5 + graphHeight; };
Magic Numbers! 165? 170.2? Implicit knowledge!
var drawGraph = function(graphWidth, graphHeight) { var extra_graph_width_padding = 165;
var extra_graph_height_padding = 170.5; var width = extra_graph_width_padding + graphWidth; var height = extra_graph_height_padding + graphHeight; };
Spot the smell 3
<% if user != nil %> <h2><%= user.welcome_message %></h2> <%
else %> <h2>Please Sign In</h2> <% end %>
Checking for nil (Or undefined / null in JS) What
does nil mean? Nothing.
Checking for nil Don't use it to stand in for
something.
Null Object Pattern Avoids conditional checks.
class GuestUser def welcome_message "Please Sign In" end user =
current_user || GuestUser.new View: <h2><%= user.welcome_message %></h2>
Spot the smell 4
var shouldScrollToBeginning = function(carousel) { if(carousel.isAtEnd()) { carousel.goToStart(); } };
Tell, don't ask This function refers to carousel three times.
Is this the best place for this code?
var carousel = { ... startAgain: function() { if(this.isAtEnd()) {
this.goToStart(); } } }
Tell, don't ask Move the behaviour to where it makes
most sense.
Publish and Subscribe
var carousel = function(accordion) { start: function() { accordion.close(); }
}; var accordion = { ... }
Ye know too much (again) The carousel knows that when
it starts, it needs the accordion to close. That seems a bit odd?
Pub Sub! var carousel = function() { start: function() {
event.publish('carousel_start'); } }; var accordion = { init: function() { event.subscribe('carousel_start', function() { this.close(); }); } }
Pub Sub! Neither module knows about the existance of the
other. Easily extended.
Spot the smell 5
var someMethod = function() { doSomething(); doSomethingMore(); doAnotherThing(); if(something) {
... } doSomethingElse(); while(someOtherThing) { ... } };
Doing too much Functions should be small, reusable and composable.
Spot the smell 6
var carousel = function( width, height, images, arrowLeft, arrowRight, animationSpeed,
loopBackOnEnd ) { ... }
Too many parameters carousel(500, 400, someImages, 'a.left', 'a.right', 500, false);
Try to guess what each of those mean...
Fix one var carousel = function(options) { var width =
options.width; var height = options.height; ... }
But If you need that many arguments, that might indicate
the function is doing too much
Getting into the habit
Everytime you leave code, leave it a tiny bit better
Note: better. Not best.
Don't leave comments #TODO: this entire class is screwed, fix
it #todo REMOVE BEFORE PRODUCTION... SERIOUSLY!
They don't get done 243,803 #TODO comments.
Changing code 1. Refactor to make the change easy. 2.
Make the change Each change should be easy to introduce. If it's not, refactor.
Refactor as you go Should be a constant process of
small improvements.
Remember You can't get it right first time!
URLS — @Jack_Franklin — http://speakerdeck.com/jackfranklin — github.com/jackfranklin/talk-architecting-breaking- borders — http://javascriptplayground.com
— http://refactoring.com/ — http://robots.thoughtbot.com/
(Easy) Questions?