0:00:16.970,0:00:18.330 ADAM SANDERSON: All right folks. 0:00:18.330,0:00:20.560 This is Unreasonable Estimates and 0:00:20.560,0:00:24.380 Improbable Goals. My name's Adam Sanderson. 0:00:24.380,0:00:26.960 I'm a full stack developer at LiquidPlanner. 0:00:26.960,0:00:28.939 I've been there for about six, nearly 0:00:28.939,0:00:32.198 seven years, working on Rails, databases, 0:00:32.198,0:00:35.360 like, front end, back end. You name it. 0:00:35.360,0:00:36.860 If you want to, you can find me on 0:00:36.860,0:00:39.730 GitHub. Twitter. These slides are gonna be[br]on Speaker 0:00:39.730,0:00:42.040 Deck. It's all under Adam Sanderson. That[br]makes it 0:00:42.040,0:00:47.019 easy. But more awkward, I write code, or I 0:00:47.019,0:00:50.010 write about code on monkeyandcrow dot com.[br]If you 0:00:50.010,0:00:52.400 like the talks about, like, reading and learning[br]about 0:00:52.400,0:00:55.799 Rails, I'm actually writing a series called[br]reading Rails. 0:00:55.799,0:00:59.080 So go check that out if that's what you're 0:00:59.080,0:01:01.379 in to. And hey, it's RailsConf. You probably[br]are. 0:01:01.379,0:01:03.920 So, like I said, I work for LiquidPlanner.[br]We 0:01:03.920,0:01:07.570 make online project management software. Probably[br]the most interesting 0:01:07.570,0:01:10.320 thing for you guys is that we do probabilistic 0:01:10.320,0:01:13.689 scheduling, which is pretty awesome. So if[br]that sounds 0:01:13.689,0:01:17.869 kind of cool, like everyone else here, we're[br]hiring. 0:01:17.869,0:01:19.579 And I need somebody to come help me build 0:01:19.579,0:01:23.490 new stuff. So really, if you're in Seattle,[br]let 0:01:23.490,0:01:24.510 me know. 0:01:24.510,0:01:27.409 So, you can't really work on project management[br]software 0:01:27.409,0:01:32.170 without thinking about the work of work. Specifically,[br]I'm 0:01:32.170,0:01:36.210 talking about estimating projects, finding[br]the hidden costs involved 0:01:36.210,0:01:39.979 in those, and then dealing with deadlines.[br]Sounds like 0:01:39.979,0:01:42.790 fun, right? Sounds like life. 0:01:42.790,0:01:46.360 All right. How hard would it be? I get 0:01:46.360,0:01:50.310 asked this question all the time. People come[br]up 0:01:50.310,0:01:52.840 to me, and they say, hey Adam, how hard 0:01:52.840,0:01:54.710 would it be? How hard would it be to 0:01:54.710,0:01:57.020 change all of our buttons from red to blue? 0:01:57.020,0:01:59.080 How hard would it be to implement a new, 0:01:59.080,0:02:01.690 like, class of user? How hard would it be 0:02:01.690,0:02:08.399 to implement email integration? What should[br]I do? 0:02:08.399,0:02:10.889 Clarify. Before I tell somebody how hard it[br]would 0:02:10.889,0:02:13.230 be - and, pro tip, they don't care how 0:02:13.230,0:02:15.370 hard you gotta hit the keyboard. What they're[br]actually 0:02:15.370,0:02:17.430 asking is, how long is it gonna take you 0:02:17.430,0:02:22.730 to get this done? Before you tell them, clarify. 0:02:22.730,0:02:25.400 Make sure you know what they want. Make sure 0:02:25.400,0:02:27.450 that what's in your head is what's in their 0:02:27.450,0:02:29.310 head. Because a lot of times when people come 0:02:29.310,0:02:33.840 to us, developers have a very specific vocabulary.[br]Things 0:02:33.840,0:02:36.120 that we think mean one thing mean a different 0:02:36.120,0:02:39.450 thing to somebody in sales, or marketing,[br]or QA 0:02:39.450,0:02:40.950 or support. 0:02:40.950,0:02:43.760 So make sure that you know what they mean 0:02:43.760,0:02:45.319 when they say, hey, how hard would it be 0:02:45.319,0:02:49.340 to integrate email integration? Does that[br]mean sending emails 0:02:49.340,0:02:52.170 out of our system? Does it mean receiving[br]emails 0:02:52.170,0:02:55.290 from someone else? Does that mean a plugin[br]for 0:02:55.290,0:03:00.000 like Outlook or Gmail? If you don't clarify[br]up 0:03:00.000,0:03:03.060 front, you could spend a lot of time wandering 0:03:03.060,0:03:04.819 off into the woods, and when you come back 0:03:04.819,0:03:07.630 with your amazing feature, they're gonna look[br]at it 0:03:07.630,0:03:11.000 and be like, what? What is this? And you'll 0:03:11.000,0:03:14.430 have just wasted, like, an hour. A day. A 0:03:14.430,0:03:19.290 week. Oh, that's gonna suck. So clarify. 0:03:19.290,0:03:25.110 Next, clarify. Ah. Again. So. Look, you know[br]what 0:03:25.110,0:03:27.140 you're doing, now you gotta figure out why[br]you're 0:03:27.140,0:03:31.530 doing it. Ask them. Hey, why do you need 0:03:31.530,0:03:36.200 to me to integrate email integration? Maybe[br]they turn 0:03:36.200,0:03:38.180 around and they say, well, look, we've been[br]getting 0:03:38.180,0:03:41.000 a lot of customers sending us screenshots[br]and it'd 0:03:41.000,0:03:42.660 be nice to just be able to email those 0:03:42.660,0:03:47.099 into the system. Does a better, does a solution 0:03:47.099,0:03:51.250 already exist? If it does, you might be able 0:03:51.250,0:03:53.510 to point them towards that. And a bonus for 0:03:53.510,0:03:56.560 you, now you don't have to do anything. 0:03:56.560,0:03:57.849 Maybe they turn around and they say, yeah,[br]I 0:03:57.849,0:04:00.489 know that that exists. But it's kind of a 0:04:00.489,0:04:04.250 pain to use. Well, now maybe you've found[br]that 0:04:04.250,0:04:06.910 there's a better approach to solving their[br]problem. Maybe 0:04:06.910,0:04:09.659 you just need to fix existing functionality.[br]People come 0:04:09.659,0:04:13.569 to us, all the time, with prescriptions for[br]solutions 0:04:13.569,0:04:16.720 to problems. It's really useful for us to[br]take 0:04:16.720,0:04:19.149 a step back, and before we say, yeah, I'm 0:04:19.149,0:04:21.720 gonna do that, to say, wait, why do you 0:04:21.720,0:04:23.560 need me to do that? Maybe you can help 0:04:23.560,0:04:27.440 them come to a better solution. And, by doing 0:04:27.440,0:04:28.879 this, you're gonna get a better idea of what 0:04:28.879,0:04:30.229 you need to do. 0:04:30.229,0:04:33.680 All right. Once you know the what and you 0:04:33.680,0:04:36.470 know the why, it's time to start thinking[br]about 0:04:36.470,0:04:39.020 estimating how hard it's gonna be. How long[br]it's 0:04:39.020,0:04:41.370 gonna take you. I want you to think about 0:04:41.370,0:04:43.330 the major pieces of work that you're gonna[br]need 0:04:43.330,0:04:47.870 to do. Imagine the project and, instead of[br]thinking 0:04:47.870,0:04:49.740 about it in their terms, in terms of the 0:04:49.740,0:04:52.120 domain of the person asking you, think about[br]it 0:04:52.120,0:04:54.870 in terms of what you have to do. 0:04:54.870,0:04:56.960 Is it gonna require a lot of database work? 0:04:56.960,0:04:59.310 Well, think about the tables. Is it gonna[br]require 0:04:59.310,0:05:00.960 a lot of work in Rails? Think about your 0:05:00.960,0:05:04.220 models, your views, your controllers. Is it[br]gonna require 0:05:04.220,0:05:06.120 a lot of front end work? Well, think about 0:05:06.120,0:05:09.870 the different components on the screen. Break[br]these large 0:05:09.870,0:05:13.840 tasks down into smaller things, and write[br]it down. 0:05:13.840,0:05:15.460 You're gonna need to refer back to this later 0:05:15.460,0:05:17.870 anyways. This is the stuff that you need to 0:05:17.870,0:05:21.310 do in order to, like, service their request. 0:05:21.310,0:05:24.590 Next, sometimes it could be overwhelming to[br]get some 0:05:24.590,0:05:27.590 of these asks from people. You'll find that[br]they 0:05:27.590,0:05:30.860 have so many, like, business rules that they[br]want, 0:05:30.860,0:05:33.530 they've got so many little details that they[br]want 0:05:33.530,0:05:36.190 to impart upon you. It can make it really 0:05:36.190,0:05:37.840 hard for you to see the forest for the 0:05:37.840,0:05:41.370 trees. Step back for a moment. Try and find 0:05:41.370,0:05:45.330 unifying principles in what they're asking[br]for. Is there 0:05:45.330,0:05:47.479 some model that you can make, in your head, 0:05:47.479,0:05:50.360 that explains what they're looking for? It[br]doesn't have 0:05:50.360,0:05:52.190 to be perfect. It's just gotta be enough so 0:05:52.190,0:05:54.930 that you understand what direction to be going[br]in. 0:05:54.930,0:05:58.370 Again, write this stuff down. You'll need[br]it later. 0:05:58.370,0:06:02.160 All right. You've broken stuff down. You've[br]grouped stuff 0:06:02.160,0:06:04.330 back up. It's now in a stage where you 0:06:04.330,0:06:07.479 can sort of wrap your head around it. Think 0:06:07.479,0:06:09.949 about other things that you've done. Have[br]you done 0:06:09.949,0:06:12.759 anything like this before? One of the unique[br]things 0:06:12.759,0:06:15.410 about our profession is that we tend not to 0:06:15.410,0:06:18.639 do the same thing twice, and if we do, 0:06:18.639,0:06:22.580 we're kind of doing it wrong. So, if you 0:06:22.580,0:06:26.400 can, think about similar things. But maybe[br]you haven't. 0:06:26.400,0:06:28.120 Turn and ask one of the other developers in 0:06:28.120,0:06:31.780 your company. Maybe they've worked on this[br]code before. 0:06:31.780,0:06:34.960 Maybe they've dealt with this type of issue[br]before. 0:06:34.960,0:06:38.460 They can help you get a better estimate. 0:06:38.460,0:06:39.750 And on top of that, if they're doing their 0:06:39.750,0:06:42.770 job right, maybe they'll ask you what it is 0:06:42.770,0:06:44.699 that you're trying to do, and they'll ask[br]you 0:06:44.699,0:06:47.800 why. This is awesome, because it turns you[br]around 0:06:47.800,0:06:49.949 and makes you be the person who is asking 0:06:49.949,0:06:53.419 you for work. It's really helpful for clarifying[br]what 0:06:53.419,0:06:55.210 you've got to do. 0:06:55.210,0:07:01.280 Now, there are dozens of different methodologies.[br]Different approaches. 0:07:01.280,0:07:05.820 Different sciences of estimation. Here's what[br]I want you 0:07:05.820,0:07:11.150 to do. Make a guess. That's it. I know. 0:07:11.150,0:07:12.789 You could play planning poker. You could do[br]all 0:07:12.789,0:07:15.630 number of things. But, just make a guess.[br]Here. 0:07:15.630,0:07:19.490 I'm gonna make it flash. There. Isn't that[br]awesome? 0:07:19.490,0:07:22.430 Seriously. Look, an estimate's just an informed[br]guess. A 0:07:22.430,0:07:24.960 lot of times, we put way too much value 0:07:24.960,0:07:27.180 on an estimate. It's OK for you to be 0:07:27.180,0:07:29.220 wrong and it's OK for you to be uncertain. 0:07:29.220,0:07:33.889 In fact, if you're not uncertain, you're probably[br]wrong. 0:07:33.889,0:07:38.419 I want you to quantify that uncertainty. Embrace[br]it. 0:07:38.419,0:07:40.380 Are there things that you're being asked to[br]do 0:07:40.380,0:07:42.699 that you don't know how they're gonna spa-[br]like, 0:07:42.699,0:07:45.910 turn out? Maybe, like, you've got to load[br]a 0:07:45.910,0:07:47.850 whole of data into the database and you're[br]not 0:07:47.850,0:07:50.490 sure if it's gonna handle that. Maybe you've[br]got 0:07:50.490,0:07:53.240 to make some, like, flippy clicky thing that's[br]gonna 0:07:53.240,0:07:56.350 be, like, really hard to implement in Internet[br]Explorer 0:07:56.350,0:07:58.910 8. Do you know how that's gonna work? Maybe 0:07:58.910,0:08:00.580 it will. Maybe it won't. 0:08:00.580,0:08:03.669 Raise these things up. Let other people know.[br]If 0:08:03.669,0:08:05.669 they're asking you to do this work, say, you 0:08:05.669,0:08:08.490 know, I'm not really sure about how this is 0:08:08.490,0:08:11.610 gonna impact our database. I'm not really[br]sure whether 0:08:11.610,0:08:14.319 IE 8's gonna support this user interaction[br]you're asking 0:08:14.319,0:08:18.250 for. This is helpful, because it gives the[br]other 0:08:18.250,0:08:20.889 person a better understanding of what you[br]need to 0:08:20.889,0:08:21.720 be doing. 0:08:21.720,0:08:28.289 Now, next, play a spread. Tell them a story. 0:08:28.289,0:08:32.099 If everything goes well, I think that this[br]might 0:08:32.099,0:08:34.979 be done in a week. If I need to 0:08:34.979,0:08:38.190 denormalize my database, if I need to do something 0:08:38.190,0:08:41.139 really crazy to get this supported cross-browser,[br]this could 0:08:41.139,0:08:44.569 take me four weeks. Look, it's a lot easier 0:08:44.569,0:08:46.870 for you to hit an estimate, a range, than 0:08:46.870,0:08:49.189 it is for you to give them one hard 0:08:49.189,0:08:52.579 number. So that's great for us. But it's also 0:08:52.579,0:08:54.489 good for the person asking you to do the 0:08:54.489,0:08:57.040 work. Because you're giving them a story about[br]the 0:08:57.040,0:09:00.459 future. You're telling them useful information[br]about how this 0:09:00.459,0:09:04.819 could play out. And if they've got that information, 0:09:04.819,0:09:08.389 they can start making better, better use of[br]that. 0:09:08.389,0:09:10.559 They can plan better based on that. And it 0:09:10.559,0:09:13.779 starts a better dialogue between you. 0:09:13.779,0:09:17.720 But you're not done there. You've got to deal 0:09:17.720,0:09:24.720 with this uncertainty. Nobody likes to get[br]bad news. 0:09:25.360,0:09:28.369 Nobody likes to find out that the project[br]is 0:09:28.369,0:09:30.730 doomed. But you know when they like to hear 0:09:30.730,0:09:33.160 that? Never. OK. Do you know when they'll[br]tolerate 0:09:33.160,0:09:36.360 it? They'll tolerate it right at the very[br]beginning. 0:09:36.360,0:09:38.529 You know when they won't tolerate it? In the 0:09:38.529,0:09:39.579 eleventh hour. 0:09:39.579,0:09:42.550 Oh, man. Are you gonna be ever so happy 0:09:42.550,0:09:46.050 when your fellow developer says, hey, guys,[br]I know 0:09:46.050,0:09:49.209 we're gonna ship, but I just checked the clicky 0:09:49.209,0:09:53.170 flippy thing in IE-8, and it doesn't work. 0:09:53.170,0:09:55.879 Wait, we're supposed to ship when? 0:09:55.879,0:09:58.319 Nobody wants to find out that the uncertainty[br]got 0:09:58.319,0:10:01.279 left to the end. So do it first. It's 0:10:01.279,0:10:04.980 really hard to do this, but deal with uncertainty 0:10:04.980,0:10:07.720 up front. That way, when you find out that 0:10:07.720,0:10:10.459 something's going to take a long time, you[br]can 0:10:10.459,0:10:12.899 communicate that back to people, and you guys[br]can 0:10:12.899,0:10:15.739 adjust your plans to accommodate that. 0:10:15.739,0:10:17.290 I know. We always want to do the fun 0:10:17.290,0:10:19.399 things first. I want to like, jump in and 0:10:19.399,0:10:21.949 do the stuff that I know really well first, 0:10:21.949,0:10:24.689 because I feel like I'm making progress. That's[br]a 0:10:24.689,0:10:28.939 great way to set yourself up for failure later. 0:10:28.939,0:10:32.839 Now, doing that alone isn't enough. 0:10:32.839,0:10:39.259 You remember that estimate? Change it. Change[br]it continuously. 0:10:39.259,0:10:41.480 As you learn new things, as you figure out 0:10:41.480,0:10:44.459 the uncertain things, and as you make progress,[br]circle 0:10:44.459,0:10:47.910 back and tell anybody who depends on you how 0:10:47.910,0:10:51.059 long this is gonna take. Give them your vision 0:10:51.059,0:10:53.619 of the future. Give them your mental model[br]of 0:10:53.619,0:10:56.739 what the risks are. Give them the understanding[br]that 0:10:56.739,0:10:59.420 you have, right now, about what you think[br]is 0:10:59.420,0:11:01.629 gonna happen. 0:11:01.629,0:11:03.529 Communicate often. 0:11:03.529,0:11:08.459 All right. Let's talk about the Dark Arts[br]of 0:11:08.459,0:11:11.670 project management, for a moment. Look, you[br]know what 0:11:11.670,0:11:13.420 you're doing. You know why you're doing it.[br]You've 0:11:13.420,0:11:18.480 got an estimate and now. Oh. Shoot. 0:11:18.480,0:11:23.299 We can get screwed, as developers. We think[br]that 0:11:23.299,0:11:28.709 we're all logical. That we're sane. Now. This[br]ever 0:11:28.709,0:11:30.699 happen to you? It happens to me all the 0:11:30.699,0:11:32.360 time. Somebody comes up to me and they say, 0:11:32.360,0:11:33.619 hey, Adam, how long's it gonna take? And I 0:11:33.619,0:11:35.660 say, it's gonna take about three weeks. And[br]they 0:11:35.660,0:11:37.569 say, look, we need this done really quickly.[br]Could 0:11:37.569,0:11:39.989 you maybe do it in one? And I say. 0:11:39.989,0:11:43.119 Well. Oh. How about two weeks? 0:11:43.119,0:11:44.509 I thought that I was just being nice. I 0:11:44.509,0:11:46.739 thought that I was just splitting the difference,[br]right. 0:11:46.739,0:11:48.089 Wrong. I just screwed myself. 0:11:48.089,0:11:52.360 It's natural for people to haggle. But you[br]don't 0:11:52.360,0:11:55.939 win when people are estima- or bargaining[br]over estimates. 0:11:55.939,0:11:58.939 Look, you're estimate is your best understanding[br]of what 0:11:58.939,0:12:01.739 the future holds. What made it go from three 0:12:01.739,0:12:04.759 weeks to two weeks? How did you suddenly manage 0:12:04.759,0:12:08.639 to shave off a whole week of work in 0:12:08.639,0:12:11.089 five seconds? Cause I want to know. I need 0:12:11.089,0:12:12.819 to be able to do that later, so you 0:12:12.819,0:12:14.239 come up and you tell me. 0:12:14.239,0:12:17.220 No, look, you can't negotiate time. But you[br]can 0:12:17.220,0:12:21.920 negotiate features. And as you learn more[br]about the 0:12:21.920,0:12:25.739 project, you can re-estimate. Moral of this[br]story, don't 0:12:25.739,0:12:28.410 give people estimates that you think are gonna[br]make 0:12:28.410,0:12:30.989 them happy. Give them estimates that you think[br]are 0:12:30.989,0:12:32.100 true. 0:12:32.100,0:12:33.589 If they keep badgering you about it, point[br]it 0:12:33.589,0:12:37.910 out. Say, hey, look, I know what you're doing 0:12:37.910,0:12:42.290 here. I see what you're doing. Estimation[br]bargaining. It's 0:12:42.290,0:12:44.470 not gonna work. Not only is it not gonna 0:12:44.470,0:12:46.839 work for me, it's not gonna work for you. 0:12:46.839,0:12:50.009 If you give into this kind of thing, you're 0:12:50.009,0:12:53.720 actually setting up not just yourself for[br]trouble but 0:12:53.720,0:12:56.869 your team. The people who rely on you. And, 0:12:56.869,0:12:58.369 whether or not the person asking you to do 0:12:58.369,0:13:00.389 the work knows it, you're setting them up[br]for 0:13:00.389,0:13:03.299 failure as well. Because they depend on that[br]estimate 0:13:03.299,0:13:05.269 that you just gave them. 0:13:05.269,0:13:07.569 So, you know what you're doing. You know why 0:13:07.569,0:13:09.809 you're doing it. You've got an estimate. You[br]defended 0:13:09.809,0:13:13.350 it. Maybe you shouldn't do it at all. There 0:13:13.350,0:13:17.730 are hidden costs involved in everything. Like[br]complexity costs. 0:13:17.730,0:13:22.319 Look, some features that we build incur future,[br]incur 0:13:22.319,0:13:25.389 costs on all the future work that we do. 0:13:25.389,0:13:27.879 For instance, if you build a new RESTful API, 0:13:27.879,0:13:31.319 great idea. If you build a new, like, axis 0:13:31.319,0:13:34.350 controls, you're just dropping in can-can.[br]If you build, 0:13:34.350,0:13:39.970 like, a new mo- native mobile client. Yeah.[br]You're 0:13:39.970,0:13:44.139 not done there. From now on, every new feature 0:13:44.139,0:13:47.230 that you implement has to take those old features 0:13:47.230,0:13:50.379 into account. So what you just did is you 0:13:50.379,0:13:53.339 made it so that your future work, future work, 0:13:53.339,0:13:55.529 is gonna hate past you. 0:13:55.529,0:14:00.329 You're just incurring new costs for the future.[br]So 0:14:00.329,0:14:03.149 watch out for these cost-cutting concerns.[br]they can really 0:14:03.149,0:14:04.679 bite us sometimes. 0:14:04.679,0:14:07.869 Now, there are ways to do this that are 0:14:07.869,0:14:09.720 gonna cut down on those costs. You can never 0:14:09.720,0:14:12.809 get rid of them entirely. But, if you want 0:14:12.809,0:14:16.379 to, do the extra engineering up front, factor[br]that 0:14:16.379,0:14:19.439 into your original estimate. Let the people[br]know that 0:14:19.439,0:14:22.749 you're gonna need a little bit more time. 0:14:22.749,0:14:25.839 What about operational costs? Look, are you[br]introducing new 0:14:25.839,0:14:27.910 moving parts? You're gonna build a new job[br]queue. 0:14:27.910,0:14:30.290 You're gonna throw resq and redis in place.[br]They're 0:14:30.290,0:14:32.929 awesome tech. But guess what? They're costly. 0:14:32.929,0:14:35.879 How are you gonna test this in production[br]server? 0:14:35.879,0:14:38.059 How are you gonna monitor it? How are you 0:14:38.059,0:14:40.089 gonna deploy this? How are you gonna make[br]sure 0:14:40.089,0:14:42.660 that it's running every time you spin up a 0:14:42.660,0:14:44.639 new server? 0:14:44.639,0:14:49.499 It's not necessarily hard. But it does take[br]time. 0:14:49.499,0:14:51.679 And once you've done it, it still takes time. 0:14:51.679,0:14:56.459 And you know what? When resq goes down, who 0:14:56.459,0:14:59.359 are they gonna call? They're gonna call you.[br]You're 0:14:59.359,0:15:01.569 the one that put it in place, right. So 0:15:01.569,0:15:04.169 dealing with that is gonna take more time[br]out 0:15:04.169,0:15:06.939 of what you consider to be your budget for 0:15:06.939,0:15:10.239 developing. 0:15:10.239,0:15:13.720 Support costs. These are awesome. There are[br]a lot 0:15:13.720,0:15:15.720 of things that we can do as developers that 0:15:15.720,0:15:18.100 are just really easy. We can knock out a 0:15:18.100,0:15:23.220 feature in like ten minutes. The downside?[br]Nobody understands 0:15:23.220,0:15:25.459 how that feature works. 0:15:25.459,0:15:28.649 So what if your users don't get it? Like, 0:15:28.649,0:15:30.549 you built this awesome thing, and they've[br]got no 0:15:30.549,0:15:32.339 clue what it does. Who are they gonna talk 0:15:32.339,0:15:34.569 to? Well, if you've got one, they're gonna[br]talk 0:15:34.569,0:15:37.089 to your support team. I hope your support[br]team 0:15:37.089,0:15:40.209 understands - your support team doesn't understand[br]it. OK. 0:15:40.209,0:15:44.230 Awesome. Your support team's now talking to[br]you. 0:15:44.230,0:15:46.779 And that takes time that you're gonna be not 0:15:46.779,0:15:50.369 able to develop in. What if your business,[br]as 0:15:50.369,0:15:56.649 a whole, doesn't get it? Meetings. That's[br]what. And 0:15:56.649,0:15:58.449 you know what meetings mean? It's not just[br]your 0:15:58.449,0:16:01.529 time that's being used up then, it's the entire 0:16:01.529,0:16:04.439 company. Everyone around that table? You're[br]sinking more and 0:16:04.439,0:16:06.600 more costs into this. 0:16:06.600,0:16:10.290 So, again, you can combat some of this, but 0:16:10.290,0:16:13.299 go back, update those estimates, to factor[br]this in. 0:16:13.299,0:16:18.959 What about opportunity costs? Slightly different[br]thing. But think 0:16:18.959,0:16:20.970 about this. You can really only do one thing 0:16:20.970,0:16:24.809 at a time. So what's the highest priority[br]thing 0:16:24.809,0:16:27.009 for you to be doing right now? What's the 0:16:27.009,0:16:29.399 highest priority thing for your team? For[br]your business 0:16:29.399,0:16:32.819 as a whole? Because, whatever you're doing[br]now is 0:16:32.819,0:16:35.489 excluding every other feature that you could[br]be working 0:16:35.489,0:16:40.220 on right now. 0:16:40.220,0:16:43.350 Think about it. Prioritize all the things[br]that you 0:16:43.350,0:16:45.019 would like to be doing. All the things that 0:16:45.019,0:16:47.029 you know you should be doing. Make sure that 0:16:47.029,0:16:51.189 this is actually the most important thing.[br]Not just 0:16:51.189,0:16:53.929 the most immediate thing that you need to[br]deal 0:16:53.929,0:16:54.660 with. 0:16:54.660,0:16:58.189 Look, I'm not saying don't do anything, but[br]weigh 0:16:58.189,0:17:03.100 the costs. Understand them. Recognize them.[br]Everything that we 0:17:03.100,0:17:07.240 do as developers costs us down the road. Choose 0:17:07.240,0:17:09.449 which ones you're willing to pay. 0:17:09.449,0:17:14.089 All right. More Dark Arts, cause I love these. 0:17:14.089,0:17:17.040 This one's the most insidious. This one trips[br]us 0:17:17.040,0:17:21.299 up as developers, because we've got egos,[br]and it's 0:17:21.299,0:17:25.699 really easy to manipulate us. This happen[br]to you? 0:17:25.699,0:17:26.970 Somebody comes up to you, they say, hey, how 0:17:26.970,0:17:28.049 long's it gonna take? And you say, I don't 0:17:28.049,0:17:30.519 know, about a week? And they say, really?[br]Oh, 0:17:30.519,0:17:34.840 and they look so disappointed. And then they[br]say, 0:17:34.840,0:17:38.409 I thought you were smarter than that. 0:17:38.409,0:17:42.630 Wow. That hurts. Then, it's like, kicking[br]you when 0:17:42.630,0:17:45.720 you're down. They say, oh, I'll go ask her. 0:17:45.720,0:17:49.049 I'll go ask the intern. She seems pretty smart. 0:17:49.049,0:17:52.179 Ah. Even worse. You know what happens next?[br]I 0:17:52.179,0:17:54.880 don't know about you. But me? I start begging 0:17:54.880,0:17:56.740 to do the work. I'm like, you know what? 0:17:56.740,0:17:59.360 Did I say a week? I meant maybe, like, 0:17:59.360,0:18:00.080 three days. 0:18:00.080,0:18:03.019 Whoa, stop going towards the intern. One day?[br]I'll 0:18:03.019,0:18:05.929 have it to you by noon. 0:18:05.929,0:18:08.090 Fuck. 0:18:08.090,0:18:12.789 Aw. Don't let your ego get you into trouble. 0:18:12.789,0:18:15.929 Stand by those estimates. Really, the best[br]thing that 0:18:15.929,0:18:18.360 we can be as developers, in this case, is 0:18:18.360,0:18:21.850 have a little humility. And if you see somebody 0:18:21.850,0:18:24.610 trying to do this to you, call their bluff. 0:18:24.610,0:18:27.389 Like, they're not really gonna go to the intern. 0:18:27.389,0:18:29.240 Well, they might. And it might be a learning 0:18:29.240,0:18:30.960 experience for everyone. 0:18:30.960,0:18:35.220 But name this. Say, I know what you're doing 0:18:35.220,0:18:37.909 there. It's not gonna work on me. Stand up 0:18:37.909,0:18:42.429 for yourself. And if you can't, find a new 0:18:42.429,0:18:43.149 job. 0:18:43.149,0:18:47.350 All right. Deadlines. Like, I've got one coming[br]up 0:18:47.350,0:18:52.759 in eleven minutes. 0:18:52.759,0:18:57.190 Deadlines come in all forms. They come in[br]a 0:18:57.190,0:19:00.740 spectrum. From soft deadlines to hard deadlines.[br]Soft deadlines 0:19:00.740,0:19:03.409 are things like goals. They're things we would[br]like 0:19:03.409,0:19:06.130 to achieve. For instance, we would like to[br]ship 0:19:06.130,0:19:08.190 this by the end of the week. We would 0:19:08.190,0:19:11.190 like to get this out by, I don't know, 0:19:11.190,0:19:14.000 this next conference. Hey, we're gonna try[br]to get 0:19:14.000,0:19:17.570 this out for the customer by Q1. 0:19:17.570,0:19:23.070 Hard deadlines are things like, RailsConf.[br]For me, anyways. 0:19:23.070,0:19:28.220 Can you imagine, RubyCentral sending out an[br]email. They 0:19:28.220,0:19:31.149 say, hey guys, funny story. Adam didn't do[br]his 0:19:31.149,0:19:37.429 slides, so we're postponing RubyConf by, like,[br]a week. 0:19:37.429,0:19:38.720 Just change your reservations. 0:19:38.720,0:19:41.149 Yeah. I'm not DHH, so I can't get away 0:19:41.149,0:19:42.380 with that. 0:19:42.380,0:19:48.130 It's a hard deadline. So when hard deadlines[br]come 0:19:48.130,0:19:51.460 up. Actually, when all deadlines come up,[br]what do 0:19:51.460,0:19:54.259 we do? You gotta deal with it. Ignoring it's 0:19:54.259,0:19:59.179 not gonna work, and panicking also doesn't[br]work. So, 0:19:59.179,0:20:01.070 we've really got four options. The first two[br]are 0:20:01.070,0:20:03.710 ones that we as developers think that we really 0:20:03.710,0:20:06.419 like, and the second two are ones that managers 0:20:06.419,0:20:09.440 think that they really like. Nobody really[br]likes any 0:20:09.440,0:20:12.220 of these options, when you get down to it. 0:20:12.220,0:20:15.600 But, if it's a soft deadline, if it's just 0:20:15.600,0:20:20.929 a goal, you guys can ship late. You can 0:20:20.929,0:20:23.980 miss. Maybe. It's probably not the end of[br]the 0:20:23.980,0:20:27.500 world. Don't do this all the time, cause you're 0:20:27.500,0:20:32.480 gonna look like an idiot. But recognize. Weigh[br]the 0:20:32.480,0:20:37.570 balance, weigh the thingies that you've gotta[br]weigh. I 0:20:37.570,0:20:39.320 don't know. 0:20:39.320,0:20:42.889 Yeah. This talk is about work. Not about how 0:20:42.889,0:20:45.110 to give a good talk. 0:20:45.110,0:20:51.330 Rad. So, yeah. Sometimes you can ship late.[br]Of 0:20:51.330,0:20:53.600 course, there are hard deadlines, right. There[br]are things 0:20:53.600,0:20:58.350 like RubyConf. And I can't miss this deadline.[br]If 0:20:58.350,0:21:00.600 I did, we would all be standing here and 0:21:00.600,0:21:03.559 I would be stammering like I was. So what 0:21:03.559,0:21:04.690 else can we do? 0:21:04.690,0:21:07.759 Well, we can cut scope. We can cut features. 0:21:07.759,0:21:13.840 Like, honestly, prioritize the things that[br]you've gotta do. 0:21:13.840,0:21:16.470 Figure out what you can get done by the 0:21:16.470,0:21:19.220 deadline. Cut the rest. 0:21:19.220,0:21:23.330 For instance, I illustrated like all of these[br]slides, 0:21:23.330,0:21:25.610 except for, I got about here and I ran 0:21:25.610,0:21:30.159 out of time. So I cut my little illustration. 0:21:30.159,0:21:36.909 One of the things that is scary about this, 0:21:36.909,0:21:40.590 though, is that some of the things that get 0:21:40.590,0:21:43.909 cut are the things that we, as developers,[br]think 0:21:43.909,0:21:50.909 are important. Performance. Testing. Correctness.[br]All these things can 0:21:55.659,0:21:57.990 get cut if you're not careful. So if you 0:21:57.990,0:22:01.710 value that, make sure that it's put high in 0:22:01.710,0:22:04.490 your priority. Make sure that you guard that[br]against 0:22:04.490,0:22:06.429 the deadline. 0:22:06.429,0:22:10.769 OK. Another option. If you're not gonna get[br]it 0:22:10.769,0:22:13.230 done and you can't ship later and you can't 0:22:13.230,0:22:16.769 cut features, well you can add more people,[br]right? 0:22:16.769,0:22:19.259 Well, you could go read the Mythical Man Month, 0:22:19.259,0:22:23.240 but basically boils down to this. Unless you've[br]got 0:22:23.240,0:22:29.190 a project where everybody can work completely[br]independently, you're 0:22:29.190,0:22:32.539 gonna have to start talking to each other.[br]Eh. 0:22:32.539,0:22:35.919 It's kind of uncomfortable. 0:22:35.919,0:22:40.320 So, I'm about to miss my deadline. They pull 0:22:40.320,0:22:42.299 you in to work with me. Now you and 0:22:42.299,0:22:44.129 I have to start talking. We've gotta make[br]sure 0:22:44.129,0:22:46.799 that we aren't gonna be stepping on each other's 0:22:46.799,0:22:48.590 toes. We've got to keep each other appraised[br]of 0:22:48.590,0:22:51.679 the situation. We've gotta understand which[br]direction we're both 0:22:51.679,0:22:53.879 going in. 0:22:53.879,0:22:56.940 That adds overhead. And if you're splitting[br]up work 0:22:56.940,0:23:00.409 between two people, it means that you're gonna[br]start, 0:23:00.409,0:23:02.490 like, depending on the other person to get[br]things 0:23:02.490,0:23:05.169 done. And if I'm waiting on you and I'm 0:23:05.169,0:23:08.230 twiddling my thumbs, that's sort of wasted[br]time. That's 0:23:08.230,0:23:10.889 time that's not actually going towards getting[br]the work 0:23:10.889,0:23:12.409 out. 0:23:12.409,0:23:17.480 So, adding more people sometimes works. But[br]sometimes, it's 0:23:17.480,0:23:20.210 just gonna make everything go more slowly. 0:23:20.210,0:23:24.179 Oh, and if you do add more people, make 0:23:24.179,0:23:28.169 sure they get along. Cause nothing is more[br]awkward 0:23:28.169,0:23:32.149 than running up against a deadline, working[br]with somebody 0:23:32.149,0:23:34.350 who you want to punch. Like, this is how 0:23:34.350,0:23:37.320 sparks fly, right? You don't want to do this. 0:23:37.320,0:23:38.850 All right. 0:23:38.850,0:23:42.870 The final way that you can deal with a 0:23:42.870,0:23:45.049 deadline. If you can't two people to do the 0:23:45.049,0:23:47.929 work twice as fast, maybe you can make one 0:23:47.929,0:23:53.210 person work twice as hard. Ah. This really[br]sucks. 0:23:53.210,0:23:54.669 And I'll tell you why. 0:23:54.669,0:24:01.429 It works. It can. Honestly. But it's not sustainable. 0:24:01.429,0:24:03.659 And I don't think any of us enjoy it. 0:24:03.659,0:24:05.629 Look, think about this. You've got eight hours[br]to 0:24:05.629,0:24:07.070 work. You've got eight hours to sleep. And[br]then 0:24:07.070,0:24:09.249 you've got eight hours for your daily commute,[br]for 0:24:09.249,0:24:11.620 cleaning up after your dog, for cooking dinner,[br]for 0:24:11.620,0:24:14.149 spending time with your friends, your family,[br]for reading 0:24:14.149,0:24:21.149 seventeenth century poetry. 0:24:21.200,0:24:23.590 Where's that overtime gonna come out of? I[br]gotta 0:24:23.590,0:24:27.570 hint for you. It's not coming out of work. 0:24:27.570,0:24:34.570 Bummer. OK, your only two remaining options[br]are sleep 0:24:34.570,0:24:38.039 and what I would like to call life. So, 0:24:38.039,0:24:41.409 if that time's coming out of sleep, you're[br]gonna 0:24:41.409,0:24:46.970 be tired. You're not gonna be very proficient.[br]You're 0:24:46.970,0:24:48.850 not gonna be thinking straight. 0:24:48.850,0:24:52.610 We make the stupidest mistakes when we're[br]up at 0:24:52.610,0:24:58.879 3 AM pounding on our keyboards. So quality[br]takes 0:24:58.879,0:25:05.360 a hit. Shoot. Well, OK. What about life? 0:25:05.360,0:25:06.759 Use up a little bit of life to get 0:25:06.759,0:25:10.740 this out the door. This, this is the path 0:25:10.740,0:25:17.320 to burn out. To depression. Use it very sparingly. 0:25:17.320,0:25:20.299 Use it wisely. Think to yourself, is this[br]more 0:25:20.299,0:25:23.519 important than cleaning up after my dog? Is[br]this 0:25:23.519,0:25:28.889 more important than spending time with my[br]kids? Depends 0:25:28.889,0:25:34.620 on how much you like your kids, right. 0:25:34.620,0:25:36.940 Just be careful. That's all I can say. 0:25:36.940,0:25:39.129 All right. Let's talk about one more of the 0:25:39.129,0:25:45.370 Dark Arts. Deadline hardening. This is the[br]magical thing. 0:25:45.370,0:25:47.299 Whoops. I don't want to show this to you 0:25:47.299,0:25:50.049 yet. I gotta tell you about it first. Because, 0:25:50.049,0:25:51.929 here's what I love about this one. It happens 0:25:51.929,0:25:54.799 to us all the time, and every time it 0:25:54.799,0:25:58.370 does, we're like, totally surprised that it[br]happened. We're 0:25:58.370,0:26:01.620 like where? Where did that come from? And[br]I'm 0:26:01.620,0:26:04.679 like, what? Didn't this happen to you last[br]week? 0:26:04.679,0:26:07.600 Or yesterday? All right. 0:26:07.600,0:26:10.190 Here's roughly how it goes. 0:26:10.190,0:26:11.570 Somebody comes up to you and they're like,[br]hey, 0:26:11.570,0:26:13.249 let's try to release by the end of the 0:26:13.249,0:26:16.049 month. And you're like, um, I don't think[br]we 0:26:16.049,0:26:18.779 can actually do that. But I'll try. 0:26:18.779,0:26:20.730 OK, and you go back to your keyboard really 0:26:20.730,0:26:26.740 quick, right. You know. Clock spins. Pages[br]fly off 0:26:26.740,0:26:31.309 the calendar. Eighties work montage. All of[br]a sudden, 0:26:31.309,0:26:33.450 manager comes back and they're like, hey,[br]we need 0:26:33.450,0:26:35.549 to release by the end of the month. And 0:26:35.549,0:26:39.279 you're like, wait, what? Why? Why do we need 0:26:39.279,0:26:40.779 to release by the end of the month? And 0:26:40.779,0:26:42.980 they're like, we've got customers waiting[br]on it now. 0:26:42.980,0:26:46.240 It's like, what? Why, why did you promise[br]that 0:26:46.240,0:26:49.309 to them? And I'll tell you why. They heard 0:26:49.309,0:26:51.769 you say that you were going to try to 0:26:51.769,0:26:53.730 do it by the end of the month. Now, 0:26:53.730,0:26:56.179 I know that what you said, in your head, 0:26:56.179,0:26:58.919 was hey. Get out of here. I know that 0:26:58.919,0:27:01.429 what you said was, leave me alone, I gotta 0:27:01.429,0:27:03.870 code. I know that what you said was, I 0:27:03.870,0:27:07.870 don't see you. 0:27:07.870,0:27:11.710 But what they heard is, I'm on it. 0:27:11.710,0:27:13.480 It's a bit of wishful thinking on their part, 0:27:13.480,0:27:17.370 but it's true. Look, don't commit to making[br]any 0:27:17.370,0:27:21.009 deadlines that you don't think that you can[br]meet. 0:27:21.009,0:27:24.090 And saying that you'll try is committing. 0:27:24.090,0:27:26.929 Look, people are less likely to turn a goal, 0:27:26.929,0:27:30.610 a soft deadline, into a promise, a hard deadline, 0:27:30.610,0:27:32.649 if they think it's risky. When do they think 0:27:32.649,0:27:35.509 it's risky? They think it's risky when they[br]know 0:27:35.509,0:27:38.820 that there's uncertainty. They know it's risky[br]when they 0:27:38.820,0:27:40.480 know that the amount of work that you've got 0:27:40.480,0:27:44.669 to do is large. And that you're likely to 0:27:44.669,0:27:46.840 go over the deadline. 0:27:46.840,0:27:51.360 So, communicate your status and risk often. 0:27:51.360,0:27:52.869 Communicate uncertainty. 0:27:52.869,0:27:57.169 If you take nothing else away from this, communicate. 0:27:57.169,0:28:00.350 Make sure that other people understand what[br]your view 0:28:00.350,0:28:03.080 of the world is right now. Because if you 0:28:03.080,0:28:07.509 don't, that's how you're gonna end up with[br]unreasonable 0:28:07.509,0:28:11.399 estimates and. The other thing in my title.[br]I 0:28:11.399,0:28:13.960 can't remember it. Awesome. 0:28:13.960,0:28:17.619 That's my talk. You guys have any questions?[br]Wait. 0:28:17.619,0:28:17.990 Clap first.