Top Albums of 2010

I’ve a bit of an eclectic taste. I’ll listen to anything, from country to hip hop to acid jazz to good ol’ fashioned rock and roll. I love music. I love sound. Every year, for whatever reason, I write a top 10 albums list. I do this, despite knowing not a single person whom cares, to keep myself motivated throughout the year to sample the new releases.

There’s no science behind which albums make my top 10 list. Typically my top 10 albums are those which kept me coming back for more throughout the year since their release. Given that I listen to hundreds of albums a year, those which keep me coming back must have struck the proverbial chord. Albums which made me gasp repeatedly, stirred my emotions, or released the childhood boy inside me. In short, albums which made an impact and continued to do so with each listen.

These are those albums for 2010.


  1. #10 Mike Patton Mondo Cane

    Easily the most interesting album of the year. Take 1 cup of Mike Patton, equal parts of 50’s and 60’s Italian pop songs, a 30 piece orchestra, and you have Mondo Cane. As always you get to hear Patton croon, growl, scream, launch falsetto, and go to crazy town and back, all somehow without crapping himself. I can’t guarantee the same for you.

  2. The Roots - How I Got Over

    #09 The Roots How I Got Over

    Newsflash: I’m a skinny, pale-as-hell white dude from Saskatoon. I wear ties and casual jackets to work when we don’t have a dress code. I believe a suit is incomplete without a pocket square. I haven’t had a date in several months and I write software for a living. My existence, in essence, is somewhat pathetic at the moment, but that doesn’t mean I can’t listen to hip hop. I don’t even know where to start with this album other then saying it is the complete antithesis of myself. While I eat cold popcorn and watch movies by myself, The Roots are sweating out vial after vial of 100% pure kick ass. This album is a testament to that effect.

  3. Villagers - Becoming a Jackal

    #08 Villagers Becoming a Jackal

    What do you get when Paul Simon gets drunk and has raucous sex with Peter, Bjorn & John circa 2006? They squeeze out Villagers. The album doesn’t have the same up front, in your face hooks as the whistling in PB&J’s Young Folks, or the beautiful harmonies of, well, any Paul Simon record ever recorded, but the physical feeling you get from any of those albums is still present. You’ll tap your foot and smile to yourself while you hum or sing along. You’ll even close your eyes and let yourself get carried away in the lushness of it all, until you realise you’re driving your car and thus would do better if you paid attention to the road lest you almost take out another pedestrian.

  4. Angus and Julia Stone - Down the Way

    #07 Angus & Julia Stone Down the Way

    While going through high school I greeted each and every week with a barrage of comments about my hot sisters. “Hello, Monday!” I’d say. “Hey, your sisters are hot! I’m gonna make out with them! Whatcha think of that, Baldwin?!”. Wash, rinse, repeat as necessary. In hindsight I realise the proper solution to this was not to get mad, rather I should have taken Angus Stone’s lead and just make a band with them and write beautiful music. This brother-sister Australian duo put out an album of dreamy songs with buttery vocals. Listen to Yellow Brick Road and tell me you didn’t close your eyes and think of your childhood summers. If you didn’t then you were birthed at the age of 18, have no youth to go back to, and I pity your future self. Stay away from my sisters, you loser.

  5. Minus the Bear - OMNI

    #06 Minus the Bear OMNI

    Fact: This album has the best hooks of the year. True story. It’s like Peter Gabriel’s ghostly spirit haunted the recording studio, or it would have if he were dead. The crazy synth on My Time, the repeated quad-crashes on Summer Angel, the groovy offbeat drive on Secret Country, this album is relentless in its ability to make you scream “yyyyyyeeeeeeeaaaAAAAAAHHH!”. I understand the album may not be everybody’s cup of tea; inevitably there has to be at least one person in every group who has terrible taste in music, so I won’t take offense for them sucking out.

  6. Arcade Fire - The Suburbs

    #05 Arcade Fire The Suburbs

    I have a confession to make: I hated this album the first time I listened to it. “It doesn’t make any sense.” I flatly stated. “The album doesn’t seem to flow. The start is too jarring! Won’t somebody please think of the children?!” Admittedly, had I not skipped around the album the first couple times I listened to it I likely would not have had such warped perceptions of this beautiful piece of art. In my defense I was reading “Harperland: The Politics of Control” at the time and, thus, the lack of artistic appreciation had burrowed deep into my bones. My recommendation for listening to this album is to start at track 1 and listen to the thing, in its entirety, without stopping. Make sure you have “repeat all” turned on to your discman while doing so. When the album’s over allow it to continue from the start. Boom! Your brain just melted into a bucket of awesome sauce.

  7. The National - High Violet

    #04 The National High Violet

    Are you having a great day? The sun is out, the birds are chirping, and you’re feeling great about yourself and life? Put on this album and watch it all come crashing down into a painful, pathetic, puddle of tears. With hits like Sorrow, Lemonworld and Conversation 16, this album will leave you a blubbery mess. In 2005 Bonnie ‘Prince’ Billy penned the lyrics “And where are you going? And why are you leaving? Left on the walkway to swallow my grieving.” Little did he know he was actually writing a metaphor for every single fan of The National who listens to this album.

  8. Kanye West - My Beautiful Dark Twisted Fantasy

    #03 Kanye West My Beautiful Dark Twisted Fantasy

    Hey, remember that time when Kanye West was a total dick and stole Taylor Swift’s moment of undeserved 15,000 minutes of fame? This album more than makes up for it. To quote
    Saskatoon’s own Maybe Smith “I wish I had the balls to make an album like the one Kanye just made.” And it’s the truth. This album is insane. It’s like a cajun gumbo with every single type of meat and pepper, all fused together into THE SUPER SOUP OF MONSTER KILLER GUMBO FROM OUTER SPACE. This is, quite seriously, one of the greatest rap recordings ever produced. It’s insane. But it’s Kanye, and for that reason alone I refuse to give him album of the year.

  9. The Black Keys - Brothers

    #02 The Black Keys Brother

    Quick: where do you think these guys are from? If you said Missouri, or New Orleans, or Alabama you wouldn’t be alone. If you said “Akron, Ohio”, well, you’d be an awkward combination of “correct” and “alone”. This album reeks as though it was made in the dusty saloon of some disgustingly sweaty swamp of the deep south. But it isn’t. Not even close. As I type this the temperature in Akron Ohio is -2°C. This album pairs well with a sweaty woman seductively dancing in a cropped shirt and a cold beer. If this album were a cologne commercial it’d be for Stetson, with 1 exception: It wouldn’t suck. Listen to this album in the presence of cold beer and whatever gender you’re attracted to and try not to grab him/her and get up close. You won’t be able to control yourself. There’s an undercurrent of sensuality that exists on this album that I haven’t heard since Junior Boys released their debut album Last Exit.

  10. The Tallest Man on Earth - The Wild Hunt

    #01 The Tallest Man on Earth The Wild Hunt

    In a top 10 list that’s filled with over the top complexity, Kanye West’s ego, and Mike Patton growls, it’s fitting that the #1 album of the year is one in which the only recorded instrument is an acoustic guitar. As they say, “Less is more.” The Tallest Man on Earth is 27 year old Swede Kristian Matsson. He’s not exceedingly tall, but what he lacks in height he more than makes up with talent. Every song, every verse, and every note is an impeccable piece of perfect song writing. The Wild Hunt is easily one of the best folk albums I’ve heard this decade. He is, in no short order, our generation’s Bob Dylan.


