Please Stop Giving Me The Business

As a programmer there is good and bad about working inside a company who’s core business is not directly the software you are writing.

The Good:

  • No one knows what you do
  • You can get to learn about other businesses/fields

The bad:

  • No one knows what you do
  • You can end up being treated like the other

When  working inside of a company that doesn’t make software as it’s Core Business,  I want nothing more than to support the people who do other stuff in the business. I get that we need the sales, mktg, and manufacturing people to sell, market, and make the widgets since that’s where the money comes from. When you are developing in house software, its rare that the end consumer is out there saying:  “I am going to buy my widgets from ABC Corp since I hear their internal billing system is written in Node.js.”

However, I am getting really tired of being told “The business wants” or “This is a business requirement” or anything when the speaker is saying

YOU are just a programmer, the people in the offices with the windows THEY are the BUSINESS, just do what they say.

Its like they are saying that the developers can’t possibly understand what they do, so just let them write some stories about what processes need to be implemented and then write those up. Oh and when you are done we will have THEM do acceptance testing to see whether you suck or not.

Um Really?

Where is the WE? Where is the love?

The phrase “the business” is a kind of trump card.

Yeah, Yeah I hear you but the BUSINESS wants…

Here’s what’s funny, I have been at this a long time and sometimes maybe most of the time the users don’t really know what they want in house software to do. They only know what they do now and they have some vague ideas about what they would like to be different. They generally have a lot of good domain specific knowledge but they can be blinded by being so close to it they can’t really see what is going on. It is also the case that while they may be super smart in their area, they don’t really know much about process design issues.

The frustrating thing is that they have people in the company who are really good at thinking about logic and processes. Who can spot the weak points in a checklist, or notice what steps should be logged etc without even thinking hard about it. You think they would use this resource. And sometimes this happens. I remember a biz guy from Microsoft telling me that in his department anyway he always had the programmers review the contracts since they were the ones who were best at Math etc and could tell him whether there were any problems with his deal. So it does happen, but It seems to be rarer than it should be.

Its more likely that if the company perceives and issue with its processes, it will contract some expensive Six Sigma (or other religious) consultants to spend a week capturing ideas and process capabilities or whatever. Why would they invite the “computer” people?

So why would someone even think of working in a place like this? Often you have to fight against the grain of whatever the culture is to make something good happen. There are times when Agile isn’t nearly Agile enough etc. but If you persist and you are willing to take some risks you can make some good things happen and get some other benefits as well.

As I mentioned at the top, when you work somewhere that doesn’t do software as its core business you can learn a great deal about another subject. During my last contract job, I received a free education about clinical applications of human genetics from some super smart people. I was able to use and learn a variety of tools I selected to create the tool.

Nice work if you can get it, despite the fact that every now and then, someone is giving you the business.

Screening Programmers Via Email

There is lots of good articles out there on the web about how to interview programmers. Here’s one. Most of this understandably focuses on the interview process whether its a phone screen or and in person all day event. At some places the process essentially stretches out for a 90 day trial period.

I don’t have much new to say about any of that. I will just say that when you have a bad feeling during the interview, you should probably pay close attention to it. If you aren’t sure you can always interview them again and see if it goes away.

The part of the process I want to write about today is the part where you get (hopefully) lots of resumes and you have to decide which ones are worth a phone call. You are going to need the phone call or in person interview at some point but these take time. How can you best decide which ones to interview from the resumes you get? If you only get a few this is not a problem, but how do you sort through dozens?

Sure enough, a resume contains a lot of information and there are good and bad ways to read it. Again I won’t go into details other than to say that I like this comic.  There is however a problem. The resume leaves out a lot of things which may help you decide. This is especially true if the candidate is non traditional in any way at all (age, work experience, education etc). I’ve had bad hires with degrees from MIT and great hires who were still in High school. There has to be a way to look a little deeper before deciding on who makes it to the next round since in the end:

You are looking for someone who can write good code not a good resume.

At a previous job we started using a series of questions to get a more complete picture of the candidate before talking to them. The trick is these questions aren’t about programming knowledge per se since someone could just Google the answers.

What they do is provide a way to encourage the candidate to tell us more about them so we can make a better decision. They can also function as a kind of programmer personality test. Over time, the questions have changed but the basic concept remains the same. You send out a list of these questions to any of the candidates you think might remotely fit and then scan the responses to decide who to interview.

Here’s an example:

What programming language do you wish you knew better and why?

