That said, I enjoy how he so poignantly describes coding as antisocial at its core. With people, you need to make compromises and concessions all the time. Code on the other hand has no feelings, and deserves no pity. Maybe this is why so many programmers struggle with being social.
I feel like there is a message about work/life balance in there. Or rather, code/empathy balance. Can you realdily switch between ruthless coding mode and caring people mode? How do you deal with that contrast?
"As (odd?) as that may be, being around other people seems to really drain my energy and sap my creativeness. Despite my best efforts, I just don't have the same energy around other people as I do by myself."
That's the real definition of introversion. It's not just being shy. Some people feel energetic when they work with other people in a bullpen (extroverts).
There was an Atlantic article posted here that explained more. http://news.ycombinator.com/item?id=561311
1. You are a superhuman with Buddha-like concentration.
2. You're lying.
3. You're doing trivial work.
However, it's a major problem if the OP goes out of his way to avoid communicating with people after his work session. In that case, none of the work he did has value. Code that other people can't understand is worse than no code at all.
There is a time for work and a time for communicating your work to other people. You cannot do both at the same time.
The post is describing what works for him. While in the midst of something, mails, random greetings, IM pings are extremely irritating. When I was at my day job, I always had my headphones to cut myself from the open cube farm.
When you are working on something, apart from the required inputs and division of responsibility, it isn't a group activity. If you find it antisocial, well, that's how it is.
Programming isn't alone in that regard. Think sculpting, painting, theorem proving, creating music etc. All of these activities can, and are generally done as a team, but the individual's work is his own.
> I invariably have more fun and I am more productive and creative when working with other people.
I am curious. How else you suggest you go about programming?
> Maybe this is why so many programmers struggle with being social.
Since your premise was lone wolf nature of coding, I presume you will be making the same conclusions about sculpting and painting? I don't think you have a valid inference here.
> I feel like there is a message about work/life balance in there
It's simple - when you are working, you aren't free to take long and/or frequent calls from family/friends; or go fetch grocery even if you are working from home. When you are at home, unless it's a serious outage, you don't take unnecessary calls relating to work.
This, of course, is good advice, and fits well to any sort of individual endeavor, being programming, painting, or wrenching on your bike.
I think many people react negatively to articles like this one because they read it as prescriptive (that is, this is how you _should_ work as a programmer) rather than _descriptive_ (that is, this is what works for me as a programmer, taking into account my character).
Generally, I work best at home, free of distractions, but there are times when collaborative work at the office is also productive. YMMV.
Treating people like computers/code means you are a sociopath, and treating code like people means you won't get it to do anything. Code needs control, not empathy.
We programmers are stuck in the middle, pulled by either extreme.
I wonder if we will bridge that gap in the 21th century (and how?). To me, it is a much more worthy goal then "making the damn things even faster and smaller" (but, see also my reply here: https://news.ycombinator.com/item?id=3474387).
For instance, in both my professional and personal life, the most successful projects I've worked on with others have been those in which communication was primarily done through pull requests on Github, or IRC conversations late at night.
Maybe it is antisocial, but I just can't seem to function as well working in person with other people as I do on my own.
What sort of stuff do you do better around others? I'm genuinely interested.
Most of the time I don't have a particular need for a development environment, but I have a phobia about being stranded somewhere without my tools. My mobile phone has 3 programming languages, their manuals and other cheat-sheets. It also has as many advanced calculators, solvers & graphic visualization utilities.
To me it's a mix of arms race & addiction. I hack because I crave it. I feel inadequate if I don't know how something works.
Most of my work is snippets. I usually store it in a file with a long descriptive name, for later finding & greping. I have had a ~/hacks directory in all my machines for the last 12 years or so.
1. Open terminal, `mkdir <project name> && cd <project name>`
2. Spend way too much time thinking of what language to use.
3. Spend way too much time thinking of how I should implement it.
4. Start coding.
5. Get bored and have new idea.
6. Go to step 1.
I think I need to work on actually finishing my projects and spending less time with thinking.
Personally, I have a lot of 80-90% "finished" projects that are available for people to use. This is usually enough. If someone is really using them, I might be motivated to finish everything on my todo list. But otherwise, something else would interest me more than checking off some imaginary todo list.
I see your point about learning and agree with it, but I don't think that in starting something is more value than in finishing it.
Starting is pretty easy, because new things are always more interesting. It's getting hard when the interest vanishes. That's the challenge of finishing something, that you can overcome this stage. Otherwise you will never produce something remarkable, but just jump from something interesting to the next.
For me, jumping from one to next thing just isn't satisfying, it's aimless, just following your desires without any direction.
Usually, with some small effort, I confirm that most of the ideas are, in fact, dumb. I'll stop development right there. But every once in long a while, the idea still sounds like a good one and it still keeps calling me to continue working on it. Those are the ones I will take to "completion."
It is good to finish things sometimes, but if you find yourself lacking the motivation to finish a project, there is a good chance that it isn't worth finishing. At least in my experience, when you are on to something valuable, you'll naturally be drawn back to it.
I would have added a variation though, swap the first two.
1. read about a new language|framework
2. open terminal > I think I need to work on actually finishing my projects
I've wondered before - why do I get ashamed of sandboxing? I decided it was because projects were accumulating in my 'project' directory, creating noise about things that would never be complete.But it doesn't have to be like this! When you stop thinking of them as projects, no need for guilt.
I've built a tool to make it easier to manage your data and encourage sandboxing rather than projects. It's stupidly simple but changed the way I work:
http://trogrd.tumblr.com/post/15130555126/saga
If the post doesn't explain it, you could try this: get it; create $HOME/saga. Then running something like "saga my test directory" a couple of times, and have a look at what it's creating in $HOME/saga until it's self-explanatory.I'm not one to advocate Performance enhancing drugs, but I've discovered that taking a 5 Hr energy around 11 am really helps me concentrate the rest of the day, especially when I'm learning new things.
Every programmer has their own style, but the one thing I disagree with the OP is programming in a complete vacuum. I agree that programming by yourself really helps in terms of getting rid of your distractions.
But the one thing I miss is sitting around and talking about problems with other programmers. I've found throughout my career that when I stuck on a particular bug or issue, as soon as I try to talk it out with another programmer, the answer comes pretty quickly. The physical act of trying to explain the situation seems to force you to take a different pathway in your brain that gives you another perspective that you might have been otherwise stuck on if you just say there thinking about it.
Given that current tools are not advanced enough to properly merge these kinds of changes, you end up learning not to mess with whitespace/indentation (at least not commit these changes) because it will generate spurious conflicts.
Bad indentation make bugs slightly more likely. Conflicts make bugs much more likely. It's a sad tradeoff to have, but until our tools mature, this is the case.
This has greatly increased my coding efficiency as I am not distracted with being constantly connected to the world. I code "ruthlessly" during the time and when it is time for a break, I head over to my local coffee shop for some free wi-fi and a refreshing macchiato. For emergencies I always have my iPhone connection over 3G. Not only am I less distracted and more efficient, but I'm saving money (cost of coffee < cost of internet) and I find my life to be more balanced.
To me it's literally like cleaning a workbench. Every good craftsman learns that in his education, yet somehow as a software guys these basic principles have never been taught to me.
It's a great article and a quick and good read. thanks for sharing.
In a certain way I miss the early days when the thrill was just having something work, despite being ugly on the inside. Nowadays I'm constantly refactoring code to make it more elegant, extensible, and maintainable.
I often go back to an interview with Charles Eames, he's talking about Industrial Design, but it applies perfectly to software design:
Is design ephemeral?
__
Some needs are ephemeral.
Most designs are ephemeral.
Ought it to tend towards the
ephemeral or towards permanence?
__
Those needs and designs that have
a more universal quality will tend toward permanence.
http://blog.gentry.io/eames-design-is-a-method-of-actionI constantly try to keep perspective of my work in terms of who needs to maintain it, how often it needs to be maintained, and its lifetime. When I think about it in these terms, then I can keep on being crappy but productive.
I start the timer and for 25 mins you just can't reach me, no skype, no gmail, no twitter.