Pages

Friday, September 16, 2016

That’s wrong | it’s broken | I don’t like it

That’s wrong | it’s broken | I don’t like it
I can’t stand this. These are all subjective terms; they don’t communicate actionable issues.
  • I don’t know what, “wrong” means,
  • nor do I know what “it” is if it’s broken,
  • and if you don’t “like it” then… what do you want me to do about it?
Programmers need specifics, because we fix specifics. Try saying, “that’s the wrong font size”, “the form doesn’t submit when I click submit”, or “I don’t like the colors.”
“This should be easy”
relevant XKCDs have already been shared, I’ll just elaborate:
  • The easier it is for you to do, the harder it is for a computer: speaking, listening, understanding humans, comparing images, recognizing voices. Were you able to do it at birth? Then grab a snickers, this algorithm’s going to take a while.
  • “easy” compared to what? Throwing a tennis ball? Learning Mandarin? You don’t code, you don’t get to decide what’s easy in my profession.
  • Do you always insult someone’s intelligence/profession? Do you go to the doctor and say, “this should be an easy triple bypass?”
One time I was asked to take color data pulled from a camera, put a circle on a web page, and make that circle’s color the dominant color that the person was wearing… but it had to be one of the company’s 6 branded colors. That’s right; I get any one color of 16,777,216, and I have to match it to one of 6. The company told me this was “easy”. I quoted 60 hours for the color matching, 10 hours for putting circles on a page.
“Can’t you just [obviously simple thing] ”
Nope. I can’t just [].
  • It’s not me who does it; it’s the computer
  • My job is telling the computer what to do
  • Computers speak terrible English
But, this is because people foolishly think…
“Computers are so smart”
No.
No they aren’t. They’re incredibly dumb. Computers think in 1 and 0; they have a vocabulary of exactly two words. No one thinks this way. No one.
By comparison, the average 4 year old who still doesn’t have the good sense to pick his nose before he picks his butt knows 5,000 words. And 5,000 words is between 40 and 50 times the size of any programming language.
Mind you, we have programming languages for our programming languages. And when the language for the language is too hard, we make a language for that.
Computer scientists bend over backwards to make it easier for us to talk to a machine that won’t give a metamucil-assisted shit whether it were a paper weight or a flight control system.
Everything that a computer does right is because of a whole slew of brilliant scientists and programmers figured out the right way to communicate their instructions.
And everything that a computer does wrong is because it did exactly what those idiotic scientists and dumbass programmers told it to do.
Over 99% of the time, a “bug” is a bug because a programmer, somewhere, made a mistake. But…
“Computers can’t do that [weird thing]”
I once saw a Commodore 64 where7+3was 11. It was the only machine amongst 20 that had the inclination to cockblock a 7 and a 3 summing their values the way the good Lord Jesus intended.
You can tell me all day long, “it [can’t, isn’t supposed to] do that.”
It did.
Don’t tell me what it can and can’t do. Tell it.
The life of a programmer isn’t as much arguing with a computer about what it can do, but accepting what it will do.
“Can you fix my…”
No. Take it to the geek squad.
“Would you take a look at…”
Nope.
“My printer is…”
Going to be set on fire if you ask me again.