How someone answers this usually can tell you alot about how they view their skillset. People love to list on their resume a dozen languages that they have written 5 lines of code in, but what they want to learn tells you alot about how they think about themselves and the future. Like all of these questions there is no one right answer you are just hoping they have some kind of positive interesting answer. If they answer something like: “I already know all the important languages” or “I have been thinking of learning X cause, there are like lots of jobs and stuff for that” then you may have a problem.

Another one:

Have you had problems working with others or a boss before? How did you deal with it?

Personality matters for a lot. This question is pretty good at weeding out those people who just seem so unlucky that every place they worked was toxic. These people never suspect that they are the poison but  a question like this will usually give you hints.

There are more but that’s the basic idea. These kinds of question may not pass muster with your HR department but they will help you get better insight into the candidate before the phone interview and give you some additional things to talk about besides “Tell me about your job @ X”.

Its much more common for these questions to cause someone to stand out from the crowd in a positive way than for them to get rejected based on the results. A resume doesn’t really let people explain what their passions are and when you try to do it a cover letter it can come off as kind of icky. In this kind of informal survey of questions a candidate can feel free to give a long answer if its needed.

One of my best hires every was a fresh from school programmer with no real work experience, nothing impressive on his resume or cover letter, etc. Probably not worth the phone call but sending out the list of questions via email is easy so– In one of his answers to the email survey he explained about his experience with a product he bought and how he didn’t like the software that came with it. So he wrote his own and then released it as open source and was managing a small community of people.

Ding!

Spokefest 2010

Pretty excited about SpokeFest tomorrow. I did it the first year with the little girl but didn’t make it after that. This year they added a 47 mile option which should be fun. With that and the ride to downtown it should be about 67 for me.

This year I even have a T-shirt.

Another Story About How Fred Brooks is Smarter than Me

Maybe I could do a whole book, but I guess he already has.

Back when I was in gradual school Fred Brooks was the adviser for something called the building walk-through project. The idea was pretty crazy. You would model a building in a computer before it was built and “walk” around in it using 3d graphics. The system had a map view which was 2d overview and a first person 3d view which was generated by Pixel Planes 4. At some point there was a treadmill hooked up where you could really walk around and turn using  a bicycle handlebar setup. Oh yeah. And there was a full axis HMD. I’m bad with dates but I think it was around ’88-’89.

Some interesting stuff came out of this project. One that I recall was the relationship between navigation mode and frame rate. If the frame rate dropped below around 10fps the user would stop looking at the 3d display and revert to the 2d overview for navigation.

Anyways, Dr. Brooks was always preaching the idea that building walls were mostly flat and vertical and the floors were mostly flat and horizontal. Somehow there must be a way to take advantage of this when you render to get better performance.

I think I speak for me and a few other cocky grad students in saying our response to this was something like:

Look old man, back in your day you might have been hot stuff with your 360 machine, but nowadays its floating point matrices all the way down. How can what you say  matter? Besides what if the user tilts her head? Sheesh.

As far as I know none of us thought much about this problem.

A few years later when I was out in the “real world” someone brought in this game called “DOOM”. We were all blown away how this little 486 was doing perspective corrected 3d textured graphics so fast, it was almost comparable to the SGI’s we had. We thought and thought about how it could be doing this. We had no idea for quite some time. Then after looking at some other demos etc it clicked,

…perspective transform, constant , verticals, horizontals…

FRED!!!!!!!!!!!

Gradual School

A previous post got this comment:

You were in a gradual school?

I am guessing the commenter was “helping” me with my spelling which I do need in  general but in this case I was referring to:

Walt: Daddy what’s gradual school?
T. S. Garp: What?
Walt: Gradual school. Mommy say’s she teaches at gradual school.
T. S. Garp: Oh Gradual school is where you go to school and you gradually find out you don’t want to go to school anymore.

I learned many things at gradual school some of them are useful and some of them were learned in my CompSci classes.

Actually there were some good  things I learned in class, but none are more applicable to the job of being a programmer than this:

Never subtract two almost equal numbers and multiply the result by a really big number

Thanks Dr. Pizer.

This is without question the single most valuable programming thing I learned in class during the undisclosed amount of time I spent at UNC. If you remember this and can juggle clubs in pairs you got much of the value of a MS in CS.

Social Works

Conventional wisdom says that the free market compensates people based on how hard they work, their ability,  or the importance of their job. People with rare or high levels of talent and strong work ethic rise to the top and make the most money.  It is certainly true that most of the people at the top are highly talented and make lots of money, but the sorting is not very complete. It seems like lots of other people with talent who are doing important jobs which require great skill are paid almost nothing.

