Category Archives: Uncategorized

A Revolutionion in Computing?

A few months back, I saw a presentation that has kept me thinking ever since. Nicholas Negroponte is currently in the completing phases of a project I think might revolutionize the world. The $100 laptop project, or, as it is known now: One Laptop Per Child (OLTP). The idea behind the One Laptop Per Child project is to create a computer that can be given to every child in developing countries. In order to do this, the computer has several innovations to overcome the limitations of its environment. There is little or no power available, so the computer has to consume dramatically less power than what is common, and it accessories will provide hand power, like a crank or a foot-pedal. Network capabilities will be weak, so the computer has spearheaded innovations within grid wireless networking. The size and ergonomics has to be adapter for children, but the computer will probably also be used as TVs by the whole family.

There are a few interesting sides to this. First: Prices for off-shoring to India have been increasing, and it has been years since the first time I first heard of Indian development sub-contracting with Chinese. India and China will probably have a limited lifespan as source of highly qualified inexpensive labor. But imagine a generation in Africa having grown up with access to good computers and the internet. In ten years, I think that’s where the off-shoring will go. That’s, of course, extremely good news for Africa.

Second, the computer is really cool. It is ultra-portable, Linux based, low-power, super-networked and in-expensive. Rumors are that non-third-worlders can buy one for the price of two – the difference will sponsor the laptop of a third-world child. I can hardly wait until they become available!

Now, to see an inspiring talk and vision, you can watch Nicholas Negroponte’s talk about the One Laptop Per Child project.

Posted in Uncategorized | 2 Comments

Words fail me

“I really wish you’d stop using that word – I don’t think it means what you think it means.” (The Princess Bride – of course)

When my wife asked “are you a feminist,” I realized I don’t like words very much. To some people, “feminism” means women who dress like men, think pornography is destroying society and that all men are inherently evil. You know the type I’m talking about. To many others, including my wife, a “feminism” is “the radical notion that women are people”. I wish people stopped using the word “feminist”.

In an online debate, my brother called me a “utilitarist” (man, I can’t even spell the word). In his opinion, that is not a good thing to be – “utilitarianism” will “create a cold and heartless society”. I don’t know if I am a utilitarianist (or any kind of -ist), but I think a good society is one where people are happy and fullfilled – is that utility? A cold and heartless society is probably not a very successfull archievement from this point of view. I wish people stopped using the word “utilitarist” (if that is indeed how it is spelled).

Words, especially those naming complex ideas like “feminism”, “utilitarianism”, “software architecture”, “services,” “liberal”, “conservative”, “ethical”, “agile development” are short cuts. The ideas they try and describe are complex, and the words mean different things to different people. This means that it very easy (and fun) to fight over the issues, because you can just assume that you opponent means, for example “service oriented architecture means that local calls should be exchanged with web services”. This is a really stupid thing to think, so you can rightfully criticize him for the view when he says that “SOA is a good strategy for designing systems.”

And if you’re going to make up new words, at least use words that sensible people would be able to disagree with. Like “myopic software development” (if I may toot my own horn). More on this later.

I don’t like big words, though. It’s hard enough to reach agreement when I’m talking about the same thing as those I speak to. It’s damn near impossible when we talk about different things.

(PS: I apologize for the long quiet period. Exhausting month)

Posted in Uncategorized | 2 Comments

Some words

Here are some of my favorite words.

Signs of danger

  • ‘Just’: bad word, as in “can’t we just develop the greatest application ever”, “can’t we just replace the database with JavaSpaces”, “can’t we just expose the functionality to the world as a web service”.
  • ‘Should’: bad word, as in “it shouldn’t take more than a few days to do that, should it,” “integrating two systems should be easy.” Listen for use of this word from people who … should know better.

Signs of thought

  • ‘Awkward’: good word as in “It’s awkward to talk to your boss (who has way more experience than you do) about teaching her agile programming.”
  • ‘Why’: good word, as in “why do you need to pass two parameters to this function?”, “why are we developing a login screen”, or “why did my change cause troubles for my colleague?”
Posted in Uncategorized | 2 Comments

