A podcast by iOS developers for iOS developers, delivering news, tips, and rants for professional iOS/Mac developers, with something for enterprise and indie developers alike.

Hosted by Darryl Thomas and John Sextro.

#114: It's All Unified

July 13, 2016 at 1:15PM • 47 minutes

Discussion - Notifications in iOS 10

  • Brief breakdown of WWDC sessions related to notifications
  • New stuff
    • APNS Token-based authentication
    • UserNotifications (and UserNotificationsUI) Framework (Unifies Remote and Local Notifications)
    • Access to user-defined notification settings
    • Expanded content
      • Titles
      • Subtitles
      • Media attachments
    • Scheduling and handling within Extensions
    • In-app presentation
    • Removal/update of pending notifications
    • Dismissal actions
    • Service Extensions
  • APNS Token-based authentication
    • Uses JSON Web Tokens (libraries widely available to assist with token generation)
    • For server-side solutions where using a certificate isn’t practical/feasible
    • Addresses issue of certificate expiration (though tokens also expire, new ones can be generated on the fly)
  • UserNotifications Framework

    • Provides a single notifications API across iOS, watchOS and tvOS
      • iOS: Full support for scheduling and management of notifications
      • watchOS: Support for forwarded notifications and local notifications on the watch
      • tvOS: Support for badging app icons
    • Key components/concepts:
      • UNUserNotificationCenter
        • Authorization requests
        • Scheduling via requests (by providing content and triggers)
      • UNNotificationRequest
        • Identifier
        • Content
        • Trigger
      • UNMutableNotificationContent
      • UNNotificationAttachment
        • Audio
        • Images
        • Video
      • Triggers
        • Push (UNPushNotificationTrigger is not instantiated by apps)
        • UNTimeIntervalNotificationTrigger
        • UNCalendarNotificationTrigger
        • UNLocationNotificationTrigger
      • UNUserNotificationCenterDelegate Protocol
        • userNotificationCenter:willPresentNotification:withCompletionHandler:
        • userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler
      • UNNotificationCategory - defines a type of notification, allows actionable notifications and content extensions
      • UNNotificationAction - represents a task you can perform in response to a notification
      • UNNotificationServiceExtension - Entry point for service extensions. Allows you to process the payload of a push notification before it is presented (eg: end-to-end encryption or notification attachments). Use in conjunction with “mutable-content: 1” in the aps portion of an APNS payload.
  • UserNotificationsUI Framework

    • Provides the UNNotificationContentExtension protocol
    • View controllers adopt this protocol, using the VC’s view to display the notification contents
    • Custom content is sandwiched between a header with the application icon and title and the default notification payload (default payload can be hidden using an attribute in the Info.plist)
    • No user interaction
    • Actions are displayed and extensions can respond to them by intercepting action responses
    • Protocol provides a didRecieveNotification: method you can use to set up UI in response to the notification




#113: Qualified Yeses

June 29, 2016 at 9:30AM • 59 minutes

John and Darryl recap and grade their WWDC wish-lists and discuss changes to the Human Interface Guidelines for iOS.

WWDC Wishlist Scorecard


  • Get serious about home automation, maybe make Apple TV an automation hub (Half Credit)
  • Siri as a Service (3rd party integration) (Yes)
  • Refactoring for Swift (in Xcode) (No)
  • Announce date to sunset Obj-C (No)
  • Xcode for iPad Pro (Half Credit)


  • More voice command vocabulary. Something like AppleScript (Half Credit)
  • Make Buttons Great Again (Quarter Credit)
  • Better accessibility hierarchy visualization tools built into Xcode (Three Quarters Credit)
  • Additional accessibility tools for checking things like color contrast. (TBD)
  • Improved dynamic font API (Yes, but not what I’d hoped for)
  • Upgrade pricing/trials (No: but we got clarification on subscriptions on The Talk Show)
  • Faster watch app loading. A way of deferring the most expensive parts? (Yes!)
  • Simulators and Xcode bots for Linux? (Lol)

