Full Width [alt+shift+f] FOCUS MODE Shortcuts [alt+shift+k]
Sign Up [alt+shift+s] Log In [alt+shift+l]
78
One of the ways I like to do development is to build something, click around a ton, make tweaks, click around more, more tweaks, more clicks, etc., until I finally consider it done. The clicking around a ton is the important part. If it’s a page transition, that means going back and forth a ton. Click, back button. Click, right-click context menu, “Back”. Click, in-app navigation to go back (if there is one). Click, keyboard shortcut to go back. Over and over and over. You get the idea. It’s kind of a QA tactic in a sense, just click around and try to break stuff. But I like to think of it as being more akin to woodworking. You have a plank of wood and you run it through the belt sander to get all the big, coarse stuff smoothed down. Then you pull out the hand sander, sand a spot, run your hand over it, feel for splinters, sand it some more, over and over until you’re satisfied with the result. With software, the fact is that sometimes there are just too many variables to know and test...
11 months ago

Comments

Improve your reading experience

Logged in users get linked directly to articles resulting in a better reading experience. Please login for free, it takes less than 1 minute.

More from Jim Nielsen’s Blog

Successive Prototypes Bridge the Gap Between Idea and Reality

Dismissing an idea because it doesn’t work in your head is doing a disservice to the idea. (Same for dismissing someone else’s idea because it doesn’t work in your head.) The only way to truly know if an idea works is to test it. The gap between an idea and reality is the work. You can’t dismiss something as “not working” without doing the work. When collaborating with others, different ideas can be put forward which end up in competition with each other. We debate which is best, but verbal descriptions don’t do justice to ideas — so the idea that wins is the one whose champion is the most persuasive (or has the most institutional authority). You don’t want that. You want an environment where ideas can be evaluated based on their substance and not on the personal attributes of the person advocating them. This is the value of prototypes. We can’t visualize or predict how our own ideas will play out, let alone other people’s. This is why it’s necessary to bring them to life, have them take concrete form. It’s the only way to do them justice. (Picture a cute puppy in your head. I’ve got one too. Now how do we determine who’s imagining the cuter puppy? We can’t. We have to produce a concrete manifestation for contrast and comparison.) Prototypes are how we bridge the gap between idea and reality. They’re an iterative, evolutionary, exploratory form of birthing ideas that test their substance. People will bow out to a good persuasive argument. They’ll bow out to their boss saying it should be one way or another. But it’s hard to bow out to a good idea you can see, taste, touch, smell, or use. Email · Mastodon · Bluesky

4 days ago 10 votes
Consistent Navigation Across My Inconsistent Websites, Part II

I refreshed the little thing that let’s you navigate consistently between my inconsistent subdomains (video recording). Here’s the tl;dr on the update: I had to remove some features on each site to make this feel right. Takeaway: adding stuff is easy, removing stuff is hard. The element is a web component and not even under source control (🤫). I serve it directly from my cdn. If I want to make an update, I tweak the file on disk and re-deploy. Takeaway: cowboy codin’, yee-haw! Live free and die hard. So. Many. Iterations. All of which led to what? A small, iterative evolution. Takeaway: it’s ok for design explorations to culminate in updates that look more like an evolution than a mutation. Want more info on the behind-the-scenes work? Read on! Design Explorations It might look like a simple iteration on what I previously had, but that doesn’t mean I didn’t explore the universe of possibilities first before coming back to the current iteration. v0: Tabs! A tab-like experience seemed the most natural, but how to represent it? I tried a few different ideas. On top. On bottom. Different visual styles, etc. And of course, gotta explore how that plays out on desktop too. Some I liked, some I didn’t. As much as I wanted to play with going to the edges of the viewport, I realized that every browser is different and you won't be able to get a consistent “bleed-like” visual experience across browsers. For example, if you try to make tabs that bleed to the edges, it looks nice in a frame in Figma, and even in some browsers. But it won’t look right in all browser, like iOS Safari. So I couldn’t reliably leverage the idea of a bounded canvas as a design element — which, I should’ve known, has always been the case with the web. v1: Bottom Tabs With a Site Theme I really like this pattern on mobile devices, so I thought maybe I’d consider it for navigating between my sites. But how to theme across differently-styled sites? The favicon styles seemed like a good bet! And, of course, what do to on larger devices? Just stacking it felt like overkill, so I explored moving it to the edge. I actually prototyped this in code, but I didn’t like how it felt so I scratched the idea and went other directions. v2: The Unification The more I explored what to do with this element, the more it started taking on additional responsibility. “What if I unified its position with site-specific navigation?” I thought. This led to design explorations where the disparate subdomains began to take on not just a unified navigational element, but a unified header. And I made small, stylistic explorations with the tabs themselves too. You can see how I played toyed with the idea of a consistent header across all my sites (not an intended goal, but ya know, scope creep gets us all). As I began to explore more possibilities than I planned for, things started to get out of hand. v3: Do More. MORE. MORE!! Questions I began asking: Why aren’t these all under the same domain?! What if I had a single domain for feeds across all of them, e.g. feeds.jim-nielsen.com? What about icons instead of words? Wait, wait, wait Jim. Consistent navigation across inconsistent sites. That’s the goal. Pare it back a little. v4: Reigning It Back In To counter my exploratory ambitions, I told myself I needed to ship something without the need to modify the entire design style of all my sites. So how do I do that? That got me back to a simpler premise: consistent navigation across my inconsistent sites. Better — and implementable. Technical Details The implementation was pretty simple. I basically just forked my previous web component and changed some styles. That’s it. The only thing I did different was I moved the web component JS file from being part of my www.jim-nielsen.com git repository to a standalone file (not under git control) on my CDN. This felt like one of the exceptions to the rule of always keeping stuff under version control. It’s more of the classic FTP-style approach to web development. Granted, it’s riskier, but it’s also way more flexible. And I’m good with that trade-off for now. (Ask me again in a few months if I’ve done anything terrible and now have regrets.) Each site implements the component like this (with a different subdomain attribute for each site): <script type="module" src="https://cdn.jim-nielsen.com/shared/jim-site-switcher.js"></script> <jim-site-switcher subdomain="blog"></jim-site-switcher> That’s really all there is to say. Thanks to Zach for prodding me to make this post. Email · Mastodon · Bluesky

