The changes to Facebook are not enough

Once again, Facebook has rolled out some new changes, and once again my news stream is filled with updates along the lines of “Facebook has ruined MY internet” (come on, it wasn’t intended as a personal insult). The changes in question are the addition of lists as a first class entity (in the interface – they were there in the features before), some automatically grouped lists, and the idea of top stories. Actually there is also the new Subscribe button, but judging from the majority of the messages I see, that hasn’t been noticed by most people. I’m in a different camp though, I think the changes are a step in the right direction, and my only complaint is that they don’t go far enough!

I used to work in a social network startup, we were going to take over the internet, and replace Facebook as the number one social destination, along with every other social network startup in 2007/2008. We really didn’t understand marketing (specifically that “Naked” was a really bad brand name) nor did we understand just how complex the technology behind Facebook was to reproduce, which is why we went out of business. We did understand one thing though, which was that as more and more people use social networks, the signal to noise ratio is going to get worse, and controlling what messages you send to who, and what messages you get from who is going to be more and more important.

The Problem

I use Facebook, and I use Twitter, and I have dabbled on Google +, and they are all struggling with the same problem. Let me try and explain what that problem is.

I send and receive messages on a few different subjects: Dance, Photography, Agile development, Web development and personal stuff (such as going for a beer this evening). Also, I am friends with Haje, who sends messages on a range of different topics: Photography, writing, travelling, and going for beers this evening. All three social networks let me group my friends (Facebook and twitter call this lists, and Google + calls it circles, but they are the same thing). I can put Haje in my “Photographers” List/Circle, and I can put him in my “Beer Buddies” List/Circle.

All three networks are encouraging us to group our contacts like this, it means I can then filter what I see (which in turn means I get more out of being on the network and I will come back). I can choose to see just my photographer friends, and catch up on photography, or just my dance friends, and catch up on dance. This is great, and is what Google + and Twitter have had for a while. Actually Facebook had it for a long time too, but their interface was terrible! So bad that very few people even noticed the feature (all this latest change really does is show off that they have the same features as Twitter and Google +).

This is actually pretty awesome, when Haje posts an cool post about photography, I can find it easily in my “Photographers” list.  However the messages he sends about writing and travelling, which are not my thing (nothing against what he says, its just a subject I’m not interested in) or about meeting for beer  (which I am interested in) all turn up in my photographers list . This is just wrong, It makes my “Photographers” list harder to read, because, guess what, most photographers talk about other stuff too! (Not all of them – but that is another story).

It gets worse. Because Haje is in my “Beer Buddies” list, all those same messages appear in that list too. I just read them in my “Photographers” list!

My friends are not one dimensional

The idea of grouping friends into lists really doesn’t work, because my friends are not one dimensional people who only have one type of relationship, or one thing they are interested in.

What is really needed, is a way to set up lists that filter posts not based on who they are from, but a combination of who they are from, and what they are about. That way I can go to my photographers list, and just see photography based messages. That would be something I actually find useful. Twitter has hashtags, which are the closest I have seen to this, but they are not good enough. The message sender has to tag what subjects a message is about (hard enough with compose a message in 140 characters, try categorising it too!), and I have to be listening to that *exact* tag. Plus at the moment it only lets you filter by hashtag, not by a combination of hashtag and people you follow.

To be fair, what I’m asking for is hard, really very hard. Think of something difficult, and its a lot harder than that. But I’m pretty sure that whichever of the three big social networks gets there first, is going to take a big lead.

 

By |September 21st, 2011|Technical|0 Comments

Deploying with Foreman in multiple environments

Foreman is a gem that allows you to define what processes an (rails) app needs to run. For example background workers, pubsub etc.

Typically I like to deploy my applications to at least two environments: staging and production, not to mention running it in development locally. I had to do a bit of wrangling to get Foreman to do this. Specifically I need to start my services using different rails environments, and Foreman does not seem have have built in support for this. (Heroku seem to not care about environments in the Procfile  – I assume they have their own magic way of dealing with this)

First I set up a directory

config/procfiles

and in there I put the following to files

production.proc
-------------------
worker: RAILS_ENV=production bundle exec rake jobs:work

and

staging.proc
---------------
worker: RAILS_ENV=staging bundle exec rake jobs:work

