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

Minimizing Decision Fatigue to Improve Team Productivity

Apr 12, 2017

Download

Software

Derek Lee Boire
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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