a week ago 10 votes
Bottomless Subtleties

Jason Fried writes in his post “Knives and battleships”: Specific tools and familiar ingredients combined in different ratios, different molds, for different purposes. Like a baker working from the same tight set of pantry ingredients to make a hundred distinct recipes. You wouldn't turn to them and say "enough with the butter, flour, sugar, baking powder, and eggs already!" Getting the same few things right in different ways is a career's worth of work. Mastery comes from a lifetime of putting together the basics in different combinations. I think of Beethoven’s 5th and its famous “short-short-short-long” motif. The entire symphony is essentially the same core idea repeated and developed relentlessly! The same four notes (da-da-da-DAH!) moving between instruments, changing keys, etc. Beethoven took something basic — a four note motif — and extracted an enormous set of variations. Its genius is in illustrating how much can be explored and expressed within constraints (rather than piling on “more and more” novel stuff). Back to Jason’s point: the simplest building blocks in any form — music, code, paint, cooking — implemented with restraint can be combined in an almost infinite set of pleasing ways. As Devine noted (and I constantly link back to): we haven’t even begun to scratch the surface of what we can do with less. Email · Mastodon · Bluesky

a week ago 12 votes
Just a Little More Context Bro, I Promise, and It’ll Fix Everything

Conrad Irwin has an article on the Zed blog “Why LLMs Can't Really Build Software”. He says it boils down to: the distinguishing factor of effective engineers is their ability to build and maintain clear mental models We do this by: Building a mental model of what you want to do Building a mental model of what the code does Reducing the difference between the two It’s kind of an interesting observation about how we (as humans) problem solve vs. how we use LLMs to problem solve: With LLMs, you stuff more and more information into context until it (hopefully) has enough to generate a solution. With your brain, you tweak, revise, or simplify your mental model more and more until the solution presents itself. One adds information — complexity you might even say — to solve a problem. The other eliminates it. You know what that sort of makes me think of? NPM driven development. Solving problems with LLMs is like solving front-end problems with NPM: the “solution” comes through installing more and more things — adding more and more context, i.e. more and more packages. LLM: Problem? Add more context. NPM: Problem? There’s a package for that. Contrast that with a solution that comes through simplification. You don’t add more context. You simplify your mental model so you need less to solve a problem — if you solve it at all, perhaps you eliminate the problem entirely! Rather than install another package to fix what ails you, you simplify your mental model which often eliminates the problem you had in the first place; thus eliminating the need to solve any problem at all, or to add any additional context or complexity (or dependency). As I’m typing this, I’m thinking of that image of the evolution of the Raptor engine, where it evolved in simplicity: This stands in contrast to my working with LLMs, which often wants more and more context from me to get to a generative solution: I know, I know. There’s probably a false equivalence here. This entire post started as a note and I just kept going. This post itself needs further thought and simplification. But that’ll have to come in a subsequent post, otherwise this never gets published lol. Email · Mastodon · Bluesky

a week ago 13 votes
Choosing Tools To Make Websites