If you look at any of the various web pages which tell you which college degrees make the least money you will find Social Work at the top of almost all of them. Until a few years ago I guess I had no idea what these people do or why it matters. Sure. I get the idea. They work on social problems, big deal. Why don’t they get a real job? Weren’t they smart enough in school?

When you look around at the real deep problems in society:  poverty, drug abuse, homeless teens etc., these issues aren’t going to be addressed by the next iPhone even if it is on Verizon. They also aren’t going to be fixed simply by allocating more money to Food Stamps or low cost housing. Those things can help but they mostly help make a bad situation more tolerable. Changing any situation requires effort/work. I don’t know what the best plans, policies and programs are but I know that we aren’t going to make society better without working on it. What kind of workers will we need? How should that work be valued?

I have seen a few things in the last few years that I hadn’t chose to notice before. People patiently spending time with street kids to try to help them think through their situation to make better choices since there are no functioning parents around to do it. Breaking this cycle is very hard but someone has to try or we are only perpetuating and growing the problem.  Its too bad the people trying help people get out of poverty are often just above the poverty line themselves. I once watched someone talk a drugged out kid into handing over the knife he had before anyone got hurt. That’s a pretty tough gig, especially for someone making basically minimum wage. How many years would you stay in that job for crappy pay? Or what about taking the call at night when your groups mentally ill client stops their meds and rips up the apartment you helped to get them placed in. What’s a fair rate for the person who has to go in and sort that out with the apartment manager?

Sure I know, we don’t want to pay people more just to attract more or better people. Money distorts things. We want people who are in it for the passion and not just after the money.

Funny how we don’t seem to say that about Corporate CEOs.

Thoughts on Random Thoughts

Yesterday I put up a post on my blog about programming. I did this because I had read an earlier post that inspired me about the idea of trying to write something every day. The basic idea was that if you keep at it you will get better. So I had a go.

The incredible irony here is that one of the points I was making in my blog post was that much of the skill of a programmer seems to me to be innate and thus I wondered if it can be taught. So while I was demonstrating my belief in the idea of practice, I was demonstrating it by questioning it.

Um whatever,  on a good day 10 people read my blog. Thanks sis!

The post actually got picked up on a few sites and I got literally 500x more traffic than I expected. From this experience I learned a few things:

1) Wp-cache is a good thing.
2) I really do need practice writing.
3) I would have been alot better off with a few shorter posts.
When you title something “Some random thoughts on …” You pretty much give up any pretense of saying you are making a coherent argument about anything. That should have been my first clue that my post wasn’t ready for prime time.

Still reading all the comments does help me realize what I was trying to say:

1) I think people’s ability to deal with complexity seems at least to be some kind of innate trait
2) Managing complexity is a key skill in programming
3) Abstractions can both reduce and introduce complexity
4) Javascript is more complex than many people think
5) We should worry about 4) since we seem to be using it for everything now.

I’ll try to do better next time.

Things I wasn’t trying to say:

1) I am awesome
2) If you aren’t awesome like me quit trying, you will always be a loser.

For the record. I don’t think I am awesome. I have done some cool stuff and some crappy stuff. I have worked with people who were both better and worse at this than me. I’d say I am good not great. When I was 26 maybe I was great. Its hard to remember.

I also don’t think people can’t improve. That wasn’t my point. People get better there is just a limit on how much better they will get.  I ride my bike almost everyday.  I actually climb hills better than when I was 26, but I am getting no closer to winning the Tour De France much less a local cyclocross race.

Some random thoughts on programming

Since this post actually got read by people I made a follow up to clarify some of what I was saying. Thanks internet for helping me realize how bad I am at making my point.

As I near the end of my third decade programming, I keep finding myself coming back to pondering the same kind of questions.

  • Why are some people good at this and some are not?
  • Can the latter be trained to be the former?
  • What is the role of language, development environment, methodology, etc. in improving productivity?

I’ve always been partial to the “hacker”. The person who can just flat out code. For some people this seems to come easy. I have been lucky enough to work with a few people like this and it has been awesome. As you talk with them about a problem they are already breaking it down and have an idea of how the final system will work. I don’t mean that other aspects of professionalism, experience, etc. aren’t important its just that I believe in the end there is a raw kind of talent that you can’t teach. My wife can sing, I can’t, and not for lack of practice.  She practices, but she can also belt out a perfect tune without hardly trying.

What are the core talents that makes someone a good hacker? I think there are two:

  1. The ability to break down an idea/system into an abstract set of “concepts and actions”
  2. The ability to understand how these “concepts and actions” execute in a particular environment.

