Our passional nature not only lawfully may, but must, decide an option between prepositions, whenever it is a genuine option that cannot by it’s nature be decided on intellectual grounds.
William James
I’ve recently been studying William James’ famous essay “The Will to Believe”1, which he describes as “a defense of our right to adopt a believing attitude in religious matters”. I think it has a lot to teach about building software.
Before diving in, let’s clarify the goal of the essay. He’s not arguing for the existence of God, or that all rational people should believe in God. It’s a much more limited argument: that belief in God is rational under a specific set of circumstances. When James defends our right to believe, ‘our’ refers to specific group of people: those for whom belief in God is a ‘genuine option’.
What is a genuine option, you ask? To answer that, we need to back up. The essay begins with three important distinctions about choices: they can be either living or dead, forced or avoidable, and momentous or trivial.
A forced choice is self-explanatory: it is one in which we must pick a side. For example, when building a software application, the choice of which programming language to use is forced, because it’s not possible to build at all without doing so in some language.
A trivial option is also pretty straightforward: it’s an option where “the opportunity is not unique, the stake is not high, or when the decision is reversible if it later prove unwise”. A momentous option is the opposite of this; something that is one-shot and difficult to reverse. For software, this last trait is notable, because decisions that are hard to reverse are often the most important to get right.
The most complicated distinction is between live options and dead options. James says that “a live hypothesis is one which appeals as a real possibility to him to whom it is proposed”. He compares them to wires; a dead option “makes no electric connection with your nature”. This means that whether an option is living or dead depends on the person (or people) making the choice. A relevant example in software is frameworks. If we’re developing a new web application and everyone on the team has lots of Python experience, Django and Flask are both live options for building our backend. But if nobody on our team has touched Java since Object-Oriented Programming 101, then building our backend in Spring Boot is likely a dead option.
After setting up these three distinctions, James gives one final definition: a genuine option is an option that is forced, living, and momentous. Great! So how does he propose we choose between these genuine options? In an ideal world, we could figure everything out from first principles through the use of reason. You know: examine the facts, weigh the pros and cons, analyze the concepts, and reserve our judgement until we have enough evidence to determine and prove the truth about the matter.
But we all know that things are more complicated than that. “Can we always wait with impunity till the coercive evidence shall have arrived?” Surely the answer is no. As a proof by contradiction, he provides the example of flirting:
Whether you [like me] or not depends, in countless instances, on whether I meet you half-way, am willing to assume that you must like me, and show you trust and expectation. The previous faith on my part… [is] what makes your liking come. If I stand aloof, and refuse to budge an inch until I have objective evidence… ten to one your liking never comes.2
What he’s is getting at is that sometimes access to the truth requires us to act on a prior assumption about what that truth will be; and even more radically, that such assumptions can actually affect the truth. There are “cases where a fact cannot come at all unless a preliminary faith exists in its coming… where faith in a fact can help create the fact”. Our belief about what the truth will be play a causal role in what that truth turns out to be. If we aren’t willing to act on faith—if we don’t have the will to believe—we risk missing out on an entire class of truth. And for James, "a rule of thinking which would absolutely prevent me from acknowledging certain kinds of truth… would be an irrational rule”.
With all the pieces assembled, we can finally appreciate his thesis: “Our passional nature not only lawfully may, but must, decide an option between prepositions, whenever it is a genuine option that cannot by it’s nature be decided on intellectual grounds.” The remainder of the essay lays out why religious decisions in particular fall into this category. I think software architecture decision do too.
Martin Fowler has a page about software architecture where he attempts to answer the question ‘What is architecture?’. He offers a couple possible answers: “the decisions you wish you could get right early in a project” or “the important stuff, whatever that is”. I think James’ definition of a genuine option is an even better answer. Architectural decisions are forced; we cannot opt out of them. Architectural decisions are momentous; they are crucial to the long-term success of an application and very difficult to reverse once made. And while some architectural options are dead (if we need a cross-platform mobile app, we aren’t going to write it in Swift), the really important decisions are between live options: choices where we really could see ourselves going down one road or another, and it’s unclear which is best.
Software engineers often find themselves in a state of analysis paralysis when presented with big projects. The sheer quantity of new technologies, tools, and frameworks constantly inundating us only make matters worse. But delaying leads us to the same mistake as the dogmatic skeptic: trying religiously to avoid errors, we end up missing out on truths. For choices that are trivial or avoidable, there’s no rush. But when it comes to the architectural choices, we should consider which options are truly live for us—based on our unique requirements, experience, or interests—and then begin building.
We cannot make architectural decisions on purely intellectual grounds, because the benefits and drawbacks of a given option don’t become clear until we have begun to chisel out real code. Like the question ‘do you like me or not?’, the question ‘should I architect my software this way or not?’ cannot be abstractly analyzed until we have a perfect answer; the answer is dependent on our actions. Waiting for all the evidence before deciding will leave us paralyzed, because the evidence comes only from building the application! With James, we can claim a right to believe. We “not only lawfully may, but must” architect software based on our passional nature.
Might we end up wrong, tearing our hair out as we are forced to refactor everything? Of course! But that is the risk of seeking truth. A decision to delay is just as passional, yet provides no possibility of discovering the right path. The essay ends with a quote that sums this up beautifully:
We stand on a mountain pass in the midst of whirling snow and blinding mist, through which we get glimpses now and then of paths which may be deceptive. If we stand still we shall be frozen to death. If we take the wrong road we shall be dashed to pieces. We do not certainly know whether there is any right one. What must we do? ‘Be strong and of good courage.’ Act for the best, hope for the best, and take what comes… If death ends all, we cannot meet death better.
So the next time someone is arguing with you about architecture in a pull request, just respond with that quote, and I’m sure they’ll let you merge.
James, William. The Will to Believe, and Other Essays in Popular Philosophy. [New York etc. Longmans, Green, and Co., 1897, 1897] Pdf. Retrieved from the Library of Congress, <www.loc.gov/item/04003036/>
Come for the philosophy, stay for the dating advice.