What concepts should you memorize to make yourself a better programming problem solver?
For example, remembering Big-O complexity for the most widely used data structures.
What concepts should you memorize to make yourself a better programming problem solver?
For example, remembering Big-O complexity for the most widely used data structures.
I don't think that memorization precludes the ability to problem solve.
I agree with Sean, I don't think memorization will help with your ability to solve problems.
An alternative to memorization to make yourself a better problem solver would be to actually solve problems. Just working through the logic will tickle the brain and keep you sharp.
Practice and learn. There are so many concepts to deal with in software development.
I think one of Jeff's greatest blog entries was It's always your fault. If you can learn to master that concept you'll go a lot further than the crowd.
Solve the issue completely. Try to see the broader implications a certain fix might have. "Why am I having to fix this at all?" "What could have been done to avoid the problem altogether?"
I think software design's rapid prototyping capability (as compared to, say, designing a nuclear sub) makes it easy to "make it work" quickly without thinking about the framework and the tradeoffs you may be making down the road.
@Sean: I agree, but memorization only saves you a minute here and there when I can easily find the answer by asking Mr. Google. Concepts are more important in the broad scope of things.
To outline Philip Chu's Seven Habits of Highly Effective Programmers:
But seriously, read the original article.
If anyone listens to the Stack Overflow podcast, they are well familiar now with Jeff and Joel's debate over needing to learn C. I can see both sides of the argument, and though it's been beaten to death and is a humorous reference now, I think there is some validity to the underlying point. I don't necessarily advocate learning C, but learning some sort of lower-level language and the concepts that accompany it I feel are so very important. Getting closer to the metal and realizing how things work in the machine -- how instructions are executed, etc -- was eye opening for me in college. Further, starting out during the DOS/OS2/Windows NT cusp, I used C, then C++, heavily. Unlike today, there were many times having an underlying understanding of pointers, stacks, heaps and the like were critical.
A former colleague of mine who came up during assembler/COBOL days, but also moved easily into and through the VB, Java and .Net spaces, used to say that he thought every programmer should learn assembler first -- I will admit to seeing some value in that. (God help you, take no concepts from COBOL...)
So, to be way too long winded, I think there are some of these concepts that still apply today in a heavily interpreted and managed language world. Even .Net still has a stack and a heap that operate in a similar manner. I think the overall message when learning C, especially when I did, was that you had to be smart and efficient with your coding. Those concepts are certainly universal.
My take:
Reading other people's code
Writting "hobby code" to know more and more about any language
Solving puzzles(Mathematical, Logical, or Programming kind of puzzles)
Fail fast and fail loud.
The idea behind this is if you come across a data error you cannot fix (or an unknown state, or something that just cannot happen), halt! This prevents bad data from being stored or processed.
This of course is from a business application mindset, if something isn't correct with your GL data, don't save funky GL data.
python -c "import this"
The Zen of Python, by Tim Peters
Not only for Python. Print it. Frame it. Memorize it.