Jan Miksovsky lays out his idea for website creation as content transformation. He starts by talking about tools that hide what’s happening “under the hood”: A framework’s marketing usually pretends it is unnecessary for you to understand how its core transformation works — but without that knowledge, you can’t achieve the beautiful range of results you see in the framework’s sample site gallery. This is a great callout. Tools will say, “You don’t have to worry about the details.” But the reality is, you end up worrying about the details — at least to some degree. Why? Because what you want to build is full of personalization. That’s how you differentiate yourself, which means you’re going to need a tool that’s expressive enough to help you. So the question becomes: how hard is it to understand the details that are being intentionally hidden away? A lot of the time those details are not exposed directly. Instead they’re exposed through configuration. But configuration doesn’t really help you learn how something works. I mean, how many of you have learned how typescript works under the hood by using tsconfig.json? As Jan says: Configuration can lead to as many problems as it solves Nailed it. He continues: Configuring software is itself a form of programming, in fact a rather difficult and often baroque form. It can take more data files or code to configure a framework’s transformation than to write a program that directly implements that transformation itself. I’m not a Devops person, but that sounds like Devops in a nutshell right there. (It also perfectly encapsulates my feelings on trying to setup configuration in GitHub Actions.) Jan moves beyond site creation to also discuss site hosting. He gives good reasons for keeping your website’s architecture simple and decoupled from your hosting provider (something I’ve been a long time proponent of): These site hosting platforms typically charge an ongoing subscription fee. (Some offer a free tier that may meet your needs.) The monthly fee may not be large, but it’s forever. Ten years from now you’ll probably still want your content to be publicly available, but will you still be happy paying that monthly fee? If you stop paying, your site disappears. In subscription pricing, any price (however small) is recurring. Stated differently: pricing is forever. Anyhow, it’s a good read from Jan and lays out his vision for why he’s building Web Origami: a tool for that encourages you to understand (and customize) how you transform content to a website. He just launched version 0.4.0 which has some exciting stuff I’m excited to try out further (I’ll have to write about all that later). Email · Mastodon · Bluesky

2 weeks ago 14 votes

More in literature

Reading, forgetting

In an in-between time in which nothing begins or ends, in which blank patience takes the place of activity, I picked two books from my shelves stubbornly remote from utility, lacking the intimacy of possession, and a third in which I had never read a key section. The first was Peter Handke's Crossing the Sierra del Gredos, a 472-page novel narrated by a writer employed by financial operative to write something about her and which I abandoned eighteen years ago retaining no memory of its content. This time, I read page after page in a reverie of detachment. 1 Then there was Geoffrey Hill's collected poems Broken Hierarchies, a book whose word choice and subject matter is fiercely English and Christian or, perhaps more accurately, Protestant and Anglo-Saxon, which despite being English and culturally Christian, remains alien to me. Why did I think a huge edition like this presented and read in chronological order would enable something previously declined? No doubt I assumed from immersion some sort of knowledge or at least familiarity was to be gained. Perhaps I might draw closer to the distinction of my ancestral lands. Reading from where I left off provoked the same cool reverie and with it the assumption of gain fell away. Thirdly, there were the pages prefacing Maurice Blanchot's Infinite Conversation: italicised dialogue and commentary I have always skipped, or read without memory of having read, in a book otherwise opened so often it is held together by masking tape; skipped not only because of the tightly-bound typeface – why do italicised paragraphs repel our eyes? – but because they are abstract and anonymous; there is no listing in the table of contents and no names or titles cited to orientate us within a recognisable discourse, only mundane and hyperbolic expressions of weariness and what weariness means in context. If I were to insert an example quotation here it would only to betray what I began writing this to say, and indeed to name these books let alone summarise them obscures what I experienced.  In this empty time such reading, hardly reading at all actually, closer to passive looking, attentive only to the space opening before my eyes in the steady progress of lines and sentences, I chanced upon what felt like the pure mode of literature, an experience apart, an effortless drift from rational comprehension into the enchantment of a pale expanse, with no wish continue and no wish to stop.   Note  The original title is Der Bildverlust, oder, Durch die Sierra del Gredos. Why FSG chose to exclude the first part of the title, coined it appears by this novel and which translates as The Loss of Images, is unknown, but predictable (later we saw it with Vila-Matas' Montano's Malady reduced by Jonathan Cape to Montano). Imagine a German edition of Melville's novel abridged to Der Wal.↩

17 hours ago 6 votes
Office Hours

An experimental salon.

18 hours ago 3 votes
'Impossible Not to Be Entertained'

