Conservatism

There are many implicits about being a geek (at least to others), and as such there are a few we just love to foster: we are savvy, we are on the edge, we see the world in a different way…

I must admit, one of the reasons why I went into computer science is because it’s such a broad field to explore. We are the new explorers, discoverers, inventors. Being a freelancer is one more step in that direction: freeing myself from the shackles of other people’s decisions, being a Captain Cook, rather than a Columbus.

And yet, every now and again, I take a conservative stance that horrifies me afterwards. And very often, I have to face it in others.

Look. The code you wrote 10 years ago, and that was such a breakthrough, is crap, by today’s standards. Even if it’s only 5 years old. Even if it’s one year old. Let’s be honest here, if you had to rewrite it today, you’d do so much better. And I’m not saying reusability is bad, just that this critical part of the thinking has to be somewhere in the decision as to how to do things.

And it’s hard. Something we do quite naturally when we have to start something over is completely overlooked when it’s about changing something.

Let’s take a detour. When I had to come up with a training regimen with my heavy staff, I took everything into account: my work schedule, my then-girlfriend schedule, the days I wanted to keep free for other things, and so many other variables. I pondered about it, talked about it, and made my decision.

Fast forward 5 years, my training regimen is shot to hell. The girlfriend has gone, my customers are geographically far from each other, which forced me to get a car, I don’t necessarily hang out with the same people, so the days I would like to be free have changed. Yet, instead of changing my schedule, I work around it. And as a result, I don’t train well, because I skip, I shorten the session, I feel guilty, so I schedule a new one that’s longer. It is a mess.

For code writing, it’s exactly the same. Some ways we do things are highly subjective. We take a decision, because at that point in time, it feels like the best possible decision. A few years later, when the time comes to reuse something, more often than not, we don’t even think that part or all of these subjective choices could, maybe, you know, change.

If it ain’t broken, don’t fix it.

Well, maybe not. We don’t start from the ground up every single time, that’s obvious we would go nowhere, and really fast. We need to be able to build on top of something. But why not take a few minutes to at least think about it?

They say we are hard-wired for habits. Once something is labeled good, it’s so hard to resist the temptation. And if it’s bad, it’s even harder to go back to that place again.

That code you’ve spent a month writing, that cost you so many sleepless nights, and so much pressure? No way you’re going to stick a finger in that hornets nest again! And dude, it’s soooo easy to use that code now that it’s been debugged and honed. So, this gets us coming and going.

So what if it doesn’t do exactly what I need today? I’ll just use a workaround. And another one. A year from now, the amount of workarounds exceeds the number of genuine uses, but hey, it still works, right?

Now someone else has to use it. So I’ll just hide the most glaring problems under the rug, make it look like it’s been designed that way at the beginning. After all, it still works right? Ok, ok, to make it sweeter, I’ll add a couple of freebies in there that look really cool, how’s that?

A year later, I have completely forgotten why the workarounds are there. It still is kinda good, anyway. I’ll rewrite it from the ground up someday, I know I will. Just not today, because today I don’t have time. Only now, this piece of code is in use in a dozen other projects, so if I rewrite it, I’ll have to update them all. Another reason why I’ll do that retooling when I have plenty of time.

Except it’s now another year, and it just doesn’t work anymore. There still no time, but now I have to fix it. And yuck, man. That piece of code is utterly crappy. How in hell could I think this was genius? I don’t even understand how half of it works. Wait! I thought I fixed that bug years ago! Maybe in another version? So I look over all my backups and compare them. Maybe by adding together all the changes I’ve made for this or that project, I’ll end up with a workable solution? Right? Done it once, can do it again.

A month later, defeated, I rewrite the hundred or so lines of code that should be working. And you know what? It works so much much better now. Maybe I should package it for reuse? The way it is now is just bloody genius!

That’s why it’s called a revolution: it just goes around and around. What if being lazy was to stop and think about the why every now and then?

  

Like Herding Cats

As you have noticed, it’s been a while since I wrote anything here. I was kept busy with the Mac App Store release of Highlight, trying to get the podcast flying, and plowing on with my main job as a developer-for-hire, which certainly keeps me busy. I’ll try and post about things that can come in handy for the developers out there who (still) read this blog later…

But this post is about the way being endlessly sidetracked can ruin your career, which by the way is your life, when you’re an indie developer.

