SlideShare a Scribd company logo
MINIMIZING
DECISION FATIGUE
TO IMPROVE TEAM PRODUCTIVITY
TRY! SWIFT
MARCH, 2017
DEREK LEE
@DEREKLEEROCK
☀ 🌛
?
Class Struct
🤔
Tabs SpacesCocoapods CarthageStoryboards CodeA BUIKit ReactNative
?
A B
🤔
?
??
?
? ?
??? ?
?
? ?
?
?
?
? ??
??
??
?
?
?
??
???
?
?
?
?
??
??
?
?
?
??
???
?
??? ?? 😓
A B
😓
A B
😓
A B
😓
A B
😓
A B
😓
A B
😓
A B
😓
A DAY IN THE LIFE @ PIVOTAL LABS
BREAKFAST!
🕣8:45am
MORNING OFFICE STANDUP
🕘9:06am
🕘9:15am
PROJECT STANDUP
PROJECT
ORGANIZATION
Open Quickly
⌘+⇧+O
Filter in Navigator
⌘+⌥+J
Reveal in Navigator
⌘+⇧+J
Find in Files
⌘+⇧+F
HOW CAN WE FIND FILES IN XCODE?
“Hunt and Peck”
HOW DO WE REALLY FIND FILES IN XCODE?
“Helpers” FolderNo organization
WHAT WE’D LIKE TO AVOID
MVC?
APPLICATION ・ COMPONENTS ・ UI
APPLICATION
COMPONENTS
UI
PAIR PROGRAMMING
🕙10:00am
PAIR PROGRAMMING - SETUP
▸ Ping-Pong
PAIR PROGRAMMING - STYLES
+
▸ Driver + Navigator
PAIR PROGRAMMING - IN ACTION
▸ We pair 99% of the time
▸ All disciplines pair: Engineering, Design, PMs
▸ Change pairs daily
▸ Regularly switch tracks of work
LUNCHTIME TECH TALK
🕧12:30pm
BACK TO PAIRING
🕜1:30pm
IMPROMPTU TEAM DISCUSSION
🕝2:30pm
SWIFT FILE
ORGANIZATION
VIEW CONTROLLER: SHOW DOCUMENT ITEMS: ^ + 6
class CountingRepeaterViewController: UIViewController {
fileprivate let repeater: Repeater
fileprivate let maximumCountValue: Int
fileprivate var counterValue: Int
let countingLabel: UILabel
init(repeater: Repeater,
maximumCountValue: Int) { ... }
required init?(coder aDecoder: NSCoder) { ... }
override func viewDidLoad() { ... }
override func viewWillDisappear(_ animated: Bool) { ... }
func addSubviews() { ... }
func addConstraints() { ... }
...
}
With “// MARK:”Without Annotations With “// MARK: —“
MARK ANNOTATION COMPARISON
VIEW CONTROLLER ORGANIZATION
class CountingRepeaterViewController: UIViewController {
// MARK: - Properties
fileprivate let repeater: Repeater
fileprivate let maximumCountValue: Int
fileprivate var counterValue: Int
// MARK: - View Elements
let headerLabel: UILabel
let countingLabel: UILabel
// MARK: - Initialization
init(repeater: Repeater,
maximumCountValue: Int) { ... }
required init?(coder aDecoder: NSCoder) { ... }
// MARK: - Lifecycle Methods
override func viewDidLoad() { ... }
override func viewWillDisappear(_ animated: Bool)
}
// MARK: - Private Methods
fileprivate extension CountingRepeaterViewController {
func addSubviews() { ... }
func addConstraints() { ... }
VIEW CONTROLLER ORGANIZATION
class CountingRepeaterViewController: UIViewController {
// MARK: - Properties
fileprivate let repeater: Repeater
fileprivate let maximumCountValue: Int
fileprivate var counterValue: Int
// MARK: - View Elements
let headerLabel: UILabel
let countingLabel: UILabel
// MARK: - Initialization
init(repeater: Repeater,
maximumCountValue: Int) { ... }
required init?(coder aDecoder: NSCoder) { ... }
// MARK: - Lifecycle Methods
override func viewDidLoad() { ... }
override func viewWillDisappear(_ animated: Bool) { ... }
}
// MARK: - Private Methods
fileprivate extension CountingRepeaterViewController {
func addSubviews() { ... }
func addConstraints() { ... }
// MARK: - Lifecycle Methods
override func viewDidLoad() { ... }
override func viewWillDisappear(_ animated: Bool) { ... }
class CountingRepeaterViewController: UIViewController {
// MARK: - Properties
fileprivate let repeater: Repeater
fileprivate let maximumCountValue: Int
fileprivate var counterValue: Int
// MARK: - View Elements
let headerLabel: UILabel
let countingLabel: UILabel
// MARK: - Initialization
init(repeater: Repeater,
maximumCountValue: Int) { ... }
required init?(coder aDecoder: NSCoder) { ... }
// MARK: - Lifecycle Methods
override func viewDidLoad() { ... }
override func viewWillDisappear(_ animated: Bool)
}
// MARK: - Private Methods
fileprivate extension CountingRepeaterViewController {
func addSubviews() { ... }
func addConstraints() { ... }
CREATE TEMPLATE FROM XCODE SNIPPETS
PROTOCOL CONFORMANCE
struct DefaultCustomer: Customer {
let name: String
private(set) var rentals: [Rental]
init(name: String) { ... }
mutating func addRental(rental: Rental) { ... }
func createTextStatement() -> String { ... }
func createHtmlStatement() -> String { ... }
func getTotalCharge() -> Double { ... }
func getTotalFrequentRenterPoints() -> Int { ... }
}
PROTOCOL CONFORMANCE
struct DefaultCustomer: Customer {
// MARK: - Properties
let name: String
private(set) var rentals: [Rental]
// MARK: - Initialization
init(name: String) { ... }
mutating func addRental(rental: Rental) { ... }
func createTextStatement() -> String { ... }
func createHtmlStatement() -> String { ... }
func getTotalCharge() -> Double { ... }
func getTotalFrequentRenterPoints() -> Int { ... }
}
PROTOCOL CONFORMANCE
struct DefaultCustomer {
// MARK: - Properties
let name: String
private(set) var rentals: [Rental]
// MARK: - Initialization
init(name: String) { ... }
}
// MARK: - Customer
extension DefaultCustomer: Customer {
mutating func addRental(rental: Rental) { ... }
func createTextStatement() -> String { ... }
func createHtmlStatement() -> String { ... }
func getTotalCharge() -> Double { ... }
func getTotalFrequentRenterPoints() -> Int { ... }
}
PROTOCOL CONFORMANCE
struct DefaultCustomer {
// MARK: - Properties
let name: String
private(set) var rentals: [Rental]
// MARK: - Initialization
init(name: String) { ... }
}
// MARK: - Customer
extension DefaultCustomer: Customer {
mutating func addRental(rental: Rental) { ... }
func createTextStatement() -> String { ... }
func createHtmlStatement() -> String { ... }
}
// MARK: - Private Methods
fileprivate extension DefaultCustomer {
func getTotalCharge() -> Double { ... }
func getTotalFrequentRenterPoints() -> Int { ... }
}
PING-PONG BREAK
🕞3:30pm
CROSS-FUNCTIONAL PAIRING
🕓4:00pm
Engineering x Design
STYLING
UI OBJECTS
extension UIFont {
class func abcMediumFont(size: CGFloat) -> UIFont {
return UIFont(name: "AvenirNext-Medium", size: size)!
}
class func abcBoldFont(size: CGFloat) -> UIFont {
return UIFont(name: "AvenirNext-Bold", size: size)!
}
}
DEFINING FONTS
extension UIColor {
class var abcDarkSkyBlue: UIColor {
return UIColor(
red: 52.0 / 255.0,
green: 152.0 / 255.0,
blue: 219.0 / 255.0,
alpha: 1.0
)
}
class var abcBlueish: UIColor {
return UIColor(
red: 41.0 / 255.0,
green: 128.0 / 255.0,
blue: 185.0 / 255.0,
alpha: 1.0
)
}
}
DEFINING COLORS
enum UIButtonStyle {
case primary, negative
func applyTo(button: UIButton) {
switch (self) {
case .primary:
button.titleLabel?.font = UIFont.abcMediumFont(
size: 15
)
button.setTitleColor(UIColor.white, for: .normal)
button.backgroundColor = UIColor.abcDarkSkyBlue
button.layer.borderColor = UIColor.abcBlueish.cgColor
button.layer.borderWidth = 1.0
break
case .negative:
// ...
break
}
}
}
DEFINING STYLES
APPLYING STYLES
extension UIButton {
func apply(style: UIButtonStyle) {
style.applyTo(button: self)
}
}
class MyViewController: UIViewController {
let confirmButton: UIButton
let cancelButton: UIButton
...
fileprivate func applyStyles() {
confirmButton.apply(style: .primary)
cancelButton.apply(style: .negative)
}
}
RETROSPECTIVE (RETRO)
🕔5:00pm
RETROS - INGREDIENTS
🙂🙂
🙂
🙂
🙂
🙂
Core Team Members Food & Snacks
🍓🧀
🍙🍪
Drinks
☕🍵
🍷🍺
RETROS @ PIVOTAL LABS
😃
Discuss
😭
Keep
😕
Improve
RETROS @ PIVOTAL LABS
▸ Reflect → Continuous improvement
▸ Building Trust
▸ Honest communication
▸ Identify & solve problems early
▸ Team brainstorming
Kent Beck, Extreme Programming Explained
THE COURAGE TO SPEAK TRUTHS,
PLEASANT OR UNPLEASANT,
FOSTERS COMMUNICATION AND TRUST.
SUMMARY
▸ Project Standup
▸ Pair Programming
▸ Lunchtime Tech Talk
▸ Impromptu Team Discussions
▸ Cross-Functional Pairing
▸ Retrospectives
▸ Project Organization
▸ Swift File Organization
▸ Styling UI Objects
A B
😓
A B
😓
A B
😓
A B
😓
A B
😓
A B
😓
😓😓 😓
😓😓 😓
😓😓 😓
😓😓 😓
😁😃 😛
🙃😎 😅
Thank you!
try! Swift March 2017
@DEREKLEEROCK
Thank you!
try! Swift March 2017

More Related Content

What's hot

The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5arajivmordani
 
The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
Michael Girouard
 
EcmaScript 6
EcmaScript 6 EcmaScript 6
EcmaScript 6
Manoj Kumar
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and Reactive
Eugene Zharkov
 
Your JavaScript Library
Your JavaScript LibraryYour JavaScript Library
Your JavaScript Library
Dmitry Baranovskiy
 
The jQuery Divide
The jQuery DivideThe jQuery Divide
The jQuery Divide
Rebecca Murphey
 
An Intro To ES6
An Intro To ES6An Intro To ES6
An Intro To ES6
FITC
 
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Jung Kim
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
Eugene Zharkov
 
JavaScript ES6
JavaScript ES6JavaScript ES6
JavaScript ES6
Leo Hernandez
 
Say It With Javascript
Say It With JavascriptSay It With Javascript
Say It With Javascript
Giovanni Scerra ☃
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation Javascript
Ramesh Nair
 
Explaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to ComeExplaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to Come
Cory Forsyth
 
Letswift19-clean-architecture
Letswift19-clean-architectureLetswift19-clean-architecture
Letswift19-clean-architecture
Jung Kim
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
Domenic Denicola
 
Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.
boyney123
 
스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내
Jung Kim
 
FalsyValues. Dmitry Soshnikov - ECMAScript 6
FalsyValues. Dmitry Soshnikov - ECMAScript 6FalsyValues. Dmitry Soshnikov - ECMAScript 6
FalsyValues. Dmitry Soshnikov - ECMAScript 6
Dmitry Soshnikov
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9
Bongwon Lee
 

What's hot (20)

The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
 
The Beauty of Java Script
The Beauty of Java ScriptThe Beauty of Java Script
The Beauty of Java Script
 
EcmaScript 6
EcmaScript 6 EcmaScript 6
EcmaScript 6
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and Reactive
 
Your JavaScript Library
Your JavaScript LibraryYour JavaScript Library
Your JavaScript Library
 
The jQuery Divide
The jQuery DivideThe jQuery Divide
The jQuery Divide
 
An Intro To ES6
An Intro To ES6An Intro To ES6
An Intro To ES6
 
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
Letswift18 워크숍#1 스위프트 클린코드와 코드리뷰
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
JavaScript ES6
JavaScript ES6JavaScript ES6
JavaScript ES6
 
Say It With Javascript
Say It With JavascriptSay It With Javascript
Say It With Javascript
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation Javascript
 
Explaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to ComeExplaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to Come
 
Map kit light
Map kit lightMap kit light
Map kit light
 
Letswift19-clean-architecture
Letswift19-clean-architectureLetswift19-clean-architecture
Letswift19-clean-architecture
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 
Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.
 
스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내스위프트를 여행하는 히치하이커를 위한 스타일 안내
스위프트를 여행하는 히치하이커를 위한 스타일 안내
 
FalsyValues. Dmitry Soshnikov - ECMAScript 6
FalsyValues. Dmitry Soshnikov - ECMAScript 6FalsyValues. Dmitry Soshnikov - ECMAScript 6
FalsyValues. Dmitry Soshnikov - ECMAScript 6
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9
 

Similar to Minimizing Decision Fatigue to Improve Team Productivity

Protocol-Oriented Programming in Swift
Protocol-Oriented Programming in SwiftProtocol-Oriented Programming in Swift
Protocol-Oriented Programming in Swift
Oleksandr Stepanov
 
Swift - One step forward from Obj-C
Swift -  One step forward from Obj-CSwift -  One step forward from Obj-C
Swift - One step forward from Obj-C
Nissan Tsafrir
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
MongoDB
 
Emerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the HorizonEmerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the Horizon
Alex Payne
 
Asynchronous Programming at Netflix
Asynchronous Programming at NetflixAsynchronous Programming at Netflix
Asynchronous Programming at Netflix
C4Media
 
mobl
moblmobl
mobl
zefhemel
 
Fact, Fiction, and FP
Fact, Fiction, and FPFact, Fiction, and FP
Fact, Fiction, and FP
Brian Lonsdorf
 
Deep Dive Into Swift
Deep Dive Into SwiftDeep Dive Into Swift
Deep Dive Into Swift
Sarath C
 
Symfony War Stories
Symfony War StoriesSymfony War Stories
Symfony War Stories
Jakub Zalas
 
Building a p2 update site using Buckminster
Building a p2 update site using BuckminsterBuilding a p2 update site using Buckminster
Building a p2 update site using Buckminsterguest5e2b6b
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScriptQiangning Hong
 
Things about Functional JavaScript
Things about Functional JavaScriptThings about Functional JavaScript
Things about Functional JavaScript
ChengHui Weng
 
A Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala Microservices
Federico Feroldi
 
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry PiMonitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
InfluxData
 
Effective Object Oriented Design in Cpp
Effective Object Oriented Design in CppEffective Object Oriented Design in Cpp
Effective Object Oriented Design in Cpp
CodeOps Technologies LLP
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 
Writing Maintainable JavaScript
Writing Maintainable JavaScriptWriting Maintainable JavaScript
Writing Maintainable JavaScript
Andrew Dupont
 
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
Codemotion
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
greenwop
 

Similar to Minimizing Decision Fatigue to Improve Team Productivity (20)

Protocol-Oriented Programming in Swift
Protocol-Oriented Programming in SwiftProtocol-Oriented Programming in Swift
Protocol-Oriented Programming in Swift
 
Swift - One step forward from Obj-C
Swift -  One step forward from Obj-CSwift -  One step forward from Obj-C
Swift - One step forward from Obj-C
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 
Emerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the HorizonEmerging Languages: A Tour of the Horizon
Emerging Languages: A Tour of the Horizon
 
Asynchronous Programming at Netflix
Asynchronous Programming at NetflixAsynchronous Programming at Netflix
Asynchronous Programming at Netflix
 
mobl
moblmobl
mobl
 
Fact, Fiction, and FP
Fact, Fiction, and FPFact, Fiction, and FP
Fact, Fiction, and FP
 
Deep Dive Into Swift
Deep Dive Into SwiftDeep Dive Into Swift
Deep Dive Into Swift
 
Symfony War Stories
Symfony War StoriesSymfony War Stories
Symfony War Stories
 
Building a p2 update site using Buckminster
Building a p2 update site using BuckminsterBuilding a p2 update site using Buckminster
Building a p2 update site using Buckminster
 
服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript服务框架: Thrift & PasteScript
服务框架: Thrift & PasteScript
 
Things about Functional JavaScript
Things about Functional JavaScriptThings about Functional JavaScript
Things about Functional JavaScript
 
A Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala Microservices
 
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry PiMonitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
Monitoring Your ISP Using InfluxDB Cloud and Raspberry Pi
 
Effective Object Oriented Design in Cpp
Effective Object Oriented Design in CppEffective Object Oriented Design in Cpp
Effective Object Oriented Design in Cpp
 
Intro to HTML5
Intro to HTML5Intro to HTML5
Intro to HTML5
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Writing Maintainable JavaScript
Writing Maintainable JavaScriptWriting Maintainable JavaScript
Writing Maintainable JavaScript
 
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
Dan Persa, Maximilian Fellner - The recipe for scalable frontends - Codemotio...
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 

Recently uploaded

Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
Paco van Beckhoven
 
Visitor Management System in India- Vizman.app
Visitor Management System in India- Vizman.appVisitor Management System in India- Vizman.app
Visitor Management System in India- Vizman.app
NaapbooksPrivateLimi
 
Explore Modern SharePoint Templates for 2024
Explore Modern SharePoint Templates for 2024Explore Modern SharePoint Templates for 2024
Explore Modern SharePoint Templates for 2024
Sharepoint Designs
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Anthony Dahanne
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
Tendenci - The Open Source AMS (Association Management Software)
 
De mooiste recreatieve routes ontdekken met RouteYou en FME
De mooiste recreatieve routes ontdekken met RouteYou en FMEDe mooiste recreatieve routes ontdekken met RouteYou en FME
De mooiste recreatieve routes ontdekken met RouteYou en FME
Jelle | Nordend
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
abdulrafaychaudhry
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Globus
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
kalichargn70th171
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
IES VE
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
Globus
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
informapgpstrackings
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Shahin Sheidaei
 
Why React Native as a Strategic Advantage for Startup Innovation.pdf
Why React Native as a Strategic Advantage for Startup Innovation.pdfWhy React Native as a Strategic Advantage for Startup Innovation.pdf
Why React Native as a Strategic Advantage for Startup Innovation.pdf
ayushiqss
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
AMB-Review
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
Juraj Vysvader
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Natan Silnitsky
 

Recently uploaded (20)

Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024Cracking the code review at SpringIO 2024
Cracking the code review at SpringIO 2024
 
Visitor Management System in India- Vizman.app
Visitor Management System in India- Vizman.appVisitor Management System in India- Vizman.app
Visitor Management System in India- Vizman.app
 
Explore Modern SharePoint Templates for 2024
Explore Modern SharePoint Templates for 2024Explore Modern SharePoint Templates for 2024
Explore Modern SharePoint Templates for 2024
 
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...
 
Corporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMSCorporate Management | Session 3 of 3 | Tendenci AMS
Corporate Management | Session 3 of 3 | Tendenci AMS
 
De mooiste recreatieve routes ontdekken met RouteYou en FME
De mooiste recreatieve routes ontdekken met RouteYou en FMEDe mooiste recreatieve routes ontdekken met RouteYou en FME
De mooiste recreatieve routes ontdekken met RouteYou en FME
 
Lecture 1 Introduction to games development
Lecture 1 Introduction to games developmentLecture 1 Introduction to games development
Lecture 1 Introduction to games development
 
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
Climate Science Flows: Enabling Petabyte-Scale Climate Analysis with the Eart...
 
SOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBrokerSOCRadar Research Team: Latest Activities of IntelBroker
SOCRadar Research Team: Latest Activities of IntelBroker
 
Prosigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology SolutionsProsigns: Transforming Business with Tailored Technology Solutions
Prosigns: Transforming Business with Tailored Technology Solutions
 
Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024Globus Connect Server Deep Dive - GlobusWorld 2024
Globus Connect Server Deep Dive - GlobusWorld 2024
 
A Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdfA Comprehensive Look at Generative AI in Retail App Testing.pdf
A Comprehensive Look at Generative AI in Retail App Testing.pdf
 
Using IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New ZealandUsing IESVE for Room Loads Analysis - Australia & New Zealand
Using IESVE for Room Loads Analysis - Australia & New Zealand
 
How to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good PracticesHow to Position Your Globus Data Portal for Success Ten Good Practices
How to Position Your Globus Data Portal for Success Ten Good Practices
 
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
Field Employee Tracking System| MiTrack App| Best Employee Tracking Solution|...
 
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
Gamify Your Mind; The Secret Sauce to Delivering Success, Continuously Improv...
 
Why React Native as a Strategic Advantage for Startup Innovation.pdf
Why React Native as a Strategic Advantage for Startup Innovation.pdfWhy React Native as a Strategic Advantage for Startup Innovation.pdf
Why React Native as a Strategic Advantage for Startup Innovation.pdf
 
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdfDominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
Dominate Social Media with TubeTrivia AI’s Addictive Quiz Videos.pdf
 
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...
 
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.ILBeyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
Beyond Event Sourcing - Embracing CRUD for Wix Platform - Java.IL
 

Minimizing Decision Fatigue to Improve Team Productivity

  • 1. MINIMIZING DECISION FATIGUE TO IMPROVE TEAM PRODUCTIVITY TRY! SWIFT MARCH, 2017 DEREK LEE @DEREKLEEROCK
  • 2. ☀ 🌛 ? Class Struct 🤔 Tabs SpacesCocoapods CarthageStoryboards CodeA BUIKit ReactNative
  • 3. ? A B 🤔 ? ?? ? ? ? ??? ? ? ? ? ? ? ? ? ?? ?? ?? ? ? ? ?? ??? ? ? ? ? ?? ?? ? ? ? ?? ??? ? ??? ?? 😓
  • 5. A B 😓 A B 😓 A B 😓 A B 😓 A B 😓 A B 😓
  • 6. A DAY IN THE LIFE @ PIVOTAL LABS
  • 11. Open Quickly ⌘+⇧+O Filter in Navigator ⌘+⌥+J Reveal in Navigator ⌘+⇧+J Find in Files ⌘+⇧+F HOW CAN WE FIND FILES IN XCODE?
  • 12. “Hunt and Peck” HOW DO WE REALLY FIND FILES IN XCODE?
  • 14. MVC?
  • 18. UI
  • 21. ▸ Ping-Pong PAIR PROGRAMMING - STYLES + ▸ Driver + Navigator
  • 22. PAIR PROGRAMMING - IN ACTION ▸ We pair 99% of the time ▸ All disciplines pair: Engineering, Design, PMs ▸ Change pairs daily ▸ Regularly switch tracks of work
  • 27. VIEW CONTROLLER: SHOW DOCUMENT ITEMS: ^ + 6 class CountingRepeaterViewController: UIViewController { fileprivate let repeater: Repeater fileprivate let maximumCountValue: Int fileprivate var counterValue: Int let countingLabel: UILabel init(repeater: Repeater, maximumCountValue: Int) { ... } required init?(coder aDecoder: NSCoder) { ... } override func viewDidLoad() { ... } override func viewWillDisappear(_ animated: Bool) { ... } func addSubviews() { ... } func addConstraints() { ... } ... }
  • 28. With “// MARK:”Without Annotations With “// MARK: —“ MARK ANNOTATION COMPARISON
  • 29. VIEW CONTROLLER ORGANIZATION class CountingRepeaterViewController: UIViewController { // MARK: - Properties fileprivate let repeater: Repeater fileprivate let maximumCountValue: Int fileprivate var counterValue: Int // MARK: - View Elements let headerLabel: UILabel let countingLabel: UILabel // MARK: - Initialization init(repeater: Repeater, maximumCountValue: Int) { ... } required init?(coder aDecoder: NSCoder) { ... } // MARK: - Lifecycle Methods override func viewDidLoad() { ... } override func viewWillDisappear(_ animated: Bool) } // MARK: - Private Methods fileprivate extension CountingRepeaterViewController { func addSubviews() { ... } func addConstraints() { ... }
  • 30. VIEW CONTROLLER ORGANIZATION class CountingRepeaterViewController: UIViewController { // MARK: - Properties fileprivate let repeater: Repeater fileprivate let maximumCountValue: Int fileprivate var counterValue: Int // MARK: - View Elements let headerLabel: UILabel let countingLabel: UILabel // MARK: - Initialization init(repeater: Repeater, maximumCountValue: Int) { ... } required init?(coder aDecoder: NSCoder) { ... } // MARK: - Lifecycle Methods override func viewDidLoad() { ... } override func viewWillDisappear(_ animated: Bool) { ... } } // MARK: - Private Methods fileprivate extension CountingRepeaterViewController { func addSubviews() { ... } func addConstraints() { ... } // MARK: - Lifecycle Methods override func viewDidLoad() { ... } override func viewWillDisappear(_ animated: Bool) { ... } class CountingRepeaterViewController: UIViewController { // MARK: - Properties fileprivate let repeater: Repeater fileprivate let maximumCountValue: Int fileprivate var counterValue: Int // MARK: - View Elements let headerLabel: UILabel let countingLabel: UILabel // MARK: - Initialization init(repeater: Repeater, maximumCountValue: Int) { ... } required init?(coder aDecoder: NSCoder) { ... } // MARK: - Lifecycle Methods override func viewDidLoad() { ... } override func viewWillDisappear(_ animated: Bool) } // MARK: - Private Methods fileprivate extension CountingRepeaterViewController { func addSubviews() { ... } func addConstraints() { ... }
  • 31. CREATE TEMPLATE FROM XCODE SNIPPETS
  • 32. PROTOCOL CONFORMANCE struct DefaultCustomer: Customer { let name: String private(set) var rentals: [Rental] init(name: String) { ... } mutating func addRental(rental: Rental) { ... } func createTextStatement() -> String { ... } func createHtmlStatement() -> String { ... } func getTotalCharge() -> Double { ... } func getTotalFrequentRenterPoints() -> Int { ... } }
  • 33. PROTOCOL CONFORMANCE struct DefaultCustomer: Customer { // MARK: - Properties let name: String private(set) var rentals: [Rental] // MARK: - Initialization init(name: String) { ... } mutating func addRental(rental: Rental) { ... } func createTextStatement() -> String { ... } func createHtmlStatement() -> String { ... } func getTotalCharge() -> Double { ... } func getTotalFrequentRenterPoints() -> Int { ... } }
  • 34. PROTOCOL CONFORMANCE struct DefaultCustomer { // MARK: - Properties let name: String private(set) var rentals: [Rental] // MARK: - Initialization init(name: String) { ... } } // MARK: - Customer extension DefaultCustomer: Customer { mutating func addRental(rental: Rental) { ... } func createTextStatement() -> String { ... } func createHtmlStatement() -> String { ... } func getTotalCharge() -> Double { ... } func getTotalFrequentRenterPoints() -> Int { ... } }
  • 35. PROTOCOL CONFORMANCE struct DefaultCustomer { // MARK: - Properties let name: String private(set) var rentals: [Rental] // MARK: - Initialization init(name: String) { ... } } // MARK: - Customer extension DefaultCustomer: Customer { mutating func addRental(rental: Rental) { ... } func createTextStatement() -> String { ... } func createHtmlStatement() -> String { ... } } // MARK: - Private Methods fileprivate extension DefaultCustomer { func getTotalCharge() -> Double { ... } func getTotalFrequentRenterPoints() -> Int { ... } }
  • 39. extension UIFont { class func abcMediumFont(size: CGFloat) -> UIFont { return UIFont(name: "AvenirNext-Medium", size: size)! } class func abcBoldFont(size: CGFloat) -> UIFont { return UIFont(name: "AvenirNext-Bold", size: size)! } } DEFINING FONTS
  • 40. extension UIColor { class var abcDarkSkyBlue: UIColor { return UIColor( red: 52.0 / 255.0, green: 152.0 / 255.0, blue: 219.0 / 255.0, alpha: 1.0 ) } class var abcBlueish: UIColor { return UIColor( red: 41.0 / 255.0, green: 128.0 / 255.0, blue: 185.0 / 255.0, alpha: 1.0 ) } } DEFINING COLORS
  • 41. enum UIButtonStyle { case primary, negative func applyTo(button: UIButton) { switch (self) { case .primary: button.titleLabel?.font = UIFont.abcMediumFont( size: 15 ) button.setTitleColor(UIColor.white, for: .normal) button.backgroundColor = UIColor.abcDarkSkyBlue button.layer.borderColor = UIColor.abcBlueish.cgColor button.layer.borderWidth = 1.0 break case .negative: // ... break } } } DEFINING STYLES
  • 42. APPLYING STYLES extension UIButton { func apply(style: UIButtonStyle) { style.applyTo(button: self) } } class MyViewController: UIViewController { let confirmButton: UIButton let cancelButton: UIButton ... fileprivate func applyStyles() { confirmButton.apply(style: .primary) cancelButton.apply(style: .negative) } }
  • 44. RETROS - INGREDIENTS 🙂🙂 🙂 🙂 🙂 🙂 Core Team Members Food & Snacks 🍓🧀 🍙🍪 Drinks ☕🍵 🍷🍺
  • 45. RETROS @ PIVOTAL LABS 😃 Discuss 😭 Keep 😕 Improve
  • 46. RETROS @ PIVOTAL LABS ▸ Reflect → Continuous improvement ▸ Building Trust ▸ Honest communication ▸ Identify & solve problems early ▸ Team brainstorming
  • 47. Kent Beck, Extreme Programming Explained THE COURAGE TO SPEAK TRUTHS, PLEASANT OR UNPLEASANT, FOSTERS COMMUNICATION AND TRUST.
  • 48. SUMMARY ▸ Project Standup ▸ Pair Programming ▸ Lunchtime Tech Talk ▸ Impromptu Team Discussions ▸ Cross-Functional Pairing ▸ Retrospectives ▸ Project Organization ▸ Swift File Organization ▸ Styling UI Objects
  • 49.
  • 50.
  • 51. A B 😓 A B 😓 A B 😓 A B 😓 A B 😓 A B 😓
  • 55. Thank you! try! Swift March 2017