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
ReactiveConf: Lessons Migrating Complex Software
Search
Jack Franklin
October 26, 2017
Technology
530
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ReactiveConf: Lessons Migrating Complex Software
Jack Franklin
October 26, 2017
More Decks by Jack Franklin
See All by Jack Franklin
Advanced React Meetup: Testing JavaScript
jackfranklin
1
290
Components on the Web: Frontend NE
jackfranklin
1
850
Front Trends: Migrating complex software
jackfranklin
1
870
Migrating from Angular to React: Manc React
jackfranklin
1
220
Half Stack Fest: Webpack
jackfranklin
4
610
FullStackFest: Elm for JS Developers
jackfranklin
1
270
Codelicious: Intro to ES2015
jackfranklin
0
470
PolyConf: Elm for JS Developers
jackfranklin
0
310
JSCamp Romania: Elm for JS Developers
jackfranklin
1
330
Other Decks in Technology
See All in Technology
Snowflakeで実現する全社横断の顧客の声(VOC)分析・活用基盤@Snowflake World Tour Tokyo 2026
yuto16
0
110
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
4
2.6k
2026-09-10 【Snowflake World Tour Tokyo 2026】dbt Core と Snowflake で実現する多層的なデータガバナンス / Multi-Layered Data Governance Powered by dbt Core and Snowflake
civitaspo
0
230
Bet AI Day 2026丨AIを「使う」から、AIが「働く」へ ― LayerXが進める「組織AI」の社会実装
layerx
PRO
3
2.8k
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
240
幾何アルゴリズムで なめらかなピン操作を / iOSDC Japan 2026 / smoothpin
kazumanagano
0
200
リージョンの壁を越える、 ちょっと変わったAWSサービスの話
falken
PRO
0
270
Benchmarking Vector Databases: pgvector vs. LanceDB
tsho
0
150
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
210
Sigmaユーザーのための有用リソース一挙公開 & Sigmaで使えるMCP #sigma_ucj /useful-resources-for-sigma-computing-users-and-mcps-with-sigma
shinyaa31
0
160
AI時代のAPI品質を支えるガードレール / API Guardrails for API quality in the AI era
yokawasa
1
170
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
130
Featured
See All Featured
[SF Ruby Conf 2025] Rails X
palkan
2
1.4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Typedesign – Prime Four
hannesfritz
42
3.2k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
510
Visualization
eitanlees
152
17k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
820
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
How to build a perfect <img>
jonoalderson
1
6k
The Pragmatic Product Professional
lauravandoore
37
7.4k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Transcript
None
!
Migrating complex so!ware @Jack_Franklin
None
Thank you Kristina!
Thank you Kristina! From now on I'll be taking steps
to avoid elevators.
None
None
None
None
The Store
Started 2 years ago, built on Angular 1 Tickets being
sold constantly Used by our flagship clients
The store works well. But changing it is very tricky.
Legacy codebase An old version of Angular 1 Feature bloat
Original developers have gone
We lack confidence in our system.
The Four T's — Tech — Tests — Team —
Talking
Tech
None
Big bang vs incremental
None
None
None
None
Bit by bit ! Release early and often, one bit
by a time Learn as we migrate and get better at it Don't break any existing functionality
https://www.martinfowler.com/bliki/ StranglerApplication.html
We shipped migrated code the day a!er starting this migration.
The Theory Components (or directives in Angular)
None
None
None
None
None
None
Migrating a component
Write the React component import React, { Component } from
'react' class ListingsButton extends Component { // code left out to save space :) render() { return ( <a href="" className="">Buy now!</a> ) } }
But how do we embed this within Angular? Angular directives
are used as if they were custom HTML elements: <li> <h2>Rihanna at The O2</h2> <listings-button url="...">Buy now</listings-button> </li>
None
With ngReact <li> <h2>Rihanna at The O2</h2> <react-component name="ListingsButton" props="..."
/> </li>
We can continue this strategy, migrating the other components to
React: <li> <react-component name="ListingsTitle" props="..." /> <react-component name="ListingsButton" props="..." /> </li>
None
And now we can migrate this into one big React
component! import React, { Component } from 'react' import ListingsTitle from './listings-title' import ListingsButton from './listings-button' class ListingsItem extends Component { render() { return ( <li> <ListingsTitle ... /> <ListingsButton ... /> </li> ) } }
And update our template <react-component name="ListingsItem" props="..." />
None
And we now rinse and repeat as we replace Angular
with React.
Tests
We cannot break the store
Unit tests Migrated from Angular to React + added to
as appropriate.
https://www.sitepoint.com/test-react-components-jest/
Unit tests are coupled to the implementation code.
Acceptance tests Automated tests that are entirely decoupled to the
application code.
None
Slow to run - so we select key user flows
to cover.
Team
Keeping people happy and productive We knew this migration was
going to be at least 6 months, more likely closer to a year. 1 1 It was a year
None
None
None
Momentum & Prioritisation
One of the goals of this migration is to make
it easier to fix bugs with confidence.
Pick work based on bugs and churn rate, not code
quality
None
None
None
Mix larger, multi-week work with short, 1-2 day work, to
keep momentum.
None
Break down large work into smaller cards and pull requests
Feature branches
None
None
Release early, release o!en Encourages small pull requests and units
of work
Release early, release o!en Keeps momentum up in the team
and keeps risk to a minimum
Release early, release o!en ! Easier to react 2 to
a bug if release causes it 2 pun very much intended
The scout's rule Always leave things better than when you
found them.
A migrated codebase is not a perfect code base
The next time you touch some code, you'll know more
about it than before. So why make it perfect now?
The lo!ery factor Thanks to https://twitter.com/aaronjrandall for the term
knowledge-base.md
Metrics, metrics, metrics
None
None
None
None
Tooling
Migrations are a good excuse to upgrade your tools.
By providing a mix of migration tasks (big, small, visual,
"under the hood", tooling), we're able to keep work fun and interesting
Talking
The most important people to convince are not in your
tech team.
And they don't care about frameworks
"React's lifecycle methods and small API is easier for developers
to learn"
"React's state model is less magical; its unidirectional data flow
really simplifies code and makes it easier to reason about"
None
"Right now when you ask us for a new feature,
or bug fix, it's hard and takes a long time to fix and have confidence that we've not inadvertently broken anything else"
"We will improve our mobile load time + performance so
users on mobiles should see fewer issues and have a nicer experience"
Fix bugs that cause pain for other departments
None
Keep people in the loop
Deal with !
http://gunshowcomic.com/648
We put a lot of work into making sure things
don't go wrong on production. But unfortunately they will, at some point.
There are two types of developer 3 3 shamelessly stolen
from Twitter! https://twitter.com/beerops/status/866808660030345218
Those who have broken production Those who are about to
break production
Apologies to the 3 people who bought tickets for a
concert on the wrong day in Tokyo because of me ! We did fix it though and sort these people out! :)
1. What? went wrong 2. Why? did we not catch
it 3. How? did we fix it 4. How? will we prevent it happening again
It's a two way street
Takeaways
1. Don't migrate for the sake of it
2. Plan, plan and plan again
3. Cross business communication is so important.
4. Prioritise based on pain points in your current application
5. Mix up tasks based on difficulty + type to
keep it interesting
6. Have metrics to track progress internally and externally
7. Don't expect to migrate perfectly the first time
! Thank you!
None
@Jack_Franklin
[email protected]
Pictures from pixabay.com
None