HN user

nrr

764 karma

I took econometrics on a dare once. You can't just describe a real-world change as an exogenous shock in general.

I get told "no" a lot.

I schwätz noch d'Muddasprooch.

I make a point not to reply to throwaway accounts. Sorry.

I only play a systems software engineer on TV; I originally went to school to be an actuary. I am cursed to live a life being intimately familiar with both Excel and Linux kernel internals.

The purpose of a system is not what its builders say it does but instead what it actually does. As it turns out, that's important to keep in mind.

"I HAVE NO TOOLS BECAUSE I'VE DESTROYED MY TOOLS WITH MY TOOLS." https://www.usenix.org/system/files/1311_05-08_mickens.pdf

topcolor: aaaaaa

pronoun.is/he/him

[ my public key: https://keybase.io/nrr; my proof: https://keybase.io/nrr/sigs/mUwfAxr143F7sGzkfa65fPWi1OnSD3zhNyaE0UdmROA ]

Posts16
Comments324
View on HN

"There's no foresight. There's no planning." Couple that with "as an expression of agility," and it really rings true to me. I've worked in enough shops where the contractual obligations preclude any ability to slow down and put together a plan. A culture where you're forced to go from an angry phone call from the suits to something running in production in mere hours is a culture that finds building bookcases out of mashed potatoes acceptable.

The best environment I've ever worked in was, ironically enough, fully invested in Scrum, but it wasn't what's typical in the industry. Notably, we had no bug tracker[0], and for the most part, everyone was expected to work on one thing together[1]. We also spent an entire quarter out of the year doing nothing but planning, roleplaying, and actually working in the business problem domain. Once we got the plan together, the expectation was to proceed with it, with the steps executed in the order we agreed to, until we had to re-plan[2].

With the rituals built in for measuring and re-assessing whether our plan was the right one through, e.g., sprint retrospectives, we were generally able to work tomorrow's opportunity into the plan that we had. With the understanding that successfully delivering everything we'd promised at the end of the sprint was a coin toss, if we were succeeding a lot, it gave us the budget to blow a sprint or two on chasing FOMO and documenting what we learned.

0: How did we address bugs without a bug tracker? We had a support team that could pull our andon cord for us whenever they couldn't come up with a satisfactory workaround (based on how agonizing it was for everyone involved) to behavior that was causing someone a problem. Their workarounds got added to the product documentation, and we got a product backlog item, usually put at the top of the backlog so it'd be addressed in the next sprint, to make sure that the workaround was, e.g., tested enough such that it wouldn't break in subsequent revisions of the software. Bad enough bugs killed the sprint and sent us to re-plan. We tracked the product backlog with Excel.

1: Think pairing but scaled up. It's kinda cheesy at first, but with everyone working together like this, you really do get a lot done in a day, and mentoring comes for free.

2: As it went: Re-planning is re-work, and re-work is waste.

I've had a lot of experiences like this, and I wound up ducking out of the industry entirely in 2021 after having had my skillset reduced to dogmatic use of the infrastructure buzzword of the day.

Poka-Yoke 2 years ago

A lot of newer[0] US domestic market manual transmission cars do, in fact, have an interlock that prevents the starter motor from getting power without the clutch pedal also being depressed. Of particular note, my 1984 Ford Bronco II, 1991 Mitsubishi Galant, and 2004 Honda Accord all had such an interlock.

0: This is basically everything after the three-on-the-tree/four-on-the-floor era. I have yet to drive anything with an overdrive gear that didn't require popping the clutch to crank the starter.

It's all part of the actuarial mindset. The entire point of the exercise is to arrive at a model of reality that has some degree of predictive power.

For me the only things that scare me are in the "I have no data on that" category.

I feel exactly the same way. It means that I have no idea what those things will wind up costing me, and that's the anxiety trigger as far as I'm concerned.

I'm also on team Keep An Eye On Things™, and approximately none of it really feeds into an anxiety loop. (There's a tiny sliver of the pie that does, but it's easy enough to talk myself off that ledge and go engage in a Weltschmerzspaziergang[0].)

I know it's stuff I can't control, and that's sort of the point. I want to know what I can't control so that I can know what I can control, if that makes sense.

0: Otherwise known as "touching grass."

There's something very, very wrong in the way we write programs nowadays.

I largely agree, but...

... the database is you main source of invariants.

I guess my upbringing through strict typing discipline leaves me questioning this in particular. I'm able to encode these things in my types without consulting my database at build time and statically verify that my data are as they should be as they traverse my system with not really any extra ceremony.

Encoding that in the database is nice (and necessary), but in the interest of limiting network round-trips (particularly in our cloud-oriented world), I really would prefer that my app can get its act together first before crossing the machine boundary.

If your unit tests have some overlap on your integration tests, that's nbd especially seeing as you can run your unit tests in parallel.

Exactly.

Another upside I've run into while doing things this way is that it gets me out of being relational database-brained. Sometimes, you really do not need the full-blown relational data model when a big blob of JSON will work just fine.

The only thing enforcing these invariants in production is the interplay between your database schema and the queries you execute against it."

I'm unsure that I agree. The two examples you gave, establishing that IDs are unique and that updates to entities in the system are serializable (and linearizable while we're here), are plenty doable without having to touch the real database. (In fact, as far as the former is concerned, this dual approach to testing is what made me adopt having a wholly separate "service"[0] in my applications for doling out IDs to things. I used to work in a big Kafka shop that you've almost certainly heard of, and they taught me how to deal with the latter.)

That said, I'd never advocate for just relying on one approach over the other. Do both. Absolutely do both.

I'm pretty sure "don't repeat yourself" thinking has led to the vast majority of the bad ideas I've seen so far in my career. It's a truly crippling brainworm, and I wish computer schools wouldn't teach it.

I brought up WET mostly to comment that, if there's one place in software development where copying and pasting is to be encouraged, testing is it. I'd like to shelve the WET vs. DRY debate as firmly out of scope for this thread if that's alright.

0: It's a service inasmuch as an instance of a class implementing an interface can be a service, but it opens up the possibility of more easily refactoring to cross over into running against multiple databases later.

I think it's probably worth mentioning that the principal concern for tests should be proving out the application's logic, and unless you're really leaning on your database to be, e.g., a source of type and invariant enforcement for your data, any sort of database-specific testing can be deferred to integration and UAT.

I use both the mocked and real database approaches illustrated here because they ultimately focus on different things: the mocked approach validates that the model is internally consistent with itself, and the real database approach validates that the same model is externally consistent with the real world.

It may seem like a duplication of effort to do that, but tests are where you really should Write Everything Twice in a world where it's expected that you Don't Repeat Yourself.

Starlark is Turing-incomplete, which makes it somewhat unique among embeddable languages. It's definitely a draw for me for something I'm working on.

It was! I've, however, gotten way more use out of saddling whoever is most senior with the role of making sure the team as a whole is on track. This way, it's a little more familiar with the way Western management hierarchy operates without turning it too much on its head. It's something of a leadership billet without removing the ability to be technical, which is important for a lot of folks.

It tends to work pretty well in an environment that both lacks a bug tracker (so that individual people aren't assigned things) and has a culture of pairing or mobbing.

I'll push back in defense of Scrum, but it probably bears a little explanation because my conceptualization of that framework is very likely a lot different from yours. (As something of a bonus: I'll bring in the military given the whole "wartime" trope.)

In particular, Scrum is only there to establish rituals that enable empiricism in decision making. A sprint is a reporting period to keep the team from spending too much time in the weeds. A standup is there to keep the team working together. The andon cord (which is often missing I find) is there when the facts have changed so utterly profoundly that everyone needs to regroup.

Anyone who's been through RTC ("boot camp"), and even some who haven't but have lived vicariously through others, understand that being constantly yelled at by RDCs ("drill instructors") on how you make your racks and fold your clothes is all about building certain habits and only tenuously related to what you'll be doing after A-school. It all has more to do with building trust that the rest of the folks in your ship will help carry you when the going gets tough. Scrum, at its core, is kinda like that.

I really dislike the term "Scrum Master." They're a team captain. The more military-minded might be keener to use "gunnery sergeant" or "chief petty officer:" they're just the most senior person in the rating group^W^W^W^Won the team. (Though, I'd probably take more inspiration from the Marines than the Navy here: a culture of servant leadership seems to bring out the best in people.)

The most popular implementations of Scrum tend to come with a ridiculous amount of meeting and tool baggage, and it's so unnecessary.

Use Excel. Hold your standups at the close of the day so people can go home. Write your product backlog items in delivery order so that sprint planning is less about sitting in one room playing poker and more about just getting valuable shit done.

That said, what isn't unnecessary, however, is kneecapping command a little: the engineering officer of the watch has comparatively little understanding of the actual operation of the machine. They just know that they want operational excellence. However, that excellence also sometimes comes with the watch supervisor—a subordinate—publicly calling out mistakes that the watch officer makes.

cmd.exe is largely still concerned with starting processes and hooking them together in much the same vein as Bourne shell, so I tend to use it for that.

(I actually use Yori[0], but it's pretty much to tcsh what cmd.exe is to csh.)

PowerShell leaned a little too hard into the structured data to be useful for me as a command shell. It's a pretty decent competitor to the Python REPL though.

0: https://github.com/malxau/yori

"A depressed person often wants to be depressed ..." I'd caution against expressing it this way. It's less a want and more a ground state.

I am one of these depressives, and I definitely do not want to spend all day in bed. It is, however, a ground state that takes an amazing amount of energy to escape, so my usual inclination is to conserve energy and not escape. It may outwardly look to non-depressives as a strong desire to spend the day in bed and away from the world except through whatever portal the Internet gives us, but it's my experience that having someone to come by to help with the parts of living that fatigue me is direly, overwhelmingly underrated.

And, like, it isn't often chores or errands that are the most helpful. (Indeed, when my depression saps me enough, I find that just going on a cleaning binge is a cheap way to recover for a while.) No, rather, it's stupid shit like having someone make decisions for me so that I can get un-stuck from whatever mental hell I've fallen into. The challenge is usually articulating which decisions I need made because merely unpacking them has a high energy cost.

It's only when I've gotten a handle on the fatigue each day that I'm truly able to get moving.

In practice, at least in my experience, only up to 13. (Though, I have the sequence memorized up to 21 because of a sign outside Chattanooga[0], which is what gave me my "hey, wait" moment about this.)

A combination of both the fundamental theorem of algebra and Zeckendorf's theorem has allowed me to fill in the rest so far. For example, 25 mi = 5 * 5 mi, which yields 5 * 8 km = 40 km. As it turns out, that is how far Cleveland, TN, lies from Chattanooga.

0: https://usma.org/metric-signs/tennessee

Fossil (https://fossil-scm.org) is actually a proper grow-only set from what I can tell: merge conflicts upon synchronization are encoded in the DAG as forks of the history at the conflicting points in time. If no action is taken after a fork, all clones will eventually see the exact same view of the history.

The tooling will normally bail with a "would fork" message if a `fossil update` (and, hence, local resolution of those conflicts) wasn't undertaken before pushing, but this is not at all necessary to preserve useful operation.

The larger problem in my mind is that a lot of asset purchases bestow a lot of tax deferment privileges because of how the tax code is presently written.

Consider someone who holds a lot of capital with unrealized gains but nonetheless needs cash flow. A common practice is to borrow against those unrealized gains, which itself doesn't count as income even though it nevertheless tends to result in a greater accession of wealth.

The play, hence, seems to be that we consider the borrowing against unrealized gains to be the taxable event, not a wholesale tax on all held assets.

"It felt like procrastination, a tech version of a bullet journal." There's a lot out there that certainly falls under what I call "procrasturbation," but the Bullet Journal is ironically the thing I've stuck with the longest. Ryder Carroll came up with a formalization of the concept more recently, but I've been using it since 1999, prompted by the removal of our backpacks due to Columbine.

I think the thing that a lot of folks miss is that it's a framework that's meant to grow incrementally with how you go through life and work.

Without a bag to keep everything together, I got tired of misplacing my notebooks, one for each class, so I started living out of only one at a time, which then led me to set up a sort of table of contents and numbered pages so I could find things. It also let me cope with my as-yet-undiagnosed OCD and ADHD by giving me the permission just to start at whatever page and treat the bound pages as a linked list instead of an array. (Bonus: the table of contents became a sort of allocation bitmap.)

Homework due dates and holidays and birthdays begat calendars of various sorts, inconsistent study habits begat habit trackers, notes from class meetings begat dailies wherein I braindump about whatever, etc., but none of that happened overnight. It built up over months to years.

Journaling is about the stuff you want to remember later so that you can reflect on it. Most of my entries involve doting on my cats (so many days where I'm just like, "Valérian was an aggressively cuddly purrbucket again" or "Laureline brought me another sock from the hamper") and, like, "on a lark, I dug out my old ThinkPad to find it actually isn't inoperative."

I'm not and never have been NSA, but I nonetheless have a sordid past with what is arguably a related line of work. This is how I manage my passwords.

In environments where regular rotations are required, I print off a new "biscuit" via `(date ; pwgen $PWGEN_FLAGS) | lpr`. I then append to the candidate password something of a personal identifier that only I know.

I'm not sure I agree, particularly given that there's some incentive for us to get our relatives using these messenger protocols and clients. The Web made it work because everyone came together and gathered consensus (well, modulo some details) that enforcing HTTPS is, ultimately, a good idea given the context.

So far, I'm not seeing that same consensus from the XSF and client vendors. If the capital investment can be made to encourage that same culture, the comparison can perhaps be a little closer.

"You need to run your own platform people." What problem does this solve?

I'm someone who's been on the business end of a subpoena for a platform I ran, and narcing on my friends under threat of being held in contempt is perhaps the worst feeling I'm doomed to live with.

"XMPP is ..." not the solution I'd recommend, even with something like OMEMO. Is it on by default? Can you force it to be turned on? The answer to both of those is, as it turns out, "no," which makes it less than useful. (This is notwithstanding several other issues OMEMO has.)

What's funny is I remember when those Microsoft Management Console snap-in tools were brand new, and what came before them was a lot less nice to use.

(They might be MFC. Windows 2000 is about the right time for Microsoft to be C++ happy enough to push developers to use it over just using the bare Win32 C APIs. MMC was a pretty big deal when it first came out.)

DRAKON 2 years ago

"The only notable software produced ... is ... essentially a UML editor ..." Yes, correct. It's a CASE tool, at least when you have a computer to assist with using it. For harder-hitting software applications, I never took much stock in using it as much more than a better way to diagram out the basic blocks when analyzing the disassembly of something, and I'm usually doing that by hand, without computer assistance.

More broadly, I never expected much from my CASE tools actually generating code for me: the scaffolding was possible, but any sophistication beyond that just never materialized. That ship sailed right around the turn of the millennium, and none of what DRAKON does innovates on that.

"It's not verifiable." Thanks. I always figured that a lot of this chaff was just marketing.

DRAKON 2 years ago

I'll try being more direct.

I have a tightly-defined universe of discourse here, and you are operating almost completely outside it. Why is your engagement with my comment relevant beyond the connection to DRAKON?

So far, I've seen you write about cultists and Buran and, now, how sequence diagrams and state diagrams are superior. That final bit could admittedly make for interesting conversation, but I've heretofore not seen significant substantiation from you or, hell, any interrogation from you why I even use DRAKON.

Dare I say it, but I feel like I've been the target of your trauma response here, and I don't exactly appreciate it.

DRAKON 2 years ago

"The cultists claim that it IS a machine language." Cultists? I'm still left scratching my head as to how this is relevant to my comment.

I wrote about the Fregat upper stage, DRAKON's expressiveness as it relates to recursion with an example of an environment where it might be undesirable, and how the implementation of quicksort shown on Wikipedia is "perfectly fine."

Where are the cultists there?