I was just going to do a simple list, but then I got going.
“The Internet is down!” - Your wifi might be down, your connection to your upstream provider may be down, their connection to their upstream provider may be down, a large segment of the Internet could possibly be down (doubtful), but the Internet is never down, it cannot be it was designed to never be down.
“It crashed!” - Is it really so challenging to be precise? Ok leave precise alone, why do I have to pry the information out of you in order to help you. Shouldn’t you be doing everything possible to give me the information I need to help you? What crashed? When you say crashed what do you mean? The program closed, the computer blue screened or the computer was driving down the highway the wrong direction and hit an oncoming motorist head on. Crashed means a lot of things to different people it is a bit more specific to a developer, but the non-programmer seldom understands well enough to use it correctly. Just tell me what happened with as much detail as possible.
“Is it possible to . . .” - Pretty good chance, unless you are asking me to break the laws of physics, so what is your real question? Could you perhaps ask that instead (unless it is how long would it take see “How soon will it be done”)? Maybe try, “How hard would it be . . .” or “Would it be reasonable to . . .”.
“It’s broken now and I didn’t change anything” - If you didn’t change anything then how do you know it’s broken? The mere act of using a program changes something, though that doesn’t typically break the code, but you did change something. What really matters is that totally innocent game you installed because you were bored while I was working that you think I don’t need to know about, that you don’t want to tell me about, that is really a very malicious piece of malware now eating your computer alive because you installed it with administrative privileges because it is too inconvenient to have to type a password occasionally to modify your computer’s configuration. Or that directory you didn’t know what it was, so therefore was unimportant, that you deleted when you were trying to clear up space for your torrented movies. That might constitute a change.
It seems people have a fundamental misunderstanding with computers, that they can somehow execute the same code with the same data and do different things a different times. The computer is a fancy calculator, code is a series of button presses on that calculator. If you calculator told you that 2*2 is 4, would you expect a different answer after entering those same button presses one hundred thousand times? Not me. However the computer is a complex calculator capable of much more complicated math that 2*2, and because we do not understand all the math we assume that the computer is doing it differently sometimes than others. It is not, something has changed if the results are different. It isn’t fair to leave the developer guessing at what you changed. The number of times I have lost an entire day or more to finally figure out what the user changed, then to hear them say “Oh yeah, I did that, did that matter?” Yes it matters.
“I have an idea for …” - So do I. I have dozens of ideas right now, everyone of them is a potential million dollar idea. Yeah I should have executed on them, and I should be rich right now, but I had some bills to pay. There is never a lack of ideas, execution is the problem. Frankly, why haven’t you learned to code so that you can implement your idea? It is not rocket science. Here is the real kicker, if I did implement your idea, if I did all the work, made your idea a reality, you would expect at least a 50/50 split. I have been offered splits of 99/1 or worse in the ideas favor, and had the other part offended when I politely declined. Really, who contributes more, the contractor or the architect? Finally, most “brilliant ideas” are simply obvious extensions of the existing, the idea will neither be unique nor groundbreaking. And while it would be great to have app X, it will not make you a billionaire because it was obvious and someone else is already doing the same thing, or will copy you as soon as you begin to see success. That may seem pessimistic, but reality is harsh. Alta Vista? Excite@Home? MySpace? Yahoo!
“Digitally enhance that image so I can read the license plate” - The state of the art in movie technology makes it almost unbearable to watch a show that spends much time near a computer. There is no way to make more data than originally exists. That isn’t to say people can’t get creative, but hollywood isn’t getting creative, they have accepted that any image can be enhanced. The images below represent what happens with image enhancement. If you only start with 4 pixels as is the case on the far right, you aren’t going to get an image enhancement that means anything more than what you started with. With 5x5 or 25 pixels you still can’t tell it was an A, you might guess O or Q. It isn’t till you have 15x15 or 225 pixels that enhancement can give you an image that identifiably resembles the original A, but you can see that from the unenhanced view just as easily (frankly I had to cut the dot out of the 15x15 as the computer dropped had it filled in). Given that the majority of deployed security cameras are standard definition CIF or 352x240 84k pixels (.08 Megapixels) the chance a letter is going to have 225 pixels to it are slim unless the full image is the license plate. Granted the majority of cameras being deployed now are much higher resolution, there are a lot of existing cameras to upgrade, and the point remains. If it is not readable in the original image, enhancement isn’t going to fix it.
Don’t get me started on data recovery, hollywood really doesn’t understand when data is irrecoverable vs easily recoverable. I.E. smashing a cellphone to destroy the pictures on it.
“Why doesn’t it …” or “That’s nice but I need . . .” - Yesterday it didn’t do anything now there is something. If I showed it to you, it is because it represented a breakthrough or took a bit of effort and I wanted to show you that progress is being made. I know it’s not done yet I am not stupid, of course that is if you told me what you eventually wanted upfront. If you didn’t tell me and I have now delivered everything that you asked for, the first response had better not be, that is nice but.
“It’s missing feature X” - Why it is that people think features pre-exist and then the developer decides to remove them just to piss on the user is beyond me. Ok so they don’t really think that (do they?) but it is the way that they act. So yeah it doesn’t do X but it does do A-W, and without A-W X would be impossible, but yeah let’s focus on X.
“Can you export that to Excel?” - So you have your data in a complex, advanced programmatic environment, but you think the right answer is to extract it into an inferior environment lacking in flexibility, rather than allowing me to understand the end goal and build you a report that will be capable of running automatically?
“How soon will that be done?” - I am not baking a cake. I am not watching a video. I am not playing a sport. I am not driving to grandmas house. I am not converting a video or rendering a 3d file. Those are all things that can easily be measured and I could easily tell you how soon I would be done. However, I am executing a very creative process in which I need to balance a myriad of external factors and conditions in order to create the desired outcome, to instruct the computer to deal with all of those possible conditions. Conditions you did not think of when you created the spec, but would be very upset if I provided you a product that also did not consider those conditions. Further, I have no idea how many times you are going to interrupt me, nor do I have a crystal ball to know what unforeseen conditions will arise that I will then need to account for. And that is assuming you have asked me to do something I know how to do. If I am pushing the envelope, then how should I know in advance when I will come up with the correct algorithm or process in advance. It will be done when it’s done not a moment sooner or later. Any further attempts to drive the process forward more quickly, or gain further insight into when it will done are only insuring that it will take longer. If I quote you a time I have only thrown you a number to go and chew on so that you will allow me to continue trying to finish the project and stop delaying it further.
“How do you …?” - That I can do things you do not know how to do with a computer does not inherently mean that I know how to do all things with a computer. It does mean that I have been willing to try more things than you so have progressed further. Why don’t you go try something new? Why do you want me to sit here and try to do the thing you don’t know how to do? All I am doing is using Google the same as you could, I do not have a magic Google, my mouse clicks menus the same as yours, and you might learn something interesting if you go click around a new menu or two. I am willing to try something I do not know how to do today, why aren’t you?
“Oh we don’t need that anymore” - You just asked me to dedicate a chunk of my life to building you something that I am now passionate about and have poured my soul into it, but you never really needed it? You clearly never needed it because you stopped needing it before you had it. Why did I put all those late nights in? That you don’t need it anymore does not mean that I any less built it and made every effort to contribute. Your not needing it is not my failure, it was not I that wasted the time.
“They are both top priority!” - I do not think that means what you think it means. Perhaps I will work on neither until you can make up your mind. I certainly cannot work on them both at one time, I am going to have to choose one to work on before the other. Why should I be the one two flip a mental coin to decide which of your projects to work on first? I understand that you live in fear that only the project you tell me is top priority will ever be completed, and that paralysis make it impossible for you to tell me which one you want done now. But why is it that only the first project you tell me to work on ever gets done, and the other gets dropped? Surely, I am to blame, and I am the one who refuses to ever move on. It couldn’t be that you are unable to say, “That is good enough, let’s move on”. It couldn’t be that another top priority has come and you have now again told me to not work on number two because it really wasn’t as important as you thought it was. It couldn’t be that you really need to hire a junior programmer to work with me and improve the completion rate of projects allowing both to be worked in parallel. Certainly it is the damn developer that never makes it to phase 2.
Make a list, one item per line, and I’ll start at the top.
“Just split your time on both of these tasks” - This goes back to the last one about priority, as well as a fundamental misunderstanding of the way that a software developer works. It makes sense to a manager who breaks his day up into 1 hour or 30 minute blocks. It becomes very easy for him to allocate a certain number of blocks to each responsibility that he has and to thus split time across many projects. So why can’t the developer? If I am thinking about the time, I am not coding. I need to block everything out, that is why I am wearing these headphones that you hate, and why I have turned off the lights. I need to be able to load all of those variables and conditionals into my head so that I can begin molding them and expanding on them to create more and eventually complete one of those tasks. This spin up time is lost time, it is time where I am just trying to get back to state so that I can start making progress again. There is also a period of time after I stop, that I need to let go of all that I had in my head. If I start switching back and forth between projects, then I have double the spin up and come down time. The truth is that a developer is lucky to get one such block each normal work day. Now you want me to split time?
Paul Graham has written an excellent essay on the topic, I encourage anyone who wants to understand the impedance mismatch between development and management.
Maker's Schedule, Manager's Schedule
“Just take a short break” - I am not hiking a mountain, I am not lifting weights. I do not need a short break, in fact this break where I stopped to listen to you ask me to take a short break has been far to long I am starting to forget where I am at and if I take much longer I am going to lose even more time. I want to be able to go home today, I want to be able to do so having accomplished something and every moment you are pestering me about a break is driving that quitting time off by 10x. I do not need a break, I need to keep it all in my head so I can keep moving forward.If I can take a break you’ll be the first to know because I won’t be sitting here trying to solve this problem.
Anything at All - Really we aren’t dicks, we do not hate you we are not just pretending to like you. However, as I am working, I now have a lot of information loaded into my head, the state of the code that I am working on. And every bit that you speak loses me 10 bits in my head. Thinking of a proper response costs me 100 bits. And so I try very hard to let you know that I care while not dropping any more bits than absolutely necessary. But you are still talking and I am now bleeding bits. If I stop to really talk to you as a human being and give you the care and concern that I know you need and deserve, I have just cost myself an hour of startup time, perhaps more. I will not be able to immediately begin where I left off as you walk away. In fact I might now check my email as I have lost state. That condition I was in the middle of accounting for is lost and forgotten. I may remember, not likely, more likely I may stumble across it again later, otherwise, you have just helped me to create a bug in the code. A condition that was not properly accounted for. I thought I had accounted for it because I thought about a solution for it and had begun to implement it, but then I was interrupted. Now I have moved on past that, yet the problem remains unsolved in code, only solved at one point in my head. Truth is I am politely nodding and smiling at you because I like you and don’t want to hurt your feelings, but inside I am trying like hell not to hear a word you say so that I do not lose my place.
Programmers are much like artists, not so much like builders. Many people think we are just moving blocks around and fitting them together like a builder does. We talk about modules and such that may lend to that misconception. We talk about copying and using a chunk of code, which also does not help. But most of the time we are artfully dissecting the problem and conditions, accounting for externalities that we cannot control in very creative ways like an artists brush stroke. If we were to start from the beginning and build it again, the art would be entirely different, unlike the builder who would build it the same way twice. Like the artist, we have a palette. We do not hold the palette in our hands, we hold it in our heads. We have poured out our colors onto it and mixed precisely the right shade to represent our solution on the canvas, our code. Now you have come to talk to me, interrupting, your words a bottle of paint thinner in your hands that you slowly poor over my palette washing away the carefully mixed colors, muddying them with others before the color was able to be applied to the canvas. Now my palette is either so muddied to be unusable or washed completely clean. I will need to begin anew, mixing colors. I will never find exactly that same perfect color that I had, but with any luck I will mix a different one just as good. Imagine the artist that had to cleanse his palette repeatedly through the day, that is your question, that is your meeting that you felt was so important. If you want me to be effective, leave me in my solitude, in my developers cave and let me paint.

No comments:

Post a Comment