powering fast-paced product iterations front-end apis · powering fast-paced product iterations....

66
Front-End APIs Powering Fast-Paced Product Iterations

Upload: others

Post on 24-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Front-End APIsPowering Fast-Paced Product Iterations

Page 2: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Speakers

Jeff WeinerChief Executive Officer

Aditya ModiStaff Software Engineer

Karthik RamgopalSr Staff Software Engineer

Page 3: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Overview

History and evolution of frontend APIs at LinkedIn

Our API structure today

Learnings and results

Sneak peek at the future

Page 4: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

2 Years Ago

Page 5: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Mobile v/s Desktop

Feed on mobile Feed on desktopFeed on iPad

Page 6: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Client - Server setup

mobile-frontend-API tablet-frontend-API homepage-frontend-API profile-frontend-API

Android iOS Tablet homepage-desktop-web profile-desktop-web

Page 7: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Huge API surface and diversity

• No IDL/schema backing API

• Slow iteration speed

Problems?

Page 8: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Today

Page 9: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Mobile v/s Desktop

Feed on mobile Feed on desktopFeed on iPad

Page 10: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Client - Server setup

flagship-frontend-API

flagship-android flagship-iOS flagship-desktop-webflagship-mobile-web

Rest + JSON over HTTP2

Mid-tier . . . . Mid-tier

Page 11: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• > 120k QPS

• ~425 developers

• ~30 commits per day

Scale

Page 12: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Automated continuous release

• commit to production in < 3 hours

• 3 deployments a day

3x3 Deployment

Page 13: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Modeling

Page 14: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Backed by Strongly Typed Schemas

• Backward-compatible evolution

• No endpoint versioning

Principles

Page 15: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

{ "type": "record", "name": "TestRecord", "namespace": "com.linkedin.test", "doc": "Test", "fields": [ { "name": "id", "type": "String", "doc": "ID" }, { "name": "name", "type": "String", "doc": "Name", “optional”: true }, ]}

@interface TestRecord : NSObject

@property(nonnull, copy) NSString *id;@property(nullable, copy) NSString *name;

@end

class TestRecord {

@NonNull public final String id; @Nullable public final String name;

}

export default DS.Model.extend({

id: DS.attr(‘string’),

name: DS.attr(‘string’)

});

Schema definition

iOS

Android

Web

Page 16: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Entity Modeling

• Return - Collection<Card>

Page 17: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Composite screens

● Two top level resources

■ Invitations

■ PYMK (People You May Know)

● 1 network call to fetch both resources

■ Infrastructure level aggregation support

Page 18: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Easy to model

• Decouple API from UI

• Client side consistency

Advantages

Page 19: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Client side consistency

Page 20: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Client side consistency

• Why ?

○ Good UX

○ Optimistic writes

Page 21: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Client side consistency

Can you do this auto-magically?

Page 22: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Client side consistency

Payload Cache

Page 23: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Client side consistency

Payload Cache

Page 24: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Client side consistency

Cache Payload

Page 25: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Everything is awesome, right?

Page 26: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Takes a long time to ship a feature

API Server

1.5 weeks

iOS

2 weeks

Android

2 weeks

Web

2 weeks

Total time

3.5 weeks=+

Use case: Introduce a new kind of notification

Page 27: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Create new models for every feature

• Write code on each client platform

• Wait for native app release/adoption

Why so long?

Page 28: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Challenge

Cut this down to 1 day!

Page 29: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Quickly build and release notifications

• Increase user engagement

• Sweet and sticky, just like honey!

Project Honeycomb

Page 30: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• New notifications WITHOUT app updates

• Client side consistency

• Stellar runtime performance

Beyond iteration speed...

Page 31: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Model based on how the UI view looks

• Similar views grouped into 1 template

• More UI specific logic on API server

View Template API

Page 32: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Share notification

Share Template

● PrimaryImage: URL?● Title: AttributedString● Timestamp: Long● ShareImage: URL?● ShareTitle: String● LikeCount: Long? (Default: 0)● CommentCount: Long? (Default: 0)

Page 33: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Now let’s look at a slightly different notification

Modify Share Template

● PrimaryImage: URL?● Title: AttributedString● Timestamp: Long● ShareImage: URL?● ShareTitle: String AttributedString● ShareSubtitle: AttributedString?● LikeCount: Long? (Default: 0)● CommentCount: Long? (Default: 0)

Page 34: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

How about something radically different?

Work Anniversary Template

● PrimaryImage: URL?● Title: AttributedString● Timestamp: Long

Page 35: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Something slightly different again?

Work Anniversary/New Position Template

● PrimaryImage: URL?● Title: AttributedString● Timestamp: Long● BodyText: AttributedString?

Page 36: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

How do we return a heterogeneous list?

• Use Rest.li paginated collections. Differentiate between items using a Union.

• JSON payload structure:

{

“elements” : [

{“Share”: {“Title”: “Sarah Clatterbuck shared a…”, ...}},

{“Anniversary”: {“Title”: “Congratulate Nitish Jha…”, ...}},

....

],

“paging”: { “start” : 0, “count”: 10, “paginationToken”: “xydsad”}

}

Page 37: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Minor payload optimization

• Embed the type into the payload to reduce nesting.

• JSON payload structure:

{

“elements” : [

{“Type”: “Share”, “Title”: “Sarah Clatterbuck shared a…”, ...},

{“Type”: “Anniversary”, “Title”: “Congratulate Nitish Jha…”, ...},

....

],

“paging”: { “start” : 0, “count”: 10, “paginationToken”: “xydsad”}

}

