You are on page 1of 90

SO YOU’RE

A SOF T WARE ENGINEER ,


N O W W H AT ?

P R E S E N T E D BY: U N D E R A R M O U R

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 1


INTRODUCTIONS

Conrad Stoll Matt Ruston Chris Peters

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 2


S TAT E D R I V E N
DE VE LOPME NT

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 3


MANAGING
CHANGE

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 4


CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
730+

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 9


HELP OUR USERS HIT THEIR FITNESS GOALS

UNTETHERED EXPERIENCE
PHONE-FREE RUNNING

WORKOUT RECORDING
PAUSING, RESUMING, AND SAVING
A WORKOUT IS DESIGNED
WITH THE ATHLETE IN MIND

WORKOUT SAVING
PREVENT ATHLETES FROM ACCIDENTAL DISCARDS

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 10


CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
S TAT E D R I V E N
DE VE LOPME NT

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 16


enum
Bool
var instanceVariable : Bool
var active : Bool
var contentLoaded : Bool
var dataLoaded : Bool
var editing : Bool
var enabled : Bool
var expanded : Bool
var handlingTouches : Bool
var hasTakenUserAction : Bool
var isCompleted : Bool
var isRunning : Bool
var lastTouchedButtonSide : Bool
var lastTouchedRightSide : Bool
var notified : Bool
var previewEnded : Bool
var saved : Bool
var started : Bool
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
Starting a Workout
func startWorkout() {
// ...
}
One Variable
var hasLoggedIn : Bool = false

func startWorkout() {
guard hasLoggedIn else {
return
}

// ...
}
Two Variables
var hasLoggedIn : Bool = false
var workoutInProgress : Bool = false

func startWorkout() {
guard hasLoggedIn && workoutInProgress == false else {
return
}

workoutInProgress = true

// ...
}
The Tangled Web of State
var hasLoggedIn : Bool = false
var workoutInProgress : Bool = false
var savingWorkout : Bool = false

func stopWorkout() {
workoutInProgress = false
savingWorkout = true

saveWorkout { (success) in
self.savingWorkout = false
}
}
The Tangled Web of State
var hasLoggedIn : Bool = false
var workoutInProgress : Bool = false
var savingWorkout : Bool = false

func startWorkout() {
guard hasLoggedIn && workoutInProgress == false && !savingWorkout else {
return
}

workoutInProgress = true

// ...
}
The user CANNOT start a workout:
- Hasn't logged into the app yet
- In the middle of a workout
- Saving the last workout
The user CAN start a workout:
- Ready to start workout
Valid Boolean States
User Not Logged In, No Workout, Not Saving
User Logged In, No Workout, Not Saving
User Logged In, Workout In Progress, Workout Not Saving
User Logged In, No Workout, Workout Is Saving
var hasLoggedIn : Bool
var workoutInProgress : Bool
var savingWorkout : Bool
Invalid Boolean States
User Not Logged In, Workout In Progress, Not Saving
User Not Logged In, Workout In Progress, Workout Is Saving
User Not Logged In, No Workout, Workout Is Saving
User Logged In, Workout In Progress, Workout Is Saving
var hasLoggedIn : Bool
var workoutInProgress : Bool
var savingWorkout : Bool
Perfect case for an enum
- Hasn't logged into the app yet
- In the middle of a workout
- Saving the last workout
- Ready to start workout
enum WorkoutApplicationLifecycle {
case notLoggedIn
case workoutInProgress
case savingLastWorkout
case readyToStart
}
Enums make invalid states
impossible to represent!
Converting to Enums
var hasLoggedIn : Bool = false
var workoutInProgress : Bool = false
var savingWorkout : Bool = false

func startWorkout() {
guard hasLoggedIn && workoutInProgress == false && !savingWorkout else {
return
}

workoutInProgress = true

// ...
}
var lifecycle : WorkoutApplicationLifecycle = .notLoggedIn

