133 karma · joined August 5, 2017
Dynamic languages can always lean on runtime features, but that's also their peril. Late binding deprives you of leveraging the tools in favor of "trust me".
In both cases you can get a maintenance nightmare, of course. The point as I see it is to move things toward the runtime when the error case is not troublesome, and towards the compiler when automating in more safeguards would help.
Regarding visual editing, those tools are of direct interest to any signal processing work(which for games means audio, visual effects, and in some cases asset dependency resolution). They don't work well once your task is too fine-grained. Graphs of finite state are also extremely useful for game AI and concurrently scripted logic, so tools that formalize those concepts and give them visual UI are also commonplace.
In audio work, a FSM is a good starting place to conceptualize processes like key state tracking and envelope triggers. Games have more shifting requirements so the design process of the FSM is given much more emphasis.
Intel shares with Nvidia(also currently using large dies) a limited form of performance leadership at the high end that may be eroded in the face of these shifts. Most of the market is going to see more benefit from more cores instead of faster cores with the current conditions. That might be less true once we're talking about a baseline of 16 or 32 cores, but 2 is proving to be too few for current workloads.
And that's just their nearest competitor. ARM SOCs have consumed the mobile market and are creeping upwards. My ARM Chromebook makes a pretty good Linux desktop too, and you can practically trip over RaspPi devices.
As of right now (for game projects) my strategy is to use source code generation to make the working language behave in a database-like fashion and emit a static result, rather than to engineer a complete dynamic schema with a scripting runtime and all the bells and whistles of a standalone database. The latter is both harder to build and lets me leverage fewer of the tools of the host environment.
And on that note, what I think Web Audio tried to be was a drop-in kit for game engines. Getting the full functionality of Unreal into the browser motivated the requirement for audio processing. But the actual implementation was muddled from the start: basic audio playback remains challenging(try to stream a BGM loop instead of load+uncompress and discover to your woe that it's not going to loop gaplessly, even when the codec is designed to allow that.) and my hobby stab at an independent implementation ran out of gas when I tried to get their envelope model working. The spec has a lot of features but not enough detail, and my morale sank further when I looked at how Chrome did it(stateful pasta code). I got something half-working, put it aside and never came back.
OTOH I had also tried Mozilla's system. That was very simple, and I got a synth working in no time at all with decent performance and latency. Optimizing from that point would have been the way to do it, but something in browser vendor politics at that time led to it being dropped.
Where this distinction gets muddled is when a metro area is sprawling enough to have many governments. For example, City of Los Angeles has a mayor, but it only represents some of the major neighborhoods of the metro area, while Los Angeles County, which spans multiple cities, has a board of supervisors providing oversight on a more regional scale.
In contrast, San Francisco is a combined city and county with both mayor and board of supervisors: but the Bay Area has 9 counties(more if you count certain outlying cities) with a multitude of city governments, and there is no equivalent to the LA county board unifying representation at the "millions to one" scale - those issues are duked out between different county agencies or pushed up to the state level. Accordingly, Bay Area cities have some more individual freedoms but are much less inclined to cooperate on regional issues and will frequently export problems onto each other.
If there's a threat on the horizon, it's probably the one we discuss the least right now.
The one and only thing that muddies this picture is other people. Once you are collaborating on a program(whether on the same team, through end-user code, or through a library or API call) all your tricks, preferences and conventions are subject to other people's inept groping and misunderstanding. And that is where you get into standardized best practices. They are basically guaranteed to not actually be the best practice, but they're the one you can compromise on.
* Adopting a more deliberately Stoicism-inspired philosophy - whether or not I'm succeeding at my goal there will be another struggle waiting after that, so there isn't really an endpoint here other than my death or permanent incapacity. * Buying into feedback loops over goal-and-achievement systems. Feedback is more important to doing good work than any other thing - if you don't have it then you don't know if it's any good. But also, it's easy to miss what forms of feedback are available and sometimes it's as simple as critically thinking about whether or not an expected result happened(e.g. write software, add a feature: did it actually do what you expected?) * Got a lot of money. I did this through crypto. I had no expectations about it, it was just a way of putting another iron in the fire. The amount of physical effort put in was, of course, clicking a few buttons, typing a few passwords. But the mental/emotional effort of "why bother" and "why study this" - that is why you aren't seeing everyone on the street talk about it(yet). I had to make a firm decision to get in for anything to happen. And there's a lot of random chance to that, just as with my game projects, which have hardly gone anywhere in years of trying. And now that I have the money my mind is rearranging things so that I will further devalue my work on games in a monetary sense.
A lot of "striver porn" - worrying about productivity and getting ahead and making Right Decisions - stops making sense post-success. If you end up with the success, great, but I wouldn't try to impose a narrative arc on it. The actual factors involved are just mindboggling. The feedback loops, on the other hand, those are something you can improve from nearly any life status. And they tend to vastly differ from productivity tropes because they're about optimizing a whole cross-section of life, not just quantifiable output. E.g. if you do less but your stress level is lower, do you end up ahead on health later?
And, having said that, I also didn't know that some optimizations were possible until later in my programming career. There's just a point where it escapes one's current level of skill.
Write prototyping code that solves an existing problem as nearly as you can manage, and then figure out how to improve it on one or more metrics:
* smaller SLOC (automatic programming, data abstractions, etc)
* better portability, fewer dependencies, simpler build processes
* better throughput, latency, or resource usage(memory, storage, bandwidth, energy)
* eliminate one or more classes of errors(e.g. off by ones, null dereferences)
* better user interfaces, better documentation and accessibility
* more efficient development of the prototype
* better working environment (workflow, tools and knowledge of the tools, automations for convenience)
Oftentimes, you can make one change and improve several metrics. Other times you sacrifice one to get others. There are bad tradeoffs like code golfing or premature optimization. Having the prototype already in hand is crucial in all cases since it gives you a spec to bump up against when you're at risk of falling off track. If you're more daring this can take the form of an existing shipping codebase.
Edit: but it's okay if it's a prototype
I prefer organizing by year and by category(business, code, etc) instead of by client but overall I'm mostly happy to have any organization of my files at all.
On the other hand, if the tech hockey sticks in adoption, that's basically the end of the world order as we know it and the start of one where economic value skips around between different cryptocurrencies, never really staying in anyone's control. In effect a "marketplace for power consolidation".
It's not quite like the gold standard, because liquidity between cryptocurrencies is a software feature, not a physical constraint, and a perpetual stream of speculative ICOs discourages capital pooling. If you're poor in the dominant currency, you simply adopt the underdog to even the odds. Everyone will be writing themselves blank checks through chain forks, in effect encouraging a demurrage economy.
Now when I look at new machines and components I look for something slightly middle-of-the-road, mainstream-leaning, with low power output but quality components, and later revisions of an architecture, since system performance is a more-than-the-sum-of-its-parts game. I actually priced out a Ryzen 3 build today, but I might be better served with the last gen APUs.