budro
Joined 2 years ago
Joined 2 years ago
I'm to the point where I don't trust it to do any writing. It's only allowed to tell me what it thinks I missed. Because inevitably when I ask it to edit my prose, it destroys the text and I basically need to rewrite it all again.
Pretty much all of my recent projects have been focused on re-implementing or opening up the lid on some piece software. I have opted to not go the decompilation route (in some instances I can't even download the original software!), and instead reverse engineer using publicly available files that the programs create. Definitely a lot slower, but it's fun to build your model of how these opaque binary formats work and slowly watch your golden tests trend towards 100% matching. Also it's super cool to see the variety of use cases people had with the original software, and I definitely wouldn't have been exposed to many of these things had I not scraped all of Google for everything I could find related to the software.
If you can get past all of that, the game does get somewhat interesting. The first level is just a game of APM, replacing your components with higher quality components until 100% and you win. The 2nd level puts reliability behind identification which has a cooldown. This was pretty neat because you discover how to use the markers + feedback loops to actually create a useful reliability comparator. You then use that to only identify candidates with known-higher reliability.
Unfortunately I think that's where the game (and maybe even the concept?) peaks. The 3rd level is basically identical, but with a longer cooldown on identification. That does teach you to use counters as an early source of high quality components to sort against (reliability% = components counted / total components on conveyor) but the winning strategy remains the same. The added Marker-Gate component doesn't really become useful until your reliability is high enough (or not without cascading 5+ or more of them) so the way to beat level 3 is exactly the same as level 2.
It would be cool to see this evolve into something more meaningful, but I have a feeling you'll quickly find out why all automation games have 100% reliable machines.
[1] https://docs.typesafe.ai/patterns/fan-out [2] https://github.com/Bud-ro/jev-demos/tree/master/packages/maz...
Rust has definitely caught my eyes a few times here, since most of what I described is manual. Particularly in the embedded space RTIC [2] has some really neat stuff going on. Other languages have good type systems and spatial memory safety, but nothing else seems to have Rust's killer features around concurrency.
[1] https://www.joelonsoftware.com/2005/05/11/making-wrong-code-...
I almost entirely agree. You'd certainly want a majority of QA responsibilities to fall to devs since that keeps the feedback loop tight. Also with the amount of compute we have you can trivially outpace a typical QA team with a single dev working on fuzz tests and property based tests. If you really still feel the need to outsource then there are cool tools like Antithesis [1] which let you trade money for compute in their complicated fuzz testing suite.
Where that falls apart imo is when your software interacts with hardware in any non-trivial way. Fuzz testing doesn't really work when your system is spinning big and heavy things for example. Real hardware that interacts with the world will always create this gap where the devs don't know how to fully test it. Your systems engineers are best equipped to handle this and ensure certain controls follow the right curves, but they typically don't have the bandwidth or are very inexperienced with software. I think a QA organization _can_ fill this gap and deliver value. But I'd almost always prefer hiring another 1 or 2 system engineers who can work towards this problem full time instead. It's much easier to train someone in software than it is to train them in motor control or sealed systems.
"Piss tests" filter out a lot of anti-social behavior.
Zig _the language_ barely does any of the heavy lifting on this front. The allocator and io stories are both just stdlib interfaces. Really the language just exists to facilitate the great toolchain and stdlib. From my experience the stdlib seems to make all the right choices, and the only time it doesn't is when the API was quickly created to get things working, but hasn't been revisited since.
A great case study of the stdlib being almost perfect is SinglyLinkedList [1]. Many other languages implement it as a container, but Zig has opted to implement it as an intrusively embedded element. This might confuse a beginner who would expect SinglyLinkedList(T) instead, but it has implications surrounding allocation and it turns out that embedding it gives you a more powerful API. And of course all operations are defined with performance in mind. prepend is given to you since it's cheap, but if you want postpend you have to implement it yourself (it's a one liner, but clearly more expensive to the reader).
Little decisions add up to make the language feel great to use and genuinely impressive for learning new things.
[1] https://ziglang.org/documentation/master/std/#std.SinglyLink...
What's most shocking about their whole website is how it goes to show how unserious the software industry is at large with regards to testing. It's not surprising when a good chunk of the programmers I know are vehemently opposed to "adding too many assertions", let alone something like this.
On the other hand you have AI which, out of the box, seems content to go along with anything and will happily write code for me. And I've never seen it have a single insight on the same level as my teammates. All of which is to say, AI doesn't really feel like something you can properly "ask" something. It's especially far away from that when it's just generating code and nothing else.
I personally find AI code gen most useful for one-off throwaway code where I have zero intent to learn. I imagine this means that the opposite end of the spectrum where learning is maximized is one where the AI doesn't generate any code for me.
I'm sure there are some people for which the "AI-Driven Engineering" approach would be beneficial, but at least for me I find that replacing those AI coding blocks with just writing the code myself is much more enjoyable, and thus more sustainable to actually delivering something at the end.
[1] https://youtu.be/apREl0KmTdQ?t=4751 (relevant section is about 5 minutes long)
However for new projects I find that I'd much rather pick technologies that start me off with a sanity floor which is higher than Python's sanity ceiling. At this point I don't want to touch a dynamically typed language ever again.