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