Effective Learning Strategies for Programmers
akaptur.com
akaptur.com
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).
[0] http://www.edweek.org/ew/articles/2015/09/23/carol-dweck-rev...
Can you point me to you resources regarding research-backed activities/exercises? Thanks!
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 :)
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.
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.
[2] http://www.theguardian.com/science/alexs-adventures-in-numbe...
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?
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 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.
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.
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.
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]
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.
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.
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).
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".
[1] http://www4.ncsu.edu/unity/lockers/users/f/felder/public/
[2] http://www4.ncsu.edu/unity/lockers/users/f/felder/public/Pap...
This kills the incompetence.
Oh my. I've never really been able to quantify this kind of thinking. Fantastic article!