“In those days when Bedlam was open to the cruel curiosity of holyday ramblers, I have been a visitor there. Though a boy, I was not altogether insensible of the misery of the poor captives, nor destitute of feeling for them.”  The English poet William Cowper, a veteran of multiple suicide attempts and confinements in asylums, describes a common eighteenth-century recreation: viewing the “antics” of the insane for entertainment in Bedlam. He’s writing to his friend the Rev. William Newton on July 19, 1784:   “But the madness of some of them had such a humorous air, and displayed itself in so many whimsical freaks, that it was impossible not to be entertained, at the same time that I was angry with myself for being so.”   I’m skeptical of any claims of moral progress, though by the late twentieth century touring the nut house seems to have been curtailed  as an entertainment option. Of course, today we have “reality television,” professional sports and the drug-addled and schizophrenic homeless on the street. A man could earn a respectable living by corralling such people in an updated version of the carnival sideshow.   As a kid, the closest I came to such spectacle was the Cuyahoga County Fair in Berea, Ohio. Some time in the early sixties my brother and I were seduced into viewing the Giant Rat of Sumatra, behind walls of painted canvas. The barker’s pitch I still remember: “Live, livin’ and breathin'.” All I recall seeing is a fat rat in a pit filled with saw dust. As a bonus we viewed an enormously tall, skinny man dressed in cowboy duds and a tiny woman seated beside him. I think of her when I reread Walter de la Mare’s Memoirs of a Midget. I recall an overwhelming sense of sadness – people living narrow, blighted lives.  The sadness has its origin in the understanding that in the future I might join them.

an hour ago 1 votes
Immaculate Innings

At the ballpark on a summer night in Baltimore The post Immaculate Innings appeared first on The American Scholar.

yesterday 3 votes
a fantastic universe where the presence of man was not foreseen - Maurice Herzog's Annapurna: First Conquest of an 8000-meter Peak

Books that generate other books, books that are first in the line, interest me.  Despite little interest in mountaineering, I read Annapurna: First Conquest of an 8000-meter Peak (1951, tr. Nea Morin and Janet Adam Smith) by Maurice Herzog, the subject of the book well summarized in the title, a book that led to many other books. Annapurna was a big hit, and soon after there were books by other members of the expedition, and a parody novel, The Ascent of Rum Doodle (William Ernest Bowman, 1956) and a feminist response.  That response was to climb Annapurna, but also to write a book, Annapurna: A Woman’s Place (Arlene Blum, 1980).  The book inspired a great deal of mountaineering, Himalayan and otherwise.  The last line, “There are other Annapurnas in the lives of men” (311), apparently became famously inspirational  among crazy people, by which I mean mountain climbers, but I am more interested in what inspired people to write books. The story of the 1950 French and Swiss expedition in Nepal to climb whichever 8,000-meter peak was easiest, using state-of-the-art techniques, is a terrific adventure story, “terrific” in the current sense (entertaining) but also in the old sense (terrifying, these climbers are out of their minds), and it is the latter that really surprised me.  Annapurna is study in the variety of human taste for risk, or to put it in Wuthering Expectations terms* the taste for the sublime. “Sublime” has softened into an inelegant variation for “very beautiful,” but I again mean the old aesthetic sense of beauty that is frightening, beauty that is trying to kill you, like the view from the top of an 8,000-meter Himalayan peak.  This was quite different [from the Alps].  An enormous gulf was between me and the world.  This was a different universe – withered, desert, lifeless; a fantastic universe where the presence of man was not foreseen, perhaps not desired.  We were braving an interdict, overstepping a boundary, and yet we had no fear as we continued upward.  I thought of the famous ladder of St. Theresa of Avila.  Something clutched at my heart.  (207) Herzog does not normally write like this.  He is typically a model of clarity.  But atop Annapurna he goes on for three pages like this, while his companion keeps insisting they head back before the bad weather hits them. Some additional fragments: How wonderful life would now become! (208) Never had I felt happiness like this – so intense and yet so pure. (209)  Before disappearing into the couloir I gave one last look at the summit which would henceforth be all our joy and all our consolation. (210) The latter is well into the descent which at that point has become terrible and will get much worse.  But Herzog remains captured by his sublime experience, wavering between the struggle to descend and an obliterating acceptance of imminent death. Given the practicalities of the earlier part of the book, the organization of camps and supplies, the turn towards St. Theresa was fascinating.  It’s those camps and supplies, along with the team doctor, that save Herzog.  If you happen to have strong feelings about needles I recommend that you skip chapter 16, “The Retreat,” which is full of horrors (frostbite treatments).  Perhaps skim the next couple of chapters as well, although the worst is over. The whole of this book has been dictated at the American Hospital at Neuilly where I am still having rather a difficult time.  (11) I suppose another reason for the rise of the mountaineering book in the is that explorers had used up other parts of the world.  The Arctic and Antarctic had been exhausted as subjects for books.  I will note that while Roald Amundsen insisted on the scientific value of his pointless feats, Herzog and his team have no illusion that climbing a Himalayan mountain has any value beyond the adventure.  The legendary Alpine guide Lionel Terray, one of the members of the team who got Herzog down off Annapurna, titled his 1961 memoir Conquistadors of the Useless.  Useless except for generating books. Page numbers are from the first edition, which has a helpful fold-out map in the back.   * See this old post about Little House on the Prairie for more on the sublime.

yesterday 6 votes