Cameron Barrie Client Principal at Bilue cameron@bilue.com.au - - PowerPoint PPT Presentation

cameron barrie
SMART_READER_LITE
LIVE PREVIEW

Cameron Barrie Client Principal at Bilue cameron@bilue.com.au - - PowerPoint PPT Presentation

Cameron Barrie Client Principal at Bilue cameron@bilue.com.au @whalec Mobile at Warp Speed If youre not disrupting , youre likely being disrupted A quick survey Worst upgrade ever!!!!! Now I cant even log in, most useless app out of


slide-1
SLIDE 1

Cameron Barrie

Client Principal at Bilue cameron@bilue.com.au @whalec

slide-2
SLIDE 2

Mobile at Warp Speed

slide-3
SLIDE 3

If you’re not disrupting, you’re likely being disrupted

slide-4
SLIDE 4

A quick survey

slide-5
SLIDE 5

– JJ&LJ2013

Worst upgrade ever!!!!! Now I can’t even log in, most useless app out of all the banks, really angry about this can’t even transfer money let alone opening the app. FIX IMMEDIATELY

slide-6
SLIDE 6

Tried to move fast

slide-7
SLIDE 7

–Anon friend

We don’t read the reviews anymore, the only people who leave reviews are the people who complain.

slide-8
SLIDE 8

– Serenity-1105

I have spent the last week trying to get up to the bank to

  • rder a new card. I looked on the app and it wasn’t there,

updated today and wow, how convenient I am now able to order another card through the app. You guys sure make my life easier. Very pleased with this new update…

slide-9
SLIDE 9

Can move fast

slide-10
SLIDE 10

How do we get there?

slide-11
SLIDE 11
  • Can you make decisions quickly?
  • Are you using source control(I know right)?
  • Are you doing Test Driven Development?
  • Does the business understand the risk/reward?
  • Do you have genuine buy in from the business?

Some Prerequisites

slide-12
SLIDE 12

Why is it a challenge?

slide-13
SLIDE 13

It’s not the web

slide-14
SLIDE 14

Can’t just refresh

slide-15
SLIDE 15

Walled Garden

slide-16
SLIDE 16

5 day release cycle

slide-17
SLIDE 17

1-2 days for expedited

slide-18
SLIDE 18

No update guarantees

slide-19
SLIDE 19

Forced updates are bad

slide-20
SLIDE 20

On going support

slide-21
SLIDE 21

Business Logic

slide-22
SLIDE 22

The Challenge

  • (void)setupDefaults
{ self.collectionViewDataSource.cellFactory = [WOWCollectionViewProductCellFactory class]; self.collectionViewDelegate.cellFactory = [WOWCollectionViewProductCellFactory class]; self.collectionViewLayoutArrangement = [WOWProductsViewController layoutArrangementForUserInterfaceIdiom: [UIDevice currentDevice].userInterfaceIdiom]; self.collectionViewLayoutDelegate.layoutSpacingClass = [WOWCollectionViewAutoSpacingLayoutDelegate sizeClassForUserInterfaceIdiom:[UIDevice currentDevice].userInterfaceIdiom]; self.collectionViewLayoutDelegate.cellSizeClass = [WOWProductsViewController sizeClassForLayoutArrangement:self.collectionViewLayoutArrangement] ; }
  • (void)viewWillAppear:(BOOL)animated
{ [super viewWillAppear:animated]; self.barAnimatingScrollViewDelegate.animatableHeaderBar = (UIView <WOWAnimatableBar> *)self.navigationController.navigationBar; }
  • (void)fetchData
{ [self showLoadingIndicator]; [self.productsDataStore fetchDataWithRequestURL:nil errorHandler:^(NSError *error) { [self dataStore:self.productsDataStore didReceiveError:error]; }]; }
  • (void)showLoadingIndicator
{ self.collectionView.hidden = YES; self.loadingIndicatorView.hidden = NO; } }
slide-23
SLIDE 23

