549 karma · joined December 9, 2014
As an example: do you consider solving 579×46 quickly a "math problem"? I will solve it (relatively) quickly, since I was thought how to solve that exact problem algorithmicaly.
But if you hadn't thaught that algorithm (you could argue that nowadays we have calculators for this) then it would probably take you a bit longer to derive some form of this algorithm. But it doesn't necessarily imply that you're bad at math, just that you have not practiced this exact task before.
In my experience, doing really well in tests requires more adaption to the tasks of the tests than actual understanding. Most tests are limited on time, and stress does not exactly help you to deal creatively with completely new tasks.
Note that I don't want to say that teaching algorithms is bad. It surely helps to do some basic calculation without having to think much about it. I just want to point out that the tests are often testing a specific understanding of math, and different teaching methods often also differ in their goal of what they want students to learn well.
Why can't there be some sort of industry association that pays for shared goods that everyone in the industry benefits from? Are companies just unable to see the benefits gained from this?
Newer compression formats have multiple streams that can be decompressed in parallel, or have blocks that are compressed independently without dependencies (bzip2 can be decompressed in parallel due to independent blocks).
So, I think the argument that "very special features" shouldn't be counted toward language complexity/growth is wrong, IMO. I would even say that there needs to be even more focus on those features, since they tend to be not widely known, not familar, and often there is less documentation about them, so the likelyhood that they make code hard to understand is even higher.
This is not to say that those features are unnecessary. I just don't think the justification "they are not what a pragmatic programmer will see" is good.
What you can do, though, is use Nix to build a container image with an nginx config. You just can't use the abstractions present in NixOS as-is to generate the nginx config, you'd have to write the nginx config yourself (just as you would if you use a Dockerfile). You could perhaps re-use parts, or modify the NixOS modules, though.
However, I would also like to know if there's more to it. Do they do any server side transcoding? Do they get an advantage by having multiple backend servers connected through good links, having clients connected to the nearest one and routing efficiently through their network? It appears that they use(d) H264 as their codec, are there some technical tricks they use to cope with variable bandwidth (do they use scalable video coding or simulcast)?
You don't need chrome though, chromium should be enough.
Additionally, adding lots of additional customization on top of the build system itself defeats the purpose of using a popular system in the first place.
https://en.m.wikipedia.org/wiki/Wikipedia:NPOV_dispute may be relevant as well.
However, there are at least two cases where you do not want real hermetic builds:
- in the case of open source software that needs to be packaged for distributions, vendoring all the dependencies is bad. As the name already says, distributions remix software components and thus might want to compile your software against a different version of a library than the particular version you pick. - for libraries, consumers use your library just as a component and might want to combine it with a specific version of other libraries, so vendoring also sucks.
Unfortunately, many declarative build systems make it hard to separate the "building a component" part from the "composing a product" part. I could find no way in Bazel to depend on system software (using for example pkgconfig).
In my opinion, build systems for open source software (as I mentioned, for companies Bazel makes sense since you often want to vendor all your deps anyway) need to have three aspects:
- build rules for just for this component - dependencies on other components/libraries - a method to lock down components/libraries to a specific version, creating an offical "product" with an official supported combination of all dependencies.
This still makes it possible for distributions to create their own "product", without having to rewrite most parts of the build system. At the same time, developers can work with the official library versions (for compat, maybe you should even have multiple "sets" of dependencies), so getting started is easy and you don't need to install lots of dependencies first before you can hack on the project.
Often, build systems do things that are nice for onboarding (like "build systems" that pull git repos of dependencies during build, in order to have a single command to build the product from scratch after checkout). But those things directly conflict with the needs of distributions. We need to separate the "instructions to build, supplying all deps externally explictly" (in the context of building a package for a distribution) from the "just build it from the command line on a dev machine" (here, dependencies should be implictly fetched automatically, to give a nice user experience).