As stated before, there are the things you want to do, the things you’d like to do and the things you have to do. It’s easy to forget about the last part when you’re busy as hell, but they tend to remind you they still exist. Administrative stuff. “Being there” at a meeting. And with no boss, or administrative person taking care of your schedule, it’s up to you to get organized. Especially when things tend to get overwhelming.

For the past 3-4 weeks, my daily routine (including week ends) has been something like:

  • 7am-10am: administrative stuff an emails
  • 10am-1pm: urgent coding
  • 1pm-1:30pm: eating
  • 1:30pm-2pm (if time allows): nap
  • 2pm-2:30pm: emails
  • 2:30pm-7pm: urgent coding and/or meetings
  • 7pm-8pm: either pause or eating
  • 8pm-9pm: personal correspondence
  • 9pm-11pm: coding
  • 11pm-midnight: reviewing the day / planning the next day
  • midnight-3am: coding and/or experimenting with potential solutions to my day problems and/or reading about potential solutions or interesting stuff
  • 3am: nap

Now, I don’t recommend that daily schedule to anyone, but it got me thinking: one of the reasons why I am independent is because I don’t like routine. Being at my desk from 9 to 6, every day, whatever the load, and whatever I have to do isn’t something I crave. But this schedule, some might call it a routine as well, is essential. If you don’t stick to a certain form of timetable, procrastination and distractions tend to creep up. Then disaster is around the corner.

I guess what I’m saying is that, boss or no boss, organization is key. Of course, it doesn’t need to be inflexible, in fact an indie developer’s greatest asset is his or her flexibility. But there is a difference between having a somewhat loose dance card, and being there at the ball.

The reason why most developer want to go indie (at least the ones I talked to at the Objective Cologne conference) is to get free of all the “absurd” constraints and routines, but by flying solo, you still have to find one that fits you. There’s a rhythm to everything.

  

The Cat Is Out Of The Bag

Amidst a ton of work that partially explains my silence here, I’m glad to report that Dam, Marc and I launched the Astrolab, a podcast (in french) about geek stuff.

We hope to have two episodes out a month initially, and we’ll see where it takes us. Please, listen and give us feedback, we do want to get better at it!

Astrolab podcast (in French)

Cheers!

  

Who-What-When-Why

Now that I’m almost done with my despaghettification, and for reasons that will become obvious as you read on, I’m kind of wondering about teamwork.

I’ve had good and bad relationships, projects that made it through despite the huge odds (think “organizing events”) or projects that went down the drain pretty fast for unforeseen reasons. I think that despite the common asocial image associated with computer geeks, working with unforgiving machines makes us highly sensitive in some areas of human relationships. To wit, we have to follow a clear set of rules all day long, and it can be really hard to have an interaction in which the rules change constantly, or aren’t completely explainable. I think that deeply ingrained in our daily life is the assumption that given enough time and “debugging”, everything’s 100% understandable.

Most “normal” people, as some of my friends will call them, don’t think like that. They keep adding stuff to the rulebook, such as “when someone higher up in the hierarchy calls, I pick up the phone, no matter what”, or “you don’t say to your spouse that you’d like to go out with your buddies because you want a taste of normalcy once in a while”. True, it’s a primitive form of trial and error-by-being-punished, but they are stupid rules that should be replaced by more generic and sensible ones. You pick up the phone because they have some business with you (but should still be ready to say “Look I have work to do, can I call you back?”), or you behave in such a way that it is normal to spend some time apart from your spouse, and just as normal as it is to spend some time with him/her. Basically, you don’t spring up a new rule on somebody else because you don’t like them sprung on you.

Back to teamwork, I find it hard to work with people who have a different set of rules than mine, especially when we are trying to build something together. I’ve been kind of documenting this for a long while and am curious as to what you guys think about it.

To me, doing a task can always be resumed in a sentence such as this:

This person wants me to do this Nth step like this because of that

And in my decade or so of working, I’ve seen various people focus primarily on this or that part of the sentence. I find I have a better personal relationship with people who share my focus, but can work with them more easily if I “get” what their focus is. If I don’t understand what they are leaning towards, it’s a one-way ticket to hell.

Who

For obvious reasons, who’s doing the asking matters a lot. As a somewhat social species, we don’t feel like putting the same effort into a task for a personal friend or a complete stranger. It is unequivocally true in personal relationships (hence the word personal), but in professional tasks, the who is the gatekeeper, and should not be some kind of thermostat.

If your boss asks you do do something, and you agreed to do it, then it has no more value than if it’s a friend who does the asking, in my mind. The who deals with the accepting the task, not the realization of it.

