<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Pragmatist Programming]]></title><description><![CDATA[Understanding how software hangs together.]]></description><link>https://pragmatistprogramming.com</link><image><url>https://substackcdn.com/image/fetch/$s_!HISq!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabc95607-aeba-45c4-9c82-d369995e4277_512x512.png</url><title>Pragmatist Programming</title><link>https://pragmatistprogramming.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 16 Apr 2026 01:49:05 GMT</lastBuildDate><atom:link href="https://pragmatistprogramming.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Noah Teuscher]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pragmatistprogramming@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[pragmatistprogramming@substack.com]]></itunes:email><itunes:name><![CDATA[Noah Teuscher]]></itunes:name></itunes:owner><itunes:author><![CDATA[Noah Teuscher]]></itunes:author><googleplay:owner><![CDATA[pragmatistprogramming@substack.com]]></googleplay:owner><googleplay:email><![CDATA[pragmatistprogramming@substack.com]]></googleplay:email><googleplay:author><![CDATA[Noah Teuscher]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Rorty and the React Revolution]]></title><description><![CDATA[How React took over frontend web development]]></description><link>https://pragmatistprogramming.com/p/rorty-and-the-react-revolution</link><guid isPermaLink="false">https://pragmatistprogramming.com/p/rorty-and-the-react-revolution</guid><dc:creator><![CDATA[Noah Teuscher]]></dc:creator><pubDate>Sat, 03 Aug 2024 20:17:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HISq!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabc95607-aeba-45c4-9c82-d369995e4277_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p>Interesting philosophy is very rarely an examination of the pros and cons of a thesis. Usually it is, implicitly or explicitly, a contest between an entrenched vocabulary which has become a nuisance and a half-formed new vocabulary which vaguely promises great things.</p><p>Richard Rorty</p></div><p>I recently came across <a href="https://www.youtube.com/watch?v=8pDqJVdNa44">React.js: The Documentary</a> at the end of a YouTube rabbit hole. It&#8217;s a fascinating glimpse into the history of a library that now dominates frontend web development.</p><p>What immediately stands out is how contingent the emergence of React was. In hindsight it&#8217;s easy to imagine that a web framework backed by Facebook was inevitable. Today, the concepts that it pioneered&#8212;the Virtual DOM, JSX, uni-directional data flow, component-based UIs&#8212;are so ubiquitous that it&#8217;s difficult to imagine a frontend landscape without them. But the story that emerges from the documentary is not one of Big Tech inevitability, but rather a motley crew of young developers overcoming the odds to bring a radical idea to life. </p><p>Along the way, if a couple engineers had not gotten on board, or if a Facebook manager had vetoed a months-long React rewrite of their critical ad creation workflow, or if an unproven React had not been brazenly chosen for the post-acquisition development of Instagram&#8217;s web platform, the whole thing might just as easily have fizzled out. Even after proving itself in production within Facebook, when React was open-sourced at JSConf in 2013 it was received by the frontend community not with a lack of enthusiasm but with outright hostility. </p><p>How did this happen? How does a framework go from dead on arrival to the most used library on the web in less than a decade? </p><div><hr></div><p>In the opening pages of <a href="https://en.wikipedia.org/wiki/Contingency,_Irony,_and_Solidarity">Contingency, Irony, and Solidarity</a>, <a href="https://plato.stanford.edu/entries/rorty/">Richard Rorty</a> makes the assertion that &#8220;interesting philosophy is very rarely an examination of the pros and cons of a thesis.&#8221; This is a classic Rorty head-scratcher. Isn&#8217;t examining the pros and cons of a thesis the <em>primary</em> thing folks do in philosophy? </p><p>He continues: &#8220;Usually it is, implicitly or explicitly, a contest between an entrenched vocabulary which has become a nuisance and a half-formed new vocabulary which vaguely promises great things&#8221;. In my reading, Rorty is making a historical observation, not a value judgement. Many of the things we now look back on as major turns in the history of ideas were not continuations of existing ideas with minor academic squabbles around the edges. They tackled problems so foreign to those being asked, in language so different from that being used, that they were seen as an intriguing novelty rather than a threat. Then they crept up on people, who found themselves almost subconsciously using the new words and asking the new questions. </p><p>Rorty&#8217;s characterization of interesting philosophy applies equally well to React. It was a half-formed vocabulary filled with unproven new concepts and mental models.</p><blockquote><p>Every other framework at the time [was doing] two-way data binding and&#8230; it was like, forget about data binding, we&#8217;re not gonna do that at all. Anytime anything changes we&#8217;re just going to re-render.</p></blockquote><p>Consider the initial reactions of people who would go on to be core contributors and evangelizers of the library: &#8220;Honestly I thought it was completely crazy&#8230; there was no way that was going to work.&#8221; &#8220;The whole bid here was that this would be simpler, but I can&#8217;t help but feel like this is really complicated.&#8221; &#8220;It was so far outside everybody&#8217;s idea of how things should work.&#8221; The syntax and structure of React code looked entirely different from existing web applications, and the problems that arose in React apps were foreign. But it promised something great. </p><p>In the documentary, <a href="https://x.com/Vjeux?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor">Christopher Chedeau</a> relates a meeting he had with <a href="https://x.com/jordwalke">Jordan Walke</a> about the nascent React in which he asked, What is the most difficult thing to do in the frontend right now? Jordan&#8217;s answer was <em>updates</em>; specifically, finding and changing individual DOM nodes. Anybody who has worked with jQuery can confirm that this is indeed a painstaking processes. </p><p>If you ask web developers today the same question, nobody will talk about finding and updating DOM nodes. When you write applications in React, updating individual DOM nodes is not something you spend much mental energy on. To be sure, it&#8217;s is still doing this under the hood (and understanding precisely how is an invaluable skill). But the problem is abstracted behind the framework. In fact, having to manually reference individual DOM nodes or imperatively update them is often a sign that your code can be improved.</p><p>Rorty argues that the method of philosophy he advocates &#8220;does not pretend to have a better candidate for doing the same old things which we did when we spoke in the old way. Rather, it suggests that we might want to stop doing those things and do something else instead&#8221;. Similarly, React did not propose a better candidate for what was once the hardest problem in frontend web development; it suggested that we do something else entirely. And the same applied to numerous aspects of developing applications, from file structure to separation of concerns to mental models to state management. </p><p>Of course, countless hours of engineering and design and advocating, as well as the backing of Facebook, were a big part of why React came to fruition and persisted through intense derision. But React also succeeded because of its lack of incrementalism; its rejection of best practices; its rephrasing of the core questions. React did not solve the old problems of frontend web development. Rather, it <em>dissolved</em> them by rephrasing how a web page is rendered. It replaced them with new, slightly less annoying problems. React vaguely promised great things, and as people tried it out, they discovered that it delivered.</p><p>A decade later, the tables have turned. When React was open-sourced, JSX was the most mocked aspect of the library; now JSX feels more natural than HTML. Having done most of my professional work in React, I often find it difficult to shift into an imperative mental model. When I want to play around with a new web API, I don&#8217;t add a <code>&lt;script/&gt;</code> tag to an HTML file; I fire up a simple React app. </p><p>The fact that React is now thoroughly entrenched means that perhaps we should be on the lookout for another new vocabulary that vaguely promises great things. I think <a href="https://www.inkandswitch.com/local-first/">local-first software</a> is a great candidate. I noted earlier that React developers would be unlikely to cite updating DOM nodes as the most difficult problem in frontend web development. So what would they say? My answer would be synchronizing state. And just as React dissolved the question of updating DOM nodes, nascent local-first projects are all about abstracting away the problem of state synchronization. Similar to React&#8217;s &#8216;just re-render everything&#8217; idea, the local-first &#8216;just cache everything&#8217; ideal seems absurd when you first hear it. But on further reflection, it becomes tantalizingly simple. That will never work... right?! There&#8217;s only one way to find out. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://pragmatistprogramming.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Pragmatist Programming! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Will To Build]]></title><description><![CDATA[William James on software architecture]]></description><link>https://pragmatistprogramming.com/p/the-will-to-build</link><guid isPermaLink="false">https://pragmatistprogramming.com/p/the-will-to-build</guid><dc:creator><![CDATA[Noah Teuscher]]></dc:creator><pubDate>Fri, 14 Jun 2024 04:31:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HISq!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabc95607-aeba-45c4-9c82-d369995e4277_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p>Our passional nature not only lawfully may, but must, decide an option between prepositions, whenever it is a genuine option that cannot by it&#8217;s nature be decided on intellectual grounds.</p><p>William James</p></div><p>I&#8217;ve recently been studying William James&#8217; famous essay &#8220;The Will to Believe&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, which he describes as &#8220;a defense of our right to adopt a believing attitude in religious matters&#8221;. I think it has a lot to teach about building software.</p><p>Before diving in, let&#8217;s clarify the goal of the essay. He&#8217;s not arguing for the existence of God, or that all rational people should believe in God. It&#8217;s a much more limited argument: that belief in God is rational <em>under a specific set of circumstances</em>. When James defends <em>our</em> right to believe, &#8216;our&#8217; refers to specific group of people: those for whom belief in God is a &#8216;genuine option&#8217;. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://pragmatistprogramming.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Pragmatist Programming! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>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.</p><p>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&#8217;s not possible to build at all without doing so in some language.</p><p>A trivial option is also pretty straightforward: it&#8217;s an option where &#8220;the opportunity is not unique, the stake is not high, or when the decision is reversible if it later prove unwise&#8221;. 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. </p><p>The most complicated distinction is between live options and dead options. James says that &#8220;a live hypothesis is one which appeals as a real possibility to him to whom it is proposed&#8221;. He compares them to wires; a dead option &#8220;makes no electric connection with your nature&#8221;. 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&#8217;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. </p><p>After setting up these three distinctions, James gives one final definition: a <em>genuine</em> 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.</p><p>But we all know that things are more complicated than that. &#8220;Can we always wait with impunity till the coercive evidence shall have arrived?&#8221; Surely the answer is no. As a proof by contradiction, he provides the example of flirting:</p><blockquote><p>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&#8230; [is] what makes your liking come. If I stand aloof, and refuse to budge an inch until I have objective evidence&#8230; ten to one your liking never comes.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p></blockquote><p>What he&#8217;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 <em>affect</em> the truth. There are &#8220;cases where a fact cannot come at all unless a preliminary faith exists in its coming&#8230; where faith in a fact can help create the fact&#8221;. Our belief about what the truth will be play a causal role in what that truth turns out to be. If we aren&#8217;t willing to act on faith&#8212;if we don&#8217;t have <em>the will to believe</em>&#8212;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&#8230; would be an irrational rule&#8221;. </p><p>With all the pieces assembled, we can finally appreciate his thesis: &#8220;Our passional nature not only lawfully may, but must, decide an option between prepositions, whenever it is a genuine option that cannot by it&#8217;s nature be decided on intellectual grounds.&#8221; The remainder of the essay lays out why religious decisions in particular fall into this category. I think software architecture decision do too.</p><p>Martin Fowler has <a href="https://martinfowler.com/architecture/">a page about software architecture</a> where he attempts to answer the question &#8216;What is architecture?&#8217;. He offers a couple possible answers: &#8220;the decisions you wish you could get right early in a project&#8221; or &#8220;the important stuff, whatever that is&#8221;. I think James&#8217; 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&#8217;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&#8217;s unclear which is best.</p><p>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&#8217;s no rush. But when it comes to the architectural choices, we should consider which options are truly live <em>for us&#8212;</em>based on our unique requirements, experience, or interests&#8212;and then begin building.</p><p>We cannot make architectural decisions on purely intellectual grounds, because the benefits and drawbacks of a given option don&#8217;t become clear until we have begun to chisel out real code. Like the question &#8216;do you like me or not?&#8217;, the question &#8216;should I architect my software this way or not?&#8217; 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 &#8220;not only lawfully may, but must&#8221; architect software based on our passional nature.</p><p>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:</p><blockquote><p>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? &#8216;Be strong and of good courage.&#8217; Act for the best, hope for the best, and take what comes&#8230; If death ends all, we cannot meet death better.</p></blockquote><p>So the next time someone is arguing with you about architecture in a pull request, just respond with that quote, and I&#8217;m sure they&#8217;ll let you merge.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://pragmatistprogramming.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://pragmatistprogramming.com/subscribe?"><span>Subscribe now</span></a></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>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, &lt;www.loc.gov/item/04003036/&gt;</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Come for the philosophy, stay for the dating advice.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Pragmatist Programming]]></title><description><![CDATA[A new name for some old ways of software]]></description><link>https://pragmatistprogramming.com/p/pragmatist-programming</link><guid isPermaLink="false">https://pragmatistprogramming.com/p/pragmatist-programming</guid><dc:creator><![CDATA[Noah Teuscher]]></dc:creator><pubDate>Tue, 14 May 2024 03:16:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabc95607-aeba-45c4-9c82-d369995e4277_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Software engineers have a love affair with the word &#8216;pragmatic&#8217;. There&#8217;s <a href="https://en.wikipedia.org/wiki/The_Pragmatic_Programmer">The Pragmatic Programmer</a>, often hailed as a bible of software engineering, and the <a href="https://pragprog.com/">Pragmatic Bookshelf</a> publishing imprint it spawned. There&#8217;s <a href="https://blog.pragmaticengineer.com/">The Pragmatic Engineer</a>, the most popular tech newsletter on Substack. Fed up with agile? No worries, just switch over to <a href="https://www.pmi.org/disciplined-agile/mindset/mindset-principles/pragmatism">Pragmatic Agile</a>&#8482;!</p><p>As wonderful as many of these resources are, strangely absent are discussions of why &#8216;pragmatic&#8217; is an appropriate name for the specific style of engineering being advocated. Perhaps some would say that a pragmatic engineer values real-world results over theory, or delivers improvements incrementally, or is not dogmatic, or focuses on impact. But many of the greatest feats of software engineering have come from people working on seemingly unimpactful problems and operating in decidedly dogmatic, non-incremental, or theory-laden ways, a fact often discreetly brushed under the table.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://pragmatistprogramming.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Pragmatist Programming! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Usually, &#8216;pragmatic&#8217; comes off as merely a filler word selected for its friendly connotation. At times it nefariously joins forces with phrases like &#8216;clean code&#8217; to become a vague stand-in for all that is good and right in the world, and thus a conversation-stopper. Once you define your style as &#8216;pragmatic&#8217; or &#8216;clean&#8217;, arguing against it becomes futile. (Of course, this sort of conversation-stopping is deeply anti-pragmatist.) A word which stands for everything stands for nothing&#8212;some excavation work is needed.</p><div><hr></div><p>During college I became enamored with philosophy, and ever since I&#8217;ve kept up an on-again off-again personal study. These days I&#8217;m most interested in the history of philosophy. It is dazzling to peruse the vast array of ideas that have been held dear by human beings over the years and to trace back the often arbitrary and unexpected ways that today&#8217;s ideas derive from previous thinkers. </p><p>Of all the philosophical schools I&#8217;ve come across, the one that cuts closest to my core&#8212;the label I am most tempted to intellectually identify with&#8212;is called, you guessed it, pragmatism. In the world of philosophy, unlike in software, it refers to something relatively well-defined (albeit hotly debated). Pragmatism is a school of thought which emerged in the United States in the late 19<sup>th</sup> century. It germinated in informal discussions of a &#8220;metaphysical club&#8221; at Harvard and then emerged in the writing and lectures of two great thinkers: Charles Sanders Pierce and William James. </p><p>I won&#8217;t attempt to give a complete overview of what pragmatism is here; if you&#8217;re interested, check out the <a href="https://plato.stanford.edu/entries/pragmatism/">Stanford Encyclopedia of Philosophy entry</a>. But very broadly, pragmatism is a tradition which insists that change, malleability, and contingency are fundamental features of the world, and that human inquiry and action are inextricable from understanding the world.</p><p>Early pragmatists were heavily influenced by Darwinian evolutionary theory, and I find it helpful to understand pragmatism as a philosophical extension of his thought. Darwin discovered that species are not static entities or reflections of idealized forms; they emerge by gradually adapting to external environments, a product of their own natural history. Pragmatists believe that our understanding of the world&#8212;our ideas and beliefs&#8212;are analogously in a state of flux. Our ideas do not progress linearly towards some metaphysical form and our societies do not march towards some end of history with scientific precision; they adapt, like species, as we continue to inquire and act in the world around us.</p><p>Perhaps most incendiary is the upshot of this outlook on truth. Many philosophical traditions accept a correspondence theory of truth: that statements are true insofar as they properly mirror or correspond to external reality. But the pragmatists find this theory useless, because they don&#8217;t think a static external reality is something we have access to. It doesn&#8217;t do much good to have a theory of truth under which we can&#8217;t know anything that is true. They are instead interested in a theory of truth that explains humans come to believe things are true and why true beliefs are valuable. The specifics are a matter great controversy<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, but generally involve understanding truth as <em>downstream</em> of the process of inquiry used to arrive at an idea or the consequences of believing it. James put it better than I can: &#8220;the truth of an idea is not a stagnant property inherent in it. Truth <em>happens</em> to an idea. It <em>becomes</em> true, is made true by events&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. Crazy stuff, right?</p><div><hr></div><p>Ok, so&#8230; what does this have to do with software? It&#8217;s quite straightforward: I believe pragmatist philosophy provides a helpful vocabulary for talking about software. Philosophers have put a great deal of blood, sweat, and tears into clarifying what pragmatism means and working out its consequences, and software engineers would be well served by the usual: copying and pasting someone else&#8217;s work, with a few edits to make things run. This blog will be the working out of an extended metaphor: as the pragmatist philosopher views the world, so the pragmatist programmer views software.&nbsp;</p><p>James famously called pragmatism &#8220;a new name for an old way of thinking&#8221;, and I think this is an apt description for my proposed appropriation of the term too. A philosophically pragmatist undercurrent already ripples through the lingo and culture of software development, but I hope that being explicit about the link between philosophical pragmatism and software yields new insights about how we should create software that a common-sense usage of the word misses or even obscures. </p><p>Wilfred Sellars<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> wrote that &#8220;the aim of philosophy, abstractly formulated, is to understand how things in the broadest possible sense of the term hang together in the broadest possible sense of the term&#8221;. That&#8217;s a lofty goal, but I think he&#8217;s mostly right, and we&#8217;ve got to start somewhere. For me, that might as well be software. So that&#8217;ll be the aim of this blog, abstractly formulated: to understand how software in the broadest possible sense of the term hangs together in the broadest possible sense of the term. </p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://pragmatistprogramming.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://pragmatistprogramming.com/subscribe?"><span>Subscribe now</span></a></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Pierce tried to rename his philosophy &#8216;pragmaticism&#8217; to distance it from the abuses he felt it was enduring at the hands of James and his theory of truth. He claimed that the new name was &#8220;ugly enough to be safe from kidnappers&#8221;. He was right, and the rebrand didn&#8217;t stick. I&#8217;m also siding with James on this one, mostly because <a href="https://pragmaticistprogramming.com">pragmaticistprogramming.com</a> would probably be worse for SEO.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>William James. "Pragmatism's Conception of Truth". Lecture 6 in <em>Pragmatism: A New Name For some Old Ways of Thinking</em>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>I&#8217;ll do my best not to butcher ideas and thinkers, but this blog is not aimed at philosophical rigor. So you can save yourself the trouble of typing out that angry rant about how Sellars isn&#8217;t actually a pragmatist or how na&#239;ve my reading of Rorty is or whatever it is you&#8217;re up in arms about. Valuing such petty squabbles over usefulness wouldn&#8217;t be very pragmatist of me, anyways. </p></div></div>]]></content:encoded></item></channel></rss>