Anti-spam measures

After I switched from Movable Type to WordPress as my blogging software, the comment spam problem has returned from the grave. So I’ve looked for good solutions for WordPress: I ended on a verbal CAPTCHA with a math question (which may also keep stupid commenters out – not that I have any of those, of course). I am considering some of the “fight-back” solutions out there too: Maybe returning a really big response really slowly when spam is detected, like Spammer Tar Pit.

If you have any experience or thoughts on the subject (or if my CAPTCHA is broken), please let me know.

Posted in Uncategorized | 16 Comments

Thinking outside the box

  • What is the next letter in this sequence: A E I. And this sequence: A B G D? How about this one: B C D G J?
  • A boy and his mother are in a horrible car accident. They are rushed to the hospital, but on the way, the mother dies. When they arrive at the hospital, the nurse exclaims: “But that is my son!”. How can that be?
  • You’re in the basement of a house. There are three light switches. Upstairs, there are three light bulbs. The door on the top of the stairs will lock shut behind you when you leave the basement. How will you determine which switch goes to which light?

These sort of puzzles are often presented as an exercise in “thinking outside the box”. However, if I were to “think outside the box”, I’d drill a hole in the ceiling of the basement so I could see the light bulbs. Clearly, that isn’t the intended solution, and most people wouldn’t think it would be a fair solution, either. The trick is to identify what “requirements” are real, and what requirements are imagined by the puzzle-solver.

When solving software problems, same technique applies. For example, my client for a chat application requested a link to the help information in the status bar. This would require some layout changes that I considered a little risky. Now, if I had suggested that the users didn’t need the help information, I would really be thinking outside the box. Instead, we ended up enabling privileged users to send URLs in a normal chat conversation, which was a piece of cake to implement. This way, the privileged users could help others with finding the rules. I consider this thinking inside a bigger box.

This is why I don’t care about thinking outside the box. Instead, look for the bigger box.

PS: Finding the bigger box is often easier if you work together. I spend an embarrassing amount of time trying to figure out the Petals Around the Rose puzzle. But when I sat down with my wife (who didn’t know it, either), we solved it in about 15 minutes (yeah, yeah, yeah, she solved it in about 10 minutes and only smiled cleverly until I got it 5 minutes later).

Posted in Uncategorized | 1 Comment

Consensus-based Decisions

In the book Software for Your Head, Jim McCarthy introduces The Core Protocols (pdf). Even though the book occasionally give off a new-agey feeling with ritualistic interaction, I think the Protocols have a lot of merit. I especially like “the decider protocol”

As I see it, the Decider protocol is a basic tool for consensus-based decisions. I think consensus as a tools in misunderstood and underutilized. It is easy to assume that basing decisions on consensus is a perfect way of spiraling off into meaningless discussions, but I think this is easily avoided. The thing is: The only thing that consensus means is that no-one feels strongly enough about a decision of the group to oppose it. If the intentions of each member of the group can be revealed quickly enough that one can avoid needless debate when there already is agreement, decisions can be made fairly quickly.

With the Decider protocol, it is all pretty easy: Anyone can veto a decision. This means that everyone will have to stand behind the decision once it has been made. If you cannot stand behind the decision, you will be asked “what will it take to get you in?” (the Resolution protocol).

In my experience, most of the time a comitee is extremely grateful for any well-formed proposal that is presented before it. The Decider protocol rewards making such proposals, while making it safe to protest unsound proposals. The Resolution protocol allows for the proposal to be improved to everyone’s satisfaction.

But if you are member of a consensus-based group – you better pay attention. You have your chance to veto, you have your chance to raise a counter-proposal. Unless you protest a proposal, you will be required to support it after it has been decided.

I have yet to see a full fledged “Decider protocol by email” description. For many groups, I think this could be very effective. A decider protocol for email would have to talk about how to deal with silence, how to set dead-lines for responses, and how to deal with Resolution. Do you have an idea about how to handle this? Leave a comment or send me an email.

Posted in Uncategorized | 4 Comments

Oh, wherefore art Y…