Note that I didn’t say anything about coding. Coding is actually the least interesting part. If you can do the others well, coding is just another kind of typing. Coding is the thing your fingers do while your mind is flipping between 1) and 2). Learning a new language is less about learning the syntax than it is about learning the execution model.

Writing good, correct code involves not just conceiving of how something should be 1) but also understanding all that can happen 2).

I honestly don’t know if these things can be taught.

In 30 years I have only seen a few examples where a mediocre programmer became good or a good one became great and zero examples of a mediocre programmer becoming great.

What does this mean for people who want to build large software systems? The easy answer is to only hire great people. Which is fine when you can do it but not everyone can be or hire the best so what is left for the majority?

What should be done to make things easier for people aren’t in the top 5%?

There are lots of nice things that have been invented like source code control, higher level languages, garbage collection, etc. which reduce or abstract away some of the problems. And while sometimes these abstractions are leaky, they are really one of the few weapons we have against the beast called Complexity. Complexity is the key problem we face, especially if we are not wizards because:

A persons talent with regard to 1)  and 2) above determine how much complexity they can deal with.

When I was in gradual school at UNC-CH Fred Brooks (the mythical man month guy) used to talk about Complexity as being a major thing which makes programming hard. Its not something easily cast aside:
Quoting Dr Brooks:

The complexity of software is an essential property, not an accidental one. Hence, descriptions of a software entity that abstract away its complexity often abstract away its essence.

I wish I had appreciated everything Fred said when I was a cocky grad student as much as I appreciate it today… sigh.

Some things are hard because they are hard and not much can be done about them. Still our goal needs to be to not try to make it worse than it is.

To this end, some people say:

Do the simplest thing that will work.

I agree but prefer this formulation:

Strive for the simplest thing that can’t possibly fail.

If you think about what can go wrong you are more likely to find the problems than if you think about what will go right.

I wish I could say we were making progress in reducing complexity but we seem to be adding it into our programming environments rather than removing it. One of the things I have thought about recently is the complexity of these abstractions themselves. Programming languages of today are so much more abstracted and complex than what I learned on (assembler, basic, pascal, C).

For example the world (or at least the web) is currently engaged in writing or rewriting everything in Javascript. Not because JS is so awesome, but because 15 years ago it got stuck into browsers, then we all got stuck with browsers and thus we are all stuck with JS. Sure there’s lots of server stuff done in various other languages but really how long can that last? How long can one justify having to write 2 parts of an application in 2 different languages?

The future looks like node.js.

I am not a JS hater. Its just that I used to think Javascript was a simple language. As someone who wrote 3D Game engine code in C++, my thought was “if these webkids can do JS then it can’t be that complicated”. After building a webapp using Javascript/Dojo/svg to create a realtime browser for genetic information, I realize how wrong I was.

Sure its all nice and simple when you are doing this:

$(“#imhungry”).click(function() { alert(“food”);});

However a lot of complexity lurks just under hood. And its the way it all interacts that concerns me. Crockford called it  Lisp in C’s clothing. This should excite a few people and scare the crap out of the rest.

JS has lots of opportunity for expressing yourself in interesting ways. Expressiveness is good, but too much of it can create more problems than it solves. Back when C++ was a bunch of source code you downloaded from at&t and you had to compile the complier yourself before you could use it, we grad students stayed up late eating bad fried chicken and debating the merits of O-O programming. It was at this point I began to wonder if the productivity gains of O-O were more the offset by the time spent debating about what good O-O practice is. This tape has played in my head more than a few times in my career.

Its not all bad of course: On balance, garbage collection is a win and I see lots of benefits to using closures in JS, but the underlying complexities of things escape most people and their interactions are understood by even fewer. If you have to slog through this (and you should) to understand what happens when you call a function, you are cutting out alot of people from fully understanding what is going on when thier code executes.

I hope that some of this will be address by standards of practice. Things like Google’s guidelines seem to be a good start.  As with C++, I think that the best hope for improving productivity will actually be to agree on limits on how we use these tools rather than seeing how far we can push the envelope.

Well except for wizards and we know who we are 🙂

Obsession

Sometimes when I am feeling a little obsessed with something. I wonder where I stand on some kind of scale relative to other people. Today I wonder, what FedEx package has had the most hits on its tracking page.

Nimbulist

I finally actually finished an iPhone app and put it in the store. Its pretty simple but solves a problem I actually had. I am a big user of Evernote and but thier iPhone client is pretty clunky for editing todo lists. Nimbulist (app store link) lets you do this quickly with what I think is the minimal number of required touches.