2,421 karma · joined February 21, 2007
jonolson at google dot com
Opinions are my own, not those of my employer.
Development happens at HEAD is the important part.
Make sure to view it on a sufficiently wide browser to see the ASCII art of a torn piece of punched paper tape.
Feel free to ping me on IM (username is in my profile) if you'd like to talk about how to do this in a way that helps hiring committee make informed decisions.
Speaking for myself as an engineer who works in that codebase, I rarely find it gets in my way, and when I've felt exceptions were the clearest/best approach, I've not found it burdensome or difficult to justify them.
Or did you think "systems" ended at some smaller scale? ;)
Xilinx was not.
One request: if you're open to PRs (I can't promise I'll send any, but I'm trying to get into a habit of contributing to OSS with my hobby hackery), can you add a LICENSE file (context: the OSS patching policy I'm bound by is very friendly for projects on Github under most licenses -- https://opensource.google.com/docs/patching/ -- it's more problematic when the license for the code is undefined)?
This project seems more immediately useful :)
Re-visit the ones you got wrong first. Try them again, repeat until you've gotten them all right (this might just be because you remember the solution from looking it up, that's fine, you'll have plenty of time to forget by the time we get back to it :).
Now, revisit the ones where you had the right data structure on the first go. HOW would that data structure help? Go a level deeper on actually trying to solve it.
I can't guarantee this will be fun, but it should be fast. A few minutes here on there on any given problem, going one level deeper each time you visit it.
Eventually you'll have the whole algorithm for one of the problems, likely using some common data structure like a hash map, tree, or heap.
Code it in a language with a good set of algorithmic primitives, use every tool the library gives you (don't worry about remembering how the data structures work on this pass). Hopefully with the whole algorithm in mind and all of the tools at your disposal, this is "just plumbing".
Rinse, repeat.
Somewhere in there, do the same with the complexity analysis (time and space!).
Next time, try it where you have to build the data structure by hand.
Then one day you'll see a problem not on your original list, and you'll immediately think "red-black tree with a hash table lookaside buffer, but I wouldn't want to have to build the RB tree by hand if they asked me to, so AVL tree because the complexity is the same and I can bang out the code like it's what I do every morning before breakfast".
Like I said, it might not be fun (at least at first), but it is a way to break up the practice into digestible chunks. Also it builds on the strategy that I've seen work best in interviews -- if you treat each step of iterative deepening of the solution as a point where you'd talk with the interviewer about what you're thinking and why, you give them a lot to go on about your thought process and a chance to course correct if you misunderstood the question or your heuristic for how to approach it simply came up wrong.
I cannot do this thing, as I don't open my desk drawer very often, and a banana is exactly the sort of the sort of thing I would forget about. I'm thinking through how this would play out for me, and it's unpleasant for all involved.
"Do you want ants?! Because that's how you get ants!" — Archer
We do use gRPC internally, but the bulk of services were built prior to its existence/maturity and use its predecessors. My expectation is that services will eventually migrate, but that's a long way out. I'd say it's less to do with performance than a clear reason for teams to migrate, and several compelling reasons not to (yet).
Bazel is mostly a subset of Blaze, and many packages would "just work" if pulled into a Bazel workspace. Those that wouldn't are mostly broken because they rely on proprietary (but in many cases deprecated) Blaze features. I see a handful of changes go by every week migrating packages to newer Bazel-friendly definitions (a big one here is the historical handling of proto_library rules).
Kubernetes is used for some things built on GCP, but that's mostly suitable for green-field work (it's easier to integrate with existing things on Borg if you just run on Borg).
I'd put good odds on us wiping ourselves out or being wiped out before we manage to put a sustainable stake in some other chunk of ground.
Also $400B/yr is great if you can make use of it. Do we have the intellectual and facility resources to make use of that sort of windfall today? Probably not. Could more money go to cancer research for immediate positive effect? Probably, although working out the logistics for how best to direct that funding requires resources of its own (which is of course the sort of work the Gates Foundation does).
The first chapter, when I picked up the book, was a tour of Perl. I loved it. It showed me all of the highlights with no details at all. I never read another chapter, and instead picked up the second book in the series to use as a reference.
My counter in this argument HATED that first chapter. They almost didn't read another one, because it put all of these examples in front of them with no depth. They thought the book would be much improved by removing that chapter.
I would have been bored to tears by the book this person wanted to read.
I'm not going anywhere in particular with this, except to say that the world takes all kinds. Sometimes docs don't exist simply because nobody realized someone else would find that shape of document useful, so they decided not to write it.
The docs I love may well be the docs you hate :)
(note: as implied, I work on our userland QEMU replacement)
With the human you can have a conversation that will hopefully avoid similar confusion in the future which eases the frustration for many. How long before machines allow us to do the same? My bet is months, a year or two at the outside. After all, we already have conversational interactions. Building on those and tying an intent interpretation to a clarifying correction provides high information training data. There's already a swath of old, well understood ML techniques -- mean subtraction, singular value decomposition, boosting, etc. -- aimed at differentiating information from data. Instantaneous classification of responses as errors followed by information on a better response? That sounds like training gold.
There's a lot of overlap between cgroups, gVisor-style sandboxes, and VM-style sandboxes like Kata. The tradeoffs between them are mostly with respect to compatibility, robustness of the security boundaries, and performance. So, you know, the usual suspects.
We've reached a stage where we probably need better vocabulary for describing these tradeoffs :)
(I work on "near" the gVisor folks at Google, and I'm involved in the Kata community)
It was, for lack of a better description, a callous novel.
(disclaimer: I'm one of the many authors on the paper, although for building parts of the underlying tech, not writing the prose)
Huh... Why? It _seems_ like a problem with an easy (and cheap) solution, given how readily available (and cheap!) suitably precise cartesian bots are these days, combined with high-quality digital microscopes and the state of modern image alignment algorithms.
What am I missing here?