beetwenty
The key difference is that web browsers support a highly arbitrary and mutable dataset. A game engine's assets exist in a mostly-static space. The things that are allocated at runtime are things that should have a known maximum, because going over that maximum will start to overrun latency targets. Many assets are streamed, but still hit a certain size and bandwidth budget, and so are still "basically static" - some degree of compilation and configuration at runtime always takes place for rendering features. The genuinely mutable part of game state while playing is in a comparatively confined space, and that allows a lot to be pushed to build time, where it's easier to validate and to maintain.
The features that change this picture are editors and arbitrary data imports. Web browsers are all about these two things. When you click a link the document may load thousands of gigantic images, and I might try to copy-paste the entire contents of Wikipedia into a text box. The engineering requirements are much broader as a consequence, and there are more rationales to need genuine "black box" interfaces supporting a complex protocol, as opposed to a static "calling function switches on a specified enum" approach, which is sufficient for almost every dynamic behavior encountered in game engines.
The standard hammer you would apply to enforce the synchronization in all cases is relational integrity, which is too expensive for a game's runtime environment. You don't always want to synchronize everything all of the time if you want to hit a high framerate target, and a lot of performance features boil down to relaxations on when synchronization occurs. Much of the detailed design in writing a game main loop is in dealing with the many consequences of supporting that.
That's why their recommendations on errors also refer to the earlier build process and Lua integration; by the time the data hits the inner loops of the engine, there shouldn't be a case where it's invalid, because if it is, then you can't have the optimized version either.
On the other, Rust isn't the language I would want to write lots and lots of code in either. There are a few projects and organizations where it makes sense to do so(namely web browsers, databases, and other kinds of "deep backend, large surface area" types of projects), but most of the things it does well also act as a hindrance to feature development, compared with an idiomatic Java, C# or Go equivalent.
The thing I had to do is to find some themes that I am idealistic about and stick to those. The project is just a mode of exploring the theme, which means that each project and my skillset grows as needed to accommodate. The projects you are describing are completely non-thematic and are just bundles of features, so of course there's no structure to them, no reason to keep going and seeing what's next. And you are probably not money-and-sales-motivated, which is the thing that drives a lot of obvious business ventures.
The first step in finding the theme is in "knowing thyself", of course - strengths, weaknesses, inclinations. Write and rewrite the set of things about yourself that is maximally coherent and self-reinforcing. Then drive down that road as far as you can go: What types of projects does that support? Gradually you'll hit on a common theme, and then you can really start building.
Another way to force this along is this art advice: "Draw the same thing every day." This is a rather crushing challenge to take on, for no matter the subject matter, you'll tire of it, but it quickly brings out your inclinations and therefore the themes you want to work with.
I'm also planning to add support for tl, which should make things easier on the in-the-large engineering side of things - something dynamic languages are also pretty awful at.
And...it works, with respect to most existing challenges. Restarting and replacing is easy to scale up and produces clear interface boundaries.
One way in which it doesn't work, and which we still fail, is security. Security doesn't appear in most systems as a legible crash or a data loss or corruption, but as an intangible loss of trust, loss of identity, of privacy, of service quality. We don't know who ultimately uses the data we create, and the business response generally is, "why should you care?" The premise of so many of them, ever since we became highly connected, is to find profitable ways of ignoring and taking risks with security and to foster platforms that unilaterally determine one's identity and privileges, ensuring them a position as ultimate gatekeepers.
That means: it's conceptually overloaded for doing quick-and-dirty conventional charts, where you just want to plug in a few parameters and have it "just work" - but excellent once you need to customize and make it work with your specific requirements.
That it has the concepts, and a clear notion of them, is the critical difference. Most libraries, most of the time, don't add new concepts, they just have a premade black box of features and functions. Sometimes you want a premade black box, but often you want to open up the box shortly afterwards, and that creates the inevitable trend towards either remaking it as your own box, or being one of hundreds of people who gradually grow it into a monstrosity that does everything.
But a library that is concept-focused doesn't have to get that much bigger: it's just another kind of interface, like a programming language or an operating system, and that puts it on a more sustainable track.
"We are shocked by UC's callousness, and by the violence that so many protesters experienced as they peacefully made the case for a cost of living increase," said Kavitha Iyengar, president of UAW Local 2865, in a statement. "Instead of firing TAs who are standing up for a decent standard of living for themselves, UC must sit down at the bargaining table and negotiate a cost of living increase."
Last week, the university filed an unfair labor practice charge against the union, claiming the union has failed to stop the wildcat strike by the graduate students as it is required to do by the collective bargaining agreement.
The union responded by filing its own unfair labor practice charge, alleging the university has refused to meet with the union to negotiate a cost of living adjustment.
Direct from the article. Care to back up your statement?
That makes exceptions fall more towards the "easy-to-write, hard-to-read" side of things; implied side-effects make your code slim in the present, treacherous as combinatorial elements increase. With error codes you pay a linear cost for every error, which implicitly discourages letting things get out of hand, but adds a hard restriction on flow. With goto, because so little is assumed, there are costs both ways: boilerplate to specify the destination, and unconstrained possibilities for flow.
Jumping backwards is the primary sin associated with goto, since it immediately makes the code's past and future behaviors interdependent. There are definitely cases where exceptions feel necessary, but I believe most uses could be replaced with a "only jump forward" restricted goto.
What is good is not "on time" or "robust", but "on time and robust". Necessary and sufficients.
Which doesn't change the fact that something needs to be done, or that many of the predictions will come to pass, just, the full story is never going to work out quite how anyone expects. And that's enough to have some hope.
Detailed physics and AI, on the other hand, is a thing that is largely beyond the ability of the SNES platform, and that's something that started to pick up along with 3D gaming. We don't greatly appreciate these things in video games because we can pretty easily play with blocks and balls or find live opponents in the real world, but it's a realm that still has a lot of untapped potential.
Consider meeting planning, for example. How frequent meetings are, how long they are, how many people are involved, what the meeting venue is, and how the agenda and format is set.
There are all sorts of knobs to turn just in saying "what a meeting should look like" that will impact the flow of communication, and different teams in the same organization will tend to have different meeting styles, but at a high level, the planning has to include considerations around how to allow different teams to interact effectively, since those are the bottlenecks where the information tends to get siloed.
And then you can turn to hiring, assignments, training and promotions and there's a similar kind of thing, where the same person in a slightly different role may be hugely more or less effective, and defining the problem differently changes the kinds of assignments and skills needed. Who creates those definitions, and how? It's not necessarily the manager those employees report to that's creating them.
In fact, there's a whole cascade of effects that come from the macro situation that end up translating into differently defined roles: different legal and regulatory requirements, education and training standards, minimum wages, healthcare coverage, labor organization efforts, etc. The same people in a different country may be happier and more effective.
So, while the manager is the biggest factor in the equation, it's not all on them - it can't be. Some ways of doing business and types of company culture will work in some scenarios and others will not, and the marketplace has an evolutionary tendency to just make random permutations of management style until it finds one that doesn't die, even if it creates a toxic environment. In that light, "effective" management is a highly relative thing and can be encouraged or discouraged by the broader shape of the economy.
But the nature of the next market is, of course, much harder to glimpse. Like looking into pier glass, it takes effort to get a fragmented view of things. It's not as easy as Thiel's view: AI and surveillance, for example is more broadly authoritarian than it is any specific ideology. And infrastructure often leapfrogs stages in the developing world, and that can be true of a developed country like the U.S. too.
There's plenty of good work being done quietly in the current market. The word I'd pay the most attention to is sustainability, though. It's been more-or-less entirely a marketing term for decades, never delivering on the promise, but then, often it takes a while for the products to catch up to the marketing.
Could they have seen it coming? Absolutely, and they could have had a new architecture ready earlier or adjusted their process plans to de-risk, but again, multiple years of uncontested dominance in their main business tends to make things that aren't next quarter top-line a lower priority. And I think that really is at the heart of the issue with their projects failing so frequently. Intel's pursued anti-competitive practices for decades, and when it works, they coast along without urgency, letting marketing call the shots, and when it doesn't they use their economic moat to rush a solution.
But this time, with everything running late, Intel is going to face several quarters ahead without having a real response on the CPU front. They are not going anywhere, though. Their foundry channel is needed to meet global demand for new chips - a good deal will still find buyers. They still have plenty of existing agreements to work with, and can negotiate their way through a lean patch. And they have their new GPU stuff coming soon which should hopefully give them a piece of a different market. There will be plenty of stress to re-org along the way, though, so Intel could come out of this looking very different.
This is what people mean when they say that languages haven't progressed that much. There are places where they have(e.g. dynamic memory allocation features really do matter to large-enough, featureful-enough programs) but almost all the features can be dispensed with for the base case of solving one problem well. The tooling and ecosystem matter a great deal more since they make the difference between having a finished solution in hand and having to fight to get something built and deployed. I/O and protocol compatibility are major sticking points everywhere.
Ultimately the ground truth in both instances is that you have potentially many data models that the UI has to aggregate, and the source model, layout, display properties and hitboxes of elements are usually but not totally related and can change due to many kinds of events. Any formal structure you might come up with is bound to run into exceptions. As a result I tend to have this policy:
* I don't trust the framework
* But I leverage the framework to produce early results, and both immediate and retained modes offer ways of doing that
* I expect long-term maintenance to involve a customized framework design regardless
They are not beautiful, but I am fascinated by these chains as a phenomenon, nonetheless.
The library has a dependency on another library, and when you go look at the dependency, it tells you that it needs to use a specific build system. So you have to build the library and its dependency, and then you might be able to link it.
But then, turns out, the dependency also has dependencies. And you have to build them too. Each dependency comes with its own unique fussiness about the build environment, leading to extensive time spent on configuration.
Hours to days later, you have wrangled a way of making it work. But you have another library to add, and then the same thing happens.
In comparison, dependencies in most any language with a notion of modules are a matter of "installation and import" - once the compiler is aware of where the module is, it can do the rest. When the dependencies require C code, as they often do, you may still have to build or borrow binaries, but the promise of Rust, D, Zig et al. is that this is only going to become less troublesome.
The I/O boundaries and resource limits are the really important bits: A web browser is ultimately just a bundle of I/O functions buried inside specialized feature APIs, with only some very specific "patch this" limits for maximum resource consumption. This has allowed the size of web apps to creep upwards indefinitely while not being able to actually do every task, because the feature APIs sandbox in a haphazard "intended for the average consumer" way. When you add in comprehensive limits, the design and the software built on it are able to last: it's the lack of limits that has always created software crises.
One could imagine, instead of the browser as a lowest-common-denominator sandbox, a fantasy system specialized "for text editing", which has a different spec from one specialized "for 3D graphics": This would narrow the scope of sandboxing, make it easier to task-optimize, and yet also create the need for a Lisp or Smalltalk type of system that needs flexibility "for prototyping". It's not an unreasonable path, considering how broader trends in computing are leading towards hardware specialization too.
Combined with the stand to raise my phone I have something a bit more ergonomic than most integrated-device experiences, definitely better than what I would get from a Gemini when a flat surface is available, and I can literally throw on my vest and go for a jog and then take out the kit at a coffeeshop and lose myself in writing without difficulty. You might also need more I/O or a full PC architecture, but this setup was like a "my search is over" moment for me.
For ordinary tasks, a consumer device that can SSH in, and ideally do some USB, probably is the right thing. Last week I put together a $50 vest-pocket writing kit with a smartphone stand and a folding Bluetooth keyboard(iClever brand, if you care). And in just a week of use, I've already had multiple strangers remark "I want that" - I can easily imagine using it for coding and sysadmin too. The real limits to client computing these days mostly revolve around operating system and I/O, and you do want to have lots of ports...but mostly on your desktops and servers.
These are things you appreciate and can grow from by living here in the long term, but are easy to miss if all you do is walk around and see low-rise buildings and homeless people. There are far more exciting cities in terms of bustle and grandeur, and more livable, well-maintained, inexpensive cities for everyday activity.