Hacker News new | past | comments | ask | show | jobs | submit login
Effective Learning Strategies for Programmers (akaptur.com)
231 points by nicholasjbs on Oct 11, 2015 | hide | past | favorite | 40 comments



The research promoting a growth mindset hasn't proven to be nearly as robust as many had hoped. It's starting to look like there's a very real possibility it's spread so far merely because it's something people want to be true.

Psychology research has had a pretty dismal track record in terms of reproducibility (http://www.vox.com/2015/8/27/9216383/irreproducibility-resea...) and the growth mindset dogma in particular has been facing more and more robust criticism. Carol Dweck's work is far from the final word on the matter that this blog post portrays it to be.

http://slatestarcodex.com/2015/04/08/no-clarity-around-growt... http://www.amren.com/news/2014/04/yes-iq-really-matters/ http://www.amazon.co.uk/Intelligence-That-Matters-Stuart-Rit...

Ironically, focus on a growth mindset may actually distract people from doing things that actually do have reproducible research showing they lead to more mental horsepower (e.g. regular aerobic exercise).


> Ironically, focus on a growth mindset may actually distract people from doing things that actually do have reproducible research showing they lead to more mental horsepower (e.g. regular aerobic exercise).

Can you point me to you resources regarding research-backed activities/exercises? Thanks!



I do strongly feel that people have varying natural aptitudes. Some types of problems or challenges will come easier to some than others... I think the key is not being afraid to lose/fail. To get back up, dust yourself off and keep going.

There's also knowing when something really isn't right for you... Some people really can't grasp certain types of concepts essential for certain jobs... Given, these are mostly outliers, they do exist.

Just the same, drive and effort count for more in life in terms of actual results than anything else, next in line probably being chance/luck.


Programming is one place where I think some people just won't get it no matter how much drive. I studied information technology during the dot com boom (graduated in the bust). My course started with a four week intensive Java course with an exam at the end. People who failed at the exam were not excluded from taking the course but were advised against it. A few of them stayed on, but they really struggled.


Fwiw, Carol Dweck recently wrote about how the surge of interest in and promotion of a growth mindset approach to teaching and learning came with false positives [0]

[0] http://www.edweek.org/ew/articles/2015/09/23/carol-dweck-rev...


Yep, saw that go by earlier. It's not working as well as advertised, which obviously means everyone's doing it wrong. o_O


There are a lot of links in the parent's comment. But check out http://slatestarcodex.com/2015/04/08/no-clarity-around-growt...

I just read it, and highly recommend it. If you're interested in someone putting forth a very thoughtful critique of growth mindset you will find it there.

P.S. He's also a great writer. Reading him reminds me of reading Kalzumeus. Just a treat :)


Another critique of the growth mindset: http://www.salon.com/2015/08/16/the_education_fad_thats_hurt...


If you have a fixed mindset – you believe that people are either smart or they’re not, and they can’t really change that – then you also tend to believe that if you’re good at something, it should be easy for you, and if something is hard for you than you must not be good at it. That’s a fixed-mindset view. People who have a growth mindset believe that you need to exert effort and work hard at something to become better at it.

I fully agree with this, and I think the problem is schools too easily trap people into fixed mindsets. There are so many exams in school that if you constantly get medium to low scores it's easy to think you just aren't smart.

I learnt programming as a hobby outside of school and fast forward to today and I am a software developer with a 1st degree in compsci. When I look back and wonder why I found programming so much easier than school subjects like math/geography I realise I hated the system more than the subject. The constant dull drills, working through equation after equation. All to pass the next exam and then forget. As I wasn't good at them I just decided that I never would be.

Now that I am older I realise that mindset is ridiculous. So as a test, about a year ago, I started practicing memorising all the countries in the world (using Anki[1] flash cards, which I flick through at work whenever I am waiting for a build to finish!), and these days I can literally zoom over the world in my mind and name 90% of the countries. I also started using an abacus to see if I could get my brain to instantly solve math equations just by looking at them [2] and am having some success. I sometimes wish I could go and tell my younger self to skip school but there you go hindsight is 20/20.

[1] http://ankisrs.net/

[2] http://www.theguardian.com/science/alexs-adventures-in-numbe...


> I fully agree with this, and I think the problem is schools too easily trap people into fixed mindsets. There are so many exams in school that if you constantly get medium to low scores it's easy to think you just aren't smart.

Heh. Not related to there being too many exams, but the second part. Almost changed majors from EE/CmpE to something... softer after the first Calc test in my first semester. Got a 60% on it because I didn't know how to study from highschool. (Freaked me out enough that I studied well enough for a 100% on the next test.)

For continuing education, I attempted doing an online program offered through my alma mater for an EE masters. The course format didn't really fit me or the online format well, but I've found the textbooks themselves incredibly useful for self paced study.

Does anyone have any Computer Science, Electrical Engineering, Computer Engineering textbook recommendations? I'm working through Microelectronics by Sedra/Smith right now, to be followed by Art of Electronics 3e, but I don't know what I don't know. Any textbooks that will change my fundamental view on electronics and/or programming?


I'm trying to get my hands on http://www.amazon.com/Computer-Systems-Programmers-Perspecti... but it's quite expensive so I think I'll try to get the 2nd edition.

I've also quite enjoyed https://openlibrary.org/books/OL2197699M/Peter_Norton%27s_as... but you may want to repair the damage caused to the book by the Adobe DRM - it appears only one person can read the book at a time.


Could you go into more detail about how you actually learned to study and what your technique is now for studying? I'm always curious how other people go about learning things, specifically about how they test mastery of knowledge.


I sit down and read through the textbook, taking notes on anything that seems remotely important, doing every exercise and problem set (preferably those with answers). I try to really grok the material and integrate it with existing knowledge before moving on. Much slower pace than any of my college courses, but I'm really starting to pick this up.

When I get bored of this, I play some games :) Or switch to another topic briefly.

