Beyond REST: Courseras Journey to GraphQL Bryan Kane @bryanskane - - PowerPoint PPT Presentation

beyond rest coursera s journey to graphql
SMART_READER_LITE
LIVE PREVIEW

Beyond REST: Courseras Journey to GraphQL Bryan Kane @bryanskane - - PowerPoint PPT Presentation

Beyond REST: Courseras Journey to GraphQL Bryan Kane @bryanskane bryan-coursera Chapter One Site speed issues Chapter Two Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 4


slide-1
SLIDE 1

Beyond REST: Coursera’s Journey to GraphQL

Bryan Kane @bryanskane bryan-coursera

slide-2
SLIDE 2
slide-3
SLIDE 3
slide-4
SLIDE 4

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 4

slide-5
SLIDE 5

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 5

Load Courses

slide-6
SLIDE 6

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 6

Load Instructors

slide-7
SLIDE 7

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 7

Load Universities

slide-8
SLIDE 8

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

Load University Profile

8

slide-9
SLIDE 9

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 9

slide-10
SLIDE 10

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 10

Backend Client

APIs

slide-11
SLIDE 11

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 11

Discussion Asset
 Service Emails Catalog Courservice Learning
 Hierarchy Recs Growth Enterprise Payment Translations Learning
 Items Users Auth Eventing

Backend Client

Discussion Asset
 Service Emails Catalog Courservice Learning
 Hierarchy Recs Growth Enterprise Payment Translations Learning
 Items Users Auth Eventing

APIs

slide-12
SLIDE 12

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 12

Discu Asset
 Email Catal Cours Learn Recs Grow Enter Paym Transl Learn Users Auth Event

APIs

Backend Client

slide-13
SLIDE 13

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

Catalog

13

partners.v1 instructors.v1 courseGrades.v1 courses.v1 enrollments.v1 enrollments.v2 courseVideos.v1 quizzes.v1
slide-14
SLIDE 14

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

Catalog

14

partners.v1 instructors.v1 courseGrades.v1 courses.v1 enrollments.v1 enrollments.v2 courseVideos.v1 quizzes.v1
slide-15
SLIDE 15

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

Catalog

15

partners.v1 instructors.v1 courseGrades.v1 courses.v1 enrollments.v1 enrollments.v2 courseVideos.v1 quizzes.v1
slide-16
SLIDE 16

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

Catalog

16

partners.v1 instructors.v1 courseGrades.v1 courses.v1 enrollments.v1 enrollments.v2 courseVideos.v1 quizzes.v1
slide-17
SLIDE 17

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 17

Discussion Asset
 Service Emails Catalog Courservice Learning
 Hierarchy Recs Growth Enterprise Payment Translations Learning
 Items Users Auth Eventing Discu Asset
 Email Catal Cours Learn Recs Grow Enter Paym Transl Learn Users Auth Event

APIs

Backend Client

slide-18
SLIDE 18

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 18

We didn’t break up the monolith — we just moved it to the clients.

slide-19
SLIDE 19

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 19

slide-20
SLIDE 20

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 20

GraphQL is a
 query language, not a library.

slide-21
SLIDE 21

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 21

query MyCoursesQuery { myCourses(limit: 5, sortBy: RECENT) { name slug instructors { firstName lastName university(filter: VISIBLE_TO_LEARNERS) { name country slug } } } }

slide-22
SLIDE 22

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective

query MyCoursesQuery { myCourses(limit: 5, sortBy: RECENT) { name slug instructors { firstName lastName university(filter: VISIBLE_TO_LEARNERS) { name country slug } } } }

22

slide-23
SLIDE 23

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective

query MyCoursesQuery { myCourses(limit: 5, sortBy: RECENT) { name slug instructors { firstName lastName university(filter: VISIBLE_TO_LEARNERS) { name country slug } } } }

23

slide-24
SLIDE 24

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective

query MyCoursesQuery { myCourses(limit: 5, sortBy: RECENT) { name slug instructors { firstName lastName university(filter: VISIBLE_TO_LEARNERS) { name country slug } } } }

