91
Welcome. @JeremyLikness

Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Welcome.

@JeremyLikness

Page 2: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Congratulations for 12 Awesome Years!

@JeremyLikness

Page 3: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

CodeStock: Looking Back

@JeremyLikness

Page 4: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

July 24, 2008

@JeremyLikness

Page 5: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

July 24, 2008 Co-founder of a company I worked for

Page 6: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Topics in 2008

WCFSQL

ServerXNA

ASP.NET MVC

AJAX WPF LINQOpen

Source

@JeremyLikness

Page 7: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Topics in 2019

WCF

RESTSQL Server

XNA

Unity

ASP.NET MVC

AJAX

SPA Apps

WPF

(.NET Core 3)LINQ Open Source

@JeremyLikness

Page 8: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

My Journey to this Keynote

Page 9: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

June 2010

@JeremyLikness

Page 10: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

June 2010

@JeremyLikness

Page 11: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Personal Timeline …

2010: Silverlight and MEF2011: Silverlight 5 for

Business2012: MVVM

2014: Zone.js (Angular)2016: Angular 2 and

TypeScript

2016: Agile DevOps with Visual Studio Online

Visual Studio Team Services

Azure DevOps

@JeremyLikness

Page 12: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

The four stages of acceptance…

@JeremyLikness

Page 13: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

“Computer Man”

Page 14: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

“The Early Years”

@JeremyLikness

👨‍🚀

👨‍💻

💁‍♂️ 🌮 👔 🚗

👨🏽‍🎓

📕🎱

👂🏻🗣🖨👨‍💻

💰✔️

¿Cuál es su número de póliza?

Page 15: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

“The Early Years”

@JeremyLikness

👨‍💻

💰✔️

1994

Page 16: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

But what happened in between?

Page 17: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 18: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 19: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 20: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 21: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Xaml

@JeremyLikness

Page 22: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 23: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

The Boss of My Boss!

Page 24: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 25: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

https://bit.ly/a-tale-of-short-links

Page 26: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

A Cloud Advocate …

@JeremyLikness

Community

• Meet developers where you are: in person, online, through OSS projects and more

Content

• Create and curate content that empowers you to be successful and achieve more

Connect

• Engage with engineering to close the feedback loop, both to you and from your projects

Page 27: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

How do we measure and

forecast?

@JeremyLikness

Page 28: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 29: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

UI Design © 2019 Jeremy Likness. All

Rights Reserved.As If.

Page 30: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Data(base)

@JeremyLikness

Page 31: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 32: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Let’s break that down …

@JeremyLikness

10 MB = $3,495

My laptop has 1 TB

1 TB / 10 MB = 1000000 MB / 10 MB = 100,000

100,000 x $3,495 = $349,500,000 for storage!

Page 33: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Database Design

@JeremyLikness

Page 34: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

The Query

@JeremyLikness

Page 35: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

RelationalDatabase

OR

M

Object

Object

Disconnect: Relational vs. Domain

@JeremyLikness

Page 36: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Challenges

Schema changes

1

@JeremyLikness

Page 37: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Challenges

Schema changes

1

Complicated joins

2

@JeremyLikness

Page 38: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Challenges

Schema changes

1

Complicated joins

2

High volume inserts (referential integrity)

3

@JeremyLikness

Page 39: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Challenges

Schema changes

1

Complicated joins

2

High volume inserts

(referential integrity)

3

Overall cost of the solution

4

@JeremyLikness

Page 40: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Have you ever …

• Created a table named metadata and populated it with columns that have names like:• Column_name

• Column_type

• Column_string_value

• Column_integer_value

• Stuffed XML, JSON, or other miscellaneous data into a large nvarchar(max)?

• Better yet, used the XML/JSON field types and tried to write a query over them?

@JeremyLikness

Page 41: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Introducing Not Only SQL: NoSQL

Key/Value Column

Document Graph

🗝

📄

🌴

🖇

Page 42: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

🗝

Page 43: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

🗝

Page 44: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

🗝

Page 45: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

// strategy to insert the new short url entryasync Task saveEntryAsync(TableEntity entry){

