2,179 karma · joined July 30, 2012
matt@matt-rickard.com
Not always, but sometimes, an interesting knowledge arbitrage opportunity when fields start to collide.
- Working on a large open-source gave me access to high-quality reviewers from around the world.
- Likewise, at Google, I was surrounded by some exceptionally smart people.
- Finally, like you said, working on projects outside the scope of my work and expertise.
I'd avoid cases where extending the language is done in a non-obvious and ambiguous way.
In languages like C# and Java, I've found syntactic sugar to be very useful (e.g. lambda notion)
Surely there is copius documentation on a significant number of hard problems.
We called it localkube, and it was an all-in-one binary with features stripped out that ran the kubelet, apiserver, kube-proxy, etcd, and other components as Go routines. Eventually it had to be removed - upstream k8s was moving too fast, and there were fundamental issues that couldn't be fixed without large patches (TPRs, the predecessor to CRDs were one).
The problem with this approach is that it requires a ton of maintenance and there can be subtle bugs that come up.
The other distinction not found on this list is that only Docker for Desktop and minikube are cross-platform solutions. Running Kubernetes and docker on Linux is somewhat trivial, but managing a lightweight virtual machine and adding that extra layer of abstraction is what makes it really difficult.
Here's some more color on the reflection on comments, straight from the Linux Kernel documentation that capture my intention much better:
"Comments are good, but there is also a danger of over-commenting. NEVER try to explain HOW your code works in a comment: it’s much better to write the code so that the working is obvious, and it’s a waste of time to explain badly written code.
Generally, you want your comments to tell WHAT your code does, not HOW. Also, try to avoid putting comments inside a function body: if the function is so complex that you need to separately comment parts of it, you should probably go back to chapter 6 for a while. You can make small comments to note or warn about something particularly clever (or ugly), but try to avoid excess. Instead, put the comments at the head of the function, telling people what it does, and possibly WHY it does it."[0]
[0] https://www.kernel.org/doc/html/v4.10/process/coding-style.h...
You can tell it to just sync certain changes (e.g. syncing a javascript file to a container running webpack).
(1) minikube, which I also maintained at Google. I saw how difficult getting started with Kubernetes could be even when you were able to create a local cluster. I also knew all the shortcuts that you could take to streamline local Kubernetes workflows (e.g., loading images directly into the minikube docker daemon).
(2) docker compose, which remains a great tool but had no analogue for Kubernetes. It also didn't have a concept of syncing for hot-reloadable projects or built-in file watcher.
(1), Draft by the Deis folks at Microsoft, which was a great tool but suffered from having a component that you needed to install on the cluster to work, where the skaffold architecture was purely client side (making it a lot easier to get started, and faster). I also wanted to make skaffold pluggable, so it supported helm, kubectl, docker, bazel, and other tools right from the start. It also had clear boundaries between build and deploy and ideas for CI and gitops workflows built in.
I've found that doing something daily is the best way for me to build habits. It's been a fantastic experience. My writing became more concise. It's given me clarity.
And great idea for the site- I submitted a pull request for my blog [0].
For more declarative systems - Kubernetes gets us close. We've seen that systems that are "too declarative" like Bazel are too cumbersome for developers to do. What developers need in an environment is just declarative enough to diff - which Kubernetes provides for infra, and tools like skaffold provide for applications.
And Wikipedia might be an unique example - the markup structure is fairly stable vs. commercial SaaS.
If a competitor offered API access with the data you wanted, you would always choose the API over screen scraping. If a screen scraping business becomes big enough, they usually either partner with the existing sites (i.e. Plaid) or a competitor does.
Happy to answer any questions. I have some more ideas on more useful frontends, but I thought I'd publish a simple implementation that others could follow along with and use it to build their own.
https://github.com/GoogleContainerTools/skaffold-tools-for-j...
https://github.com/google/go-containerregistry
https://github.com/google/containerregistry
- Our team has built something exactly like you're describing https://github.com/GoogleCloudPlatform/distroless
Dockerfiles without RUN commands are technically more correct: reproducible, much easier to inspect. However, its quite limiting for the existing corpus of Dockerfiles.
I like to think of kaniko as the (pull) + build + push decoupling of the docker monolith. Other tools, like cri-o, have implemented the complement (pull + run).
Disclaimer: I work on kaniko and some of these other tools at Google
Disclaimer: I worked on this kaniko at Google