Todd McKinnon SVP Development Salesforce.com October, 2007 Plug Your Code in Here An Internet...

25
Todd McKinnon SVP Development Salesforce.com October, 2007 Plug Your Code in Here An Internet Application Platform

Transcript of Todd McKinnon SVP Development Salesforce.com October, 2007 Plug Your Code in Here An Internet...

Todd McKinnonSVP DevelopmentSalesforce.comOctober, 2007

Plug Your Code in HereAn Internet Application Platform

Safe Harbor Statement

“Safe harbor” statement under the Private Securities Litigation Reform Act of 1995: This press release contains forward-looking statements including but not limited to statements regarding our expected future revenue, GAAP diluted earnings per share, expected tax rate, anticipated shares outstanding,and concerning the potential market for our existing service offerings. All of our forward looking statements involve risks, uncertainties and assumptions. If any such risks or uncertainties materialize or if any of the assumptions proves incorrect, our results could differ materially from the results expressed or implied by the forward-looking statements we make.

The risks and uncertainties referred to above include - but are not limited to - risks associated with possible fluctuations in our operating results and cash flows, rate of growth and anticipated revenue run rate, errors, interruptions or delays in our service or our Web hosting, our new business model, our history of operating losses, the possibility that we will not remain profitable, breach of our security measures, the emerging market in which we operate, our relatively limited operating history, our ability to hire, retain and motivate our employees and manage our growth, competition, our ability to continue to release and gain customer acceptance of new and improved versions of our service, customer and partner acceptance of the AppExchange, successful customer deployment and utilization of our services, unanticipated changes in our effective tax rate, fluctuations in the number of shares outstanding, the price of such shares, foreign currency exchange rates and interest rates.

Further information on these and other factors that could affect our financial results is included in the reports on Forms 10-K, 10-Q and 8-K and in other filings we make with the Securities and Exchange Commission from time to time, including our Form 10-K for the fiscal year ended January 31, 2007. These documents are available on the SEC Filings section of the Investor Information section of our website at www.salesforce.com/investor. Salesforce.com, inc. assumes no obligation and does not intend to update these forward-looking statements, except as required by law.

QuickTime™ and a decompressor

are needed to see this picture.

Company Overview

• 35,300 Successful Customers

• 900,000 Subscribers

• >$700M revenue run rate*

• NYSE: CRM

• Founded 1999, HQ San Francisco, CA

• 2400+ Employees; 40 Offices; 20 Countries

• 24 Generations of Product Innovation

• <1% Customer Attrition

June 25, 2007

2001 2008200720062005200420032002

Fiscal Year

35,300CustomersGrowth in Customers

* Run rate based on FY08 Q2 reported results

The Two Pillars of Our Product Strategy

1 2The world’s most popular family of killer applications

The world’s first platform as a service

Proven Scalability and PerformanceDelivering 100 Million Transactions Daily

0.0

1.0

2.0

3.0

4.0

5.0

6.0

7.0

8.0

Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2

0

250

500

750

1,000

1,250

Page Response Time (ms)

Quarterly Transactions

(billions)

2005 2006 2007

Fiscal Year

88 oracle instances

139,000139,000 virtual databases (orgs)

1,046,0001,046,000 users

35,00035,000 customers

2020 standard objects,1.41.4 billion rows

176,000176,000 custom

objects,.35.35 billion rows

peak hour, 8:008:00 am

2250 2250 requests per second

35,00035,000 SQL execs per second

Internet Scale

Salesforce.com’s Mission: Innovation Driver

Become the trusted standard for managing all business information on demand

On-Demand

21st Century Platforms

Client/Server

Late 20th

Century Platforms

Mainframe

Mid 20th

Century Platforms

Platform Stack

J2SE, SOAP, JSFUI, Api, Batch, Analytics

Distributed Metadata, UDD, Cache, Resources

Har

dwar

e Lo

ad B

alan

cer

(sta

tele

ss)

Apex Virtual MachineVisualForce (JSF)

Session Cookie,In-process edits

Other Pods

Shared File System

Search Servers

Oracle RAC

Mirroring / Disaster

Recovery

1 PodAppServers(single code base)

DeclarativeDeclarative

ProceduralProcedural

APIAPI

Full Professional Development Stack

DatabaseDatabase On-demand virtualization, Scalable, Self-Optimizing

Formulas, Workflow, Analytics, Role-based Sharing

Inbound and Outbound Web services

Apex On Demand Language, MVC Framework, Governed

AppServerAppServer Requests, Access Controls, Caching, Monitoring, Localization

TeamsTeams Tools, SCCS, Required Testing and Code Coverage

DeploymentDeployment Install, Upgrade, Version, Deprecate, Feedback, Sell, Bill

Create any table

Add any field

Build any relationship

Security & sharing

Automatic audit history tracking

Automatic tuning

Automatic backups

Automatic upgrades

139,000 logical databases

Possible with physical db’s?

Create Any Database

A simple multi-tenant table

Organization_id Account_id name (data

fields…)

modstamp (standard

fields…)

org1 001…1

org1 001…2

org1 001…3

… 001…4

org2 001…5

org2 001…6

org2 001…7

001…8

001…9

Account Standard Entity

•Hash partitioned by organization_id

•All indexes lead with organization_id (compressed, partitioned, local)

•Smart primary keys (key prefix)

•Standard audit fields and triggers

A multi-tenant polymorphic table – custom fields

Organization_id Key_prefix Id Name,

(Others)

Val0 Val1 … ValN

org1 a01 a01…1

org1 a01 a01…2

org1 a02 a02…1

org1 a02 a02…2