Top Albums of 2009

Well ladies & gentlemen, it’s that time of year again where I make a list that nobody reads or cares about. Considering this is more an exercise in reflection than it is in sharing my highly-toted-to-nobody-in-particular opinion, here are my favourite albums of 2009 without any explanation. YMMV.

#10 – Kurt Vile: Childish Prodigy
#09 – Real Estate: (ST)
#08 – Bat For Lashes: Two Suns
#07 – The Antlers: Hospice
#06 – Bonnie “Prince” Billy: Beware
#05 – Animal Collective: Merriweather Post Pavillion
#04 – Grizzly Bear: Veckatimest
#03 – Future of the Left: Travels With Myself And Another
#02 – Micachu & The Shapes: Jewellery
#01 – Do Make Say Think: Other Truths


MashedIn – Fuelling Your Connections With Oxygen

This past week my team and I worked on version 8 (Oxygen) of MashedIn. We had 2 goals going into this version:

  • Provide a better, more predictable user experience when authenticating with the product
  • Do a better job at handling badness when talking with Facebook, Twitter, and other social partners
  • Fix bugs!

It never ceases to amaze me how much our team can accomplish in as little as 3 days of development time. Here’s the fifty thousand foot view.

  • 4 improvements to how we authenticate and manage sessions with our social partners
  • Bunch of preliminary branding work. Pretty pictures! Human readable copy! Personality provided by cheeze wiz!
  • 13 bug fixes
  • 8 bagels eaten
  • Several dozen carafes of coffee confidently consumed

Now, that may not sound like too much, but that’s a full 3 days of work across a team of 4 developers, including design meetings, decision making, and the occasional head butting. I believe we tackled some good things this sprint, and the experience we provide to the user is a little more predictable; we shouldn’t be shattering your expectations anymore.

