ggorlen
Joined 7 years ago
Joined 7 years ago
arr.reduce((acc, el) => {
if (el % 2 === 0) {
acc.push(el * 2);
}
return acc;
}, []);
over arr.filter(e => e % 2 === 0).map(e => e * 2)
The only advantage of the reduction as I see it is performance, but this is highly dubious and would need to be profiled for proof (I don't recall seeing removing a pass like this matter in practice). And if perf does matter, a for..of loop would be clearer and one-pass, not to mention async-compatible: const result = [];
for (const el of arr) {
if (el % 2 === 0) {
result.push(el * 2);
}
}
Exercises like this illustrate why verbal technical job interviews are useful in the age of LLMs--a series of A/B taste preferences seems high signal and ripe for discussion: "Ah, so you're choosing reduce for perf... please describe a scenario you encountered where this made a measurable impact".In cases when reduce is required because (for example) JS doesn't have a sum function, it should be kept simple. `arr.reduce((acc, el) => el + acc, 0)` is acceptable if lodash _.sum() is not available.
In cases when reduce is required because the higher-level operations like map/filter aren't flexible enough, decompose the reduction operation into simpler steps and use map/filter with multiple passes, or write a traditional for..of loop.
This principle also explains why enhanced/range/of loops are preferred over counter-based `for` loops, and counter-based loops over `while`. Technically all loops can be handled by `while`, but it's seldom needed because enhanced loops handle the common case with the cleanest syntax. Reduce/while/counter-based `for` loops are antipatterns where higher-level, less powerful abstractions exists.
https://magnet-caper.glitch.me/
https://generative-placeholders.glitch.me/
https://spurious-soup.glitch.me/
https://conways-webcam.glitch.me/
https://doodle-jump-html.glitch.me/
https://fragmatic-glsl.glitch.me/
Linters make this a non-issue, and most modern development environments support them.
https://eslint.org/docs/latest/rules/no-console
https://docs.astral.sh/ruff/rules/print/
In situations where for whatever reason it's infeasible to use a linter, a basic grep can surface prints in a codebase reliably enough.
My approach is a step or two more automated (optionally using a userscript and a backend) and runs in the console on the site under automation rather than cross-origin, as shown in OP.
In addition to being simple for one-off scripts and avoiding the learning curve of a Selenium, Playwright or Puppeteer, scraping in-browser avoids a good deal of potential bot detection issues, and is useful for constant polling a site to wait for something to happen (for example, a specific message or article to appear).
You can still use a backend and write to file, trigger an email or SMS, etc. Just have your userscript make requests to a server you're running.
[1]: https://en.wikipedia.org/wiki/Scratch_(programming_language)
The LLNL internship seemed too IT-oriented to interest me. Mission Bit involved teaching high school kids to code after school, which I did for over a year and received course credit at CCSF for.
So it's not that surprising to me that they went from ~2 companies to 0, even disregarding the major drop in attendance at CCSF since 2017 [1]. I didn't attend any other fairs so maybe I missed something, but I never got the impression that they were especially "bumping".
[1]: https://sfstandard.com/2022/01/27/by-the-numbers-sf-higher-e...
It was a good life experience even though I wound up sacrificing my 4.0 by a few grade points. In hindsight, had I realized how steep the curve would be for DC, I'd have pushed a bit harder to squeeze out a few more test cases, but I was pretty mentally defeated at the time and felt like I'd exhausted all of the ideas I had on the projects multiple times over.
I found DC more difficult than compilers by a wide margin because of the nondeterminism, debugging difficulty and trying to figure out what the test harness was even doing. Compilers involved writing more lines of code, but it was manageable, synchronous greenfield application design.
Two difficult classes I took together were Embedded Systems Optimization and Compilers, both taught by the same instructor and with similar concepts, so working on one helped solidify concepts in the other.
On the other hand, I took Distributed Computing during its first offering alongside Graduate Algorithms and was super overwhelmed.
OMSCS graduate. The program certainly ate up most of my free time for 2.5 years, but on the other hand, the whole degree was about $8k for me and required no thesis or capstone project--just grinding through 10 classes worth of assignments and exams. Also, it was 100% online, so that flexibility frees up time.
Theoretically, if you do 1-2 easy-ish classes per semester, you can minimize the free time impact. But I was less interested in the credential and more interested in the learning experience, so I took difficult classes and worked as a TA.
Caveat: I graduated in 2021 so things may have changed since then.
- https://en.wikipedia.org/wiki/Kodokushi, the Japanese phenomenon of people dying alone and remaining undiscovered for a long period of time
- https://en.wikipedia.org/wiki/Joyce_Vincent, a British woman who had been dead over two years before discovery