Monday, November 27, 2006

The origin of programmers

There are a couple million programmers around the world. Being this such a large and diverse demographic, it's hard to state any common ground in the community, except of course for the fact that we all write code. I am going to state some things I've observed. I'm even going to make some assumptions here and there. Fear not, I am aware that they are not absolute, and I probably wont be able to make any determinations of that nature on this subject. These are simply things I've observed and explain some behavior I've seen. If this isn't a good enough disclaimer, then let the hate mail/comments fly in. I don't care if every one of my readers protests about this post... all five of you.

I'm a twenty-something year old programmer, as are most of my colleagues. When I was growing up, as many of the children of may age at the time, I had a strong fascination for video games. Keep in mind, in that time, although video games were popular, they were not the main stream media channel they are today. It's difficult to give you a concrete explanation of the source of the interest in them. Somewhere in between the escapism of reality, the provided suspension of disbelief, or the ability to control your destiny. All of these ideals may be seductive to the average adult, but they are even more so to a child. As a child, you parents tell you what to do, your teachers hand you homework. You have little or no control over what you do and how you do it. It can be argued that as an adult you live an an environment that probably has equal or less freedom, but that's another subject. In that virtual world, you are in complete control. In a sense, you are god.

I remember an experience that came very natural to me while playing these games. Especially in action/adventure games. Whenever I got into a boss fight the first thing I would do is try to identify the boss' attack pattern. That would make a much easier and safer counter offensive. Back in the day, video game consoles didn't have the processing muscle they enjoy today.The enemy's patters where pretty basic and repetitive. To make the game challenging, you had multiple enemies coming at you from all directions. After getting good enough to beat the average game's artificial intelligence, and all of the lame kids that dare play with you, you tend to look for the next step. You start wondering how to make games. This is when you eventually find out about this thing called programming.

I've heard stories of similar experiences, but instead of video games being the catalyst science fiction, comic books and other creative influences have been the culprit. At any rate, the pattern holds. You find about this programming thing, and you probably don't actually get to work on it immediately, but it remains in your subconscious for years to come.

Now you're a teenager. You start hacking away with whatever resource you can get your hands on. Even if you have a fresh memory or not, the impulse that got you here was fun, mystery, intrigue. At this point, it probably is still about that. You make anything from stupid little programs that execute simple mathematical formulas, to fairly complex applications.

Eventually you decide to get a career computer science, systems engineering or some other technology related career because of this fascination. You learn how to code "for real". During or afterwards you go out there and you get a job. Nine out of ten times you will be working on custom business applications. Weather I want to admit it or not, that is where the market for your average programmer is today.

Although making and maintaining business applications can lead to a profitable income, there is one very basic problem with them: THEY ARE BORING! There is no feeling of achievement after writing 14 lines of code that tell you how much money is left at the end of the month. The reason why you this fascination started early in the life of a programmer and the way it has manifested at this point is completely different. Weather he wants remember it or not. Repetitive work tends to make programmers dull. You cannot expect major breakthroughs, or ingenious ideas from someone who has to repeat the same process in different flavors every day, 8 hours a day. Yes, there are exceptions, but they are simply that. Exceptions that confirm the rule.

Some of us get excited while working on "complex" features like networking, security or new web/mobile interfaces. Think about it. All of these things are abstract elements. The need for these elements is an obstacle that needs to be tackled. You have been chosen to do so. The process will lead to identifying patterns which you need to wrap your head around in order to make the given technology work in your favor. In the end, you will be worthy of praise for the addition which will make the product better. Sound familiar? Yep... humans are that predictable. It's another video game. You are hungry for the very things that got you here in the first place. Things that have been replaced with monotonous number crunching and report generating.

Sadly all of the corporate technologies that programmers withing this profile tend to use, weather the want to or not, are working in the opposite direction. They abstract you from anything that may lead you to code something new and potentially exciting. You are left with "your important business logic", that is usually found somewhere in the slogan. Yes, you will have an increase in productivity, simply because you will have less code to write, therefore less bugs to fix. The problem is that you will have to repeatedly write the same type of code over and over again, while your framework/tool/environment takes care of the boiler plate.

This is one of the principal reasons why you see people working happily in a small company or startup. They are making less money, they have less benefits, and have a potentially insecure future, yet they couldn't be happier. Aside from the fact that mountains of bureaucracy will magically disappear, you are generally working on something new, different and exciting. You are going back to the basics. You have another boss who's looking for an ass whopin' and you are just the guy to deliver it. And for those of you reading and have not played a video game in their lives, take my word for it. Kicking a really hard boss' ass, is one of the best sensations of satisfaction and self achievement there are.