24

slide-25
SLIDE 25

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 25

query MyCoursesQuery { myCourses(limit: 5, sortBy: RECENT) { name slug instructors { firstName lastName university(filter: VISIBLE_TO_LEARNERS) { name country slug } } } }

slide-26
SLIDE 26

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 26

{ "myCourses": [ { "name": "Machine Learning", "slug": "machine-learning", "instructors": [ { "firstName": "Andrew", "lastName": "Ng" "university": { "name": "Stanford University", "country": "United States", "slug": "stanford" } }] }] }

slide-27
SLIDE 27

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 27

query MyCoursesQuery { myCourses(limit: 5, sortBy: RECENT) { name slug instructors { firstName lastName university(filter: VISIBLE_TO_LEARNERS) { name country slug } } } } { "myCourses": [{ "name": "Machine Learning", "slug": "machine-learning", "instructors": [{ "firstName": "Andrew", "lastName": "Ng" "university": { "name": "Stanford University", "country": "United States", “slug": "stanford" } }] }] }

slide-28
SLIDE 28

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 28

slide-29
SLIDE 29

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 29

query CoursePage {
 course(slug: "machine-learning") {
 title description } } <Course />
slide-30
SLIDE 30

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 30

query CoursePage {
 course(slug: "machine-learning") {
 title description } } <Course /> university { name logo } <University />
slide-31
SLIDE 31

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 31

query CoursePage {
 course(slug: "machine-learning") {
 title description } } <Course /> university { name logo } <University /> instructor { name title } <Instructor />
slide-32
SLIDE 32

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 32

query CoursePage {
 course(slug: machine-learning") {
 title description } } <Course /> university { name logo } <University /> instructor { name title } <Instructor /> profile { photo } <ProfilePhoto />
slide-33
SLIDE 33

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 33

All queries are backed
 by a typed schema

slide-34
SLIDE 34

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 34

type root { myCourses(limit: Int, sortBy: COURSE_SORT): [Course] } enum COURSE_SORT { RECENT ENROLL_DATE } type Course { name: String slug: String instructors: [Instructor] } type Instructor { firstName: String lastName: String university(filter: VISIBILITY_FILTER): University }

slide-35
SLIDE 35

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 35

slide-36
SLIDE 36

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 36

Small, but rapidly growing community

slide-37
SLIDE 37

Chapter One Site speed
 issues Chapter Two
 Intro to GraphQL Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective 37

visit graphql.org
 for more info

slide-38
SLIDE 38

38

Migrating to GraphQL

slide-39
SLIDE 39

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 39

Backend

Discussion Asset
 Service Emails Catalog Courservice Learning
 Hierarchy Recs Growth Enterprise Payment Translations Learning
 Items Users Auth Eventing Disc Jon
 Em Cat Cou Lea Rec Gro Ent Pay Tra Lea Use Aut Eve

Client

Discussion Asset
 Service Emails Catalog Courservice Learning
 Hierarchy Recs Growth Enterprise Payment Translations Learning
 Items Users Auth Eventing Disc Ass Em Cat Cou Lea Rec Gro Ent Pay Tra Lea Use Aut Eve
slide-40
SLIDE 40

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 40

Codebase consistency

Convert REST
 to GraphQL Add GraphQL

  • n top of REST

Multiple API formats One API format

slide-41
SLIDE 41

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 41

Codebase consistency

Convert REST
 to GraphQL Add GraphQL

  • n top of REST

Multiple API formats One API format Higher investment Lower investment Time investment

slide-42
SLIDE 42

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 42

Codebase consistency

Convert REST
 to GraphQL Add GraphQL

  • n top of REST

Multiple API formats One API format Higher investment Lower investment More flexible Less flexible Time investment Full power of GraphQL

slide-43
SLIDE 43

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 43

Codebase consistency

Convert REST
 to GraphQL Add GraphQL

  • n top of REST

Multiple API formats One API format Higher investment Lower investment More flexible Less flexible Less coordination required More coordination
 required Time investment Full power of GraphQL Rollout strategy

slide-44
SLIDE 44

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 44

Codebase consistency

Convert REST
 to GraphQL Add GraphQL

  • n top of REST

Multiple API formats One API format Higher investment Lower investment More flexible Less flexible Less coordination required More coordination
 required Greater schema
 consistency Can lead to arbitrary schema formats Time investment Full power of GraphQL Rollout strategy Schema consistency

slide-45
SLIDE 45

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 45

Codebase consistency

Convert REST
 to GraphQL Add GraphQL

  • n top of REST

Multiple API formats One API format Higher investment Lower investment More flexible Less flexible Less coordination required More coordination
 required Greater schema
 consistency Can lead to arbitrary schema formats Time investment Full power of GraphQL Rollout strategy Schema consistency

slide-46
SLIDE 46

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 46

Discuss Asset
 Emails Catalog Course Learnin Recs Growth Enterpr Payme Transla Learnin Users Auth Eventin

slide-47
SLIDE 47

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 47

Discuss Asset
 Emails Catalog Course Learnin Recs Growth Enterpr Payme Transla Learnin Users Auth Eventin

slide-48
SLIDE 48

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

Catalo

Catalog

48

Discuss Asset
 Emails Course Learnin Recs Growth Enterpr Payme Transla Learnin Users Auth Eventin

slide-49
SLIDE 49

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

Catalo

Catalog

49

Discuss Asset
 Emails Course Learnin Recs Growth Enterpr Payme Transla Learnin Users Auth Eventin

slide-50
SLIDE 50

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

1 List of public APIs 2 Endpoints and arguments 3 Model schemas

50

slide-51
SLIDE 51

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 51

Discussion Asset
 Service Emails Catalog Courservice Learning
 Hierarchy Recs Growth Enterprise Payment Translations Learning
 Items Users Auth Eventing

Assembler

slide-52
SLIDE 52

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 52

Schema Design

type CoursesV1 { id: String slug: String ...more fields } type CoursesV1Resource { myWatchlist(limit: Int, start: String): CoursesV1Connection bySlug(slug: String, limit: Int, start: String): CoursesV1Connection getAll(limit: Int, start: String): CoursesV1Connection get(id: String!): CoursesV1 multiGet(ids: [String], limit: Int, start: String): CoursesV1Connection } type CoursesV1Connection { elements: [CoursesV1] paging: ResponsePagination }

slide-53
SLIDE 53

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 53

https://www.coursera.org /api/courses.v1 ?q=bySlug &slug=ml &fields=id,name,courseUrl query CoursePageQuery { CoursesV1Resource { bySlug(slug: "ml") { id name courseUrl } } }

REST to GraphQL

slide-54
SLIDE 54

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 54

query CoursePageQuery { CoursesV1Resource { course(limit: 123) { instructor { name university { slug country } } myEnrollments { grade } } } }

Data Relations are Powerful

slide-55
SLIDE 55

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 55

Backend APIs are a black box

slide-56
SLIDE 56

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 56

Backend APIs are a black box

  • Joining across APIs is hard
slide-57
SLIDE 57

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 57

Backend APIs are a black box

  • Joining across APIs is hard

  • We don’t use relational databases
  • Most data is stored in Cassandra, a NoSQL database
  • This requires explicit indexes on data for lookups
slide-58
SLIDE 58

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 58

Backend APIs are a black box

  • Joining across APIs is hard

  • We don’t use relational databases
  • Most data is stored in Cassandra, a NoSQL database
  • This requires explicit indexes on data for lookups

  • We want to keep services as independent as possible
slide-59
SLIDE 59

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 59

Two types of relationships

Course Instructor model Course { id slug instructorIds } model Instructor { id name }

model A knows about model B

slide-60
SLIDE 60

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 60

Course Enrollment model Course { id slug } model Enrollment { id userId courseId }

Two types of relationships

model A doesn’t know about model B
 model B knows about model A

slide-61
SLIDE 61

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

These are easy — just fetch the data you need by ID

61

courseAPI.addRelation( "instructors" -> ForwardRelation( resourceName = "instructors.v1", idField = "instructorIds", arguments = Map("includeHidden" -> "true"))

Forward Relationships

slide-62
SLIDE 62

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL

  • Define an endpoint on resource B to lookup by model A
  • Define in resource A how to look up on resource B

62

courseAPI.addRelation( "enrollment" -> ReverseRelation( resourceName = "enrollments.v1", finderName = "byCourseAndUser", arguments = Map( "courseId" -> "$id", "version" -> "$version"))

Reverse Relationships

slide-63
SLIDE 63

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 63

Imperative

courseAPI.addRelation({ course => instructorClient.fetchByCourseId(course.id, course.version) .onComplete { instructors => course.set("instructors", instructors) }.onFailure { course.set("instructors", List.empty) } })

slide-64
SLIDE 64

Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Four Learnings and retrospective Chapter Two
 Intro to GraphQL 64

Imperative

courseAPI.addRelation({ course => instructorClient.fetchByCourseId(course.id, course.version) .onComplete { instructors => course.set("instructors", instructors) }.onFailure { course.set("instructors", List.empty) } }) courseAPI.addRelation( "instructors" -> ReverseRelation( resourceName = "instructors.v1", finderName = "byCourseId", arguments = Map("courseId" -> "$id", "version" -> "$version"))

Declarative

slide-65
SLIDE 65

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL 65

slide-66
SLIDE 66

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL

query { CoursesV1Resource { bySlug(slug: "machine-learning") { coursePurchases { transactions { transactionDate expirationDate } } certificates { certificateGrantDate certificateGrade } }

  • ffersCertificateForPurchase

} EnterpriseProgramsV1Resource { myPrograms { eligibleCourses } } }

66

Actual Query Ideal Query

slide-67
SLIDE 67

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL

query { CoursesV1Resource { bySlug(slug: "machine-learning") { coursePurchases { transactions { transactionDate expirationDate } } certificates { certificateGrantDate certificateGrade } }

  • ffersCertificateForPurchase

} EnterpriseProgramsV1Resource { myPrograms { eligibleCourses } } }

67

Actual Query Ideal Query

slide-68
SLIDE 68

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL

query { CoursesV1Resource { bySlug(slug: "machine-learning") { coursePurchases { transactions { transactionDate expirationDate } } certificates { certificateGrantDate certificateGrade } }

  • ffersCertificateForPurchase

} EnterpriseProgramsV1Resource { myPrograms { eligibleCourses } } }

68

query { CoursesV1Resource { bySlug(slug: "machine-learning") { shouldShowUpsell } } }

Actual Query Ideal Query

slide-69
SLIDE 69

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL 69

GraphQL isn't magic

slide-70
SLIDE 70

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL 70

GraphQL isn't magic

  • Don’t let your GraphQL queries become too complex — 


move your business logic downstream.

slide-71
SLIDE 71

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL 71

GraphQL isn't magic

  • Don’t let your GraphQL queries become too complex — 


move your business logic downstream.

  • Build your APIs with GraphQL in mind — 


don’t let them live in a silo.

slide-72
SLIDE 72

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL 72

Popular Courses for Journalists

Learn what it takes to report the news, conduct historical research,
 understand different viewpoints, and even produce your own intro music.
slide-73
SLIDE 73

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL 73

Popular Courses for Journalists

Learn what it takes to report the news, conduct historical research,
 understand different viewpoints, and even produce your own intro music.

query CourseCollectionQuery(slug: String!) { CourseCollectionV1Resource { bySlug(slug: $slug) { title subtitle entries { isEnrolled isOnWishlist course { name photo } } } } }

slide-74
SLIDE 74

Chapter Four Learnings and retrospective Chapter One Site speed
 issues Chapter Three Migrating to GraphQL Chapter Two
 Intro to GraphQL 74

Popular Courses for Journalists

Learn what it takes to report the news, conduct historical research,
 understand different viewpoints, and even produce your own intro music.
slide-75
SLIDE 75
slide-76
SLIDE 76
slide-77
SLIDE 77

Thanks!

Bryan Kane @bryanskane bryan-coursera