On my new homepage, a combined list of my tweets, bookmarks, and user comments on my site appear underneath my latest blog entries. I use a fun bit of Django code to pull these various items together, sorted by publication date, and I'd like to share how this bit of tumblelog-like functionality works.

Referenced by 4 Items:

Published 14 days ago on Ryan Berg's blog Received 14 days ago
Close | Link

Ever since last September when I moved this site off the shared-hosting account which had been handling it from its initial launch, I’ve been using separate services to handle static files — “media” in common Django parlance — instead of using the same web server instance, or a separate instance running on the same physical server as the rest of the site. Specifically, I’m using Amazon S3.

When I first explained this a few months ...

Read full entry and comments

Referenced by 2 Items:

Published 15 days ago from James Bennett on The B-List: Latest entries in category 'Django' Received 15 days ago
Close | Link | Comments

I predicted this back in March--can't believe a solution has surfaced so soon. It makes so much sense to build in an issue tracker to a revision control system. Since you're working with the code, might as well track the issues in the same system and take advantage of the extra metadata. This is really cool (and as a bonus, it's written in Python) so I hope to see it really grow and flourish!

Published 6 days ago on Eric Florenzano's Blog Received 6 days ago
Close | Link | Comments

One of the most active threads on reddit’s programming section right now discusses things people look for when reviewing someone else’s code; the article being discussed treats this as a great interview question and points to things like algorithm choices and object-oriented design as good responses. While these are important considerations, I’ve found I tend to make snap judgments long before I get to that level of analysis, and they’re almost ...

Read full entry and comments

Referenced by 3 Items:

References 1 Item:

Published 17 days ago from James Bennett on The B-List: Latest entries in category 'Django' Received 17 days ago
Close | Link | Comments

Mark Ramm has a nice post this morning talking about Adam Gomaa’s discussion of “conceptual integrity” in Python web frameworks; I think it’s worth a read.

The key point Mark touches on is good documentation: ensuring that people see and understand the overarching structure of the framework is, ultimately, the key to helping people understand how it can help them get their work done. In the case of Django there is an official ...

Read full entry and comments

Referenced by 3 Items:

Published about 1 month ago from James Bennett on The B-List: Latest entries in category 'Django' Received about 1 month ago
Close | Link | Comments

Demo site for django-arcade, an open source reusable Django app to add new flash games to any django-powered site. Looks very cool for easily creating game portals. It also comes from my future employer.

Referenced by 2 Items:

Published about 1 month ago on Eric Florenzano's Blog Received about 1 month ago
Close | Link | Comments

Shortly after I acquired my MacBook, I was disappointed to discover that Apple had designed lobotomized Time Machine so it wouldn’t work with generic network storage — e.g., with a NAS.

Much has been written about this elsewhere, so I won’t dwell on it here.  Except to say that, contrary to the marketing spin, there’s no good technical reason why Time Machine should require disks formatted in Apple’s HPS+ file system.  The file system should, under normal circumstances, be entirely abstract.  The only reason for requiring an HPS+ disk on the other end of the wire (or, wireless connection) is for short-term revenue.  If you believe anything else, I own a bridge in Brooklyn that I wish to sell you.

So, to my search for new network storage on my home network, I included looking for a Mac backup solution.  I wound up buying a 2TB Buffalo LinkStation Pro Duo in April, which came with Memeo backup software.  Memeo LifeAgent for Mac seemed like a great solution.  

A philosophical detour

I prefer backups with a predefined schedule.  I’d rather incur backup overhead at discrete points, amortized over all file changes since the last execution, rather than continuously, with many smaller overhead instances occurring on every change.

I get how, “it runs all the time and saves every file you modify,” is easier for laypeople to understand, and requires less setup.  A configuration schedule wizard is easy, but it does requires more clicks than this approach.

But, I can live with this simpleton mode.  Especially when it’s prevalent in consumer-grade backup applications, which are cheaper than their commercial-grade cousins.

Back to the story

After setting up the LinkStation Pro Duo, I installed LifeAgent, and applied all the available updates. I then configured it to back up my folders and files to the NAS drive.  I set up my account to always connect the NAS drive upon login.  Then, I rebooted, logged in, and verified that everything was working as expected. This all went smoothly.

The first backup took a long time, but after that, the client woke up only after a file modification.  After a while, I turned off the notification displays.  Things were working smoothly, and I began to forget about it…

LifeAgent starts to suck

…Until around the fifth day, when I noticed my system being very sluggish. A quick check of iStat Pro made it clear that some process had gone berserk.  100% CPU utilization on a dual-core 2.6GHz processor is a whole lotta something!

Rebooted, and the same thing happened.  Opened a Terminal window and ran top, and I found a process called Memod going bonkers.

Memod would suck up 100% of the CPU for about 20 seconds, then retreat for a short period, and then return to 100%.  Because I had just finished using Quicken, I guessed it had something to do with my running Quicken in a VMware Fusion virtual machine. But, this was just a guess, and besides, a backup application should be able to process large files, yes?  (When the tiniest virtual file changes, the entire virtual machine changes state, so LifeAgent must backup the entire umpteen-gigabyte file.  That’s life in the big city.)

Memeo has a number of support forums, including one for LifeAgent for Mac.  So on May 7 I wrote about this problem.  There was a quick initial response from a Memeo admin — which was great!  The admin asked for more details, which I supplied, and said they planned “to release an update by the end of the month if not sooner.”  Excellent.

LifeAgent support starts to suck

But it’s now June 5, over one month later.  And there’s no fix. Worse, there’re no responses from Memeo to questions about the fix’s status.

A couple other LifeAgent users replied in the thread, reporting they had the same problem. One was backing up to an eternal disk via Airport Extreme, and the other to a Time Capsule and two USB drives.  While a few of us are reporting this problem, there must be many other affected users who just haven’t spoken up.  

Memeo’s Windows’ forums have a fair amount of activity.  So, maybe they have a much larger revenue stream from the Windows products, and they give LifeAgent bugs a lower priority. But-but-but this bug makes their product unusable!  For a number of Mac users.  And folks, it doesn’t just happen on some antiquated disk, or in a corner case.  I suspect it’s a bug that’s central to their application’s design.

That Memo would not fix the bug is bad enough. But to not keep their user base appraised of the fix, and to not post a workaround, rather sucks.

So:

  1. Memo LifeAgent for Mac has a serious bug that renders it useless for some users.
  2. After an initial indication they would fix the bug, Memeo has ceased communicating about it.
  3. If you’re considering Memeo LifeAgent as a backup solution, you should look elsewhere.

Referenced by 2 Items:

References 1 Item:

Published about 1 month ago from John on Seek Nuance Received 11 days ago
Close | Link

I just finished reviewing and annotating the index for the book, and sent it back. And with that, I believe it’s finally done; soon it’ll be in the hands of the printer, and sometime hopefully next month you’ll be able to visit your local bookstore and pick up a copy.

My immediate plans include flying back east tomorrow to watch a couple of dear friends get married, and hopefully spending the next ...

Read full entry and comments

Referenced by 2 Items:

Published about 1 month ago from James Bennett on The B-List: Latest entries in category 'Django' Received about 1 month ago
Close | Link | Comments

Recently I launched Peevalizer, a website for talking about your pet peeves, which of course was written in Python using the Django web framework. In fact, it was the culmination of my efforts to teach myself design, and while I made some progress, it's clear that I'll never be a designer. Anyway, part of Peevalizer is that users can vote on different pet peeves, and view the peeves with the highest score. I used django-voting as the application to enable this functionality, and it provides a manager on the Vote object with methods for getting the top N results, where N is a positive integer.

One of the reasons for custom manager on Vote is because aggregate support has not yet been finished. However with Django's built-in Pagination support, it's necessary to retrieve not only a list of the top N voted pet peeves, but a list of all of the pet peeves, ordered by score. How is this possible? Specifically, how is this possible without forking django-voting? Here is the solution that I came up with:

class VoteAwareManager(models.Manager):
    def _get_score_annotation(self):
        model_type = ContentType.objects.get_for_model(self.model)
        table_name = self.model._meta.db_table
        return self.extra(select={
            'score': 'SELECT COALESCE(SUM(vote),0) FROM %s WHERE content_type_id=%i AND object_id=%s.id' %
                (Vote._meta.db_table, int(model_type.id), table_name)}
        )

    def most_hated(self):
        return self._get_score_annotation().order_by('-score')

    def most_loved(self):
        return self._get_score_annotation().order_by('score')

Then I assigned that manager onto all of the objects that could be voted on. What that's doing is literally issuing a subquery for every row, doing an aggregate on all of the votes for that row, and assigning it to an attribute named score.

However, we also wanted to allow for voting on User objects, which is built in to Django and cannot be easily changed. How do we add this manager to user? I spent a while thinking about that before realizing that it's not the right question to ask. The right question to ask is, how can we associate the User model with this manager? A quick look through some Django source code revealed this to be an absolutely trivial task. Here's how it goes in our code:

from django.contrib.auth.models import User
manager = VoteAwareManager()
manager.model = User

for user in manager.most_hated():
    # Do something with user's score

There are a few things to note about this implementation. Firstly, it can be much more computationally expensive to use this method instead of using django-voting's method (which executes some custom SQL), so either be aware of that or use aggressive caching strategies to overcome this shortcoming. The other thing is if you're not using a manager like this on multiple models, and since managers mostly just proxy to QuerySet anyway, it might be simpler to just acquire a QuerySet on the model that you would like to get, and run the extra() method in the calling function.

Referenced by 2 Items:

References 1 Item:

Published about 1 month ago on Eric Florenzano's Blog Received about 1 month ago
Close | Link

I’ve been noticing an interesting trend recently, not one I have any empirical evidence for mind, but one I though interesting non-the-less. Parts of the webstandards world appear to all be playing with Django. Part of this has been the odd mention down the pub, at barcamps or at SXSW this year. But the main source of information on the topic has been twitter. To name but a few I’ve seen tweets from Steve, Ross and Aral recently and Stuart and Cyril literally wont shut up about it.

What’s interesting is that this didn’t happen with Rails, not in the corner of the pub that generally talks more about markup, javascript and CSS anyway. I’ve worked on a couple of Rails projects both personally and commercially, and I’ve just launched a little pet project build with django called doesyourapi. What follows is, to my mind, a few reasons why I think this trend exists and also why I think it will continue, at least for the time being.

People

You can’t ignore the personal touch, and in Simon Willison and Stuart Langridge we already have two people who bridge the community and the web standards crowd, at least in the UK. Personal technology choices at least are often driven by personal correspondence.

Templating

Django’s templating introduces a very simple syntax and nothing else. Rails lets you have the full power of Ruby to do with as you will within your views. Rails also makes heavy use of helpers, further adding to the complexity of views. Now I have mixed views here, based on my own skills more than anything. I know I’d feel much more comfortable throwing someone with good markup skills at a project using Django than Rails. For the most part with Django you use the html you’re used to, Rails often wants you to change this to helpers – in much the same way as ASP.NET does in fact. I think some of this comes from the Rails don’t repeat yourself philosophy obsession. Sometimes this leads to programmatic complexity which makes working with templates more akin to programming, even if it means less duplication. I’ve yet to work on a particularly complex Django project so maybe this simplicity might become a limitation to work around? Always a possibility.

Default craziness

Some of the bits and pieces that come bundled with Rails are just plain wrong, the Javascript helpers being one example. The abuse of HTTP by default in some of the scaffolding code being another. Oh, and the markup coming out of various helpers as well. In trying to help the application developer Rails gets in the way of the professional webstandards types. Django does next to none of this for you. Programmers coming from Rails might see this as missing features. Frontend types prefer this clean slate approach because it means you don’t have to fight the backend (sometimes including people) for control of the output. Note that you can work around much of this (in the same way as you can work around ASP.NET if you have to), it’s just nicer to not have to.

Other craziness

Rails people love Ruby. After all it’s better than Java (it’s also a pretty loveable programming language too). But like computer science departments everywhere many Rails people also dislike or simply put up with HTML, CSS and Javascript. If they can find a way of not having to write these and write something else (Rails people are also obsessed with domain specific languages) instead. Hence we have the likes of HAML and SASS. The problem is that us frontend loving folk quite like writing CSS (well, sometimes) and absolutely love writing HTML. Most of the time for good reasons too – just look at microformats for an example. Frontend developers tend to like using a mix of tools, predominantly backend developers not so much it seems.

Personally I find it interesting. You could quite easily flip many of these arguments around to support why so many people are using Rails. For two frameworks with similar goals and uses it’s interesting to see the early philosophical differences playing out in the real world. It might be interesting to see what happens with frameworks like Merb as well which seems to be set out to avoid many of these perceived issues with Rails. So, have anyone else noticed anything similar? Or even the complete opposite?

Tagged , , , , ,

Referenced by 2 Items:

References 3 Items:

Published 3 months ago from gareth on Morethanseven Received 9 days ago
Close | Link

Daily blog by Kevin Fricovsky. In addition to having some really great content, he has started to post audio interviews with people from the Django community. This is a site to keep an eye on in the coming days and months.

Referenced by 1 Item:

Published 29 days ago on Eric Florenzano's Blog Received 29 days ago
Close | Link

On a recent plane ride, I was watching an episode of The West Wing which had flashbacks to the original campaign which set up the Presidency on which the show is based. There’s a scene in that episode where Abbey Bartlet — the eventual First Lady on the show — is talking to some of her husband’s campaign staffers about whether her husband is ready to really run the campaign and be President. The dialogue ...

Read full entry and comments

Referenced by 1 Item:

Published about 1 month ago from James Bennett on The B-List: Latest entries in category 'Django' Received about 1 month ago
Close | Link | Comments

Djangodash, a two-day two-person sprint to create a project using Django, took place last weekend. To be honest, I wasn't expecting it to be much fun, but it ended up being an absolute blast!

Feedalizer.net

Before getting too far into this post mortem, I'm going to just get it out of the way and shamelessly promote the site that Tony and I created during the dash: feedalizer.net. The idea behind the site is that it's a feed aggregator, but people vote on the feeds. The higher the feed's score, the more likely items from that feed will bubble up to the top of the list. There's also the concept of a "channel", which only aggregates feeds for a specific area. For example, there's a Humor channel, a Django channel, and a Python channel. You can also subscribe to channels to create your own "station", which aggregates the content from the channels that you care about.

The idea came to me when a friend of mine asked me "I've never used a feed reader before, but I want to get started and subscribe to programming feeds. What are some good ones for me to subscribe to?" It took me about 30 minutes to cull through my feeds and produce a list of the best. But it shouldn't have taken me any time at all--there should have been a site out there to do this for him!

OK, enough shameless self-promotion.

The Dash

52 teams registered for the dash, so watching the commit activity at the turn of the clock was pretty crazy. Unfortunately, Tony was driving from 4 hours away and he hadn't arrived yet. When he did arrive, we both wanted to spend some time catching up and talking about non-Django things. So we didn't even get started until about 3:30AM. Getting started mainly consisted of frantically checking in 3rd party projects that we thought we would use, and talking about architecture, and writing a few cron jobs. Not much code got written that night (morning?), since we still had a lot of planning to do.

The next day, all of a sudden our commits weren't working! We went to the website to see what was going on, and the website wasn't responding to our requests. Something was definitely going on, and it was slowing down our progress significantly. We tried working on our own separate parts of the project, but at this early stage there was simply too much overlap. We found out later in the night that there were problems at Webfaction's data warehouse,`The Planet`_, where a transformer quite literally exploded.

This severely slowed us down, because we ended up having to switch to git, and then once we got everything into our git repository, we had tons of merge conflicts. We got an e-mail saying that the due date would be postponed, so we decided to take the afternoon and night off to do other things.

The next day we did the brunt of our work. I had the task of designing the frontend, so I opened up my trusty text editor and hammered out the worst-looking CSS file you'll ever see in your life, producing some of the worst-looking pages you'll ever see in your life. This changed over the course of the day, but not by much as you'll see if you visit the site. This same day, Tony was working on some of the harder queries etc.

The final day (the deadline had been extended, remember) was all about integration. There was nothing really notable about this, but it took all day to get everything working properly together. I ended up writing a bunch of Javascript to make the client experience more enjoyable, and Tony had the chance to debug his views now that I had templates and we had sample data. It was a crunch to make the deadline, but we tried to do the little important extra details like write an "about" page, a README file, etc.

Conclusion

Whether we win or lose, and despite the technical difficulties that The Planet suffered, I had a blast doing the competition. I think that our idea is novel, and Tony and I got to work on something once more post-graduation. (Nothing like a programming competition to bring people together, I always say.) In fact, we'll probably continue to work on it for the months to come, especially in upgrading its graphics. It's going to be really awesome to see what everyone else produced this year. I encourage anyone who thought about participating this year, or anyone who even considers it as a possibility, to sign up and just do it next year!

Referenced by 1 Item:

References 1 Item:

Published about 1 month ago on Eric Florenzano's Blog Received about 1 month ago
Close | Link | Comments
Published about 1 month ago from thescoop on The B-List: Latest entries in category 'Django' Received about 1 month ago
Close | Link

A few notes about the book:

  • No, there will not be a free download like Jacob and Adrian’s book. I believe an e-book version will be available, but it’ll be a for-pay download from Apress. I’m OK with that, because they’ve already given one Django book away, and I’d like them to make some money so they can keep publishing.
  • Yes, it’s written on the assumption of a checkout ...

Read full entry and comments

Referenced by 1 Item:

References 1 Item:

Published about 1 month ago from James Bennett on The B-List: Latest entries in category 'Django' Received about 1 month ago
Close | Link | Comments

Another successful @media conference comes to a close and as usual interesting things were said and hopefully everyone learned something. As usual I have a few more things on my must find time to play with list. More on those if they happen.

But one part of the conference I felt needed addressing straight away was the first days panel. The Hot Topics panels bring together a few of the days speakers to answer questions posed by the audience. This year each day had it’s own panel discussion, with the first days session having a design theme. So far so good, and before I getting going I have to say I think Jeffrey Veen did a sterling job of prodding and prompting the session along. The rest of the panel composed of Andy Clarke, Dan Rubin, Bronwyn Jones and Indi Young.

The panel fielded a few interesting questions (and The Beatles in-joke was highly entertaining) but the whole thing took an odd turn part way through – odd in the sense that everything suddenly became very anti-developer.

Andy Clarke seemed to be the ring leader here saying things like (I’m paraphrasing here) “I hate daily stand-ups, we should do Agile”. Dan Rubin was involved too, seemingly saying all developers prefer the rigid nine to five because they’re logical people, while designers want to be able to work whenever they choose. This and other comments caused a few good friends and web developers on the front row to literally shake their fists in anger. The audience got involved too, cheering the anti-developer or anti-engineer statements on. In my mind damage had just been done to out our industry.

Buidling web sites or applications is a pretty multidisciplinary exercise, and in any team environment good communication is often the difference between executing well and failing badly. Conferences like @media are a great place to come together with people from different disciplines and similar jobs in different organisations and share stories. I’m not saying either Dan or Andy haven’t had bad experiences with developers or stand-ups. I’m not saying bad individuals or bad process don’t exist (I have scars from both). I’m saying that generalising these experiences and then promoting them to impressionable designers is dangerous.

I have the good fortune of working with a great designer, Alex Lee, at GCap at the moment. He’s involved in our stand-up meetings every morning and without him there we would waste untold amounts of time and effort. If he turned up on monday and said “I’m not going to come to stand-ups anymore, Andy Clarke says they aren’t cool”. We have a massive problem. My fear is this is exactly what’s going to happen somewhere tomorrow.

I’m something of a hybrid; I’ve run the whole gamut of design and development activities during my career to-date (I’ve even touched on project management) and have worked in small and medium sized agencies, as an independent freelancer and now in a decent sized in-house team. All of these roles pose different communication challenges which require different solutions. What works for three people in a distributed team doesn’t work for fifteen people working in-house. Some types and sizes of team work best with stand-ups, others work best being in the same small room together. Sometimes you need a centralised audit trail of everything that has happened on a project, other times it’s overkill. Somethings everyone has to be working on the project at the same time, at other times as long as tasks get done it really doesn’t matter.

I’m not saying I like all of those working conditions – I’m saying that if you understand where they work best you can work in the environment that suits you. Andy Clarke runs a boutique agency doing high quality work, working with a very small team where individual flexibility and minimal process is definitely the best approach. I now work in a cross disciplinary team of maybe sixty people and it’s a different ball game completely.

This isn’t an attack on Andy, or Dan, or even an anti-designer rant. The web is a young industry filled with young people. We’re learning as we go and stealing what we can from other disciplines. Also not that many of us really like the idea of project management, never mind the reality. Agile methods like Scrumm are hot at the moment but that’s not to say we won’t find something that better suites our discipline in the future. Iterative development, while often annoying to designers, appears to be producing better results. If designers, and developers, want to change how we work together for the better, then get interested in project management and lets have a discussion in public. If you want to complain about individual experiences then that’s why you have a blog.

Tagged ,

Referenced by 1 Item:

Published about 1 month ago from gareth on Morethanseven Received 9 days ago
Close | Link

Everyone has had the experience of hearing about something new and thinking: "That makes so much sense! Why didn't I think of that?" For programmers that keep up on open source software, new projects that fit the previous description attract not only our admiration, but we want to be a part of this new idea. We become involved and contribute and try to push that new software into any new direction that we can; learning from it and evolving it along the way.

One such idea that fits my description perfectly is Processing.js. Not to belittle John Resig's hard work in actually developing the initial codebase, but the idea is what is so much more important. Thousands of developers knew of both the Processing language and about the canvas tag which is coming to prevalence, but it was a revolutionary idea to notice that the pairing of the two was "both possible and desirable to do in the first place", as Reddit commenter MarshallBanana pointed out.

As a community we need both the revolutionary ideas and the evolutionary changes so that we get great software that solves problems in new and innovative ways, but also that doesn't have bugs and provides a polished experience. But I think that we've become too bogged down in the evolutionary. We get so wrapped up in others' ideas--so interested in polish and shine--that seldom few think outside the boundary of the incremental. I won't claim to be the exception here, and rightly can't claim to be, but it's something that's worrisome nonetheless.

I think that a big part of it is that the open source community has gotten so wary of experimentation with well-established applications. Why can't a development version of Firefox include a Python or Ruby interpreter alongside a JavaScript interpreter? Why can't CSS directives for reflections be explored, or animations be built into the rendering engine? I think that a big part of it is because we've spent so long talking about validation and standards that we forgot about that sense of wonder; that feeling of anything being possible with a bit of code and enthusiasm.

Processing.js, and projects like it, give me hope that revolutionary ideas are still out there. They rekindle that sense of wonder in me. They make me think about other things that are possible. They make me excited about open source again. Let's foster more and greater and better ideas, and just once in a while, eschew the incremental.

Referenced by 1 Item:

References 2 Items:

Published about 1 month ago on Eric Florenzano's Blog Received about 1 month ago
Close | Link | Comments

As shown at WebFaction's page on Djangofriendly, they're a pretty popular choice for hosting Django sites. But the comments also show that users frequently push the limits of their plans' allowed memory.

Those limits just got a bit more lenient...

Referenced by 1 Item:

Published about 1 month ago on Ryan Berg's blog Received about 1 month ago
Close | Link

Since launching a couple weeks ago, (Djangofriendly.com)[http://djangofriendly.com "Django hosts at djangofriendly.com"] has seen WebFaction rise to the top of the shared hosting pile, and Slicehost emerge as the cream of the VPS crop...

Referenced by 1 Item:

Published about 1 month ago on Ryan Berg's blog Received about 1 month ago
Close | Link

Did you visit Djangofriendly, not find your favorite Django host, and click away to never return? Well, now's your chance to share your choice with everyone else. Sign up for an account (sorry, no OpenID support yet), and add your Django host. WebFaction and Slicehost need some competition!

Referenced by 1 Item:

Published about 1 month ago on Ryan Berg's blog Received about 1 month ago
Close | Link

Between normal work, working on the book, working on my upcoming PyCon talk and working on a couple little things on the side, I haven’t had much time for blogging lately, especially about Django. But I’ve built up a collection of little things that need to get posted, so I’m just going to start dumping them out here and then get back to not having any free time :)

A django-registration update

I ...

Read full entry and comments

Referenced by 1 Item:

Published about 1 month ago from James Bennett on The B-List: Latest entries in category 'Django' Received about 1 month ago
Close | Link | Comments

I’ve done more reflecting, and had more discussions with friends, since my first career rumination.  I’ve gravitated to focusing more on how I’d feel in different situations.  Herewith, a potpourri of brooding.

At-will employee vs. contractor

A basic doctrine of American law is at-will employment.  This is the employee’s and employer’s right to terminate the employee’s job at any time, without notice.

Federal and state law have defined statutory exceptions to this.  For example, employment agreements can stipulate termination notice periods and severance pay. Generally, absent an employment agreement or wrongful termination, you can be canned without notice at any time.

I’ve been wrapping my head around the differences between at-will employment and contractors.  What are the pros and cons of each, and why should one choose one over the other?  If there are no fundamental differences, maybe the choice should come down to a gritty financial calculus. There are many intangible and circumstantial differences, but I’m trying to get at the first principles.

My initial approach was based on absolute attributes. A summary, assuming there’s no employment agreement:

Characteristic Freelance Employee
You can be terminated without notice or severance
You must monitor your career’s direction
You ought to monitor the company’s direction √ but how much is up to you
There’s a clear delineation between the company & yourself
You have perceived mutual loyalty with your company
You have actual mutual loyalty with your company
You have more complicated income taxes √ but it’s easy to learn

But this comparison oversimplifies the positions’ relative strengths and weaknesses, precisely because it uses absolutes. The probabilities in a healthy company are more useful.  Why?  Long story short, all bets will be off in an unhealthy company anyway, and a higher probability event can be discerned in advance if you’re sufficiently aware.

This changes the comparison quite a bit, to:

Characteristic Freelance Employee
Higher Pr(terminated without notice or severance) √ can be much higher
Higher Pr(career direction overhead)
Higher Pr(feeling connected to a greater purpose, and making a difference)
Higher Pr(clear company vs. self delineation)
Higher Pr(mutual loyalty with your company) √ but only if you’re a valuable asset
Higher Pr(quickly migrate to interesting work, and exit unpleasant assignments)
More complicated taxes √ but it’s easy to learn

For now, I’ve altered my thinking to include full-time employment, with perhaps the option of side consulting to use as a network extension.

Yes, I’m sure your tables would be different. But this is my blog and these are my tables. If you don’t like them, see Figure 1.

The company and the boss

Two common errors are to expect a company’s loyalty, or try being friends with your boss.

A company is a soulless beast.  It’s (usually) not evil, but it does act according to its own best interests.  There’s nothing wrong with this…it’s just reality. The company isn’t a surrogate family.

Your boss is…your boss. It’s OK to be friendly with your boss.  If you both believe in your team’s mission, are competent, and have high integrity and character, then it would be hard not to feel something akin to friendship.

However, true friendship is precluded by the positional power imbalance. There’s nothing wrong here, either — it’s just reality.

But companies and bosses do differ.  Companies can be dysfunctional, well-run, fast-moving, slow-moving, informal, formal, serious, fun, and/or any other adjective. They can simultaneously be multiples of these, and they can also attain different states in different circumstances.

Some managers “manage upward,” others “manage downward.”  Some are about process, or teamwork, or metrics, or goals, or stretch goals, or integrity, or winning at all costs, etc.  Some are more ruthless about missed milestones, more understanding, more hard-nosed, or more open.  Et cetera.

Higher RPMs

What turns my crank?  I greatly enjoyed working on TrenchMice, more so than my work in some of the companies prior to it.  A large part of that was the Python and Django technology.  But in a newsflash from the Duh! desk, I realize that a large enjoyment component came from other sources.  A not complete but decent list would be:

  • Feeling connected to a purpose
  • Being part of a (small) team
  • Ownership, responsibility, authority
  • Working with innovative technology
  • Creating something new
  • Creating value

It’ll be hard to find the first four as a freelancer.

OTOH, some argue that the first three are usually mirages, or ephemeral at best.   The movie industry has done very well with an entirely contractor-based ecosystem.  Actors, directors, etc. were employees of the studios in the old days.  Since circa 1948, the studios sign contractors in the form of actors, directors, post-production houses, etc. A typical movie can be evaluated as a large outsourcing exercise.

Some friends, and my wife, have said my energy level decreases when I talk about preparing to be a freelancer, and rises when I talk about some recent employment opportunities.

Heaven.__manna__

Sometimes I’ll percolate on an issue, and it resolves itself withou