Not all is lost. Google is trying hard to get the status of the "anti-corporate corporation" in attempts to lure talent to work for them. They have a program where employees are allowed to dedicate 20% of their time to whatever project they decide. This is one of the most awesome idea's if heard since sliced bread. On one side, you have happy, interested employees working hard to get their ideas across. On the other, you have new products and services cropping up from the company, with a much smaller investment in research and development. Gmail, google news, orkut, google talk where all product/services, that originated from these efforts.

In today's highly competitive market software and information services are getting an ever increasing important role in every day life. This can be said for both personal and business environments. Attention will undoubtedly go to the ones offering the best and most original ways to handle the information. A lot can be said for efficiency and it's importance, not arguing against it. Like anything and everything else in life, a middle way must be found where it can coexist with things like unique ideas, fresh concepts and plain old fun. If we are just going through the motions like robots, then there is no hope for evolving the way we handle or information, which in the end translates to the way we handle our lives. Is that really a world you want to live in?


WaRCHieFX said...

You nailed it.

Now you may understand why I always choose the most interesting way to do any kind of thing related to programming: There is nothing fun about implementing things always the same boring way everyone does, unless it happens to be The Way. And even so, you may still find a better and more effective way of doing something or at least learn another way how not to do it.

Elvis Montero said...

I feel compelled to say something: you scored a bull's eye! However, there's pretty much nothing we can do to overcome the status quo - other than bitch about it day in/day out, I can't think of anything else.

We're all (software engineers) here because we like what we do. We just don't like the "challenges" we've been given (or the money, or the respect from upper management, et al).

As a French youngster would tell you: c'est la vie! :)

Saotome said...

I disagree with you my friend. And pretty soon I'll demonstrate that there IS something I can and will do about it.

Till then, I'll enjoy bitching about it as usual.

Elvis Montero said...

What? Don't tell me you're planning to show up and shoot/kill everyone in this building (yikes!). Let me know once you're ready so that I can skip work that day! :D

Ivan said...

Nice, though I don't share the enthusiasm my colleagues have expressed. Mainly I disagree with how you explain the way most corporations work. Yes, there are lots of bureaucracy involved. Yes, most of the business logic thingies are boring. But you know what? they are business for a reason. It's about making money, as everything else. It doesn't matter how cool it would be to do some new interface that sends XMLs and cures cancer, if it doesn't report profits/improves productivity/is more cost effective, chances are you won't get to do it.

