I got first (paid) job as a software engineer when I was back in college. As I had to mix daily student duties (drinking, catching up with my pillow that missed me so much while I was out with friends partying; ah! and sometimes I went to classes), most of the code was conceived in the afternoons, at home, while overdosing caffeine. It was proper programming, doing most things from scratch, using multiple languages, compiling for multiple architectures, and so on. I wish everyone in this business to have the same starting experience. The job also involved talking to clients, staying and repairing stuff in the shop's HQ, but this was occasional. Probably this is why I never treated that employment seriously (and looking back at the money I was making there, nor was my boss). Then, after graduating, I thought it would be a good idea, to work as a software engineer for a company that is both popular and respected. I took a shot at one of the biggest asian Megacorps, and got the job. I was delighted by the recruitment process, as this was the first one I really had. The previous job was given to me from the get-go of the first talk, there was no one at that time who could evaluate an 'engineering talent'.
So there I was. Research and Development centre of the Megacorp. Lovely building in the middle of Warsaw, lots of restaurants nearby, RFID security, absolutely no parking possible. Lovely!
The team was awesome. Bunch of geeks raised in the times when the world converted from analogue to 8bit digital. I was kind of expecting that megacorp would require more humbleness and withdrawal from re-hacking, refactoring the codebase that was >10M LOC strong. Now I wonder why I haven't run cloc on the whole thing... It could have finished by now (HDD + corpo-ware + humongous codebase = tragic IO). I digress, sorry. After months of 'getting to know' the code, the product, and the tools, the part of the team that included me was given a simple task of aiding some customer customisation on the products. It involved branching the code back and forth, amending some configuration files, and editing bunch of C/C++ headers by adding yet another #ifdef ugliness. I remember one of the main headers to be swollen to >100k lines of #ifdef sick.
The task was fairly simple - (once you knew what to edit), repetitive, and very much human error prone. Typical hack-build-test-iterate loop was a no-no, as clean checkout took over a day to build (yes, day like in 24h). And if you consider touching the main header file as the main activity then you start understanding why you are screwed. My colleague had a brilliant idea to do all this human-error-prone stuff using python. After a few days we had a working prototype, after weeks we've used that piece of code to unburden us.
It was perfect. I got to write python code that actually did something useful under the eye of much more experienced coder. Awesome. We smiled at the idea of having this distributed among all corp's R&Ds. Thousands of man-hours and fuck-ups that could have be saved.
We took off to Asia to one of the corp's manufacturing plants to demonstrate our "customization silver bullet". This was the time I understood how both, corporations and asian corporations work. If you have a hierarchy of at least ten levels above your avatar in the company chart, the chance of getting „Your brilliant idea" through is close to nothing. Consider this: if there's 80% chance that the next man or woman in charge (woman? in Asian corp, as a manager, riiiiight) will push your idea upwards, and you have 10 "levels" to go through, that gives you 10% chance. And the 80% filter is very generous.
And there's a subject of the cult of work people in the East have. We were trying to push a tool that made some people’s daily activities obsolete. Not that they could get fired - there's always something to do for someone that knows their way around the code. We bounced off the wall of conservative way the business should be done.
This was the first sign that working for corpo might be not for me.
For the 5 years I was a ball in this management pinball machine, being technical leader, technical trainer, even a small unit manager, after which I abdicated. I liked that. I had a chance to learn new tricks, I've been responsible for some research products. I shared my knowledge with fellow engineers, I travelled a lot. Shedload of fun... until I realised that my love for the code was being suffocated every day. That me and my team followed company standards instead of having proper software engineering virtues. After my craving for the proper engineering reached its limit I resigned from all duties other than programming. At least that was what I thought. As the company and our shop grew in numbers, the expertise of the newly recruited people plummeted. The most capable developers were the interns. Ridiculous. I had to leave. Fast.
Remember the guy behind that tried solving customization chore in megacorp? In the time I was training my patience, he had already left. To Linaro, then switched to Canonical. When I was back on the market, he has already been working from home for a few years. The idea of working from home, writing open-source programs, for a company that I really respected sounded like a dream come true. My only concern was a typical "Am I good enough"?
The recruitment was smooth (although I was late for one of the sessions as I couldn't get my stupid head around timezones properly). I got the job.
First weeks were eye-opening. I identified dozens of problems that inhibited any sort of good work from me. I identified the following:
On the other side I loved:
After almost one year in I consider most of the fears defeated, or at least they are not affecting my work as much as they used to.
I learnt a few things along the way as well. The most important is the respect for the job you do. Once you're measured by the code you do instead of how well (or how long) you can sit in a software engineering chair, you start to respect more the work you do. The fact that the code will be available to the general public to read, review or branch off, doubles the emotions.
The thing with the time management is a bit more difficult. You have to define a set of rules and stick to them. If you don't, every hour in 'your working hours' will be spent on both: work and private matters. Then, after ~10 hours you will have no idea which colors to paint your time pie chart. You end up thinking that you didn't spend enough time on the job, so you either: get back to code, or feel bad for the rest of the day. Having good time regime is a must. It don't mean that spending a whole day devoured by your work is a bad thing, on the contrary, it's a superb feeling of uber-satisfaction. However, it cannot serve as a bandaid for a poor time management. On the other hand, working from home and not having strict working hours is a perk. Use it! Many things, when scheduled at the working hours of the 'normal people' are of better quality, are cheaper and often take less time. Medical appointments take so much less time, karting training is cheaper and you train on near-empty track, and driving anywhere becomes a pleasure. Oh, and you're into cooking then you're for a treat... Remember all the slow-cooked dishes that you always scheduled for weekends? Well, now you can have a Wednesday roast... Omnomnom.
There's also the thing with your tools - both hardware and software.
In my case I'm responsible for obtaining and maintaining the machines I’m working on, so it's completely up to me how it's configured. And that’s perfect. I found that many big companies don't understand how this affects programmers performance. How frustrated one might become when hdd drums and hums after simple recursive grep invocation, blocking other tasks at hand. And AFAIK many companies still don't give their engineers SSD equipped machines. Morons.
And that’s how we get to improving our software environment. If you craft a simple script that shaves off 1 minute of every iteration you save YOUR time, which in turn you reforge into your employer's time, since you're a good sport. And because you're improving the environment you're the master admin of, there's no one stopping you from deploying that. This lets your creativity breathe. Even if it means burping like a dog after two cans of turbo-beans.
I really enjoy working from home. I love this job and I loved the previous one... For a completely different set of reasons. Home office requires investing a few skill points in the willpower, but the benefits are definitely worth it. If you're playing it safe and you worry about stability issues that often come with the territory, then think about how easy it is to get another offer. So go for it!