Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 dai...
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 repea...
With β€œ// MARK:”Without Annotations With β€œ// MARK: β€”β€œ
MARK ANNOTATION COMPARISON
VIEW CONTROLLER ORGANIZATION
class CountingRepeaterViewController: UIViewController {
// MARK: - Properties
fileprivate le...
VIEW CONTROLLER ORGANIZATION
class CountingRepeaterViewController: UIViewController {
// MARK: - Properties
fileprivate le...
CREATE TEMPLATE FROM XCODE SNIPPETS
PROTOCOL CONFORMANCE
struct DefaultCustomer: Customer {
let name: String
private(set) var rentals: [Rental]
init(name: Str...
PROTOCOL CONFORMANCE
struct DefaultCustomer: Customer {
// MARK: - Properties
let name: String
private(set) var rentals: [...
PROTOCOL CONFORMANCE
struct DefaultCustomer {
// MARK: - Properties
let name: String
private(set) var rentals: [Rental]
//...
PROTOCOL CONFORMANCE
struct DefaultCustomer {
// MARK: - Properties
let name: String
private(set) var rentals: [Rental]
//...
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...
extension UIColor {
class var abcDarkSkyBlue: UIColor {
return UIColor(
red: 52.0 / 255.0,
green: 152.0 / 255.0,
blue: 219...
enum UIButtonStyle {
case primary, negative
func applyTo(button: UIButton) {
switch (self) {
case .primary:
button.titleLa...
APPLYING STYLES
extension UIButton {
func apply(style: UIButtonStyle) {
style.applyTo(button: self)
}
}
class MyViewContro...
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 problem...
Kent Beck, Extreme Programming Explained
THE COURAGE TO SPEAK TRUTHS,
PLEASANT OR UNPLEASANT,
FOSTERS COMMUNICATION AND TR...
SUMMARY
β–Έ Project Standup
β–Έ Pair Programming
β–Έ Lunchtime Tech Talk
β–Έ Impromptu Team Discussions
β–Έ Cross-Functional Pairing...
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
Minimizing Decision Fatigue to Improve Team Productivity
Minimizing Decision Fatigue to Improve Team Productivity
Upcoming SlideShare
Loading in …5
×

Minimizing Decision Fatigue to Improve Team Productivity

1,167 views

Published on

Presented on Friday, March 3, 2017 at the try! Swift Conference in Tokyo - in this talk I discuss how decision fatigue impacts our work days and how we can minimize this through increasing our team's communication. Through the context of a typical day at Pivotal Labs, I give examples of how our teams communicate as well as some technical solutions that we agreed to as a team for development in Swift.

Published in: Software
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Minimizing Decision Fatigue to Improve Team Productivity

  1. 1. MINIMIZING DECISION FATIGUE TO IMPROVE TEAM PRODUCTIVITY TRY! SWIFT MARCH, 2017 DEREK LEE @DEREKLEEROCK
  2. 2. β˜€ πŸŒ› ? Class Struct πŸ€” Tabs SpacesCocoapods CarthageStoryboards CodeA BUIKit ReactNative
  3. 3. ? A B πŸ€” ? ?? ? ? ? ??? ? ? ? ? ? ? ? ? ?? ?? ?? ? ? ? ?? ??? ? ? ? ? ?? ?? ? ? ? ?? ??? ? ??? ?? πŸ˜“
  4. 4. A B πŸ˜“
  5. 5. A B πŸ˜“ A B πŸ˜“ A B πŸ˜“ A B πŸ˜“ A B πŸ˜“ A B πŸ˜“
  6. 6. A DAY IN THE LIFE @ PIVOTAL LABS
  7. 7. BREAKFAST! πŸ•£8:45am
  8. 8. MORNING OFFICE STANDUP πŸ•˜9:06am
  9. 9. πŸ•˜9:15am PROJECT STANDUP
  10. 10. PROJECT ORGANIZATION
  11. 11. Open Quickly ⌘+⇧+O Filter in Navigator ⌘+βŒ₯+J Reveal in Navigator ⌘+⇧+J Find in Files ⌘+⇧+F HOW CAN WE FIND FILES IN XCODE?
  12. 12. β€œHunt and Peck” HOW DO WE REALLY FIND FILES IN XCODE?
  13. 13. β€œHelpers” FolderNo organization WHAT WE’D LIKE TO AVOID
  14. 14. MVC?
  15. 15. APPLICATION ・ COMPONENTS ・ UI
  16. 16. APPLICATION
  17. 17. COMPONENTS
  18. 18. UI
  19. 19. PAIR PROGRAMMING πŸ•™10:00am
  20. 20. PAIR PROGRAMMING - SETUP
  21. 21. β–Έ Ping-Pong PAIR PROGRAMMING - STYLES + β–Έ Driver + Navigator
  22. 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
  23. 23. LUNCHTIME TECH TALK πŸ•§12:30pm
  24. 24. BACK TO PAIRING πŸ•œ1:30pm
  25. 25. IMPROMPTU TEAM DISCUSSION πŸ•2:30pm
  26. 26. SWIFT FILE ORGANIZATION
  27. 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. 28. With β€œ// MARK:”Without Annotations With β€œ// MARK: β€”β€œ MARK ANNOTATION COMPARISON
  29. 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. 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. 31. CREATE TEMPLATE FROM XCODE SNIPPETS
  32. 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. 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. 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. 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 { ... } }
  36. 36. PING-PONG BREAK πŸ•ž3:30pm
  37. 37. CROSS-FUNCTIONAL PAIRING πŸ•“4:00pm Engineering x Design
  38. 38. STYLING UI OBJECTS
  39. 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. 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. 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. 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) } }
  43. 43. RETROSPECTIVE (RETRO) πŸ•”5:00pm
  44. 44. RETROS - INGREDIENTS πŸ™‚πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ πŸ™‚ Core Team Members Food & Snacks πŸ“πŸ§€ πŸ™πŸͺ Drinks β˜•πŸ΅ 🍷🍺
  45. 45. RETROS @ PIVOTAL LABS πŸ˜ƒ Discuss 😭 Keep πŸ˜• Improve
  46. 46. RETROS @ PIVOTAL LABS β–Έ Reflect β†’ Continuous improvement β–Έ Building Trust β–Έ Honest communication β–Έ Identify & solve problems early β–Έ Team brainstorming
  47. 47. Kent Beck, Extreme Programming Explained THE COURAGE TO SPEAK TRUTHS, PLEASANT OR UNPLEASANT, FOSTERS COMMUNICATION AND TRUST.
  48. 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. 49. A B πŸ˜“ A B πŸ˜“ A B πŸ˜“ A B πŸ˜“ A B πŸ˜“ A B πŸ˜“
  50. 50. πŸ˜“πŸ˜“ πŸ˜“ πŸ˜“πŸ˜“ πŸ˜“
  51. 51. πŸ˜“πŸ˜“ πŸ˜“ πŸ˜“πŸ˜“ πŸ˜“
  52. 52. πŸ˜πŸ˜ƒ πŸ˜› πŸ™ƒπŸ˜Ž πŸ˜…
  53. 53. Thank you! try! Swift March 2017
  54. 54. @DEREKLEEROCK Thank you! try! Swift March 2017

Γ—