SlideShare ist ein Scribd-Unternehmen logo
1 von 60
Build Scalable
APIs using
GraphQL and
Serverless
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
–-Lee Byron
a data-fetching API powerful
enough to describe all of
Facebook
@simona_cotin
@simona_cotin
https://facebook.com/user/id
https://facebook.com/user/id/events
https://facebook.com/user/id/friends-suggestions
https://facebook.com/user/id/friends-birthdays
@simona_cotin
https://facebook.com/user/id/events
{
"name": "HelsinkiJS",
"location": "Helsinki",
"organiser": "Citrus",
"attendees": [
{
"name": “Sarah Drasner",
"company": “Microsoft",
"role": "Chef Of Avocados 🥑"
}
]
@simona_cotin
@simona_cotin
Overfetch
Or
New endpoint
@simona_cotin
@simona_cotin
https://facebook.com/user/id/friends-suggestions
{
"name": "Golnaz Badazadeh",
"profile_pic": "some_url",
"mutual_friends": []
}
@simona_cotin
https://facebook.com/user/id/friends-suggestions/id/mutual{
"mutual_friends": [
{
"name": "Sarah Drasner",
"profile_pic": "some_url",
"tag": "Amazing!"
}
]
}
@simona_cotin
Underfetch
Or
New endpoint
@simona_cotin
Delay User Perception
0-100 ms Instant
100-300 ms Small perceptible delay
300-1000 ms Machine is working
1000+ ms Likely context switch
10000+ ms Task is abandoned
High performance Browser Networking
@simona_cotin
–-Ilya Grigorik
The fastest network request is a
request not made
@simona_cotin
user(id:1) {
name
events {
count
}
friends_suggestions {
name
mutual_friends {
count
}
}
}
}
"data": {
"user": {
"name": "Simona Cotin",
"events": {
"count": 4
},
"friends_suggestions": {
"name": "Golnaz Babazadeh",
"mutual_friends": {
"count": 15
}
}
}
@simona_cotin
Schema driven
development
@simona_cotin
Strongly typed
@simona_cotin
type People {
id: ID!
name: String
avatar: URL
}
@simona_cotin
type People {
id: ID!
name: String
avatar: URL
}
type Team {
id: ID!
name: String
points: Int
people: [People]
@simona_cotin
type Query {
teams: [Team]
}
type Mutation {
incrementPoints(id: ID!): Team
}
@simona_cotin
teams: async () => {
let teams = await axios.get(
'https://graphqlvoting.azurewebsites.net/api/score'
);
return teams.data;
},
incrementPoints: async obj => {
let response = await axios.get(
`https://graphqlvoting.azurewebsites.net/api/score/${obj.id}`
);
return response.data;
}
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
✓ Performance
✓ Flexibility
✓ Tooling
@simona_cotin
Serverless
@simona_cotin
–-Steve Jobs
The line of code that’s the
fastest to write, that never breaks,
that doesn’t need maintenance,
is the line you never had to write.
@simona_cotin
module.exports = async function(context, req) {
context.res = {
body: 'Hello ' + req.query.name
};
};
@simona_cotin
Right-Click
Deploy
@simona_cotin
Github
Deploy
@simona_cotin
@simona_cotin
Datasources
3rd party APIs
@simona_cotin
@simona_cotin
{
"type": "cosmosDB",
"name": "inputDocument",
"databaseName": "admin",
"collectionName": "Recipes",
"connectionStringSetting": "tacos-sql_DOCUMENTDB",
“direction": "in"
}
@simona_cotin
module.exports = async function(context, req) {
context.res = {
body: context.bindings.inputDocument
};
};
@simona_cotin
✓ Reusable API
✓ VS Code dev & debug
✓ Easy Integration
Datasources
@simona_cotin
No servers
to
manage
@simona_cotin
Serverless
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
const body = req.body;
let response = await graphql(
typeDefs,
body.query,
root,
null,
body.variables,
body.operationName
);
context.res = {
body: response
};
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
@simona_cotin
Easy Integration of Datasources
Autoscalability
Less code
Easy Abstraction of Datasources
Single Endpoint
Smaller no requests
Serverless GraphQL
@simona_cotin
Easy Integration of Datasources
Easy Abstraction of Datasources
Autoscalability
Single Endpoint
Less code
Smaller no requests
Dev productivity
@simona_cotin
Achieve more
by
doing less
@simona_cotin
@simona_cotin
https://github.com/sim
onaco/serverless-
graphql-workshop
https://aka.ms/learn-
serverless

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (13)

Cindy Krum "Mobile-First Indexing for Local SEO" - LocalU 2017
Cindy Krum "Mobile-First Indexing for Local SEO" - LocalU 2017Cindy Krum "Mobile-First Indexing for Local SEO" - LocalU 2017
Cindy Krum "Mobile-First Indexing for Local SEO" - LocalU 2017
 
Mobile-First Indexing & The Story Your Data Isn't Telling You
Mobile-First Indexing & The Story Your Data Isn't Telling YouMobile-First Indexing & The Story Your Data Isn't Telling You
Mobile-First Indexing & The Story Your Data Isn't Telling You
 
Competitor Site Audits with Free Tools and Data - Sophie Gibson - BrightonSEO...
Competitor Site Audits with Free Tools and Data - Sophie Gibson - BrightonSEO...Competitor Site Audits with Free Tools and Data - Sophie Gibson - BrightonSEO...
Competitor Site Audits with Free Tools and Data - Sophie Gibson - BrightonSEO...
 
What You Need to Know About Google App Indexing - SMX West 2016
What You Need to Know About Google App Indexing - SMX West 2016What You Need to Know About Google App Indexing - SMX West 2016
What You Need to Know About Google App Indexing - SMX West 2016
 
BrightonSEO - Proactive Competitive Intelligence or “Where the *^%&# Should I...
BrightonSEO - Proactive Competitive Intelligence or “Where the *^%&# Should I...BrightonSEO - Proactive Competitive Intelligence or “Where the *^%&# Should I...
BrightonSEO - Proactive Competitive Intelligence or “Where the *^%&# Should I...
 
aaisp
aaispaaisp
aaisp
 
Ashley Berman Hale "SEO Alchemy: Location-Based Mobile Search" - MozLocal 2017
Ashley Berman Hale "SEO Alchemy: Location-Based Mobile Search" - MozLocal 2017Ashley Berman Hale "SEO Alchemy: Location-Based Mobile Search" - MozLocal 2017
Ashley Berman Hale "SEO Alchemy: Location-Based Mobile Search" - MozLocal 2017
 
How to Optimize Apps for Apple iOS Search and iOS 9 Universal Links By Emily ...
How to Optimize Apps for Apple iOS Search and iOS 9 Universal Links By Emily ...How to Optimize Apps for Apple iOS Search and iOS 9 Universal Links By Emily ...
How to Optimize Apps for Apple iOS Search and iOS 9 Universal Links By Emily ...
 
SME Content Marketing: Big Results with Small Budgets
SME Content Marketing: Big Results with Small BudgetsSME Content Marketing: Big Results with Small Budgets
SME Content Marketing: Big Results with Small Budgets
 
Strange but True: Counterintiutive Paths to Building a Business on APIs
Strange but True: Counterintiutive Paths to Building a Business on APIsStrange but True: Counterintiutive Paths to Building a Business on APIs
Strange but True: Counterintiutive Paths to Building a Business on APIs
 
How to Optimize Apps for Apple iOS Search and iOS 9 Universal Links - SMX Wes...
How to Optimize Apps for Apple iOS Search and iOS 9 Universal Links - SMX Wes...How to Optimize Apps for Apple iOS Search and iOS 9 Universal Links - SMX Wes...
How to Optimize Apps for Apple iOS Search and iOS 9 Universal Links - SMX Wes...
 
SEO - Moving the dial #BrightonSEO - September 2016
SEO - Moving the dial  #BrightonSEO - September 2016SEO - Moving the dial  #BrightonSEO - September 2016
SEO - Moving the dial #BrightonSEO - September 2016
 
Google App indexing
Google App indexingGoogle App indexing
Google App indexing
 

Ähnlich wie Build scalable APIs using GraphQL and Serverless

The Flash Facebook Cookbook - FlashMidlands
The Flash Facebook Cookbook - FlashMidlandsThe Flash Facebook Cookbook - FlashMidlands
The Flash Facebook Cookbook - FlashMidlands
James Ford
 
Opensocial Haifa Seminar - 2008.04.08
Opensocial Haifa Seminar - 2008.04.08Opensocial Haifa Seminar - 2008.04.08
Opensocial Haifa Seminar - 2008.04.08
Ari Leichtberg
 

Ähnlich wie Build scalable APIs using GraphQL and Serverless (20)

Intro GraphQL
Intro GraphQLIntro GraphQL
Intro GraphQL
 
The Flash Facebook Cookbook - FlashMidlands
The Flash Facebook Cookbook - FlashMidlandsThe Flash Facebook Cookbook - FlashMidlands
The Flash Facebook Cookbook - FlashMidlands
 
Rapid API Prototyping Using Serverless Backend in the Cloud
Rapid API Prototyping Using Serverless Backend in the CloudRapid API Prototyping Using Serverless Backend in the Cloud
Rapid API Prototyping Using Serverless Backend in the Cloud
 
Scaling an API: From Reboots to Redis, how (not) to do it
Scaling an API: From Reboots to Redis, how (not) to do itScaling an API: From Reboots to Redis, how (not) to do it
Scaling an API: From Reboots to Redis, how (not) to do it
 
0 to 100kmh with GraphQL - Rapid API Prototyping using serverless backend in...
 0 to 100kmh with GraphQL - Rapid API Prototyping using serverless backend in... 0 to 100kmh with GraphQL - Rapid API Prototyping using serverless backend in...
0 to 100kmh with GraphQL - Rapid API Prototyping using serverless backend in...
 
Treating APIs as Products: How to Apply Product Management Principles to Your...
Treating APIs as Products: How to Apply Product Management Principles to Your...Treating APIs as Products: How to Apply Product Management Principles to Your...
Treating APIs as Products: How to Apply Product Management Principles to Your...
 
SharePoint Fest DC 2018 - Everything your need to know about the Microsoft Gr...
SharePoint Fest DC 2018 - Everything your need to know about the Microsoft Gr...SharePoint Fest DC 2018 - Everything your need to know about the Microsoft Gr...
SharePoint Fest DC 2018 - Everything your need to know about the Microsoft Gr...
 
OpenGovWest Keynote | OpenGov Platform of the Future
OpenGovWest Keynote | OpenGov Platform of the FutureOpenGovWest Keynote | OpenGov Platform of the Future
OpenGovWest Keynote | OpenGov Platform of the Future
 
Scaling an API: From Reboots to Redis, how (not) to do it
Scaling an API: From Reboots to Redis, how (not) to do itScaling an API: From Reboots to Redis, how (not) to do it
Scaling an API: From Reboots to Redis, how (not) to do it
 
0 to 100kmh with GraphQL. Rapid API Prototyping usingserverless backend in t...
0 to 100kmh with GraphQL.  Rapid API Prototyping usingserverless backend in t...0 to 100kmh with GraphQL.  Rapid API Prototyping usingserverless backend in t...
0 to 100kmh with GraphQL. Rapid API Prototyping usingserverless backend in t...
 
Prashant Sridharan
Prashant SridharanPrashant Sridharan
Prashant Sridharan
 
LF_APIStrat17_API Design in the Age of Bots, IoT, and Voice
LF_APIStrat17_API Design in the Age of Bots, IoT, and VoiceLF_APIStrat17_API Design in the Age of Bots, IoT, and Voice
LF_APIStrat17_API Design in the Age of Bots, IoT, and Voice
 
APIStrat 2017: API Design in the Age of Bots, IoT, and Voice
APIStrat 2017: API Design in the Age of Bots, IoT, and VoiceAPIStrat 2017: API Design in the Age of Bots, IoT, and Voice
APIStrat 2017: API Design in the Age of Bots, IoT, and Voice
 
Serverless Finland Meetup 16.11.2016: Messenger Bot Workshop
Serverless Finland Meetup 16.11.2016: Messenger Bot WorkshopServerless Finland Meetup 16.11.2016: Messenger Bot Workshop
Serverless Finland Meetup 16.11.2016: Messenger Bot Workshop
 
European SharePoint Conference 2018 - Build an intelligent application by con...
European SharePoint Conference 2018 - Build an intelligent application by con...European SharePoint Conference 2018 - Build an intelligent application by con...
European SharePoint Conference 2018 - Build an intelligent application by con...
 
Developing share point solutions with the microsoft graph
Developing share point solutions with the microsoft graphDeveloping share point solutions with the microsoft graph
Developing share point solutions with the microsoft graph
 
DEV-017_Azure Functions overview and under the hood
DEV-017_Azure Functions overview and under the hoodDEV-017_Azure Functions overview and under the hood
DEV-017_Azure Functions overview and under the hood
 
Opensocial Haifa Seminar - 2008.04.08
Opensocial Haifa Seminar - 2008.04.08Opensocial Haifa Seminar - 2008.04.08
Opensocial Haifa Seminar - 2008.04.08
 
Creating Professional Applications with the LinkedIn API
Creating Professional Applications with the LinkedIn APICreating Professional Applications with the LinkedIn API
Creating Professional Applications with the LinkedIn API
 
Microsoft Graph: Connect to essential data every app needs
Microsoft Graph: Connect to essential data every app needsMicrosoft Graph: Connect to essential data every app needs
Microsoft Graph: Connect to essential data every app needs
 

Mehr von Simona Cotin

Mehr von Simona Cotin (18)

Tips and tricks on how to stand out with your bio and talk abstract
Tips and tricks on how to stand out with your bio and talk abstractTips and tricks on how to stand out with your bio and talk abstract
Tips and tricks on how to stand out with your bio and talk abstract
 
Serverless at the end of the Universe
Serverless at the end of the UniverseServerless at the end of the Universe
Serverless at the end of the Universe
 
Tech Roadmap
Tech RoadmapTech Roadmap
Tech Roadmap
 
Pwa, are we there yet?!
Pwa, are we there yet?!Pwa, are we there yet?!
Pwa, are we there yet?!
 
Build Nodejs APIs using Serverless
Build Nodejs APIs  using Serverless Build Nodejs APIs  using Serverless
Build Nodejs APIs using Serverless
 
PWAs, are we there yet?!
PWAs, are we there yet?!PWAs, are we there yet?!
PWAs, are we there yet?!
 
Doppelganger - ng-conf
Doppelganger - ng-confDoppelganger - ng-conf
Doppelganger - ng-conf
 
Build a look alike engine with machine learning and Angular
Build a look alike engine with machine learning and AngularBuild a look alike engine with machine learning and Angular
Build a look alike engine with machine learning and Angular
 
Hop on the serverless adventure - International Javascript London
Hop on the serverless adventure - International Javascript LondonHop on the serverless adventure - International Javascript London
Hop on the serverless adventure - International Javascript London
 
Build progressive web apps with Angular
Build progressive web apps with AngularBuild progressive web apps with Angular
Build progressive web apps with Angular
 
State management with ngRX
State management with ngRXState management with ngRX
State management with ngRX
 
Deploy Angular to the Cloud (ngBucharest)
Deploy Angular to the Cloud (ngBucharest)Deploy Angular to the Cloud (ngBucharest)
Deploy Angular to the Cloud (ngBucharest)
 
Build and Deploy Angular to the Cloud
Build and Deploy Angular to the CloudBuild and Deploy Angular to the Cloud
Build and Deploy Angular to the Cloud
 
Serverless adventure tooling
Serverless adventure toolingServerless adventure tooling
Serverless adventure tooling
 
Code and Deploy Angular to the Cloud
Code and Deploy Angular to the CloudCode and Deploy Angular to the Cloud
Code and Deploy Angular to the Cloud
 
Deploy Angular to the Cloud
Deploy Angular to the CloudDeploy Angular to the Cloud
Deploy Angular to the Cloud
 
From Angular to React and back again
From Angular to React and back againFrom Angular to React and back again
From Angular to React and back again
 
Music Finder
Music FinderMusic Finder
Music Finder
 

Kürzlich hochgeladen

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Kürzlich hochgeladen (20)

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 

Build scalable APIs using GraphQL and Serverless

Hinweis der Redaktion

  1. The plot is this: Agnes here is looking at two pieces of tech apparently unrelated
  2. Turns out they do have a couple of things in common, they’re both on the hype train. Both GraphQL and Serverless are probably at the peak of their popularity where there’s literally a new community library probably created at this very moment.
  3. Another thing that they have in common is that they’re both extremely appealing to js developers. That’s not to say that they’re not being used by other types of developer, but in particular js developers ted to be excited about graphql because graphql changes the balance and empowers frontend developers to define their data needs without having to rely on the backend team. At the same time, serverless is also of great help to front end developers because it enables us to create small, reusable APIs for our static websites. As we’ve seen in Monica’s presentation, serverless can help us with a couple of things that browser don’t do. Things like storing secrets or
  4. Funnily enough, they both Both emerging at around the same time. Graphql was open sources as a specification in early 2015 and serverless late 2014.
  5. But there still one thing that connects them very strongly and this is what we’re going to spend time on discovering today
  6. You are probably familiar with the n+1 problem:when a request to load one item turns into n+1 requests since the item has n associated items. The term has been mainly described in the context of databases, specifically ORM where we lazy load child records, but it is in fact not confined to that. We can see this phenomenon elsewhere including web apis where we’re composing data from multiple endpoints or resources. This is also known as a Chatty API which is one of the UGLY aspects of REST APIs. A chatty API, is any API that requires consumer to do more than a single call to perform a single, common operation
  7. Why do we care about overfetching & under fetching so much? Well because they introduce a delay in our application. And our users perceive this delay in different ways depending on its length. Anything taking more than a second will prolly make our user context switch and more than 10 seconds abandon the task. And many roundtrips to the server add delay to our application, same as parsing data to filter out fields.
  8. https://hpbn.co/
  9. A single request
  10. Front end and backend teams sit together and define a contract that they’re going to communicate through; an interface between the two teams
  11. A strongly typed definition of all the operations that can be run against the API and their types
  12. A single request
  13. A single request
  14. A single request
  15. A single request
  16. A graphical interactive in-browser GraphQL IDE. Syntax highlighting Intelligent type ahead of fields, arguments, types, and more. Real-time error highlighting and reporting. Automatic query completion. Run and inspect query results.
  17. But the true power of serverless doesn’t come only from the custom code, it comes from how easy we can integrate with multiple datasources and 3rd party apis.
  18. To create a GraphQL backend for our API we use the graphql-js module that exports a core subset of GraphQL functionality for creation of type systems and servers. Our entry point is the graphql function which is capable of parsing, validating and executing a graphql request. It requires a schema and a request string but we can also send query variables and operation names as well as context object
  19. Choose a diff icon; one for cache
  20. Developer productivity
  21. Go build smith!
  22. Two pieces of tech apparently unrelated