Page 38: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Code-generated response parser

• Bind model to native views

• Write once* per layout, reuse.

Client side rendering

Page 39: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Backward compatibility

{

“elements” : [

{“Stat”: {“Title”: “Your Profile...”, ...}},

{“JYMBII”: {“Title”: “5 Jobs you”, ...}},

{“Share”: {“Title”: “Swati Mathur...”, ...}},

....

],

“paging”: { “start” : 0, “count”: 10, “paginationToken”: “xydsad”}

}

Drop unknown notification types.

Page 40: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Backward compatibility

Drop unknown fields based on product needs.

Page 41: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• New notification types without client changes

• Renders faster on the clientBenefits

Page 42: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

But… Client side Consistency is lost!

Page 43: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

How do we solve this?

Page 44: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

How did we solve the AttributedString problem?

• Model formatted text

• Control formatting from the server

• Impractical to use HTML

AttributedString

Page 45: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

AttributedString schema

AttributedString

● Text: String● Attributes: List[Attribute] BOLD, ITALIC, UNDERLINE etc.

Attribute

● Type: AttributeType ● StartIndex: Int● Length: Int● Metadata: Any?

Page 46: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Platform specific binding

Infrastructure provided support

iOS

Android

Web

NSAttributedString

Spannable

HTML

AttributedString

Page 47: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

What if we extended this concept to entity mentions?

Model entity mentions also as a custom formatting specifier.

Profile mention Profile mention

Page 48: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Introducing TextViewModel

TextViewModel

● Text: String● Attributes: List[TextViewAttribute]

TextViewAttribute

● Type: TextViewAttributeType● StartIndex: Int● Length: Int● Metadata: Any?

● Profile: Profile?● Job: Job?● Company: Company?● Course: Course?

Flattened canonical entities as optional fields

Similar to AttributedString

Page 49: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Entity mentions

Entities could be mentioned in different ways.

First NameFull Name

Position

Page 50: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

TextViewAttributeType

TextViewAttributeType

● PROFILE_FIRST_NAME● PROFILE_FULL_NAME● PROFILE_HEADLINE● PROFILE_DISTANCE● COMPANY_NAME● COMPANY_HEADLINE● JOB_TITLE● ….

If a particular type is used, then the corresponding entity is populated by the server.

● PROFILE_XXX types will populate the profile field for example with the corresponding profile.

Page 51: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Backward compatibility++

Old clients cannot handle new mention types. Always send Raw text though redundant.

{

“title” : {

“Text”: “Sarah Clatterbuck shared this”,

“Attributes”: [

{“Type”: “PROFILE_FULL_NAME”,

“StartIndex”: 0….}

]

}

}

Page 52: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

• Singular and Plurals

• Possessive forms

• i10n and i18n

Watch Out

Page 53: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

How about images?

Use the same concept as TextViewModel. Introduce ImageViewModel.

ImageViewModel

● Attributes: List[ImageViewAttribute]

ImageViewAttribute

● ImageViewAttributeType● URL: URL?● ResourceName: String?● Profile: Profile?● Job: Job?● Company: Company?● Course: Course?

Flattened canonical entities as optional fields

Page 54: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

ImageViewAttributeType

ImageViewAttributeType

● URL● RESOURCE_NAME● PROFILE_IMAGE● PROFILE_BACKGROUND● COMPANY_IMAGE● ….

If a particular type is used, then the corresponding entity is populated by the server.

● PROFILE_XXX types will populate the profile field for example with the corresponding profile.● URL type will populate the image URL● RESOURCE_NAME will populate the pre-canned resource name.

Page 55: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Rendering Images

● Infra code extracts Image URL out of ImageViewModel

● Load into platform specific image view.

One Attribute: Regular ImageView

Multiple Attributes: GridImageView

Page 56: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Performance considerations

Entities may repeat multiple times within the same notification causing payload size bloat.

Tim’s Profile in ImageViewModel Tim’s Profile in TextViewModel

Page 57: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Solution: Response Normalization

All canonical entities have a unique ID. Use a JSON API like response format.

{

“data” : {

“Profile”: “profile:123”, ...

},

“included”: [

{

“id” : “profile:123”, “firstName” : “Tim”, “LastName” : “Jurka”, ... }

},

....

]

}

Page 58: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Performance considerations (Continued)

All fields from the entities may not be used.

ImageURL First Name and Last Name

Page 59: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Solution: Deco

Deco is a LinkedIn framework that allows selective projection and decoration of fields.

Profile in TextViewModel

IDFirstNameLastName

Profile in ImageViewModel

IDImageURL

Profile in Response

IDFirstNameLastNameImageURL

Page 60: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Results

Page 61: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Improved Developer and Product Velocity

9 new notification types in all of 201616 new notification types in May and June 2017

Page 62: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

API model reduction

42 API models for old UI6 API models for new UI

Page 63: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Code size reduction

15k LOC app and test code for old UI3k LOC app and test code for new UI

Page 64: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Future Direction

● Extend to other pages in Flagship

● Extend to other LinkedIn apps like JobSeeker, Recruiter etc.

Page 65: Powering Fast-Paced Product Iterations Front-End APIs · Powering Fast-Paced Product Iterations. Speakers Jeff Weiner Chief Executive Officer Aditya Modi Staff Software Engineer Karthik

Out of scope for this talk

● Intricate details of client side consistency management

● Generic Modeling of actions

● Challenges in migrating from the old notifications API to the new one

Find us after the talk, and we’re happy to chat about this and more.