I wonder what practices that are considered reasonable or at least common and defensible today will be considered moribund and obsolete in a decade and what extreme minority practices today will be widespread in a decade.

We've seen quite a few practices come and go. A lot of people will say it's all basically fads, e.g., as when Alan Kay derisively says "programming is a pop culture" but, IMO, that's pretty obviously untrue and it's easy to name sweeping changes that are massive improvements.

One example of something that became semi-mainstream in a decade and very mainstream in two decades is https://mastodon.social/@danluu/110213144744259862. Another is the idea that you can and should be able to build code basically all the time, have CI, etc.

Brooks, writing in 1995, noted that someone from MS wrote him to say that MS can build once a day. Brooks considers that a positive development, but isn't sure it's worth it. He implies that it's reasonable to merge/build once a week.

People at a startup I worked for that was founded in 95 would've considered it laughable to build daily, let alone weekly (they built what would now be called CI infra to allow constant builds) while the world's premier programming thought leader presented once-a-week builds as reasonable.

There were a number of companies that ignored the thought leaders and instead implemented reasonable practices. These companies had a huge productivity advantage (https://mastodon.social/@danluu/110339234955028325). Another example is

MS vs. Google build practices not too long after Brooks noted his uncertainty that building daily was worth it.

MS improved their build system massively and went from being able to build once a day (on a good day — zero times on a bad day) to doing 8 builds a day: https://danluu.com/microsoft-culture/.

Meanwhile, Google built what you'd consider modern CI infra for a monorepo with that let people build at any time because it would've been considered absurd to only be able to build 8 times a day.

Windows: a software engineering odyssey

Another big one was using higher level languages. Steve Yegge has talked about how Geoworks wrote things in assembly and how they ended up getting destroyed by Microsoft in part because their performance was crap compared to MS (because it's very hard to make sense of 15M LOC of assembly).

When I was in college (early '00s), most people had moved past thinking that everyone should write assembly to thinking that everyone who was a serious programmer should write C or C++.

Joel Spolsky, the next big programming thought leader after the Brooks era, has an entire essay about how teaching people Java instead of C allows stupid programmers who couldn't hack it in C to get a degree.

At the time, you also often heard that real programmers didn't write "scripting languages" like perl/php/python/ruby/etc., at least not for serious code.

If you look at successful startups from just after Joel's anti-Java anti-HLL polemic, a lot of them were created on ruby or python.

Back to the original question of what tools/practices will become common in the next decade or two, looking at what did become common, the things I can think of were generally things that weren't really "sold".

No one at Centaur needed to be sold on CI or read about it from some thought leader. Compared to having daily or weekly builds, it was such an obviously huge win that people just built it without needing to be sold, and that goes for the other sweeping changes I can think of as well.

I'm sure there are counterexamples, but when I think about the things that have had legions of people selling them, like TDD, etc., these things haven't taken the world by storm in the same way.

Appealing to elitism seems to be another "success smell". A lot of old practices that got replaced by more effective ones appealed to elitism and lost. And new practices that appealed to elitism also haven't succeeded in the same way that CI, automated testing, etc., have.

An example of this would be the legions of people who claimed that FP or Lisp or both were secret weapons that would make you super productive or make your company successful because smart programmers use them and/or they're secret weapons for productivity (and, BTW, I like FP).

In the wake of the failure of FP to live up to these lofty promises, people moved the goalposts and claimed that FP was a big advantage, but there are other reasons companies are successful, FP still outperforms, etc.

A lot of the revised claims are basically that the tech side doesn't matter that much, so the huge FP advantage isn't apparent, but we've seen multiple waves where companies that don't adopt better technology get lapped and can only survive via other massive advantages, e.g., non low-level companies using "scripting languages" vs. C/C++ just after Joel's anti-HLL polemic, assembly in the Geoworks days, etc.

Contrary to the claims, FP is simply not in the same class of productivity gain.

So, two questions:

1. What other historical things were in this class of productivity improvements that are so large that it was basically impossible for them to not get adopted? I can think of maybe 20 off the top of my head, but they're highly biased towards the kinds of things I work on and I'd be interested in other examples.

2. What's being used today that is in the same class? What's the equivalent of having CI instead of building once a week in 1995 or using ruby in 1999?

@danluu This is kind of a nitpick and kind of not but CI *as originally defined* isn't especially widespread. Continuous *builds* are pretty common but Github & PRs effectively killed continuous *integration.* Maybe I'm in a bubble but people I've worked with since Pivotal are generally shocked when I describe working without PRs.
@nat @danluu I'd love to hear more about the significance of working without PRs. I assume you don't just mean lacking the GitHub mechanism as we know it today, which is better described as a "push request".

@seh @danluu I mean a workflow where developers rarely or never commit to feature branches, and instead work on main, pull, rebase locally, commit to main (or, sometimes, a branch named something like "develop" that gets merged automatically) and push. This sometimes gets called "trunk based development" but I've also seen weird definitions for that term too.

And generally everyone commits at least once a day, and usually more than that.

@seh @danluu Github nudges teams away from this style of working. Its review mechanisms assume that you're working on feature branches and occasionally merging, and recently its even started nudging people to configure their projects such that you *can't* push to main without going through a PR flow.
@nat @danluu I recall working in that “trunk-based” model for many years, and I also recall the complete lack of code review ahead of merging. Instead, you’d hear something like, “Oh, hey, I don’t know if anyone else told you, but hold off on merging anything until Joe says we’re clear again. He’s been working on fixing the stuff that you broke yesterday.”

@seh That was not my experience using the model but I believe that it happened.

Is there a particular point you're getting at or a particular bit of information you're trying to get here? Are you asking whether (or why) I think it's bad that Github pushes people away from trunk-based development with the way it uses PRs?

@nat The latter, yes. I'm not here to argue against you; I'd like to hear what you prefer about this other, less typical (today, anyway) way of doing things, and what you see wrong with the GitHub PR-style approach.

@seh So my main complaint about PRs is that working that way tends to feel *super* slow and involves a lot of waiting for review. While I'm waiting there's a temptation to pick up more work, which means context switching, which makes the work go even slower.

I'm also pretty skeptical of review gates in general as a way to do almost anything that folks say that review does (ensure quality, spread context etc.). I tend to prefer "make it easy to change stuff, and change stuff all the time."

@seh I do think that PR-based workflows are probably a more stable equilibrium than trunk-based dev -- you really have to be disciplined about making small changes and rolling back changes that "break the build" immediately for the latter to work. I also know folks who think that trunk-based development *only* works in a pairing context -- I don't agree but pairing and trunk-based dev do work well together.
@seh I also just kinda... don't like asking for permission to merge all the time. Or being asked permission. It feels really status-game-y.
@seh One big confounder here is that I'm comparing, basically, Pivotal teams to non-Pivotal teams and there are a lot of differences between the two that made Pivotal teams feel super fast & productive in comparison.
@nat Thank you for the explanation. The part about code being easy to change is missing from most of the projects in which I’ve participated over the last few years. The conscientious novice sees an opportunity to fix or improve something, first just touching those crucial few lines, and then gets embroiled in a three-week-long slog through the unit tests and integration tests and generated code and documentation and flaky CI workflows and on and on.

@nat Giving up early would probably be the braver, saner response.

We feel obligated to give back to the open-source projects on which we rely. They attract attention and concentrate effort, but then ossify due to concern for safety, governance, and just trying hard to remain stable. It’s no fun to play along.

Developing “internal”-facing software is now looser and more casual than doing it publicly. The quality bar inverted at some point.

@seh The project that most of my experience comes from was open source.

And I definitely don't consider the non-PR workflow I'm describing "looser" or "more casual." Engineering discipline is largely orthogonal IME to whether a team is using PRs and PR review. The trunk-based organization was much stricter discipline about things like commit messages that I've seen on any PR-driven project, for instance. Certainly *much* more disciplined about tests.

@nat I like the framing from Hintjens on “pessimistic” vs. “optimistic” merging: http://hintjens.wikidot.com/blog:106 (Even though I don’t entirely agree with the blog post, and it’s not an exact parallel for corporate software teams as opposed to OSS work, I think it is a useful viewpoint that most people haven’t been exposed to.)
Why Optimistic Merging Works Better - Hintjens.com