When I have to deal with co-workers to whom the person doing the asking defines the whole of the effort put into the task, I shiver. Yes, this person is your biggest customer. Yes this person is your boss and could reassign you to toilet duty. Yes this client is the cutest person on Earth. But you have agreed to other tasks as well. It actually serves the relationship to state you’ll do your task the way you think is better, rather than the way this person thinks it should be done.

What

Each and every one of us has things they like doing, and things they hate doing. We tend to procrastinate on things we don’t like to do and perform admirably on things we love. And everything in between, mileage may vary. Same thing as the who, it’s natural and literally built-in our genes. We learn through painful mistakes not to put our fingers in the flames. It gives us most of the “one shot rules” I was talking about earlier.

But the thing is, it’s like the who of the previous section. It acts as a filter for accepting the task or not. Once you agreed to perform the task… well, it has to be done.

One of the people who was supposed to “help me” (aka “do it for me”) with my accounting and stuff was exactly like that. Give him a book on his favorite topic or strike a conversation about it, and absolutely no other work would be getting done. And I know I have myself that tendency that I try to overrule all the time: I like debugging and optimizing and looking at the tiny teenie details, rather than cutting up the PSDs to size. But hey, I accepted the task.

When

Each task has a history, and has a place in a process. Being a developer, most of the tasks I get assigned are the end-of-chain kind. There’s a reason why this tasks occurs now, has to be done by that time and is worded or constrained the way it is.

But rehashing about the timeline over and over and over again bores me. If I have to plug this into that, I do’t really care about all the steps that led to this particular form factor. I mean, I do care about it, but it’s a matter of perspective. I care about it to understand how to perform better, but if it’s not relevant, or I don’t have much latitude in my task, then… why bother.

Why

As you probably guessed by now, that’s what makes me tick, and it does make me tick a little bit too much sometimes. I want to understand why it works or should work in the way it does, because it makes me feel like I’ll write less code, or write code that will integrate better in the grand scheme of things.

The main trouble with focusing on that part of the task is that progress comes in discreet steps. There’s an inordinate amount of analysis and thought that goes in it before a step is taken, then another kind of long pause, etc… It can be hugely frustrating for people who work with me because they’d see nothing moving till all the pieces fit together, and then it all works, as if by magic. And even though I’d be able to explain in great details why I did things that way, we rarely have time for it. So it stays “a kind of magic” that was long-ish to come, and works in mysterious ways.

Kind of conclusion

Being a developer means interacting all day long with an alien way of doing things, and we’re kind of stuck between “regular” humans and unforgiving computers. That means that the human interaction part of work will mostly be evaluated in a similar way: how should I say/write this (syntax), so that the other person (compiler) does what I’d like them to (algorithm). Man, that sounds so nerdy, but I genuinely think that it’s somewhere deep in most work-related conversations I’ve had over the years.

And so, based on that experience and these thoughts, I realized that it takes quite a huge effort to find out what makes other people tick, but once it’s understood, it makes every interaction a whole lot easier. But if the focus keeps changing, the amount of time spent finding out the right “syntax” to talk with somebody about what has to be done becomes too long to be a useful use of time. That’s why some of my co-workers feel they can’t delegate and can’t rely on anyone to help them.

So my advice to anyone dealing with what seems to be an introverted geek, is to find out which part they are more used to dealing with (because they were educated that way or just like it) and make sure your translator is on!

  

Popularity Contest

A lot’s happened recently, triggering a lot of discussions as to who we are perceived to be.

As I was thinking about social networks, I also took some time to upgrade this website’s log analyzer. I have switched to Piwik, for various reasons:

  • it’s not too heavy on resources
  • it’s capable of loading statistics offline (I don’t want to have something that loads yet another resource)
  • it supports DoNotTrack, which means that I’ll see users only if their DoNotTrack flag is off

Of course, that last feature kind of removes some of the information, but to be honest, I don’t really care about who the visitors are personally, I just want to detect trends, and see if anything stands out.

Thing is, I started wondering about why I was looking at these things only after it was working properly. It’s not like I have a lot of visits anyway, and my work doesn’t really depend on that number. So why are these stats interesting?

Ego Trip

When you write something that gets published, there’s an obvious satisfaction at seeing it being read. And an even bigger satisfaction for me at seeing it re-read over the following months.