Social

  • (void)setupDefaults
{ self.collectionViewDataSource.cellFactory = [WOWCollectionViewProductCellFactory class]; self.collectionViewDelegate.cellFactory = [WOWCollectionViewProductCellFactory class]; self.collectionViewLayoutArrangement = [WOWProductsViewController layoutArrangementForUserInterfaceIdiom: [UIDevice currentDevice].userInterfaceIdiom]; self.collectionViewLayoutDelegate.layoutSpacingClass = [WOWCollectionViewAutoSpacingLayoutDelegate sizeClassForUserInterfaceIdiom:[UIDevice currentDevice].userInterfaceIdiom]; self.collectionViewLayoutDelegate.cellSizeClass = [WOWProductsViewController sizeClassForLayoutArrangement:self.collectionViewLayoutArrangement] ; }
  • (void)viewWillAppear:(BOOL)animated
{ [super viewWillAppear:animated]; self.barAnimatingScrollViewDelegate.animatableHeaderBar = (UIView <WOWAnimatableBar> *)self.navigationController.navigationBar; }
  • (void)fetchData
{ [self showLoadingIndicator]; [self.productsDataStore fetchDataWithRequestURL:nil errorHandler:^(NSError *error) { [self dataStore:self.productsDataStore didReceiveError:error]; }]; }
  • (void)showLoadingIndicator
{ self.collectionView.hidden = YES; self.loadingIndicatorView.hidden = NO; } }
slide-24
SLIDE 24

Recipe for disaster

slide-25
SLIDE 25

Remove Business Logic

slide-26
SLIDE 26

{ title: "Stop killing unicorns", user_id: 67 }

Remove Business Logic

/post.json

slide-27
SLIDE 27

@implementation BILPost

  • (instancetype)initWithDictionary:(NSDictionary *)dictionary {

self = [self init]; if (self) { self.title = dictionary[@"title"]; NSString *urlString = [NSString stringWithFormat:@"%@users/%@.json", kAPIBaseURL, dictionary[@"user_id"]]; self.userURL = [NSURL URLWithString:urlString]; } return self; }

Remove Business Logic

BILPost.m

slide-28
SLIDE 28

@implementation BILPost

  • (instancetype)initWithDictionary:(NSDictionary *)dictionary {

self = [self init]; if (self) { self.title = dictionary[@"title"]; NSString *urlString = [NSString stringWithFormat:@"%@users/%@.json", kAPIBaseURL, dictionary[@"user_id"]]; self.userURL = [NSURL URLWithString:urlString]; } return self; }

Remove Business Logic

BILPost.m

slide-29
SLIDE 29

{ title: "Stop killing unicorns", user_id: 67 }

Craft APIs

/post.json

slide-30
SLIDE 30

{ title: "Stop killing unicorns", user_id: 67 }

Craft APIs

/post.json

slide-31
SLIDE 31