One of the most profound ideas in lambda calculus, is the Y-operator.
I’ve learned the Y-operator at least three times, and every time, I found
it extremely hard to understand. This blog is therefore an example of a
quixotic undertaking: I want to see whether it is possible for me to
explain the Y-operator so that you, gentle reader, can understand it
with minimal background. In this case, “minimal background” means
at least a few years of college level mathematics.

Background: Why Y?

The Y-operator is part of lambda calculus, a field of logic that
appeals to people who just couldn’t get enough of solving equations in
high-school mathematics. Lambda calculus is named after the “lambda”
operator, which stands for an “anonymous function”. It can be used to
syntactically (that is, mechanically) transform expressions. A short
example: “(lambda (x) (* x x))” is a method that takes one
argument (called x) and returns the square of the argument.
Here is how you use it:

The Y-operator is used to create recursive functions
using lambdas. That is, functions that call themselves. That is
its purpose. Y is defined as follows:

For this to work, F better be a function. Read it as follows:
“Y of a function F equals F applied to Y of F”.

An example: Factorial

As I said: This allows us to define recursive stuff using just
lambdas. To demonstrate, I will need a volunteer recursive function.
You over there: Factorial! could you step over here, please?

The factorial function is defined thus: The factorial of a number
n is the product of all natural numbers up to n. A way of
writing this in a fairly conventional syntax is:
fact(n) = (n == 1) ? 1 : (n * fact(n - 1)). Now, lets
do it without function definitions. Lets say we want to
find the factorial of 8. In lambda calculus we can write:

Holy lambda, Batman! That didn’t help much, did it? Well: here’s
the good thing: You don’t have to understand it. Using
what we learned about lambda, we can just blindly calculate it.
Lets see how it works.

Doing the math

Calculating the factorial for 8 will be a really long
exercise, so let’s settle for 2 instead. Here we go:

Substitute the definition of (Y F) = (F (Y F)):

Whoa, those parenteses are dizzying. Well, we can substitute for the
f in the first lambda:

Keep substituting for the outer lambda at all times. This time x = 2 (only for the outer lambda)

We now know the answer to the if (and I’ll expand (-1 2) => 1 as well):

We need to do another of those crazy Y expansions. It is not hard, just exchange the f
(I’ll skip one step this time):

Substitute the 1 for x in the outermost lambda:

If we had started with a larger number, we would’ve gotten a string of
(* 4 (* 3 (* 2.... built up from these transformations. But we’re
almost done: The if is true this time, so we can substitute:

The whole Y and lambda mess just evaporated. w00t! And the answer is
of course 2 which is correct.

What happened?

What the magic (Y F) = (F (Y F)) does is to let us embed a
function within itself an inifinitely number of times. So, for factorial:

In this case fact is defined as (pay attention now): A function that
takes a function as an argument and returns another function. The returned
function takes a natural number as an argument, and if the number is one, it
returns it, otherwise: it calls the function that was given as argument to the
first function
. Y keeps injecting fact into itself, so it can always go
deeper in the recursive call. But as soon as the number reaches 1, we don’t
have to go any further
, and the “final” (Y fact) collapses into
nothingness.

Y generates as many function applications as we need, so it will let us
create recursiveness, without naming a single function. (Y F) is then
the value of F when F is applied to itself an infinitely number of times.
This is called the fixed point for the function F.

Conclusion: Why Y?

The Y operator lets us use purely syntactic (mechanical) steps
to evaluate recursive functions. It gives the mathematical construct of
lambda calculus as much computing power as a programming language, without
needing to define names for functions. It is a mathematical marvel.

Can it be used for anything? I don’t really think so. But just as
Y expands a lambda expression, it can expand your mind. I hope that
you feel a little smarter going away from this blog than entering it.

You can read more about the Y-operator at wikipedia.
Of course.

And if you want to go for the whole nine yards, check out the Structure and Interpretation of Computer Programs online video
lectures! 20 hours of Lisp!

Postscript

Did you manage to read through the whole article? Did you understand it?
Let me know what you think: Write a comment, or send me an
email.

Posted in Uncategorized | 2 Comments