56
MINIMIZING DECISION FATIGUE TO IMPROVE TEAM PRODUCTIVITY TRY! SWIFT MARCH, 2017 DEREK LEE @DEREKLEEROCK

Minimizing Decision Fatigue to Improve Team Productivity

Embed Size (px)

Citation preview

Page 1: Minimizing Decision Fatigue to Improve Team Productivity

MINIMIZING DECISION FATIGUE

TO IMPROVE TEAM PRODUCTIVITY

TRY! SWIFT MARCH, 2017

DEREK LEE @DEREKLEEROCK

Page 2: Minimizing Decision Fatigue to Improve Team Productivity

☀ 🌛?

Class Struct

🤔

Tabs SpacesCocoapods CarthageStoryboards CodeA BUIKit ReactNative

Page 3: Minimizing Decision Fatigue to Improve Team Productivity

?

A B

🤔

???

?? ?

??? ??? ?

???

? ?????

? ???

?

?????? ?

??

???? ?

??

?

??????

???? ?

??? ?? 😓

Page 4: Minimizing Decision Fatigue to Improve Team Productivity

A B

😓

Page 5: Minimizing Decision Fatigue to Improve Team Productivity

A B

😓

A B

😓

A B

😓

A B

😓

A B

😓

A B

😓

Page 6: Minimizing Decision Fatigue to Improve Team Productivity

A DAY IN THE LIFE @ PIVOTAL LABS

Page 7: Minimizing Decision Fatigue to Improve Team Productivity

BREAKFAST!

🕣8:45am

Page 8: Minimizing Decision Fatigue to Improve Team Productivity

MORNING OFFICE STANDUP

🕘9:06am

Page 9: Minimizing Decision Fatigue to Improve Team Productivity

🕘9:15am

PROJECT STANDUP

Page 10: Minimizing Decision Fatigue to Improve Team Productivity

PROJECT ORGANIZATION

Page 11: Minimizing Decision Fatigue to Improve Team Productivity

Open Quickly ⌘+⇧+O

Filter in Navigator ⌘+⌥+J

Reveal in Navigator ⌘+⇧+J

Find in Files ⌘+⇧+F

HOW CAN WE FIND FILES IN XCODE?

Page 12: Minimizing Decision Fatigue to Improve Team Productivity

“Hunt and Peck”

HOW DO WE REALLY FIND FILES IN XCODE?

Page 13: Minimizing Decision Fatigue to Improve Team Productivity

“Helpers” FolderNo organization

WHAT WE’D LIKE TO AVOID

Page 14: Minimizing Decision Fatigue to Improve Team Productivity

MVC?

Page 15: Minimizing Decision Fatigue to Improve Team Productivity

APPLICATION ・ COMPONENTS ・ UI

Page 16: Minimizing Decision Fatigue to Improve Team Productivity

APPLICATION

Page 17: Minimizing Decision Fatigue to Improve Team Productivity

COMPONENTS

Page 18: Minimizing Decision Fatigue to Improve Team Productivity

UI

Page 19: Minimizing Decision Fatigue to Improve Team Productivity

PAIR PROGRAMMING

🕙10:00am

Page 20: Minimizing Decision Fatigue to Improve Team Productivity

PAIR PROGRAMMING - SETUP

Page 21: Minimizing Decision Fatigue to Improve Team Productivity

▸ Ping-Pong

PAIR PROGRAMMING - STYLES

+

▸ Driver + Navigator

Page 22: Minimizing Decision Fatigue to Improve Team Productivity

PAIR PROGRAMMING - IN ACTION▸ We pair 99% of the time

▸ All disciplines pair: Engineering, Design, PMs

▸ Change pairs daily

▸ Regularly switch tracks of work

Page 23: Minimizing Decision Fatigue to Improve Team Productivity

LUNCHTIME TECH TALK

🕧12:30pm

Page 24: Minimizing Decision Fatigue to Improve Team Productivity

BACK TO PAIRING

🕜1:30pm

Page 25: Minimizing Decision Fatigue to Improve Team Productivity

IMPROMPTU TEAM DISCUSSION

🕝2:30pm

Page 26: Minimizing Decision Fatigue to Improve Team Productivity

SWIFT FILE ORGANIZATION

Page 27: Minimizing Decision Fatigue to Improve Team Productivity

VIEW CONTROLLER: SHOW DOCUMENT ITEMS: ^ + 6class 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() { ... }