var operation = TableOperation.Insert(entry);var operationResult = await tableOut.ExecuteAsync(operation);

}

// code to retrieve an entryTableOperation operation = TableOperation.Retrieve<ShortUrl>(partitionKey, shortUrl);var result = await inputTable.ExecuteAsync(operation);

🗝

Page 46: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

// strategy to insert the new short url entryasync Task saveEntryAsync(TableEntity entry){

var operation = TableOperation.Insert(entry);var operationResult = await tableOut.ExecuteAsync(operation);

}

// code to retrieve an entryTableOperation operation = TableOperation.Retrieve<ShortUrl>(partitionKey, shortUrl);var result = await inputTable.ExecuteAsync(operation);

🗝

Page 47: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

{"id": "7fd95a1b-be2e-4f29-8864-f1d103f55128","page": "docs.microsoft.com/azure","count": 1,"timestamp": "2017-10-09T17:46:34","presentation": 1,"_rid": "GzYTAO2ucgACAAAAAAAAAA==","_self": "dbs/GzYTAA==/colls/GzYTAO2ucgA=/docs/GzYTAO2ucgACAAAAAAAAAA==/","_etag": "\"0100b23d-0000-0000-0000-59dcd6d50000\"","_attachments": "attachments/","_ts": 1507645141

}

📄

Page 48: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

{"id": "66369385-56bb-4646-adcc-8ea965633177","page": "codestock.org","shortUrl": "E2Y","campaign": "codestock","agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36","browser": "Chrome","browserVersion": "71","browserWithVersion": "Chrome 71","desktop": 1,"platform": "Windows","platformVersion": "10","platformWithVersion": "Windows 10","count": 1,"timestamp": "2019-02-04T18:53:25","host": "codestock.org","presentation": 1,"_rid": "GzYTAO2ucgAJNgQAAAAAAA==","_self": "dbs/GzYTAA==/colls/GzYTAO2ucgA=/docs/GzYTAO2ucgAJNgQAAAAAAA==/","_etag": "\"0200ab72-0000-0000-0000-5c588a2a0000\"","_attachments": "attachments/","_ts": 1549306410

}

📄

Page 49: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

doc = new ExpandoObject();doc.id = Guid.NewGuid().ToString();doc.page = page.TrimEnd(normalize);if(!string.IsNullOrWhiteSpace(parsed.ShortUrl)){

doc.shortUrl = parsed.ShortUrl;}if (!string.IsNullOrWhiteSpace(campaign)){

doc.campaign = campaign;}

📄

Page 50: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

📄

Page 51: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 52: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 53: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 54: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 55: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Top 10 Clicked Links (all mediums)

@JeremyLikness

(3 D’s of Modern Web Development video)

(serverless eBook)

Page 56: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Compute(r)

@JeremyLikness

Page 57: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 58: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 59: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Commodore 64 Features …

@JeremyLikness

64 kilobytes of memory (I have 250,000 times more now)

2 MHz speed … or ~ 1 MHz when you factor in graphics (I now run 2,600 times faster)

BASIC language built-in to ROM image

Disk Operating System (LoadStar) built-in

16 colors … or so they claimed

3 voice synthesized sound

Page 60: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

I learned performance on a Commodore 64.

@JeremyLikness

•256 vs. 18,446,744,073,709,551,615 (quintillions)8 bits vs. 64 bits

•Let 64 KB = distance to moon

•Let 9 billion miles = distance to the edge of the solar system

•64 gigabytes would get you from Earth to the edge of the solar system and back 13 times

64 kilobytes memory vs. 64 gigabytes

•If one operation on a 2.60 GHz machine takes 1 second, the same operation will take over 40 minutes on a Commodore 64

1.023 MHz vs 2.60 GHz

Page 61: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 62: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

The Z-Machine: one of the world’s first widely used virtual machines

Page 63: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

1976

•Will Crowther writes Adventureon a PDP-10 mainframe

By Retro-Computing Society of Rhode Island - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=5168552

Page 64: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

1976

• Will Crowther writes Adventure on a PDP-10 mainframe

1977

• Tim Anderson, Marc Blank, Bruce Daniels, and Dave Lebling finish writing Zork using MDL on a DEC PDP-10

