Doh.
3,115 karma · joined October 22, 2016
Doh.
> Developers in particular don't generally care about security
Thanks, now I have to clean a mouthful of coffee off my screen!
This should come with a trigger warning.
I've since become disillusioned.
The problem with semver, in my experience, is that it's impossible to predict whether a change will actually break someone else's code. Of course there are certain classes of change that are more likely to cause problems for other people. Changing a function signature, or deleting a function outright, is obviously a breaking change.
But the line between breaking and non-breaking isn't a bright one. Move away from the obvious examples and things start to get murky. Even the humble bugfix can be problematic. What if a client application unwittingly relies on the buggy behavior? Now that fix is breaking for them. Is that a contrived concern? Maybe—though anyone who has written an emulator can attest that this a real problem.
What about a non-breaking feature addition? Let's say the new feature requires some extra branches in a function, but doesn't change the function's interface or behavior for people who don't use the feature. Fine, non-breaking. Now say these branches alter the function's performance, and a client application's batch job that used to run in under an hour now takes four hours. It does run, so it's not "broken," but four hours is an unacceptable runtime to the users. Is that still a non-breaking change?
What these examples demonstrate to me is that semver's breaking/non-breaking change concept is incoherent. It conceives of changes as universally breaking or non-breaking, out of context, but a change can only be breaking or non-breaking in the context of a specific client application. Even the seemingly obvious example of deleting a function is non-breaking for applications that don't use the function!
I think the way we release software reflects that we know this deep down, even if we don't admit it. Imagine how you might handle upgrading a library in an application you've written. The new library is a bugfix release. Do you upgrade the library, push it to production at 100%, and gallop off to lunch without so much as a glance over your shoulder? My guess is no. Personally I'd be running my test suite, reading the library's change log, making a gradual release, and keeping a close watch on instrumentation during and after.
The interactions between software systems are simply too complex, too nuanced, too specific to the particular applications. We put all these safeguards in place and do things cautiously because we've been burnt too many times. And we've learned that in actual fact, the line between breaking and non-breaking doesn't exist.
The way I fight it is by explicitly reminding myself that just because something worked yesterday, that doesn't mean I can skip a step today or let my guard down at any point.
It really does take deliberate thought though. Funny how the brain works.
(The upside is that every successful takeoff becomes a delightful surprise!)
ATP applicants need to have 1500 hours of flight experience—hence "1500 hour rule"—though there are exceptions if you've attended specific approved aeronautical schools or have military experience. Commercial applicants need only 250 hours. (Here too there are exceptions for certain training programs.) The standards on the flight tests are tighter for ATPs and the written exams are worlds apart.
As an instructor I can tell you the difference between a 250-hour pilot and a 1500-hour pilot can be enormous. Not always—some pilots have 1500 hours, and others have the same hour, 1500 times in a row—but there can be a huge difference.
This rule has been controversial though, not least of all because both pilots in the Colgan crash already had more than 1500 hours. And the FAA made so many changes after Colgan that it's been hard to tell which of those changes actually made the difference, and which, if any, were simply no-ops. Critics of the rule have especially focused on how many flight tests the Colgan captain failed, and how the response by the pilots to an aerodynamic stall was completely backwards. Aerodynamic stalls are something you learn in your first ten hours of training as a private pilot and drill constantly throughout your career, so to get that wrong at the air carrier level speaks to an incredible failure in training and evaluation.
It is so frustrating to jump into a codebase and have to read every single line to figure out what the inputs and outputs are. Think about how much time is wasted. It's like an anti-multiplier. One engineer decides they don't want to take a few minutes to annotate types or write a comment, and now every other engineer on the team has to waste time figuring out what's happening. It makes me want to scream.
I wouldn't suggest lying about anything in the aviation sector either.
Oh, that's rich. This from the guy who designed a language where the case of a symbol's name determines the symbol's visibility.