My issue with them is that they get close enough to actual programming that I invariably quit, and go actually work on a hobby programming project, rather then play. As a result, I generally buy the game, play the first few levels, and then go make some commits on a programming puzzle that has an actual end-result that I benefit from.
I really wish the games used an actual language or assembly opcode set. If I could play TIS-100 and practice ARM or AVR assembly, that would be amazing.
I also really love Zachtronic's earliest games. IIRC there's one about designing ICs at the silicon level, and one about reverse engineering hardware.
> I really wish the games used an actual language or assembly opcode set. If I could play TIS-100 and practice ARM or AVR assembly, that would be amazing.
Yeah. A lot of Zachtronic's games and other programming/hacking type games really leave me with a similar hunger for something more realistic. So I ended up making a prototype of such an idea where you can find and exploit a bug in an emulated ARM core to unlock a door:
EDIT: This was the early reverse engineering game that Zachtronics released: http://www.zachtronics.com/ruckingenur-ii/ it's free and short; worth a playthrough.
And this was the semiconductor game: http://www.zachtronics.com/kohctpyktop-engineer-of-the-peopl...
Of course Zachtronics is also indirectly responsible for Minecraft, so there's that too :P
For those who don't know the story, Zachtronics had this game called Infiniminer, from which Notch apparently took the idea for block-based game. From the words of Notch himself:
"But then I found Infiniminer. My god, I realized that that was the game I wanted to do. I played it in multiplayer for a while and had a blast, but found it flawed. Building was fun, but there wasn’t enough variation, and the big red/blue blocks were pretty horrible. I thought a fantasy game in that style would work really really well, so I tried to implement a simple first person engine in that style(...)".
 - http://www.zachtronics.com/infiniminer/
 - https://minecraft.gamepedia.com/Infiniminer
 - https://notch.tumblr.com/post/227922045/the-origins-of-minec...
