4,284 karma · joined December 5, 2012
I really try to take advantage of the database to avoid ever having to munge very large CSVs in pandas. So like 80-90% of my work is done in query languages in a database, the remaining 10-20% is in Python (or sometimes R) once my data is cooked down to a small enough size to easily fit in local RAM. If the data is still too big, I will just sample it.
Perhaps a more interesting question is whether the ML community needs a better language than C++ for _implementing_ ML packages. TensorFlow, PyTorch, CNTK, ONNX, all this stuff is implemented in C++ with Python bindings and wrappers. If there was a better language for implementing the learning routines, could it help narrow the divide between the software engineers who build the tools, and the data scientists who use them?
A key premise of functional programming is that the constraints of immutable semantics free the compiler up to do all sorts of performance optimizations, and the compiler can apply those optimizations much faster than a human developer can.
Also, when you really need a vector that you can mutate in place, you can still do that. Haskell has a mutable vector type. It's not the default idiom, but if you needed to sort a billion numbers in place, this is what you would use. Note all the function names prefixed with "unsafe": https://hackage.haskell.org/package/vector-0.12.1.2/docs/Dat...
Makefile
all: example.html
example.html: example.md example.png
pandoc $< -o $@
example.png: example.dot
dot -Tpng $< -o $@
example.dot digraph G {
foo -> bar;
}
example.md # Example
Google knows and admits that their process has flaws and their HR team does internal studies on it. Just because Google does something, and Google is big, doesn't mean what they do is optimal.
There's also a ton of opinion and taste involved in software engineering, which can bias the interviewer's view of someone's technical ability. Not to mention all the unconscious biases against people who don't "fit the description" of a typical software engineer demographically.
The Googles of the world limit their own potential by rejecting many talented people who couldn't make it through their hiring filter for reasons that have nothing to do with their actual ability to build software. Then they express angst over how difficult it is to fill positions. It's a self-inflicted problem, and a hard one to solve. It's probably impossible to design a theoretically perfectly fair hiring process without also solving all causes of inequality in society generally. But it can be made better and more fair than it is, and many companies and applicants aren't satisfied with the existing hiring processes, so they are making efforts to change the situation, as they should.
I wonder if there may also be a push to reduce some compute-intensive workloads, like training/scoring ML models or refreshing analytics dashboards that are not mission-critical and maybe not even actively being used.
When you have a bottleneck step in your process, the whole end-to-end process will run the most smoothly if everything else matches pace with the bottleneck.
But what tends to happen with stack ranking is that people only do what their direct manager values and rewards in the short term, and avoid other work that really needs to be done, or what the actual customer wants. Your boss becomes your only customer. You invent redundant new shit because that's more impressive than fixing your existing shit that's broken. This can be incredibly damaging to the quality of the product, and also to the careers of anyone the boss just doesn't personally like for whatever reason. It creates a monoculture of like-minded, demographically similar people who suck up and shit down.
You even can see pathological behaviors like managers purposefully recruiting low performers as sacrificial lambs to offer up at the next review time.
Companies got rid of the rank-and-yank system in the last decade or so for a very good reason.
It's also great for WYSIWYG BI tools like Tableau or Power BI, which can connect to and fetch results from anything that has an ODBC driver. Without that, the BI tool vendor would need to write their own driver specific to each datastore on the market. So if anyone ever wants to build a generic BI/analytics tool product in Rust, this is a prerequisite.
"It's important to learn how to use your tools well, but once you have, stop prioritising that. They're good enough now, you know how to use them. Don't get trapped in this local maximum of optimisation. Go and build stuff."
The key is having the awareness and discipline, when the prototype is validated and starts to gain traction, to throw it away and build the real production app using what you learned, instead of just accumulating months to years of technical debt and cruft on top of a prototype. If you launch with a "permatype" you will eventually find yourself facing a very expensive and painful "2.0" project.
And how much of that time was just getting the data into the tables? There are fast and slow ways to do that, too...
The worst thing about a highly expressive language is that you can do anything you want to.
Expressive power vs. intelligibility (for the sake of common convention and communication in a team setting) is a real tradeoff, and the "principle of least power" does partially explain the popularity of slightly less-powerful languages like Java, Python, and Go, where there is generally just one idiomatic pattern for accomplishing a given task.
The way I have always thought of strategy, though, is that it should be directional. Say what input variables you think we should increase or decrease, in order to get closer to the optimum, relative to where we are currently.
Taking your example of cost vs. quality. Obviously we want to find an optimum. If a manager can state which direction we need to move in and why, to make progress toward the optimum, I will take their strategy seriously. But if they just tell their people to "optimize," I dismiss them as having no strategy. A manager who's responsible for formulating and communicating a strategy, has to at least have an opinion about which side of the curve we're currently on.
Early in my career I was an analyst at an ocean shipping company--lower rates meant fuller ships, higher rates meant better unit margin but lower utilization. Corporate's strategic message? "Fill up the ships with high-paying cargo." It became a joke among the employees.
There's no way to measure lost sales with high accuracy, but that's not really the point, because it's most useful for modeling decisions and policies in a forward-looking context. Future revenue forecasts, the other term in the equation you're optimizing, are also inaccurate.
These functions are also generally "bathtub" shaped, and with the amount of money at stake, you can save quite a lot by being a little closer to the optimum, so they're worthwhile.