chandler
Joined 19 years ago
Joined 19 years ago
Is it common for programmers that have been on a job to not realize the ways in which their software sucks? Knowing what to avoid and the consequences of doing things wrong is an important factor of experience; additionally, maintaining a bad system gives insight into mitigating problems.
That said, I do agree that experience isn't just a passive function of time (as in "interest earned"). Instead, it's more like a landscape that needs to be explored (and to your point, some companies will allow a programmer to explore more productive areas).
> ...the equation you posted wouldn't the intellect variable be pretty much equal to experience, and you could make up for one with the other?
I suppose the answer to your question would depend on just how much variance you place on intellect. Is it:
- 0.0 (rock) to 1.0 (cleverest human on earth)
- 0.0 (rock) to 1.0 (cleverest intelligence across time and space)
Either way, I wouldn't take the equation too seriously--it was just a model to show a trend :/
Able to make good choices = Intellect * Experience
Moreover, employers can _try_ to assess intelligence with whiteboard interviews...but the easier factor to evaluate is experience. It's right there on the resume!Of course, even then, C was functional by that definition (as long as you could remember where the parens & asterisk went when defining your function!)...so what do I know.
On the other hand, if you have the attention span and interest, Li Haoyi has an interesting (and, in its conclusion, useful) take on this topic:
http://www.lihaoyi.com/post/WhatsFunctionalProgrammingAllAbo...
Secondly, abstraction doesn't necessarily track with efficiency/inefficiency.
Comparing the wikipedia sidebar shows Publix with more stores, revenue, and over twice the number of employees.
https://en.wikipedia.org/wiki/Publix https://en.wikipedia.org/wiki/Whole_Foods_Market
I'm not going near Amazon, though.
FWIW, I tend to equate "smart" with "cleverness," as a separate measure distinct from "experience," for the same reason you describe--so what I usually go by is something along the lines of:
Cleverness is a measure of "what can you do with what you have," whereas experience is a measure of "what do you have?"
> Over the centuries we've made great gains in mathematical tools, scientific knowledge, in democratizing education and in disseminating knowledge. And this means over the centuries we've (as a species) obtained more leverage that we can apply to our raw mental capabilities, giving us (overall) greater intellectual capabilities.
I don't think we've gained greater intellectual capabilities--our intellectual capabilities are the same, we just operate in a completely different mental environment than our priors did.
Moreover, having a different view of the world allows for different connections to be made, and different potentials to be expressed (irrespective of one's individual level of cleverness).
So, for example, by placing a priority on stories & views that encourage greater investigation of the physical world, we get to where we are today. And we can teach the next generation slightly different stories that optimize for different kinds of usefulness.
To bring it to the HN contingent--if I learn a new programming language, I've gained experience in different ideas and operate in a different mental landscape. But I'm not smarter afterwards, and I wasn't dumber before.
...because people are smart. People have _always_ been smart, it's one of the defining attributes of humanity.
It strikes me oddly (not specifically your comment, but the general color accompanying these kinds of articles)--there's a kind of ground assumption that by looking into the past, one sees nothing but a gradually descending IQ.
In emacs there's a mode called ace jumping. Essentially, it lets you pinpoint exactly on screen where you want to move the cursor ~3 keypresses.
Similar to how the vimium extension to Chrome let's you jump to any link/button/control with two keypresses.
These aren't motion commands as you'd typically get in vim/emacs; instead it's a different interface to allow directly jumping to an arbitrary position (more of a warp than a movement).
http://emacsrocks.com/e10.html
Anyways, the point I wanted to make is that even some instances where the mouse is considered superior can be negated by a different UX.
So consider the idea that FPS games are more effective with a mouse. I believe this is a UX choice to reward developing mouse skills, not a fundamental limitation of the keyboard. As such, consider the following levels of keyboard FPS controls--
Option 1: Aim by directional arrows. Will be beat out by a mouse user for sure.
Option 2: Aim by movement commands (e.g. B skips and tracks the target on the left, F skips and tracks the target on the right, etc). Might be on par? Definitely has a different learning curve than using a mouse.
Option 3: Aim by label. Every target has a letter hovering over its head, and pressing the key will aim & track at that target. I suspect this would be much more _efficient_ control scheme than using a mouse.
Option 1, is akin to navigating text with arrows, Option 2 is akin to navigating with jump commands, and Option 3 is akin to navigating with an ace-jump type interface.
So although #3 would be considered unfair in a typical FPS context, as a programmer I just want to reduce effort as much as possible.
It is. Piping is akin to an untyped subset of working with Scala's collections, and there's a similar workflow between the two, e.g.:
In bash, you build up a command line with something like (as a stupid example, the number of unique file sizes in a directory):
Step 1) $ ls -l
Step 2) $ ls -l | awk '{print $5}'
Step 3) $ ls -l | awk '/\d+/ {print $5}'
Step 4) $ ls -l | awk '/\d+/ {print $5}' | sort -n
Step 5) $ ls -l | awk '/\d+/ {print $5}' | sort -n | uniq
You can see the correspondence with collections--typically building up in the editor in a similar staged manner ending with something like: Process("ls -l").lines // ls -l part
.map(_.split("\\s+")) // awk part {
.filter(_.length > 4) // ...
.map(_.apply(4).toInt) // }
.sorted // sort -n part
.distinct // uniq part
The tradeoffs between the two are essentially verbosity versus data safety (perhaps not important with a throwaway inspection, but more important when working on larger programs...).However, the building process is the same--you don't write the latter all at once, you gradually mold the pipeline until you get the output you want.
Eliminating baseball practice doesn't seem like a way to encourage more games :/
Minor nitpick, but giving someone a nickname isn't the same as anonymization.
"Hey Bob, thanks for logging on. Did you know we've been calling you 1234 these past five years!"
When a passive recognition system _uniquely_ tracks & identifies a person, it just takes time before that gets cross-referenced.
(different story if the data gets aggregated, or you scrub the uid completely after some window)
Actions can only be evaluated as moral/immoral/amoral when you've taken the time to define a system of morals.
It's the difference between a requirements document and an implementation--just as you can't determine the suitability of software without knowing its requirements, you can't determine the suitability of an action without knowing your morals.
Suppose you've decided you want to live in a society that respects the "Don't lie, steal, or cheat" maxims (for whatever reason--I've chosen this here because they're explicatively short!):
Then determining what's moral/immoral/amoral becomes an application of: 1) Does this encourage me (or someone else) to intentionally misrepresent the truth? 2) Does this encourage me (or someone else) to take something that hasn't been given? 3) Does this encourage me (or someone else) to misrepresent the truth for gain?
On the other hand, consider a company's system of "Maximize profit while minimizing legal liability": 1) Does this encourage me (or someone else) to maximize our company's profit? 2) Does this encourage me (or someone else) to expose our company to legal liability?
Notice that these two systems don't address the same concerns.
So the fine line exists because what's moral for the company MAY conflict with what's moral for the individual, and many of us don't like to think about /any/ ethical system (after all we're being paid to work in the latter!).
For an outside consideration, take the view outlined in this "Rules for Rulers" video ( https://www.youtube.com/watch?v=rStL7niR7gs )--especially the part that discusses what sort of political structures arise when wealth is generated mostly independent of human production (e.g. are we sitting on a gold mine?).
Humans don't live alone in the woods--not now, not 5,000 years ago (nor 45,000 years before that). They band together to modify, control, and tame their environment.
Now, you might miss your devices, pastimes, and widespread sanitation...however, from my understanding, humans don't typically worry about malevolent grues.
https://en.wikipedia.org/wiki/Anatomically_modern_human#Mode...
No syntax highlighting, but it was quite useful. Off the top of my head, the two main benefits are: 1) You free up your computer for the review 2) You get a different form factor to interact with.
Regarding the first benefit, having a printout means you can use your computer to run the application, look up docs, and even (ironically) navigate the code in your IDE.
As for the second, having a printout means you can spread out the pages to compare different bits of code, draw diagrams, connect arrows, circle bits of code for notes, etc.
It was pretty useful.