Slide 1

Slide 1 text

Beyond REST Coursera’s API Evolution Revisiting theoretical foundations to improve developer productivity. Brennan Saeta ! @bsaeta " saeta

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Problems • Number of courses grew rapidly • Product needs changed: • premium course certificates • specializations • multi-university collaborations. • Growing size of engineering team

Slide 6

Slide 6 text

Scale matters! In many dimensions • Queries per second • Data set size • Engineers • Types in ontology

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

Performance Requirements • Minimize data transfer across WAN • Minimize round trips Nice-to-have’s • Caching • ETag & Conditional Request Support • Binary Serialization

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Experience- based APIs Queryable APIs

Slide 11

Slide 11 text

Relational Algebra Meets REST/JSON APIs Projection: filter fields in response Selection: filter items in a collection Joins: related resources

Slide 12

Slide 12 text

https://api.coursera.org/api/courses.v1?q=slug&slug=machine-learning response: { "elements": [ { "courseType": "v2.ondemand", "id": "Gtv4Xb1-EeS-ViIACwYKVQ", "name": "Machine Learning", "slug": "machine-learning" } ], "linked": {}, "paging": { "total": 1 } } request endpoint: /api/courses.v1 request query parameters: { "q": "slug", "slug": "machine-learning" }

Slide 13

Slide 13 text

https://api.coursera.org/api/courses.v1?q=slug&slug=machine-learning &fields=primaryLanguages response: { "elements": [ { "courseType": "v2.ondemand", "id": "Gtv4Xb1-EeS-ViIACwYKVQ", "name": "Machine Learning", "slug": "machine-learning", "primaryLanguages": ["en"] } ], "linked": {}, "paging": { "total": 1 } } request endpoint: /api/courses.v1 request query parameters: { "q": "slug", "slug": "machine-learning", "fields": "primaryLanguages" }

Slide 14

Slide 14 text

https://api.coursera.org/api/courses.v1?q=slug&slug=machine-learning &fields=instructorIds&includes=instructorIds response: { "elements": [ { "courseType": "v2.ondemand", "id": "Gtv4Xb1-EeS-ViIACwYKVQ", "name": "Machine Learning", "slug": "machine-learning", ”instructorIds": [1244] } ], "linked": { "instructors.v1": [ { "id": 1244, "name": "Andrew Ng" } ] }, "paging": { "total": 1 } } request endpoint: /api/courses.v1 request query parameters: { "q": "slug", "slug": "machine-learning", "fields": "instructorIds", "includes": "instructorIds" }

Slide 15

Slide 15 text

https://api.coursera.org/api/courses.v1?q=slug&slug=machine-learning &fields=instructorIds,instructors.v1(title)&includes=instructorIds response: { "elements": [ { "courseType": "v2.ondemand", "id": "Gtv4Xb1-EeS-ViIACwYKVQ", "name": "Machine Learning", "slug": "machine-learning", "instructorIds": [1244] } ], "linked": { "instructors.v1": [ { "id": 1244, "name": "Andrew Ng", "title": "Associate Professor, Stanford University; Chief Scientist, Baidu; Chairman and Co-founder, Coursera" } ] }, "paging": { "total": 1 } } request endpoint: /api/courses.v1 request query parameters: { "q": "slug", "slug": "machine-learning", "fields": "instructorIds, instructors.v1(title)", "includes": "instructorIds" }

Slide 16

Slide 16 text

0 200 400 600 800 Controllers vs Naptime Resources Controllers Resources

Slide 17

Slide 17 text

Naptime Key Learnings • Leverage type safety, carefully • Collections of Key-Value pairs • Opinionated framework improves communication Principle: Optimize for developer productivity.

Slide 18

Slide 18 text

Problems remained • Flattened representation difficult for clients • URL representation cumbersome • Auto-doc tools not useable

Slide 19

Slide 19 text

Problems remained • Flattened representation difficult for clients GraphQL queries are easy to read, modify, and maintain • URL representation cumbersome GraphQL queries are easy to read, modify, and maintain • Auto-doc tools not useable GraphiQL supports auto-completion and inline documentation

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

GraphQL Query: query { CoursesV1Resource { slug(slug: "machine-learning") { id } } } request endpoint: /api/courses.v1 request query parameters: { "q": "slug", "slug": "machine-learning" }

Slide 22

Slide 22 text

request endpoint: /api/courses.v1 request query parameters: { "q": "slug", "slug": "machine-learning", "fields": "primaryLanguages" } GraphQL Query: query { CoursesV1Resource { slug(slug: "machine-learning") { id primaryLanguages } } }

Slide 23

Slide 23 text

request endpoint: /api/courses.v1 request query parameters: { "q": "slug", "slug": "machine-learning", "fields": "instructorIds", "includes": "instructorIds" } GraphQL Query: query { CoursesV1Resource { slug(slug: "machine-learning") { id instructors: instructorIds { id } } } }

Slide 24

Slide 24 text

request endpoint: /api/courses.v1 request query parameters: { "q": "slug", "slug": "machine-learning", "fields": "instructorIds, instructors.v1(title)", "includes": "instructorIds" } GraphQL Query: query { CoursesV1Resource { slug(slug: "machine-learning") { id instructors: instructorIds { id title } } } }

Slide 25

Slide 25 text

Edge Tier GraphQL Assembler Profile Service Enrollments Service Catalog Service

Slide 26

Slide 26 text

Edge Tier GraphQL Assembler Profile Service Enrollments Service Catalog Service

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

Key Lessons Learned Carefully understand your problem Look to theory: stand on the shoulders of giants Plug into the ecosystem

Slide 29

Slide 29 text

Naptime is developed in the open https://github.com/coursera/naptime

Slide 30

Slide 30 text

Thank you!

Slide 31

Slide 31 text

Thank you!

Slide 32

Slide 32 text

Questions?

Slide 33

Slide 33 text

Thank you! Photo Credits: Trevor Wilson — https://unsplash.com/@clevertrevor Pablo Garcia Saldaña — https://unsplash.com/@pagsa_ Rob Bye — https://unsplash.com/@robertbye Eli Francis - https://unsplash.com/@elifrancis Ryan Hafney — https://unsplash.com/@ryanhafey Thank you: Bryan Kane & Coursera Colleagues