<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blog on Hillel Wayne</title>
    <link>https://www.hillelwayne.com/post/</link>
    <description>Recent content in Blog on Hillel Wayne</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 15 Jul 2024 00:00:00 +0000</lastBuildDate>
    
	<atom:link href="https://www.hillelwayne.com/post/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Toolbox languages</title>
      <link>https://www.hillelwayne.com/post/toolbox-languages/</link>
      <pubDate>Mon, 15 Jul 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/toolbox-languages/</guid>
      <description>A toolbox language is a programming language that&amp;rsquo;s good at solving problems without requiring third party packages. My default toolbox languages are Python and shell scripts, which you probably already know about. Here are some of my more obscure ones.
AutoHotKey Had to show up! Autohotkey is basically &amp;ldquo;shell scripting for GUIs&amp;rdquo;. Just a fantastic tool to smooth over using unprogrammable applications. It&amp;rsquo;s Windows-only but similar things exist for Mac and Linux.</description>
    </item>
    
    <item>
      <title>Composing TLA&#43; Specifications with State Machines</title>
      <link>https://www.hillelwayne.com/post/composing-tla/</link>
      <pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/composing-tla/</guid>
      <description>Last year a client asked me to solve a problem: they wanted to be able to compose two large TLA+ specs as part of a larger system. Normally you&amp;rsquo;re not supposed to do this and instead write one large spec with both systems hardcoded in, but these specs were enormous and had many internal invariants of their own. They needed a way to develop the two specs independently and then integrate them with minimal overhead.</description>
    </item>
    
    <item>
      <title>Software Friction</title>
      <link>https://www.hillelwayne.com/post/software-friction/</link>
      <pubDate>Wed, 01 May 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/software-friction/</guid>
      <description>In his book On War, Clausewitz defines friction as the difference between military theory and reality:
 Thus, then, in strategy everything is very simple, but not on that account very easy. Everything is very simple in war, but the simplest thing is difficult. These difficulties accumulate and produce a friction, which no man can imagine exactly who has not seen war.
As an instance of [friction], take the weather.</description>
    </item>
    
    <item>
      <title>Don&#39;t let Alloy facts make your specs a fiction</title>
      <link>https://www.hillelwayne.com/post/alloy-facts/</link>
      <pubDate>Wed, 10 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/alloy-facts/</guid>
      <description>I&amp;rsquo;ve recently done a lot of work in Alloy and it&amp;rsquo;s got me thinking about a common specification pitfall. Everything in the main post applies to all formal specifications, everything in dropdowns is for experienced Alloy users.
Consider a simple model of a dependency tree. We have a set of top-level dependencies for our program, which have their own dependencies, etc. We can model it this way in Alloy:</description>
    </item>
    
    <item>
      <title>The Tale of Daniel</title>
      <link>https://www.hillelwayne.com/post/tale-of-daniel/</link>
      <pubDate>Mon, 01 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/tale-of-daniel/</guid>
      <description>It&amp;rsquo;s April Cools! It&amp;rsquo;s like April Fools, except instead of cringe comedy you make genuine content that&amp;rsquo;s different what you usually do. For example, last year I talked about the strangest markets on the internet. This year I went down a different rabbit hole.
Daniel has been a top 5 baby name twice since 2000. There are over 1.5 million Daniels in the United States (and almost 100,000 last-name Danielses).</description>
    </item>
    
    <item>
      <title>The Hunt for the Missing Data Type</title>
      <link>https://www.hillelwayne.com/post/graph-types/</link>
      <pubDate>Sat, 02 Mar 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/graph-types/</guid>
      <description>A (directed) graph is a set of nodes, connected by arrows (edges). The nodes and edges may contain data. Here are some graphs:
 All graphs made with graphviz (source)Graphs are ubiquitous in software engineering:
 Package dependencies form directed graphs, as do module imports. The internet is a graph of links between webpages. Model checkers analyze software by exploring the &amp;ldquo;state space&amp;rdquo; of all possible configurations.</description>
    </item>
    
    <item>
      <title>Planner programming blows my mind</title>
      <link>https://www.hillelwayne.com/post/picat/</link>
      <pubDate>Tue, 20 Feb 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/picat/</guid>
      <description>Picat is a research language intended to combine logic programming, imperative programming, and constraint solving. I originally learned it to help with vacation scheduling but soon discovered its planner module, which is one of the most fascinating programming models I&amp;rsquo;ve ever seen.
First, a brief explanation of logic programming (LP). In imperative and functional programming, we take inputs and write algorithms that produce outputs. In LP and constraint solving, we instead provide a set of equations and find assignments that satisfy those relationships.</description>
    </item>
    
    <item>
      <title>An RNG that runs in your brain</title>
      <link>https://www.hillelwayne.com/post/randomness/</link>
      <pubDate>Mon, 22 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/randomness/</guid>
      <description>Humans are notoriously bad at coming up with random numbers. I wanted to be able to quickly generate &amp;ldquo;random enough&amp;rdquo; numbers. I&amp;rsquo;m not looking for anything that great, I just want to be able to come up with the random digits in half a minute. Some looking around brought me to an old usenet post by George Marsaglia:
 Choose a 2-digit number, say 23, your &amp;ldquo;seed&amp;rdquo;.
Form a new 2-digit number: the 10&amp;rsquo;s digit plus 6 times the units digit.</description>
    </item>
    
    <item>
      <title>The World and the Machine</title>
      <link>https://www.hillelwayne.com/post/world-vs-machine/</link>
      <pubDate>Thu, 04 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/world-vs-machine/</guid>
      <description>This is just a way of thinking about formal specification that I find really useful. The terms originally come from Michael Jackson&amp;rsquo;s Software Requirements and Specifications.