• (Briefly renamed to Dungeon, the D&D lawyers prompted a quick return back to Zork)

Page 65: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

1976

• Will Crowther writes Adventure on a PDP-10 mainframe

1977

• Tim Anderson, Marc Blank, Bruce Daniels, and Dave Lebling finish writing Zork using MDL on a DEC PDP-10

• (Briefly renamed to Dungeon, the D&D lawyers prompted a quick return back to Zork)

1979

• The Z-machine specification is written on a coffee table in Pittsburgh. It has virtual memory and the ability to save and restore state. It runs Zork Implementation Language (ZIL).

Page 66: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

1976

•Will Crowther writes Adventure on a PDP-10 mainframe

1977

•Tim Anderson, Marc Blank, Bruce Daniels, and Dave Lebling finish writing Zork using MDL on a DEC PDP-10

• (Briefly renamed to Dungeon, the D&D lawyers prompted a quick return back to Zork)

1979

•The Z-machine specification is written on a coffee table in Pittsburgh. It has virtual memory and the ability to save and restore state. It runs Zork Implementation Language (ZIL).

1980

•Zork is published by Infocom as first part in a 3-part series and ported to PDP-11, TRS-80, Apple II, Commodore 64, CP/M, IBM PC

Page 67: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

1976

• Will Crowther writes Adventure on a PDP-10 mainframe

1977

• Tim Anderson, Marc Blank, Bruce Daniels, and Dave Lebling finish writing Zork using MDL on a DEC PDP-10

• (Briefly renamed to Dungeon, the D&D lawyers prompted a quick return back to Zork)

1979

• The Z-machine specification is written on a coffee table in Pittsburgh. It has virtual memory and the ability to save and restore state. It runs ZorkImplementation Language (ZIL).

1980

• Zork is published by Infocom as first part in a 3-part series and ported to PDP-11, TRS-80, Apple II, Commodore 64, CP/M, IBM PC

1997

• The Z-machine specification version 1.0 is published

Page 68: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 69: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 70: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 71: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

What if I could just write the code that matters … and not worry about the rest?

@cecilphillip

Page 72: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

What about … Serverless?!

Page 73: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

[FunctionName(name: "Go")]public static async Task<HttpResponseMessage> Go([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "Go/{shortUrl}")]HttpRequestMessage req,

[Table("urls")]CloudTable inputTable,string shortUrl,[Queue(queueName: "counts")]IAsyncCollector<string> queue,ILogger log)

{if (string.IsNullOrWhiteSpace(shortUrl)){

return req.CreateResponse(HttpStatusCode.BadRequest);}

shortUrl = shortUrl.ToUpper();var operation = TableOperation.Retrieve<UrlData>(shortUrl[0].ToString(), shortUrl);var result = await inputTable.ExecuteAsync(operation);

var url = data.Url;await queue.AddAsync(data.RowKey);

var response = req.CreateResponse(HttpStatusCode.Redirect);response.Headers.Add("Location", url);return response;

}

No website to configure.No web app to write.

Instant database access

Route is parsed for me

Queue is created automatically.

So much code to add an item to the queue!

Page 74: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

[FunctionName("ProcessCounts")]public static async Task ProcessQueue(

[QueueTrigger("counts")]string shortCode,[Table("urls")]CloudTable inputTable,ILogger log)

{var operation = TableOperation.Retrieve<UrlData>(

shortCode[0].ToString(), shortCode);var result = await inputTable.ExecuteAsync(operation);if (result != null && result.Result is UrlData data){

data.Count++;operation = TableOperation.Replace(data);await inputTable.ExecuteAsync(operation);

}}

This is literally all the code needed to listen to a queue and get passed information when something is placed

on it

Updates without excess ritual or ceremony

Page 75: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

What about Scale?

@JeremyLikness

Page 76: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 77: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Now for some Twitter integration …

@JeremyLikness