A few weeks ago, I read about the whole “echo” business (generating hits/visits just by having linklist-type blogs, which feed off each other). Can’t say I’m surprised that it’s common practice, and will continue to do so as long as advertisement revenue is indexed by the number of hits/visits the page gets. However you look at it, that’s one of the few statistical analysis that’s objective, and therefore can be automated. Besides, what ad-selers want is to bee seen as often as possible, and page hits give you that exact metric.

It’s a flawed way of looking at a readership, but unfortunately the only one that’s available.

Another ego factor is seeing what websites send their readers to you. Apart from generating some traffic, some of the referer’s reputation transfers back to you (if it’s a positive link, of course, not if it’s a this guy is a moron kind of link… and even then, it potentially is interesting if your point is thought to be good, even if he original link disagrees).

Feedback

This blog is about various things… This post is a more general kind of reflection, whereas there are more math or computer oriented contents. Seeing which posts or pages are generating the most traffic gives me some data points on what I’m potentially good at, or what I do that might interest people.

I’ll stop the wondering that this statement might incur by saying that the more general kind of post generates about 1/4 of what the tech/code ones do. And on the rest of the site, the vast majority is taken by customer-specific sections of the site.

Most people who come and read this know where to go, they don’t really find me by accident. And most of them come back for the same reasons.

Conclusions

So why should I care about statistics, if I pretty much know already who comes and reads what is written here? Popularity has never been my priority, and is beyond my reach anyhow, although I do prepare my coffee in a fussy way, and have a clicky keyboard ( look it up, some people said it works ;) )

It may be as simple as “I like crunching numbers“, or that I have a lot of fun seeing which search strings led to this site.

It may be because I want to keep track of which pages or posts are more popular, in order to update them as they become obsolete.

But in the end, I think it’s just a geeky thing to do: making sure I know how the things I do are acquired/read, in order to try and deduce the way they are used.

Anyways…

Anyway, to anyone who happens to be reading this (either on a regular basis or not), thank you! The ultimate goal of publishing something is to have it be read. And that’s all there is to it.

  

Twitter, AppNet, and Other Social Thingummies

I became a backer of AppNet as soon as I became aware of it. I love the twitter concept of micro-blogging, and use it a lot. And I’d rather pay some money to have it working rather than a shady ads/user-data selling/unknown revenue stream for the parent company. That’s the short reason for it, and it’s more a matter of principles than anything else.

That being said, when a new service comes to life, especially backed by developers, the first weeks/months are incredibly exciting. It feels like every discussion is interesting, every feature request gets implemented, and that you’re part of something that’s taking off the ground.

But some discussions led to some critical thinking on my part. One in particular that ended up with “… so app.net is like twitter but not free, right? And there’s far less people on it, right? So why bother?”

Let’s pretend for a minute that it’s as simple as that, and reduce the question to “why bother being on a Twitter-like service anyway?”

When I started using the service in 2007, there were mostly techies and geeks on it. At the time, I heard it described as “the virtual office”: some place where all the people in your field were sharing thoughts, ideas, rants… And it’s true that it is something akin to conversations you overhear from your desk and can join in if you feel like it.

But there’s still a lot of noise on twitter. I’m not saying that other people shouldn’t talk about their cats or rant about the neighbor playing his bagpipes too loudly. There are ways to filter out these things.

What got me thinking is “how is it social”? Like 90% of twitter users out there, my list of followers contains in a vast majority people I actually know. And my following list contains usually them plus a few people I don’t know, but of whom I respect the work or the thoughts they tweet. If someone I follow says something that’s worth sharing, I will re-tweet it to my list of followers (I might as well say “friends”). But since I have most of my friends’ contact information, what’s the difference between that and mass-mailing them? Ease of use, and that’s about it. Technically, it’s the same thing.

But for the twitter heavyweights, it’s not the case. Twitter isn’t about talking and sharing with your friends, but with actual followers. It’s a news service, with the added twist that anyone can comment (@reply…) on whatever it written. Most of the time, when you @reply a heavyweight, he/she won’t reply back to you. That’s normal: they have potentially 250k replies to their tweet, they choose to reply only to the most pertinent ones if they have time to read them all, or the ones by their actual friends.

Let’s set that aspect aside, because it is human nature and quite understandable, to boot. Quite frankly, I wouldn’t want to have 10k followers, it would give me a responsibility about what I say that would detract me from my actual pleasures in life. But it’s “social”, which means that somehow, it should allow me to participate in a conversation with people I actually don’t know about something that interests me, or to “meet” (always a complicated word in our world) new people I have a kinship of sorts with.

