god, how i love this article. i understand the criticisms; i see forbiddenvoid discussing that people want to get paid and be able to live comfortably. -[i recall luu writing an essay about how to get better at things quickly (im probably quite poorly and incorrectly paraphrasing him here).]- (edit: shit, after a quick search of danluu.com, i believe i may have fabricated that entirely) i believe they are approaching the discussion at cross-purposes.
this is not about being comfortable paying your bills. this is not saying not to learn quickly or that you should avoid shortcuts. it's about mastery... it's about understanding the craft, weighing the tradeoffs that come with each decision, and repeating that process week-in and week-out for years... decades... a lifetime.
i did learn to program from one of those "for dummies" books. that was (checks calendar) 25 years ago. it didn't teach me everything. i still don't fucking know everything!!! and that's fine. i wake up eager to learn. i enjoy code reviews, and learning from my peers. as norvig mentions: i enjoy being the best programmer on the team, i enjoy being the worst programmer on the team; hell, i enjoy being in-between.
if this post is about anything, it is about the joy of learning, and how deep and long that arc can be. it never ends. maybe when i go senile.
That's somehow the time it's been taking me and I had the basics of coding.
Coding can be learnt more or less fast.
Programming takes much more time as it's a whole field of knowledge to acquire so that one can produce great, maintanable and effective code.
So much so that it is still a field in progress (hence new programming languages popping every other year)
Designing and building a 500 piece Lego set would take you years. You could create one quickly, but then refine it over the years - or it could be beyond you and you need to build up to it.
This is one of the articles I recommend to new engineers along with Greg Wilson's "What we actually know about software engineering and why we believe it's true."
Much like his AI textbook, this post was well written.
I’m curious if Rust would fall under any of the categories for languages to learn. I already know Lisp, so that knocks out two categories at once. Perhaps Rust fits his parallelism category nicely.
I took a week of vacation to work through Programming Rust uninterrupted. I have no immediate professional use for it, but it’s pretty clearly going to be important, and it has at least one new (to me) paradigm, so I wanted to fill that gap in knowledge. But I’m under no illusion that I “know Rust” after doing that! I just inched up to a more comfortable place on the learning curve.
BTW, I know there are plenty of people who wouldn’t consider that a vacation, and that’s fine, but they are different from me.
Unfortunately, the learning resources for different domains out there isn’t as highly curated or prolific as, say, rust. If you do web dev like me, it takes a bit more work to find the tools and put them together. But the language itself lends itself well to systems level programming.
> Learn at least a half dozen programming languages. Include one language that emphasizes class abstractions (like Java or C++), one that emphasizes functional abstraction (like Lisp or ML or Haskell), one that supports syntactic abstraction (like Lisp), one that supports declarative specifications (like Prolog or C++ templates), and one that emphasizes parallelism (like Clojure or Go).
The question being what would Rust add to this list or where would it fit here.
An interesting point about C++ in recent years (since 2011 and perhaps earlier) is that it no longer emphasizes class abstractions that much. These days the feel like just another tool in your kit. Also, the declarative specs support has expanded with C++20 concepts.
> Can you elaborate on what exactly happened with C++ since 2011 that it no longer emphasizes class abstractions?
"Modern C++, as defined in the C++11 standard has evolved to become an algorithmic language. This represents as much an idiomatic departure from Object Orientation as C++ was a departure from C’s procedural top-down composition. “C++11 feels like a new language,” says Bjarne Stroustrup [Stroustrup]. The primary focus of modern C++ has become algorithms and generic programming. To this end, the language absorbs a number of idioms from other languages and paradigms, ranging from functional to meta programming concepts. […]" [https://lambdafaktorie.com/modern-c-and-the-lisp-programming...]
Not to be snarky, but there is a clear answer to the question posed at the top of the page: "Why is everyone in such a rush?"
No one likes being poor.
The issue isn't about how long it takes to get good, but how long it takes to extract economic value from the exercise. How good to I have to be in order to make more money doing this than I make right now?
If it takes 10 years to get that value (it does not), then it might not be worth the effort. But I don't think expertise is binary, and the whole 10 years/10,000 hours thing can make people feel like the effort isn't worth it.
There is value to be gained during the 10 (or 50) years you spend honing this craft. And 21 days can create value, if not necessarily expertise.
I suppose there is some truth in that. But 8 year old me hardly knew the value of a dollar except how much sugar could be had in exchange. But that didn't stop me from spending every waking hour trying to get my Vic-20 to auto-generate dungeon mazes. From running to the shop on the 1st of every month to pick up the latest programming magazines, then running back home to copy the arcane characters one by one into that Vic-20 in the hopes that the mysterious incantation would run. I count myself lucky to have learned to program before "growing up". An especially before the internet.
Sorry if I never really got to the point. Just wanted to say that I was in a rush - but of a different sort back then.
Because of Google's hiring filters (which I suspect Norvig knew something about), which tested for "Are you fresh out of whatever undergrads were being told at Stanford?" rather than the skills and experience development that Norvig talks about here.
I’m very pro this 10 year timeline, but totally agree that most people are in a rush because they need the money.
Psychology, I had waayyy more time with and appreciation of the fundamentals after establishing myself in a well paying grad role. “Alright, so I’m definitely not going to be poor — in fact I’ll be comfortable — now let’s focus on slowburn mastery.
I tought myself programming in over 20 years and still haven't finished.
However, I think that learning a particular programming language is not a tremendous task. And I don't mean only syntax but the general ideeas and concepts flowing around that language.
I see many language as families. After I learnt Pascal it was easy to learn C. Then C++ (sort of, because no mortal being can claim mastership of C++). Then C#. Then Python and Go.
F# was a bit different thing, but once in my pocket, I am not afraid of Haskell or ML(not that I do wish to learn them).
Apart from syntax, which is easy, libraries and frameworks, you have to learn different ways to do things, but those might apply to families.
So things like interfaces, over abstracting, GoF patterns, Uncle Bob teachings, clean coding, DDD design, SOLID and other stuff which mostly mean bad design and bad coding but you need to master if you want to land a job, once learnt for Java, it will apply for most languages from the family like C++, C# and even Python.
> As Auguste Gusteau (the fictional chef in Ratatouille) puts it, "anyone can cook, but only the fearless can be great."
Is this referencing the movie Ratatouille? I was curious because the movie was released a lot later than this article. I figure it must have been a novel but can't find it, or maybe the article was edited since 1998?
The article copyright notice is at the bottom showing 2001-2014. Or perhaps Norvig accidentally confirmed he followed the advice of the Abstruse Goose comic for learning to program in 21 days.
It is kind of frustrating how pervasive the "programming can be learned in an afternoon" mindset is, in spite of all the evidence to the contrary. Pardon me for being insulted by the insinuation that something that took me 40 years to become as proficient as I am with it can be mastered by everybody else in a few months.
I mean... chess can be learned in an afternoon, too. A few minutes of memorizing the standard movements of each piece followed by maybe a half hour of learning the exceptions (castling, en passant, etc.) and you've "learned how to play chess". A handful of games later and you start to get a feel for the relative importance of the pieces.
I wouldn't argue that anyone expects to be competitive with a grandmaster at that point, though.
> Pardon me for being insulted by the insinuation that something that took me 40 years to become as proficient as I am with it can be mastered by everybody else in a few months.
I don't think anyone who claims that "programming can be learned in an afternoon" understands that to mean "programming can be mastered in an afternoon". Mastery comes, in large part, from experience, and there is no shortcut to experience.
Eh, my experience suggests otherwise. I've taught Python to high schoolers and adults in an afternoon. Were they doing anything terribly interesting? Not really, but they were making their own programs. They still had a lot to learn, mind you, but they did learn to program.
Do you think they would've been able to independently solve a problem/design a program after just one session? Genuinely curious. I've had limited experience teaching people to program, but my experience has been that people teach themselves to program and you can only really be a resource for them. You can teach syntax easily but design and problem solving seem impossible to transfer; you can make the process easier but they have to teach it to themselves.
Addendum: I'm currently volunteering with a project teaching middle school children to program, and I am impressed by how much they're able to accomplish after a single lesson. I'm not sure they're independently designing programs or solving problems, but they're definitely independently exploring the space adjacent to the example programs by experimenting, and they're making sense of the results and learning. It helps that this is a graphical/block environment where they're able to discover syntax and keywords on their own, and ingest the program output as cool patterns/behaviors.
Have to stipulate definitions about what "learn" means. It's neither binary nor mastery. I would say syntax counts if you can do things that didn't happen on their own beforehand without copy & pasting.
Why should you be offended that learning materials are improving, toolchains are getting easier, and net access is available to all now?
It's like complaining that automatics exist. You can still drive manual! You have that on people! But fundamentally it is a simpler field than it was then, due to the gigabytes of abstraction for every little thing you can do with a computer now.
That points toward an attribution error or a fundamental insecurity.
I'm also reminded of the title of Dorai Sitaram's book, Teach Yourself Scheme in Fixnum Days. It's a pretty good introduction to Scheme, but the implication is that the concepts people work with in Scheme are very deep, and the skill ceiling is accordingly absurdly high.
First you learn to write code. Then you learn to debug it. Then you learn to read other peoples code. Then you learn to debug their code. Then you learn to improve their code. Then you’re a programmer.
Then you learn about software engineering, how to structure programs into patterns that are scalable and maintainable, and refactor legacy code. Then you're a software engineer.
Eventually, you get promoted and start designing systems only on whiteboards. Then, you're an architect.
Or, if you get tired of any of the above, then you're a manager instead of an IC.
Sorry but these sorts of articles come of as extremely elitist. Why does it matter if someone is in a rush or not? Why does it matter if someone thinks is/isn't fun or is/isn't passionate or doesn't want to learn more languages? Why does it matter if someone is satisfied with learning just 5% of the language? I have total respect for anyone spending a weekend learning python code to solve a problem and then doing nothing after that.
If you're getting paid to write code and produce something of value, then the ultimate proof is in the pudding. If your code does what you want, if your team is happy, if your QA is happy, if your customers are happy, then you've succeeded.
> Why does it matter if someone is in a rush or not? Why does it matter if someone thinks is/isn't fun or is/isn't passionate or doesn't want to learn more languages? Why does it matter if someone is satisfied with learning just 5% of the language? I have total respect for anyone spending a weekend learning python code to solve a problem and then doing nothing after that.
Because it matters. The quality of your work depends on it. Having respect for someone coding on a weekend is one thing. Believing that it doesn’t matter if you occasionally dabble in programming or on a level of Norvig is another.
That my employer continues to pay me is proof that my work is of sufficient quality. Perhaps if I were more passionate, the quality of my work would improve and I would get paid more. But if I'm happy with my salary, none of this matters.
I'd agree with that it takes 10 years to become competent in all the required fundamentals for programming like math, algorithms, protocols, security, versioning, databases / persistence, scheduling, memory management, some basic electronics. Not gimmicks like C++, those take infinite years.
In the right environment (not just university), I'm pretty sure those can be learned in as little as four years. That is, I think you could take someone from zero to somewhere above junior IC in that time.
In the first couple of years they'd need a lot of independent projects with mentorship to start, then get plugged into an actual team with good peers and pairing.
They only need the basics of data structures and algorithms. They might see dynamic programming and AVL trees, but that needs less focus than the practicals of HTTP, MySQL, image processing, version control, hardware, etc.
It would be possible if there were lots of competent universities but, clearly, given the lack of quality of current software and hardware full of digital crap (https://news.ycombinator.com/item?id=33390906#33394351), this is not the case.
Clicking through the usernames on the oldest threads, basically no one there then still posts on HN, most seemed to have dropped off around 2014 or before.
I wonder what they're up to? Just lurking and not posting? Gave up on "the lifestyle"? Burnout? Forgot their password and created a new account?
Definitely some are lurking out of sheer addictive habit. But there's fewer reasons to leave comments because a) the community grew and there's already someone who articulated your point, so no sense in repeating it and b) the hivemind has moved in a different direction and it's more challenging to have reasonable discourse here without it feeling like you're "debating" 14-year-olds on Reddit.
...the hivemind has moved in a different direction...
This is definitely a big one.
The focus did use to be a lot more specific to startups with all the good and the bad that came with it. Things like a less negative view of "dark patterns" and more marketing related topics were definitely a part of a community back then.
Questions like "Should I be tracking as much data about my users as possible" would have been answered with "Yes, absolutely, the more data the better." much more often than you would ever see nowadays.
Agreed, but most of my own reluctance to engage comes not from the generally low intellectual level of the commentary but from the pervasive character assassination that accompanies it.
Some of this is a result of importing the culture-war mentality that destroyed Twitter, but some of it is not; see how often the word "disingenuous" gets posted, generally as an assertion that the parent commenter must be a liar because they couldn't possibly be so stupid as to believe what they wrote. That's pure native HN viciousness, not a Twitter import.
There is evidence that a large fraction of Hacker News readers are early in their programming journey. Presumably people migrate elsewhere as they mature? I don't know of another forum like Hacker News, so where are they going?
To understand the level of programming skill on Hacker News, consider that less than 5% of Hacker News readers succeed in adjusting a loop iteration variable to avoid unsigned overflow (despite repeatedly attempting to do so):
This is an empirical observation and not an attack (please don't flag/downvote this comment). It tells us something about the population of users on the forum, and where they are on the developmental timeline as programmers.
It seems like more senior programmers move on, maybe.
This rings true for me. The value of HN early in my career was exposing me to a firehose of industry content while I tried to figure out my place.
As I get further into my career, the signal to noise ratio is shifting quite a bit. I’ve seen many iterations of what’s being posted already, most of the comments aren’t novel, etc.
At this point HN is a habit. And a hard one to break.
Well, it tells us about the Go programmers on the forum. One possibility is that as Go has become more mainstream, Go programmers have become less competent on average.
EDIT: the version I pasted below is not what I originally typed into the site. I made several errors while copy/pasting and modifying the code to run locally without a channel.
It told me I have an error ("what happens at zero") when i do:
func below(n uint64, to chan uint64) {
for n; n > 0; n-- {
to <- n-1
n--
}
close(to)
}
but running that function with several test inputs produces what I expected. Note, I removed the channel (replaced with println) as that doesn't add anything to the problem.
Note: I've been programming (including C and C++) for 3+ decades. I make mistakes all the time, but.... what exactly are you looking for here if my solution is not ruight?
EDIT: the pasted code is also incorrect, because I didn't complete converting the for loop into a while.
When your code is wrong, the server gives you a clue hinting at what's wrong in the original code.
It doesn't know what's wrong in the code you submitted... it is not understanding deeply what's wrong with your code. It's not some huge multi-terabyte language model analyzing arbitrary code, or whatever.
It just knows your code is wrong and gives you a clue so you can try again.
I also came to a solution very similar to the sibling comment here. I'd love to see why this doesn't work server-side but does work on my machine. What other tests are you running aside from checking each decrement is correct?
Might I recommend appropriate debugging output? It would save the mystery and back and forth. Not everyone who uses your site has access to you on HN. :)
func below(n uint64, to chan uint64) {
for ; n >= 0; n-- {
var t = n - 1
to <- n
}
close(to)
}
I've run this locally with to <- n replaced with a print statement and it works with unsigned integers.
(my real comment after I get some clarification from the bugfix site author is that I never, ever modify a variable in the initialization condition of a for loop, and i see that in the wild, I elide it.
> Presumably people migrate elsewhere as they mature? I don't know of another forum like Hacker News, so where are they going?
As someone who has been reading and posting here regularly since 2009, here's what I'm finding: The further I get in my pursuits, the more my concerns and tribulations become specialized and weird. To get a useful answer from the public internet would require so much backstory and explanation that it's barely worth trying. And the answer would likely be wrong or not useful.
Instead real world social networks and specialized micro communities are where it's at. A lot of paid consultations as well. Pay a few hundred (or thousand) bucks to an expert and get the correct customized answer to a specific problem. Worth every penny compared to reading tea leaves off the wild internet.
But HN is still one of the highest signal broad communities out there so it's fun to stick around.
Does your bugfix problem actually test said code? Or does it just look for a specific change to be made, because I'm reasonably certain I input multiple correct solutions and they were all marked as having not solved the problem.
1. No comparison to base rate. 5% shouldn’t make us believe they’re early in their journey. You haven’t given any observations about experience and the rate of error fixing.
2. Ignored sample bias. <5% of the users who submit to your site that you can track to HN solve the problem. That is very different from “<5% of HN readers”.
This seems like unnecessary tone-policing. I said exactly what I think is incorrect in their comment and why, without any judgements about them.
If anything, my downvote comment was too childish. I was put-off by their line about not downvoting because it was “empirical”. Seemed to insinuate anyone who disagreed was just going against the facts.
Edit: oh, didn’t realize I was replying to you again.
It is a bit of a fair point though: you're only measuring "the success of people from HN who engage with your game", so it's not sound to draw conclusions about "the population of all HN users". Even if it is true that HN has a junior-skew, it wouldn't mean there is necessarily "somewhere else" -- lobste.rs aside, the eternal september effect (or other things) could be enough to keep the demographic population skewed junior.
I've been programming for about 15-20 years, and using HN since 2007 or 2008 or so. I opened your site while reading the voxel thread, and was a little baffled about what I was encountering -- "why am I suddenly reading buggy go code? I thought this was an example of a spacial curve!" -- so, I went to check out your other posts to figure out what your deal is, and here we are.
I don't know Go, and I don't really want to "play a programming game" right now. Your code seemed a little obtuse and intimidating -- long bitmasks and combinations of xors and abstract names -- no thanks! There's a bug in there? How surprising!
I do lots of programming at work and in my spare time, and to a degree, I just can't be arsed when someone jumps out of the woodwork with "a bug" that it isn't going to mean anything to fix, so I moved on. I'm an experienced programmer who you likely aren't measuring.
So I saw your comment here, and my first thought was: well, that's a big (logic) bug in the reasoning of a person who made a game of fixing bugs! Kinda tasty irony, and totally fair game for the poster above to call out, in my opinion.
(anyway, after all this, I am a little bit more interested to go try out the above-mentioned challenge. It's a neat idea for a game, and you seem to have put a lot of work into it. Best of luck!)
A bit macabre but some non-zero number are dead. I've frequently wondered if there will be a way to scrub/compile my online activity (within reason) for my family and friends to review after it's all said and done, otherwise I'll just live in a database forever.
One possible explanation is that people often just move on between techie online communities after awhile. I've done it several times.
Or, a lot of HN activity seems to be by people in hustle mode. Maybe a lot of them finally made their fortunes, and are now spending their time with their kids, or windsurfing.
Then there's wasting time while stuck in-office all day. Less a problem with WFH, when you can go do dishes while you're waiting for that build or someone to respond. And WFH means less of a need to kill time at your desk before it's socially acceptable to go home (or get a train/shuttle), even if you put in a solid day and you're at a good stopping point before a busy day tomorrow.
I mean...I've been gainfully employed the entire time but am still here :) I was on HN long before I registered this username - in fact, I only registered this user after I noticed the quality of comments degrading (hence the name).
Maybe I'm different than other earlier people who were drawn here - I'm just interested in tech and never really thought of doing the startup route. I've made a few millions of dollars in total comp in that time, but I do wonder where I would be if I took a step out of my comfortable FANG-type job 15 years ago.
Hoover Institute, Cato Institute, and libertarianism ideas dressed-up in large print, skinny books to drop factoids with advertising interviews on NPR and CNN.
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=27411276 - June 2021 (115 comments)
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=20543495 - July 2019 (87 comments)
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=16574248 - March 2018 (51 comments)
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=9395284 - April 2015 (61 comments)
Teach Yourself Programming in Ten Years (1998) - https://news.ycombinator.com/item?id=5519158 - April 2013 (86 comments)
Teach Yourself Programming in Ten Years by Peter Norvig (2001) - https://news.ycombinator.com/item?id=3439772 - Jan 2012 (29 comments)
Teach Yourself Programming in Ten Years - https://news.ycombinator.com/item?id=191235 - May 2008 (19 comments)
Norvig: Teach Yourself Programming in Ten Years - https://news.ycombinator.com/item?id=43243 - Aug 2007 (7 comments)