... }

Page 28: Minimizing Decision Fatigue to Improve Team Productivity

With “// MARK:”Without Annotations With “// MARK: —“MARK ANNOTATION COMPARISON

Page 29: Minimizing Decision Fatigue to Improve Team Productivity

VIEW CONTROLLER ORGANIZATIONclass 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() { ... }

Page 30: Minimizing Decision Fatigue to Improve Team Productivity

VIEW CONTROLLER ORGANIZATIONclass 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() { ... }

Page 31: Minimizing Decision Fatigue to Improve Team Productivity

CREATE TEMPLATE FROM XCODE SNIPPETS

Page 32: Minimizing Decision Fatigue to Improve Team Productivity

PROTOCOL CONFORMANCEstruct 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 { ... } }

Page 33: Minimizing Decision Fatigue to Improve Team Productivity

PROTOCOL CONFORMANCEstruct 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 { ... } }

Page 34: Minimizing Decision Fatigue to Improve Team Productivity

PROTOCOL CONFORMANCEstruct 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 { ... } }

Page 35: Minimizing Decision Fatigue to Improve Team Productivity

PROTOCOL CONFORMANCEstruct 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 { ... } }

Page 36: Minimizing Decision Fatigue to Improve Team Productivity

PING-PONG BREAK

🕞3:30pm

Page 37: Minimizing Decision Fatigue to Improve Team Productivity

CROSS-FUNCTIONAL PAIRING

🕓4:00pm

Engineering x Design

Page 38: Minimizing Decision Fatigue to Improve Team Productivity

STYLING UI OBJECTS

Page 39: Minimizing Decision Fatigue to Improve Team Productivity

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

Page 40: Minimizing Decision Fatigue to Improve Team Productivity

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

Page 41: Minimizing Decision Fatigue to Improve Team Productivity

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

Page 42: Minimizing Decision Fatigue to Improve Team Productivity

APPLYING STYLESextension 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) } }

Page 43: Minimizing Decision Fatigue to Improve Team Productivity

RETROSPECTIVE (RETRO)

🕔5:00pm

Page 44: Minimizing Decision Fatigue to Improve Team Productivity

RETROS - INGREDIENTS

🙂🙂

🙂

🙂

🙂

🙂

Core Team Members Food & Snacks

🍓🧀

🍙🍪

Drinks

☕🍵

🍷🍺

Page 45: Minimizing Decision Fatigue to Improve Team Productivity

RETROS @ PIVOTAL LABS

😃Discuss

😭Keep

😕Improve

Page 46: Minimizing Decision Fatigue to Improve Team Productivity

RETROS @ PIVOTAL LABS

▸ Reflect → Continuous improvement

▸ Building Trust

▸ Honest communication

▸ Identify & solve problems early

▸ Team brainstorming

Page 47: Minimizing Decision Fatigue to Improve Team Productivity

Kent Beck, Extreme Programming Explained

THE COURAGE TO SPEAK TRUTHS, PLEASANT OR UNPLEASANT,

FOSTERS COMMUNICATION AND TRUST.

Page 48: Minimizing Decision Fatigue to Improve Team Productivity

SUMMARY

▸ Project Standup

▸ Pair Programming

▸ Lunchtime Tech Talk

▸ Impromptu Team Discussions

▸ Cross-Functional Pairing

▸ Retrospectives

▸ Project Organization

▸ Swift File Organization

▸ Styling UI Objects

Page 49: Minimizing Decision Fatigue to Improve Team Productivity
Page 50: Minimizing Decision Fatigue to Improve Team Productivity
Page 51: Minimizing Decision Fatigue to Improve Team Productivity

A B

😓

A B

😓

A B

😓

A B

😓

A B

😓

A B

😓

Page 52: Minimizing Decision Fatigue to Improve Team Productivity

😓😓 😓

😓😓 😓

Page 53: Minimizing Decision Fatigue to Improve Team Productivity

😓😓 😓

😓😓 😓

Page 54: Minimizing Decision Fatigue to Improve Team Productivity

😁😃 😛

🙃😎 😅

Page 55: Minimizing Decision Fatigue to Improve Team Productivity

Thank you!

try! Swift March 2017

Page 56: Minimizing Decision Fatigue to Improve Team Productivity

@DEREKLEEROCK Thank you!

try! Swift March 2017