10 interesting stories served every morning and every evening.
When I joined Google ~14 years ago, I thought the job was about writing great code. I was partly right. But the longer I’ve stayed, the more I’ve realized that the engineers who thrive aren’t necessarily the best programmers - they’re the ones who’ve figured out how to navigate everything around the code: the people, the politics, the alignment, the ambiguity.
These lessons are what I wish I’d known earlier. Some would have saved me months of frustration. Others took years to fully understand. None of them are about specific technologies - those change too fast to matter. They’re about the patterns that keep showing up, project after project, team after team.
I’m sharing them because I’ve benefited enormously from engineers who did the same for me. Consider this my attempt to pay it forward.
It’s seductive to fall in love with a technology and go looking for places to apply it. I’ve done it. Everyone has. But the engineers who create the most value work backwards: they become obsessed with understanding user problems deeply, and let solutions emerge from that understanding.
User obsession means spending time in support tickets, talking to users, watching users struggle, asking “why” until you hit bedrock. The engineer who truly understands the problem often finds that the elegant solution is simpler than anyone expected.
The engineer who starts with a solution tends to build complexity in search of a justification.
You can win every technical argument and lose the project. I’ve watched brilliant engineers accrue silent resentment by always being the smartest person in the room. The cost shows up later as “mysterious execution issues” and “strange resistance.”
The skill isn’t being right. It’s entering discussions to align on the problem, creating space for others, and remaining skeptical of your own certainty.
Strong opinions, weakly held - not because you lack conviction, but because decisions made under uncertainty shouldn’t be welded to identity.
The quest for perfection is paralyzing. I’ve watched engineers spend weeks debating the ideal architecture for something they’ve never built. The perfect solution rarely emerges from thought alone - it emerges from contact with reality. AI can in many ways help here.
First do it, then do it right, then do it better. Get the ugly prototype in front of users. Write the messy first draft of the design doc. Ship the MVP that embarrasses you slightly. You’ll learn more from one week of real feedback than a month of theoretical debate.
The instinct to write clever code is almost universal among engineers. It feels like proof of competence.
But software engineering is what happens when you add time and other programmers. In that environment, clarity isn’t a style preference - it’s operational risk reduction.
Your code is a strategy memo to strangers who will maintain it at 2am during an outage. Optimize for their comprehension, not your elegance. The senior engineers I respect most have learned to trade cleverness for clarity, every time.
Treat your technology choices like an organization with a small “innovation token” budget. Spend one each time you adopt something materially non-standard. You can’t afford many.
The punchline isn’t “never innovate.” It’s “innovate only where you’re uniquely paid to innovate.” Everything else should default to boring, because boring has known failure modes.
The “best tool for the job” is often the “least-worst tool across many jobs”-because operating a zoo becomes the real tax.
Early in my career, I believed great work would speak for itself. I was wrong. Code sits silently in a repository. Your manager mentions you in a meeting, or they don’t. A peer recommends you for a project, or someone else.
In large organizations, decisions get made in meetings you’re not invited to, using summaries you didn’t write, by people who have five minutes and twelve priorities. If no one can articulate your impact when you’re not in the room, your impact is effectively optional.
This isn’t strictly about self-promotion. It’s about making the value chain legible to everyone- including yourself.
We celebrate creation in engineering culture. Nobody gets promoted for deleting code, even though deletion often improves a system more than addition. Every line of code you don’t write is a line you never have to debug, maintain, or explain.
Before you build, exhaust the question: “What would happen if we just… didn’t?” Sometimes the answer is “nothing bad,” and that’s your solution.
The problem isn’t that engineers can’t write code or use AI to do so. It’s that we’re so good at writing it that we forget to ask whether we should.
With enough users, every observable behavior becomes a dependency - regardless of what you promised. Someone is scraping your API, automating your quirks, caching your bugs.
This creates a career-level insight: you can’t treat compatibility work as “maintenance” and new features as “real work.” Compatibility is product.
Design your deprecations as migrations with time, tooling, and empathy. Most “API design” is actually “API retirement.”
When a project drags, the instinct is to blame execution: people aren’t working hard enough, the technology is wrong, there aren’t enough engineers. Usually none of that is the real problem.
In large companies, teams are your unit of concurrency, but coordination costs grow geometrically as teams multiply. Most slowness is actually alignment failure - people building the wrong things, or the right things in incompatible ways.
Senior engineers spend more time clarifying direction, interfaces, and priorities than “writing code faster” because that’s where the actual bottleneck lives.
In a large company, countless variables are outside your control - organizational changes, management decisions, market shifts, product pivots. Dwelling on these creates anxiety without agency.
The engineers who stay sane and effective zero in on their sphere of influence. You can’t control whether a reorg happens. You can control the quality of your work, how you respond, and what you learn. When faced with uncertainty, break problems into pieces and identify the specific actions available to you.
This isn’t passive acceptance but it is strategic focus. Energy spent on what you can’t change is energy stolen from what you can.
Every abstraction is a bet that you won’t need to understand what’s underneath. Sometimes you win that bet. But something always leaks, and when it does, you need to know what you’re standing on.
Senior engineers keep learning “lower level” things even as stacks get higher. Not out of nostalgia, but out of respect for the moment when the abstraction fails and you’re alone with the system at 3am. Use your stack.
But keep a working model of its underlying failure modes.
Writing forces clarity. When I explain a concept to others - in a doc, a talk, a code review comment, even just chatting with AI - I discover the gaps in my own understanding. The act of making something legible to someone else makes it more legible to me.
This doesn’t mean that you’re going to learn how to be a surgeon by teaching it, but the premise still holds largely true in the software engineering domain.
This isn’t just about being generous with knowledge. It’s a selfish learning hack. If you think you understand something, try to explain it simply. The places where you stumble are the places where your understanding is shallow.
Teaching is debugging your own mental models.
Glue work - documentation, onboarding, cross-team coordination, process improvement - is vital. But if you do it unconsciously, it can stall your technical trajectory and burn you out. The trap is doing it as “helpfulness” rather than treating it as deliberate, bounded, visible impact.
Timebox it. Rotate it. Turn it into artifacts: docs, templates, automation. And make it legible as impact, not as personality trait.
Priceless and invisible is a dangerous combination for your career.
I’ve learned to be suspicious of my own certainty. When I “win” too easily, something is usually wrong. People stop fighting you not because you’ve convinced them, but because they’ve given up trying - and they’ll express that disagreement in execution, not meetings.
Real alignment takes longer. You have to actually understand other perspectives, incorporate feedback, and sometimes change your mind publicly.
The short-term feeling of being right is worth much less than the long-term reality of building things with willing collaborators.
Every metric you expose to management will eventually be gamed. Not through malice, but because humans optimize for what’s measured.
If you track lines of code, you’ll get more lines. If you track velocity, you’ll get inflated estimates.
The senior move: respond to every metric request with a pair. One for speed. One for quality or risk. Then insist on interpreting trends, not worshiping thresholds. The goal is insight, not surveillance.
Senior engineers who say “I don’t know” aren’t showing weakness - they’re creating permission. When a leader admits uncertainty, it signals that the room is safe for others to do the same. The alternative is a culture where everyone pretends to understand and problems stay hidden until they explode.
I’ve seen teams where the most senior person never admitted confusion, and I’ve seen the damage. Questions don’t get asked. Assumptions don’t get challenged. Junior engineers stay silent because they assume everyone else gets it.
Model curiosity, and you get a team that actually learns.
Early in my career, I focused on the work and neglected networking. In hindsight, this was a mistake. Colleagues who invested in relationships - inside and outside the company - reaped benefits for decades.
They heard about opportunities first, could build bridges faster, got recommended for roles, and co-founded ventures with people they’d built trust with over years.
Your job isn’t forever, but your network is. Approach it with curiosity and generosity, not transactional hustle.
When the time comes to move on, it’s often relationships that open the door.
When systems get slow, the instinct is to add: caching layers, parallel processing, smarter algorithms. Sometimes that’s right. But I’ve seen more performance wins from asking “what are we computing that we don’t need?”
Deleting unnecessary work is almost always more impactful than doing necessary work faster. The fastest code is code that never runs.
Before you optimize, question whether the work should exist at all.
The best process makes coordination easier and failures cheaper. The worst process is bureaucratic theater - it exists not to help but to assign blame when things go wrong.
If you can’t explain how a process reduces risk or increases clarity, it’s probably just overhead.
And if people are spending more time documenting their work than doing it, something has gone deeply wrong.
Early in your career, you trade time for money - and that’s fine. But at some point, the calculus inverts. You start to realize that time is the non-renewable resource.
I’ve watched senior engineers burn out chasing the next promo level, optimizing for a few more percentage points of compensation. Some of them got it. Most of them wondered, afterward, if it was worth what they gave up.
The answer isn’t “don’t work hard.” It’s “know what you’re trading, and make the trade deliberately.”
Expertise comes from deliberate practice - pushing slightly beyond your current skill, reflecting, repeating. For years. There’s no condensed version.
But here’s the hopeful part: learning compounds when it creates new options, not just new trivia. Write - not for engagement, but for clarity. Build reusable primitives. Collect scar tissue into playbooks.
The engineer who treats their career as compound interest, not lottery tickets, tends to end up much further ahead.
Twenty-one lessons sounds like a lot, but they really come down to a few core ideas: stay curious, stay humble, and remember that the work is always about people - the users you’re building for and the teammates you’re building with.
A career in engineering is long enough to make plenty of mistakes and still come out ahead. The engineers I admire most aren’t the ones who got everything right - they’re the ones who learned from what went wrong, shared what they discovered, and kept showing up.
If you’re early in your journey, know that it gets richer with time. If you’re deep into it, I hope some of these resonate.
...
Read the original on addyosmani.com »
It’s contradictory to sit alone in a café. It’s against the reason cafés exist.
They are designed as meeting spaces. There is no table with a single chair. Even the ones placed right by the window with high seating are big tables with many chairs.
Cafés are community spaces. Most go there to see their loved ones, friends, or colleagues.
You find only a few people sitting alone. Most are buried in their laptops, working hard to make a living in their own worlds, whatever world they have.
When I took time off from work, I chose a staycation. Unlike most of my friends, who visited Japan in 2025.
When I heard their experiences, I was jealous. When I told them my staycation plans of doing nothing for four weeks, they were jealous.
While off work, I wanted to slow time down as much as I could. The best way to freeze time, I read somewhere, is to get a dog. Luckily, I have one already. So, I took long walks with my dog.
What used to feel like 10 minutes between breakfast and lunch while working became a full-blown day. Even though I was spending two hours walking my dog instead of a 30-40 minute rush, it felt like an eternity. A peaceful eternity.
On the second day, I decided to leave my phone at home, so I lived those two hours to the fullest. I didn’t take any device that could connect me to the internet or to other people.
But all the anxiety evaporated after 30 minutes.
It wasn’t that nobody could reach out to me that felt like an escape; it was that I couldn’t reach out to anyone or anything that caused the turmoil.
I had no possibility to text anyone. No possibility to watch or read. No chance to look up anything to fulfill my curiosity.
My mind was alone after a long time.
There were a few moments I put my hand into my pocket to take out my phone to look up something I was curious about. My phone wasn’t there.
On the second day, I randomly walked into a neighborhood café. I ordered an americano with a double shot of espresso.
Sipping a hot americano feels different when you are in a rush to catch a subway. Its purpose is to wake you up. A sip from that little hole in a single-use cap burns my tongue every time. I despise that.
With a porcelain cup, you don’t have that. Coffee changes its purpose. It becomes a pleasure.
I sat down with a proper cup of americano. My dog crawled under the table.
I was sitting alone in a café with a dog that had crawled under the table without any electronics that could distract me.
Distract me from, basically, nothing.
It was pure delight. Every element. Or rather, the non-existence of any element. No phone. No headphones. No tablet. No laptop.
My mind was just drifting with the chatter in the café. I left myself to the flow.
When you let your thoughts wander, they take you on a journey you’ll never think possible. You reflect on the smallest details of your fast life. Your brain absorbs all the mistakes you’ve made. You accept that you can’t change failures anymore, as much as you feel guilty.
You might as well not worry about them and focus on what you can change: what you do now. And what you will do next.
The next day, I left my phone at home again and decided to stop by the same café. I was lucky; I sat down at the same table.
Sitting alone in a café without distractions reveals a lot about people. The same people you pass by in a split second while rushing from home to work, from a meeting to a meeting. The invisible suddenly appears right in front of you. People don’t go away in two seconds. They stay. They sip a coffee. They talk with others, laugh, cry, and worry. Oh, worry.
Worry is only visible in people’s eyes. Eyes are the channel of the heart. You have to close your ears and look at people’s eyes to see their hearts.
You realize that looking into eyes is frightening—both for you and the other person. You try to avoid it, but eventually make eye contact because nobody is physically moving anywhere.
As none of you are passing by in a second, you mimic looking at something else. They continue their conversation. But you saw their worry, and you can’t help but try to understand.
You leave the café to avoid making things awkward.
I went there the next day. This time, my table was occupied. I don’t know when it became my table. But it felt like that. I found another one. It was closer to the staff.
Sitting alone in a café without distractions shows you how a café works. You never contemplate how they operate behind that giant coffee machine while you’re waiting for your coffee before you run to catch the next bus, tram, subway, or taxi. You never ruminate when you sip from a single-use cup and burn your tongue.
You notice how the staff circulates porcelain cups, from dirty to clean, to the top of the coffee machine. You observe the staff’s reactions to each customer. You try to analyze if someone is a regular by noticing how the staff talks.
You wonder whether they consider you a regular, since you’ve been there for the last couple of days. Or they call you a creepy guy with a dog. You will never know. You’re not fine with never knowing.
You promise yourself to come the next day to observe how the staff talks to you.
I again went to the same café. Unlucky me. A different staff were working on that day. Yet I ordered the same: a cup of americano with a double shot of espresso.
Sitting alone in a café without distractions, with a dog that had crawled under the table, brings a light to a truth: you can’t control or influence other people’s thoughts and feelings, no matter what you do. Staff may think of you as a weirdo with a dog; your friends might want to be in your place; your family might be nervous because they can’t reach out to you.
You know you can’t change any of those unless you change who you are. It makes you feel alone and powerless.
You are alone and powerless. You encounter a deep challenge.
The next day, I didn’t go to the café. I instead took an even longer walk. I went there the following day, knowing I had faced that challenge in my longest walk.
Sitting alone in a café without distractions shows everyone you’re alone.
Many avoid at all costs. That’s why everybody looks at you with wondering eyes. They are afraid of your powerful joy. They can’t grasp why someone would do this to themselves. They are hesitant but are thinking of doing the same.
Then you realize you’re planting thoughts in people’s minds that you can’t control. Feelings are feelings. Thoughts are thoughts.
Just at the moment you think you are alone again, you see another weirdo across the café sitting alone without distractions. That weirdo is looking at your sleeping-in-a-croissant-shape dog under the table. Weirdo is enjoying the moment, while your dog is on an adventure in her second dream.
You smile. You know you’re not alone. You are one weirdo sitting at a distance from one other. You know there are many.
Maybe one of them is reading this and feeling heard. Perhaps one will never see this and will always feel alone. But it only needs one look around. You glance over the café and leave with a smile.
The next day, I went there again. This time, I put in an intentional distraction. A good one.
Sitting alone in a café without distractions only gets better when there is something to write on. Not with a keyboard. You must use your single hand to write, not two. Ideally, with a pen on paper.
The pen is meant to slow you down. The words shouldn’t land on paper at the speed of thinking or even talking.
The writing must hurt your wrist or hand. It must turn into a burden. That pain is a signal telling you that you have written long enough. Maybe you wrote only five lines. Perhaps one thousand.
...
Read the original on candost.blog »
This article is part of a series about Street Fighter II and the CPS-1. It is recommended to read the previous entries before reading this one.
One of my favorite anecdote about Street Fighter II is Akiman’s account of an issue discovered shortly before shipping.
Just three days before the deadline, I discovered something horrible. I had made a mistake with the subtitle “World Warrior”, mis-spelling it “World Warrier.”
To fully understand the issue, we need to dig into how the arcade hardware works. The CPS-1 is a super tile drawing machine. It can draw a lot of tiles but cannot alter them. They are taken from the GFX ROM as they are and sent to the screen (although they can be flipped horizontally or vertically).
The GFX ROM and the 68000 instructions ROM as burned separately. The problem Akiman describe is that the GFX ROM had been burned but he could still make changes to the instructions.
But how could he fix the mistake if the artwork was set in stone at this point?
Now I can safely tell this story too, but we actually didn’t discover it until several months after all the sprite work had been done. Since the logo had already been created, I couldn’t just go in and change the letter at this point.
“Maybe I can just force it to look like an ‘o’,” I thought. I tried layering various other sprites over it until finally, it looked like an ‘o’. Phew!
Akiman description of the solution left me wanting more details. How did he turn an ‘e’ into an ‘o’? Since I had a sheet extractor, I looked for the text and sure enough, the logo and the typo were found on sheet 0x7B00.
The logo is drawn via 16 draw calls using tiles 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, and 0xDF.
The way Akiman solved his problem show that you have to be practical in order to ship. He noticed that there was an ‘or’ in ‘World’ which would kinda fit in place of the ‘ier’. So, he dropped the three last tiles 0xDD, 0xDE, and 0xDF and replaced them with 0xCD and 0xCE.
That was better but it only displaced the problem since the borrowed right leg of the ‘W’ looked like an ‘l’ instead of an ‘i’. The logo now read ‘The World Warrlor’.
At this point, what was needed was a way to slice the top of the ‘l’ to make it look like a dot on top of an ‘i’ but how could he do that since the 68000 cannot write in a tile?
The last part of the puzzle comes from Guile’s calves. If you look closely at tile 0x96 you will notice that it has only one pixel visible in the lower left corner.
Something that I omitted to mention earlier is that the palette management is entirely under the 68000 control. The CPU is free to issue a tile drawing command using whatever palette it pleases.
Guile’s green palette is not useful since the logo uses blue colors. But if we place them side by side, we notice that index 14 is dark green in Guile’s palette but dark blue in the logo palette.
Using tile 0x96 with the logo palette allows the 68000 to have a (very expensive) system where 255 pixels are wasted to transparency but the 256th can be used like a pencil.
That pencil-tile is used to issue three draw command with coordinates overlapping the ‘l’. This effectively creates a line which cuts the top part and make it look like the dot at the top of an ‘i’.
If you ever wondered why the ‘i’ of ‘Warrior’ looked weird all these years, now you know.
The typo was fixed in later versions of Street Fighter 2 where the “World Warrior” set of tiles features a proper “IOR”.
Ironically these are not used since the sub-title was changed from “World Warrior” to “Champion Edition” and then “Hyper-fighting”.
...
Read the original on fabiensanglard.net »
Can I finally start using Wayland in 2026?
Wayland is the successor to the X server (X11, Xorg) to implement the graphics stack on Linux. The Wayland
project was actually started in 2008, a year before I created the i3 tiling
window manager for X11 in 2009 — but for the last 18 years (!), Wayland was never usable on my computers. I don’t want to be stuck on deprecated software, so I try to start using Wayland each year, and this articles outlines what keeps me from migrating to Wayland in 2026.
For the first few years, Wayland rarely even started on my machines. When I was lucky enough for something to show up, I could start some toy demo apps in the demo compositor Weston.
Around 2014, GNOME started supporting Wayland. KDE followed a few years later. Major applications (like Firefox, Chrome or Emacs) have been slower to adopt Wayland and needed users to opt into experimental implementations via custom flags or environment variables, until very recently, or — in some cases, like
geeqie — still as of today.
Unfortunately, the driver support situation remained poor for many years. With nVidia graphics cards, which are the only cards that support my 8K
monitor, Wayland would either not work at all or exhibit heavy graphics glitches and crashes.
In the 2020s, more and more distributions announced looking to switch to Wayland by default or even drop their X11
sessions, and RHEL is winding down their contributions to the X
server.
Modern Linux distributions like Asahi Linux (for Macs, with their own GPU driver!) clearly consider Wayland their primary desktop stack, and only support X11 on a best-effort basis.
So the pressure to switch to Wayland is mounting! Is it ready now? What’s missing?
I’m testing with my lab PC, which is a slightly upgraded version of my 2022
high-end Linux PC.
I describe my setup in more details in stapelberg uses this: my 2020 desk
setup.
Most importantly for this article, I use a Dell 8K 32″
monitor (resolution: 7680x4320!), which, in my experience, is only compatible with nVidia graphics cards (I try other cards sometimes).
Hence, both the lab PC and my main PC contain an nVidia GPU:
For many years, nVidia drivers were entirely unsupported under Wayland.
Apparently, nVidia refused to support the API that Wayland was using, insisting that their EGLStreams approach was superior. Luckily, with nVidia driver 495 (late 2021), they added support for GBM (Generic Buffer Manager).
But, even with GBM support, while you could now start many Wayland sessions, the session wouldn’t run smoothly: You would see severe graphics glitches and artifacts, preventing you from getting any work done.
The solution for the glitches was explicit sync support: because the nVidia driver does not support implicit sync (like AMD or Intel), Wayland (and wlroots, and sway) needed to get explicit sync
support.
Sway 1.11 (June 2025) and wlroots 0.19.0 are the first version with explicit sync support.
With the nVidia driver now working per se with Wayland, unfortunately that’s still not good enough to use Wayland in my setup: my Dell UP3218K
monitor requires two DisplayPort 1.4 connections with MST (Multi Stream Transport) and TILE support. This combination worked just fine under X11 for the last 8+ years.
While GNOME successfully configures the monitor with its native resolution of 7680x4320@60, the monitor incorrectly shows up as two separate monitors in sway.
The reason behind this behavior is that wlroots does not support the TILE
property (issue #1580 from
2019). Luckily, in 2023, contributor EBADBEEF sent draft merge request
!4154, which adds support for the TILE property.
But, even with the TILE patch, my monitor would not work correctly: The right half of the monitor would just stay black. The full picture is visible when taking a screenshot with grim, so it seems like an output issue. I had a few exchanges about this with EBADBEEF starting in August 2025 (thanks for taking a look!), but we couldn’t figure out the issue.
A quarter later, I had made good experiences regarding debugging complex issues with the coding assistant Claude Code
(Opus 4.5 at the time of writing), so I decided to give it another try. Over two days, I ran a number of tests to narrow down the issue, letting Claude analyze source code (of sway, wlroots, Xorg, mesa, …) and produce test programs that I could run manually.
Ultimately, I ended up with a minimal reproducer program (independent of Wayland) that shows how the SRC_X DRM property does not work on nVidia (but does work on Intel, for example!): I posted a bug report with a video in the
nVidia
forum
and hope an nVidia engineer will take a look!
Crucially, with the bug now identified, I had Claude implement a workaround: copy the right half of the screen (at SRC_X=3840) to another buffer, and then display that buffer, but with SRC_X=0.
With that
patch
applied, for the first time, I can use Sway on my 8K monitor! 🥳
By the way, when I mentioned that GNOME successfully configures the native resolution, that doesn’t mean the monitor is usable with GNOME! While GNOME supports tiled displays, the updates of individual tiles are not synchronized, so you see heavy tearing in the middle of the screen, much worse than anything I have ever observed under X11. GNOME/mutter merge request
!4822 should hopefully address this.
During 2025, I switched all my computers to NixOS. Its declarative approach is really nice for doing such tests, because you can reliably restore your system to an earlier version.
To make a Wayland/sway session available on my NixOS 25.11 installation, I added the following lines to my NixOS configuration file (configuration.nix):
I also added the following Wayland-specific programs to environment.systemPackages:
Note that activating this configuration kills your running X11 session, if any.
Just to be sure, I rebooted the entire machine after changing the configuration.
With this setup, I spent about one full work day in a Wayland session. Trying to actually get some work done uncovers issues that might not show in casual testing. Most of the day was spent trying to fix Wayland issues 😅. The following sections explain what I have learned/observed.
Many years ago, when Wayland became more popular, people asked on the i3 issue tracker if i3 would be ported to Wayland. I said no: How could I port a program to an environment that doesn’t even run on any of my computers? But also, I knew that with working a full-time job, I wouldn’t have time to be an early adopter and shape Wayland development.
This attitude resulted in Drew DeVault starting the
Sway project around 2016, which aims to be a Wayland version of i3. I don’t see Sway as competition. Rather, I thought it was amazing that people liked the i3 project so much that they would go through the trouble of creating a similar program for other environments! What a nice compliment! 😊
Sway aims to be compatible with i3 configuration files, and it mostly is.
If you’re curious, here is what I changed from the Sway defaults, mostly moving key bindings around for the NEO keyboard layout I use, and configuring input/output blocks that I formerly configured in my
~/.xsession
file:
I encountered the following issues with Sway:
I don’t know how I can configure the same libinput settings that I had before. See xinput-list-props-mx-ergo.txt
for what I have on X11. Sway’s available accel_profile settings do not seem to match what I used before.
The mouse cursor / pointer seems laggy, somehow?! It seems to take longer to react when I move the trackball, and it also seems to move less smoothly across the screen.
Simon Ser suspects that this might be because hardware cursor support might not work with the nVidia drivers currently.
No Xwayland scaling: programs started via Xwayland are blurry (by default) or double-scaled (when setting Xft.dpi: 288). This is a Sway-specific limitation: KDE fixed this in
2022. From
Sway issue #2966, I can tell that Sway developers do not seem to like this approach for some reason, but that’s very unfortunate for my migration: The backwards compatibility option of running older programs through Xwayland is effectively unavailable to me.
Sometimes, keyboard shortcuts seem to be executed twice! Like, when I focused the first of five Chrome windows in a stack and moved that window to another workspace, two windows would be moved instead of one. I also see messages like this one (not exactly correlated with the double-shortcut problem, though):
[ERROR] [wlr] [libinput] event0 - https: kinT (kint36): client bug: event
processing lagging behind by 32ms, your system is too slow
…and that seems wrong to me. My high-end Linux
PC certainly isn’t slow by any measure.
When I first started GTK programs like GIMP or Emacs, I noticed all fonts were way too large! Apparently, I still had some scaling-related settings that I needed to reset like so:
gsettings reset org.gnome.desktop.interface scaling-factor
gsettings reset org.gnome.desktop.interface text-scaling-factor
Some programs like geeqie apparently need an explicit export GDK_BACKEND=wayland environment variable, otherwise they run in Xwayland. Weird.
I also noticed that font rendering is different between X11 and Wayland! The difference is visible in Chrome browser tab titles and the URL bar, for example:
At first I thought that maybe Wayland defaults to different font-antialiasing and font-hinting settings, but I tried experimenting with the following settings (which default to font-antialiasing=grayscale and font-hinting=slight), but couldn’t get things to render like they did before:
gsettings set org.gnome.desktop.interface font-antialiasing ‘rgba’
gsettings set org.gnome.desktop.interface font-hinting ‘full’
Update: Thanks to
Hugo for pointing out that under Wayland, GTK3 ignores the ~/.config/gtk-3.0/settings.ini
configuration file and uses dconf exclusively! Setting the following dconf setting makes the font rendering match:
gsettings set org.gnome.desktop.interface font-name ‘Cantarell 11’
I quickly ran into a difference in architecture between the two programs:
i3lock shows a screen locker window. When you kill i3lock, the screen is unlocked.
When you kill swaylock, you end up in a Red Screen Of Death.
To get out of this state, you need to restart swaylock and unlock. You can unlock from the command line by sending SIGUSR1 to the swaylock process.
This was very surprising to me, but is by (Wayland) design! See Sway issue
#7046 for details, and this quote from the ext-session-lock-v1 Wayland protocol:
“The compositor must stop rendering and provide input to normal clients. Instead the compositor must blank all outputs with an opaque color such that their normal content is fully hidden.”
OK, so when you start swaylock via SSH for testing, remember to always unlock instead of just cancelling swaylock with Ctrl+C. And hope it never crashes.
I used to start i3lock via a wrapper script, which turns off the monitor (input wakes it up):
With Wayland, the DPMS behavior has to be implemented differently, with swayidle:
The i3 window manager can be extended via its IPC interface (interprocess
communication).
I use a few small tools that use this interface.
I noticed the following issues when using these tools with Sway:
On X11, I use the rxvt-unicode
...
Read the original on michael.stapelberg.ch »
I remember when PHP 4 was a thing. jQuery was new and shiny. Sites were built with tables, not divs. Dreamweaver felt like a life hack. Designs were sliced in Photoshop. Databases lived in phpMyAdmin.
It probably didn’t feel like it at the time, but looking back, those were simpler days. The entire concept of the development cycle could fit in my head. There was complexity in building web applications, but it was all manageable. If you had an idea, you could probably build it.
As a solo developer, you could manage everything. From idea to execution. Or at least, it felt that way.
I’m probably romanticizing the past, but you get the idea.
Today, it’s hard to do web development right.
On the frontend, you have build pipelines, bundlers, CSS frameworks with their own toolchains, progressive web apps, Core Web Vitals, SEO, layout shifts, srcset/responsive images… I remember when the biggest challenge was IE6 compatibility.
On the backend, there are design patterns, unit tests, code coverage, APIs, performance concerns, dependency management, infrastructure, monitoring, log tracing, observability…
Each area of expertise has grown up - probably for the better - but it also demands deeper domain knowledge. I chose to specialize in backend and server infrastructure. I had to step back from frontend work because I couldn’t keep up with its tooling while developing my backend skills.
As a solo developer, it’s now a lot harder to manage everything.
They’re far from perfect, but claude and codex gave me the leverage I desperately needed. They’ve brought me back to levels of productivity I haven’t felt in years. I feel like I can manage the entire stack again - with confidence.
I can go from idea to execution in days.
Suddenly, the complexity of each domain matters a lot less.
Oh no, you’re vibe coding - bet it’s all slop and code noise!
Over the past two decades, I’ve worked with a lot of talented people: backend developers, frontend developers, marketers, leaders, and more. I can lean on those experiences, fall back on how they did things, and implement their methods with AI.
I can reliably reproduce their coding standards, tone of voice, tactics, and processes. Starting a new project once felt insurmountable. Now, it feels realistic again.
When AI generates code, I know when it’s good and when it’s not. I’ve seen the good and the bad, and I can iterate from there. Even with refinement and back-and-forth prompting, I’m easily 10x more productive with AI than without it.
The goal hasn’t changed: build quality software that meets modern standards. The goalpost is still far out. But now I have a rocket-powered soccer ball - and I can finally reach it again.
There’s mental space for creativity in building software again.
My head isn’t constantly full of build pipelines, testability concerns, code patterns, unfixed bugs… I’m confident I can cover that with help from AI. It still needs to be done, but it’s done so much faster - and it no longer feels overwhelming.
That leaves room to experiment with UI and UX, to try ideas and throw them away. To add small quality-of-life improvements I couldn’t justify before, because there was always something more urgent.
It’s also not the typing of code that I really enjoy, nor is it the syntax or structure or boilerplate that’s required to build anything. It’s the fact you get to build something out of nothing, writing code was just how you got there. And with today’s tooling, that saves a ton of time.
AI really has made web development fun again.
...
Read the original on ma.ttias.be »
Since 2009, this website has run on Drupal. Starting with Drupal 6, and progressing through major site upgrades and migrations to 7, 8, 9, and 10, I used the site as a way to dogfood the same CMS (Content Management System) I used in my day job for over a decade.
But as time progressed—especially after completing a grueling upgrade from Drupal 7 to 8—my enthusiasm for maintaining what’s now a more enterprise-focused Digital Experience Platform or ‘DXP’ for a personal blog has waned.
Not to mention, the blog is a passion project. I use it as a scratchpad for thoughts, and deeper dives for my YouTube videos. Time spent maintaining a complex CMS is time I can’t spend actually writing (not to mention time spent on everything else in life!).
I’ve moved other hobby sites to static hosting. For older sites I don’t actively update, I scrape and mothball them. But for sites I wanted to keep active, I converted them to Jekyll or Hugo, both of which are competent and full-featured modern SSGs (Static Site Generators).
Jekyll is perfect for the static sites I host for free on GitHub Pages, like the Raspberry Pi PCIe Database or Project MINI RACK, but I’m not a Ruby programmer, so I like Hugo for anything I run on my own infrastructure (like Geerling Engineering). It’s simpler to set up and a little faster.
Anyway, I’ve been working on the migration in this GitHub issue, and there are bound to be mistakes, broken image references, and probably some old URLs that just go poof!
I try to keep everything where it is, or add redirects. But with 20 years of baggage and 3500+ posts (many of those were individual photos converted into ‘blog’ nodes in a prior upgrade… oops!), it’s hard to run a perfect migration.
I’ve been writing all my posts in Markdown since 2020, and even before that, was drafting them in Markdown in Sublime Text, then exporting that to HTML via MarkdownPreview.
So having a tool (Hugo) that uses Markdown natively is a breath of fresh air.
Beyond that, I’ve grown fond of ‘sticking to the defaults’ over the years. On my initial Drupal 6 site, I installed something like 30 modules (plugins in Drupal parlance), but almost all of those modules bit me in one way or another as I upgraded to Drupal 7, 8, 9, or 10…
Honestly, upgrading from 8 to 9 to 10 was easier than 6 to 7 and 7 to 8, simply because I had stripped my site down to the basics.
However, in so doing, I also made my content authoring experience a bit horrid:
Write a blog post on my computer in a Markdown filePaste the Markdown content into the body and add a titlePut cursor where each picture goes in the content, scroll down to the uploaded picture, click ‘Insert’ to insert the preformatted markup, and rinse-and-repeat for all images (sometimes up to 25-30 per post!).Clear out the ‘Authored on’ field to make sure the date would update when I publish the postToggle the ‘Published’ option and save the nodeRun an Ansible playbook to drop Drupal caches, Nginx caches, and trigger a Cloudflare purge of the relevant URLs (ongoing DDoSes since 2022 caused me to really lock down my caching)…
It was a lot. Just to publish a blog post—and none of that helped with writing or being creative, it was just a bunch of work.
Yes, I could automate each step in Drupal. There are even modules for Drupal, like Scheduler for scheduling posts and updating publish dates, and Cloudflare for purging CDN cache… but you know what? I used to use those modules, but after four Drupal upgrade cycles, I was burned out on managing patches for months, years, or indefinitely since some of the modules took that long to have a stable release for [current Drupal version].
And don’t get me started on having to rebuild entire content authoring workflows (e.g. WYSIWYG editors, media management, and content fields) every time a major Drupal version was released! That specific type of churn, thankfully, is not as bad these days, but it was really bad prior to Drupal 10 or so.
For Hugo, since my workflow already started with a Markdown file… the whole process is done after step 1, basically.
To publish, I guess I do have to update the date in my post’s frontmatter, and change draft to false, but that’s about it. hugo && git commit -m “Updated post.” && git push and the blog is up to date!
And for maintenance, don’t get me started on managing Composer, Drush, PHP, MariaDB, Nginx, Cloudflare, etc. — for an enterprise website, with multiple content workflows, dozens or hundreds of users with RBAC, etc., sure, it’s fine. But for a blog where I just want to write and publish, it has been wearing me down for the past few years.
Comments will be missing site-wide initially, as I’ve chosen to tackle a self-hosted static site commenting system in a ‘phase two’. I love having comments enabled, despite the moderation overhead, and don’t think blogging is the same without them.
I also loved having integrated site search, since I use my blog as a project journal, referencing it often. The Drupal site was integrated into an Apache Solr search instance I also ran as part of Hosted Apache Solr… which I sunset years ago at this point. So I’ll have to decide how I want to implement search within Hugo.
...
Read the original on www.jeffgeerling.com »
I run six Claude Code agents in parallel from my phone. No laptop, no desktop—just Termius on iOS and a cloud VM.
flowchart LR
A[Phone] –>|Termius + mosh| B[Tailscale VPN]
B –> C[Vultr VM]
C –> D[Claude Code]
D –>|PreToolUse hook| E[Poke webhook]
E –>|Push notification| A
The loop is: kick off a task, pocket the phone, get notified when Claude needs input. Async development from anywhere.
I pay only when working. Two scripts handle lifecycle:
I also have an iOS Shortcut that calls the Vultr API directly—start the VM from my phone before I even open Termius.
The VM’s public IP has no SSH listener. All access goes through Tailscale’s private network. Defense in depth: cloud firewall blocks everything except Tailscale coordination, local nftables as backup, fail2ban for good measure.
Termius handles SSH and mosh on iOS/Android. Mosh is the key—it survives network transitions. Switch from WiFi to cellular, walk through a dead zone, put the phone to sleep. The connection persists.
One gotcha: mosh doesn’t forward SSH agent. For git operations that need GitHub auth, I use regular SSH inside tmux.
The shell auto-attaches to tmux on login. Close Termius, reopen hours later, everything’s still there.
Multiple Claude agents run in parallel windows. C-a c for new window, C-a n to cycle. Works well on a phone keyboard.
This is what makes mobile development practical. Without notifications, you’d constantly check the terminal. With them, you can walk away.
When Claude calls AskUserQuestion, the hook fires. A simple script extracts the question and POSTs to Poke’s webhook:
I run Claude Code in permissive mode. The VM is isolated—no access to production systems, no secrets beyond what’s needed for development. Worst case: Claude does something unexpected on a disposable VM.
Cost control adds another layer. The VM costs $0.29/hr. Even if something runs away, the daily cap is bounded.
~/Code/myproject/ # main
~/Code/myproject-sidebar/ # feature branch
~/Code/myproject-dark-mode/ # another feature
Each worktree gets its own tmux window with a Claude agent. Port allocation is hash-based—deterministic from branch name, no conflicts:
hash_val = sum(ord(c) for c in branch_name)
django_port = 8001 + (hash_val % 99)
Six agents, six features, one phone.
Review PRs while waiting for coffee. Kick off a refactor on the train. Fix a bug from the couch while watching TV.
The pattern: start a task that will take Claude 10-20 minutes, do something else, get notified, respond, repeat. Development fits into the gaps of the day instead of requiring dedicated desk time.
The setup took one Claude Code session to build—gave it my Vultr API key and access to gh, asked for a secure dev VM. Now I code from my phone.
...
Read the original on granda.org »
First Published by Analog Magazine in 1989
He worked with computers; she worked with trees, and the flowers that took hold on the sides of the Mountain.
She was surprised that he was interested in her. He was so smart; she was so … normal. But he was interesting; he always said something new and different; he was nice.
She was 25. He was older, almost 33; sometimes, Jack seemed very old indeed.
One day they walked through the mist of a gray day by the Mountain. The forest here on the edge of Rainier glowed in the mist, bright with lush greens. On this day he told her about the future, the future he was building.
Other times when he had spoken of the future, a wild look had entered his eyes. But now his eyes were sharply focused as he talked, as if, this time, he could see it all very clearly. He spoke as if he were describing something as real and obvious as the veins of a leaf hanging down before them on the path.
“Have you ever heard of Singularity?” he asked.
She shook her head. “What’s that?”
“Singularity is a time in the future. It’ll occur when the rate of change of technology is very great–so great that the effort to keep up with the change will overwhelm us. People will face a whole new set of problems that we can’t even imagine.” A look of great tranquility smoothed the ridges around his eyes. “On the other hand, all our normal, day to day problems fade away. For example, you’ll be immortal.”
She shook her head with distaste. “I don’t want to live forever,” she said.
He smiled, his eyes twinkling. “Of course you do, you just don’t know it yet.”
She shuddered. “The future scares me.”
“There’s no reason to fear it. You’ll love it.” He looked away from her. His next words were bitter, but his tone was resigned. “It pisses me off that you’ll live to see it and I won’t.”
Speaking to the sorrow in his voice, she tried to cheer him. “You’ll live to see it too,” she replied.
He shook his head. “No. I have a bad heart. My father died young from a heart attack, and so did my father’s father. If I’m lucky, I have maybe 30 more years. It’ll take at least a hundred years for us to get to Singularity. ”
“Then I’ll be dead before it happens, too. Good,” she said.
He chuckled. “No. You’ll live long enough, so that they’ll figure out how to make you live long enough so that you can live longer.”
“You’re still only 7 years older than I am.”
“Ah, but you have your mother’s genes. She looks very young.”
She smiled, and changed the subject. “I’ll have to tell her you said that. She’ll like it.”
There was a long pause. Then she confessed, “My grandfather is 92, and he still cuts the grass every week.”
She was adamant. “I’ll live to be 80 or 90. I don’t want to live longer than that.”
“Not if you’re crippled, of course not. But they’ll find ways of rejuvenating you.” He laughed knowingly. “You’ll look older when you’re 60 than when you’re 120″ he said.
She just shook her head.
Another time, as they walked in the sun along the beach of Fox Island, he told her more about the future. “You’ll have a headband.” He ran his fingers across his forehead; he squinted as the wind blew sand in his eyes. “It’ll allow you to talk right to your computer.”
She frowned. “I don’t want to talk to a computer.”
“Sure you do. At least, you will. Your computer will watch your baby all night long. If it sees something wrong, it’ll wake you.” Wicked delight widened his smile, and she knew he would now tell her something outrageous. “While you’re laying in bed with your eyes closed, you’ll look at your baby through your computer’s TV camera to see if it’s something serious.”
“Of course, there’s a tiny chance, really tiny, that an accident could scramble your memories.”
The thought made her dizzy with horror. “I would rather die.” She grabbed his arm and pulled him under the bridge, out of the wind. She shuddered, though unsure whether her chill came from the wind or the fear.
He changed his tack. Pointing at a scattering of elaborate seaside mansions across the water, he asked, “Would you like to live in one of those?”
She studied them. “Maybe that one,” she said, pointing at a beautiful old Victorian home. “Or that one.” She pointed at another, very different from the first, a series of diagonal slashes with huge windows.
“Have you ever heard of nanotechnology?” he asked.
“Well, with nanotechnology they’ll build these tiny little machines–machines the size of molecules.” He pointed at the drink in her hand. “They’ll put a billion of them in a spaceship the size of a Coke can, and shoot it off to an asteroid. The Coke can will rebuild the asteroid into mansions and palaces. You’ll have an asteroid all to your self, if you want one.”
“I don’t want an asteroid. I don’t want to go into space.”
He shook his head. “Don’t you want to see Mars?You liked the Grand Canyon; I remember how you told me about it. Mars has huge gorges–they make the Grand Canyon look tiny. Don’t you want to see them? Don’t you want to hike across them?”
It took her a long time to reply. “I guess so,” she admitted.
“I won’t tell you all the things I expect to happen,” he smiled mischievously, “I’m afraid I’d really scare you. But you’ll see it all. And you’ll remember that I told you.” His voice grew intense. “And you’ll remember that I knew you’d remember.”
She shook her head. Sometimes Jack was just silly.
They never made love, though often, they fell asleep in each other’s arms. Sometimes she wondered why; she wondered if he also wondered why. Somehow it just didn’t seem important.
He seemed so at home in the deep forest, he so clearly belonged on the Mountain, she first thought they might stay together forever. But one day she went with him to his office. She watched as he worked with computers, as he worked with other people. He was as natural a part of their computer world as he was a part of her Mountain world.
Working in that alien world, he was a different person. In the woods, he was a calm source of sustaining strength. Here, he was a feverish instructor. His heart belonged to the forest, but his mind, she realized, belonged to the machines that would build his vision.
One day he received a call. A distant company gave him an offer he could not refuse. So he went to California, to build great computers, to hurry his vision to fruition.
She stayed by the Mountain. She walked the snows, and watched the birds fly overhead. Yet no bird flew so high that she could not climb the slopes of Rainier until she stood above them.
He would come to visit on weekends sometimes, and they would backpack, or ski cross country. But his visits became less frequent. He would write instead. That too decreased in regularity. One letter was the last, though neither of them knew it at the time.
A year passed. And by then, it just didn’t seem to matter.
She married a forest ranger, a bright, quiet man with dark eyes and a rugged face. They had three small children and two large dogs, friendly dogs with thick soft fur. She loved all the members of her family, almost all the time; it was the theme that never changed though she thought about different things at different times.
Her children grew up and moved away.
Erich, the beautiful red chou, went to sleep one night and never awakened.
A terrible avalanche, from a seemingly safe slope, fell down the Mountain and buried a climbing team, her husband among them.
Haikku, her mighty and faithful akita,whimpered in his old age. He crooned his apology for leaving her alone, and that night he joined Erich and her husband.
She was 82. She had lived a long and happy life. She was not afraid to die. But she stood outside in the snow and faced a terrible decision.
Overnight, a thick blanket of new white powder had fallen, burying her sidewalk. Standing in the snow, she stared at a mechanical beast her children had given her years before. It represented one possible choice.
In one hand she held a shovel. In the other hand she held a small capsule. The capsule was another gift her children had given her. They had begged her to take it. Until now, she had refused. The capsule represented another choice.
Her back was aching. It was an ache that sometimes expanded, shooting spikes of pain down her legs. Today the pain was great; she could not shovel the sidewalk.
The mechanical beast was a robot, a fully automatic snow remover. She could just flip a switch and it would hurl the snow away, but that seemed grotesque; the noise would be terrible, the mounds of thoughtlessly discarded snow would remain as an unseemly scar until late spring.
She opened her hand and looked at the capsule. It was not a pill to make her younger; that much her children had promised her. They knew she would reject such a thing out of hand. But the millions of tiny machines tucked inside the capsule would disperse throughout her body and repair every trace of damage to her bones. They would also rebuild her sagging muscle tissue. In short, the pill would cure her back and make the pain go away.
The thought of all those little machines inside her made her shudder. But the thought of the automatic snow remover made her sick.
She went back inside the house to get a glass of water.
In a few days her back felt fine; her healthy muscles gave her a feeling of new vigor, and the vigor gave rise to a yearning to go out and do things that she had not considered for many years. She started to climb the Mountain, but it was too much for her: she huffed and puffed and had to go home. Annoyed, she went to the drug store and bought another capsule, one that restored her circulatory system and her lungs. Her next assault on the Mountain carried her as far as she dared, and the steady beat of her heart urged her to go on despite the crumbling snow.
But she was getting increasingly forgetful. Things that had happened years earlier were clear in her mind, but she could not remember what she needed at the store. One day she forgot her daughter’s telephone number, and found that she had forgotten where she had misplaced the phone book. The store had another capsule that tightened up her neural circuitry. After taking it, she discovered a side effect no one had bothered to mention. The pill did not merely make her memory effective again; rather, it made her memory perfect. With a brief glance through the pages of the phone book, she found she no longer needed it. She shrugged and continued on with her life.
One day as she skied across the slopes, a stranger passed her going the other way. He was tall and rugged, and he reminded her of her husband. She was annoyed that he did not even look at her, though she had smiled at him; when she looked in the mirror upon returning home, she understood why. She was 95 years old; she looked like an old woman. It was ridiculous; fortunately it was easily fixed.
When she turned 115 she stabilized her physical appearance. Thereafter, she always appeared to be about the age of 32.
She still owned the snug little house she thought of as home. But she slept more often in the tent she carried in her pack. Built with nanomachined equipment, the pack was lighter than any other she had ever owned, yet it was impossibly strong. All her tools performed feats she would once have thought miraculous, and none weighed more than a pound. She lived in great comfort despite the inherent rigors of the glacier-crusted slopes.
One day, she was climbing along the ancient trail from Camp Muir toward the summit, crossing the ridges to reach Disappointment Cleaver. As she stepped over the last ridge to the broad flat in front of the Cleaver, she saw a man standing alone. He was staring up the steep ice flows overhead. He stepped backward, and backward, and turned to walk briskly in her direction. She continued forward to pass him, but he cried out, “Stop!”
She obeyed the fear in his voice. He paused, and his eyes came unfocussed for a moment. He pointed to the right of the ridge she had just crossed, a fin of rock rising rapidly along the mountain’s edge. “Up there,” he said, “Quickly.” He broke into a hobbling run across snow that sometimes collapsed under his heavy step. She followed, her adrenalin rising with her bewilderment.
A massive Crack! filled the air. Far above the Cleaver, an overhanging ledge of ice snapped off and fell with an acrobat’s graceful tumbling motion to the flat where they had just been standing. The mass qualified as a large hill in its own right. When it landed it broke into a thousand huge pieces. Some of the pieces ground each other to powder, while others bounced off the flat, down another precipice of several thousand feet, to crash again in a duller explosion of sound.
The ice fall was an extraordinary event to witness under any circumstance; the narrowness of escape from death that accompanied it overlayed the experience with a religious awe.
She heard the man panting next to her. She turned to study him more carefully.
He was unremarkable for a mountaineer; his lean form supported long straps of hard muscle, and the reflected sun from the glaciers had given him a coffee-colored tan. Then she noticed the sweatband across his head. It was not just a sweatband: she could see from the stretch marks that a series of thin disks ran across within the cotton layers. She realized he was wearing a nection, a headband to connect his mind with distant computers.
She recoiled slightly; he smiled and touched his forehead. “Don’t be too upset,” he said, “my headband just saved your life.”
She stuttered. “I wasn’t upset,” she said, though she knew that he knew she was lying. “I’ve just never seen one up close before.”
It was true. Her grandchildren told her that nections were quite common in space, but on Earth they were almost illegal. It was socially unacceptable to wear one, and when the police saw a nection-wearing person they would use any excuse to hassle the individual. But there were no specific laws against them.
When her grandchildren had told her that they wore headbands all the time, she had tried only briefly to dissuade them; she had spent more time listening to their descriptions of the headband’s capabilities. Her grandchildren’s description sounded considerably different from the list of dangers usually described on the news.
The man who had saved her life watched her for several more seconds, then apparently made up his mind about something. “You really ought to get one yourself, you know. Do you realize how dangerous this mountain is? And it’s getting more dangerous every year.”
She started to tell him that she knew perfectly well how dangerous it was–then stopped, thinking back over the years, realizing that it had, by gradual degrees, grown worse every year.
“With my headband, I see things better,” he explained. “I confess I don’t understand why very well–I mean, it doesn’t affect my eyesight. But I notice more things about what I see, and I can get a view of what the extra things mean–like how that piece of ice would fall, and more or less when.”
She nodded her head, but her mind was distracted. The Mountain was changing! The Mountain was getting more dangerous! The rapid alternation of clear, sunny days with cool, misty days had become more vigorous over the course of the last 50 years, leading to more weak layers and ice faults. She had never really noticed until now.
Then the full impact of her savior’s words struck her–she held her hands to her throat as she considered how her husband had died. She realized that, with a nection, his death could have been prevented.
She smiled at the man. They talked; she invited him to dinner at Alexander’s.
When she returned home, she started searching through electronic equipment catalogs. If she bought one mail order and wore it only while hiking, there was no reason for any of her friends ever to know.
It was a simple white headband, soft absorbent cotton. She slipped it on her head, expecting to feel something special, but nothing happened. She started to clean the house, still waiting for something to happen. It never did. Eventually she sat down and read the instructions that had come with the headband.
The instructions told her to start with a simple request, and to visualize herself projecting the request at her forehead. She projected the request, “2 times 2?” just above her eyes. Nothing seemed to happen. She knew the answer was 4.
She tried again, and this time she noticed a kind of echo–she knew the answer was 4, but the thought of the answer came to her twice, in rapid succession. The next time she tried it, she noticed that the echo seemed to come from her forehead.
Next she projected a request to divide 12345 by 6789. She didn’t know the answer–but wait, of course she did, it was 1.81838. Of course, she didn’t know the answer to many decimal places–but as she thought about it, she realized the next digit was 2, the next was 6, then at an accelerating pace more digits roared from her memory–she shook her head, and the stream stopped. She took the headband off, shaking a little. She didn’t try it again until the next day.
A week later, she hiked past Camp Schurman and peered up the slope. She projected her view of the slope through her forehead to study the patterns of snow and ice.
It did indeed look different as she looked at it this way. She had a sensation similar to that of looking at the edges of a cube on a sheet of paper: at one moment, the lines formed a cube with the top showing. The next moment it was an alternate cube with the bottom exposed. She could flip the cube, or at least the way she looked at it, at will.
In the same manner she could now see patterns of slippage in the layers of ice crystals; then she would flip the image and it was just snow, the beautiful work of nature that she had loved all her life.
For a moment she wished she could see it from above as well–and her heart skipped a beat as the wish came true. Suddenly she was looking down from a great height. She saw the long curves of shadows across the snow from high above, and she saw the shorter but distinctive shadow of a woman with a pack standing on the snow field. She threw the headband to the ground even as she realized what she had just seen: a view of the Mountain from a satellite passing by.
She stared at the white headband, almost invisible in the white snow, for a long time. She felt distaste, wonder, fear, and curiousity. Curiousity finally won out. She twisted the headband back on. She blinked her mind’s eye, blinking from her own eyes to the satellite’s eyes and back again, a moment’s taste of the new sensation.
Vertigo struck her. Though the satellite was interesting, it was not comfortable. She would not look at the world from a satellite’s height often, but it was yet another life-saving form of sight: from a distance, it was easy to spot a depression in the snow that might signal an underlying crevasse, even though the depression was too shallow to be seen close up. Such crevasses were invisible until one stepped through to a long fatal plunge to the Mountain’s heart.
The headband was so clearly a life saving tool, why were people so set against it? Why did some of her friends support laws proscribing it?
It didn’t make any difference; she had no need of it except here on the Mountain.
Though the fight over the headband’s legal status did not at first interest her, it became an increasing impediment to her life. The headband was quite useful in a number of ways; though each individual use was trivial, in sum they qualitatively effected her life. She stopped tracking her checkbook; it was all in her head, all the transactions, the current balance, and even the encumbrances. When she awoke in the morning she could turn on the coffee pot if she wanted to, without getting up.
She wore her headband while hiking, and while working around her house; but she dared not wear it to work. One day an ecologist asked her a question about the marmots that inhabited the park. She grew angry as she had to manually root through the computer systems trying to find the answer, for she knew that the answer was available for the mere thinking about it if she could wear her headband. That night she stopped at the drugstore and bought two more capsules.
She swallowed one. This capsule was nastier than the others she had taken in earlier years. Before, the nanomachines she had swallowed had gone through her body, fixing what was not right, then flushing themselves out again. But the machines in this one would build, just under her forehead, a subcutaneous nection.
The other capsule would dissolve the nection away if she decided she didn’t like it.
When she awoke the next morning she was very hungry. She felt her forehead, but there wasn’t anything there.
The next morning she felt her forehead again, and it was … different. She looked in the mirror; with the flickering double vision of her eyes and the analysis from her forehead, she could see on the one hand that she looked the same as always. Yet on the other hand, there were curves there she hadn’t noticed before. When she went in to work, one man complimented her on her new hair color.
No one else commented until her boss arrived. When he entered the reception area and looked at her, his eyes lit up, and he laughed.
She looked at him with mild annoyance. Then she noticed, again with her double vision, that there were very shallow curves in his forehead.
...
Read the original on www.skyhunter.com »
People say “Comments should explain why, not what.” I feel like starting a flame war today so I’m going to argue that comments should explain ‘what’ too. Please don’t use this as justification to write bad code, okay? Okay.
First of all, why shouldn’t comments explain ‘what’? If you need comments to explain what’s going on, it suggests your code is unclear. If I write
//weight, radius, price
w = 10, r = 9, p = 1
That’s not as clear as saying
weight = 10, radius = 9, price = 3
“But it’s obvious that w is weight!” Sure, if you’re seeing those lines back-to-back. But presumably you’re initializing the variable to use it, which means that it’s going to appear later. When you see w later in the body, you need to go back and check what it is. That’s a frustrating context switch and you may skip it, possibly assuming that w is… width. Then bad things happen. So comments are not a substitute for clean code.
Okay, so why should comments explain why? Some people argue that we should instead store the ‘why’ in commit messages or tests. Most people feel icky about this, though. Given:
// Clear twice to deal with bug ABC in library XYZ, see [link]
XYZ.clear(); XYZ.clear();
Would you prefer that comment be removed and placed in the commit message? Then if you want to learn why XYZ.clear() is repeated twice, you have to dig up the commit. That can be a difficult and tedious job, especially if the line was reformatted, moved between files, anything that makes git blame not work. Searching all that is a context switch and you may skip it, possibly assuming that it’s a bug you can remove. Then bad things happen.
Both of these cases share the same problem: looking things up is hard. Best case it’s a context switch that takes time away from understanding the problem. Worst case you don’t look it up and make a potentially-dangerous assumption. It’s better to keep the information in the exact same place that you need it, whether that’s via descriptive code or comments over commits.
Now for the weird part. What if your descriptive code forces a context switch? Let’s take the code from Bob Martin’s Extract Till You Drop.
To make it more understandable, he replaces it with this:
So much better, right?! replace is now two lines instead of ten. But now there’s six other methods you have to read to understand how the class works. “But it’s easier to follow.” Not if I’m trying to track down a bug and I have to keep scrolling up and down, jumping from method to method to understand the whole. Is that really so much better than using comments?
I think that’s more understandable than either the original case or the clean code case, because you don’t have to context switch to a different method to understand what’s going on. Obviously this isn’t always the case, and often comments are superfluous. I’m just saying that there are at least a few cases where writing a ‘what’ comment is the right choice, so we shouldn’t reject them out-of-hand.
...
Read the original on www.hillelwayne.com »
Not too long ago, I made a living working as a contractor where I would hop from project to project. Some were short term where I would work for a week and quickly deliver my service. Others lasted a couple months where I would make enough money to take some time off. I preferred the short ones because they allowed me to charge a much higher rate for a quick job. Not only I felt like my own boss, but I also felt like I didn’t have to work too hard to make a decent living. My highest rates were still reasonable, and I always delivered high quality service. That was until I landed a gig with a large company.
This company contacted me in urgency and the manager told me they needed someone right away. Someone who required minimum training for maximum performance. For better or worse, that was my motto. This project was exactly the type of work I liked. It was short, fast, and it paid well.
After negotiating a decent rate, I received an email with the instructions. They gave me more context for the urgency. Their developer left without prior warning and never updated anyone on the status of his project.
We need your full undivided attention to complete this project. For the duration of the contract, you will work exclusively with us to deliver result in a timely manner. We plan to compensate you for the trouble.
The instructions were simple: Read the requirements then come up with an estimate of how long it would take to complete the project. This was one of the easier projects I have encountered in my career. It was an HTML page with some minor animations and a few embedded videos. I spent the evening studying the requirements and simulating the implementation in my head. Over the years, I’ve learned not to write any code for a client until I have a guarantee of pay.
I determined that this project would be a day’s worth of work. But to be cautious, I quoted 20 hours with a rough total of $1500. It was a single HTML page after all, and I can only charge them so much. They asked me to come on site to their satellite office 25 miles away. I would have to drive there for the 3 days I would be working for them.
The next day, I arrived at the satellite office. It was in a shopping center where a secret door led to a secret world where a few workers where churning quietly in their cubicles. The receptionist presented me with a brand new MacBook Pro that I had to set up from scratch. I do prefer using a company’s laptop because they often require contractors to install suspicious software.
I spent the day downloading my toolkit, setting up email, ssh keys, and requesting invites to services. In other words, I got nothing done. This is why I quoted 20 hours, I lost 8 hours of my estimated time doing busy work.
The next day, I was ready to get down to business. Armed with the MacBook Pro, I sent an email to the manager. I told him that I was ready to work and that I was waiting for the aforementioned assets. That day, I stayed in my cubicle under a softly buzzing light, twiddling my fingers until the sun went down.
I did the math again. According to my estimate, I had 4 hours left to do the job, which was not so unrealistic for a single HTML page. But needless to say, the next day, I spent those remaining 4 hours in a company sponsored lunch where I ate very well and mingled with other employees.
When the time expired, I made sure to send the manager another email, to let him know that I had been present in the company only I had not received the assets I needed to do the job. That email, of course, was ignored.
The following Monday, I hesitantly drove the 25 miles. To my surprise, the manager had come down to the satellite office where he enthusiastically greeted me. He was a nice easy-going guy in his mid thirties. I was confused. He didn’t have the urgency tone he had on the phone when he hired me. We had a friendly conversation where no work was mentioned. Later, we went down to lunch where he paid for my meal. It was a good day. No work was done.
Call me a creature of habit, but if you feed me and pamper me everyday, I get used to it. It turned into a routine. I’d come to work, spend some time online reading and watching videos. I’d send one email a day, so they know I am around. Then I’d go get lunch and hangout with whomever had an interesting story to share. At the end of the day, I’d stand up, stretch, let out a well deserved yawn, then drive home.
I got used to it. In fact, I was expecting it. It was a little disappointing when I finally got an email with a link that pointed to the assets I needed for the job. I came back down to earth, and put on my working face. Only, after spending a few minutes looking through the zip file, I noticed that it was missing the bulk of what I needed. The designer had sent me some Adobe Illustrator files, and I couldn’t open it on the MacBook.
I replied to the email explaining my concerns and bundled a few other questions to save time. At that point, my quoted 20 hours time had long expired. I wanted to get this job over with already. Shortly after I clicked on send, I received an email. All it said was: “Adding Alex to the thread,” and Alex was CC’d to the email. Then Alex replied where he added Steve to the thread. Steve replied saying that Michelle was a designer and she would know more about this. Michelle auto responded saying that she was on vacation and that all inquiries should be directed to her manager. Her manager replied asking “Who is Ibrahim?” My manager replied excusing himself for not introducing me.
As a contractor, I am usually in and out of a company before people notice that I work there. Here, I received a flood of emails welcoming me aboard. The chain of emails continued for a while and I was forced to answer to those awfully nice messages. Some people were eager to meet me in person. They got a little disappointed when I said that I was all the way down in California. And jealous, they said they were jealous of the beautiful weather.
They used courtesy to ignore my emails. They used CC to deflect my questions. They used spam to dismiss anything I asked. I spent my days like an archaeologist digging through the deep trenches of emails, hoping to find answers to my questions. You can imagine the level of impostor syndrome I felt every time I remembered that my only task was to build a single static HTML page. The overestimated 20 hours project turned into a 7 weeks adventure where I enjoyed free lunches, drove 50 miles everyday, and dug through emails.
When I finally completed the project, I sent it to the team on github. All great adventures must come to an end. But shortly after, I received an invitation to have my code reviewed by the whole team on Google Hangout. I had spent more than a month building a single static HTML page and now the entire team would have to critique my work? In my defense, there was also some JavaScript interactions, and it was responsive, and it also had CSS animations… Impostor.
Of course, the video meeting was rescheduled a few times. When it finally happened, my work and I were not the subject of the meeting. They were all sitting in the same room somewhere in New York and talked for a while like a tight knit group. In fact, all they ever said about the project was:
Person 1: Hey is anyone working on that sponsored page?
Person 2: Yeah, I think it’s done.
Person 1: Great, I’ll merge it tonight.
When I went home that night, I realized that I was facing another challenge. I had been working at this company for 7 weeks, and my original quote was for $1,500. That’s roughly the equivalent of $11,100 a year or $214 a week. Or even better, it was $5.35 an hour.
This barely covered my transportation. So, I sent them an invoice where I quoted them for 7 weeks of work at the original hourly rate. The total amounted to $18,000. I was ashamed of course, but what else was I supposed to do?
Just like I expected, I got no reply. If there is something that all large companies have in common, it’s that they are not very eager to pay their bills on time. I felt like a cheat charging so much for such a simple job, but this was not a charity. I had been driving 50 miles everyday to do the job, if the job was not getting done it was not for my lack of trying. It was for their slow responses.
I got an answer the following week. It was a cold email from the manager where he broke down every day I worked into hourly blocks. Then he highlighted those I worked on and marked a one hour lunch break each day. At the end he made some calculations with our agreed upon hourly rate.
Apparently, I was wrong. I had miscalculated the total. After adjustment, the total amount they owed me was $21,000.
Please confirm the readjusted hours so accounting can write you a check.
I am writing a book! Join me in my journey.
...
Read the original on idiallo.com »
To add this web app to your iOS home screen tap the share button and select "Add to the Home Screen".
10HN is also available as an iOS App
If you visit 10HN only rarely, check out the the best articles from the past week.
If you like 10HN please leave feedback and share
Visit pancik.com for more.