One thing that has always bothered me about my career, is that some people (and I'm not particularly referring to anyone here, but rather a general view) tend to believe that just because you can do some things a certain way you should do it, in many cases over complicating the problems. The truth is, at least IMHO, it only makes sense to do it if it reports a tangible benefit to the work you're doing, while not causing more problems. Off the top of my head, I have experienced situations like this, where you are given code that nobody else other than the creator will understand (and sometimes not even properly documented) just for the sake of obscuring the code and make it look like something out of NASA, or that requires many more different packages (which removes portability) just cause "I don't like how the standard company language handles XML, so I used this other cool, new thing", or my favorite, converting a 15 lines code that works and works well into a 100+ monster just because you get to use threads, and "threads are cool".

I don't know, maybe I'm not expressing myself the way I would like to, but the point I'm trying to make is that all is driven by a business necesity, and tech-geeks like us tend to forget that from time to time. I like to believe that whenever you encounter a work situation (or any situation, for that matter), you should always check yourself first and see if is you that requires a change of mindset, before complaining about how good would it be to work for a company that does things in a certain way. You have three options, and they all require change:

-Change the way you think, and try to understand the needs and views of others, not suppressing your own, but rather complementing them.
-Change the views of the company, by effectively demonstrating how they would benefit from what you're suggesting.
-Change your job. Simple as that.

PS: I don't think Google is the best example for what your talking about, as they actually profit from the products that come out of the google labs, so it's not just an altruist move on their part.

Saotome said...

Elvis, nah, I wont go postal. That be too cliche. You'll see in due time.

My good friend Ivan. I think you are misinterpreting my motives. I am not for obscuring code. Nasty code is nasty code, whatever the application or goal may be. Also, you need to learn how to fit a solution to a given problem, not the other way around. People who do that are also fundamentally wrong. This holds for anything you are working as well. I understand that the objectives of the collective must also be attained. That is the whole point, if you are not creating a positive addition to the goal as a whole, then your addition is pointless.

The idea I really wanted to come across is that our jobs at the moment are characterized by constant repetition. You think you are doing something different today, but it's just same thing as yesterday with 3 different details. Repetition will not allow you mind to flourish with innovative concepts. Be them for the company (seeing that you are one of the pro-corp supporters) or for yourself.

If we need to crunch number and generate reports, SO BE IT! That's the nature of the beast. If ALL YOU WANT me to do during a 40 hour week is to crunch numbers and generate reports, then that's a waste of my time. Hire a guy with a robot/zombie mentality, make the process as automated as possible and give him a mouse. Throw a way the keyboard if possible!

We need to evolve. Not just genetically and socially throughout centuries, but in the you think and approach problems during YOUR lifespan. Sitting in a cube, doing the same thing over and over again is just the opposite. You are forcing your body and your mind into a static frame set. Innovation under these circumstances, while possible, is very difficult to achieve. Never the less it's expected and necessary in order to compete. See the problem?

P.S.: Yes, google has it's labs where it spends a whole lot of R & D money. But keep in mind that the products I mentioned did NOT come out of that lab. They came out of the creativity of employees who were given time to dedicate to the things they consider important.

monk said...

I find your post interesting, and the comments quite so too.

Businesses are about making money, but they are also about providing products to the consumer/user. What happens is that most are just either too afraid, or make it a point to avoid the exciting new thing out there, just because it may be a smoking mirror and end up loosing more than what they put in.

For a company to be effective they need to challenge their employee's in ways that will benefit them, and that's what Google does. They give their employees 20% of their time to devote to that what they think is worth it. As saotome said; gmail, google reader and others are products of this initiative, --there are hundreds of other applications that have not prosper-- of course google makes a profit out of those applications. In most cases the employee is just static their idea were implemented succesfully and met with wide acceptance by the clients/users.

The truth is that in Google bureaucracy to deal with too, the difference is that it's not the hackers dealing with it directly -- and that's an intelligent move from Google.

The biggest problem in faced with big companies is that they on the premise of being efficient they make the goals unatiable. Making employees that are on a deadline, go to 4 meetings of almost an hour each! instead of letting them do the job, is iresponsible and stupid on my book.

But our hands are tied and we have to play along.

Now the opposite of that would be chaos. With smaller company's things are easier to control, and it's easier to keep your eyes on ball/prize.

elpargo said...

hey you losts your insecurity about quoting yourself! let me remind you that

now about the real thread.

yes big corporations suck money that's their job, and in order to control expensives they must control everything.

you (both Ivan and green) may find this reading very interesting.

Francis said...
This comment has been removed by the author.
Francis said...

Sorry for double post, didn't see ways to edit a post after posted, so decided to repost instead with the fixes.

I found the whole read interesting, I regret that I'm joining in a bit too late in the discussion.

There's an inevitable reality in the software industry, and it is that the purpose of any software is to handle information for whatever benefit of whichever party. This info handling needs to be reliable, and needs to have a predictable behavior in that if you input something to it, it'll give you the output you're expecting. If it doesn't, it's something that you're not contemplating on the main algorithm. This is the main culprit behind the whole routine thing, IMHO.

Something similar happens in other branches that aren't necessarilly related to IT. Medicine for example needs this reliability too.

If you create a medicine, therapy or treatment for treating X illness, you at least want it to fix said illness as globally as possible, with as few side effects as possible. You don't want something that you prescribe a patient to cure (or better) X illness, but tommorrow instead of healing it, makes it worse.

So in Medicine (no matter the specialty you make), as in IT, you eventually get into a routine as well, although there's one important difference. Your 'work material' are no less than other human beings, and failing in Medicine can cost one (or many) life/lives.

Lucky for us, in IT only machines and information are on the line, which do not have THAT serious implications if our code fails. True, it may spell disaster for any large organization, but sooner or later they can/will recover, unlike the risk in medicine, since you can't breathe life back into something that died for good (as weird as it may sound this, considering the 'clinically dead' and other states :P)

In our case, something that adds to having repetitive work is that, since I'd say at least 95% of the problems we need to solve through software involve any sort of math in it, solutions tend to be very precise. Sure, they may have exceptions, but when they happen, they're handled without fatal consequences, and in turn are the new details that come into our repetitive work to finally solve said problem.

You can have dozens of different implementations to solve a single problem, but in the end what you need is to solve the problem, and one way or the other you will tap into a pattern as you originally said in your post.

If you want outstanding variety on this, what you need is to always have new problems to solve that won't revolve around the problems already solved by your code, or code you have access to.

That can be the most feasible way to let your creative juices flow without falling into a painful routine (that as I implied above, you tend to fall into after some time no matter what your job is).

In a bussiness that has systems that address specific tasks or problems, it'll be hard to find these opportunities. The best you can do is create them, taking your own initiatives and let things flow based on that. Routine work becomes second nature at some point either way, so you may end up having an amount of spare time good enough for letting this initiative flourish.

Those are my 2 cents worth. :)