In specification, the machine is the part of the system you have direct control over and the world is all the parts that you don&amp;rsquo;t. Take a simple transfer spec:
---- MODULE transfer ---- EXTENDS TLC, Integers CONSTANTS People, Money, NumTransfers (* --algorithm transfer variables acct \in [People -&amp;gt; Money]; define \* Invariant NoOverdrafts == \A p \in People: acct[p] &amp;gt;= 0 end define; process cheque \in 1.</description>
    </item>
    
    <item>
      <title>Notes on Every Strangeloop 2023 Talk I Attended</title>
      <link>https://www.hillelwayne.com/post/strangeloop-23/</link>
      <pubDate>Tue, 05 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/strangeloop-23/</guid>
      <description>This is my writeup of all the talks I saw at Strangeloop, written on the train ride back, while the talks were still fresh in my mind. Now that all the talks are online I can share it. This should have gone up like a month ago but I was busy and then sick. Enjoy!
How to build a meaningful career Topic: How to define what &amp;ldquo;success&amp;rdquo; means to you in your career and then be successful.</description>
    </item>
    
    <item>
      <title>A better explanation of the Liskov Substitution Principle</title>
      <link>https://www.hillelwayne.com/post/lsp/</link>
      <pubDate>Tue, 07 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/lsp/</guid>
      <description>Short version: If X inherits from Y, then X should pass all of Y&amp;rsquo;s black box tests.
I first encountered this idea at SPLASH 2021.
The longer explanation A bit of background In A Behavioral Notion of Subtyping Liskov originally defined subtyping in inherited objects as follows:
 Subtype Requirement: Let P(x) be a property provable about objects x of type T. Then P(y) should be true for objects y of type S where S is a subtype of T.</description>
    </item>
    
    <item>
      <title>Learn AutoHotKey by stealing my scripts</title>
      <link>https://www.hillelwayne.com/post/ahk-scripts-project/</link>
      <pubDate>Mon, 21 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/ahk-scripts-project/</guid>
      <description>tl;dr annotated AHK scripts here.
Anybody who&amp;rsquo;s spent time with me knows how much I love AutoHotKey, the flat-out best Windows automation tool in the world. Anybody&amp;rsquo;s who&amp;rsquo;s tried to use AutoHotKey knows how intimidating it can be. So to help with that, I&amp;rsquo;m sharing (almost) all of my scripts along with extensive explanations. There&amp;rsquo;s fourteen files in total, covering (among other things):
 Fast open specific folders on your computer Fast insertion of the current date, em-dashes, and ¯\_(ツ)_/¯s How to extend any program with new hotkeys A modal hotkey system if you&amp;rsquo;re a vim fan like me A simple GUI demo A script to convert any timestamp into UTC and your local time:    This is also an example of an educational codebase, a codebase designed specifically from people to learn from.</description>
    </item>
    
    <item>
      <title>My Problem With the Four-Document Model</title>
      <link>https://www.hillelwayne.com/post/problems-with-the-4doc-model/</link>
      <pubDate>Wed, 05 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/problems-with-the-4doc-model/</guid>
      <description>Two universal facts about user documentation:
 Documentation is really important. We are really bad at writing it.  We don&amp;rsquo;t have good theories on what makes for useful documentation. That is except for the four document model, or Diátaxis.1 I&amp;rsquo;m glad that people use it. I&amp;rsquo;m also a little frustrated that people use it even when its inappropriate. My problem is that it&amp;rsquo;s not a universal or comprehensive model: there&amp;rsquo;s a lot of documentation people need to write that doesn&amp;rsquo;t neatly fit the model.</description>
    </item>
    
    <item>
      <title>Somehow AutoHotKey is kinda good now</title>
      <link>https://www.hillelwayne.com/post/ahk-v2/</link>
      <pubDate>Wed, 03 May 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/ahk-v2/</guid>
      <description>img {border-style: groove; border-width: 1px;} I love Autohotkey so much that it keeps me on Windows. It&amp;rsquo;s the best GUI automation tool out there. Here&amp;rsquo;s a shortcut that opens my current browser tab in the Wayback Machine:
#HotIf WinActive(&amp;quot;ahk_exe firefox.exe&amp;quot;) &amp;gt;!^s:: { Keywait(&amp;quot;RControl&amp;quot;) Keywait(&amp;quot;RAlt&amp;quot;) SendEvent(&amp;quot;^l&amp;quot;) SendInput(&amp;quot;{left}https://web.archive.org/web/*/{enter}&amp;quot;) } #HotIf  By comparison, the official extension takes four files to do the same thing. Four files!1
But I come here to bury AHK, not to praise it.</description>
    </item>
    
    <item>
      <title>Breaking the limits of TLA&#43; model checking</title>
      <link>https://www.hillelwayne.com/post/graphing-tla/</link>
      <pubDate>Mon, 17 Apr 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/graphing-tla/</guid>
      <description>I haven&amp;rsquo;t written much about TLA+ on the blog since the new learntla went up. Any examples or special topics I think of go there instead. But I recently thought of a cool demo that doesn&amp;rsquo;t quite fit the theme of that book: there are some things you can&amp;rsquo;t easily check with the model checker but can check if you work with the state space as a directed graph.</description>
    </item>
    
    <item>
      <title>Ten weird things you can buy online (and why you would)</title>
      <link>https://www.hillelwayne.com/post/weird-things-you-can-buy/</link>
      <pubDate>Sat, 01 Apr 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/weird-things-you-can-buy/</guid>
      <description>It&amp;rsquo;s April Cools! It&amp;rsquo;s like April Fools, except instead of cringe comedy you make genuine content that&amp;rsquo;s different from your normal stuff.1 For example, last year I talked about owning a microscope. This year I debated doing another hobby but settled on a much dumber topic.
Have you ever seen those lists of weird things you can buy online? It&amp;rsquo;s always just novelties and gag gifts. I&amp;rsquo;m much more interested in the weird things with a legitimate use case.</description>
    </item>
    
    <item>
      <title>That Time Indiana Almost Made π 3.2</title>
      <link>https://www.hillelwayne.com/post/indiana-pi-bill/</link>
      <pubDate>Tue, 14 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/indiana-pi-bill/</guid>
      <description>I originally ran this on my newsletter last year but I like it way too much to let it rot in the archives. Enjoy!
Happy Pi Day!1 To celebrate I want to get away from software for a bit and talk about something special. You may have heard the story that the Indiana legislature tried to change the value of π, to something like 3 or 4 or 3.15 or something like that.</description>
    </item>
    
    <item>
      <title>A Neovim Task Runner in 30 lines of Lua</title>
      <link>https://www.hillelwayne.com/post/task-runner-neovim/</link>
      <pubDate>Mon, 13 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/task-runner-neovim/</guid>
      <description>I like how easy it is to configure neovim. Last month I wanted a task runner for a very particular use-case that none of the available plugins handled. So I wrote my own.
Show CodeThis is not good code.
vim.g.global_task = {} function LoadTask(cmd, num, silent) local tmp = vim.g.global_task -- (a) if not num then num = vim.tbl_count(vim.g.global_task) + 1 end tmp[tonumber(num)] = cmd -- (a) vim.</description>
    </item>
    
    <item>
      <title>NP-Complete isn&#39;t (always) Hard</title>
      <link>https://www.hillelwayne.com/post/np-hard/</link>
      <pubDate>Mon, 20 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/np-hard/</guid>
      <description>A common assumption I see on the &amp;lsquo;net is that NP-complete problems are impossible to solve. I recently read that dependency management in Python is hard because package resolution is NP-complete. This is true in principle, but the reality is more complicated. When we say &amp;ldquo;NP-complete is hard&amp;rdquo; we&amp;rsquo;re talking about worst-case complexity, and the average-case complexity is often much more tractable. Many industry problems are &amp;ldquo;well-behaved&amp;rdquo; and modern SAT solvers can solve them quickly.</description>
    </item>
    
    <item>
      <title>Sources of Complexity: Constraints</title>
      <link>https://www.hillelwayne.com/post/complexity-constraints/</link>
      <pubDate>Mon, 23 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/complexity-constraints/</guid>
      <description>Complexity is bad. Simple software is better than complex software.
But software is complex for a reason. While people like coming up with grand theories of complexity (Simple Made Easy, No Silver Bullet) there&amp;rsquo;s very little info out there on the nitty-gritty specific sources of complexity. Without that, all the theories feel to me like the four elements theory. We just don&amp;rsquo;t have the data needed to come up with something more predictive.</description>
    </item>
    
    <item>
      <title>Let&#39;s Prove Leftpad</title>
      <link>https://www.hillelwayne.com/post/lpl/</link>
      <pubDate>Wed, 16 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/lpl/</guid>
      <description>img {border-style: groove;} Someone recently told me a project isn&amp;rsquo;t real until you do a retrospective, so I think it&amp;rsquo;s time to do one for Let&amp;rsquo;s Prove Leftpad. Short explanation: it&amp;rsquo;s a repository of proofs of leftpad, in different proof systems.
Long explanation: the rest of this post.
Background I&amp;rsquo;m into formal methods, the discipline of proving software correct. Consider the following contrived code:
def add(x: int, y: int): int { if(x == 12976 &amp;amp;&amp;amp; y == 14867) { return x - y; } return x + y; }  This typechecks, and any black-box unit test would find that add(x, y) == x + y.</description>
    </item>
    
    <item>
      <title>Notes on Every Strangeloop 2022 Talk I Attended</title>
      <link>https://www.hillelwayne.com/post/strangeloop-22/</link>
      <pubDate>Wed, 02 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/strangeloop-22/</guid>
      <description>This is my writeup of all the talks I saw at Strangeloop, written on the train ride back, while the talks were still fresh in my mind. Now that all the talks are online I can share it!
Next year&amp;rsquo;s the last Strange Loop. You can buy tickets here.
Opening Keynote: How expert programmers think about errors Topic: What we empirically know about how experts write code.
Ultimately found a lot of it pretty conventional.</description>
    </item>
    
    <item>
      <title>Safety and Liveness Properties</title>
      <link>https://www.hillelwayne.com/post/safety-and-liveness/</link>
      <pubDate>Tue, 06 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/safety-and-liveness/</guid>
      <description>img {border-style: groove; border-width: 1px; padding: 5px; } 
Sounds like I should write a post on safety and liveness!
First, some definitions. A system is anything that has changing state. This is an incredibly broad definition that covers a wide variety of situations, like:
 Two threads in a thread scheduler Five servers behind a load balancer A reader and writer communicating on a FIFO queue A business workflow being manually followed A person waiting for the bus Etc.</description>
    </item>
    
    <item>
      <title>Software Mimicry</title>
      <link>https://www.hillelwayne.com/post/software-mimicry/</link>
      <pubDate>Mon, 29 Aug 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/software-mimicry/</guid>
      <description>Mimicry is when software X reimplements at a higher level a core feature of software Y. The produced facsimile has some, but not all, of the same properties, enough to &amp;ldquo;look like&amp;rdquo; it&amp;rsquo;s the same thing but missing many of the nuances. This exists in every kind of software. One language can mimic another, a library can mimic a language, a database engine can mimic a product, etc.
Example Design Patterns introduces the strategy pattern to apply multiple algorithms to the same call:</description>
    </item>
    
    <item>
      <title>Crimes with Python&#39;s Pattern Matching</title>
      <link>https://www.hillelwayne.com/post/python-abc/</link>
      <pubDate>Sun, 31 Jul 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/python-abc/</guid>
      <description>One of my favorite little bits of python is __subclasshook__. Abstract Base Classes with __subclasshook__ can define what counts as a subclass of the ABC, even if the target doesn&amp;rsquo;t know about the ABC. For example:
class PalindromicName(ABC): @classmethod def __subclasshook__(cls, C): name = C.__name__.lower() return name[::-1] == name class Abba: ... class Baba: ... &amp;gt;&amp;gt;&amp;gt; isinstance(Abba(), PalindromicName) True &amp;gt;&amp;gt;&amp;gt; isinstance(Baba(), PalindromicName) False  You can do some weird stuff with this.</description>
    </item>
    
    <item>
      <title>Announcing: Learn TLA&#43;</title>
      <link>https://www.hillelwayne.com/post/learntla/</link>
      <pubDate>Fri, 01 Jul 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/learntla/</guid>
      <description>tl;dr: online TLA+ manual/advanced techniques/examples here.
TLA+ is a tool for testing abstract software designs. I first stumbled on it in 2016 and found it so useful I wrote a free online guide to help others learn it. Then I decided the guide wasn&amp;rsquo;t good enough and wrote Practical TLA+ in 2018. Then I decided the book wasn&amp;rsquo;t good enough and needed a second edition.
Just kidding! Book&amp;rsquo;s never getting a second edition, because it costs $26 and no matter how good I make it, it&amp;rsquo;s never going to have the reach of a free resource.</description>
    </item>
    
    <item>
      <title>I ❤️ Microscopes</title>
      <link>https://www.hillelwayne.com/post/microscopy/</link>
      <pubDate>Fri, 01 Apr 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/microscopy/</guid>
      <description>To celebrate April Fools, some friends and I made content outside our normal brands. You can see the full list of pieces here!
Also, CW: grody gross-up pictures of bugs.
I&amp;rsquo;ve always loved science. At one time, I thought it&amp;rsquo;d be my career: I got BAs in math and physics with the hope of eventually becoming a physicist. But my friend&amp;rsquo;s horror stories of grad school scared me off and I instead left academia and got a job programming.</description>
    </item>
    
    <item>
      <title>Hiatus</title>
      <link>https://www.hillelwayne.com/post/haitus/</link>
      <pubDate>Sun, 13 Feb 2022 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/haitus/</guid>
      <description>I&amp;rsquo;m not letting myself work on software content for the website until I finish both the Alloydocs update and the learntla rewrite.
(I&amp;rsquo;ll still be writing the weekly newsletter.)
UPDATE: Currently 12,000 words into the learntla rewrite. If I don&amp;rsquo;t have something I&amp;rsquo;m happy enough to share by the end of June, I&amp;rsquo;ll give $1,000 to a random newsletter subscriber (or the charity of their choice).</description>
    </item>
    
    <item>
      <title>Using Abstract Data Types in TLA&#43;</title>
      <link>https://www.hillelwayne.com/post/tla-adt/</link>
      <pubDate>Mon, 13 Dec 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/tla-adt/</guid>
      <description>In my 2021 TLAConf Talk I introduced a technique for encoding abstract data types (ADTs). For accessibility I&amp;rsquo;m reproducing it here. This post is aimed at intermediate-level TLA+ users who already understand action properties and the general concept of refinement.
Say we want to add a LIFO stack to a specification. You can push to and pop from the end of this stack but you cannot change data in the middle.</description>
    </item>
    
    <item>
      <title>Alloy 6: it&#39;s about Time</title>
      <link>https://www.hillelwayne.com/post/alloy6/</link>
      <pubDate>Mon, 29 Nov 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/alloy6/</guid>
      <description>Alloy is a powerful formal specification language, but it&amp;rsquo;s historically been weak at modeling concurrency. AWS raised this as a critical issue for why they went with TLA+. Alloy writers built a lot of tricks to emulate time, but it can feel like you&amp;rsquo;re working against the language.
Alloy 6 aims to change that with built-in temporal operators. Right now it&amp;rsquo;s poorly documented, and since I maintain the alloydocs, I sat down and figured it all out.</description>
    </item>
    
    <item>
      <title>How to Solve the Sudoku Puzzle with programming</title>
      <link>https://www.hillelwayne.com/post/sudoku/</link>
      <pubDate>Sun, 10 Oct 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/sudoku/</guid>
      <description>A Sudoku Puzzle is a famous Japanese puzzle. In it you solve a 9 by 9 grid of numbers, but you don&amp;rsquo;t need to do any math to solve the sudoku puzzle! In each number you put a row and column, and also a number in each box.
  We will solve the Sudoku Puzzle with programming, by writing a program that solves the Sudoku Puzzle. This can be done in any programming language.</description>
    </item>
    
    <item>
      <title>Specification Refinement</title>
      <link>https://www.hillelwayne.com/post/refinement/</link>
      <pubDate>Tue, 13 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/refinement/</guid>
      <description>When teaching formal methods, I often get asked how we can connect the specifications we write to the code we produce. One way we do this is with refinement. All examples are in TLA+.1
Imagine we&amp;rsquo;re designing a multithreaded counter. We don&amp;rsquo;t know how we&amp;rsquo;re going to implement it yet, so we start by specifying the abstract behavior.2
---- MODULE abstract ---- EXTENDS Integers, Sequences VARIABLES pc, counter vars == &amp;lt;&amp;lt;pc, counter&amp;gt;&amp;gt; \* Two threads Threads == 1.</description>
    </item>
    
    <item>
      <title>Cross-Branch Testing</title>
      <link>https://www.hillelwayne.com/post/cross-branch-testing/</link>
      <pubDate>Mon, 28 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/cross-branch-testing/</guid>
      <description>This was originally a newsletter post I wrote back in December, but I kept coming back to the idea and wanted to make it easier to find. I&amp;rsquo;ve made some small edits for flow.
There&amp;rsquo;s a certain class of problems that&amp;rsquo;s hard to test:
 The output isn&amp;rsquo;t obviously inferable from the input. The code isn&amp;rsquo;t just solving a human-tractable problem really quickly, it&amp;rsquo;s doing something where we don&amp;rsquo;t know the answer without running the program.</description>
    </item>
    
    <item>
      <title>Clever vs Insightful Code</title>
      <link>https://www.hillelwayne.com/post/cleverness/</link>
      <pubDate>Sun, 06 Jun 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/cleverness/</guid>
      <description>&amp;ldquo;Don&amp;rsquo;t write clever code.&amp;rdquo; Why not? &amp;ldquo;Because it&amp;rsquo;s hard to understand.&amp;rdquo; People who say this think of clever code such as Duff&amp;rsquo;s Device:
Duff&amp;#39;s Devicesend(to, from, count) registershort*to, *from; registercount; { registern =(count +7) /8; switch(count %8) { case0: do{ *to =*from++; case7: *to =*from++; case6: *to =*from++; case5: *to =*from++; case4: *to =*from++; case3: *to =*from++; case2: *to =*from++; case1: *to =*from++; } while(--n &amp;gt;0); } }  show allThis code is &amp;ldquo;clever&amp;rdquo; because it exploits knowledge about the language, in this case the peculiarities of fall-through.</description>
    </item>
    
    <item>
      <title>Why Specifications Don&#39;t Compose</title>
      <link>https://www.hillelwayne.com/post/spec-composition/</link>
      <pubDate>Sun, 18 Apr 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/spec-composition/</guid>
      <description>Recently my friend Lars Hupel and I had a discussion on why formal methods don&amp;rsquo;t compose well. You can read the conversation here. We focused mostly on composing formally-verified code. I want to talk a little more about the difficulties in composing specifications. This is half because it&amp;rsquo;s difficult for interesting reasons and half because it&amp;rsquo;s a common question from beginners.
Beginners to formal specification expect specifications should be organized like programs: multiple independent modules that interact through public interfaces, where the modules don&amp;rsquo;t know about each others&amp;rsquo; private implementations.</description>
    </item>
    
    <item>
      <title>Why Do Interviewers Ask Linked List Questions?</title>
      <link>https://www.hillelwayne.com/post/linked-lists/</link>
      <pubDate>Sun, 28 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/linked-lists/</guid>
      <description>A couple years back I gave a talk on researching software history, using &amp;ldquo;linked list interview questions&amp;rdquo; as an example topic. Since referring people to a video is less accessible than just writing a blog post, I&amp;rsquo;ve reproduced the question here.
So why do interviewers like to ask linked list questions? If you ask people, you usually get one of two answers:
 &amp;ldquo;It tests CS fundamentals.&amp;rdquo; &amp;ldquo;It tests reasoning through a new problem.</description>
    </item>
    
    <item>
      <title>TLA&#43; Action Properties</title>
      <link>https://www.hillelwayne.com/post/action-properties/</link>
      <pubDate>Thu, 25 Feb 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/action-properties/</guid>
      <description>There&amp;rsquo;s not a whole lot on TLA+ technique out there: all the resources are either introductions or case studies. Good for people starting out, bad for people past that. I think we need to write more intermediate-level stuff, what Ben Kuhn calls Blub studies. Here&amp;rsquo;s an attempt at that.
Most TLA+ properties are invariants, properties that must be true for every state in the behavior. If we have a simple counter:</description>
    </item>
    
    <item>
      <title>What engineering can teach (and learn from) us</title>
      <link>https://www.hillelwayne.com/post/what-we-can-learn/</link>
      <pubDate>Fri, 22 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/what-we-can-learn/</guid>
      <description>This is part three of the crossover project. Part one is here and part two is here. A conference talk based on this work is now available here.
I met William at Deconstruct 2019.1 We were walking back from the pre-party—too loud for my comfort level—and I took the chance to interview him. He knew about my project and wanted to share his memories of mechanical engineering.
&amp;ldquo;Most of my skills transferred seamlessly.</description>
    </item>
    
    <item>
      <title>We Are Not Special</title>
      <link>https://www.hillelwayne.com/post/we-are-not-special/</link>
      <pubDate>Wed, 20 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/we-are-not-special/</guid>
      <description>This is part two of the crossover project. Part one is here and part three is here. A conference talk based on this work is now available here.
 No one thinks about moving the starting or ending point of the bridge midway through construction. -Justin Cave
I had to move a bridge. -Anonymous1
 Carl worked as a mechanical verification engineer: he tested oil rigs to see how much they vibrated.</description>
    </item>
    
    <item>
      <title>Are We Really Engineers?</title>
      <link>https://www.hillelwayne.com/post/are-we-really-engineers/</link>
      <pubDate>Mon, 18 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/are-we-really-engineers/</guid>
      <description>This is part one of the Crossover Project. Part two is here and part three is here. A conference talk based on this work is now available here.
I sat in front of Mat, idly chatting about tech and cuisine. Before now, I had known him mostly for his cooking pictures on Twitter, the kind that made me envious of suburbanites and their 75,000 BTU woks. But now he was the test subject for my new project, to see if it was going to be fruitful or a waste of time.</description>
    </item>
    
    <item>
      <title>There&#39;s Always More History</title>
      <link>https://www.hillelwayne.com/post/always-more-history/</link>
      <pubDate>Tue, 08 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/always-more-history/</guid>
      <description>Last month I researched two historical questions. I originally posted summaries on Twitter and am reproducing both here.1
Why Vim Uses hjkl Question: Why does Vim use hjkl and not the arrow keys for navigation?
Common Explanation: It keeps your fingers on the home row.
Historical Explanation: Bill Joy developed vi on the ADM-3A, which didn&amp;rsquo;t have dedicated arrow keys. If you look at the ADM keyboard, it put the arrow keys on the hjkl keys.</description>
    </item>
    
    <item>
      <title>Two workers are quadratically better than one</title>
      <link>https://www.hillelwayne.com/post/queueing-prism/</link>
      <pubDate>Mon, 02 Nov 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/queueing-prism/</guid>
      <description>For latency, anyway.
A common architecture pattern is the &amp;ldquo;task queue&amp;rdquo;: tasks enter an ordered queue, workers pop tasks and process them. This pattern is used everywhere from distributed systems to thread pools. It applies just as well to human systems, like waiting in line at a supermarket or a bank. Task queues are popular because they are simple, easy to understand, and scale well.
There are two primary performance metrics for a task queue.</description>
    </item>
    
    <item>
      <title>Software correctness is a lot like flossing</title>
      <link>https://www.hillelwayne.com/post/flossing/</link>
      <pubDate>Wed, 28 Oct 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/flossing/</guid>
      <description>My work brings me though a lot of software correctness techniques, things like type theory, test-driven development (TDD), and formal methods. The surrounding communities all have the same problem: they can&amp;rsquo;t get people using these techniques. They all ask &amp;ldquo;Don&amp;rsquo;t people care about correct software?&amp;rdquo; To which the insiders usually answer &amp;ldquo;programmers don&amp;rsquo;t care about correctness, they just care about shoveling out garbage to make money!&amp;rdquo;
I&amp;rsquo;ve heard this from every single community I&amp;rsquo;ve explored, many of which are in direct conflict with each other.</description>
    </item>
    
    <item>
      <title>Finding Goroutine Bugs with TLA&#43;</title>
      <link>https://www.hillelwayne.com/post/tla-golang/</link>
      <pubDate>Fri, 25 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/tla-golang/</guid>
      <description>My job these days is teaching TLA+ and formal methods: specifying designs to find bugs in them. But just knowing the syntax isn&amp;rsquo;t enough to write specs, and it helps to have examples to draw from. I recently read Chris Siebenmann&amp;rsquo;s Even in Go, concurrency is still not easy and thought it would make a good case study for writing a spec. In it, he gives an example of Go code which deadlocks:</description>
    </item>
    
    <item>
      <title>Decision Table Patterns</title>
      <link>https://www.hillelwayne.com/post/decision-table-patterns/</link>
      <pubDate>Wed, 09 Sep 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/decision-table-patterns/</guid>
      <description>Decision tables are easy, simple, and powerful. You can teach them in five minutes and write one in half that time. You can look at a table and understand what it&amp;rsquo;s saying, see if it matches your problem, and check for design flaws. So it&amp;rsquo;s kinda weird that there&amp;rsquo;s basically nothing about them online. I wrote an introduction a while back, but I want something a little more formal. So this post will reintroduce the core ideas in a more formal way and then talk about some of the techniques you can apply to make better tables.</description>
    </item>
    
    <item>
      <title>J Notation as a Tool of Thought</title>
      <link>https://www.hillelwayne.com/post/j-notation/</link>
      <pubDate>Fri, 14 Aug 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/j-notation/</guid>
      <description>Kenneth Iverson&amp;rsquo;s 1964 language, APL, won him the Turing Award. His award lecture, Notation as a Tool of Thought, argued that better notations would lead people to deeper insights about mathematics. He provided a number of examples ranging across linear algebra, arithmetic, probability, and logic.
Unfortunately, most of the mathematics he covers isn&amp;rsquo;t relevant to programming. However, his core idea still applies, and changing how we describe programs changes how we think about them.</description>
    </item>
    
    <item>
      <title>A Better Cheatsheet</title>
      <link>https://www.hillelwayne.com/post/cheatsheets/</link>
      <pubDate>Fri, 24 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/cheatsheets/</guid>
      <description>Now that teach workshops for a living, I spend a lot of time on making better workshops. One improvement I made was creating progressive cheatsheets. I&amp;rsquo;ll discuss the motivation and implementation below, but this is the high level picture:
 .gallery { display: flex; text-align: center; } .gallery a { margin: 5px; border-width: 1px; border-style: solid; }      Progressions #1 and #2 of the cheatsheet. Click for full size.</description>
    </item>
    
    <item>
      <title>The Frink is Good, the Unit is Evil</title>
      <link>https://www.hillelwayne.com/post/frink/</link>
      <pubDate>Fri, 10 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/frink/</guid>
      <description>One day Alan Eliasen read a fart joke and got so mad he invented a programming language. 20 years later Frink is one of the best special purpose languages for dealing with units.
&amp;ldquo;But why do we need a language just for dealing with units?&amp;rdquo; Glad you asked!
Intro to Units A unit is the physical property a number represents, like distance or time. We almost always are talking about SI units, or Système international.</description>
    </item>
    
    <item>
      <title>Weak and Strong Fairness</title>
      <link>https://www.hillelwayne.com/post/fairness/</link>
      <pubDate>Fri, 03 Jul 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/fairness/</guid>
      <description>I&amp;rsquo;m in the process of revising some of my workshops. I realized that one particular important aspect of TLA+, fairness, is something that I&amp;rsquo;ve struggled to explain well. Then again, everybody struggles to explain it well! It&amp;rsquo;s also a great example of how messy concurrent systems can get, so I figured it would make a good post for the blog.
Stuttering Take the following spec of a clock. I used TLA+ but it should mostly be clear from context:</description>
    </item>
    
    <item>
      <title>Property Testing with Complex Inputs</title>
      <link>https://www.hillelwayne.com/post/property-testing-complex-inputs/</link>
      <pubDate>Fri, 19 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/property-testing-complex-inputs/</guid>
      <description>This was originally written as a tutorial for Hypothesis and will eventually be reproduced there, but it might still be useful for people using other property-testing libraries. This essay assumes some familiarity with Hypothesis. If you haven&amp;rsquo;t used it, a better introduction is here.
Once you learn the basics, there are two hard parts to writing property-based tests:
 What are good properties to test? How do I generate complex inputs?</description>
    </item>
    
    <item>
      <title>Constructive vs Predicative Data</title>
      <link>https://www.hillelwayne.com/post/constructive/</link>
      <pubDate>Mon, 18 May 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/constructive/</guid>
      <description>Consider a data type that represents users, which includes &amp;ldquo;favorite people&amp;rdquo; and &amp;ldquo;blocked people&amp;rdquo;:1
data Person: favorites: set of Person blocked: set of Person  We want a validation that says that these two sets are disjoint, a.k.a. no person can belong to both sets at once. We call these kinds of validations predicates, or boolean functions that correspond to our requirements. The predicates determine if a representable item is also a valid item.</description>
    </item>
    
    <item>
      <title>In Praise of AutoHotKey</title>
      <link>https://www.hillelwayne.com/post/ahk/</link>
      <pubDate>Tue, 12 May 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/ahk/</guid>
      <description>People think it&amp;rsquo;s weird that I do all my development on a Windows machine. It&amp;rsquo;s definitely a second-class citizen experience in the wider development world, and Windows has a lot of really frustrating issues, but it&amp;rsquo;s still my favorite operating system. This is for exactly one reason: AutoHotKey.
AHK is an engine for mapping keystrokes to scripts. I wouldn&amp;rsquo;t call it particularly elegant, and it&amp;rsquo;s filled with tons of redundancy and quirks.</description>
    </item>
    
    <item>
      <title>The Hard Part of Learning a Language</title>
      <link>https://www.hillelwayne.com/post/learning-a-language/</link>
      <pubDate>Mon, 27 Apr 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/learning-a-language/</guid>
      <description>I want to do $THING. Normally I do my hacking in Python, which is okay but has lots of frustrations. My friends tell me $LANGUAGE is better for doing $THING. After going through the online tutorial, I can see why. Maybe I&amp;rsquo;ll try $LANGUAGE for this project! Just a few things I need to figure out first:
 How do I install it? The docs say brew install, but I&amp;rsquo;m on Windows.</description>
    </item>
    
    <item>
      <title>Announcing: Alloydocs</title>
      <link>https://www.hillelwayne.com/post/alloydocs/</link>
      <pubDate>Mon, 13 Apr 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/alloydocs/</guid>
      <description>tl;dr: online Alloy reference here.
If you&amp;rsquo;ve read this blog at all you probably know I&amp;rsquo;m a big fan of Alloy. It&amp;rsquo;s a simple, powerful formal method whose entire syntax fits in just two pages. You can learn it in a day and be productive in two. And it can be used to model everything from package management to database migrations to authorization systems.
Two years ago I was invited to the Workshop on the Future of Alloy.</description>
    </item>
    
    <item>
      <title>10 Most(ly dead) Influential Programming Languages</title>
      <link>https://www.hillelwayne.com/post/influential-dead-languages/</link>
      <pubDate>Wed, 25 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/influential-dead-languages/</guid>
      <description>The other day I read 20 most significant programming languages in history, a &amp;ldquo;preposterous table I just made up.&amp;rdquo; He certainly got preposterous right: he lists Go as &amp;ldquo;most significant&amp;rdquo; but not ALGOL, Smalltalk, or ML. He also leaves off Pascal because it&amp;rsquo;s &amp;ldquo;mostly dead&amp;rdquo;. Preposterous! That defeats the whole point of what &amp;ldquo;significant in history&amp;rdquo; means.
So let&amp;rsquo;s talk about some &amp;ldquo;mostly dead&amp;rdquo; languages and why they matter so much.</description>
    </item>
    
    <item>
      <title>This is How Science Happens</title>
      <link>https://www.hillelwayne.com/post/this-is-how-science-happens/</link>
      <pubDate>Mon, 09 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/this-is-how-science-happens/</guid>
      <description>I love science. Not the &amp;ldquo;space is beautiful&amp;rdquo; faux-science, but the process of doing science. Hours spent calibrating equipment, cross-checking cites of cites of cites, tedious arguments about p-values and prediction intervals, all the stuff that makes science Go. And, when it does happen, the drama. I also want us to use more empirical science in software. That&amp;rsquo;s why I wrote a talk on it!
One thing lay folk don&amp;rsquo;t realize is that science is social.</description>
    </item>
    
    <item>
      <title>Feature Interaction Bugs</title>
      <link>https://www.hillelwayne.com/post/feature-interaction/</link>
      <pubDate>Wed, 05 Feb 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/feature-interaction/</guid>
      <description>In most testing frameworks, you&amp;rsquo;re expected to write a lot of low-level tests and few high-level tests. The reasoning is that end-to-end tests are slow and expensive and only cover a tiny amount of the program&amp;rsquo;s state space. It&amp;rsquo;s better to focus on testing all the parts in isolation versus testing that they all work together.
In practice, global correctness does not follow from local correctness. It&amp;rsquo;s possible for every part to be individually rock-solid but the system to be broken as a whole.</description>
    </item>
    
    <item>
      <title>The Business Case for Formal Methods</title>
      <link>https://www.hillelwayne.com/post/business-case-formal-methods/</link>
      <pubDate>Wed, 22 Jan 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/business-case-formal-methods/</guid>
      <description>This is an &amp;ldquo;intro packet&amp;rdquo; you can use to argue for the benefits of formal methods (FM) to your boss. It&amp;rsquo;s a short explanation, a list of benefits and case studies, and a demo. Everything&amp;rsquo;s in TLA+, but the arguments apply equally well to Alloy, B, statecharts, etc. Adapt the material to your specific needs.
Quick notational note: I&amp;rsquo;m leaving out the code verification side of formal methods, mostly because design verification is a much easier sell.</description>
    </item>
    
    <item>
      <title>Hypermodeling Hyperproperties</title>
      <link>https://www.hillelwayne.com/post/hyperproperties/</link>
      <pubDate>Mon, 13 Jan 2020 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/hyperproperties/</guid>
      <description>When we design programs, we usually look for two kinds of properties: that &amp;ldquo;bad things&amp;rdquo; never happen and that &amp;ldquo;good things&amp;rdquo; are guaranteed to happen. These are called safety and liveness properties, respectively. These are properties that we want to hold true for every possible program behavior. &amp;ldquo;We always complete every request&amp;rdquo; is a liveness property. If our system has it, every program trace will complete every request. If it doesn&amp;rsquo;t hold, I can give you a example behavior where the server never responds.</description>
    </item>
    
    <item>
      <title>How fast do I talk?</title>
      <link>https://www.hillelwayne.com/post/talk-fast/</link>
      <pubDate>Mon, 28 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/talk-fast/</guid>
      <description>I speak very fast. It&amp;rsquo;s like the words are piled up in my mouth and I can&amp;rsquo;t say one without the rest tumbling out. Through my whole life people have told me to slow down, speak more clearly, and enunciate. I can do it if I concentrate but I quickly relapse into gushing out words.
As I now give lots of conference talks, this has become a professional issue:</description>
    </item>
    
    <item>
      <title>Formally Modeling Database Migrations</title>
      <link>https://www.hillelwayne.com/post/formally-modeling-migrations/</link>
      <pubDate>Wed, 09 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/formally-modeling-migrations/</guid>
      <description>Most of my formal methods examples deal with concurrency, because time is evil and I hate it. While FM is very effective for that, it gives people a limited sense of how flexible these tools are. One of the most common questions I get from people is
 Formal methods looks really useful for distributed systems, but I&amp;rsquo;m not making a distributed system. Is FM still useful for me?</description>
    </item>
    
    <item>
      <title>Python Negatypes</title>
      <link>https://www.hillelwayne.com/negatypes/</link>
      <pubDate>Thu, 26 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/negatypes/</guid>
      <description>Back in 2007 Python added Abstract Base Classes, which were intended to be used as interfaces:
from abc import ABC class AbstractIterable(ABC): @abstractmethod def __iter__(self): while False: yield None def get_iterator(self): return self.__iter__()  ABCs were added to strengthen the duck typing a little. If you inherited AbstractIterable, then everybody knew you had an implemented __iter__ method, and could handle that appropriately.
Unsurprisingly, this idea never caught on. People instead prefered &amp;ldquo;better ask forgiveness than permission&amp;rdquo; and wrapped calls to __iter__ in a try block.</description>
    </item>
    
    <item>
      <title>Performance Matters</title>
      <link>https://www.hillelwayne.com/post/performance-matters/</link>
      <pubDate>Wed, 07 Aug 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/performance-matters/</guid>
      <description>Last year I got certified as an EMT. As part of the training I shadowed an ambulance for a day and assisted with each run. For each patient we treated, we had to fill out a patient care report.
 A patient care report. (source)  EMTs are just one part in a long chain. If they transport a patient to a hospital, the hospital needs to know everything about the patient and everything that happened since the call.</description>
    </item>
    
    <item>
      <title>Modeling Missing Requirements</title>
      <link>https://www.hillelwayne.com/requirements/</link>
      <pubDate>Mon, 15 Jul 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/requirements/</guid>
      <description>Many bugs are implementation errors: there is a mistake in the code that makes it not do what you wanted it to do. For example, you may have accidentally left out the &amp;ldquo;list is empty&amp;rdquo; case, or written a nonterminating function. You can identify it as &amp;ldquo;definitely wrong&amp;rdquo; for a given input. Most testing, in fact most writing on software correctness, deals primarily with implementation errors.
Above that we have specification errors.</description>
    </item>
    
    <item>
      <title>Probabilistic Modeling with PRISM</title>
      <link>https://www.hillelwayne.com/post/prism/</link>
      <pubDate>Mon, 17 Jun 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/prism/</guid>
      <description>In my job I dig up a lot of obscure techniques. Some of them are broadly useful: formal specification, design-by-contract, etc. These I specialize in. Some of them are useful, but for a smaller group of programmers. That&amp;rsquo;s stuff like metamorphic testing, theorem proving, constraint solving. These I write articles about.
Then there&amp;rsquo;s the stuff where I have no idea how to make it useful. Either they&amp;rsquo;re so incredibly specialist or they could be useful if it weren&amp;rsquo;t for some deep problems.</description>
    </item>
    
    <item>
      <title> At least one Vim trick you might not know </title>
      <link>https://www.hillelwayne.com/post/intermediate-vim/</link>
      <pubDate>Fri, 31 May 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/intermediate-vim/</guid>
      <description>I&amp;rsquo;ve been using Vim for eight years and am still discovering new things. This is usually seen as a Good Thing About Vim. In my head, though, it&amp;rsquo;s a failing of discoverability: I keep discovering new things because Vim makes it so hard to know what&amp;rsquo;s available.
While people often talk about the beauty of modal editing or text objects, I don&amp;rsquo;t think that gets at the essence of Vim.</description>
    </item>
    
    <item>
      <title>Alan Kay Did Not Invent Objects</title>
      <link>https://www.hillelwayne.com/post/alan-kay/</link>
      <pubDate>Wed, 22 May 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/alan-kay/</guid>
      <description>People keep claiming that modern OOP languages aren&amp;rsquo;t &amp;ldquo;really OOP&amp;rdquo; because they don&amp;rsquo;t follow Alan Kay&amp;rsquo;s definition of &amp;ldquo;OOP&amp;rdquo;. I can see the logic here, even if I disagree the conclusion. More recently I&amp;rsquo;ve seen people start claiming that Kay invented objects entirely. This is factually incorrect.
Alan Kay did not invent objects. They come from Simula, which the Smalltalk-72 manual cites as a major inspiration (pg 117). The famous 1981 Byte magazine issue that popularized Smalltalk and OOP explicitly says &amp;ldquo;the fundamental idea of objects, messages, and classes came from SIMULA.</description>
    </item>
    
    <item>
      <title>Modeling Adversaries with TLA&#43;</title>
      <link>https://www.hillelwayne.com/post/adversaries/</link>
      <pubDate>Sun, 05 May 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/adversaries/</guid>
      <description>A common question I get about specs is how to model bad actors. Usually this is one of two contexts:
 The spec involves several interacting agents sharing a protocol, but some of the nodes are faulty or malicious: they will intentionally try to subvert the system. The spec involves an agent subject to outside forces, like someone can throw a rock at your sensor.  These &amp;ldquo;open world&amp;rdquo; situations are a great place to use formal methods.</description>
    </item>
    
    <item>
      <title>Finding Property Tests</title>
      <link>https://www.hillelwayne.com/post/contract-examples/</link>
      <pubDate>Mon, 08 Apr 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/contract-examples/</guid>
      <description>A while back I was ranting about APLs and included this python code to get the mode of a list:
def mode(l): max = None count = {} for x in l: if x not in count: count[x] = 0 count[x] += 1 if not max or count[x] &amp;gt; count[max]: max = x return max  There&amp;rsquo;s a bug in it. Do you see it? If not, try running it on the list [0, 0, 1]:</description>
    </item>
    
    <item>
      <title>Metamorphic Testing</title>
      <link>https://www.hillelwayne.com/post/metamorphic-testing/</link>
      <pubDate>Mon, 25 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/metamorphic-testing/</guid>
      <description>Confession: I read the ACM Magazine. This makes me a dweeb even in programming circles. One of the things I found in it is &amp;ldquo;Metamorphic Testing&amp;rdquo;. I&amp;rsquo;ve never heard of it, and nobody I knew heard about it either. But the academic literature was shockingly impressive: many incredibly successful case studies in wildly different fields. So why haven&amp;rsquo;t we heard of it before? There&amp;rsquo;s only one article anywhere targeted at people outside academia.</description>
    </item>
    
    <item>
      <title>Using Formal Methods at Work</title>
      <link>https://www.hillelwayne.com/post/using-formal-methods/</link>
      <pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/using-formal-methods/</guid>
      <description>A few people have told me that they&amp;rsquo;ve enjoyed learning formal methods but aren&amp;rsquo;t sure how to actually use it. They&amp;rsquo;re mostly doing short sprints at work and aren&amp;rsquo;t building new systems from scratch. This tells me there&amp;rsquo;s some confusion about what makes specifications useful, and that we need a resource on applying them in practice. This is a short guide to using specifications at work in a way that&amp;rsquo;s accessible to beginners, applicable in many contexts, and provides solid business value.</description>
    </item>
    
    <item>
      <title>Solving Knights and Knaves with Alloy</title>
      <link>https://www.hillelwayne.com/post/knights-knaves/</link>
      <pubDate>Mon, 11 Feb 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/knights-knaves/</guid>
      <description>There&amp;rsquo;s a famous logic puzzle, originally from Raymond Smullyan, called a &amp;ldquo;Knights and Knaves&amp;rdquo; puzzle. We have a set of people, all of whom are either a Knight or a Knave. Knights only make true statements, and Knaves only make false statements. Usually the goal of the puzzle is to find out who is what. For example, if we have two people, A and B, and A says &amp;ldquo;both of us are knaves&amp;rdquo;, we know A is a knave and B is a knight.</description>
    </item>
    
    <item>
      <title>Why Don&#39;t People Use Formal Methods?</title>
      <link>https://www.hillelwayne.com/post/why-dont-people-use-formal-methods/</link>
      <pubDate>Mon, 21 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/why-dont-people-use-formal-methods/</guid>
      <description>I saw this question on the Software Engineering Stack Exchange: What are the barriers that prevent widespread adoption of formal methods? The question was closed as opinion-based, and most of the answers were things like &amp;ldquo;its too expensive!!!&amp;rdquo; or &amp;ldquo;website isn&amp;rsquo;t airplane!!!&amp;rdquo; These are sorta kinda true but don&amp;rsquo;t explain very much. I wrote this to provide a larger historical picture of formal methods, why they&amp;rsquo;re actually so unused, and what we&amp;rsquo;re doing to make them used.</description>
    </item>
    
    <item>
      <title>STAMPing on event-stream</title>
      <link>https://www.hillelwayne.com/post/stamping-on-eventstream/</link>
      <pubDate>Wed, 02 Jan 2019 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/stamping-on-eventstream/</guid>
      <description>The goal of a STAMP-based analysis is to determine why the events occurred&amp;hellip; and to identify the changes that could prevent them and similar events in the future. 1
 One of my big heroes is Nancy Leveson, who did a bunch of stuff like the Therac-25 investigation and debunking N-version programming. She studies what makes software unsafe and what we can do about that. More recently she&amp;rsquo;s advocated the &amp;ldquo;STAMP model&amp;rdquo; for understanding systems.</description>
    </item>
    
    <item>
      <title>A Better Interview</title>
      <link>https://www.hillelwayne.com/post/a-better-interview/</link>
      <pubDate>Sat, 08 Dec 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/a-better-interview/</guid>
      <description>Caveats: I&amp;rsquo;m not an interviewer, I&amp;rsquo;ve never done serious research on interviews, and I haven&amp;rsquo;t tested this. I propose this entirely as a thought experiment.
Assumptions: We interview at jobs to find ideal candidates. WE are looking for candidates who are
 Good at programming Good at software engineering Can work in a team A &amp;ldquo;culture fit&amp;rdquo; (not an asshole).  Technical interviews test the first two. They are primarily whiteboard questions, abstract design questions, or &amp;ldquo;write this program&amp;rdquo; questions.</description>
    </item>
    
    <item>
      <title>Modeling Message Queues in TLA&#43;</title>
      <link>https://www.hillelwayne.com/post/tla-messages/</link>
      <pubDate>Wed, 31 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/tla-messages/</guid>
      <description>I recently did a corporate TLA+ workshop and some people asked what TLA+ specs look like in practice. If you looked at the most common public examples, you&amp;rsquo;d probably come away thinking that people only used it for critical consensus algorithms. This is a problem for two reasons: first, it makes it harder to learn TLA+, as there aren&amp;rsquo;t simpler examples to experiment with. Second, it makes it hard for people to see how TLA+ is useful for them.</description>
    </item>
    
    <item>
      <title>Practical TLA&#43; Now Available</title>
      <link>https://www.hillelwayne.com/post/practical-tla/</link>
      <pubDate>Thu, 18 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/practical-tla/</guid>
      <description>I am delighted to announce that my book, Practical TLA+, is now available! When I stumbled into TLA+ in 2016 I had no idea it would so define my passions, my values, and my career. I definitely didn&amp;rsquo;t think I&amp;rsquo;d be writing a book. But 11 months and 220 pages later, here we are! This is the largest project I&amp;rsquo;ve ever done and I&amp;rsquo;m incredibly excited to share it with you all.</description>
    </item>
    
    <item>
      <title>Optimizing MiniZinc</title>
      <link>https://www.hillelwayne.com/post/minizinc-2/</link>
      <pubDate>Sun, 30 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/minizinc-2/</guid>
      <description>This is part two of a two-part article. Part one is here.
Last time we left off with this model:
include &amp;quot;globals.mzn&amp;quot;; enum DAYS; enum ROOMS; enum TIMES; enum talks; constraint assert(card(DAYS) * card(ROOMS) * card(TIMES) == card(talks), &amp;quot;Number of slots must match number of talks&amp;quot;); enum people; array[people, talks] of 0..4: pref; array[DAYS, TIMES, ROOMS] of var talks: sched; constraint alldifferent (d in DAYS, t in TIMES, r in ROOMS) (sched[d, t, r]); array[people] of var int: score; constraint forall(p in people) ( score[p] = sum([if exists (r in ROOMS) (pref[p, sched[d, t, r]] = 4) then 1 else 0 endif | d in DAYS, t in TIMES] ) ); solve maximize sum(score); output [&amp;quot;SCORE: \(sum(score)) \n\n&amp;quot;] ++ [show(sched[d, t, r]) ++ &amp;quot; &amp;quot; ++ if r == card(ROOMS) then if t == card(TIMES) then &amp;quot;\n\n&amp;quot; else &amp;quot;\n&amp;quot; endif else &amp;quot;&amp;quot; endif | d in DAYS, t in TIMES, r in ROOMS];  We wanted to run it for two days, four time slots, and three rooms.</description>
    </item>
    
    <item>
      <title>Constraint Solving with Minizinc</title>
      <link>https://www.hillelwayne.com/post/minizinc/</link>
      <pubDate>Mon, 24 Sep 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/minizinc/</guid>
      <description>This is part one of a two-part article. Part two is here.
A while back somebody told me to check out MiniZinc. Eventually I did and really enjoyed it, so figured I&amp;rsquo;d write about it here. This is actually going to be a two part article. Right now we&amp;rsquo;re talking about what it is and how it works, and in the next post we&amp;rsquo;ll talk about optimizing models.
MiniZinc is a constraint solving language designed for modeling optimization problems.</description>
    </item>
    
    <item>
      <title>1/0 = 0</title>
      <link>https://www.hillelwayne.com/post/divide-by-zero/</link>
      <pubDate>Fri, 10 Aug 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/divide-by-zero/</guid>
      <description>Have a tweet:
 img {border-style: groove;} I have no idea if Pony is making the right choice here, I don&amp;rsquo;t know Pony, and I don&amp;rsquo;t have any interest in learning Pony.1 But this tweet raised my hackles for two reasons:
 It&amp;rsquo;s pretty smug. I have very strong opinions about programming, but one rule I try to follow is do not mock other programmers.2 Programming is too big and I&amp;rsquo;m too small to understand everything.</description>
    </item>
    
    <item>
      <title>Augmenting Agile with Formal Methods</title>
      <link>https://www.hillelwayne.com/post/augmenting-agile/</link>
      <pubDate>Mon, 30 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/augmenting-agile/</guid>
      <description>I really like the c2 wiki as a historical artifact: a lot of big names in Agile and Extreme Programming argued with each other there.1 One thing they did was the Extreme Programming Challenge, where people tried to test the limits of these approaches. They&amp;rsquo;d find edge problems (designing databases, remote teams, etc) and see if Agile/XP still worked in that context. In almost every case they quickly decided that yes, it works just fine.</description>
    </item>
    
    <item>
      <title>Decision Tables</title>
      <link>https://www.hillelwayne.com/post/decision-tables/</link>
      <pubDate>Mon, 09 Jul 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/decision-tables/</guid>
      <description>I really like decision tables but they&amp;rsquo;ve fallen out of common knowledge. Let&amp;rsquo;s fix that.
A decision table is a means of concisely representing branching and conditional computations. In the most basic form, you have some columns that represent the &amp;ldquo;inputs&amp;rdquo; as booleans and some columns that represent outputs and effects. It looks like this:
   A B C f(A, B, C)     T T T 1   T T F 3   T F T 7   T F F &amp;ldquo;cucumber&amp;rdquo;   F - - NullError    - means that it doesn&amp;rsquo;t matter what the value is.</description>
    </item>
    
    <item>
      <title>Formally Specifying UIs</title>
      <link>https://www.hillelwayne.com/formally-specifying-uis/</link>
      <pubDate>Mon, 11 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/formally-specifying-uis/</guid>
      <description>Good UI is necessary to making correct software. If people have trouble using the product, they&amp;rsquo;re more likely to do the wrong thing. Personally, though, I can&amp;rsquo;t stand UI work. I don&amp;rsquo;t think it&amp;rsquo;s &amp;ldquo;beneath me&amp;rdquo; or anything, it just doesn&amp;rsquo;t quite mesh with my brain. Visuals and interfaces give me anxiety. Mad respect for the people who can handle it.
I love formal methods. Recently my friend Kevin Lynagh released Sketch.</description>
    </item>
    
    <item>
      <title>Raw Materials</title>
      <link>https://www.hillelwayne.com/post/raw-materials/</link>
      <pubDate>Sun, 27 May 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/raw-materials/</guid>
      <description>This is an excerpt from Michael Jackson (not the singer)&amp;rsquo;s book Software Requirements and Specifications, in his discussion of &amp;ldquo;Raw Materials&amp;rdquo;. It&amp;rsquo;s worth letting stand on its own.
 First, make a list of all the languages you use in all your development activities. Be honest: don&amp;rsquo;t list all of the languages you have ever heard of; include only languages you have used for real work at least once&amp;hellip;
Now, ask yourself which of the languages on your list you would choose to say these things, and how easily you could say them:</description>
    </item>
    
    <item>
      <title>The Great Theorem Prover Showdown</title>
      <link>https://www.hillelwayne.com/post/theorem-prover-showdown/</link>
      <pubDate>Wed, 25 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/theorem-prover-showdown/</guid>
      <description>Functional programming and immutability are hot right now. On one hand, this is pretty great as there&amp;rsquo;s lots of nice things about functional programming. On the other hand, people get a little overzealous and start claiming that imperative code is unnatural or that purity is always preferable to mutation.
I think that the appropriate paradigm is heavily dependent on context, but a lot of people speak in universals. I keep hearing that it&amp;rsquo;s easier to analyze pure functional code than mutable imperative code.</description>
    </item>
    
    <item>
      <title>Why Does &#34;=&#34; Mean Assignment?</title>
      <link>https://www.hillelwayne.com/post/equals-as-assignment/</link>
      <pubDate>Tue, 10 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/equals-as-assignment/</guid>
      <description>Take the following code:
a = 1 a = a + 1 print(a)  A common FP critique of imperative programming goes like this: &amp;ldquo;How can a = a + 1? That&amp;rsquo;s like saying 1 = 2. Mutable assignment makes no sense.&amp;rdquo; This is a notation mismatch: &amp;ldquo;equals&amp;rdquo; should mean &amp;ldquo;equality&amp;rdquo;, when it really means &amp;ldquo;assign&amp;rdquo;. I agree with this criticism and think it&amp;rsquo;s bad notation. But I also know some languages don&amp;rsquo;t write a = a + 1, instead writing a := a + 1.</description>
    </item>
    
    <item>
      <title>Just a Whole Bunch of Different Tests</title>
      <link>https://www.hillelwayne.com/post/a-bunch-of-tests/</link>
      <pubDate>Mon, 02 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/a-bunch-of-tests/</guid>
      <description>I&amp;rsquo;ve been working on a bunch of longform obligation pieces and while they&amp;rsquo;re a lot of fun, they&amp;rsquo;re also steadily driving me insane. So I took a day off to write about all of the kinds of automated testing I know about. I&amp;rsquo;m defining tests here to be &amp;ldquo;an independent verification program that, as part of verification, executes the code we want to verify.&amp;rdquo; This means types are not tests, as they don&amp;rsquo;t involve execution of the code, and contracts are not tests, because they&amp;rsquo;re not executed as an independent program.</description>
    </item>
    
    <item>
      <title>Formally Specifying a Package Manager</title>
      <link>https://www.hillelwayne.com/post/nix/</link>
      <pubDate>Fri, 16 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/nix/</guid>
      <description>This post was commissioned by Graham Christensen as part of the Great Slate fundraiser. Thank you!
I wanted to help out the Great Slate fundraiser and donated two technical essays of the purchaser&amp;rsquo;s choice. Graham bought one and asked for
 Something that has to do with Nix or NixOS
 This was a bit of a challenge, given that I didn&amp;rsquo;t even know what Nix was. I had never used it and still haven&amp;rsquo;t, nor can I use it for the near future, because my only computer right now is a Windows box.</description>
    </item>
    
    <item>
      <title>List of TLA&#43; Examples</title>
      <link>https://www.hillelwayne.com/post/list-of-tla-examples/</link>
      <pubDate>Thu, 08 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/list-of-tla-examples/</guid>
      <description>People always tell me that the hardest part of learning TLA+ is finding good examples. This makes sense to me: most of the main ones out there are either toy problems or immensely complex algorithms. It&amp;rsquo;s sort of the nature of TLA+: if you&amp;rsquo;re using it, you&amp;rsquo;re trying to design something complicated, and that&amp;rsquo;s usually because you&amp;rsquo;re trying to sell something complicated.
Also, the community is tiny. You could probably fit all of the TLA+ experts in the world in a small coffee shop.</description>
    </item>
    
    <item>
      <title>Monad Tutorials for Other Topics</title>
      <link>https://www.hillelwayne.com/post/monad-tutorials/</link>
      <pubDate>Mon, 05 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/monad-tutorials/</guid>
      <description>&amp;ldquo;Mathematics doesn&amp;rsquo;t have a sense of time, but often we need to track time. So programmers borrow an idea from the field of formal logic and replace all functions (f: A → B) ↦ f: A × T → B where T is the partially ordered set t1 ... tn. If T is totally ordered we can then define a mutation as a tuple in M ⊆ Var × Val × Val × T such that &amp;lt;x, a, b, t&amp;gt; ∈ M ⇔ x[b, t&#39;] ∈ x&#39;[a, t].</description>
    </item>
    
    <item>
      <title>The Problem With APLs</title>
      <link>https://www.hillelwayne.com/post/the-problem-with-apls/</link>
      <pubDate>Mon, 19 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/the-problem-with-apls/</guid>
      <description>Note: I&amp;rsquo;m coming from this from the perspective of a J programmer. Maybe K or Dyalog or something solved this already, I don&amp;rsquo;t know, but I would be pretty surprised if they did.
The more I work with an APL, the more I notice a serious problem. Not the weird symbols, you get used to that pretty fast. Not the write-only aspect, that&amp;rsquo;s annoying but can be solved with a good syntax highlighter.</description>
    </item>
    
    <item>
      <title>It&#39;s Hard to Reason About Systems</title>
      <link>https://www.hillelwayne.com/post/reasoning-about-systems/</link>
      <pubDate>Tue, 13 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/reasoning-about-systems/</guid>
      <description>In programming arguments, such as static vs dynamic typing,1 people use their experiences and reason to frame these debates. However, reason is often a poor grounding for justifying complex positions. Usually warnings against using &amp;ldquo;reason&amp;rdquo; take the form of &amp;ldquo;it&amp;rsquo;s easy to be biased&amp;rdquo; or &amp;ldquo;we tend to make logical fallacies.&amp;rdquo; But this presupposes that if we were less biased we could answer the question by thinking really hard. I&amp;rsquo;d like to argue that this is actually impossible: we can&amp;rsquo;t understand something &amp;ldquo;static vs dynamic&amp;rdquo; with reason alone.</description>
    </item>
    
    <item>
      <title>Modeling Redux with TLA&#43;</title>
      <link>https://www.hillelwayne.com/post/tla-redux/</link>
      <pubDate>Mon, 12 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/tla-redux/</guid>
      <description>Update 01/07/19 Greetings from 2019! The good news is that Chicago isn&amp;rsquo;t yet a radioactive crater. The bad news is almost everything I said about refinement in this article is wrong. I&amp;rsquo;m working on writing a more in-depth, rigorous treatment of refinement as its own article. But this one is currently explaining something that definitely isn&amp;rsquo;t refinement. mkay thanks!
Update 2020-10-05: I&amp;rsquo;m probably not going to write that article on refinement in the near future and also Chicago is a radioactive crater.</description>
    </item>
    
    <item>
      <title>We&#39;ve Already Thought the Unthinkable</title>
      <link>https://www.hillelwayne.com/post/thinking-the-unthinkable/</link>
      <pubDate>Fri, 09 Feb 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/thinking-the-unthinkable/</guid>
      <description>I recently read Tomas Petricek&amp;rsquo;s Thinking the Unthinkable, where he argues that modern PLT makes several restrictive assumptions about the nature of programming. Our reliance on mathematics in CS is not fundamental and our obsession with formal logic and algorithms keeps us from seeing other possible paradigms. He proposes two other unthinkable paradigms that are unrelatable to modern mathematical programming.
I disagree with his premises: I think there&amp;rsquo;s a very valid reason to ground aspects of programming in mathematics.</description>
    </item>
    
    <item>
      <title>Teaching Leaky Abstractions</title>
      <link>https://www.hillelwayne.com/post/teaching-leaky-abstractions/</link>
      <pubDate>Tue, 30 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/teaching-leaky-abstractions/</guid>
      <description>I&amp;rsquo;m writing a book on TLA+! It&amp;rsquo;s going to be aimed at the same audience as Learn TLA+, but dive much deeper and go much further. I&amp;rsquo;ll be showing not just how to use TLA+, but how to think about systems, write good specifications, and fix models. I&amp;rsquo;m really excited and I&amp;rsquo;m sure you&amp;rsquo;ll be, too!
I&amp;rsquo;m also trying to make it much better than Learn TLA+, because
 People are going to be paying money for this, so I can&amp;rsquo;t just phone it in I asked my technical reviewer to be &amp;ldquo;almost-comically brutal&amp;rdquo; and he&amp;rsquo;s risen to the challenge.</description>
    </item>
    
    <item>
      <title>Important Women in CS Who Aren&#39;t Grace Hopper</title>
      <link>https://www.hillelwayne.com/post/important-women-in-cs/</link>
      <pubDate>Fri, 26 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/important-women-in-cs/</guid>
      <description>I&amp;rsquo;m tired of hearing about Grace Hopper, Margaret Hamilton, and Ada Lovelace. Can&amp;rsquo;t we think of someone else for once? I went ahead and compiled a bunch of really important women according to some fairly arbitrary rules:
 There&amp;rsquo;s a specific thing you can point to and say &amp;ldquo;That. That&amp;rsquo;s their contribution.&amp;rdquo; This leaves out a lot of really qualified people who made lots of general contributions, but I wanted to keep this list fixed on soundbites.</description>
    </item>
    
    <item>
      <title>Proving Games are Winnable with Alloy</title>
      <link>https://www.hillelwayne.com/alloy-randomizer/</link>
      <pubDate>Mon, 15 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/alloy-randomizer/</guid>
      <description>One of my vices is watching Link to the Past Randomizer games. This gist is it&amp;rsquo;s a regular Zelda game except all of the items in chests are randomized. A chest that normally has bombs might have a critical item, while the chest that&amp;rsquo;s supposed to have the moon pearl might only have 10 rupees. People use randomizers to run races, since you can&amp;rsquo;t just memorize the &amp;ldquo;correct&amp;rdquo; path through the game.</description>
    </item>
    
    <item>
      <title>The best software engineering paper you haven&#39;t read</title>
      <link>https://www.hillelwayne.com/post/the-best-se-paper/</link>
      <pubDate>Fri, 12 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/the-best-se-paper/</guid>
      <description>I want to call attention to one of the best papers I&amp;rsquo;ve ever read on software engineering, ever. Ready to be dazzled? Here goes:
Fixing Faults in C and Java Source Code: Abbreviated vs. Full-Word Identifier Names (preprint)
I know, right? Sheer brilliance.
Okay, maybe it doesn&amp;rsquo;t have the most exciting subject matter, but I think everybody should read it. Here&amp;rsquo;s why:
Manageable scope. &amp;ldquo;Is clean code good?&amp;rdquo; Too broad, what is &amp;lsquo;clean code&amp;rsquo; and what is &amp;lsquo;good&amp;rsquo;?</description>
    </item>
    
    <item>
      <title>Vim Macro Trickz</title>
      <link>https://www.hillelwayne.com/post/vim-macro-trickz/</link>
      <pubDate>Tue, 26 Dec 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/vim-macro-trickz/</guid>
      <description>Vim has one of the best macro systems of any text editor out there.
Here&amp;rsquo;s why: Macros are just stored keystrokes. When you record a macro, it&amp;rsquo;s saved to the appropriate register, and it can be pasted and appended like any other saved string. When you run the macro, Vim simulates you typing every single character in the register. There are a couple of quirks to this (you can&amp;rsquo;t have a macro record another macro), but for the most part, macros have complete access to everything in vim.</description>
    </item>
    
    <item>
      <title>Property Tests &#43; Contracts = Integration Tests</title>
      <link>https://www.hillelwayne.com/post/pbt-contracts/</link>
      <pubDate>Sun, 17 Dec 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/pbt-contracts/</guid>
      <description>I&amp;rsquo;m a pretty big fan of contracts and property-based testing. While they&amp;rsquo;re both powerful, they do have tradeoffs:
 Contracts are simple and allow for complex conditionals, but you need to test them over a wide space to confirm them. Property-Based Testing can test your code over a very wide search space, but you have to come up with good generators and invariants.  Maybe they complement each other: &amp;ldquo;your code doesn&amp;rsquo;t violate any contracts&amp;rdquo; counts as a PBT invariant.</description>
    </item>
    
    <item>
      <title>What&#39;s the Right Tool for the Job?</title>
      <link>https://www.hillelwayne.com/post/right-tool/</link>
      <pubDate>Sun, 10 Dec 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/right-tool/</guid>
      <description>&amp;ldquo;Use the right tool for the job&amp;rdquo; is a pretty tired cliche. Mostly it&amp;rsquo;s used to dismiss overengineering and one-size-fits-all solutions to problems, like using microservices for your 10-user app. It isn&amp;rsquo;t a bad saying, it&amp;rsquo;s just tautologically true. I don&amp;rsquo;t think anybody wants to use the wrong tool for the job, unless they&amp;rsquo;re trying to sabotage it. &amp;ldquo;Should I use the right tool for the job?&amp;rdquo; is a rhetorical question.</description>
    </item>
    
    <item>
      <title>Maybe Comments SHOULD Explain &#39;What&#39;</title>
      <link>https://www.hillelwayne.com/post/what-comments/</link>
      <pubDate>Tue, 05 Dec 2017 00:40:32 -0600</pubDate>
      
      <guid>https://www.hillelwayne.com/post/what-comments/</guid>
      <description>People say &amp;ldquo;Comments should explain why, not what.&amp;rdquo; I feel like starting a flame war today so I&amp;rsquo;m going to argue that comments should explain &amp;lsquo;what&amp;rsquo; too. Please don&amp;rsquo;t use this as justification to write bad code, okay? Okay.
First of all, why shouldn&amp;rsquo;t comments explain &amp;lsquo;what&amp;rsquo;? If you need comments to explain what&amp;rsquo;s going on, it suggests your code is unclear. If I write
//weight, radius, price w = 10, r = 9, p = 1  That&amp;rsquo;s not as clear as saying</description>
    </item>
    
    <item>
      <title>How is a Class like a Microservice?</title>
      <link>https://www.hillelwayne.com/post/box-diagrams/</link>
      <pubDate>Sun, 03 Dec 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/box-diagrams/</guid>
      <description>At work we&amp;rsquo;re discussing moving some stuff to microservices. A lot of people said that they like &amp;ldquo;how microservices separate concerns while monoliths entangle them&amp;rdquo;. Others argued that &amp;ldquo;monoliths can be separated just fine with modules&amp;rdquo;, to which someone responded &amp;ldquo;it&amp;rsquo;s really hard to keep modules separate&amp;rdquo;. But &amp;ldquo;don&amp;rsquo;t you have the same problem with federated microservices?&amp;rdquo; etc etc etc.
As the discussion went on I realized that we all actually wanted the same thing out of our architecture, but we weren&amp;rsquo;t able to make that thing explicit.</description>
    </item>
    
    <item>
      <title>Introduction to Contract Programming</title>
      <link>https://www.hillelwayne.com/post/contracts/</link>
      <pubDate>Mon, 27 Nov 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/contracts/</guid>
      <description>I&amp;rsquo;ve namedropped contracts enough here that I think it&amp;rsquo;s finally time to go talk about them. A lot of people conflate them with class interfaces / dynamic typing / &amp;ldquo;your unit tests are your contract&amp;rdquo;, which muddies the discussion and makes it hard to show their benefits. So I&amp;rsquo;d like to build up the idea of contracts from first principles. We&amp;rsquo;re going to work in Python, up until the point where things get crazy.</description>
    </item>
    
    <item>
      <title>Calculating Burn Rates in J</title>
      <link>https://www.hillelwayne.com/burn-rate-j/</link>
      <pubDate>Tue, 21 Nov 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/burn-rate-j/</guid>
      <description>In January I start EMT Training and maybe make at least one of my childhood dreams come true. I&amp;rsquo;ve been saving for years for this: while the program is cheap, I&amp;rsquo;m effectively losing my monthly salary. I found it really easy to calculate my burn rate in J. I&amp;rsquo;ve talked about J before so I&amp;rsquo;ll assume you know the basics and we can skip all of that.
Note: Just to be absolutely clear, the numbers below are made up.</description>
    </item>
    
    <item>
      <title>Why TDD Isn&#39;t Crap</title>
      <link>https://www.hillelwayne.com/post/why-tdd-isnt-crap/</link>
      <pubDate>Mon, 30 Oct 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/why-tdd-isnt-crap/</guid>
      <description>After my recent vitriol about unit testing, a couple of people sent me Why TDD is Crap as a thorough debunking of TDD and unit testing. As someone very interested in software correctness, I ended up writing a debunking of his debunking. Transcriptions will be in quotes, my responses below. Some important notes:
 From what can tell, neither of us is using TDD in the &amp;ldquo;purest&amp;rdquo; possible sense of &amp;ldquo;write the bare minimum that makes the smallest unit test pass&amp;rdquo;.</description>
    </item>
    
    <item>
      <title>Unit Tests Aren&#39;t Tests</title>
      <link>https://www.hillelwayne.com/post/unit-tests-are-not-tests/</link>
      <pubDate>Thu, 26 Oct 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/unit-tests-are-not-tests/</guid>
      <description>This is an absolutely insane idea and I&amp;rsquo;m delighted by its audacity so I&amp;rsquo;m sharing it with all y&amp;rsquo;all. There&amp;rsquo;s like a bazillion things wrong with it but saying dumb shit has never stopped me before so let&amp;rsquo;s do some grambling!
The way I see it, unit tests act as a frame around your coding. The most common practice is you write the tests to cover the return values and calls, write your code, and enforce that it passes the unit tests.</description>
    </item>
    
    <item>
      <title>Handwriting Programs in J</title>
      <link>https://www.hillelwayne.com/handwriting-j/</link>
      <pubDate>Tue, 10 Oct 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/handwriting-j/</guid>
      <description>I think by hand. It&amp;rsquo;s easier for me to write my first drafts on a tablet and type them up afterwards. I can&amp;rsquo;t do this with code, though. Here&amp;rsquo;s me scrawling out a python function as fast as possible:
That took three times longer to write than type. Something about code being optimized for legibility and IDE usage and lame stuff like that. I still like the idea of writing code, though, so I looked for a language that wasn&amp;rsquo;t just easy to write, but benefited from being hand-written.</description>
    </item>
    
    <item>
      <title>Uncle Bob and Silver Bullets</title>
      <link>https://www.hillelwayne.com/post/uncle-bob/</link>
      <pubDate>Thu, 05 Oct 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/uncle-bob/</guid>
      <description>A while back I wrote that Robert Martin was ruining software by being too good at programming. That was supposed to be a joke. Since then he&amp;rsquo;s done his damndest to actually ruin software by telling people they&amp;rsquo;re doing it wrong. His most recent response where he yells at software correctness was the breaking point for me, so I&amp;rsquo;m going to go ahead and say what many of us have been thinking:</description>
    </item>
    
    <item>
      <title>Instructive and Persuasive Examples</title>
      <link>https://www.hillelwayne.com/post/persuasive-examples/</link>
      <pubDate>Tue, 29 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/persuasive-examples/</guid>
      <description>I recently read No excuses, write unit tests, which argues Unit Tests are Good and You Should Write Them. For the most part I strongly agree with their message, which is why I feel kinda bad criticizing the essay. They provide this as &amp;ldquo;an example of simple testing&amp;rdquo;:
constadd=(...numbers) =&amp;gt; { returnnumbers.reduce((acc, val) =&amp;gt; { returnacc+val; }, 0); }; it(&amp;#39;should add numbers&amp;#39;, () =&amp;gt; { constexpected=15; constactual=add(1, 2, 3, 4, 5); expect(actual).</description>
    </item>
    
    <item>
      <title>How Do We Trust Our Science Code?</title>
      <link>https://www.hillelwayne.com/post/how-do-we-trust-science-code/</link>
      <pubDate>Mon, 14 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/how-do-we-trust-science-code/</guid>
      <description>In 2010 Carmen Reinhart and Kenneth Rogoff published Growth in a Time of Debt. It&amp;rsquo;s arguably one of the most influential economics papers of the decade, convincing the IMF to push austerity measures in the European debt crisis. It was a very, very big deal.
In 2013 they shared their code with another team, who quickly found a bug. Once corrected, the results disappeared.
Greece took on austerity because of a software bug.</description>
    </item>
    
    <item>
      <title>Hypothesis Testing with Oracle Functions</title>
      <link>https://www.hillelwayne.com/post/hypothesis-oracles/</link>
      <pubDate>Fri, 21 Jul 2017 09:00:00 -0500</pubDate>
      
      <guid>https://www.hillelwayne.com/post/hypothesis-oracles/</guid>
      <description>This post is about the Hypothesis testing library. If you&amp;rsquo;re unfamiliar with it, check it out! Property tests are a fantastic addition to your testing suite. All examples use pytest.
Imagine we&amp;rsquo;ve written a bubblesort:
def bubblesort(l: List[int]) -&amp;gt; List[int]: # blah blah blah  What are some of the properties we could test? We could check that the input has the same length as the output:
from hypothesis import given from hypothesis.</description>
    </item>
    
    <item>
      <title>List of Articles about Programming Skepticism</title>
      <link>https://www.hillelwayne.com/post/skepticism/</link>
      <pubDate>Fri, 09 Jun 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/skepticism/</guid>
      <description>There are a lot of curated lists out there about good programming resources. One thing they all have in common is that they&amp;rsquo;re focused on relatively mainstream ideas: good languages, good techniques, etc. I want to try something a little different and focus on the articles that are skeptical about what everybody believes in programming. To keep them &amp;ldquo;curated&amp;rdquo;, I tried to make sure that the articles were well-referenced or original research.</description>
    </item>
    
    <item>
      <title>Modeling Zero-Downtime Deployments with TLA&#43;</title>
      <link>https://www.hillelwayne.com/post/modeling-deployments/</link>
      <pubDate>Tue, 30 May 2017 11:48:17 -0500</pubDate>
      
      <guid>https://www.hillelwayne.com/post/modeling-deployments/</guid>
      <description>I&amp;rsquo;m working on some examples for my TLA+ guide and realized this one would be a good introduction to specification in general, so I simplified it a little to make it more accessible. Enjoy!
The problem Deploying code to a set of servers is tricky. You can turn them off, migrate the code, and turn them back on, but that&amp;rsquo;ll piss off the customers. You could also update them live, but different servers update are different rates and customers could get inconsistent results.</description>
    </item>
    
    <item>
      <title>Doctests in Python</title>
      <link>https://www.hillelwayne.com/post/python-doctests/</link>
      <pubDate>Thu, 16 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>https://www.hillelwayne.com/post/python-doctests/</guid>
      <description>Doctests are one of the most fascinating things in Python. Not necessarily because it&amp;rsquo;s particularly elegant or useful, but because it&amp;rsquo;s unique: I haven&amp;rsquo;t found another language that has a similar kind of feature.
Here&amp;rsquo;s how it works. Imagine I was writing an adder:
def add(a,b): return a + b  There&amp;rsquo;s two kinds of ways we can test it. The first is with unit tests, which everybody&amp;rsquo;s already used to.</description>
    </item>
    
    <item>
      <title>Falsehoods Programmers Believe About Dogs</title>
      <link>https://www.hillelwayne.com/post/falsehoods-programmers-believe-about-dogs/</link>
      <pubDate>Wed, 01 Feb 2017 07:59:42 -0800</pubDate>
      
      <guid>https://www.hillelwayne.com/post/falsehoods-programmers-believe-about-dogs/</guid>
      <description>&lt;p&gt;&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Uncle Bob is Ruining Software</title>
      <link>https://www.hillelwayne.com/10x/</link>
      <pubDate>Tue, 24 Jan 2017 12:37:25 -0600</pubDate>
      
      <guid>https://www.hillelwayne.com/10x/</guid>
      <description>Let&amp;rsquo;s start with a couple of premises:
 There are 10x programmers out there, Some programming techniques are better than others.  I don&amp;rsquo;t think either of these is particularly controversial. The first is pretty widely accepted and borne out by studies. And we see examples of the second everywhere: see for example all of the pissfights about static vs dynamic typing. We may not agree on which is better, but a lot of people think one of them is better, which means that a lot of people believe that some techniques are better than others.</description>
    </item>
    
    <item>
      <title>Hate Your Tools</title>
      <link>https://www.hillelwayne.com/hate-your-tools/</link>
      <pubDate>Tue, 27 Dec 2016 19:48:18 -0600</pubDate>
      
      <guid>https://www.hillelwayne.com/hate-your-tools/</guid>
      <description></description>
    </item>
    
  </channel>
</rss>