astral303
However, I argue that if the engineers are interrupted by QA issues, they will be motivated to find ways to not have those QA issues. In absence of that, we end up with the familiar “feature complete, let QA find bugs” situation.
My favorite 3-way merge tool, kdiff3, has no undo.
Still pretty cool for those that need to calibrate a turntable, or verify 33 vs 45 PRM for a record.
From this post I learned there was a project called Archy implementing Cat in software.
The core principles still ring so very true: https://web.archive.org/web/20061025010636/http://rchi.raski...
> Computer rage is a familiar phenomenon because computers are so adept at losing your data. At any given moment, you are one innocent step away from destroying minutes, hours, days, months, or years of work.
> Archy never loses your work. This shouldn't be a groundbreaking innovation in computer design, but it is. You never have to save because it's done for you automatically. Your data is stored in such a way that if your computer crashes, your information will still be there the next time you start Archy up.
I think these days we are 70-80% to this groundbreaking innovation—-my computers no longer lose my in-progress e-mail or documents, but sure still keep losing form input here and there, and I still accidentally select all text and type over it in a system with a single-level undo (iOS).
Don’t forget traits! When are we getting traits in Java? Probably never.
Optional semicolons and parentheses to cut the line noise and enable internal DSLs.
Though Java has improved implicit typing with `var` and now we have reasonable lambdas, Java is still not a high-level language, but maybe it is now medium-high.
Appreciate the detail about the stack allocated bits in .NET.
Modern garbage collectors are very good and handle many common use cases rather efficiently, with minimal or zero pauses, such as freeing short-lived objects. Many GC operations are done in parallel threads without stopping the application (you just pay the CPU overhead cost).
Also JITs in both the CLR and the JVM perform optimizations such as escape analysis, which stack-allocate objects that never escape a function’s scope. These objects thus do not have to be GC’d.
So really with a GC’d language, you mostly have to worry about pauses and GC CPU overhead. Most GCs can be tuned for a predictable workload. (A bigger challenge for a GC is a variable workload.)
The inlining of virtual calls is the critical optimization that enables this. Because C/C++ is optimized statically and never at runtime, it is unable to optimize results of function pointer lookups (in C, and thus also virtual calls in C++). However, the JITs can inline through function pointer lookups.
In sufficiently complex programs, where polymorphism is used (i.e. old code that calls new code without knowing about it), this yields an unsurpassed speed advantage. Polymorphism is critical to managing complexity as an application evolves (even the Linux kernel, written in C, uses polymorphism, e.g. see struct file_operations).
Here is a blog post from Robert C. Martin about microservices and clean architecture: https://blog.cleancoder.com/uncle-bob/2014/10/01/CleanMicros...
If you just pass exceptions up in throws, you end up causing cascading checked exceptions chain changes and creating a bunch of noise, which is what many times people resort to doing in practice, because they don’t have the experience and it is very rare/almost never done to have any kind of automatic enforcement/linters/static analysis that prohibits implementation detail checked exceptions from propagating past above certain levels.
It is almost never OK to propagate IOException, for example, past maybe 1 or 2 levels of private helper methods, almost never should be propagated past your class boundary and your think twice about adding throws to protected methods, unless your subclass implementations are specifically implementing alternate calls for IO.
So yes that’s why checked exceptions have failed. And when you actually take this extreme discipline to your code, yes you end up with a ton of try/catch handling noise, and it takes similar extreme discipline to always avoid poor/improper try/catch handlers. Refactoring code across certain boundaries becomes a much bigger hassle, so your end up discouraging refactoring across those boundaries, which leads to code that is more easily stale and design decisions that are much harder to back out of.
It's a "Riddle for the Information Age" that in Alan Cooper wrote in 1999 [1] in "The Inmates Are Running the Asylum". One of the riddles is: "what do you get when you cross a computer with an airplane?" but things have gotten much much worse since then, it needs an update with the contents of this article.
He writes: "That something like this slipped through shows that the software inside the car is not coming from the same Porsche that makes the rest of the car... Acceptable levels of quality for software engineers are far lower than those for more traditional engineering disciplines..."
We have seen this coming for 20 years now easily. iDrive happened and excuses were made.
Nobody cares about response times or human-oriented design, it seems, which is incredibly baffling in a car! Where the rest of the controls are supposed to be designed with humans in mind.
My 2022 Subaru's Harman Kardon-built head-unit will block out my entire navigation view for 3 seconds if I dare to brush the volume control with my hand. I've learned to not adjust it after that because doing so only prolongs the time that I can't see where I'm supposed to be going. Also, if I am so unlucky as to lower the volume while the navigation speaks, I end up adjusting the "voiceover volume" and not the "radio/media volume." So when I wonder: "hey why did the navigation stop talking?" I have to remember that I hit the unlucky time to use the invisbily-modal volume knob. Of course, nobody cares and they let this travesty out the door because it's just the "entertainment system."
1 - https://www.amazon.com/Inmates-Are-Running-Asylum-Products/d...
HDMI such an abomination thrust upon the world. Why do we accept a TV going blank for seconds for any reason in 2023. Lawrd help us all. Can you optimize HDMI resync in any way? That would be a major selling point. Maybe blend the output between what was shown and what is about to be shownn (apply a gentle blur filter to the last seen frame for a few moments and fade to black after 3-4 seconds.. float a gentle explainer message “HDMI sync lost….” After 3 seconds)
re 20 years to make a new engine point, compare investment $ in traditional ICE across the car industry vs investment $ into rotary or other alternative engines (the former is order of magnitudes more)
How easy will it be for layers of abstractions to emerge in this system? That’s the ultimate limitation of markup-language-based / configuration-based build systems.
Look up the difference between external DSLs and internal DSLs. The YAML config file is an external DSL. I prefer to express configuration using internal DSLs.