As far as testing mastery, my only test is if the material in the book starts to become more intuitive. If I can do the calculations in my head or figure out the relevant formulas and equations without referring to old notes. I've also thought about setting up Anki, but for circuits it seems like a lot of work to figure out how to make usable cards.


I don't actually have any textbook recommendations for you, but with respect to Comp. Sci., keep in mind that there is a difference between Comp. Sci. and programming. Obviously there is a large overlap, and you can use a lot of Comp. Sci. theory in every day programming, but programming is a discipline unto itself.

I think programming is a lot like writing (prose). You need to read a lot and write a lot. If you want to be a great programmer, I think you should be programming every day -- not just school, or work assignments, but you own code. You need to find your own voice. It is hard to find time to do it, I know. Also, read as much as you can. Open Source software is ideal because you can read code from a lot of different authors. Sometimes people only read their own code or code from their colleagues at work. This can really stunt their growth. Sometimes I think there should be a "Programming" degree in the arts faculties at universities...

I'm not a scientist, I'm a programmer. However, the theory that I think will help you most is:

- Automata and grammars. Specifically you should know the theory, be able to make regular expressions and be able to write/read BNF. You should definitely know the Chomsky hierarchy and be able to recognize the type of grammar by looking at the BNF or code (this is especially important if you ever write a file format or design a communications protocol).

- Group theory

- Linear algebra

- Basic calculus (may or may not find differential equations useful depending on what you are programming)