{ title: "Stop killing unicorns", user: “http://service.com/api/v2/users/1.json” }

Use hypermedia

/post.json

slide-32
SLIDE 32

{ title: "Stop killing unicorns", user: “http://service.com/api/v2/users/1.json” }

Use hypermedia

/post.json

slide-33
SLIDE 33

@implementation BILPost

  • (instancetype)initWithDictionary:(NSDictionary *)dictionary {

self = [self init]; if (self) { self.title = dictionary[@"title"]; NSString *urlString = [NSString stringWithFormat:@"%@users/%@.json", kAPIBaseURL, dictionary[@"user_id"]]; self.userURL = [NSURL URLWithString:urlString]; } return self; }

Remove Business Logic

BILPost.m

slide-34
SLIDE 34

@implementation BILPost

  • (instancetype)initWithDictionary:(NSDictionary *)dictionary {

self = [self init]; if (self) { self.title = dictionary[@"title"]; self.userURL = [NSURL URLWithString:dictionary[@"user"]]; } return self; }

Remove Business Logic

BILPost.m

slide-35
SLIDE 35

{ title: "Stop killing unicorns", user: “http://service.com/api/v2/users/1.json” }

Use hypermedia

/post.json

slide-36
SLIDE 36

{ title: "Stop killing unicorns", user: “https://api.v2.users.service.com/cbarrie” }

Update anytime

/post.json

slide-37
SLIDE 37

Version your APIs

slide-38
SLIDE 38

{ title: "Stop killing unicorns", user: “https://api.v2.users.service.com/cbarrie” }

Version APIs

v2/post.json

slide-39
SLIDE 39

{ title: "Stop killing unicorns", user: { name: “Ron Burgundy”, image: “http://cdn.com/someimage.png”, href: “https://user.api.service.com/v3/1” } }

Version APIs

v3/post.json

slide-40
SLIDE 40

{ title: "Stop killing unicorns", user: “https://api.v2.users.service.com/cbarrie”, userSummary: { name: “Brick Tamland”, image: “http://cdn.com/someimage.png” } }

Version APIs

v2/post.json

slide-41
SLIDE 41

Social

  • (void)setupDefaults
{ self.collectionViewDataSource.cellFactory = [WOWCollectionViewProductCellFactory class]; self.collectionViewDelegate.cellFactory = [WOWCollectionViewProductCellFactory class]; self.collectionViewLayoutArrangement = [WOWProductsViewController layoutArrangementForUserInterfaceIdiom: [UIDevice currentDevice].userInterfaceIdiom]; self.collectionViewLayoutDelegate.layoutSpacingClass = [WOWCollectionViewAutoSpacingLayoutDelegate sizeClassForUserInterfaceIdiom:[UIDevice currentDevice].userInterfaceIdiom]; self.collectionViewLayoutDelegate.cellSizeClass = [WOWProductsViewController sizeClassForLayoutArrangement:self.collectionViewLayoutArrangement] ; }
  • (void)viewWillAppear:(BOOL)animated
{ [super viewWillAppear:animated]; self.barAnimatingScrollViewDelegate.animatableHeaderBar = (UIView <WOWAnimatableBar> *)self.navigationController.navigationBar; }
  • (void)fetchData
{ [self showLoadingIndicator]; [self.productsDataStore fetchDataWithRequestURL:nil errorHandler:^(NSError *error) { [self dataStore:self.productsDataStore didReceiveError:error]; }]; }
  • (void)showLoadingIndicator
{ self.collectionView.hidden = YES; self.loadingIndicatorView.hidden = NO; } }
slide-42
SLIDE 42
  • (void)setup
Defaults { self.collec tionViewDat aSource.cel lFactory = [WOWCollect ionViewProd uctCellFact
  • ry class];
self.collec tionViewDel egate.cellF actory = [WOWCollect
  • (void)viewWillAp
pear: (BOOL)animated { [super viewWillAppear:a nimated]; self.barAnimatin gScrollViewDeleg ate.animatableHe aderBar = (UIView <WOWAnimatableBa r> *)self.navigatio nController.navi gationBar; }
  • (void)fetchData
{

Social

slide-43
SLIDE 43

Be ready to ship

slide-44
SLIDE 44

Feature flags

slide-45
SLIDE 45

#ifndef SEARCH_INPUT self.searchInputView.hidden = YES; #endif

Feature flags

BILGlobalToolbar.m

SEARCH_FEATURES = SEARCH_TOOLBAR SEARCH_INPUT USER_TOGGLES = $(SEARCH_FEATURES)

User.xcconfig

slide-46
SLIDE 46

#include "Shared.xcconfig" #include "Features.xcconfig" #include "User.xcconfig" DEBUG_TOGGLES = DEBUG=1 GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(DEBUG_TOGGLES) $(FEATURE_TOGGLES) $(USER_TOGGLES)

Feature flags

Debug.xcconfig

slide-47
SLIDE 47

Iterative development

slide-48
SLIDE 48

Development pipeline

slide-49
SLIDE 49

Continuous Integration

slide-50
SLIDE 50

Continuous Delivery

slide-51
SLIDE 51

Continuous Deployment

slide-52
SLIDE 52

Robust processes

slide-53
SLIDE 53

Speedy collaboration

slide-54
SLIDE 54

Code previews

slide-55
SLIDE 55

Pull requests

slide-56
SLIDE 56

Social code reviews

slide-57
SLIDE 57

Don’t stop the world

slide-58
SLIDE 58

Maintain quality

slide-59
SLIDE 59

Manage Tech Debt

slide-60
SLIDE 60

Start thinking for the business

slide-61
SLIDE 61
  • Business
  • Designers
  • App Developers
  • Backend Developers
  • QAs

Product aligned teams

slide-62
SLIDE 62

Start doing what you can do today

slide-63
SLIDE 63

Walled Garden

slide-64
SLIDE 64

Remove Business Logic

slide-65
SLIDE 65

Be ready to ship

slide-66
SLIDE 66

Enable collaboration

slide-67
SLIDE 67

Product aligned teams

slide-68
SLIDE 68

Keep moving forward

slide-69
SLIDE 69

Keep building

slide-70
SLIDE 70

Keep measuring

slide-71
SLIDE 71

Keep learning

slide-72
SLIDE 72

Keep shipping

slide-73
SLIDE 73

Thanks

slide-74
SLIDE 74

Cameron Barrie

Client Principal at Bilue cameron@bilue.com.au @whalec

slide-75
SLIDE 75

Cameron Barrie

Client Principal at Bilue cameron@bilue.com.au @whalec