iOS 10 HIG Changes

  • Widgets
    • Available on “Search” and above “Quick Action List” when you 3D touch an icon on Home screen
    • Panning/Scrolling not supported
    • Avoid backgrounds / no background images
    • Allow jump to app, but no “Open App” button. Allow interaction via content
  • Messages
    • Can now integrate with Message by providing a messaging extension
    • Content with Focus and Value
    • Constrained space
    • Simple/Intuitive interface
  • Integration with Siri
    • Don’t
      • Advertise
      • Impersonate Siri
    • Do
      • Minimize visual/touch interactions
      • Respond quickly
      • Take people directly to content
      • Improve accuracy via custom vocabulary
      • Provide example requests
  • Expanded Notifications
    • Detail view
    • Actions that make sense
    • There be dragons, destructive actions




Alternative show title suggestions

  • Stuck in my craw
  • Return of bezels
  • Cocoa-isims
  • I hate you
  • I’m not a fun person

#112: Wonderful Whisky Drinking Chat 2016

June 14, 2016 at 6:30PM • 3 hours 18 minutes

Darryl and Nolan are joined by Amro Mousa and Matt Massicotte to discuss the WWDC 2016 Keynote and Developer State of the Union. Also, Whisky.

The Whiskies


  • Pre-keynote observation

    • Hated the music
    • Apple TV Events app worked fine
  • Tim takes the stage

    • Talks about Orlando, offering sypathies. Called it an act of terrorism and hate.
    • Talks about Apple's diversity
    • Stream restarted
    • Moment of silence where there would normally be an energizing video
    • Bill Graham Auditorium
    • 27th WWDC
    • 13 Million Registered devs, growth of 2M y-t-y
    • 72% first-time attendies
    • 2 Million Apps on App Store
    • $50 Billion paid to developers
  • watchOS (Kevin Lynch)

    • Optimizations to App Launch time!!!
    • Instant response in watchOS 3
    • Apps stay in memory, support background updates
    • App dock replaces contacts!
    • Swipe up is now Control Center
    • Streamlined notification response workflow
    • Scribble! Handwriting (grafitti?) recognition
    • Improved watch faces
      • Minnie Mouse watch face
      • Activity watch face in 3 variants. Acts kinda like a full-screen complication
      • Numerals
      • Improved face switching with edge to edge swipe
    • Demo
      • Time to first woman on stage: approx. 15 minutes
      • Timer improvements
      • Reminders improvements
      • Find my Friends
    • SOS
      • Press and hold side button, and 911 is called after a countdown, notifies emergency contacts withlocation
      • Watch shows Medical ID info
      • Works internationally (calls the right emergency number)
    • Jay (Blahnic?) Activity sharing: allows you to view friends' activity and send messages
    • Support for Wheelchair users
      • Changes algorithms used to detect movement
      • "Time to roll" notification
      • Wheelchair-specific workouts
    • Breath App
      • Simple deep breathing sessions to calm and reduce stress
      • Supports reminder notifications
      • 1 to 5 minute sessions
      • Supports haptic feedback
      • Summary with time and heart rate
    • New APIs
      • In-app Apple Pay
      • Background workout info
      • SpriteKit & SceneKit
      • Native Events
      • Speaker Audio
      • Inline video
      • Game Center
    • Preview available today, release in Fall
  • tvOS (Eddy Cue)

    • 1300 Video Channels
    • 6000 Apps
    • New Remote App! w/ all the features of the physical remote
    • Siri
      • Search Movies by topic
      • Search YouTube!
      • Live Tune-In ("Watch ESPN 2")
        • iPad and AppleTV
    • Better authentication with Single sign-on
      • Also available on iOS
    • Dark Mode
    • ReplayKit
    • PhotoKit
    • HomeKit
    • Multiplayer Game sessions and more controller support
  • OS X (now macOS) (Craig)

    • Sierra
    • Continuity
      • AutoUnlock - proximity-based unlock of Mac
      • Universal Clipboard
    • iCloud Drive
      • 10 Billion documents today
      • Desktop syncing (and available on iOS)
      • Storage optimization (purges recoverable/unneeded files)
    • Apple Pay on the web
      • Authenticates using TouchID on iPhone
    • Tabs
      • System-wide support for tabs for all multi-windowed apps
    • Picture in Picture
    • Siri
      • Siri button/icon on dock
      • File search with filterable results
      • 200% more snark
      • Result pinning
    • Craig doesn't blink at paying $140 for movie tickets
    • Developer preview today, public beta in July, Release Fall
  • iOS

    • Biggest iOS release ever
    • Experience
      • Redesigned lock screen
        • Raise to wake a la watchOS
        • Notification redesign
        • 3d touch on notifications
        • Rich notification content
        • Clear all
        • Quicker access to camera, widgets and control center
      • 3d touch now supports display of widgets from app icons
    • Siri
      • 2 Billion requests a week
      • Developer API!!!
        • Messaging
          • Slack WhatsApp WeChat
        • Photosearch
        • Workouts
        • Payments
        • VoIP calling
        • Sounds like it's not a complete opening
    • QuickType Intelligent keyboard
      • Deep learning (LSTMs) for completion suggestions
        • Example: "Where are you?" provides option to send location
      • Contextual event creation
    • Photos
      • Places map view
      • Face recognition
      • Object and scene recognition
      • Memories clusters photos into collections that may be relevant
        • Automatically creates a slideshow movie of photos and videos
        • Provides length and mood controls to change editing and music of movie
      • Also on macOS
    • Maps
      • Proactive destinations
      • Destination filtering
      • Continued use of carosel (like the Memories stuff) Accessibility impact?
      • Destinations along your route
      • Alternative routes with time-saving estimations
      • CarPlay gets instrument panel turn-by-turn
      • Map Extensions!!
        • Book Reservations
        • Request a ride
    • Music
      • 15 Million paid subscribers
      • All new design
        • Clarity and simplicity
        • Improved library UI
      • Lyrics
      • Don't make developers participate!!!
    • News
      • 2000 publications, 60 million readers
      • Redesigned
        • For you is categorized, with smart topics
      • Subscriptions
      • Breaking news notifications
    • HomeKit
      • Home app
        • Access to scenes and individual accessory control
      • Integrated into control center
      • Interactive notifications
      • iPhone, iPad, Watch
    • Phone
      • Voicemail Transcription (Kinda like Google Voice)
      • Extension API (detect spam, etc)
      • VoIP API!
      • Side note: (Buttons look more like buttons)
    • Messages
      • Most-frequently used app on iOS
      • Rich links
      • Different camera and photo picker.
      • Big emoji (shit)
      • Emojifier
      • Bubble effects
      • Tap-back quick responses
      • Handwriting
      • Digital touch
      • Fullscreen effects
      • Annoying demo
      • iMessage Apps
        • Stickers
        • Annoying photo manipulation
        • Payment
        • Can I block Jibjab?
    • Differential privacy
    • One more thing: a video :(
    • Developer preview Today, public beta July, release Fall
  • Developers (Tim)

    • Swift playgrounds on iPad
      • (get insight from Amro re: hour of code with his 6 yr old)
      • Developer keyboard
      • Released today with the beta
      • Free
    • First "emotional" Apple video in a while to actually make me emotional

Developer State of the Union

  • iMessage Apps

    • Extensions
      • App Store
      • iMessage App Store
    • "Get app" link
    • Sticker art, UIKit
    • Display in the same space as the keyboard would, but can be expanded to fullscreen
    • MSSession, MSConversation, MSMessage
    • Privacy measures
    • Simulator support for viewing both sides of a conversation
  • Siri

    • SiriKit (first version)
    • Speech, Intent, Action, Response
    • Vocabulary
      • Plist for app vocabulary, code for user vocab
    • AppLogic, User Interface
      • Extension, NSUserActivity
    • Example: Hologram
    • Domain, Intent, Recipent, Content
  • Swift 3

  • Swift on iPad

    • File Format Docs
    • Lesson materials
    • Record sessions
    • Compatible with Xcode playgrounds
  • Xcode 8

    • Source Editor
      • Active line highlighting
      • Swift color literals
      • Swift image literals
      • Markup generation
      • App Extensions
        • Selection
        • Transforms
        • Pasteboard modification
      • Unified API Reference
        • Fully available offline
    • Interface Builder
      • Design-time effects
      • Device size configuration bar
      • Improved size-class support
      • Canvas operations at any zoom level!!
    • Captured crash logs
    • Test without building
    • Runtime issues
      • UI
      • Threads
        • Thread sanitizer
        • Identify race conditions and more
      • Memory
        • Display object graph
        • Identifies leaks with backtraces to where captures happen
        • Reference Cycle graph
    • Provisioning
      • New signing actions
      • Configuration and issue details
      • Actionable messages
      • Provisioning report
      • Automatic code signing with a dedicated profile
      • Customized code signing per build configuration
  • Platform

    • Compression
      • Open-sourcing lczse
    • Traffic prioritization
    • Logging
      • Unified
      • Levels
      • In memory trace
      • Privacy
      • New console application
    • File Systems
      • HFS+ 18+ years old
      • Apple File System
        • Scalable
        • Modern
          • Flash/SSD
          • Resilient
          • 64-bit
          • Encryption
        • Cloning (copy on write)
          • Fast
          • Zero space
          • File and directories
        • Snapshots
          • Full volume
          • Mountable
          • Supports reverting
        • Coming "Soon". Not specified
    • Differential Privacy
      • Adds noise to individual responses so that individual responses can't be identified
      • Privacy budget limits submissions per period
  • iOS

    • Share app from homescreen via 3D touch
    • Activity based integration
    • Extensions
      • Notifications
        • Service Extension
          • Modifies push payload before notification surfaces. Allows encryption or additional content downloads.
        • Content extensions
      • Widgits
        • New vibrant look
        • Additional compact size
  • iCloud available to all signed apps on macOS Sierra, not just App Store

  • CloudKit Sharing

    • Allows control over who can access data
    • CKShare class governs permissions
  • watchOS

    • Glanceable
    • Actionable
    • Responsive
    • Glances are no longer "necessary"
    • Workout apps run continuously during a workout even with screen off or when in another app
    • Raw access to crown events
    • Gesture recornizers
    • Gyroscope
    • Complications gallery
    • SceneKit/SpritKit
  • tvOS

    • Talking about stuff we already knew, but which wasn't discussed in WWDC2015
      • Focusable elements
      • TVMLKit
      • Handoff
    • Multipeer connectivity
    • 4 simultaneous game controllers
    • Updated controller policy: can require game controllers
  • Graphics

    • Color
      • Wide Color (P3) gamut
        • APIs
        • Sharing
        • PDF/print
        • System apps
        • Cameras capture deep color
        • API to access DNGs
        • API to capture LivePhotos
    • Metal
  • Games
    • ReplayKit streaming
    • GameCenter invitations via sharing
    • GameCenter sessions
    • GameplayKit


#111: Make Buttons Great Again

June 1, 2016 at 5:30PM • 1 hour 1 minute

Discussion - WWDC Wish List


  • Get serious about home automation, maybe make Apple TV an automation hub
  • Siri as a Service (3rd party integration)
  • Refactoring for Swift (in Xcode)
  • Announce date to sunset Obj-C
  • Xcode for iPad Pro


  • More voice command vocabulary. Something like AppleScript dictionaries?
  • Make Buttons Great Again
  • Better accessibility hierarchy visualization tools built into Xcode
  • Additional accessibility tools for checking things like color contrast.
  • Improved dynamic font API, better support for font replacement in IB
  • Upgrade pricing/trials
  • Faster watch app loading. A way of deferring the most expensive parts?
  • Simulators and Xcode bots for Linux?

Past Wish Lists



  • Samuel Ford’s Blog - Discovered as a part of the Swift dynamism conversation. Pretty good stuff.


#110: Caveat Apptor

May 18, 2016 at 12:30PM • 1 hour 4 minutes


  • Swift 3.0
    • To be available later this year
        * [Winding Down the Swift 3 release - Chris Lattner](
            * New “blue sky” proposals will be considered for post-3.0 development (~August)
            * Generics features (among other dependencies) are preventing the previously-planned ABI stability
            * ABI stability will come in a later release and is considered of “highest priority”
  • CareKit
    • Why use it?
      • enable people to actively manage their own medical conditions through app-based care plans, and symptom and medication monitoring, while sharing insights with care teams and others you trust
      • Examples:
        • Surgery recovery app
        • Depression treatment app
        • High blood pressure treatment app
    • What is it?
      • open source framework
      • can integrate with ResearchKit
      • able to access HealthKit data, when granted permission
    • ((Opinion)) Why the focus from Apple on Health Apps? Is this a legacy from Steve Jobs?
    • Components of CareKit
  • Care Card
  • Symptom and Measurement Tracker
  • Care Plan Store
  • Insights
  • Documents
  • Connect
  • Privacy concerns
    • Downloader beware. Make sure you understand the privacy policy for the app.
    • Make sure the app is from a reputable source




  • Start CareKit app for tracking the effectiveness of depression medication

#109: Mistakes Were Made

May 4, 2016 at 11:15AM • 45 minutes



  • What is it?
  • What was the motivation?
  • How do we incorporate it into our apps?
  • Pricing
    • Core product is free
    • Planned introduction of paid plans for enterprise teams
    • How did you arrive at this strategy?
  • Who did the voiceover for your demo video?

Creating a 3rd-party service and framework for iOS apps

  • You’re not only the primary engineer but also a PM. What is your process for user research and determining a roadmap?
  • Are there any key (and perhaps unexpected) differences from developing first-party applications?
  • How do you obtain information about framework stability as a third-party? (crashes, logging, etc)






#108: Peeling the Onion on Networking

April 20, 2016 at 9:15AM • 1 hour 15 minutes


Testing normal networks (aka, not the US)

  • 62.5% of the world’s 3.2 Billion internet users have 2G connections (or worse). That number is growing. LTE speeds aren’t going to catch up for at least a decade if not much longer.
  • When building robust networking between your client apps and your services, the common case should be the default case. AKA: not WiFi and not LTE.
  • Things that help a great deal:
    • Test on 2G and flaky networks
      • Helps to do real world testing in parking garages, elevators and in transit.
      • Simulation will be the highest reproducible ROI way to test
    • Fail fast and accurately. Timeouts play a part in this.
    • Be dynamic with how you handle the network.
      • Slower speeds should have less networking
    • Use modern tech, like HTTP/2
    • Defer, defer, defer (and prioritize)
    • Robustly handle errors
      • If at first you don’t succeed, try again! And again and again. Retry policies can get you from one-9 of success to three-9s very simply.
    • Design your network API in a robust manner!
  • Simulating bad connections:
  • Timeouts

    • List of timeouts:
      • TCP: connection timeout (TLS connection timeout too), SYN timeout, keepalive/idle timeout, retransmission timeout
      • NSURL: request timeout (max time between data being received in response - default is 60 seconds), resource timeout (time for entire transfer to complete - default is 7 days)
      • Custom timeouts: transaction timeouts (time from initiation to completion including redirects and retries), queue timeout (how long can the request be queued without starting before it times), idle timeout (how long can a request do nothing regarding upload or download before timeout)
    • NSURLSession has a problem with scale. Every different configuration setting requires another NSURLSession to be maintained and managed. Timeouts, different default headers, different TLS settings, different cookie settings, different NSURLCache, cellular vs non-cellular
  • Robust API design

    • Transactional APIs
    • Robust error codes (not just HTTP status codes!)
  • Retry policies to the rescue



  • Pain Free Constraints with Layout Anchors - A bit of follow-up from last week’s episode. I felt like John and I were having trouble explaining anchors, and I remembered this article from a few weeks back.


Alternative show title suggestions

  • Just remember: You’re wrong
  • Not all requests are made equal
  • Item potency

#107: Hit the TIE Fighter

April 13, 2016 at 8:15AM • 1 hour 17 minutes


Auto Layout

  • Stack Views, FTW (Auto Layout without constraints) (New in iOS 9, similar to what’s available in watchOS and NSStackView, which is available from OS X 10.9)
  • UILayoutGuide
    • New in iOS 9
    • Defines a rectangular geometry that can interact with Auto Layout
    • Eliminates the need (in many cases, at least) for views that are included solely for layout purposes (container views, spacing views, etc)
    • Views can still provide a greater degree of encapsulation
    • Provide anchors that can be used to generate constraints
  • Anatomy of constraints
    • The layout of your view hierarchy is defined as a series of linear equations. Each constraint represents a single equation. Your goal is to declare a series of equations that has one and only one possible solution.
    • Two basic types of attributes
  • Size attributes (for example, Height and Width)
  • Location attributes (for example, Leading, Left, and Top)
  • The following rules apply:
    • You cannot constrain a size attribute to a location attribute.
    • You cannot assign constant values to location attributes.
    • You cannot use a nonidentity multiplier (a value other than 1.0) with location attributes.
    • For location attributes, you cannot constrain vertical attributes to horizontal attributes.
    • For location attributes, you cannot constrain Leading or Trailing attributes to Left or Right attributes.
  • Rule of Thumb for clarity
    • Whole number multipliers are favored over fractional multipliers.
  • Positive constants are favored over negative constants.
  • Wherever possible, views should appear in layout order: leading to trailing, top to bottom.
  • Constraint Priorities
    • 1000 is required
    • < 1000 is optional
  • Intrinsic Content Size
    • Content Compression Resistance
    • Content Hugging
  • Debugging Auto Layout
    • Error Types
      • Unsatisfiable Layouts. Your layout has no valid solution.
        • Usually 2 or more required constraints conflict
    • Ambiguous Layouts. Your layout has two or more possible solutions.
        * Need additional constraints
      • conflicting optional constraints
    • Logical Errors. There is a bug in your layout logic.
  • Tips and Tricks
    • take advantage of the logs
    • use meaning identifiers on views and constraints
    • Debug > View Debugging > Show Alignment Rectangles





#106: Push It to the Limit

April 4, 2016 at 8:00PM • 53 minutes


Push Notification Overview

  • Notifications
    • Intended for user
    • Certificate required
    • Can be disabled
    • Remote vs. Local
      • Local - schedule by the app on device
        • Best example is Reminders app
        • Schedule by
          • elapsed time or exact time
          • location based
      • Remote - come from your server
  • Actions
    • Interactive Notifications
    • Categories
  • Text Input

    • New type of “Action”
    • Behavior is “.textInput”
  • APNS (Apple Push Notification Service)

    • Device token created by APNS, need to store on server, associated with particular client app
    • Payload must include aps, but can also include custom values, as well
    • Payload “aps dictionary”: alert (string or dictionary), badge, sound, content-available, category
    • Payload alert dictionary: title, body, title-loc-key, title-loc-args, action-loc-key, loc-key, loc-args, launch-image
    • Silent notifications (content-available == 1) wakes your app in the background so that you can fetch data, etc.
    • Feedback service, how to discover tokens that are no longer active
    • Device tokens are 32 bytes, may be increasing to 100 bytes soon
    • New provider API released in 2015
      • HTTP/2
        • notification requests to APNS get a response
        • multiplexed
        • binary
      • Notification requests
        • POST
        • json
      • Notification responses
        • 200 OK
        • 400 BAD REQUEST with json payload and reason
      • Instant Feedback
        • Allows you to learn about inactive tokens in the notification response via 410 status code in the response
      • Simplified Certificate Handling
        • Now one certificate for all push actions
      • Push notifications payload size increased from 2KB to 4KB

#105: Developer Productivity

March 30, 2016 at 10:30AM • 51 minutes

Motivation / Staying Productive


Mihaly Csikszentmihalyi

Flow theory postulates three conditions that have to be met to achieve a flow state:

  1. One must be involved in an activity with a clear set of goals and progress. This adds direction and structure to the task.
  2. The task at hand must have clear and immediate feedback. This helps the person negotiate any changing demands and allows them to adjust their performance to maintain the flow state.
  3. One must have a good balance between the perceived challenges of the task at hand and their own perceived skills. One must have confidence in one's ability to complete the task at hand.

Clear Distractions

  • What things easily distract you when you need to get work done
  • Make a list of these things
  • Twitter, imgur, reddit, tv, music
  • Clear these distractions
  • Use a distraction free setting
  • Get comfortable
  • Change your setting


  • Workout metaphor
  • Hard to slack
  • Intensity
  • Don't have to do it every day

Just 5 minutes

  • I use this technique with my kids for studying
  • 5 minutes doesn't really work for me
  • Instead I say write 5 lines
  • Sunk cost fallacy works in our favor
  • I'm already here. I have something started. I might as well keep going.

Push the peanut forward

  • You don't have to love it
  • You recognize that you just need to make some progress
  • Commit to sit down and get started

Free Writing

  • Used by writer
  • Set a timer, at least 5 minutes
  • Don't use the IDE
  • Don't write actual code, just pseudo code
  • Don't think just let the pseudo code flow

Pomodoro Method

  • Sit down in front of your computer
  • Set a 20 minute timer
  • You must take a 5 minute break
  • The importance of the break, related to exercise

David Burns MD

  • Write down, on a scale of 1 to 10, how satisfied do you think that you will feel by completing the work that you need to do
  • Write down, on a scale of 1 to 10, how painful will it be to do the work
  • Do this before as an estimate and then after recording the actual
  • Keep a running list and refer to it often