There were 2 main challenges we faced in Oxygen. First, the more we investigated how to better manage expectations for the user (that is, not shock and awe the user with unexpected, crappy behaviour) the more subtleties we discovered. Most of these subtleties came in the form of Facebook Connect. Managing your sessions can be quite difficult thanks to the persistently authenticated nature of Facebook Connect (and the fact that we don’t control any of it). What happens when I sign into Facebook using an alternative set of credentials, but then I visit MashedIn and MashedIn determines that I have a different Facebook user associated with my account than what Facebook Connect dictates? What’s the best way to handle this? How transparent do we need to be to the user? Do we really want to provide a bunch of subtle options? Are those options going to frustrate the users? It’s a tough call, and we believe we’ve made the right decisions, but a good round of user testing will definitely help us out.

The 2nd challenge was one of irony: Facebook has been biting the proverbial dust all week. Without Facebook we can’t grab social information for the visitor. Without social information we can’t effectively perform what we want our product to do. Without doing what we want to do in the app we’re wasting the time of our users by providing them crap all for value. With Facebook crapping out this week, we were able to uncover a lot of really poorly written code. We were able to eat our own dog food, and it tasted like… well, dog food. It sucked. We all went crazy. Brett, one of our developers, started wearing a monkey suit to work. It was total chaos. As a result, we addressed a bunch of the Rainy Day scenarios and made our dog food taste more like a bottle of cheap wine. While what is there isn’t perfect, we believe the overall quality of both the code and the user experience is better. One week at a time, my friends, one week at a time.

Next week we start our 9th sprint. If you’re a chemistry buff you’ll know that Fluorine has an atomic weight of 9. You’ll also know that Fluorine is an extremely toxic element, one that may cause severe burns when it comes in contact with the skin. As such I think it’s fitting that we’re attempting to accomplish a lot of painful things in Fluorine. We have 2 goals for next week:

  • Fail faster! By that I mean improve performance by not allowing several retries that ultimately result in failure. Fail hard, and fail now! (Note: we’ll be doing lots of other things to improve performance… embracing failure is just one of them)
  • Make it pretty! We’ve spent a lot of time during Nitrogen and Oxygen gearing up our look and feel, branding, etc. Now we want to start pulling the trigger on those ideas.

Next week should be interesting and pose a lot of new challenges. I’m expecting that by the end of Fluorine we’ll have a better performing, better looking product. One that will hopefully make you smile and bring a tear to your eye. So keep checking back, and make sure to go give MashedIn a spin and let us know what you think (good, bad, terrible, fantastic – all feedback is welcome)!.

Until then, The Dude abides.


MashedIn – Bringing Y’all Together One Element at a Time

Over the past 7 weeks I’ve been working on a project at work called MashedIn. The goal of the project is to provide social context to otherwise contextual-less online media. For example, pretend I write a blog (which I do… somewhat… kinda…). Using MashedIn I can put a widget on my blog which allows the visitor of my site to see how he or she is connected to me through Twitter, Facebook, and other social networking services (some coming in the near future). This may seem like something trivial (note: it’s not), and on the outset it may seem like something that provides very little value (note: not true), but the fact is it can be a tool of great power when used in the proper setting.

That proper setting is locality. If your’e reading my blog chances are you don’t know me. About 90% of my hits come from a few keyword searches and Google. If I had the MashedIn widget on my blog, and you actually decided to see what it was all about, you’d likely be quite disappointed because – well – we’re likely in different cities, if not other countries. However, imagine you’re viewing the website of your local butcher shop and they have the MashedIn widget on their site. You may have never done business with the butcher shop, you may not even know that the butcher shop in question works only with lamb (they really love their mutton), but by signing into the widget you suddenly realize that you know a few people that work there, and you have several mutual friends. Suddenly you have a boatload of people you can ask about this butcher shop.

That functionality may still sound trivial, but if you start with that foundation the power and complexity that may be provided to you the visitor can suddenly ramp up, especially if you integrate the mashed social graph with other online crowdsourced services (such as StepRep‘s recommendation system). Out of the box the widget doesn’t seem very impressive, but we’re only 7 weeks in and we have a huge backlog of ideas that can make this thing pivotal to bloggers, local businesses, etc.

We’re developing MashedIn 1 week at a time (each week named after the element with the corresponding atomic weight). Every Friday morning we plan what we’re going to do for the following Monday through Wednesday. Every Thursday we wrap things up; do one last round of integration, testing and debugging, and then release. The velocity is high and the focus intense. Lots of fun agile practices such as Test Driven Development, pair programming, etc. But more importantly there’s lots of interesting challenges to be solved.

In the 4th week of development (named Beryllium because Beryllium has an atomic weight of 4, you getting this now? Yea, nerdism at it’s best) some pretty bad design decisions were made regarding how we manage all the different social networks MashedIn works with. We spent a bunch of time on the 3 subsequent sprints (Boron, Carbon and Nitrogen) fixing these decisions, and we’re finally at a state that we’re content with… for now. This exercise has been interesting, however, and has proven what we all heard in first year comp-sci: The most expensive part of software development is adjusting code that’s already been released. Keep in mind we spent 1 week (3 days, really) back in Beryllium to write the code that’s pivotal to handling MashedIn’s core system. The design was so poor that it cost us the lion-share of Boron, Carbon and Nitrogen to fix. That’s some rather hefty opportunity cost to pay for not having spent a few more hours group-thinking about a better solution. Thankfully we can finally move on and get back to concentrating on some of the more interesting problems.