Then I added the following Capistrano tasks into deploy.rb (which handle installing and restarting the processes as upstart scripts on my server)

  namespace :services do

    desc "Restart all the services"
    task :restart do
      run "#{sudo} restart #{application}"
    end

    desc "Wipe and recreate the upstart scripts - (also restarts the services)"
    task :reinstall do

      raise "STOP!!!" if application.nil?

      begin
        run "#{sudo} stop #{application}"
      rescue
        # don't care if we can't stop. just means it wasn't running
      end

      run "#{sudo} rm -f /etc/init/#{application}*"

      run "cd #{current_path}; #{sudo} bundle exec foreman export upstart /etc/init -a #{application} -f #{current_path}/config/procfiles/#{stage}.proc -u #{user} -c worker=1"

      # Insert command to start service at boot time NOTE this does not work on the mac version of sed which is not GNU sed
      run "#{sudo} sed -i '1 i start on runlevel [2345]' /etc/init/#{application}.conf"
      run "#{sudo} start #{application}"
    end

    after "deploy:update", "deploy:services:reinstall"
  end

Now I can run cap staging deploy (I’m using capistrano-multistage) and it will stop all my services, setup up the right upstart scripts (in case I have changed the Procfiles) and restart my services

By |August 4th, 2011|Technical|2 Comments

Software Craftsmanship

Last night I went to a debate on Software Craftsmanship at SPA2010. The general consensus seemed to be that Software Craftsmanship is bad, but software craftsmanship is good. Notice the capital letters.

I want to pick up a point Ade made. He said: “I don’t believe that good software comes from a process or an environment. It comes from the skill of individual developers”. He went on to say that once you accept this, the question of how to grow your skills is impossible to ignore. This is the core of craftsmanship to him.

Personally I would rephrase his statement: “Good software comes when individuals working on it take responsibility for doing a good job. They take  responsibility for quality, and for growing their skills”. In my mind software craftsmanship is about individual developers taking responsibility. I don’t think this applies just to code quality – but to all aspects of “delivering great software”

The word responsibility is used a lot. Let me define it. It means recognising “This particular problem is only going to be fixed if I personally make it happen”. It does not mean a manager saying “you are now responsible for this area”. You, as an individual, have to take responsibility, it doesn’t count if it is assigned to you.

Now we can come back to Ade’s point about whether or not this comes from a process or environment. I suspect he is talking about Agile (with or without a capital letter) which is often held up as a solution to all development problems :)

The Agile approach can best be summed up by a quote by David Heinemeier Hansson. “Most average people will be awesome if you create an awesome environment”. He isn’t specially describing Agile, but his comment resonates with the Agile ideas. However his idea is hard to turn into specific action. I’m not surprised that Ade doesn’t want to trust the growth of his personal skills to such a vague environment or process.

However I do not think they are that different.

In my mind, individual responsibility is one of the two cores of Agile (the other being iteration). Just look at a successful daily stand up. Every team member steps up and takes responsibility for a story or an action. “I am going to complete this story. I may not know what is required for this, but I will learn it and do it”. Contrast to the alternative approach of a manager telling the team “David will do this story. Tim you work on that”. The former is an example of craftsmen taking responsibility. The latter is an example of mortgage driven developers coming to work, and “getting through the day”.

It’s impossible to force anyone to start taking responsibility, and encouraging them to do so is hard. Most agile conferences talk about it in one form or another, often with little or no success. If software craftsmanship (with or without capital letters) results in more developers accepting responsibility for the quality of the work they do, then it can only be a good thing.

By |May 19th, 2010|Technical|6 Comments

Is Rails Stagnating?

The reason Rails is so amazing is the way it pushed the boundaries, and made everyone accept an order of magnitude improvement.

On a business level, it made it an order of maginitude easier to create a websites. Companies that could not afford websites now can. Small teams that did not have the ability to build great services, now can. Twitter, even though it eventually moved on from Rails, is an example. This pushed the creation of all sorts of cool new services, and ideas.

On a programming level, its embraced the use of meta-programming. Not a new idea, and possible in many languages to some extent. However meta-programming was always considered far too complex to be understood by mere mortals. The word magic was regularly used to describe it. Now teenagers working on small ruby libraries use meta-programming regularly. Its become common place. Ok, so its often used where its not necessary, but its no-longer considered too scary to even go near.

So the question becomes – is Rails still pushing for order of magnitude improvements?

