1 00:00:16,970 --> 00:00:18,330 ADAM SANDERSON: All right folks. 2 00:00:18,330 --> 00:00:20,560 This is Unreasonable Estimates and 3 00:00:20,560 --> 00:00:24,380 Improbable Goals. My name's Adam Sanderson. 4 00:00:24,380 --> 00:00:26,960 I'm a full stack developer at LiquidPlanner. 5 00:00:26,960 --> 00:00:28,939 I've been there for about six, nearly 6 00:00:28,939 --> 00:00:32,198 seven years, working on Rails, databases, 7 00:00:32,198 --> 00:00:35,360 like, front end, back end. You name it. 8 00:00:35,360 --> 00:00:36,860 If you want to, you can find me on 9 00:00:36,860 --> 00:00:39,730 GitHub. Twitter. These slides are gonna be on Speaker 10 00:00:39,730 --> 00:00:42,040 Deck. It's all under Adam Sanderson. That makes it 11 00:00:42,040 --> 00:00:47,019 easy. But more awkward, I write code, or I 12 00:00:47,019 --> 00:00:50,010 write about code on monkeyandcrow dot com. If you 13 00:00:50,010 --> 00:00:52,400 like the talks about, like, reading and learning about 14 00:00:52,400 --> 00:00:55,799 Rails, I'm actually writing a series called reading Rails. 15 00:00:55,799 --> 00:00:59,080 So go check that out if that's what you're 16 00:00:59,080 --> 00:01:01,379 in to. And hey, it's RailsConf. You probably are. 17 00:01:01,379 --> 00:01:03,920 So, like I said, I work for LiquidPlanner. We 18 00:01:03,920 --> 00:01:07,570 make online project management software. Probably the most interesting 19 00:01:07,570 --> 00:01:10,320 thing for you guys is that we do probabilistic 20 00:01:10,320 --> 00:01:13,689 scheduling, which is pretty awesome. So if that sounds 21 00:01:13,689 --> 00:01:17,869 kind of cool, like everyone else here, we're hiring. 22 00:01:17,869 --> 00:01:19,579 And I need somebody to come help me build 23 00:01:19,579 --> 00:01:23,490 new stuff. So really, if you're in Seattle, let 24 00:01:23,490 --> 00:01:24,510 me know. 25 00:01:24,510 --> 00:01:27,409 So, you can't really work on project management software 26 00:01:27,409 --> 00:01:32,170 without thinking about the work of work. Specifically, I'm 27 00:01:32,170 --> 00:01:36,210 talking about estimating projects, finding the hidden costs involved 28 00:01:36,210 --> 00:01:39,979 in those, and then dealing with deadlines. Sounds like 29 00:01:39,979 --> 00:01:42,790 fun, right? Sounds like life. 30 00:01:42,790 --> 00:01:46,360 All right. How hard would it be? I get 31 00:01:46,360 --> 00:01:50,310 asked this question all the time. People come up 32 00:01:50,310 --> 00:01:52,840 to me, and they say, hey Adam, how hard 33 00:01:52,840 --> 00:01:54,710 would it be? How hard would it be to 34 00:01:54,710 --> 00:01:57,020 change all of our buttons from red to blue? 35 00:01:57,020 --> 00:01:59,080 How hard would it be to implement a new, 36 00:01:59,080 --> 00:02:01,690 like, class of user? How hard would it be 37 00:02:01,690 --> 00:02:08,399 to implement email integration? What should I do? 38 00:02:08,399 --> 00:02:10,889 Clarify. Before I tell somebody how hard it would 39 00:02:10,889 --> 00:02:13,230 be - and, pro tip, they don't care how 40 00:02:13,230 --> 00:02:15,370 hard you gotta hit the keyboard. What they're actually 41 00:02:15,370 --> 00:02:17,430 asking is, how long is it gonna take you 42 00:02:17,430 --> 00:02:22,730 to get this done? Before you tell them, clarify. 43 00:02:22,730 --> 00:02:25,400 Make sure you know what they want. Make sure 44 00:02:25,400 --> 00:02:27,450 that what's in your head is what's in their 45 00:02:27,450 --> 00:02:29,310 head. Because a lot of times when people come 46 00:02:29,310 --> 00:02:33,840 to us, developers have a very specific vocabulary. Things 47 00:02:33,840 --> 00:02:36,120 that we think mean one thing mean a different 48 00:02:36,120 --> 00:02:39,450 thing to somebody in sales, or marketing, or QA 49 00:02:39,450 --> 00:02:40,950 or support. 50 00:02:40,950 --> 00:02:43,760 So make sure that you know what they mean 51 00:02:43,760 --> 00:02:45,319 when they say, hey, how hard would it be 52 00:02:45,319 --> 00:02:49,340 to integrate email integration? Does that mean sending emails 53 00:02:49,340 --> 00:02:52,170 out of our system? Does it mean receiving emails 54 00:02:52,170 --> 00:02:55,290 from someone else? Does that mean a plugin for 55 00:02:55,290 --> 00:03:00,000 like Outlook or Gmail? If you don't clarify up 56 00:03:00,000 --> 00:03:03,060 front, you could spend a lot of time wandering 57 00:03:03,060 --> 00:03:04,819 off into the woods, and when you come back 58 00:03:04,819 --> 00:03:07,630 with your amazing feature, they're gonna look at it 59 00:03:07,630 --> 00:03:11,000 and be like, what? What is this? And you'll 60 00:03:11,000 --> 00:03:14,430 have just wasted, like, an hour. A day. A 61 00:03:14,430 --> 00:03:19,290 week. Oh, that's gonna suck. So clarify. 62 00:03:19,290 --> 00:03:25,110 Next, clarify. Ah. Again. So. Look, you know what 63 00:03:25,110 --> 00:03:27,140 you're doing, now you gotta figure out why you're 64 00:03:27,140 --> 00:03:31,530 doing it. Ask them. Hey, why do you need 65 00:03:31,530 --> 00:03:36,200 to me to integrate email integration? Maybe they turn 66 00:03:36,200 --> 00:03:38,180 around and they say, well, look, we've been getting 67 00:03:38,180 --> 00:03:41,000 a lot of customers sending us screenshots and it'd 68 00:03:41,000 --> 00:03:42,660 be nice to just be able to email those 69 00:03:42,660 --> 00:03:47,099 into the system. Does a better, does a solution 70 00:03:47,099 --> 00:03:51,250 already exist? If it does, you might be able 71 00:03:51,250 --> 00:03:53,510 to point them towards that. And a bonus for 72 00:03:53,510 --> 00:03:56,560 you, now you don't have to do anything. 73 00:03:56,560 --> 00:03:57,849 Maybe they turn around and they say, yeah, I 74 00:03:57,849 --> 00:04:00,489 know that that exists. But it's kind of a 75 00:04:00,489 --> 00:04:04,250 pain to use. Well, now maybe you've found that 76 00:04:04,250 --> 00:04:06,910 there's a better approach to solving their problem. Maybe 77 00:04:06,910 --> 00:04:09,659 you just need to fix existing functionality. People come 78 00:04:09,659 --> 00:04:13,569 to us, all the time, with prescriptions for solutions 79 00:04:13,569 --> 00:04:16,720 to problems. It's really useful for us to take 80 00:04:16,720 --> 00:04:19,149 a step back, and before we say, yeah, I'm 81 00:04:19,149 --> 00:04:21,720 gonna do that, to say, wait, why do you 82 00:04:21,720 --> 00:04:23,560 need me to do that? Maybe you can help 83 00:04:23,560 --> 00:04:27,440 them come to a better solution. And, by doing 84 00:04:27,440 --> 00:04:28,879 this, you're gonna get a better idea of what 85 00:04:28,879 --> 00:04:30,229 you need to do. 86 00:04:30,229 --> 00:04:33,680 All right. Once you know the what and you 87 00:04:33,680 --> 00:04:36,470 know the why, it's time to start thinking about 88 00:04:36,470 --> 00:04:39,020 estimating how hard it's gonna be. How long it's 89 00:04:39,020 --> 00:04:41,370 gonna take you. I want you to think about 90 00:04:41,370 --> 00:04:43,330 the major pieces of work that you're gonna need 91 00:04:43,330 --> 00:04:47,870 to do. Imagine the project and, instead of thinking 92 00:04:47,870 --> 00:04:49,740 about it in their terms, in terms of the 93 00:04:49,740 --> 00:04:52,120 domain of the person asking you, think about it 94 00:04:52,120 --> 00:04:54,870 in terms of what you have to do. 95 00:04:54,870 --> 00:04:56,960 Is it gonna require a lot of database work? 96 00:04:56,960 --> 00:04:59,310 Well, think about the tables. Is it gonna require 97 00:04:59,310 --> 00:05:00,960 a lot of work in Rails? Think about your 98 00:05:00,960 --> 00:05:04,220 models, your views, your controllers. Is it gonna require 99 00:05:04,220 --> 00:05:06,120 a lot of front end work? Well, think about 100 00:05:06,120 --> 00:05:09,870 the different components on the screen. Break these large 101 00:05:09,870 --> 00:05:13,840 tasks down into smaller things, and write it down. 102 00:05:13,840 --> 00:05:15,460 You're gonna need to refer back to this later 103 00:05:15,460 --> 00:05:17,870 anyways. This is the stuff that you need to 104 00:05:17,870 --> 00:05:21,310 do in order to, like, service their request. 105 00:05:21,310 --> 00:05:24,590 Next, sometimes it could be overwhelming to get some 106 00:05:24,590 --> 00:05:27,590 of these asks from people. You'll find that they 107 00:05:27,590 --> 00:05:30,860 have so many, like, business rules that they want, 108 00:05:30,860 --> 00:05:33,530 they've got so many little details that they want 109 00:05:33,530 --> 00:05:36,190 to impart upon you. It can make it really 110 00:05:36,190 --> 00:05:37,840 hard for you to see the forest for the 111 00:05:37,840 --> 00:05:41,370 trees. Step back for a moment. Try and find 112 00:05:41,370 --> 00:05:45,330 unifying principles in what they're asking for. Is there 113 00:05:45,330 --> 00:05:47,479 some model that you can make, in your head, 114 00:05:47,479 --> 00:05:50,360 that explains what they're looking for? It doesn't have 115 00:05:50,360 --> 00:05:52,190 to be perfect. It's just gotta be enough so 116 00:05:52,190 --> 00:05:54,930 that you understand what direction to be going in. 117 00:05:54,930 --> 00:05:58,370 Again, write this stuff down. You'll need it later. 118 00:05:58,370 --> 00:06:02,160 All right. You've broken stuff down. You've grouped stuff 119 00:06:02,160 --> 00:06:04,330 back up. It's now in a stage where you 120 00:06:04,330 --> 00:06:07,479 can sort of wrap your head around it. Think 121 00:06:07,479 --> 00:06:09,949 about other things that you've done. Have you done 122 00:06:09,949 --> 00:06:12,759 anything like this before? One of the unique things 123 00:06:12,759 --> 00:06:15,410 about our profession is that we tend not to 124 00:06:15,410 --> 00:06:18,639 do the same thing twice, and if we do, 125 00:06:18,639 --> 00:06:22,580 we're kind of doing it wrong. So, if you 126 00:06:22,580 --> 00:06:26,400 can, think about similar things. But maybe you haven't. 127 00:06:26,400 --> 00:06:28,120 Turn and ask one of the other developers in 128 00:06:28,120 --> 00:06:31,780 your company. Maybe they've worked on this code before. 129 00:06:31,780 --> 00:06:34,960 Maybe they've dealt with this type of issue before. 130 00:06:34,960 --> 00:06:38,460 They can help you get a better estimate. 131 00:06:38,460 --> 00:06:39,750 And on top of that, if they're doing their 132 00:06:39,750 --> 00:06:42,770 job right, maybe they'll ask you what it is 133 00:06:42,770 --> 00:06:44,699 that you're trying to do, and they'll ask you 134 00:06:44,699 --> 00:06:47,800 why. This is awesome, because it turns you around 135 00:06:47,800 --> 00:06:49,949 and makes you be the person who is asking 136 00:06:49,949 --> 00:06:53,419 you for work. It's really helpful for clarifying what 137 00:06:53,419 --> 00:06:55,210 you've got to do. 138 00:06:55,210 --> 00:07:01,280 Now, there are dozens of different methodologies. Different approaches. 139 00:07:01,280 --> 00:07:05,820 Different sciences of estimation. Here's what I want you 140 00:07:05,820 --> 00:07:11,150 to do. Make a guess. That's it. I know. 141 00:07:11,150 --> 00:07:12,789 You could play planning poker. You could do all 142 00:07:12,789 --> 00:07:15,630 number of things. But, just make a guess. Here. 143 00:07:15,630 --> 00:07:19,490 I'm gonna make it flash. There. Isn't that awesome? 144 00:07:19,490 --> 00:07:22,430 Seriously. Look, an estimate's just an informed guess. A 145 00:07:22,430 --> 00:07:24,960 lot of times, we put way too much value 146 00:07:24,960 --> 00:07:27,180 on an estimate. It's OK for you to be 147 00:07:27,180 --> 00:07:29,220 wrong and it's OK for you to be uncertain. 148 00:07:29,220 --> 00:07:33,889 In fact, if you're not uncertain, you're probably wrong. 149 00:07:33,889 --> 00:07:38,419 I want you to quantify that uncertainty. Embrace it. 150 00:07:38,419 --> 00:07:40,380 Are there things that you're being asked to do 151 00:07:40,380 --> 00:07:42,699 that you don't know how they're gonna spa- like, 152 00:07:42,699 --> 00:07:45,910 turn out? Maybe, like, you've got to load a 153 00:07:45,910 --> 00:07:47,850 whole of data into the database and you're not 154 00:07:47,850 --> 00:07:50,490 sure if it's gonna handle that. Maybe you've got 155 00:07:50,490 --> 00:07:53,240 to make some, like, flippy clicky thing that's gonna 156 00:07:53,240 --> 00:07:56,350 be, like, really hard to implement in Internet Explorer 157 00:07:56,350 --> 00:07:58,910 8. Do you know how that's gonna work? Maybe 158 00:07:58,910 --> 00:08:00,580 it will. Maybe it won't. 159 00:08:00,580 --> 00:08:03,669 Raise these things up. Let other people know. If 160 00:08:03,669 --> 00:08:05,669 they're asking you to do this work, say, you 161 00:08:05,669 --> 00:08:08,490 know, I'm not really sure about how this is 162 00:08:08,490 --> 00:08:11,610 gonna impact our database. I'm not really sure whether 163 00:08:11,610 --> 00:08:14,319 IE 8's gonna support this user interaction you're asking 164 00:08:14,319 --> 00:08:18,250 for. This is helpful, because it gives the other 165 00:08:18,250 --> 00:08:20,889 person a better understanding of what you need to 166 00:08:20,889 --> 00:08:21,720 be doing. 167 00:08:21,720 --> 00:08:28,289 Now, next, play a spread. Tell them a story. 168 00:08:28,289 --> 00:08:32,099 If everything goes well, I think that this might 169 00:08:32,099 --> 00:08:34,979 be done in a week. If I need to 170 00:08:34,979 --> 00:08:38,190 denormalize my database, if I need to do something 171 00:08:38,190 --> 00:08:41,139 really crazy to get this supported cross-browser, this could 172 00:08:41,139 --> 00:08:44,569 take me four weeks. Look, it's a lot easier 173 00:08:44,569 --> 00:08:46,870 for you to hit an estimate, a range, than 174 00:08:46,870 --> 00:08:49,189 it is for you to give them one hard 175 00:08:49,189 --> 00:08:52,579 number. So that's great for us. But it's also 176 00:08:52,579 --> 00:08:54,489 good for the person asking you to do the 177 00:08:54,489 --> 00:08:57,040 work. Because you're giving them a story about the 178 00:08:57,040 --> 00:09:00,459 future. You're telling them useful information about how this 179 00:09:00,459 --> 00:09:04,819 could play out. And if they've got that information, 180 00:09:04,819 --> 00:09:08,389 they can start making better, better use of that. 181 00:09:08,389 --> 00:09:10,559 They can plan better based on that. And it 182 00:09:10,559 --> 00:09:13,779 starts a better dialogue between you. 183 00:09:13,779 --> 00:09:17,720 But you're not done there. You've got to deal 184 00:09:17,720 --> 00:09:24,720 with this uncertainty. Nobody likes to get bad news. 185 00:09:25,360 --> 00:09:28,369 Nobody likes to find out that the project is 186 00:09:28,369 --> 00:09:30,730 doomed. But you know when they like to hear 187 00:09:30,730 --> 00:09:33,160 that? Never. OK. Do you know when they'll tolerate 188 00:09:33,160 --> 00:09:36,360 it? They'll tolerate it right at the very beginning. 189 00:09:36,360 --> 00:09:38,529 You know when they won't tolerate it? In the 190 00:09:38,529 --> 00:09:39,579 eleventh hour. 191 00:09:39,579 --> 00:09:42,550 Oh, man. Are you gonna be ever so happy 192 00:09:42,550 --> 00:09:46,050 when your fellow developer says, hey, guys, I know 193 00:09:46,050 --> 00:09:49,209 we're gonna ship, but I just checked the clicky 194 00:09:49,209 --> 00:09:53,170 flippy thing in IE-8, and it doesn't work. 195 00:09:53,170 --> 00:09:55,879 Wait, we're supposed to ship when? 196 00:09:55,879 --> 00:09:58,319 Nobody wants to find out that the uncertainty got 197 00:09:58,319 --> 00:10:01,279 left to the end. So do it first. It's 198 00:10:01,279 --> 00:10:04,980 really hard to do this, but deal with uncertainty 199 00:10:04,980 --> 00:10:07,720 up front. That way, when you find out that 200 00:10:07,720 --> 00:10:10,459 something's going to take a long time, you can 201 00:10:10,459 --> 00:10:12,899 communicate that back to people, and you guys can 202 00:10:12,899 --> 00:10:15,739 adjust your plans to accommodate that. 203 00:10:15,739 --> 00:10:17,290 I know. We always want to do the fun 204 00:10:17,290 --> 00:10:19,399 things first. I want to like, jump in and 205 00:10:19,399 --> 00:10:21,949 do the stuff that I know really well first, 206 00:10:21,949 --> 00:10:24,689 because I feel like I'm making progress. That's a 207 00:10:24,689 --> 00:10:28,939 great way to set yourself up for failure later. 208 00:10:28,939 --> 00:10:32,839 Now, doing that alone isn't enough. 209 00:10:32,839 --> 00:10:39,259 You remember that estimate? Change it. Change it continuously. 210 00:10:39,259 --> 00:10:41,480 As you learn new things, as you figure out 211 00:10:41,480 --> 00:10:44,459 the uncertain things, and as you make progress, circle 212 00:10:44,459 --> 00:10:47,910 back and tell anybody who depends on you how 213 00:10:47,910 --> 00:10:51,059 long this is gonna take. Give them your vision 214 00:10:51,059 --> 00:10:53,619 of the future. Give them your mental model of 215 00:10:53,619 --> 00:10:56,739 what the risks are. Give them the understanding that 216 00:10:56,739 --> 00:10:59,420 you have, right now, about what you think is 217 00:10:59,420 --> 00:11:01,629 gonna happen. 218 00:11:01,629 --> 00:11:03,529 Communicate often. 219 00:11:03,529 --> 00:11:08,459 All right. Let's talk about the Dark Arts of 220 00:11:08,459 --> 00:11:11,670 project management, for a moment. Look, you know what 221 00:11:11,670 --> 00:11:13,420 you're doing. You know why you're doing it. You've 222 00:11:13,420 --> 00:11:18,480 got an estimate and now. Oh. Shoot. 223 00:11:18,480 --> 00:11:23,299 We can get screwed, as developers. We think that 224 00:11:23,299 --> 00:11:28,709 we're all logical. That we're sane. Now. This ever 225 00:11:28,709 --> 00:11:30,699 happen to you? It happens to me all the 226 00:11:30,699 --> 00:11:32,360 time. Somebody comes up to me and they say, 227 00:11:32,360 --> 00:11:33,619 hey, Adam, how long's it gonna take? And I 228 00:11:33,619 --> 00:11:35,660 say, it's gonna take about three weeks. And they 229 00:11:35,660 --> 00:11:37,569 say, look, we need this done really quickly. Could 230 00:11:37,569 --> 00:11:39,989 you maybe do it in one? And I say. 231 00:11:39,989 --> 00:11:43,119 Well. Oh. How about two weeks? 232 00:11:43,119 --> 00:11:44,509 I thought that I was just being nice. I 233 00:11:44,509 --> 00:11:46,739 thought that I was just splitting the difference, right. 234 00:11:46,739 --> 00:11:48,089 Wrong. I just screwed myself. 235 00:11:48,089 --> 00:11:52,360 It's natural for people to haggle. But you don't 236 00:11:52,360 --> 00:11:55,939 win when people are estima- or bargaining over estimates. 237 00:11:55,939 --> 00:11:58,939 Look, you're estimate is your best understanding of what 238 00:11:58,939 --> 00:12:01,739 the future holds. What made it go from three 239 00:12:01,739 --> 00:12:04,759 weeks to two weeks? How did you suddenly manage 240 00:12:04,759 --> 00:12:08,639 to shave off a whole week of work in 241 00:12:08,639 --> 00:12:11,089 five seconds? Cause I want to know. I need 242 00:12:11,089 --> 00:12:12,819 to be able to do that later, so you 243 00:12:12,819 --> 00:12:14,239 come up and you tell me. 244 00:12:14,239 --> 00:12:17,220 No, look, you can't negotiate time. But you can 245 00:12:17,220 --> 00:12:21,920 negotiate features. And as you learn more about the 246 00:12:21,920 --> 00:12:25,739 project, you can re-estimate. Moral of this story, don't 247 00:12:25,739 --> 00:12:28,410 give people estimates that you think are gonna make 248 00:12:28,410 --> 00:12:30,989 them happy. Give them estimates that you think are 249 00:12:30,989 --> 00:12:32,100 true. 250 00:12:32,100 --> 00:12:33,589 If they keep badgering you about it, point it 251 00:12:33,589 --> 00:12:37,910 out. Say, hey, look, I know what you're doing 252 00:12:37,910 --> 00:12:42,290 here. I see what you're doing. Estimation bargaining. It's 253 00:12:42,290 --> 00:12:44,470 not gonna work. Not only is it not gonna 254 00:12:44,470 --> 00:12:46,839 work for me, it's not gonna work for you. 255 00:12:46,839 --> 00:12:50,009 If you give into this kind of thing, you're 256 00:12:50,009 --> 00:12:53,720 actually setting up not just yourself for trouble but 257 00:12:53,720 --> 00:12:56,869 your team. The people who rely on you. And, 258 00:12:56,869 --> 00:12:58,369 whether or not the person asking you to do 259 00:12:58,369 --> 00:13:00,389 the work knows it, you're setting them up for 260 00:13:00,389 --> 00:13:03,299 failure as well. Because they depend on that estimate 261 00:13:03,299 --> 00:13:05,269 that you just gave them. 262 00:13:05,269 --> 00:13:07,569 So, you know what you're doing. You know why 263 00:13:07,569 --> 00:13:09,809 you're doing it. You've got an estimate. You defended 264 00:13:09,809 --> 00:13:13,350 it. Maybe you shouldn't do it at all. There 265 00:13:13,350 --> 00:13:17,730 are hidden costs involved in everything. Like complexity costs. 266 00:13:17,730 --> 00:13:22,319 Look, some features that we build incur future, incur 267 00:13:22,319 --> 00:13:25,389 costs on all the future work that we do. 268 00:13:25,389 --> 00:13:27,879 For instance, if you build a new RESTful API, 269 00:13:27,879 --> 00:13:31,319 great idea. If you build a new, like, axis 270 00:13:31,319 --> 00:13:34,350 controls, you're just dropping in can-can. If you build, 271 00:13:34,350 --> 00:13:39,970 like, a new mo- native mobile client. Yeah. You're 272 00:13:39,970 --> 00:13:44,139 not done there. From now on, every new feature 273 00:13:44,139 --> 00:13:47,230 that you implement has to take those old features 274 00:13:47,230 --> 00:13:50,379 into account. So what you just did is you 275 00:13:50,379 --> 00:13:53,339 made it so that your future work, future work, 276 00:13:53,339 --> 00:13:55,529 is gonna hate past you. 277 00:13:55,529 --> 00:14:00,329 You're just incurring new costs for the future. So 278 00:14:00,329 --> 00:14:03,149 watch out for these cost-cutting concerns. they can really 279 00:14:03,149 --> 00:14:04,679 bite us sometimes. 280 00:14:04,679 --> 00:14:07,869 Now, there are ways to do this that are 281 00:14:07,869 --> 00:14:09,720 gonna cut down on those costs. You can never 282 00:14:09,720 --> 00:14:12,809 get rid of them entirely. But, if you want 283 00:14:12,809 --> 00:14:16,379 to, do the extra engineering up front, factor that 284 00:14:16,379 --> 00:14:19,439 into your original estimate. Let the people know that 285 00:14:19,439 --> 00:14:22,749 you're gonna need a little bit more time. 286 00:14:22,749 --> 00:14:25,839 What about operational costs? Look, are you introducing new 287 00:14:25,839 --> 00:14:27,910 moving parts? You're gonna build a new job queue. 288 00:14:27,910 --> 00:14:30,290 You're gonna throw resq and redis in place. They're 289 00:14:30,290 --> 00:14:32,929 awesome tech. But guess what? They're costly. 290 00:14:32,929 --> 00:14:35,879 How are you gonna test this in production server? 291 00:14:35,879 --> 00:14:38,059 How are you gonna monitor it? How are you 292 00:14:38,059 --> 00:14:40,089 gonna deploy this? How are you gonna make sure 293 00:14:40,089 --> 00:14:42,660 that it's running every time you spin up a 294 00:14:42,660 --> 00:14:44,639 new server? 295 00:14:44,639 --> 00:14:49,499 It's not necessarily hard. But it does take time. 296 00:14:49,499 --> 00:14:51,679 And once you've done it, it still takes time. 297 00:14:51,679 --> 00:14:56,459 And you know what? When resq goes down, who 298 00:14:56,459 --> 00:14:59,359 are they gonna call? They're gonna call you. You're 299 00:14:59,359 --> 00:15:01,569 the one that put it in place, right. So 300 00:15:01,569 --> 00:15:04,169 dealing with that is gonna take more time out 301 00:15:04,169 --> 00:15:06,939 of what you consider to be your budget for 302 00:15:06,939 --> 00:15:10,239 developing. 303 00:15:10,239 --> 00:15:13,720 Support costs. These are awesome. There are a lot 304 00:15:13,720 --> 00:15:15,720 of things that we can do as developers that 305 00:15:15,720 --> 00:15:18,100 are just really easy. We can knock out a 306 00:15:18,100 --> 00:15:23,220 feature in like ten minutes. The downside? Nobody understands 307 00:15:23,220 --> 00:15:25,459 how that feature works. 308 00:15:25,459 --> 00:15:28,649 So what if your users don't get it? Like, 309 00:15:28,649 --> 00:15:30,549 you built this awesome thing, and they've got no 310 00:15:30,549 --> 00:15:32,339 clue what it does. Who are they gonna talk 311 00:15:32,339 --> 00:15:34,569 to? Well, if you've got one, they're gonna talk 312 00:15:34,569 --> 00:15:37,089 to your support team. I hope your support team 313 00:15:37,089 --> 00:15:40,209 understands - your support team doesn't understand it. OK. 314 00:15:40,209 --> 00:15:44,230 Awesome. Your support team's now talking to you. 315 00:15:44,230 --> 00:15:46,779 And that takes time that you're gonna be not 316 00:15:46,779 --> 00:15:50,369 able to develop in. What if your business, as 317 00:15:50,369 --> 00:15:56,649 a whole, doesn't get it? Meetings. That's what. And 318 00:15:56,649 --> 00:15:58,449 you know what meetings mean? It's not just your 319 00:15:58,449 --> 00:16:01,529 time that's being used up then, it's the entire 320 00:16:01,529 --> 00:16:04,439 company. Everyone around that table? You're sinking more and 321 00:16:04,439 --> 00:16:06,600 more costs into this. 322 00:16:06,600 --> 00:16:10,290 So, again, you can combat some of this, but 323 00:16:10,290 --> 00:16:13,299 go back, update those estimates, to factor this in. 324 00:16:13,299 --> 00:16:18,959 What about opportunity costs? Slightly different thing. But think 325 00:16:18,959 --> 00:16:20,970 about this. You can really only do one thing 326 00:16:20,970 --> 00:16:24,809 at a time. So what's the highest priority thing 327 00:16:24,809 --> 00:16:27,009 for you to be doing right now? What's the 328 00:16:27,009 --> 00:16:29,399 highest priority thing for your team? For your business 329 00:16:29,399 --> 00:16:32,819 as a whole? Because, whatever you're doing now is 330 00:16:32,819 --> 00:16:35,489 excluding every other feature that you could be working 331 00:16:35,489 --> 00:16:40,220 on right now. 332 00:16:40,220 --> 00:16:43,350 Think about it. Prioritize all the things that you 333 00:16:43,350 --> 00:16:45,019 would like to be doing. All the things that 334 00:16:45,019 --> 00:16:47,029 you know you should be doing. Make sure that 335 00:16:47,029 --> 00:16:51,189 this is actually the most important thing. Not just 336 00:16:51,189 --> 00:16:53,929 the most immediate thing that you need to deal 337 00:16:53,929 --> 00:16:54,660 with. 338 00:16:54,660 --> 00:16:58,189 Look, I'm not saying don't do anything, but weigh 339 00:16:58,189 --> 00:17:03,100 the costs. Understand them. Recognize them. Everything that we 340 00:17:03,100 --> 00:17:07,240 do as developers costs us down the road. Choose 341 00:17:07,240 --> 00:17:09,449 which ones you're willing to pay. 342 00:17:09,449 --> 00:17:14,089 All right. More Dark Arts, cause I love these. 343 00:17:14,089 --> 00:17:17,040 This one's the most insidious. This one trips us 344 00:17:17,040 --> 00:17:21,299 up as developers, because we've got egos, and it's 345 00:17:21,299 --> 00:17:25,699 really easy to manipulate us. This happen to you? 346 00:17:25,699 --> 00:17:26,970 Somebody comes up to you, they say, hey, how 347 00:17:26,970 --> 00:17:28,049 long's it gonna take? And you say, I don't 348 00:17:28,049 --> 00:17:30,519 know, about a week? And they say, really? Oh, 349 00:17:30,519 --> 00:17:34,840 and they look so disappointed. And then they say, 350 00:17:34,840 --> 00:17:38,409 I thought you were smarter than that. 351 00:17:38,409 --> 00:17:42,630 Wow. That hurts. Then, it's like, kicking you when 352 00:17:42,630 --> 00:17:45,720 you're down. They say, oh, I'll go ask her. 353 00:17:45,720 --> 00:17:49,049 I'll go ask the intern. She seems pretty smart. 354 00:17:49,049 --> 00:17:52,179 Ah. Even worse. You know what happens next? I 355 00:17:52,179 --> 00:17:54,880 don't know about you. But me? I start begging 356 00:17:54,880 --> 00:17:56,740 to do the work. I'm like, you know what? 357 00:17:56,740 --> 00:17:59,360 Did I say a week? I meant maybe, like, 358 00:17:59,360 --> 00:18:00,080 three days. 359 00:18:00,080 --> 00:18:03,019 Whoa, stop going towards the intern. One day? I'll 360 00:18:03,019 --> 00:18:05,929 have it to you by noon. 361 00:18:05,929 --> 00:18:08,090 Fuck. 362 00:18:08,090 --> 00:18:12,789 Aw. Don't let your ego get you into trouble. 363 00:18:12,789 --> 00:18:15,929 Stand by those estimates. Really, the best thing that 364 00:18:15,929 --> 00:18:18,360 we can be as developers, in this case, is 365 00:18:18,360 --> 00:18:21,850 have a little humility. And if you see somebody 366 00:18:21,850 --> 00:18:24,610 trying to do this to you, call their bluff. 367 00:18:24,610 --> 00:18:27,389 Like, they're not really gonna go to the intern. 368 00:18:27,389 --> 00:18:29,240 Well, they might. And it might be a learning 369 00:18:29,240 --> 00:18:30,960 experience for everyone. 370 00:18:30,960 --> 00:18:35,220 But name this. Say, I know what you're doing 371 00:18:35,220 --> 00:18:37,909 there. It's not gonna work on me. Stand up 372 00:18:37,909 --> 00:18:42,429 for yourself. And if you can't, find a new 373 00:18:42,429 --> 00:18:43,149 job. 374 00:18:43,149 --> 00:18:47,350 All right. Deadlines. Like, I've got one coming up 375 00:18:47,350 --> 00:18:52,759 in eleven minutes. 376 00:18:52,759 --> 00:18:57,190 Deadlines come in all forms. They come in a 377 00:18:57,190 --> 00:19:00,740 spectrum. From soft deadlines to hard deadlines. Soft deadlines 378 00:19:00,740 --> 00:19:03,409 are things like goals. They're things we would like 379 00:19:03,409 --> 00:19:06,130 to achieve. For instance, we would like to ship 380 00:19:06,130 --> 00:19:08,190 this by the end of the week. We would 381 00:19:08,190 --> 00:19:11,190 like to get this out by, I don't know, 382 00:19:11,190 --> 00:19:14,000 this next conference. Hey, we're gonna try to get 383 00:19:14,000 --> 00:19:17,570 this out for the customer by Q1. 384 00:19:17,570 --> 00:19:23,070 Hard deadlines are things like, RailsConf. For me, anyways. 385 00:19:23,070 --> 00:19:28,220 Can you imagine, RubyCentral sending out an email. They 386 00:19:28,220 --> 00:19:31,149 say, hey guys, funny story. Adam didn't do his 387 00:19:31,149 --> 00:19:37,429 slides, so we're postponing RubyConf by, like, a week. 388 00:19:37,429 --> 00:19:38,720 Just change your reservations. 389 00:19:38,720 --> 00:19:41,149 Yeah. I'm not DHH, so I can't get away 390 00:19:41,149 --> 00:19:42,380 with that. 391 00:19:42,380 --> 00:19:48,130 It's a hard deadline. So when hard deadlines come 392 00:19:48,130 --> 00:19:51,460 up. Actually, when all deadlines come up, what do 393 00:19:51,460 --> 00:19:54,259 we do? You gotta deal with it. Ignoring it's 394 00:19:54,259 --> 00:19:59,179 not gonna work, and panicking also doesn't work. So, 395 00:19:59,179 --> 00:20:01,070 we've really got four options. The first two are 396 00:20:01,070 --> 00:20:03,710 ones that we as developers think that we really 397 00:20:03,710 --> 00:20:06,419 like, and the second two are ones that managers 398 00:20:06,419 --> 00:20:09,440 think that they really like. Nobody really likes any 399 00:20:09,440 --> 00:20:12,220 of these options, when you get down to it. 400 00:20:12,220 --> 00:20:15,600 But, if it's a soft deadline, if it's just 401 00:20:15,600 --> 00:20:20,929 a goal, you guys can ship late. You can 402 00:20:20,929 --> 00:20:23,980 miss. Maybe. It's probably not the end of the 403 00:20:23,980 --> 00:20:27,500 world. Don't do this all the time, cause you're 404 00:20:27,500 --> 00:20:32,480 gonna look like an idiot. But recognize. Weigh the 405 00:20:32,480 --> 00:20:37,570 balance, weigh the thingies that you've gotta weigh. I 406 00:20:37,570 --> 00:20:39,320 don't know. 407 00:20:39,320 --> 00:20:42,889 Yeah. This talk is about work. Not about how 408 00:20:42,889 --> 00:20:45,110 to give a good talk. 409 00:20:45,110 --> 00:20:51,330 Rad. So, yeah. Sometimes you can ship late. Of 410 00:20:51,330 --> 00:20:53,600 course, there are hard deadlines, right. There are things 411 00:20:53,600 --> 00:20:58,350 like RubyConf. And I can't miss this deadline. If 412 00:20:58,350 --> 00:21:00,600 I did, we would all be standing here and 413 00:21:00,600 --> 00:21:03,559 I would be stammering like I was. So what 414 00:21:03,559 --> 00:21:04,690 else can we do? 415 00:21:04,690 --> 00:21:07,759 Well, we can cut scope. We can cut features. 416 00:21:07,759 --> 00:21:13,840 Like, honestly, prioritize the things that you've gotta do. 417 00:21:13,840 --> 00:21:16,470 Figure out what you can get done by the 418 00:21:16,470 --> 00:21:19,220 deadline. Cut the rest. 419 00:21:19,220 --> 00:21:23,330 For instance, I illustrated like all of these slides, 420 00:21:23,330 --> 00:21:25,610 except for, I got about here and I ran 421 00:21:25,610 --> 00:21:30,159 out of time. So I cut my little illustration. 422 00:21:30,159 --> 00:21:36,909 One of the things that is scary about this, 423 00:21:36,909 --> 00:21:40,590 though, is that some of the things that get 424 00:21:40,590 --> 00:21:43,909 cut are the things that we, as developers, think 425 00:21:43,909 --> 00:21:50,909 are important. Performance. Testing. Correctness. All these things can 426 00:21:55,659 --> 00:21:57,990 get cut if you're not careful. So if you 427 00:21:57,990 --> 00:22:01,710 value that, make sure that it's put high in 428 00:22:01,710 --> 00:22:04,490 your priority. Make sure that you guard that against 429 00:22:04,490 --> 00:22:06,429 the deadline. 430 00:22:06,429 --> 00:22:10,769 OK. Another option. If you're not gonna get it 431 00:22:10,769 --> 00:22:13,230 done and you can't ship later and you can't 432 00:22:13,230 --> 00:22:16,769 cut features, well you can add more people, right? 433 00:22:16,769 --> 00:22:19,259 Well, you could go read the Mythical Man Month, 434 00:22:19,259 --> 00:22:23,240 but basically boils down to this. Unless you've got 435 00:22:23,240 --> 00:22:29,190 a project where everybody can work completely independently, you're 436 00:22:29,190 --> 00:22:32,539 gonna have to start talking to each other. Eh. 437 00:22:32,539 --> 00:22:35,919 It's kind of uncomfortable. 438 00:22:35,919 --> 00:22:40,320 So, I'm about to miss my deadline. They pull 439 00:22:40,320 --> 00:22:42,299 you in to work with me. Now you and 440 00:22:42,299 --> 00:22:44,129 I have to start talking. We've gotta make sure 441 00:22:44,129 --> 00:22:46,799 that we aren't gonna be stepping on each other's 442 00:22:46,799 --> 00:22:48,590 toes. We've got to keep each other appraised of 443 00:22:48,590 --> 00:22:51,679 the situation. We've gotta understand which direction we're both 444 00:22:51,679 --> 00:22:53,879 going in. 445 00:22:53,879 --> 00:22:56,940 That adds overhead. And if you're splitting up work 446 00:22:56,940 --> 00:23:00,409 between two people, it means that you're gonna start, 447 00:23:00,409 --> 00:23:02,490 like, depending on the other person to get things 448 00:23:02,490 --> 00:23:05,169 done. And if I'm waiting on you and I'm 449 00:23:05,169 --> 00:23:08,230 twiddling my thumbs, that's sort of wasted time. That's 450 00:23:08,230 --> 00:23:10,889 time that's not actually going towards getting the work 451 00:23:10,889 --> 00:23:12,409 out. 452 00:23:12,409 --> 00:23:17,480 So, adding more people sometimes works. But sometimes, it's 453 00:23:17,480 --> 00:23:20,210 just gonna make everything go more slowly. 454 00:23:20,210 --> 00:23:24,179 Oh, and if you do add more people, make 455 00:23:24,179 --> 00:23:28,169 sure they get along. Cause nothing is more awkward 456 00:23:28,169 --> 00:23:32,149 than running up against a deadline, working with somebody 457 00:23:32,149 --> 00:23:34,350 who you want to punch. Like, this is how 458 00:23:34,350 --> 00:23:37,320 sparks fly, right? You don't want to do this. 459 00:23:37,320 --> 00:23:38,850 All right. 460 00:23:38,850 --> 00:23:42,870 The final way that you can deal with a 461 00:23:42,870 --> 00:23:45,049 deadline. If you can't two people to do the 462 00:23:45,049 --> 00:23:47,929 work twice as fast, maybe you can make one 463 00:23:47,929 --> 00:23:53,210 person work twice as hard. Ah. This really sucks. 464 00:23:53,210 --> 00:23:54,669 And I'll tell you why. 465 00:23:54,669 --> 00:24:01,429 It works. It can. Honestly. But it's not sustainable. 466 00:24:01,429 --> 00:24:03,659 And I don't think any of us enjoy it. 467 00:24:03,659 --> 00:24:05,629 Look, think about this. You've got eight hours to 468 00:24:05,629 --> 00:24:07,070 work. You've got eight hours to sleep. And then 469 00:24:07,070 --> 00:24:09,249 you've got eight hours for your daily commute, for 470 00:24:09,249 --> 00:24:11,620 cleaning up after your dog, for cooking dinner, for 471 00:24:11,620 --> 00:24:14,149 spending time with your friends, your family, for reading 472 00:24:14,149 --> 00:24:21,149 seventeenth century poetry. 473 00:24:21,200 --> 00:24:23,590 Where's that overtime gonna come out of? I gotta 474 00:24:23,590 --> 00:24:27,570 hint for you. It's not coming out of work. 475 00:24:27,570 --> 00:24:34,570 Bummer. OK, your only two remaining options are sleep 476 00:24:34,570 --> 00:24:38,039 and what I would like to call life. So, 477 00:24:38,039 --> 00:24:41,409 if that time's coming out of sleep, you're gonna 478 00:24:41,409 --> 00:24:46,970 be tired. You're not gonna be very proficient. You're 479 00:24:46,970 --> 00:24:48,850 not gonna be thinking straight. 480 00:24:48,850 --> 00:24:52,610 We make the stupidest mistakes when we're up at 481 00:24:52,610 --> 00:24:58,879 3 AM pounding on our keyboards. So quality takes 482 00:24:58,879 --> 00:25:05,360 a hit. Shoot. Well, OK. What about life? 483 00:25:05,360 --> 00:25:06,759 Use up a little bit of life to get 484 00:25:06,759 --> 00:25:10,740 this out the door. This, this is the path 485 00:25:10,740 --> 00:25:17,320 to burn out. To depression. Use it very sparingly. 486 00:25:17,320 --> 00:25:20,299 Use it wisely. Think to yourself, is this more 487 00:25:20,299 --> 00:25:23,519 important than cleaning up after my dog? Is this 488 00:25:23,519 --> 00:25:28,889 more important than spending time with my kids? Depends 489 00:25:28,889 --> 00:25:34,620 on how much you like your kids, right. 490 00:25:34,620 --> 00:25:36,940 Just be careful. That's all I can say. 491 00:25:36,940 --> 00:25:39,129 All right. Let's talk about one more of the 492 00:25:39,129 --> 00:25:45,370 Dark Arts. Deadline hardening. This is the magical thing. 493 00:25:45,370 --> 00:25:47,299 Whoops. I don't want to show this to you 494 00:25:47,299 --> 00:25:50,049 yet. I gotta tell you about it first. Because, 495 00:25:50,049 --> 00:25:51,929 here's what I love about this one. It happens 496 00:25:51,929 --> 00:25:54,799 to us all the time, and every time it 497 00:25:54,799 --> 00:25:58,370 does, we're like, totally surprised that it happened. We're 498 00:25:58,370 --> 00:26:01,620 like where? Where did that come from? And I'm 499 00:26:01,620 --> 00:26:04,679 like, what? Didn't this happen to you last week? 500 00:26:04,679 --> 00:26:07,600 Or yesterday? All right. 501 00:26:07,600 --> 00:26:10,190 Here's roughly how it goes. 502 00:26:10,190 --> 00:26:11,570 Somebody comes up to you and they're like, hey, 503 00:26:11,570 --> 00:26:13,249 let's try to release by the end of the 504 00:26:13,249 --> 00:26:16,049 month. And you're like, um, I don't think we 505 00:26:16,049 --> 00:26:18,779 can actually do that. But I'll try. 506 00:26:18,779 --> 00:26:20,730 OK, and you go back to your keyboard really 507 00:26:20,730 --> 00:26:26,740 quick, right. You know. Clock spins. Pages fly off 508 00:26:26,740 --> 00:26:31,309 the calendar. Eighties work montage. All of a sudden, 509 00:26:31,309 --> 00:26:33,450 manager comes back and they're like, hey, we need 510 00:26:33,450 --> 00:26:35,549 to release by the end of the month. And 511 00:26:35,549 --> 00:26:39,279 you're like, wait, what? Why? Why do we need 512 00:26:39,279 --> 00:26:40,779 to release by the end of the month? And 513 00:26:40,779 --> 00:26:42,980 they're like, we've got customers waiting on it now. 514 00:26:42,980 --> 00:26:46,240 It's like, what? Why, why did you promise that 515 00:26:46,240 --> 00:26:49,309 to them? And I'll tell you why. They heard 516 00:26:49,309 --> 00:26:51,769 you say that you were going to try to 517 00:26:51,769 --> 00:26:53,730 do it by the end of the month. Now, 518 00:26:53,730 --> 00:26:56,179 I know that what you said, in your head, 519 00:26:56,179 --> 00:26:58,919 was hey. Get out of here. I know that 520 00:26:58,919 --> 00:27:01,429 what you said was, leave me alone, I gotta 521 00:27:01,429 --> 00:27:03,870 code. I know that what you said was, I 522 00:27:03,870 --> 00:27:07,870 don't see you. 523 00:27:07,870 --> 00:27:11,710 But what they heard is, I'm on it. 524 00:27:11,710 --> 00:27:13,480 It's a bit of wishful thinking on their part, 525 00:27:13,480 --> 00:27:17,370 but it's true. Look, don't commit to making any 526 00:27:17,370 --> 00:27:21,009 deadlines that you don't think that you can meet. 527 00:27:21,009 --> 00:27:24,090 And saying that you'll try is committing. 528 00:27:24,090 --> 00:27:26,929 Look, people are less likely to turn a goal, 529 00:27:26,929 --> 00:27:30,610 a soft deadline, into a promise, a hard deadline, 530 00:27:30,610 --> 00:27:32,649 if they think it's risky. When do they think 531 00:27:32,649 --> 00:27:35,509 it's risky? They think it's risky when they know 532 00:27:35,509 --> 00:27:38,820 that there's uncertainty. They know it's risky when they 533 00:27:38,820 --> 00:27:40,480 know that the amount of work that you've got 534 00:27:40,480 --> 00:27:44,669 to do is large. And that you're likely to 535 00:27:44,669 --> 00:27:46,840 go over the deadline. 536 00:27:46,840 --> 00:27:51,360 So, communicate your status and risk often. 537 00:27:51,360 --> 00:27:52,869 Communicate uncertainty. 538 00:27:52,869 --> 00:27:57,169 If you take nothing else away from this, communicate. 539 00:27:57,169 --> 00:28:00,350 Make sure that other people understand what your view 540 00:28:00,350 --> 00:28:03,080 of the world is right now. Because if you 541 00:28:03,080 --> 00:28:07,509 don't, that's how you're gonna end up with unreasonable 542 00:28:07,509 --> 00:28:11,399 estimates and. The other thing in my title. I 543 00:28:11,399 --> 00:28:13,960 can't remember it. Awesome. 544 00:28:13,960 --> 00:28:17,619 That's my talk. You guys have any questions? Wait. 545 00:28:17,619 --> 00:28:17,990 Clap first.