- Basic statistics (definitely need to know what probability distributions are... lately I've been thinking that Bayes theorem is getting to be more and more important).

- Algorithmic complexity (i.e. O() notation).

For studying programming:

- You should be aware of design patterns and be able to recognize them in code (you don't have to go crazy on it, though). There are lots of good books on the subject. Or just browse c2 wiki.

- You should know how to do test first programming. Kent Beck's book "Test Driven Development: By Example", is arguably not the best book on the topic, but it is the book I always recommend to beginners because it is the most straight forward. Other books tend to conflate a lot of issues and to push points of view that (in my mind at least) have yet to prove themselves. Beck's book will give you the basics and allow you to move on from there.

- You should know how to make UML object diagrams. Unfortunately, I don't know of any books on the subject that deal only with object diagrams. You don't have to use UML diagrams in real life, but they contain the concepts that you can use when sketching designs.

- You should know how to refactor code that is under test. Michael Feather's "Working Effectively with Legacy Code" is the only good book I know on the topic. It is very advanced, though. There may be more gentle introductions somewhere. Martin Fowler's book is a great reference book, but it is not useful for a beginner IMHO.

These are the basics, from my point of view. I recommend also learning at least one programming language from each of:

- modular (C, Pascal, etc)

- Strongly typed OO (C++, Java, C#, etc)

- Dynamically typed OO (Ruby, Python, etc)

- Pure functional (Lisp, Scheme, Haskel, etc)

- Declarative (XSLT, Prolog, etc...)

- Assembly (microcorruption.com is a great introduction)

Obviously you won't use all of these things all the time (and some you will never use), but for me if someone has all of these things it gives them a good base to work from. I'm probably forgetting some important stuff as well, but that's enough to get you started.


> I don't actually have any textbook recommendations for you, but with respect to Comp. Sci., keep in mind that there is a difference between Comp. Sci. and programming. Obviously there is a large overlap, and you can use a lot of Comp. Sci. theory in every day programming, but programming is a discipline unto itself.

Agreed. One of my recent revelations was I spent too much time in college and early working years trying to be a good _programmer_ and it really hurt my underlying knowledge. Especially in computer engineering where very few CS theory classes were required. As I say to others, I've got the programming muscle... now let's make a longer lever.


A good book on how to design algorithms :Introduction to algorithms - a creative approach - udi manber


> I realise I hated the system more than the subject

Wow, you're right, I feel the same way

> I sometimes wish I could go and tell my younger self to skip school but there you go hindsight is 20/20.

You could consider homeschooling your kids should you decide to have any.

[tangent] The more I read about education, the more I feel this is the better option for parents who can have a flexible schedule, such as programmers who seem more and more to be able to work from home.

I'd love to live in a community some day where there are a lot of home-schooled kids where they can also do some activities together. I don't know if that is a thing or not but it should be! [/tangent]


I was homeschooled, and I agree that it is great if the parents can make the effort. I think that homeschooling gets an undeserved bad reputation for the perceived "brainwashing" but if it is done right then that is not an issue at all. It does allow the individual learner to excel at what they are good at, though. Once I learned to read my education was very self-driven and I came out very well-rounded because I would read tons (probably literally) of books about anything that interested me; I notice a lot of people identify themselves as a "math person" or an "English person" and I was never like that. I also agree that having other home-schooled kids around is nice; socialization is one of the primary arguments for public schooling but if you have it while homeschooling you've hit the jackpot.


I developed a fixed mindset from a young age because I was constantly told that I was smart, which caused me to expect school to always be easy. When I got to college-level work, I failed hard and had to struggle to reinvent my thinking.


A lot of this advice seems mental/emotional, but as far as tactical approaches go, I think it's important to actually practice, like how a musician does. Like when you're not at work, actually practice doing things like set up a git repo, create a random silly MVP from scratch, solve a one-hour problem in a new language, practice a new programming technique, etc. Or, practice while pretending you have an audience, and if you get hung up on something, learn it until you wouldn't get hung up the next time.


Yes practice is the key, but don’t just spend your time doing the software equivalent of scales, actually try and build something that is difficult and complex. I have always learnt the most when I am trying to solve real problems rather than toy problems, plus I am more motivated when I know the effort is going to result in something useful.


I mostly agree, but for some types of projects I think the initial setup phase can be worth doing as a scale, because it's important and often under-practiced.

Server deployment, setting up a build system, wiring up some system that you know you'll do again, etc - there are benefits to knowing a process that works, rather than stumbling through it each time and thinking it's magic. Another thing that helps is just writing down all the steps you did, after going down a windy path that eventually worked.


I agree 100% with documenting what you did when setting up a system/server. I do this (most of the time) and the ability to go back and look at what was done is invaluable. I just wish I did it more often - I something think something is so obvious that I don’t need to write it down and 6 months later I kick myself for being so lazy!


You know what the problem with practice is? It's maintaining the mental and emotional drive to continue to do it.


Fixed vs growth mindset is BS. It completely misses the point. Find a way to play with whatever it is that you want to learn. The more fun you have, the more you'll almost-magically get better at it. No need to have personal pep talks to convince yourself to go bash your head against the wall one more time.

Whether you can learn isn't the issue, whether you do learn -- and how much time and annoyance you have to put in -- is what matters.


I think the problem is that what you want to learn is not always fun all the time. At some point you'll hit the wall and you have to overcome it (I admit, however, it never happened to me in programming, but for example I hate driving while I have to get better at it). It's tempting to make an excuse like you're simply "not built for it" - so that you can give up without feeling bad. That is a harm of the fixed mindset as far as I understand. I'm not saying that people should feel bad all the time, but the "nature" excuse is sometimes a slippery slope.


There should be more research in meta-learning. How to learn things that eludes you far too much. Rewire your views deeply. And how to perceive 'progress' while interacting with blind spots.


A pretty good counterpoint to that: Playing an instrument.

Very few people can pick up and play an instrument naturally. The best are the ones that combine a basic musical talent with hours of hard work, in a quest to get to a level where they can "just play".


If you have a fixed mindset, it is probably difficult to have fun with something you want to learn if it just constantly makes you think you are unintelligent.


Are you so confident that this is true for others because you have lots of evidence, or are you just talking about your personal experience?


More precisely, from what I've read the "flow" state seems to be about ideal for both learning and making things fun.

Plus of course, the more fun something is the more practice you'll find yourself getting (and without having to bash your head on the wall).


I've found Richard M. Felder's [1] research in this area useful. He makes a compelling argument [2] that one size does not fit all and describes a taxonomy of learning styles. Understanding my own learning style [3] has helped me optimize the way I go about coming up to speed on new topics.

[1] http://www4.ncsu.edu/unity/lockers/users/f/felder/public/

[2] http://www4.ncsu.edu/unity/lockers/users/f/felder/public/Pap...

[3] https://www.engr.ncsu.edu/learningstyles/ilsweb.html


Also, I find that being able to read code is super important. The faster you can read code and get it, the faster you understand new ways of doing things that actually are backed up under the hood by things that run.

This kills the incompetence.


That's especially true about the 10x programmer---I don't see people talking about how they saw a 10x programmer doing <X>, and how that factored into the 10x, I just see admiration, envy, disdain, etc.


If you’re on the lookout for places where your mindset might be fixed, you should be listening for sentences that start like this. Things like “I’ve never been good at CSS” or “I’m not a people person” or “Some programmers are just faster than others.” Anything that starts with “I am …” is a candidate. The word “just” is often present.

Oh my. I've never really been able to quantify this kind of thinking. Fantastic article!


This is up there with some of the best conference talks I have watched online

https://www.youtube.com/watch?v=Mcc6JEhDSpo


I doubt very many people on this site need to be told how to study effectively.


I wouldn't be surprised if many people here did mostly things that felt relatively easy for them (because it fit their talents and/or was fun to learn) and can achieve a lot just off that.


I readily admit I could use (good) help in that area.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: