Why Teenagers Are Growing Up So Slowly Today  - <AUTHOR> http://blog.newsweek.com/blogs/nurtureshock/archive/2009/11/05/why-teenagers-are-growing-up-so-slowly-today.aspx <comment><USER5> Not only are kids expected to stay in school until their early/mid 20's, depriving them of necessary real-world developmental experience as discussed in the article, they are expected to accept decades' worth of debt to pay for it. The American education model is poison.

<comment><USER6> I believe it's the worlds greatest deception. At 16 I was working as a reviewer, I worked as an assistant (note: not apprentice) electrician for a couple of years doing identical work to my father who was certified (on several jobs he did solely the testing to pass the work as legal) and right now I'm working in windows and siding. I presently earn more than any of my friends, and job prospects still land me at the head of my group of friends in 10/20 years, only my wife is likely to be earning more than me. I've done virtually everything involved in building a house save for foundation work, and was taught this all by my father. Nothing I did in school prepared me for any of this. Outside of manual labour, I'm a writer, I repair and upgrade friends and acquaintances for cash on the side . . . all of which I did not learn from school.

Nothing in my life has really come from school. I'm only indebted to three teachers, my English teacher who encouraged me into writing, my science teacher who taught me to watch and question everything and my woodwork teacher who encouraged me to hit nails into things all class. For 11 years of education, little in retrospective appears to have been useful. My greatest lessons were of casual knowledge, not of information or education by any institutional standard. Persistence and intrigue.

<comment><USER7> > I repair and upgrade friends and acquaintances for cash on the side

You're an unlicensed doctor too!

<comment><USER6> Well there's a lot of cuts and scrapes in my work and First Aid training was required, unlicensed doctor was just a natural progression . . . lol no, there was supposed to be a 'computers for' in there, but a lack of proofreading bit me in the ass.

Ironically, my mother was a nurse and I just picked up on how to patch minor injuries up. Nothing sutures better than sterilized royal blue thread in a hurry.

</comment></comment></comment></comment><comment><USER8> With more context and eloquence, John Taylor Gatto has been saying this for years: adolescence is artificial, and dangerously so. See his sketch of the future Admiral Farragut, who took his first command at age 12:

<http://johntaylorgatto.com/chapters/1q.htm>

...and of course, Ben Franklin:

<http://johntaylorgatto.com/chapters/1r.htm>

<comment><USER9> Another big point JTG makes is that the current crop of wealthy producers have no need for 80% of the smart people out there who might get an education. So why not keep them in school and hence not in competition with the established producers, for as long as possible?

<comment><USER10> I've heard that unions were big proponents of universal compulsory education when it was being introduced. Some say it was for the very same reason.

</comment></comment></comment><comment><USER11> I feel this article is worth pointing out as a reminder: Almost all concepts of school reform still takes as a given that you will have basically the same foundation of a school.

Sometimes it's worth stepping back and asking, "Does it actually make sense to put all children below a certain age in a big building for the majority of the day, where they spend all their time with other children of the same age, taking classes from teachers who serve as their only consistent contact with the adult world outside their own home?" Very few concepts of "education reform" are radical enough to ask that question.

Maybe it would be better if children spent more of their time in the company of adults in the real world, rather than in the company of each other in a kind of greenhouse-for-children artificially designed to raise them in a certain way.

Or maybe not; maybe after taking a step back and thinking big thoughts, we take a step right forward again and decide that schools as currently understood are what we're sticking with and any problems just mean we need better schools. But it's best to make that decision on the basis of a rational plan, rather than saying that Kids Belong In Schools because that's what the conventional wisdom was last year and we can't think of anything else.

<comment><USER12> _Does it actually make sense to put all children below a certain age in a big building for the majority of the day, where they spend all their time with other children of the same age, taking classes from teachers who serve as their only consistent contact with the adult world outside their own home?"_

Yes, because like it or not, our current set up sees a large secondary function for school: babysitter.

The larger problem when dealing with what to do about school is addressing this issue.

<comment><USER13> The other problem problem is that the current system has a lot of people and organizations invested in keeping the system running as is or adding more days to the system to add to income. Children aren't the issue, paychecks are the issue.

<comment><USER14> The other problem is that dumping millions of teenagers into the workforce would decrease wages for older people.

<comment><USER15> This is only a problem if one assumes labor and wages are a zero-sum game, which I think most people on HN would disagree with.

<comment><USER10> exactly. any new worker will add to both demand and supply or save his money for someone else to borrow and add to demand.

</comment></comment></comment></comment></comment></comment><comment><USER16> One of PGs essays discusses similar ideas (<http://www.paulgraham.com/nerds.html>). I agree that segregating teenagers may actually be harming their development instead of aiding it.

The problem is specialisation and aptitude. First part of the problem: Underlying most modern education is the idea that each individual is suited to a different profession, and that both the individual and society benefit when people are allowed to pursue that specific profession.

Second part of the problem: there are more specialisations, professions, then ever before. How many basic professions can you think of? Farmer, sailor, doctor, ... There are hundreds or thousands. And every one has hundreds or thousands of specialisations. In some professions these change on a yearly basis.

Thus education becomes a search problem, and like all search problems the key is scaling: how do you find the ideal speciality for each of the millions of students? Modern education takes an iterative approach, where students learn the absolute basics of everything, then learn a little more of a slightly narrower subset. The early iterations (i.e. school) are long and concentrate on building up foundations for later choices. The later iterations (i.e. early jobs) are shorter and concentrate on quickly narrowing down huge numbers of possible specialisations.

Reality (young brain needs real world) vs. Idealism (direct each person to an ideal profession). The trick is how to compress the spectrum - <USER2> reality into a system built on an ideal.

<comment><USER17> "The trick is how to compress the spectrum - incorporate reality into a system built on an ideal."

It's actually much, much simpler than that. Schools simply don't give a damn about teaching students about anything- their primary purpose is just to keep the kids in one place all day long. So give the sufficiently motivated/intelligent kids, who have proven that they don't need to be kept in one place all day long, an opt-out option.

<comment><USER16> I've seen that opinion here a lot, that school is a glorified babysitting service. Maybe that's true in your experience, but that is a shortcoming of those schools in particular, not of schools in general.

I loathe special cases. As a programmer I see them as a sign that program design is flawed. A good program, and a good education system, has mechanisms in place to handle extreme cases.

Opt-out is fine for students who have a specific alternative (e.g. trade apprenticeship). But it is not a "solution". It does not help the 99% of brillient students for whom there is no alternative. Simply cutting them loose is a cop out.

<comment><USER13> I am a programmer by training, but my first job out of school was an administrator-type under a government grant in one of the ugly parts of government (Health and Human Services). Sadly, there is a huge difference between established bureaucracy and code. People aren't widgets, we are all special cases, we all learn differently, and we all have different things that inspire us. If you think schools actually serve the "smart" student well, then you are not looking at real funding priorities or went to a special case school yourself.

ND has full driver's licenses at 14. An old teacher of mine says it will probably go to 16 since students aren't as mature as they used to be. WTF? That shouldn't be. Teens are running half-million dollar combines at that age. What changed?

</comment></comment></comment></comment><comment><USER18> I'd be interested to see a study of people, like my folks, who were in their teens in the 60's and 70's. Up north where my family is from, you generally left school at 16, got an apprenticeship with a company like Caterpillar, or hit the coal mines or shipyards. There was no coddling, no indeterminate hiatus from responsibility, and it seems to have produced a generally successful group of people who rank amongst the top contributors to a variety of industries the world over, some of the largest and most successful companies ever brought to light having come from people within this generation. Something else I find interesting, and something I see in my own age group (30-40), is that a lot of the South Africans who were forced to undergo conscription into the armed forces seem to have a deeper level of self-discipline, which you'd expect from a military experience of the kind that they were subjected to. I'm not saying that you require a drill instructor to develop self-discipline, but it did have the advantage of forcing you to take responsibility for your assigned tasks, even if only to avoid a run and indeterminate PT to sooth the ruffled feathers of your shouty DI.

</comment><comment><USER19> What my son has wanted for as long as he has been a teenager is a chance to have grown-up responsibility. That's why he loves working on his start-up project. An actual profit-making business proposal gets evaluated by investors with no "grading on the curve" or concern for "self-esteem." He can deal with that. He found school environments that attempted to coddle teenagers (he wasn't in many such environments, but encountered them in passing) very off- putting.

<comment><USER20> I realize this is a site dedicated to startups, but business proposals and investors for children? As long as he likes it I suppose and doesn't rationalize happiness = money.

<comment><USER19> He has been quite motivated in his learning as considers the problem of how to use his teen years to get ready for running a business in his (soon) adulthood. That's been good for my younger children to see his thought process in making the teen years count for adult independent life. The essay pg wrote about this

<http://paulgraham.com/hs.html>

has been helpful in our family's thinking about this issue. Perhaps endure school-like experiences, but look for the most adult-like learning experiences possible.

<comment><USER20> I understand your rationale and sounds like everything is going swimmingly. In my eyes some things aren't meant to be 'optimized' or taken so seriously, like when you are teenager. Or maybe I'm just playing Devil's advocate.

<comment><USER19> Why not take something seriously if it is meaningful to you? I don't take (for example) the high school prom at all seriously, rather when I was in high school I look learning foreign languages seriously. Isn't freedom all about letting people decide for themselves what to value?

</comment></comment></comment></comment></comment><comment><USER21> It's an uphill battle even if you want to do something productive instead of drinking and doing drugs. I started my own company when I was 16... and my higher education (which was supposedly training me for _the job I was already doing_ ) did nothing but try and keep me from actually getting real world experience by using real work for my education, or god forbid, intern at my own company.

Not to speak of the artificial group assignments. That model just doesn't work. Period. It's the lowest common denominator that controls the quality, or it's the lone nerd that spends his entire weekend redoing his teammates sub- par work. Ugh.

Unfortunately, nothing learned at that university will be of use to me in the real world, save how to handle bureaucrats.

<comment><USER22> Come on dude, handling bureaucrats is one of the most important principles one can learn anywhere in the world. (I think this remains true for only this generation).

<comment><USER21> Absolutely! But I'm not sure if it was worth the 4 years of tuition ;)

</comment></comment></comment><comment><USER23> In the Napoleonic wars, 20 year old Generals commanded armies. Today, Napoleon's military tactics are taught at West Point and other noted military academies. Life expectancy was mid-thirties to forty-ish if my memory serves me correctly. Necessity drives people to do whatever is required to achieve a goal if the need is pressing enough.

The notion that young adults aren't able to cope with "real life" (what an oxymoron that is) is utter rubbish. Try giving them real responsibility (within reason) is the cure.

<comment><USER24> Ah, the good old times.

</comment></comment><comment><USER25> I do think that some more real-world and unstructured experience added into standard schooling would do some good, but I sometimes think there's an odd anti-schooling bias on HN, maybe because we all hated high school.

Another common theme on HN is how the lack of basic science knowledge amongst the voting population negatively impacts funding of and perception of science policy. Is advocating that we abolish general schooling and have everyone just learn what they need for their jobs a good idea? How does that fix that problem? Doesn't it just make it worse?

Tweak the schooling model, yes, but I've not been convinced yet that any of the radically different alternatives I see proposed here would still accomplish some of the important things that general schooling DOES do. Everyone hates certain subjects, but that doesn't mean you shouldn't be forced to learn them at least once in your life.

</comment><comment><USER26> One thing I noticed when I went on the employment market for the first time was that I had never had a relationship with an adult other than family or teachers close enough to discuss jobs/money. American middle class children are hermetically sealed in a child's world, with the adult world a bit outside the bubble filled with sexual predators who you can't talk to. That's another flavor of crazy.

</comment><comment><USER27> (disclaimer: this is just my theory...)

Coming from an Asian perspective, I can see why the concept of schooling has become so heavily mainstream.

Surely enough, people in the old days didn't get as much "schooling" and entered the adult world with real responsibilities and work earlier in life. For this reason, the jobs they held would typically have been labour-based jobs.

In such societies, though labourers received a decent life, it was the doctors/lawyers/professors that held the highest respect socially. The reason for this is that when things got tough outside the norms of what the common people could control (health, injury, legal issues, politics, etc), people from such educated professions were the ones that were looked up to.

It's due to the commanded respect of such learned professions that more and more parents wanted their children to receive further education. Even to this day, I hear a lot of my aunties and uncles talk in awe of children who grow up to become doctors. They really were the celebreties in my parent's culture.

Times have changed. Rather than being a place to go to learn, highschool has turned into a mindless competition to get "ranked" on how well you can retain (mostly) useless information that would have little to do with what your target professsion will actually require.

</comment><comment><USER28> I picked up a bunch of stuff from school that would perhaps have never fully developed if I hadn't gone there, or if I'd had my own choice of exactly what to do. I would never have chosen to take a history class, and yet in that class I learned critical thinking skills in a way that I would have had no direct cause to do outside of that environment. I gained a basic grounding in science. I learned enough about a variety of different subjects that I was able to make an informed choice on a career path.

I certainly believe that the school system needs changing, particularly as self-learning becomes easier, and I agree that kids need more responsibility (I recall aching for it in my teenage years), but the number of comments here suggesting that school is of no use whatsoever surprises me.

</comment><comment><USER29> "Never let school interfere with your education"

<comment><USER19> Agreed. See

<http://news.ycombinator.com/item?id=1281341>

on efforts to trace the quotation.

</comment></comment><comment><USER30> _"I never let public schooling interfere with my education."_ \- Mark Twain

\-----

At 12 years old my sister and I were "off the dole" as my parents put it. No more allowance, which had topped out at $2.75/wk. If we wanted money, we were expected to use our heads. We ended up mowing lawns, gardening and shoveling after having my mom introduce us to the neighborhood.

At 14 I wanted a computer to mess around with. That's fine, but the family computer wasn't for that. I went with some juniors and seniors in the computer club to dumpster dive behind businesses, or sometimes to the dump itself. Ended up with a working stack of 386s to put FreeBSD and Linux on.

I had a part-time job at 15 to save for a car, because at 16 we were told we were going to be on foot. At 16 I used to take on contract work that one of my teachers had to pass up, doing web-development. Mostly PHP, ColdFusion and some Classic ASP. Two of those sites, 12 years later, are still running just fine on the custom CMS built for their needs.

I had partial scholarships to top tech schools, but the debt load of going to CMU or WPI was still approaching that of a home mortgage where I grew up. I had saved enough money to go to state school and pay cash. Yet when I got there, I was completely underwhelmed. Bored out of my mind. There was very little I would learn until my 3rd or 4th years, they didn't end up applying AP course credit to get me out of 10x courses, and the social environment was akin to drunken day care (and I didn't need to be on campus to make new friends or go on dates). After 3 semesters I ended up in the Vice Chancellor's office with my parents having a very long, very candid discussion about the pros and cons of me sticking it out. They're weren't paying for it, but they were livid at the idea of me dropping out. Long story short, no one could punch a hole in my argument and I even managed to get a partial refund for the 3rd semester. I had until the end of the week to pack up and move out.

I'll go back eventually for a proper engineering degree when I'm bored building trading systems for investment firms.

Point is, nothing like being stuck with a dilemma (no more allowance, so unless you want a video game, we expect you to find a way to make money) and being forced to work out a solution at the ripe old age of 12. I learned more about how to further myself in my free time than I ever did through some state-mandated curriculum.

Would I recommend this exact approach to everyone? Absolutely not. Yet there's always a playing field everyone can succeed on, and there's an immense amount of value in kids finding that out for themselves with a bit of guidance.

<comment><USER19> _"I never let public schooling interfere with my education." - Mark Twain_

Of all persons to whom pithy lines are attributed, Mark Twain is by far the most likely to NOT be the genuine attribution.

[http://www.amazon.com/Quote-Sleuth-Manual-Tracer- Quotations/...](http://www.amazon.com/Quote-Sleuth-Manual-Tracer- Quotations/dp/0252016955)

I have never been able to verify that Twain wrote the usually quoted form of that line, "I have never let my schooling interfere with my education." (There are a lot of scholars who study such things.) I have seen one attribution of that line to Canadian humorist Stephen Leacock,

<http://en.wikipedia.org/wiki/Stephen_Leacock>

which to me is a much more believable attribution, but one I am also unable to verify.

Mark Twain did have some great lines about schools, of which my favorite is

"In the first place God made idiots. This was for practice. Then He made School Boards."

\-- Mark Twain, Following the Equator (1903) 2:295

/pedantry

</comment></comment><comment><USER31> Additionally, this seems to explain why some people are getting married and having children later. It's a combination of a lack of life experiences and financial unreadiness from school.

</comment><comment><USER32> Don't forget there are some positions that require a fair amount of training. I guess if those in school because they're forced go away, it would leave a better environment for those picking up the background for advanced studies.

And I see criticisms of the American model of college. Yeah, it pushes a lot of debt on the students but I thought the European model resulted in more years spent in college. There's ways to secure funding for school (such as taking the King's Shilling), and there's no real reason to try for Harvard vs. less-expensive schools, etc.

<comment><USER33> training, not learning. did you read the first paragraph? care to give examples of positions that require learning that isn't actual hands-on training?

<comment><USER32> Folks with advanced degrees in things like math, physics, physical chemistry, ... Many types of doctors (ie non surgeons), possibly lawyers as people have said that their schooling trains the mind rather than provides "courtroom practice". One can argue that advanced degrees in organic chemistry or biology is "hands on training", but those doing research in reaction mechanisms would probably beg to differ.

</comment></comment></comment><comment><USER34> A few months ago I read Po Bronson and Ashley Merryman's excellent book _Nurtureshock_ :

<http://www.nurtureshock.com/>

If you have or are responsible for children, I _highly_ recommend it as an excellent overview of current research into cognitive development.

</comment><comment><USER35> I tend to see this type of article and the associated discontent with a protracted adolescence quite a bit on ycombinator, and I can't understand it as of yet. Is their really that much research suggesting that an extended education and a delayed maturation really is detrimental? Or is it more of a shared experiential resentment? Or is it just a resentment at the lack of flexibility and accommodation in our current system, a system that assumes that one size fits all?

In some ways, I wouldn't have minded earlier exposure to questions that forced me to discover my innate passions as opposed to continuing to be fed prerequisite course after prerequisite course. However, I can't say that this is equivalent to wishing that I had started my adulthood at age 15 (or earlier). Modern society is more complex, as are the roles that adults assume in modern society, and I presume that a protracted adolescence serves to give maturing adults longer to find their place in this increasingly complex society.

Is the resentment founded in the fact that we force everyone to extend their adolescence for so long? Or that such a period provides no usefulness whatsoever?

<comment><USER33> so you argue that it's okay to FORCE kids through school?

i wouldn't have been ready for the world at age 15, but maybe at age 19-20. now i'm 23 and i'm getting sick and tired of university. they don't even try to relate the stuff they teach to any real-world applications.

i realize that i've been depressed for a while now. it's affecting me physically now. i can't handle expectations these days. i avoid even thinking of studying for exams, which might be the _third_ response of the fight-or- flight response. i can't manage my time. i'm always 20 minutes late to anything, even dates i set myself and that affect nobody else, even if i "account for" that usual delay, unless it's a one-time event and i'm making a real mental effort.

kids want choice, because they're not given any. expectations are the opposite of choice. i can't blame kids for turning out fucked up like they are.

<comment><USER35> I actually have experienced the same depression and listlessness you described, and I imagine a lot of it could be tied to the constant lack of choice and excessive amount of expectations that our current, mill-like educational system forces students through. I definitely agree with you that our system, one that burns so many kids out about caring about anything, needs an antidote. But, along the lines that you said, I don't think that the antidote is necessarily forcing kids to take on full adult responsibilities at age 15. I guess I can see a real-life-buffered educational system that allows for more responsibility and choices without going so far as asking kids to start working full time and living on their own at age 15.

</comment></comment></comment><comment><USER36> Oddly enough, Newt Gingrich agrees:

[http://www.businessweek.com/print/magazine/content/08_45/b41...](http://www.businessweek.com/print/magazine/content/08_45/b4107085289974.htm)

<comment><USER37> Why is that odd?

<comment><USER36> You're right that it's not _that_ odd. I was pandering a little to readers who might otherwise be open to Po Bronson and alternative child-rearing theories, but have biases against Gingrich based on a partisan caricature of him.

But, Gingrich is a former college professor and sometimes-member of a political establishment which usually emphasizes more high-school-graduations, and more people going to college. So it is a little odd (and brave) for Gingrich to advocate a change in thinking that, practically, could mean fewer traditional K-12 high school diplomas granted, and lower traditional college enrollment.

He's breaking a political taboo, the simpleminded idea that more years-of- schooling is always better. That's a little odd for someone who might have presidential ambitions.

<comment><USER38> One thing I've noted is that a rare number of politicians, like Gingrich and Al Gore, have the ability to see above and beyond the short term political context and the courage to act on what they see. Both of them have an uncommon amount of wisdom and intellect and an inclination to break from conventional thinking.

</comment></comment></comment></comment><comment><USER39> Interesting... however I would really like to know how could anyone convince the teenage me that moving to yet another step of school doesn't really matter - that I should think about actually starting to do some serious freelance work in microcontrollers / electronics instead, which is what I liked to do. In the end, it didn't matter that much what I did during the studies - <USER3> good enough to pass, or even putting uni off for a couple of years could be probably more beneficial to me long-term.

But would I believe anyone saying that? Now I wish I tried... But at the same time I'm thinking about what I could tell my future kids, so that they join studies only if they really, really _like_ learning in the academic way - <USER4> because "everyone does that".

<comment><USER40> Good points, but remember it isn't an either or. I had several friends in high school who worked in addition to class. And yes, most of those were "McJobs" but for at least one young lady I know that "McJob" brought in a nontrivial portion of the income for her entire household. And another ran his own business. Granted it was just a lawn maintenance business, but it was his and helped him start saving.

In college it is even easier to do both because there is more freedom. I worked full time in tech support while I was getting my undergrad. Now I am going for my masters part time while working full time.

<comment><USER41> Despite the derisive use of the term in this piece, there's nothing wrong with experiencing a "McJob". Two good things that could come from it are: you learn that this is NOT where you want to work for the rest of your life (or even another month) or you follow the path to franchise ownership that is available in most such jobs.

Even if you don't go all the way with it, a hard working entry-level employee at a "McJob" can quickly advance in to management and learn quite a bit about how business really works. And get paid for it, rather than forking over tuition to learn about "stars", "cash cows", "question marks", and "dogs"

</comment></comment></comment><comment><USER42> More readable print version of article:

[http://blog.newsweek.com/blogs/nurtureshock/archive/2009/11/...](http://blog.newsweek.com/blogs/nurtureshock/archive/2009/11/05/why- teenagers-are-growing-up-so-slowly-today.aspx?print=true)

</comment><comment><USER43> I hate being lumped in with the rest of American culture and society. I'm very glad that my parents didn't lose all sense of worldliness or intelligence when they decided to procreate.

</comment><comment><USER44> i don't agree .. teenagers are growing much much faster then before .... and its all because of technology .. the major thing is Internet

<comment><USER33> so they're growing faster, but they're held back by school with no end in sight, doing inconsequential things?</comment></comment>


11-year-old changed election results on replica Florida website in under 10 mins - <AUTHOR> https://www.pbs.org/newshour/nation/an-11-year-old-changed-election-results-on-a-replica-florida-state-website-in-under-10-minutes <comment><USER2> Ehh this seems rather light on details. Was this simply an "Inspect Element" "hack" and this "replica" I'm going to bet money it wasn't provided by Florida. All of it just doesn't really add up or make much sense. I'm not saying that our election infrastructure isn't riddled with holes but this don't prove anything except that DEFCON wanted a click-baity headline IMHO...

Edit: I just got notified on my phone of a reddit thread for this same article and the consensus [0] there is "Inspect Element" was used. What a stupid article that only detracts from real threats.

[0] [https://www.reddit.com/r/technology/comments/96xszu/an_11yea...](https://www.reddit.com/r/technology/comments/96xszu/an_11yearold_changed_election_results_on_a/)

<comment><USER3> Looks like it was a SQL injection after learning how to do it. The 11 year old did it in 10 minutes. Also the password was stored in plain text on the device. As for the replica bit. This was in the article.

"It would be extremely difficult to replicate these systems since many states utilize unique networks and custom-built databases with new and updated security protocols," it read. "While it is undeniable websites are vulnerable to hackers, election night reporting websites are only used to publish preliminary, unofficial results for the public and the media. The sites are not connected to vote counting equipment and could never change actual election results."'

But Sell said the exercise the children took part in demonstrates the level of security vulnerabilities found in the U.S. election system.

[https://twitter.com/VotingVillageDC/status/10281031708646973...](https://twitter.com/VotingVillageDC/status/1028103170864697345/photo/1)

Here is also a link to the article in case it didn't work for you. [https://www.pbs.org/newshour/nation/an-11-year-old- changed-e...](https://www.pbs.org/newshour/nation/an-11-year-old-changed- election-results-on-a-replica-florida-state-website-in-under-10-minutes)

</comment></comment><comment><USER4> Similar article as from BuzzFeed yesterday: [https://news.ycombinator.com/item?id=17744937](https://news.ycombinator.com/item?id=17744937)</comment>


Ask HN: How do I choose the right resource to learn CS fundamentals? - <AUTHOR> I am trying to learn CS on my own. But there are so many resources available online for every course from many of the top universities.
For example:
For intro courses:
* Computer science an interdisciplinary approach (princeton)
* CS61A - UCB
* Introduction to CS and programming (MIT)
* Stanford
* CMU
Data Structures and Algorithms:
* Princeton Algorithms
* CS61B - UCB
* Stanford Algorithms course
* MIT Algorithms
* CMU
Apart from this you have multiple books on each topic - Data Structures/Algorithms, Discrete Mathematics, Theory of Computation, Operating systems, Networks, and so on.
Apart from these you also have resources like teachyourselfcs, ossu, functionalcs.github.io/curriculum/.
I am attracted by the resources/online/books posted by courses in UCB/Princeton/MIT/Stanford/CMU. At the same time I get boggled down and overwhelmed that I have soooooooooo many materials to cover. Intro courses aren't that big of a deal since I am able to recognize/solve most questions fairly easily in multiple resources. But my next step of Data structures and algorithms is overwhelming that I am unable to start somewhere.
How do you recommend to choose the right resource (online/book) for each topic/course? Is it worth going through multiple university courses/books for the same topic? <comment><USER2> For Algorithms, I know the amount of materials available online can be overwhelming, so here's an alternative: get a copy of "Algorithms, 4th Edition" [1] from Sedgewick and Wayne, and work through it cover to cover, ignoring any other resources.

This book has very little in the way of prerequisites, and it covers a lot of fundamental algorithms and a little bit of Math, but it is a lot more accessible and didactic than, say, the Cormen book. I don't think you need any other resource for studying the book (videos, forums, etc.) other than maybe the website for convenient access to the source code (and maybe some other Java reference, although you don't need deep Java knowledge to understand the code).

Note: I'm plenty biased for this resource... I don't know why, but I find the implementations so elegant an easy to follow, even though the source code is Java, a language I admit sometimes can look anything but elegant (in its production form with all those imports and redundant type signatures :-). Many algorithms are implemented using data structures introduced in previous chapters, so it makes sense to read it cover to cover.

For Computer Architecture, Nand2Tetris [2] is another resource that comes up often and for good reason. I only worked through half of this book but I really like it too and have it on my back burner to complete the second half of it: first part is about implementing a computer from the ground up (nand gates being the "atoms"); second part is about implementing a parser/compiler for a higher level language targeting the same computer.

1: [https://algs4.cs.princeton.edu/](https://algs4.cs.princeton.edu/)

2: [https://www.nand2tetris.org/](https://www.nand2tetris.org/)

<comment><USER3> Second the recommendation to read Algorithms over CLRS; it's significantly nicer in part because it uses actual code with good variable names instead of its own strange psuedocode dialect.

<comment><USER4> I didn't find the pseudocode to be a hurdle in CLRS. In fact, it was pretty useful to see some pseudocode shown in practice. What stung me in the book was how abstract it could get. It was clear that some of the authors wrote in a more approachable way than others when explaining the material.

Its also focused on how to solve problems than Sedgwick. Algorithms explains some elementary algorithms that noone is ever going to code themselves. CLRS teaches you what to look for in algorithms for solving particular problems.

</comment></comment></comment><comment><USER5> You might want to look at Scott Young's MIT Challenge page. He set himself the task of working through "the entire 4-year MIT curriculum for computer science" in 12 months using only online resources. He completed the challenge in 2012 and then wrote a book titled "Ultralearning", which describes methods of learning valuable skills without spending a fortune at an expensive University.

His MIT Challenge page: [https://www.scotthyoung.com/blog/myprojects/mit- challenge-2/](https://www.scotthyoung.com/blog/myprojects/mit-challenge-2/)

His Ultralearning page: [https://www.scotthyoung.com/blog/ultralearning/](https://www.scotthyoung.com/blog/ultralearning/)

<comment><USER6> If you want to learn the material of MIT courses, I would recommend working through the problem sets, not just the exams.

</comment></comment><comment><USER7> > _I am attracted by the resources /online/books posted by courses in > UCB/Princeton/MIT/Stanford/CMU. At the same time I get boggled down and > overwhelmed that I have soooooooooo many materials to cover._

I think you'd be better served by doing a lot of courses from the same institution. If you choose courses that were designed to fit together, you'll have a lot less wasted time from overlapping material or holes from missing material.

> _Is it worth going through multiple university courses /books for the same > topic?_

What is your goal exactly? Is it to evaluate and compare everyone's materials?

If your goal is your own learning, then why wouldn't you take a more advanced course from the same institution instead of repeating a slightly different version of what you've already learned?

<comment><AUTHOR> > I think you'd be better served by doing a lot of courses from the same > institution. If you choose courses that were designed to fit together, > you'll have a lot less wasted time from overlapping material or holes from > missing material.

I agree regarding choosing materials from a singular institution. Thing is, not all the institutions have all the courses and materials online. This in turn results in choosing specific courses from specific institutions which are available online. But the caveat here is that when I intermix the courses from different institutions, I find the prerequisites to be different since different institutions cover same/similar courses in different depths/breadths. For example, Databases in CMU are at a much higher standard than that of Stanford's.

> What is your goal exactly?

Goal is to learn since my undergrad is not in CS. I would not be able to afford a masters for the next 2-3 years so I am trying to use the intermediate time to get myself the undergrad curriculum knowledge I never had. I hope this would help me with enhancing my day to day job and also help me prepare when I apply for my masters/PhD.

</comment></comment><comment><USER8> Check out [https://www.teachyourselfcs.com](https://www.teachyourselfcs.com)

<comment><USER9> +10 for this. I will elaborate further, hoping this gives you a good starting template.

\- Programming: Learn two languages: Python and C

\- Algorithms and Data Structures: Implement each data structure in the two languages above and implement a few algorithms of each type.

\- Computer Architecture: For the referred excellent book, implement all assignments in any one language. Go head and burn the design on an FPGA, get the computer running on real hardware.

\- OS: Having done ECS above, you should be in good shape to write your own OS: there is xv6, Xinu, Minix and many to choose from. Again have your OS running at least in a VM.

\- Computer Networking: Write your own HTTP server in C.

\- Math for CS: I would say focus on learning math essential for games, some linear algebra and leave it there. When you encounter a relevant field; AI or games, you should be in a position to pick up more math if required.

\- Databases: Recently a book has been published on database internals, which is strongly recommended. Work through this book.

\- Languages and Compilers: Learn a lisp, write a lisp interpreter (should introduce you to some FP concepts) and then working through Concepts, Techniques and Models of Computer Programming should be a good foundation.

Whether you are a student or working full time, these above are time consuming but well worth the ROI if you put in the effort. Be creative and ensure that you publish all your work as part of your portfolio. Good luck!!!

[1] [https://www.amazon.com/Database-Internals-Deep- Distributed-S...](https://www.amazon.com/Database-Internals-Deep-Distributed- Systems/dp/1492040347)

<comment><USER10> How would you compare Database Internals to Designing Data Intensive Applications?

[1] [https://www.amazon.com/Designing-Data-Intensive- Applications...](https://www.amazon.com/Designing-Data-Intensive-Applications- Reliable-Maintainable/dp/1449373321)

<comment><USER9> The book you refer to is really kind of system design for applications which handle large data volumes. OTOH, the book I refer to talks about how database software can be developed from ground up thus helping you understand the internals.

<comment><USER10> That book does cover many implemention details of a database. However, sometimes at a high level, and as you mention, specifically in the context of distributed systems.

</comment></comment></comment></comment></comment><comment><USER11> If you want to go it alone, I think you're going to have to give up on the idea that there is a "right" set of resources or an optimal path through the curriculum.

I would spend a bounded bit of time (maybe just 10 minutes) every day focusing on the meta question of "how can I make progress given the absolutely massive set of choices I have to make?" and relatedly "am I actually making progress?"

Then I'd just make an arbitrary choice. E.g. pick a topic that interests you, find the top two or three textbooks on the topic, choose one at random and start reading it.

Then keep going back to the meta question. Are you making progress? If not, try another path. If yes, keep going, but remember to ask yourself the meta question tomorrow.

If you do this, you'll get better over time at carving out your own way.

re: going through multiple university books on the same topic. I find it is useful to skim several university books on the same topic. They often have different perspectives, and this is useful for developing intuition. But after doing this I'd just do the exercises from the one I liked the best.

</comment><comment><USER12> The more you engage with the content the more benefits you will get, the knowledge will stay longer.

By engaging I mean doing exercises, implementing algorithms in code, writing pet projects.

This will ensure you understand a topic, not have an impression that you understand. In past, I made a mistake to rush read textbooks till the point I feel I understood the content and ignoring most of the exercises - the exam showed me that I was wrong :)

At the same time, I would not suggest to apply engage mode for every book and chapter - your progress will be slow, and you may lose motivation deep in the middle of some thick textbook, as you may not be able to relate very detailed information there to your current expertise.

Personally, I apply the combination of skimming and engagement.

<comment><USER13> This advice is so much more important than which course or book you choose.

Don't sweat the choice too much, choose one of the canonical books, and commit to mastering the material by doing, not by (solely) reading.

</comment></comment><comment><USER14> When you study on your own, keep track of what your are learning.

What I do is to create spreadsheet with 4 columns:

\- "Topic": the topic name, e.g.: "self balancing trees".

\- "Material": did I read/watch the material for this topic.

\- "Notes": do I have my own takeaways or notes about this material.

\- "Code": do I have code for this? like a Jupyter notebook or source code, etc.

This approach worked for me, and helped me get better at online tests and interviews.

If you think you already understand a concept, you can just move on to another topic.

</comment><comment><USER15> The two courses that give the basic CS foundation needed are:

nand2teris.org and cs50.net

See if you can solve all the projects & assignments in these courses.

These cover a lot of ground. Once you are done with these two courses end to end, you will get a fair understanding of many of the computing big ideas.

<comment><USER16> If the student knows almost nothing, these are really good as they cover the most simple things.

If you already programming, they may be too basic.

<comment><USER17> Yeah I think CS50 is too basic. The C part is interesting though, has some minor projects that worth working on. For anyone who has some programming experience (whatever language), I think CS61A is a better course.

I really wish there is a course that uses C (like first 4-5 classes in CS50) and uses C ONLY and then go as deep as possible, similar to CS61A, but apparently on other topics (one system programming project?)

</comment></comment></comment><comment><USER18> \+ The foundation of computer science is Knuth's _The Art of Computer Programming_. Everything else is footnotes. Knuth is hard. And easy. And everything in between. You won't understand all of it. But you'll have to be ok with not understanding all of CS anyway. Nobody does. You can spend your time searching for a silver bullet. Or you can just read the manual. Knuth is the manual.

\+ Bach's _The Design of the Unix Operating System_ describes how operating systems and file systems work. Even Windows describes it's similarities and differences using the same terminology.

\+ Hellerstien's Berkeley CS 186 _Intro to Databases_ lectures. Databases get more love at Berkeley than elsewhere. [https://archive.org/details/UCBerkeley_Course_Computer_Scien...](https://archive.org/details/UCBerkeley_Course_Computer_Science_186/Computer+Science+186+-+2015-01-20-dY48_UZhvhw.mkv)

<comment><USER19> Unpopular opinion:

I have _never_ had any real use of TAoCP. I own all volumes and have really tried to make use of them but they feel more like a trivia book than something you can actually use in your work.

Sure, it's cool to own and recommend it but have people actually used it?

To end on a more positive note: I highly recommend "Introduction to Algorithms" by Cormen et al. Not as cool but very useful.

<comment><USER20> > Sure, it's cool to own and recommend it

That's what it exists for. To build the street cred of people who own it and have read it. Notice how no one who has read it comes back with a comparison of TAOCP and CLRS. For example "learning bogosort from Knuth instead of Cormen is better because Knuth gives you xyz insight into it". No, they simply think it's better because it's harder.

A rough comparison is _On the Origin of Species_ , which is a solid foundational text without being too arcane while _Philosophiæ Naturalis Principia Mathematica_ is not. No sane person suggests that to learn the Newton's laws of motion you need to learn Latin and then read Principia (except the people who fetishize difficulty). Just read Resnick and Halliday instead.

By no means am I downplaying Knuth's genius. He is a stalwart without whom our industry would be worse. But TAOCP is not a good foundational text because it's not approachable.

<comment><USER21> > a comparison of TAOCP and CLRS

The two are hard to compare, IMO, because their approaches and intended audience are different. CLRS is an undergraduate/graduate textbook on algorithms, where the authors have selected a broad range of topics based on things like their suitability for teaching or coursework. TAOCP on the other hand treats a narrower (and rather different) set of topics in greater depth, each section being essentially one person's excellent distillation of all published literature on the topic, passed through a tasteful interestingness+usefulness filter, and presented in expository style. To expand on that:

* CLRS treats algorithms as an academic subject in its own right, while Knuth is more concerned about what is actually useful to a programmer who is interested in writing efficient programs. For example, CLRS has an entire chapter on Fibonacci heaps (and the 2nd edition also had one on binomial heaps), which are great theoretically (amortized constant time for some operations), but impractical to implement and (because of the constant factors) hardly worth using in practice. In TAOCP you'll not find them mentioned. (Though there are Fibonacci _trees_ , the search trees that arise as a result of a simple and easy-to-implement algorithm called Fibonaccian search.)

* Compare the table of contents: [https://en.wikipedia.org/w/index.php?title=Introduction_to_A...](https://en.wikipedia.org/w/index.php?title=Introduction_to_Algorithms&oldid=932475956#Table_of_contents) versus [https://en.wikipedia.org/w/index.php?title=The_Art_of_Comput...](https://en.wikipedia.org/w/index.php?title=The_Art_of_Computer_Programming&oldid=932546058#Chapter_outlines) (Knuth wrote down the table of contents in 1962 and has been writing to it ever since; the ToC of CLRS is of course a function of present-day fashions among algorithms researchers.)

* Roughly, CLRS, like algorithms researchers, treat algorithms as a branch of mathematics, following the idea-theorem-proof structure (and sometimes overdoing it: [https://www.goodreads.com/review/show/155959101](https://www.goodreads.com/review/show/155959101)), writing only pseudocode, etc. It is possible to go through the entire book without ever writing a program or even feeling the urge to write one. (Not saying that's wrong.) Your thinking stays at a uniform level, roughly the "idea" level of thinking about the algorithm and what it does, proving things about it, etc. In TAOCP it's common to find an idea/algorithm described on one page informally, then a page later (rarely, when warranted: [https://news.ycombinator.com/item?id=14520230](https://news.ycombinator.com/item?id=14520230)) have an implementation in assembly language (MIX/MMIX), with a pointer to an exercise that asks you to analyze how many times a certain register is modified or whatever. In TAOCP, we always have mathematics in the service of algorithms -- the idea is to take an actual algorithm/program that can be implemented, then analyze it using whatever mathematical tools it takes (many of which were invented by Knuth... in fact at one point he wanted to name the books "Analysis of Algorithms", but the publishers didn't think the title would sell).

* For a concrete example: just last week I read TAOCP's section on tries (Chapter 6 Searching (Vol 3), part 6.3 "Digital Searching"). In CLRS there's a passing mention of tries (radix trees) only in one paragraph (Problem 12-2 in Chapter 12 Binary Search Trees), which asks to prove that using this data structure a bunch of binary strings of total length n can be sorted in O(n) time. This makes sense I guess because mathematically/asymptotically there may not be much more to say about them. But they are an eminently useful data structure that are practical to implement, and can make programs fast (only by a "constant factor" but that's what a real programmer cares about). So TAOCP spends about two pages explaining tries (with a useful diagram) and in fact their implementation as a bunch of arrays (not as a tree), then gives a MIX program to make it even more concrete, then some concrete numbers and words about when they're appropriate, and some history, goes into more depth on the specialization to the binary case, proceeds to explain PATRICIA tries (another practical data structure). All this takes 9 pages. Then there are 7 pages of mathematical analysis (leading to conclusions like, for example, a trie search inspects an average of lg N + 1.33 bits for a successful search and lg N − 0.11 for an unsuccessful one). Then there are 6 pages of exercises giving further ideas, all of which have at least brief solutions at the back of the book (~8 pages). Any of these (the assembly program, the mathematical analysis) you can easily skip if you're not interested, and still get something something of value as a working programmer. (If you want to implement your own searches that is... if all you do is use libraries written by others for writing CRUD applications none of this may be relevant much but that's the same for CLRS too.)

</comment></comment></comment></comment><comment><USER22> It is valuable to get to know different approaches for the same algorithm from different sources. In general if you could learn about the same topic from 5 different sources it would be awesome.

That said, how much time do you want to spend on it? If you don't have all life to do it, pick 2 and stick to it. Just random ... MIT and Stanford, or Princeton and CMU, in the end there should be no fundamental difference. Stuff that you listed in any way will get you far enough, two approaches will be great.

In the end if you want to be realistic about your time, role the dice for one of those... I did not do any of those, I did small technical university in eastern Europe. I have well paying job in western Europe and have seen people who finished better universities that know less than me.

You know that 80% of the effects come from 20% of causes? Don't try to over optimize... No one will give a damn if you are self learning and you did MIT course over the internet. You are not getting MIT degree anyway. That said, I skimmed through some of MIT and Princeton lectures as well, and you know what? Those were not magically better than the ones from my small uni in eastern Europe... But you know if you have MIT degree it is still worth more just like Adidas shoes you walk with them the same as other sneakers...

</comment><comment><USER23> Just follow the chart here: [https://www.eecs.mit.edu/docs/ug/new_curriculum_63.pdf](https://www.eecs.mit.edu/docs/ug/new_curriculum_63.pdf)

</comment><comment><USER24> Being self taught, I often wonder the same thing. I don't know that this is "THE ANSWER" but I was impressed by the job done here of curating a bunch of disparate CS materials (including some from the universities you mention) into some kind of structured learning approach [https://github.com/jwasham/coding- interview-university](https://github.com/jwasham/coding-interview-university)

As the url suggests, it's got an agenda about interview prep but the materials do not - they're straight up CS resources. Like I said, this may not be exactly what you want, but it could be helpful.

On a different note, I have completed the Stanford Algorithms Course part 1 (currently working on part 2) and I can recommend it.

<comment><AUTHOR> That's a very nice resource thank you very much.

</comment></comment><comment><USER25> Can you share your reason to go it alone, or why you ruled out a traditional learning option?

One of my favorite mentees came in to a software development job from a biochemistry background. She's got a knack for it and did a great job self learning a lot of basics, but I really saw some awesome improvement after she did a "CS masters bridge program" through NYU- [https://engineering.nyu.edu/academics/programs/bridge- progra...](https://engineering.nyu.edu/academics/programs/bridge-program-nyu- tandon/computer-science-bridge-program)

I guess it's really meant to get you into a grad program, but I know she got a ton out of it as a career programmer.

<comment><AUTHOR> In my country I cannot go for a second bachelors since it is age restricted. The ones which I _can_ attend are extremely expensive for which the ROI is not worth it. My undergrad is in EE.

If it's not too much to ask, would you mind being my mentor online in some way? I would really like to learn from someone with some direction and hold myself with some accountability too.

</comment></comment><comment><USER26> I'm surprised you didn't list CS50. That's one of the best intro to programming / CS courses around.

You can enroll for free at: [https://www.edx.org/course/cs50s-introduction-to- computer-sc...](https://www.edx.org/course/cs50s-introduction-to-computer- science)

I never went to University and didn't take a lot of CS courses but since I create web development video courses I wanted to be able to reference other courses to folks who asked so I took CS50 a few years ago to vet it. It was a great intro course and I even learned a little bit of C in the process. David Malan (the head instructor) is also top notch.

<comment><AUTHOR> CS50 is good, but I personally don't like it. I prefer MIT/Princeton/UCB intro courses comparatively. CS50 starts off with C for 3-4 weeks IIRC. Then moves on to python/sql/webdev. Not only is this fast paced, but it also covers a lot of breadth in a short time. For a self learner who has a full time job without proper support structure like peers and office hours which you get in the on campus version, it is difficult (not impossible) to go with the pace of the course. I do agree Malan is a great instructor.

In contrast, I like the MIT/Princeton/UCB courses since they use an easier language to start with and also introduce C in the later courses for systems programming.

<comment><USER27> I found CS50's schedule very difficult to keep up with while working full- time. I fell behind at points but I didn't find much if any penalty in taking a little longer to finish the class. I was motivated and putting the time in to absorb the material to the point where I was satisfied.

</comment></comment></comment><comment><USER28> To be honest I think self study can only take you so far (unless you are incredibly self disciplined). I'd recommend trying to get into OMSCS. If you have an undergrad degree you can do some nano degrees in algo/ai then you should be able to get in. If you don't have an undergrad degree there are a few high quality online undergrad degrees you can do part time - then do OMSCS. It's a long journey but will get you to high CS mastery.

</comment><comment><USER29> The bad news: you can't know what parts of what you don't know will be important. I can give you some recommendations, but so can everybody else, and they'll be different from each person. I'd look to high-level people in the field like Peter Norvig for recommendations, but that only narrows your options slightly. If you know what you want to do more specifically (i.e. security) try to find recommendations by an expert in that area (i.e. Bruce Schneier). But ultimately you're still hearing opinions, not facts.

The good news: It probably doesn't matter that much. Different programming books will give you different strengths and weaknesses, and that's _a good thing_ because teams need diverse skillsets. It's been years since I wrote production code in a strongly typed, statically typed language, but I did that for so long that I still think in types, and I bring that structured way of thinking to the table in Python/Javascript, which means I avoid a lot of the mistakes those languages allow you to make. I've worked with people who were very comfortable with metaprogramming, which always feels messy to me because it inherently muddles types. It's not a tool I ever reach for, and I push back when people add metaprogramming to codebases, which is a good thing, because too much metaprogramming can be bad. But sometimes, judiciously used, it can be very effective, so people with metaprogramming skill will solve problems that would be very difficult for me to solve. If we had both read all the same fundamental programming books, we'd never have these diverse skills that make our teams effective.

TL;DR: Pick the first one from a reputable organization and do it. Time spent agonizing on this decision is time wasted.

</comment><comment><USER30> I don't usually comment on HN, but I have to mention how amazing I found Tim Roughgarden's courses (Coursera's Algorithm specialization). The first course took me 1 month to complete, but that's because I wanted to make sure I truly understand the running time. Roughgarden does an amazing job of teaching you just enough math to ensure that you understand the entire conceptual picture.

</comment><comment><USER31> I always wonder this about other subjects and wish there were better guides listing the topics one needs to know — and how to learn them. Since I know a bit of CS, I'll try to do my part here.

In college, I found this lecture series to be an excellent supplement to my autonama and formal languages course. I haven't watched the whole thing, but it should check your "theory of computation" box. The lecturer is fantastic and thorough.

[https://www.youtube.com/playlist?list=PL601FC994BDD963E4](https://www.youtube.com/playlist?list=PL601FC994BDD963E4)

The prerequisites for this should be discrete math, but to be honest, depending on how comfortable you are with math in general, you could probably skip it and look things up as needed.

Another person to look into is Scott Young who taught himself the MIT CS curriculum in a year. His book Ultralearning is excellent and contains many tips that would help with self-studying CS. Unless you just want to dive into the content, Ultralearning would actually be my first recommendation before learning CS fundamentals.

</comment><comment><USER32> Of the intro-level courses I'm only familiar with CMU's 15-112, which I took as my own intro to programming a few years ago [1], and UC Berkeley's CS 61A (from hearing friends talk about it and looking at their assignments). But given the choice between just those two, I would definitely go with 112.

Compare the second homework assignments, which are supposed to be given after 2 weeks (~6 days) of instruction:

15-112: [https://www.cs.cmu.edu/~rdriley/112/assignments/02/](https://www.cs.cmu.edu/~rdriley/112/assignments/02/)

CS 61A: [https://cs61a.org/hw/hw02/](https://cs61a.org/hw/hw02/)

The 61A assignment forces higher order functions way too early, and it's often discouraging to people just starting out - and it's not even common (in my experience) to write code like this anyways. I also like the way that the CMU assignment writes tests as simple functions, without magic docstring tooling.

Don't skip the code tracing sections, where you read code and write the output by hand - it helps you understand and internalize what the code is doing, rather than just running code samples over and over again to see how it works.

Also, there's some nice notes on debugging [https://www.cs.cmu.edu/~rdriley/112/notes/notes- debugging.ht...](https://www.cs.cmu.edu/~rdriley/112/notes/notes- debugging.html)

[1] I took this version, which is ordered a bit differently [http://www.kosbie.net/cmu/spring-16/15-112/schedule.html](http://www.kosbie.net/cmu/spring-16/15-112/schedule.html)

<comment><AUTHOR> I have found that it's easier to find all assignments/materials online for the later courses from UCB compared to CMU courses although I do find that the CMU courses to be at a much higher rigor than UCB.

</comment></comment><comment><USER33> MIT has entire courseware available for free.

[https://ocw.mit.edu/courses/find-by- topic/#cat=engineering&s...](https://ocw.mit.edu/courses/find-by- topic/#cat=engineering&subcat=computerscience)

Introduction to Computer Science followed by Data Structures and Algorithms should give you a healthy start.

\--

Learning these fundamentals is useful, but not necessarily immediately practical. Building and doing is the best way to learn. This is a good start, and the fundamentals will certainly give you an edge against most people graduating from a bootcamp, but after this I'd recommend finding a good tutorial, whatever the language that teaches you step by step how to build XYZ... I learned ruby/rails by doing Michael Hartl's tutorial building a microblogging platform like twitter.

<comment><USER34> I used MIT OCW several years ago, but found it frustrating for three reasons:

1\. Following the courseware is not always free, starting with the textbook

2\. There are no milestones or credentials to track your progress

3\. I found little community to interact with

This is just anecdotal. Some of these may have changed, be different.

Has anyone here worked through many of these courses themselves?

<comment><USER35> You have one of the best universities in the world sharing their material for free. That's what's valuable, not the forums that can be attached to the platform or the certificate that no employer cares about.

<comment><USER34> I mean the professor or university could be the best in the world in terms of scientific discovery or university rankings criteria and this does not mean these materials are necessarily the best learning experience.

Did you even take courses there? Have a different experience?

<comment><USER35> Yes, I have, and my experience has been the exact opposite. Their courses on calculus and linear algebra are some of the best that I've come across.

</comment></comment></comment></comment></comment><comment><USER36> Given the vastness of the field my advice would be to narrow your focus. And specifically, focus on an area that will hold your interest and seek out the best resources in that area. When I was younger I _really_ wanted to make computer games and picked up Andre LaMothe's Teach Yourself Game Programming. I wound up reading it cover to cover and experimenting with many of the concepts. My career wound up going in a completely different direction but I learned more from that stint of sustained interest in a good book, than many of my university classes.

Second advice is that once you've done a rote exercise find some way to push the boundaries of it. I've found that anything I can do to extend or customize the example helps engage my brain with the material and often leads to learning new things.

</comment><comment><USER37> Amazing inputs.

I'd also suggest a top-down approach where you start with a flexible end goal you'd want to achieve (e.g. be a full-stack dev), in which case you can start by babystepping a hands-on approach (e.g. learning javascript, learning client-side and server-side of things). Complimentary fundamental course outlines can also help, e.g. Comptia A+ gives you hardware fundamentals, Comptia Network+ gives you networking fundamentals, CloudAcademy can get you started on working with cloud providers like Azure/GCP/AWS, and so on and so forth.

It's easy to get lost in the theoretical side of things, being able to test them out in action as soon as you can could give you quite an ideal balance.

</comment><comment><USER38> I had the exact same problem as you — and really, it's not a problem at all! It's one of the greatest things the internet's given us.

Just remember that material is material. Fundamentally, all of these courses are pointing you towards the same basic core of knowledge, with only minor stylistic differences. I like using multiple sources, like you do. Just stick with one good one at first, and then once you finish it you'll be able to go through five more in the same time, because of the overlap.

</comment><comment><USER39> For data structures and algorithms, work through _Introduction to Algorithms_ by CLRS and follow the video series from IIT Bombay, available here: [https://www.youtube.com/playlist?list=PL7DC83C6B3312DF1E](https://www.youtube.com/playlist?list=PL7DC83C6B3312DF1E).

...or use any other book or lecture series. Stop worrying about choosing the "right" resource; just find _a_ resource and start learning.

</comment><comment><USER40> I did the first three in this series of online Coursera courses from UC San Diego and I thought they were quite good: [https://www.coursera.org/specializations/data-structures- alg...](https://www.coursera.org/specializations/data-structures-algorithms)

You end up implementing the algorithms and data structures yourself in your language of choice, which I find is a good way to learn.

</comment><comment><USER27> Harvard's CS50 [1] is where I started in my self learning journey. I found it very difficult but it's given me a really good base to build upon.

CS50 hits the sweet spot of excellent online material, large online community and fun.

1: [https://www.edx.org/course/cs50s-introduction-to-computer- sc...](https://www.edx.org/course/cs50s-introduction-to-computer-science)

</comment><comment><USER41> I really recommend Lynda ( now linkedin learning) not free (but remaking accounts works ofcourse), unless you signup via new york or LA library. also khan academy: information theory is really great: [https://www.khanacademy.org/computing/computer- science](https://www.khanacademy.org/computing/computer-science)

<comment> rajesh-s Any specific courses that you'd recommend on LinkedIn Learning?

<comment><USER41> I'd recommend their course Programming foundations: Fundamentals. They update this one yearly I believe

</comment></comment></comment><comment><USER42> Concerning computer science, you can find some interesting web discoveries here: [https://turtle.community/topic/computer_science](https://turtle.community/topic/computer_science)

In particular, I like 'Category Theory for Programmers' by Bartosz Milewski as a great theoretical foundation to functional programming.

</comment><comment><USER43> None of these are bad choices.

I'd suggest checking out 5-10 min worth of material from each one and choosing whichever you find most accessible.

If after completing one course you don't feel confident you've absorbed the concepts, try another. Otherwise move on to the next set of concepts.

</comment><comment><USER44> If you have a good verification method to see that you learned enough for a successful interview, it doesn't really matter which course you use.

Going through hackerrank tasks is a great way to practice. Also Cracking the Coding Interview and online interview questions.

</comment><comment><USER45> You need to define your goals, learn the CS you need for the projects you want to work on. If you find yourself at a point where that is not enough, you should get yourself into a CS program.

</comment><comment><USER46> For a stupid man like me, I think the "head first" series from Oreilly is the ultimate answer, you will be just able to understand all the things in the books, even stupid like me.

<comment><AUTHOR> I like and recommend the head first java and design patterns books. They are wonderful for a beginner.

</comment></comment><comment><USER47> There's an abundance of material online to get through an entire CS program on your own, if this is your desire. The problem I've seen with self-study, unless you are disciplined, chances are you will not stay the course, even if you follow a plan, unless you're single, with plenty of time/energy to burn toward a program.

My suggestion would be to enroll in a college and pay for your education. This way, you'll be more motivated because the pace will be imposed and it will cost you more than your time if you don't do the work required to pass and more importantly, learn something of value.

<comment><USER17> I actually second this. I found it struggling to keep the pace, and the thing with study is, if you wait for a few days and try to pick up, you usually have to start over from a previous "milestone", which really sucks. That means unless you are really disciplined, it's difficult to learn the whole stuff by yourself.

But I think at least one should be able to learn 2 topics by oneself: A programming language, Basic data structure and algorithm as well. Then he can learn the others leisurely.

</comment></comment><comment><USER48> You need to narrow down what your goal is.

Trying to learn computer science is like trying to learn sports. Swimming and tennis have very little in common and you can spend years trying every sport and never becoming good at any of them (what traditional cs education does)

If your goal is to get a job, your best bet is web development or mobile dev.

The big picture is we have CPUs that have instructions. Instructions boil down to moving data to/from someplace and manipulation of data.

Moving is how monitors display stuff, data gets stored on disk etc. Moving is how a program gets loaded and executed.

Manipulation is how you get math operations. Programming boils down to math operations and conditionals (if this, then that, else something else)

Math operations have a few basic types for performance reasons - floats, ints, etc.

Because math operations on the CPU have types, programming languages have types. Because CPUs have conditional operations, programming languages have operations. See the pattern? Programming languages are just conveniences on top of the language the CPU provides (called assembly).

The most popular 'low level' language is C. C gives you functions and the smallest set of data types you can get away with. The big deal here is organizing code into functions. Functions allow re-use and programming is all about doing the least amount of work possible by the programmer to achieve a task, in the shortest amount of time and memory use possible.

The study of shortest amount of code to achieve the fastest result with the least amount of memory use is algorithms.

To achieve fast results with least memory used, you want a language that gives you access to memory manipulation directly. This is why C is still king for anything performance critical.

If you don't care for performance much, Java the language is king of corporate software and all Android software too. It handles memory for you and your types are clever - you don't need to say how big an array you want when creating it, you just create one and it gets magically re-sized behind the scenes for you as you add elements in. All modern languages have clever types and ways of helping manage memory for you. This is to make programming more newbie-friendly and theoretically to lower the number of bugs, at the cost of performance and memory use.

Phew, so we have CPUs, C and Java. Now where do we typically store data and how do we display it?

Data is stored in databases. Databases mere mortals use are all SQL databases - the most popular and robust being Postgres. Learn what an index is and why it helps stuff run faster. Learn joins and one-to-many and many-to-many. Build a photo-sharing site with user registration - this'll cover needing to know all the basics.

Oh, to build the site, you'll need to display it. You have 3 options - web, ios or android. I'd recommend web because it's the easiest of the 3 and there are tons of excellent resources to learn from.

It is extremely easy to get bogged down in libraries such as 'react' and all the rest. It is extremely easy to get bogged down in new Javascript features. Stick with the basics! Stick with simple html/css and flexbox for layout. Use node with the most popular and simple web framework as a web server. Use the simplest library to talk to the database and write SQL, don't use ORM because you need to learn SQL and'll be around for the next 50 years - your ORM won't.

Phew, you've spent about 6 months and have built a photo sharing site. You know html/css, some javascript, a web server framework, how to store stuff in a database.

You're another 3-6 months away from getting a job as a web developer. You'll need to learn react or whatever other junk framework of the year is most popular these days. You'll then be plunged into a world of mediocre software and writing code for projects that make no sense, with deadlines that make even less sense. There'll be a lot of meetings, incompetence and your posture will suffer.

The pay is good however, and it _should_ double within the first 2-5 years if not triple. Switch jobs every year and try to do contract work as soon as possible - it pays way better.

This is the outline for going from 0 to hero, if getting a job is your goal. If you don't want to end up working on projects of questionable importance for the rest of your career and you want to build software that will drive the next car, operate the next robot, help us go to Mars etc - you should simply attend a good University. There is no shortcut and you'll avoid wasting hundreds if not thousands of hours chasing your own tail reading tutorials written by people who learned programming 2 years ago themselves.

You'll meet other smart people and you may even want to get a Masters and a PhD. Oh, you may get hired by a top company if you're good and the pay there is great, and that's where you'll get to do great work. They care about degrees and which University you went to, don't believe anyone who says otherwise.

Self-learning CS is only for the crazy ones, or those who want a high paying job quickly, are smart and don't care what they work on.

My 2 cents of course, having gone the self-learning route myself many years ago :)

Oh, one last thing - if you go the self-learning route, you _need_ a friend who's a good established programmer to answer your questions for 5-10 min everyday. I don't know if there are services online that do this or if you know somebody but this is absolutely critical to avoid wasting your time without knowing it, which is inevitable but you want to minimize it.

Now that I think of it, if you go to University, you absolutely want a real programmer too, to know which courses to simply get a passing grade on, and which to focus on, depending on your ambitions.

</comment><comment><USER49> A couple of things here: I do not think that there is a "right" set of resources. There may be a set of "right" resources for you personally but to explore or discover these you would have to explore your motivation and your personality further. Which learning styles do you favour? What are your long term goals? Somehow I liked how Jordan Peterson put it in his - Maps of Meaning- lecture: university should help students to get articulate. If you think about that, your self and um your goals it should help you to move forward.

Other wise you are just looking for an instruction manual for life, which doesn't exist as such.

</comment><comment><USER50> Go to school or do some online or part time degree on Coursera/udacity. Otherwise you waste more time and don't learn anything.

</comment><comment><USER51> n most elementary schools, high schools and colleges, computer science is still an elective course. However, a growing number of education institutions – at every level – are requiring their students to complete at least an introductory course in computer science in order to graduate. We live in a society driven by computer technology. From school to work to socializing, understanding how computers work and how to use them is becoming more essential in many areas of life. The field of computer science takes computing to the next level. More and more students are pursuing an education in computer science and turning their knowledge into lucrative careers in business, engineering, and health care, to name just a few.</comment>


Nginx vs Apache performance - <AUTHOR> http://blog.webfaction.com/a-little-holiday-present <comment><USER2> Benchmarks that are not completely anecdotal are really hard to produce. For starters you need the following...

1\. Don't run the client on the same server. If you do, you have no business trying to test for high concurrency. Isolate the variables.

2\. Size of file you are serving. Are you close to saturating your connection between the client and server? Most of the time this is the case.

3\. Concurrency is hard to test because most of the time the client is the problem in the test. Don't use apache bench for anything like this as it's high concurrency is much to be desired.

4\. A lot of other details need to be compared to make a benchmark useful. Are you using keepalives on both/or not. Nginx workers/processes vs apache threads/clients. Are you comparing apples to apples? How's your TCPIP backlog in a case like this? What kind of IO model are you running on each? Are you using sendfile on both or only one?

Nginx is a great server, and probably a better choice for static files, but data like this is like saying, "the other day I saw a some kind of Honda pass some kind of Nissan". No useful information to infer about either.

</comment><comment><USER3> Nginx shines as a high-volume proxy, but as a straight up web server or app server, if either apache or nginx is your bottleneck, you are probably do something wrong.

At its heart nginx is a fork of apache 1.3 with the multi-processing ripped out in favor of an event loop (and all the copyright statements removed from headers, but hey, it's cool). The event loop, time and again, has been shown to truly shine for a high number of low activity connections. In comparison, a blocking IO model with threads or processes has been shown, time and again, to cut down latency on a per-request basis compared to an event loop. On a lightly loaded system the difference is indistinguishable. Under load, most event loops choose to slow down, most blocking models choose to shed load.

A few short years ago the benefits from using an event loop instead of blocking io were much more dramatic -- the level of parallelism achievable in hardware has gone way up (hey, look, erlang!) and is accelerating. Paul Tyma did some great experimentation with this a while back, <http://is.gd/nJ6Z> .

</comment><comment><USER4> One of the things about nginx is the lack of an organised community - for e.g. there is not even an official repository for nginx ([http://marc.info/?l=nginx&m=122153991029203&w=2](http://marc.info/?l=nginx&m=122153991029203&w=2)). there are simply some mirrors of people who maintain a patch-based tree (<http://mdounin.ru/hg/nginx-vendor-current>). There is no bug-tracker (!!), just a wiki page (<http://wiki.nginx.org//NginxBugs>) and as someone mentioned (<http://www.wikivs.com/wiki/Lighttpd_vs_nginx>), very less activity on IRC.

It comes down to the original issue of Linus Torvalds, Ingo Molnar and Con Kolivar: do you have a clear roadmap of where the architecture is going, vs a very cool technology that had a lot of support and was no doubt popular.

I am in no way commenting on the technology behind nginx, but as an architect, making a deployment decision that is going to take hell to change later, I would be very concerned.

<comment><USER5> i think much of this is due to the language barrier, and also due to the ease of use (and ease of writing nginx modules)...

<comment><USER4> the lack of a bug tracker and a SCM should'nt be limited by language barrier.

</comment></comment></comment><comment><USER6> I wish the ModWsgi module for Nginx was maintained. The last commit was 12 months ago. <http://wiki.nginx.org//NginxNgxWSGIModule>

</comment><comment><USER7> The memory is particularly a big deal if you're on a small slicehost/linode instance - a standard Apache setup without tweaking can take up half your RAM.

<comment><USER8> Yep. I lost my slice to thrashing twice before I discovered that a standard PHP forum under trivial load (6 simultaneous users plus Googlebot) can easily balloon under the default settings. Nginx has much better "works right out of the box" properties for folks who are not httpd.conf gurus.

</comment></comment><comment><USER9> My understanding is that Nginx is the server of choice for static content and Lighttpd for dynamic content (particularly FastCGI). Is that still the latest and greatest advice?

I've found Lighttpd way easier to configure than Apache and am having it serve my static content simply because we don't need to worry about every little bit of performance just yet.

<comment><USER10> Depends on the app platform. In the rails world Phusion Passenger (aka mod_rails or mod_rack) in combination with Apache is making inroads for serving up dynamic content. Despite the bigger footprint and other downsides of Apache, I'm hearing more and more that stability and ease of configuration of Passenger are a win. I'm only running it on a low usage backend app for the moment, but it was definitely easy to set up.

<comment><USER11> Passenger is a big win. I once ran nginx + mongrel_cluster, and while it probably had less overhead than the equivalent Apache + Passenger setup, it was more than cancelled out by the effort necessary to babysit the mongrel processes. This was also more of an issue with MRI-era Ruby and its associated memory leaks.

With Passenger, I set it and forget it. Time is money.

<comment><USER12> I agree.

I've been using NGinx/Mongrel for most of my large deployed apps, but am working to get things moved to Passenger (and Apache, natch), simply for the ability to do a graceful restart on most code changes. For large apps, the ever expanding mongrel footprint and slow restarts is becoming too much to bear.

So for me, Nginx has a lot to offer over Apache, but with the rails deployments I've been working on mostly, it's no longer enough.

</comment></comment></comment></comment><comment><USER13> All of the sites hosted at engineyard.com use Nginx (github is one of them, for example). Works great.

</comment><comment><USER14> How does Nginx compare to lighttpd?

<comment><USER15> We have used both at reddit. Performace-wise they are comparable for us, but nginx was a lot easier to configure, and lighttpd had a nasty bug that made us switch away (for the life of me though, I can't remember what the bug was).

<comment><USER16> > lighttpd had a nasty bug that made us switch away

Lighttpd has a bug in mod_proxy that makes it unusable under load.

<comment><USER15> Yeah, that was it! The load balancing algorithm completely broke down under load.

</comment></comment></comment></comment><comment><USER17> What is the optimal solution for PHP-based sites? Is Apache w/ mod_php faster than Nginx with FastCGI?

<comment><USER18> Anecdotes are not data, but if you're in the market for an anecdote anyway...

A thousand times no. Nginx+php-fastcgi is _screamingly_ fast by comparison, while allowing me to free up about 70% of the memory previously in use, and get huge gains from loading the PHP code into RAM with APC.

I look after one managed server which chucks out tens of millions of requests per day despite only having half a gig of RAM in it. Before, running apache2, it had a load average of about 6.0. Now? 0.2.

</comment></comment><comment><USER19> For a site where Nginx doesn't make sense, has anyone used memory caching on Apache (to store static files in memory) with success? I am curious as to how this would perform in comparison.

e.g. modmemcachecache

<http://code.google.com/p/modmemcachecache/>

</comment><comment><USER20> Does anyone(anything) package php-fpm (or whatever you are supposed to use) together with nginx?

<comment><USER2> apache w/modphp has the best latency in comparison to any fastcgi setup. When it comes to high concurrency latency and time to finish is your biggest issue. Slow clients are another killer (slow clients are users who have a slow connection and take an order of magnitude longer or more do download the page data as compared to generation). If you application is fast (less than 20ms) page generation your best bet is the following setup...

nginx or varnish reverse proxy front end. (depending on your load you can turn keepalives on here) This front end isolates your www/php/db from slow clients making sure that your request gets processed fast, resources are released, and then a light process of your proxy handles the delivery of the data. On the back end use apache/mod_php with a limit of only 50-100 clients.

</comment></comment><comment><USER21> Interesting. Another nice choice for serving static content is rumored to be thttpd. It lacks any kind of FastCGI support though (it's in the proprietary,premium version). Has anyone had any experiences of thttpd versus nginx?

</comment><comment><USER22> apache is perfectly capable of saturating the outbound connection on static content on any reasonable setup. you may save a little on memory with nginx but you aren't saving on speed (how can you deliver more content than the outbound connection can carry??). this is why the in-kernel http servers went nowhere. in any case most people use CDNs these days for static content.

note that by not using apache you give up a lot of security hardening, add-on- modules, and mindshare that nginx does not have.

<comment><USER23> For a very tight virtual server config I can see the use for nginx, but for a normal server, running just apache, memory is not going to be an issue. There are probably other limits that will affect performance, such as the connection just as you say.

For example I tried running a server with apache + passenger on an ec2 node, bumped up the MaxClients to 1024. I evened out at around 400 simulaneous connections. Maybe it was due to some mysql limit or limits from the placed I sent the load from, but I was consuming around 50% cpu, so there seemed to be some other thing.</comment></comment>