Why use XMPP: native clients vs generic IM alternatives

XMPP, the eXtensible Messaging and Presence Protocol (translation: open IM) rocks. It has a rich feature set. It's well designed. And as a bit of a security nut I especially like that it supports strong encryption and uses a decentralized, federated protocol like e-mail. Anyone can install their own Jabber server (like TurnKey ejabberd). That way private conversations within your domain never leave the security of a server under your direct control. Just like e-mail.

Less is more and the magic number is four

Remember this posts title. It not only rhymes. It's the law!

Sometimes the truth is a bit counterintuitive. Conventional thinking is that more is better. More features. More choices. More options. More is more right?

When we first tried redesigning the Hub's front page we made this mistake. We were so proud of all the big and small features that made the Hub easy to use we listed all of them. As a big wall of text no less. In retrospect I don't know what we were thinking.

Blog Tags: 

My last Perl program - a Perl obfuscater that can eat its own tail

OK, I admit it. I used to program in Perl. And I liked it! My Perl programs were terse. If I could shave a line off, I did. In fact, I spent a non-trivial amount of time figuring the shortest possible programs that solved various problems. Often that meant resorting to various tricks and arcane features of Perl that nobody other than me would bother to understand. I took pride in that.

Python optimization principles and methodology

Methodology

The basic methodology for optimization:

  1. Discover where you program is spending its time (hotspots vs coolspots)

    A good way to get an overview is to use the Python profiler. The Python profile will usually be included in Python's standard library:

4 simple software optimization tips

1) Always be experimenting!

Trying to squeeze out more performance out of your program? Don't be afraid to experiment!

In practice what that means is you setup small, simple throwaway experiments to establish how things work when you're not absolutely sure you fully understand something such (e.g., how many times a second a certain function can be invoked, how the profiler measures blocking IO or the time it takes a sub-program to complete).