It sounds like both you and fake-name might like Microcorruption: https://microcorruption.com/
Time spent enjoying yourself and learning things (even if they aren't directly applicable to work) is not time wasted. Improving your problem solving skills is always good and it often feels good, as long as you keep the level of time commitment within a healthy range.
EDIT: Urm, sorry. Zachtronics games let me actually exercise my brain, just like side projects. Real on-the-job programming these days is mostly gluing, which has nothing to do with technology, and is essentially navigating bureaucracy created by other people. You have state A, you know state B you want to be in, you have to discover the appropriate forms to fill in and stamps to collect on the way, and often perform kafkaesque dance around public keys and OAuth flows and related concepts. It's getting about as fun as tax forms.
I was asked today what about working with websites I found so fulfilling. The reason boils down to the fact that, more than any other domain out there, I feel like I'm working directly with the future. I'm working directly at the intersection of technology and business, driving real value for real people. Anybody who is making a website for dev money is doing this. It's just way too expensive to waste money on something that's not.
I feel like if you consider your job as 'just gluing', you're missing out on something amazing.
Friday we were having a team discussion about data modeling and how we wanted to structure a particular concept. When does it become worthwhile to introduce another database to accommodate a new data flow? What precisely is the criteria you use for determining when to denormalize? Our Postgres database worked just fine with little consideration towards perf, until we needed to use analytics. Now all of a sudden all those joins matters.
How do you work effectively with designers to produce a great-looking, functional website at the speed that a media company wants to work at? The whole team has had to really level up their CSS knowledge and code organization because things change really really fast. Layout goes from being a chore to a matter of fair urgency that you get right the first time and fast.
Say you don't work for a fast-paced media company. Great, now you have tons of spare cycles to devote towards maintainability and code quality. Just how far can you golf your job down to? At my last job I was touching a code editor twice a week.
I refuse to buy into the mentality that says that any programming job can be meaningless. There's always something neat you can be doing there.
I'm very happy that you feel passionate about your work. I envy that. This comment is not an attempt at making you less passionate; I'm trying to point out differences in perspective.
One phenomenon I observed is that people who just learned programming are fascinated by everything. People on their first or second job. People just learning their first or second programming language. They're so full of enthusiasm. I envy them. For me, that moment was many years ago, way before I was able to join the job market. Because of that, I sometimes think that there's a disadvantage to learning to program before adulthood - your first jobs won't be as exciting. You've already seen 90% of the problems you're about to face, and your attention is thus focused not on the technical aspects, but on the fact that you have this problem in the first place, likely for no good reason.
> The reason boils down to the fact that, more than any other domain out there, I feel like I'm working directly with the future. I'm working directly at the intersection of technology and business, driving real value for real people.
Yeah, for me - and many others - that "future" is a disastrous dystopia, a perversion of what computing could be, a land of corporate riches, total surveillance and great waste of resources, instead of the promised efficiency and empowerment of individuals. The web of today - from the tech stack to dev communities to popular business models - is a tragic reminder of how "worse is better" can be taken to an extreme, resulting in all the compute being mostly wasted on software bloat and glitter. Consider e.g. Moore's law, and then consider that the software of today doesn't usually offer new user-facing features that are actually useful (i.e. not glitter) over the software from 15 years ago. Sure, most of it is the same old thing but networked!, but that's arguably more of a business model change than something meaningful to end users. And the web is unfortunately driving all that bloat, glitter and user-hostile business practices.
Yes, I very much don't like the cloud.
> (...) driving real value for real people. Anybody who is making a website for dev money is doing this.
I question the "real value for real people" part of this. In fact, I believe it would be better for everyone if a lot of those web jobs were not done at all. After all, the dominant model of the web is to waste people's time (result of optimization for engagement) while making money off advertising (i.e. wasting more time), plus building surveillance infrastructure to make extra buck off data collection. I do not subscribe to the view that just because some money changes hands, it's automatically a good thing.
But then, maybe I'm just burned out. I've noticed I've become increasingly depressed about this industry, and the typical jobs that are available.
The only thing that worries me right now is World War 3. And losing the whales. That's really sad.
Violence doesn't just disappear, it just morphs into another form. As the internet has slowly spread, it's allowing a lot of people's inner turmoil to manifest, this is the cause of the current political environment. Since this turmoil is chaotic and undirected, it's being harnessed by people who do have agency to serve political ends.
It's worrying until you realize that this is how politics has always been done. Democracies have always been mob rule with an aristocratic backbone to fall back on when things get too unruly.
I'll take the current political climate over that which generated the French Revolution any day of the week.
Spy networks also have a long long history. They used to be the tools of autocrats to enforce social order, and still are in political entities like ISIL. I'll take my computers spying on me for economic ends over people spying on me to actually literally control my behavior any day of the week and Sunday too.
The question is, are those two climates really that different?
> people spying on me to actually literally control my behavior
You've essentially defined advertising industry. It's a very insidious form of control, but just because it doesn't involve threats of violence, doesn't mean it isn't there and isn't working.
You just can't conflate today's RedPillers with that.
If you look at the Civil War, this was a conflict that rent families apart. Brothers faced down brothers across a battlefield. Fathers fought sons. The Civil War was the culmination of a political quarrel that steadily rose in tenor since the inception of the nation. It was a hundred years in the making, enough time for the sides involved to get real passionate about it.
The essence of fighting and violence are still there, the same deep inner chaos is driving these conflicts.
But what's missing is the ridiculous amount of zeal that both sides possessed. If you have that kind of zeal, these days the only way to fulfill it is to go join ISIL. And people do that. But most people aren't getting that bad. They find an outlet. Trump is that outlet. Brexit is that outlet. Before it was mob violence.
It's the same with advertising. The continuation and slow civilization of the new domain of the marketing of human attention. However bad it is now, it was worse before. Before machines did the dirty work, it was other humans acting in unbelievably shady manners to rip people off for as much as they could. And it was considered normal.
Combine that with the fact that web chumps think they're 'inventing' when they're solving problems that were solved decades ago, only worse, and most of them don't have the historical background, education, or even interest to know what mistakes they're making. They think its "leveling up" to solve an already solved problem, but in web format, while wasting everyone's time with ads, tracking, gimmicks, for money.
You are not burnt out, or wrong. The web used to be better; computing used to be better. Windows is now a service, and Linux still can't drive graphics card without nonfree drivers. We failed, but I think there might be a chance to fix things.
We need to out together a cohesive document that explains why modern computing needs a serious overhaul, and a plan to get there. The computer should be fast; UI should be appealing, but minimal. It should be understandable and open down to RTL of the processor. The core should be aggressively minimal, and fully understandable. Networks with no central auth should be at least an option (preferably a local mesh). It should be cheap.
I'm thinking like a modern DOS, but for RISCV, fully implemented on an FPGA (goal of course to move to custom silicon for performance improvements later).
Your tone is very out of place in this thread. If you don't know that something was solved before and you solve it yourself, it is a great feeling and very rewarding.
I love solving crossword puzzles, riddles and similar games. Yes, even though someone else even _designed_ them. We were talking about gaming.
Agree on all those goals. Over the years, I've seen some essays and comments scattered all over the web containing those ideas; it would be great to collate all of those thoughts somewhere.
I can handle the FPGA side. Start with essentially DOS for RISCV. Use qemu for kernel development, and Verilator as the simulator for RTL. Develop a simple graphics unit that is "pluggable" so you can replace it with a more advanced one later (or if the user requires it). Same for networking.
We'll target one of the ICE40 fpgas with an open toolchain. Not that they're great FPGAs, but the open toolchain is what's important.
I've been batting this idea around for a while.
My side projects generally involve creating my own little Garden of Eden on top of as mainstream a system as the world can muster, which appears at the moment to be Ruby driven by a shell, not sure yet if it's appropriate to try something other than bash. I never even get motivated to drop down to making C extensions, much less reinvent hardware.
If I'm going to reinvent anything at this point it will be the shell, which to me is the most powerful UI abstraction tool available atm. My main gripe at the moment is $PATH. If I want my own tool to be called sort, well the answer is don't do that.
Reinvention is only relevant when you can actually add capabilities that didn't exist before. Then you have to communicate those new capabilities with a killer app. Even my little example, nobody's going to care that I fixed shell tool namespacing if I can't articulate why I needed it with a better system for personal computing.
And if I go and do all that work to make a new shell, it has to solve all the same problems that the status quo evolved to solve. Now that I'm thinking about it, the answer to my dilemma is to invert the shell, make a very basic CLI that delegates to the shell when you really need it, but offers an extensible garden that is free of the shell otherwise. Build on Readline, not bash. I never really needed bash anyway.
I mean, don't get me wrong, I'd be very very happy to implement my side project on the hardware and OS that adheres to your proposed doctrine. Openness is great. But the seething shifting mass of backwards compatibility isn't just going to go away after you reinvent it all. You're just resetting the clock.
My problem with things like Haiku and Reactos is that they're trying to emulate systems that have already existed - Beos and Windows, respectively. All I want is a modern DOS, say with a faster/more capable graphics layer.
The closest I've found is Wirth's Project Oberon, but the choice of language meant that there's very little that can be pulled from existing repositories and used directly - not too many people are programming in Oberon. C is a requirement, but you get that with the RISCV tooling.
It can https://en.wikipedia.org/wiki/Free_and_open-source_graphics_...
I hate routine and repetitive tasks and I would quit if I was bored every day (there are certainly some boring days).
I read somewhere once that new developers coming into the industry just for the money are in for a shock. Software is boring to a lot of people, you have to be the right kind of person to actually enjoy the tedium of reloading, recompiling, debugging, just for that one short lived smirk to yourself when it all works and you check it in.
My God, are we working the same job? Have you ever found a job that was not just gluing things together?
That sounds... a lot like a Zachtronics game. How feasible do you think it is for a gluing web developer with a full-time job already to move into embedded?
My side projects on github are a joke vs actual FOSS contributors, because I very seldom touch them for any meaningful time, given there is no pressure to finish anything.
Which goes back to what you mention as alluring.
I like shmups/FPS games, but the enjoyment I get out of them is very different then how I enjoy programming.
Zachtronics games feel, at least to me, just like programming, only without the useful end-result. If I'm going to play a videogame to relax, I don't want to feel like I'm working without actually doing anything.
Maybe, if I didn't have a bajillion hobby programming projects that all have lots of things that I can tinker with, I'd have more interest.
That's why I really, really wish they would use a real architecture's opcodes, or a real language.
Yeah, I'm not going to be able to go from the games straight into x86 programming but when I come across the idea of op-codes and registers again I'll be in more familiar territory.
What they do teach very well is the Test / Execute / Debug loop and problem solving.
Building and optimizing pipelines... I do that at work.
I remember a 3d artist friend saying they had zero interest in Second Life which they saw as working outside of work.
Oh, and Tetris dreams, I don't miss them one bit. I still get the same effect if I work on a programming problem relentlessly into the night, dreaming in code is torment for me.
You're really not THAT old :)
On your main point: I disagree. Even if they don't have "real world results", that doesn't mean that they're not valuable. They have value as cultural products much like books and movies do, but I also think there's an inherent value in "play" itself. It gives us joy, it teaches us how learn new skills, it gives as a practice arena for social interaction, and it exercises the parts our brains dealing complex thinking, spacial reasoning and reaction. It's also just plain fun, and that's not nothing.
You could say playing games "has no value" in the sense that reading a novel "has no value": doing this activity doesn't contribute anything to the world. It's just good for you.
I had done a lot of python and ruby programming, but I didn't know what a register was or an op code, etc, until I played around with those games. It also was the first time I understood what a pointer is and "low level" programming in general, and gave me enough of a knowledge base to get a grasp on Rust and start learning it.
Maybe it would be useful to teach more inaccessible parts of actual programming. Assembly is a good example of something useful which I would assume a lower % of programmers have time to practise.
Another example is reading source code. Again, a smaller % of progammers do this as a hobby.
There was an example of the algorithm that turns the screen red in Doom. If I recall, this led to an interesting HN rabbit hole.
My personal ranking: Opus Magnum > Shenzhen I/O > Exapunks > Infinifactory > TIS-100 > Spacechem.
I hope we keep getting more Zachtronics games for a while; there really aren't too many games out there that are comparable to them.
That's been my impression as well. TIS-100 is still has a high replay value, because optimize optimize optimize!
Shameless plug: I think I made the Signal Averager about as fast as it can possibly be https://www.youtube.com/watch?v=XBfEcxvJ6aY
(And you can't just always keep choosing "build a new one elsewhere", because this increases a literal attack surface and invites literal bugs.)
Honestly, I find that Spacechem is one of the very best game ever. I am really happy that Zachtrorics continues trying making better similar games, as it generally does make great games (I immediately purchase all their games - I only missed Opus Magnum as I was busy becoming a father when it launched), but so far, I was not able to feel the joy I felt when my Spacechem reactor finally worked, watching all the chucks fitting together (I know, I really need to try Opus Magnum which is more similar to Spacechem than other games in the serie - but my impression is that the UI looks much more busy, and simplicity is one of Spacechem strong point, which makes it enjoyable on a tablet for example). I'll admit that Spacechem had the advantage to be the first of this kind I tried, so it could be one of the reasons I loved it so much.
Also I am a bit sad that making games easier to beat is even a goal at all - it's great to try to make them easier to play / to start for non-programmers and beginners. But I find that having a few levels that are really challenging makes a game strictly better. I know that many people think "I paid for the whole game, I need to be able to finish it all reasonably quickly", but personally, I think it could just mean that the game was simply not challenging enough.
For what it is worth, I did beat Spacechem (whatever it means, I have the "beat the game" achievement on Steam), but I am stuck on TIS-100 and Shenzhen I/O (I spent much less time on this one though). Exapunks does feel easier than both for now (the programming language is slightly "higher level", so maybe it feels more familiar).
I would love to go back and finish those, but what holds me back is that I would have to replay the whole game. All the tricks I learned about how to play it I have already forgotten.
Exapunks this time around was lovely, along the same vein as TIS-100 and Shenzen I/O, less like Spacechem/Opus Magnum/Infinifactory (which I would still highly recommend.) Going back further, I'll add http://www.zachtronics.com/ruckingenur-ii/ and http://www.zachtronics.com/kohctpyktop-engineer-of-the-peopl... as notable Zachtronics games to enjoy.
Write code for swarm-like processes to hack networks and perform tasks before exiting the network without a trace.
From what I've heard on a thread discussing one of his games, it's the fact that his games are built with an old adobe tool (or something like this) and they can't be sold throught Steam. And apparentky selling directly from his site doesn't bring enough money anymore.
And he doesn't want to relearn a new dev environment, since (if I remember right) he's not a developper, rather a game designer.
Is this not the plot of Neuromancer?
Just the concept made me smile.
Mostly for practical reasons. I can't imagine how the UI would work on a phone -- either the text would be microscopic, or you'd have to scroll around constantly.
Each individual cell is ~12 lines of very short line lengths, yeah? You can easily fit a single cell on-screen with a keyboard while editing (or potentially while running), and then you could imagine a more abstract representation of a whole running system if you choose to zoom out while the system is running.
A few years ago I built a prototype of an iOS editor for Core War (https://en.wikipedia.org/wiki/Core_War), and it felt super-natural to have a custom keyboard whose keycaps were individual opcodes rather than ASCII characters.
Probably doesn't help that there are all kinds of minor idle animations in the games, even when there's nothing else really going on.
> We do all of our development in C# using a custom low-level “game engine”. At some point we need to do a writeup about it, it’s kind of interesting tech.
But I think they have at least one Unity game... or so I thought.
Also found this quote from an AmA on reddit:
> We've used C# since SpaceChem. I can't imagine using anything else, honestly. Infinifactory and TIS-100 use Unity, while everything else uses some kind of lightweight SDL-backed C# engine.
> SHENZHEN I/O and Opus Magnum are both using a very minimalist C# "engine" inspired by some of Casey Muratori's ideas on game engines and game programming. It uses DirectX or OpenGL for graphics, and SDL for everything else. It's basically just one giant Update() loop, and is the greatest game engine I've ever had the pleasure to work with. Despite this, I would not advise novice game programmers to do the same.
 - https://www.reddit.com/r/IAmA/comments/78wv2h/im_zach_barth_...
I see that a lot is it the default from YouTube?
And that said, from experience with previous games in they have released what will happen is that they’ll only do the following things: reorder a small number of levels for balance, add a small number of quality of life features and then after release they tend to add another set of puzzles, where the first set would have already justified the asking price. It’s early access in name only imo.
I'm currently making a hacking puzzle game prototype where you need to manipulate bits of memory to trick CPU into doing the things you want. Having a single register makes it much easier to design puzzles and also solving them. It also makes the gameplay more straightforward.
Imagine a 6502 with no memory.
If we're being more generous then EXP clearly wins over the 6502 because it has two registers that can be used interchangeably. T's only failing is its propensity for being overwritten by TEST.
EXAs also have attached memory in the form of a file. Accessing that memory takes a "few" more cycles than it takes the 6502 to access the zero page. But it's there none the less.
In that sense I wouldn't say that the accumulator in 6502 is a general purpose register in the first place, since it's just as useless for addressing as the X and Y registers are for arithmetic and logic operations. Each register in the 6502 has a distinct (but often overlapping) set of available operations, and that you can do arithmetic with one of them doesn't mean that it's a general purpose register.
- crack passcodes
- manipulate tv station tapes
- soft-mod console disk firmware
- dial-up various hosts using a programmable modem interface