func startWorkout() {

// Equivalent
guard .readyToStart == lifecycle else {
return
}

// Pattern Matching
guard case .readyToStart = lifecycle else {
return
}

lifecycle = .workoutInProgress

// ...
}
Extending enums with
variables and functions
enum WorkoutApplicationLifecycle {
case notLoggedIn
case workoutInProgress
case savingLastWorkout
case readyToStart

var canStartWorkout : Bool {


get {
switch self {
case .notLoggedIn:
return false
case .workoutInProgress:
return false
case .savingLastWorkout:
return false
case .readyToStart:
return true
}
}
}
}
Simplified for multiple cases
enum WorkoutApplicationLifecycle {
case notLoggedIn
case workoutInProgress
case savingLastWorkout
case readyToStart

var canStartWorkout : Bool {


get {
switch self {
case .notLoggedIn, .workoutInProgress, .savingLastWorkout:
return false
case .readyToStart:
return true
}
}
}
}
Simplified using fallthrough
enum WorkoutApplicationLifecycle {
case notLoggedIn
case workoutInProgress
case savingLastWorkout
case readyToStart

var canStartWorkout : Bool {


get {
switch self {
case .notLoggedIn: fallthrough
case .workoutInProgress: fallthrough
case .savingLastWorkout:
return false
case .readyToStart:
return true
}
}
}
}
default Danger!
enum WorkoutApplicationLifecycle {
case notLoggedIn
case workoutInProgress
case savingLastWorkout
case readyToStart

var canStartWorkout : Bool {


get {
switch self {
case .readyToStart:
return true
default:
return false
}
}
}
}
Enums describing the behavior
var lifecycle : WorkoutApplicationLifecycle = .notLoggedIn

func startWorkout() {
guard lifecycle.canStartWorkout else {
return
}

lifecycle = .workoutInProgress

// ...
}
Enums describing the behavior
var lifecycle : WorkoutApplicationLifecycle = .notLoggedIn

func stopWorkout() {
lifecycle = .savingLastWorkout

saveWorkout { (success) in
self.lifecycle = .readyToStart
}
}
Workout Activity Types
Running, Cycling, Swimming
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC.
Workout Activity Type Methods
- activityName
- imageForActivity
- visibleStatsForActivity
- supportsGPS
- waterLockEnabled
if activityType == .running ||
activityType == .walking {

gpsProvider.start()
}

if activityType == .running ||
activityType == .walking {

gpsProvider.stop()
}
if activityType == .running ||
activityType == .walking ||
activityType == .hiking {

gpsProvider.start()
}

if activityType == .running ||
activityType == .walking {

gpsProvider.stop()
}
if activityType.supportsGPS {
gpsProvider.start()
}

if activityType.supportsGPS {
gpsProvider.stop()
}
B E WA R E B O O L E A N
S TAT E VA R I A B L E S !

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 51


CROSS TEAM
C O L L A B O R AT I O N

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 52


MAT T RUSTON

• Graduated from UT May 2018


• iOS Intern at Mutual Mobile in 2015
• iOS Intern at Under Armour during 2016
and 2017 before starting full time.

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 53


BEING A ROOKIE

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 54


EMAIL VERIFICATION
CONCERNS

• Needs to work for all UA apps.


• A legacy system already exists (But only for one app).
• How do we handle users veri!ed in the old system.
• How do we account for users on older versions.
• How do we handle users in weird states
• Some users have multiple emails??

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 56


CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 57
IDM Backend
Legal
Customer Happiness
Run Design
MFP iOS
Run iOS

MFP Web
Marketing
FS Client Team

Run Android
MFP Android

Security
MFP Product

Run Product MFP Design

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 58


FROM ONE TO ZERO
TA K E AWAYS

Meet with others frequently.

Track code changes with concise tickets.

Document everything (code too!).

Be !exible to change.

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 60


W H AT ’ S A C A R E E R
PAT H ?

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 61


WHO IS THIS?

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 62


GOAL: Help you make better
future career choices by
providing early insight into
Engineering Career Paths

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 63


OVERVIEW

High-Level explanation of all di"erent roles


• Engineer
• Engineering Manager
• Technical Sta" Engineer

Deeper-dive into each role


• De#nition
• Di"erent levels
• Explanations for progression
• Real-world examples

Takeaways and further reading

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 64


CAREER PATH

Chief
Vice Senior
Technical
President Engineer
Officer

Mid-level Principal
Director
Engineer Engineer

Junior Lead
Manager
Engineer Engineer

Engineering Manager Engineer Technical Staff Engineer

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 65


Engineer
WHAT ’S AN ENGINEER’S RESPONSIBILITIES?