Monday marks Day 1 of Oxygen (our 8th week). This sprint’s theme is more consistent and user friendly session management with our various social partners. This is a complicated task because Twitter’s implementation of OAuth is significantly different than Facebook Connect, and who knows how that is different from all the other social networks. We’ve developed patterns over the past few sprints which have significantly improved the experience, but there are still some gotchas that need handling. How do we gracefully handle an expired session, especially since that session is outside of our control and can literally expire at any time? What do we do when a visitor is looking at a widget and the owner of that widget has failed to allow for Facebook’s persistent permissions? How do we balance what the visitor of the site cares to see and do vs. the system’s requirements to do all that crazy processing (thus requiring special permissions from the owner of the widget)? It’s an interesting mix of challenges, and I look forward to seeing what we come up with next week.

Until then, The Dude abides!


Google AppEngine and Separation of Concerns

In the world of writing software there are 2 challenges every developer must face: how to keep your concerns separate, and how to survive the impending deadly boredom of writing all your data CRUD (Create, Update, Retrieve and Delete) functionality. There are a gazillion solutions out there for both. In the realm of functional isolation much has been written, studied, and practiced for separating your program’s concerns. You can adhere to various design patterns; you can establish a pattern and an engine to manage that pattern yourself; you can use one of the several freely available frameworks that already exist (such as Spring). This is good.

In the realm of CRUD management (and boy, is it a crappy job… ba-da-dum!) there’s a plethora of available frameworks for almost every language. These object persistence frameworks handle all the boring, lowdown, uninteresting CRUD functionality that developers loath (but which is a necessary evil). This is also good.

What’s bad, however, is the interoperation of these two challenges rarely seems “natural”. The reason is that object persistence frameworks can really mess with your separation of concerns. The domain classes you write can suddenly become the transport means in your data access layer, thus blurring the lines of what code goes where.

A week ago I started a new application that uses Google AppEngine. Google AppEngine provides an object persistence framework as part of its platform. It also provides a Model-View-Controller type of framework for writing all your web apps. From day one my colleague Kevin Pierce and I have struggled to determine how to separate domain logic from data logic. In AppEngine, your “onion” from the outermost layer to the innermost looks more or less like the following:

[Template] (html/js/css) -> [View] -> [Model] -> [DataStore]

The problem with the above onion is between the View and the Model. Without having something in between your views can (and will) become enormously bloated, full of miscellaneous helper modules, and will operate directly against the Model/Datastore, thus blurring the lines of responsibility in your application. This will eventually make your life a living hell. Kevin and I decided to throw in an intermediary layer between View and Model, called Domain, which houses all the business logic of our application.

[Template] -> [View] -> [Domain] -> [Model] -> [DataStore]

The idea is that the View layer will only ever directly interact with the Domain layer, and never directly against the Model layer. For example, if the View needs to retrieve a Person from the DataStore, instead of going directly using the Model, the View will ask the Domain for an object that’s responsible for retrieving a Person from the DataStore and interact with that object (a classic Factory). Because Python is a dynamic language, in which everything is an object (including classes, functions and modules) this becomes extremely easy. Take the following example:

# in myapp.models.person module
from google.appengine.ext import db
class Person(db.Model):
	first_name = db.StringProperty()
	last_name = db.StringProperty()

def get_person_by_id(person_id):
	return Person.get_by_id(person_id)

# in myapp.domain.person
class PersonProxyFactory(object):
	def create(self):
		from myapp.models import person
		return person

# some_view.py
def get_person(request, *args, **kwargs):
	from myapp.domain.person import PersonProxyFactory
	factory = PersonProxyFactory().create()
	factory.get_person_by_id(request.GET.get('person_id'))
	# return some template

In the above example the View has no direct knowledge of the Model; the only layer the View explicitly knows about is Domain. The Domain has knowledge of the Model, and because in python a module is just another object, the Domain’s factory can return the actual person module. The View need not be aware of what the returned object actually is, instead it need only understand what the interface of that object is.

This separates the concerns nicely while still allowing us to use the persistence framework, but it poses some difficult questions. To what extent must we wrap functionality? Is it appropriate for layers above the Model layer to assume that a Person class know how to save itself (via an instance method of save() or put())? Where do we draw the lines with this solution?

How have you tackled the dichotomy of object persistence frameworks and the separation of concerns?


Follow

Get every new post delivered to your Inbox.