joshAg
The problem comes when no one is actually minding those details anymore. If those details aren't actually minded, then the work at the higher levels will be much less useful and effective, and in the worst cases won't matter at all.
But, especially as code gets flung over the wall faster and with less care, I do think they are getting to be pretty great at reviewing code for specific things that a linter can't easily catch and for looking for security, implementation, and architectural flaws before I have to look for them. A couple examples of what i mean: 'does the code use knex.raw with a template literal?', 'does the code do n+1 db lookups instead of something better?' 'do all the added/modified tests follow the test case template defined here?'
My personal "favorite" was when the lead engineer who onboarded me half a decade prior forgot the written policy he'd put in place of "no raw js dates. use this library for everything date related instead" and sent up an MR that not only used javascript dates, but did complex operations on them (incorrectly at that, because it didn't account for timezones, daylight saving, years that had a leap day, and months that weren't 30 days).
From what I can tell, it's the exact same reason people drive faster than is prudent or use their cellphone while driving. It feels safe and good right up until it isn't and you crash. And because most places don't have anywhere close to adequate specification detail, test coverage, or review coverage, the broken bits aren't even noticed until much later.
> We're left to hope that courts agree that just because something is okay for one police officer in one place to do, that doesn't mean the police department can perform that same task a thousand times in a thousand places with a thousand machines and still have it be okay.
There are multiple court cases that have done this exactly this. Carpenter v. United States and Chatrie v. United States are the ones you want.
It's absolutely cool to see this sort of validation process get cheaper and easier, but it means nothing if no one cares enough to do it. EAL1 certification can be as cheap as a beefy server, but it's not commonly done because effectively no one cares.
As microsoft learned with the zune just because it's cheaper or better at the same price doesn't mean anyone will use it. Culturally, we have to make the effort of verifying code worth it.
When you're learning/internalizing existing knowledge, you tread a defined path skipping unnecessary stops and diversion and heading instead directly to the destination. The destination, not the journey, is the point.
When you're discovering new knowledge in the form of proving/disproving, there's no defined path to follow, so there can be quite a bit of backtracking and diversions and detours into other areas you weren't planning on going initially and while there might be some well-defined paths to follow, you might have to cut your own path through uncharted desert or jungle.
All those diversions and detours make the journey just as if not more important than the destination because they create new destinations of their own for future travel that would not have been spotted or noticed for a while longer (if ever) otherwise.
So to bring it back to math, transitioning from having to develop proofs for theorems to validating/learning extant proofs completely changes the scope of future discovery. Everyone will tread the exact same path to a proof/theorem and then stand in the same place to look for future destinations and then use AI to build them a path to that new destination and then everyone will follow the same path to the new destination and repeat the process, so the chances of finding something curious along the way plummets. And something curious could be an entirely new field of math, or maybe just a new problem that isn't relevant to the intended destination but gives a view of many new never before seen destinations for future trips.
That way you can tell at a glance of the test file change just how bad it is. Seeing new raw mocks (eg sinon in the test file at all) instead of the existing mocks is an instant no, and seeing an existing mock getting added requires at least investigation for necessity.
What changes with TDD is that the important part of the review moves from the mainline code to all the TDD tests and the coverage, and you also need to see a test run from before the code changes with all the new/updated TDD tests failing in addition to just a test run after the changes with all the (at least) new/updated TDD tests passing.
But I really want to focus on the idea that more cameras will make the crime stop, because that is especially fallacious. It won't. Not by itself. What will make crime stop is government/community intervention. We could get into a whole broken window vs enhancing economic opportunity vs early targeted intervention approach debate, but the specific type of intervention isn't relevant to my point (so long as it's effective), which is that more data is only useful it it's actually used and not just stored in a warehouse without ever being looked at.
Let me give you more details from the car theft i mentioned before of my car getting stolen in 2020/2021 in San Francisco from of my gated (and security camera-ed) apartment garage.
The car was taken a few days before July 4th. Since I work from home, I didn't notice until I went to use it on the 4th. I immediately reported it to police and was able to use the police report to get the relevant security camera feeds from the apartment. The week before American Thanksgiving (about 4 months later) I get a call from the impound lot: "we've just received my car at the impound lot. You can come get it." That's when the happy narrative unraveled, and I learned what actually happened.
My car got towed up for blocking a driveway more than a day before i even noticed it was missing. When it arrived at the impound lot they noted that it had a license plate for the wrong type of vehicle that had separately already been reported as stolen (same make but a 10 year newer model and a different color). Even though the system flagged the plate as stolen and for the wrong vehicle the VIN was never scanned. I know the VIN was never scanned because there's systems constantly checking impounded car VINs and licenses against all the open stolen car cases, and separate systems that should notify owners when they call in to see if their car was towed/impounded. My report of the stolen car from july 4th should have immediately triggered a match. Instead the car sat in impound lots until they were ready to auction it off, because it was only ever recorded with the stolen license plate. It actually worse than just that one error because a month later (and after the car was reported as stolen) they moved it from the first impound lot to their long term storage lot, so in total they didn't scan the VIN 3 separate times (enter impound lot, exit impound lot, enter long term storage impound lot) even when the system immediately warned them the plate didn't match the car. In order to auction it off they need to get a clean title, which caused them to finally run the actual VIN for the car and not just the stolen license plate. The cross-check system was finally able to work, and they immediately notified me based on the open stolen car report. All this got reconstructed for me because they had to figure out what happened as part refunding the over $10,000 of impound lot fees that had accrued, since they aren't allowed to charge for tows/impoundment if the vehicle is reported as stolen in a timely manner.
Flock provides absolutely nothing that SFPD didn't already have access to while was car was in their possession. When my car got towed for blocking a driveway and when it entered the impound lot their existing systems reported that the license plate was incorrect for the car which should have triggered scanning the VIN (even without a theft report yet, if they had scanned the VIN then it would have triggered a notice to the registered owner). When the car moved from the impound lot to long term impound lot the system again reported that the license plate was stolen and incorrect for the car and at this point scanning the VIN would have alerted them to the open car theft report. All their fancy cross-checking systems failed because SFPD employees were too lazy or overworked or apathetic to follow policy to scan the VIN of the vehicle until they absolutely had to scan it.
[1]: https://www.researchgate.net/publication/233614385_A_Liberal... [2]: https://journals.sagepub.com/doi/10.1177/1462474508101490
Same reason everything's an electron app now. First mover matters to the makers and to the consumers more than performance and attention to those details.
The point about PMs is I think illustrative of this issue. Yes, great PMs who actually understand the product they want to build and can then turn that into something using engineering teams as a black box system exist. But by and large, no they don't. A massive part of why waterfall fell out of fashion is because it turns out most orgs don't have and can't find PMs/PM adjacent people who can build that knowledge, and you can see how agile attempts to correct for this by turning a pipeline into an OODA loop. If you can prevent pipeline flushes, it will beat that OODA loop, but it turns out as an industry we can't actually prevent enough pipeline flushes for that to be the case and we can (for the most part) use that OODA loop to eventually iterate into something a paying customer might give us money for.
Part of the issue is that we're treating the AI like it's just another compiler or static code generator. It's not. The reason they're not is because they require a complete specification of what to output, ie the code. That level of specificity is what allows engineers to mostly stop caring about the assembler and just stay in their higher level code (the main exception being extremely hot loops in places too complex for the compiler to optimize well) and legitimately be able to say they understand the code without ever looking at the compiler/linker output. The entire point of AI for code generation is taking an incomplete specification and turning it into a completed one. If you review and understand every line of output the way almost no one did even before AI was a thing, then you're not going to fall into the trap of not knowing anything about your system anymore. But at the same time, you're not really going to get much benefit from AI either, because you're just replacing time spent coding with time spent reviewing code. It might even take you longer to review than it would to just code it yourself (i think every senior engineer who's mentored a junior dev knows this exact feeling).
To actually get the benefit from AI you have to let go of looking at the code output at all, because looking at that output is the slow part and because just looking and reviewing still won't give you the same knowledge as actually implementing. The passenger aviation industry handles the second issue by preferring/requiring manual control in critical areas (takeoffs and landing) and using simulators to extensively train for manual recovery outside of the abilities of autopilot. For developers the second bit is actually why reviewing AI output is a fool's errand - it will give you the false confidence in your understanding of the system. That doesn't mean we have to embrace vibe-coding or accept slop. It means changing the engineering process from one that deals with a deterministic system to a stochastic one. As an aside, I think this is why upper level managers and executive are leaning into AI code generation so hard - engineering was already a stochastic black box system to them.
It's not a popular choice because you have to pay full price for the seat, so lap-carrying the baby can save quite a bit of money. Once the baby is 2, you can no longer lap carry them, so that option goes away. There's FAA approved options for small children for whom the lap belt would be inappropriate that are different from the infant seats.
They're giving them money in exchange for the opportunity to try to convince the candidate to support what they want.
this guide should help make it less likely for sshd or your login shell to get killed: https://ianlpaterson.com/blog/oom-lockout-ssh-survival-harde...
The problem with turning it off is that the system and applications have been architected assuming that it will be on, so things like fork/execing a memory heavy processes or allocating memory inside a cgroup (which still pretends overcommit is enabled and there's still no way to disable that assumption) that used to work fine might break with no good way to get them to work again. This comment (and siblings) have more specifics: https://news.ycombinator.com/item?id=27794237#27795199
It's because linux is a toy OS. Specifically, it overcommits memory in the hope/assumption that it won't all be used at once, but doesn't have a way to gracefully degrade when applications collectively want to use more memory(+swap) than it actually has. You can turn off overcommit, but applications are designed with the overcommitting feature in mind, so your experience might not be as good as you were hoping for.
Making a massive swap space helps a little bit. It's better to just never let your actual memory usage go above 85% to 90%. It's fine to go above if you're trying to optimize a server with a specific set of processes to wring every last bit of efficiency out of it, but not for general desktop computing.
If it really bothers you OpenBSD doesn't allow overcommit at all and Windows handles this situation much more gracefully, so WSL is an option too. If you don't mind Oracle (i do), solaris also doesn't allow overcommit.