org2 a01 a01…3

org2 a01 a01…4

org2 a02 a02…3

Custom Objects

•Key_prefix subsetting

•Still partitioning by organization_id

•Smart primary keys (key prefix)

•Re-use across organizations

•GUID primary keys

•ValN flex fields

A multi-tenant Custom Index

Organization_id Key_prefix Id Column

#

String Num Date

org1 a01 a01…1 2 “hello” 11 10-2-07

org1 a01 a01…2 32 “my 41 2-8-04

org1 a02 a02…1 12 “index” 22 1-19-88

org1 a02 a02…2 34 “me” 1345 4-8-55

org2 a01 a01…3 27 “please” 22 4-1-07

org2 a01 a01…4

org2 a02 a02…3

Custom Index

•Writing index

•Org_id, entity id, col # (unique)

•Reading index

•Org_id, key_prefix, col #, <Stinrg | number | Date> , id

Magic multi-tenant generic data modeling

core.name_denorm– Single table with the name of all entities

core.seach_name_lookup– Single table with all pivoted name components (for search)

core.custom_index_value (and custom_unique_value)– Pivoted, de-normalized physical indexes (native data types)

core.custom_foreign_value– Reverse lookups for any foreign key

core.clob_data– Pivoted clob values, maintained efficiently

Multi-tenant Optimization

Your Company

Your Division

Your Customizations

Query Optimization

Engine

1

Your Sharing ModelOracle CBO

Multi-tenant statistics

Application semantics (E.g. sharing model)

Knowledge of mult-tenant data structures

CEO

VP Sales VP MarketingVP Customer

ServiceCOO

VP Professional Services

Director Sales West

Director Sales East

Director Customer Service

Director Support East Services West Services

CEO

VP Sales VP MarketingVP Customer

ServiceCOO

VP Professional Services

Director Sales West

Director Sales East

Director Customer Service

Director Support East Services West Services

CEO

VP Sales VP MarketingVP Customer

ServiceCOO

VP Professional Services

Director Sales West

Director Sales EastDirector Customer

ServiceDirector Support East Services West Services

CEO

VP Sales VP MarketingVP Customer

ServiceCOO

VP Professional Services

Director Sales West

Director Sales EastDirector Customer

ServiceDirector Support East Services West Services

2

3

4Query hinting and re-

write

Pre-query selective filters

Optimized Response

Optimizer example: Entity v Boss v “Peon”

For a given query, at least 3 possible plans– Entity driven filter: standard or custom index (join) driven

– Peon driven sharing: use nested loop sharing-driven (2 joins) plan

– Boss plan: use hashing sharing plan (hash semi-joins)

Statistics we must track– Size of the entity for the organization

– Approximate visibility by user to this entity

– Statistics of various field fields (custom indexes)• For domain fields: which values are high-cardinality?

• If we don’t know, pre-query with ROWNUM

SELECT name FROM Account WHERE Status = ‘Red’

Data validation

Formula fields and summaries

State Machine workflows

Multi-Step approvals

Automatic email approvals

Audit history tracking

100% automatic upgrades

Declarative versus ProceduralBusiness users can get a lot done without coding

• Transactional Logic, over a Web Service

• Stored Procedures, Triggers

• Reliable DML Upgrade Scripts

• Executing on our Servers

• Must protect the site

• Strongly typed

• Persist schema references

• Much more natural than JDBC

• Preserved through Upgrades

• Code Coverage and Testing built-in

• Web Service Exposure (In and Out)

Real Apps Require Procedural CodeThe case for Apex (384,000 lines and growing)

But why a new language?

We considered the alternatives– Java? (JDBC is a lousy interface for this)

– JavaScript (Rhino)? Other scripting language? (not db focused)

– Existing stored procedure languages? (ugly)

Advantages of writing our own– We control the syntax: deep salesforce.com integration

• Our idioms, our schema binding, our ecosystem

– We control the runtime: control resources and coding behavior

– We can ease the transition: looks like Java, acts like Pl/Sql

– It’s not that hard to do: Java VM makes a great VM container

But we have a high bar to match…– Modern language features, modern IDE’s

Metadata

Multi-Tenant Application Code BaseApex Multi-version Virtual Machine

Yo

ur C

od

e

Ou

rIn

fras

truc

ture

Java-like syntax

Strongly typed

Transactional

Object Oriented

Collections

Database-focused

Schema Aware

Governed

Secured

Testing

Apex Code example

Apex Run Time: Code Governors

Type Restriction

Data Access Total SOQL Statements (force Bulk)

Number of rows retrieved

Data Modification Total DML (insert, update, etc) Statements

Number of rows modified

Transactions, Other Resources

Transaction control Statements

Outbound Calls, Emails sent

Statements Total statements issued (loops, etc)

Apex Code “Big Brother” Best Practices

Governor limits enforce efficient coding styles– No SOQL inside of a for loop

Required functional testing– Built into the language

– Coming soon: requirement to test in bulk

Required code coverage– Inability to deploy to production without it

Higher bar for 3rd ISV’s than IT developers

We can (almost) prove that our releases won’t break

production applications

Areas of Active work and research

Next level of expressiveness across the platform– Richer semantics for virtual schema design, SOQL and Apex

– Provide a custom scheduler, flesh out VisualForce components

– Complete the on-demand development tools• Debugger: what to do about transactions?

Managed code correctness– Deadlock detection best practices

– Dynamic-SOQL and reflection in Apex

Operational next generation architecture– Oracle 10g, 11g, much cheaper Pods, cheaper storage, high-latency

data center communication

– Database replication, zero-down time releases (Call Centers)