Many web sites are now services more than sites, they want to use things like server push, asynchronous processing, schemaless databases, and probably other things we don’t yet know about. Rails can feel painful, and a colleague of mine even says he finds it too constraining to do these things in.

Rails created a momentum by pushing some developers on by an order of magnitude (and left many more stagnated and left behind). That momentum still exists, is Rails keeping up with it, or holding it back?

Well right now, Rails has stagnated, but this is because its doing a thorough rewrite, making many much needed improvements. As we get closer and closer to Rails 3, I wonder if afterwards, we will see it once again start to push the boundaries, or if we will need to look elsewhere…

Twitter certainly felt they had to look elsewhere.

By |October 27th, 2009|Technical|0 Comments

What is big software anyway?

This recent post by Ola argues that if you plan to write big software, you have already lost. He is talking about why we should not write projects with many many lines of code. To me, this is a bit of a truism. Is it not always the case that doing the same thing is less lines of code is better?

Well, as long as your not talking about deliberately minimizing and obscuring your code I think it is.

“Big projects” get a lot of flack from the development community, but I don’t know – what is a big project? Is it:

  1. A system that has many lines of code?
  2. A system that has many developers working on it?
  3. A system that has many features?
  4. A system that has many users?

I don’t think anyone would agree that choosing 1) as your goal is a good thing.

There are obvious reasons why 3) and 4) are desirable goals (even though you may, rightly, question those reasons).

2) Is interesting. Its often arrived at for historical reasons, such as “we brought a company, so got all their developers”, productivity reasons; “100 programmers have to be able to add more features than 2, right?”, or even publicity reasons; “We have the biggest best team working on this”.

Each type of bigness has its own problems. Which big are you complaining about? What is the best way to fix those specific problems?

By |October 15th, 2009|Technical|0 Comments

Finally – Sequence Diagrams without the pain

I love UML sequence diagrams! It’s a beautiful visual way of understanding how a series of method invocations work, what the interactions between them are, and generally a kick-ass tool for good understanding of whats going on.

I have sequence diagrams! They are slow to draw, difficult to modify, and a big drag on a project that has to maintain an up to date set of them.

Introducing WebSequenceDiagrams.com. These guys have come up with a really cool way of turning almost natural english like:

TwitClient -> Twitter: Post status "Testing cool tool"
Twitter --> TwitClient: Success
Twitter -> Notification: New Tweet

into diagrams like:

TwitClient -> Twitter: Post status "Testing cool tool"
Twitter --> TwitClient: Success
Twitter -> Notification: New Tweet


Now I once again love sequence diagrams.

By |October 8th, 2009|Technical|2 Comments

Bamboo Toolbox

Gwyn and I are going to be presenting at the upcoming Scrum Gathering presentation in Munich.

We are presenting a tour de force of all the practical techniques we have developed over the last 18 months or so, while New Bamboo has been aggressively moving into a fully agile model. Lots of traditional scrum (and general agile) practices have been tried, some of which were ok, some of which were exceptionally useful.

In our 90 minutes we will cover all the biggest wins we found, regardless of if they are well known or totally new. For each topic we explain exacly how it benefited us, and what problems we encountered with it.

Gwyn especially deserves a lot of credit for this presentation. I have been flat out on a big project, and Gwyn has been driving me to find time to talk to him and share my ideas, and has put in most of the effort on preparing the slides, and the cool extras, for the actual presentation.

By |October 6th, 2009|Technical|0 Comments

Capistrano Task Graph and 3 reasons why it sucks

Capistrano comes with a set of tasks ready to deploy your application. Unfortunately it doesn’t come with an easy way to view  those tasks, and how they are related. Here is the graph you are probably looking for

This is a pretty crappy state of play! Given that Capistrano is the recommended way to deploy your applications. Let me justify that

  1. The deploy target: Why would I ever want to deploy and not run the migrations? If there are migrations, not running them is going to give me an untested environment, (new code, old database) and if there are no migrations, then there is no cost to running them.
  2. Inconsistent: Why is it that the deploy target wraps update_code and symlink in a transaction, but deploy:migrations does not?
  3. Unclear Naming: Its not imediatly clear what the difference between deploy:migrate and deploy:migrations is.

Capistrano is a really cool tool, but problems like this with the default tasks make it really confusing to use. I want to see it having default tasks that are named in a clear way, with a new convention if necessary, and consistent behaviour.

By |September 22nd, 2008|Technical|1 Comment