// You need to set your own keys and screen name var oAuthConsumerKey = "superSecretKey"; var oAuthConsumerSecret = "superSecretSecret"; varoAuthUrl = "https://api.twitter.com/oauth2/token"; var screenname = "aScreenName"; // Do the Authenticate var authHeaderFormat = "Basic {0}"; varauthHeader = string.Format(authHeaderFormat, Convert.ToBase64String(Encoding.UTF8.GetBytes(Uri.EscapeDataString(oAuthConsumerKey) + ":" + Uri.EscapeDataString((oAuthConsumerSecret))) )); var postBody = "grant_type=client_credentials"; HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(oAuthUrl); authRequest.Headers.Add("Authorization", authHeader); authRequest.Method = "POST"; authRequest.ContentType = "application/x-www-form-urlencoded;charset=UTF-8"; authRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; using (Stream stream = authRequest.GetRequestStream()) { byte[] content = ASCIIEncoding.ASCII.GetBytes(postBody); stream.Write(content, 0, content.Length); } authRequest.Headers.Add("Accept-Encoding", "gzip"); WebResponse authResponse = authRequest.GetResponse(); // deserialize into an object TwitAuthenticateResponse twitAuthResponse; using (authResponse) { using (var reader = new StreamReader(authResponse.GetResponseStream())) { JavaScriptSerializer js = new JavaScriptSerializer(); varobjectText = reader.ReadToEnd(); twitAuthResponse = JsonConvert.DeserializeObject<TwitAuthenticateResponse>(objectText); } } // Do the timelinevar timelineFormat = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name={0}&include_rts=1&exclude_replies=1&count=5"; vartimelineUrl = string.Format(timelineFormat, screenname); HttpWebRequest timeLineRequest = (HttpWebRequest)WebRequest.Create(timelineUrl); var timelineHeaderFormat = "{0} {1}"; timeLineRequest.Headers.Add("Authorization", string.Format(timelineHeaderFormat, twitAuthResponse.token_type, twitAuthResponse.access_token)); timeLineRequest.Method = "Get"; WebResponse timeLineResponse = timeLineRequest.GetResponse(); var timeLineJson = string.Empty; using (timeLineResponse) { using (var reader = newStreamReader(timeLineResponse.GetResponseStream())) { timeLineJson = reader.ReadToEnd(); } } public class TwitAuthenticateResponse { public stringtoken_type { get; set; } public string access_token { get; set; } }

Page 78: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Is there a better way?

@JeremyLikness

Page 79: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 80: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 81: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Top Three Tweets (based on clicks)

@JeremyLikness

Page 82: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

What About the Front End?

Page 83: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Vue.js to the Rescue

@JeremyLikness

Single Page (Really)

Simple JavaScript

No Build or Packaging Required

Let’s be honest. I didn’t really even need a

framework. HTML5/CSS/JS for the

win!

Page 84: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

@JeremyLikness

Page 85: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Your Browser as an OS?

• AssemblyScript

• Blazor (C#)

• C++

• Go

• Python

• Rust

@JeremyLikness

ShamelessPlug

WebAssembly

Page 86: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Stepping Back…

@JeremyLikness

Page 87: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Serverless Link Shortener

ShortenURL Insert

Redirect Enqueue

Insert

Query

UpdateTwitter

Update

@JeremyLikness

💰 $0.75💰 $1.40

💰 $0.60

💰 $25.00

Page 88: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

What did I learn?

•☁ It’s possible to build a cloud app on a shoe string budget

•🤝🏻 Relational databases aren’t the solution for everything

•✅ It’s OK to have multiple data stores that fit your needs

•👨🏻‍💻 Today it’s more possible than ever before to focus more on code and less on servers *cough* serverless *cough*

•🗣What I think people want to hear is irrelevant. Data is honest.

@JeremyLikness

Page 89: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Technology is growing faster than ever

… but you have a strategy to stay on top of it

@JeremyLikness

Page 90: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

“Life is like going up the down escalator. If you stand still, you fall behind.” – yeah, I quoted me

Page 91: Welcome. [jlikme.blob.core.windows.net]I learned performance on a Commodore 64. @JeremyLikness 8 bits vs. 64 bits •256 vs. 18,446,744,073,709,551,615 (quintillions) •Let 64 K =

Thank you.

@JeremyLikness

Visit my blog: https://jlik.me/fa8(of course I had to use a short link)

Serverless: https://jlik.me/fme