To understand the somewhat foggy point of this post, let me state that I’m a dinosaur. I met most of the people I actually considered (and in some case still consider) my friends on the internet at the turn of the last century. It was done through newsgroups and IRC. The entry point to these worlds is the topic. You joined a newsgroup or a channel based on what you assumed was talked about within. The actual people that were discussing things sometimes were famous, in their respective fields anyhow, but anyone could post things that would be read by everyone and replied to or ignored based on content. True, it left the door wide open for flame wars and spamming, but hey, there are downsides to everything, right?

Then at the beginning of my professional life, I met most of the people I now like and/or trust at conferences, big and small. Sometimes I worked with them. Sometimes we just happened to be at the same place at the same time, and struck a conversation. And sometimes we kept in touch. But the beauty of it has always been how easy it is to engage the first contact.

Back to Twitter/AppNet.

The biggest question to my mind is how you find someone you’d like to “follow”, and how easy that first contact actually is.

Today, there’s a handful of us on AppNet, so it’s rather easy. Everyone is ecstatic, pioneer and all that, so the entry barrier is not high to “just say hello”, or to actually interject in someone else’s conversation. After all, we’re all part of something grand, so there can’t be that many people you’ll end up regretting having a conversation with.

When the service hits its stride (or with twitter), it’s going to be much much harder.

So, how do I find someone interesting?

Today, with twitter, there are basically three ways to find someone. You either know the person (through their website, or talk, or personally), find their handle, and click follow. Same applies on AppNet. The second most popular is to see someone you follow talk with someone you don’t follow, and decide to follow the second person as well. And then there’s the somewhat shaky “I saw a clever thing said in the global feed, and I decided to follow this fella”. Given the number of messages per minute, let’s say the chance of finding a random interesting person like that is low.

So let’s pretend I want to find an iOS developer who speaks Russian and has interesting stuff to say. How would I go about it?

Searching for “russian developer” is out: it will give me all the people who have either russian or developer in their name or bio. And even if it were russian AND developer, it would still yield “incorrect” results. If I went the google way, it would be the same problem. I’d have to sift through thousands of hits. Kind of defeats the “let’s get to know some new person” vibe.

With a swiss guy on AppNet, I tried to think about that particular aspect more, and refined my inkling of an idea of tags. Tagging a person with intelligent keywords would be swell. It’d have to be multilingual, obviously, and have some kind of loose-link between keywords. Ideally, if I’m looking for the tag russian, it should come up with all its translations, but also all it’s implied relations. For instance, a guy who lives in Moscow but wasn’t tagged “russian” should come up.

So that’s one feature I’d like on AppNet. Next up!

Let’s pretend we have a way of finding a dozen match on a somewhat decent set of critera. Who’s “interesting”?

The twitter metric is threefold: the number of followers, the number of posts, and the number of people who think these posts are interesting (manually flagging them as “favorites”). Out of these three, if I’m looking for new people to interact with, only the third one is relevant. A person with 10k followers is less likely to have a chat with me out of the blue, but that shouldn’t prevent me from contacting them. And someone with 10k followers isn’t more social than anybody else, I think. They just happen to be famous, usually for reasons outside of Twitter. So that doesn’t help me decide. Someone who posts every 10 minutes might be someone who likes to chat or some kind of news junkie. It doesn’t factor in my decision either. The third one is more interesting and accurate, provided your level of trust in the general population is high. If you think that most people are real people who flag a post as a favorite because they genuinely liked it, you’re almost out of the woods.

So by default, having a first-glance measure of the number of “favorited” posts, or re-posted posts (which is the same thing, basically) seems like a good idea. Obviously, if the level of trust in the general population goes lower, it would be a good second-glance measurement to have the same statistics, but from people not too distant from you. Arbitrarily, I’d say 2 levels of follow would provide a good enough coverage, but I might be wrong. We could probably have something that lets me parametrize this, but “who in the people I follow and the people they follow says the things that are most shared” would be a good filter for me.

So that feature too makes a lot of sense, especially if the average quality of the people on the platform is good. Number two feature I’d like to see in that new social network project.

But the real question is “what do we expect of a Twitter competitor?”

Right now, the consensus is leaning towards “it has to do everything Twitter does, but with a clearer business model, and less shady business practices”. Which I think we all agree is the minimum requirement.

But I personally have higher expectations. I’d like to have my “virtual office”, and I’d like to randomly or willingly bump into interesting people I wish to have that casual and loose relationship with, be they famous or not. That’s what I’m investing in.