Actual development and operations


• Writing new features, #xing bugs, refactoring code, proof
of concepts, etc
• Triaging incoming bugs
• Monitoring systems and releasing software

Collaborate with peers


• Code reviews
• Writing/reviewing technical docs
• Presenting to co-workers occasionally

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 67


WHAT ’S AN ENGINEER’S PROGRESSION?

Junior -> Mid -> Senior


Engineer
Senior

2-6 years between


Mid-level
levels (mileage may Engineer
vary)

“Stop” at Senior Junior


Engineer Engineer

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 68


AN ENGINEER’S EXPECTATIONS TO PROGRESS?

You operate with more autonomy and less


oversight

You are able to mentor more junior engineers

You are accountable for getting more stu"


done

You are demonstrating more thought-


leadership
CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 69
EX AMPLE: ACCOUNTABILIT Y

Follow-through on commitments

How do you handle adversity/ambiguity?

“I did what I was told” vs “I think we might be


missing some detail”

Being predictable

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 70


EXAMPLE: LEADERSHIP

Leadership does not have to be all-


encompassing

“Everyone must be a leader! No room for


followers!”

Pick a few areas to lead (i.e. a project,


optimizing tests, improving debug tools, etc)

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 71


Engineering Manager
AN ENG MANAGER’S RESPONSIBILITIES?

Design teams and coach them to success


• Hiring, job descriptions, interviewing
• Assign projects/tasks that align with career goals
• Be present

Set clear goals for teams and operational guidelines


• Articulate goals that push the team
• Process for delivery or releasing (i.e. Agile, etc)
• A framework for failure

Remove friction and grow teammates


• Clear roadblocks
• Provide feedback and delegate appropriately

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 73


AN ENG MANAGER’S PROGRESSION?

Manager (team of Vice


President
Engineers)

Director (team of
Managers) Director

Vice President
(team of Directors)
Manager

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 74


ENG MANAGER’S EXPECTATIONS TO PROGRESS?

Increase in scope, both in terms of business


impact and teammates

Make more di$cult decisions and resolve


larger con!icts

More accountability, visibility, and leadership

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 75


EXAMPLE: COACHING

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 76


EX AMPLE: DELEGATION

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 77


Technical Staff
Engineer*
TECH STAFF ENGINEER’S RESPONSIBILITIES?

Responsible for making or influencing technical strategy


• Which library should we use for networking calls?
• Is it better to ‘build' or better to ‘buy’ a solution
• Selling those ideas to the team(s)

Architecting/designing larger, more complex systems


• Still get hands dirty, but only to gain more insight on a
solution
• Teach teammates to implement the architecture

Inspiring the team(s) and removing friction


• Finding ways to scale or accelerate a team without you
• Communicate and evangelize your #ndings

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 79


TECH STAFF ENGINEER’S PROGRESSION?

Lead Engineer Chief


Technical
(within a team) Officer

Principal Engineer
Principal
(across multiple Engineer
teams)

CTO (across all Lead


teams) Engineer

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 80


TECH STAFF ENGINEER’S EXPECTATIONS?

Increase in scope, both in terms of business


impact and teammates

Make more di$cult decisions and resolve


larger con!icts

More accountability, visibility, and leadership

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 81


EX AMPLE: COLL ABOR ATION/COMMUNICATION

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 82


EXAMPLE: AUTHORITY VS INFLUENCE

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 83


Takeaways
K E Y TA K E AWAYS

Plenty of time to plan your career! (plus it


changes often)

Managers and Technical Sta" are not terribly


di"erent in expectations

If these concepts were new, take a little more


time to understand to bene#t future career

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 85


Further Reading
FURTHER READING

"The Manager’s Path” by Camille Fournier

“How to Win Friends and In!uence People” by


Dale Carnegie

Rands in Repose - http://randsinrepose.com

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 87


QUESTIONS?

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 88


SUMMER ROOKIE

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 89


c p e t e r s @ u n d e r a r m o u r. c o m
c s t o l l @ u n d e r a r m o u r. c o m
m r u s t o n @ u n d e r a r m o u r. c o m

CONFIDENTIAL & BUSINESS PROPRIETARY INFORMATION OF UNDER ARMOUR, INC. 90