Have Emacs, Will Hack CEO at Gigantic Software (2006-present)and Kiran Kannar, CS grad student, University of California San Diego
First of all, I agree with Michael O. Church’s accurate definition of a good programmer, and I think it may become a reference tool for HR candidates (I suspect he will hate me for saying this).
In programming, like any other human activity, there will always be geniuses or prodigies on the right side of the normal distribution, most people in the middle, and a few on the far left. I believe that the only people who can’t learn to program are those with intellectual disabilities, and they can’t participate in other human intellectual activities
So, if you were in the middle of a normal distribution, would you be a great programmer? To be good at something you first need some basic skills.
Jeff Schaffzin has a good analysis of the importance of having a good logic. The core activities of programming include the mindset of the language you are using and the mindset of the problem you are trying to solve. This is why Seymour Papert, who uses Piaget’s constructivism theory to teach students to learn programming, is so successful. It constructs students’ thinking mode by letting students design and optimize the program themselves. Right
In my opinion, this is why Java and C++ taught by many computer science majors fail. These programming languages do nothing to construct and expand mental models, and the students who don’t fail are usually the ones who already have programming mindsets, and the other students don’t have the opportunity to develop their mindsets and then tell them they can’t program
Two other important standouts from the Constructivist Programming Learning Camp are one run by Alan Kay and PLT TeachScheme! Project (now known as ProgramByDesign)
My first real exposure to programming was in high school (aside from a few BASIC programs I had no idea what I was typing as a kid), when I took an introductory computer science course that was also a TeachScheme! At the end of the class I was able to write programs to solve basic problems, but I wasn’t interested in programming at the time, and I didn’t get interested in it for years.
An important beginning of my programming journey: a motivation. My motivation was when I discovered the SICP book that the program could be so beautiful and logically simple
I don’t claim to be a good programmer or even a great one, but I’ll explain some of the techniques I’ve used to get on my way to being a great programmer
When we’re talking about how to do something, here’s something to help you. I recommend reading George Leonard’s Mastering. What are the key points of the book
- If you want to become an expert at something you need to practice
- Regular and consistent practice is most effective
- The principles are everything, and the greatest achievers spend a lot of energy perfecting the fundamentals
- A good computer practitioner does not stop learning. As soon as you start to become complacent with your technology, you start to slide into mediocrity
In before I start planning my way towards a good programmer, my motivation is no progress, I think I’m good enough, so I didn’t go to try to improve myself, I also found the other points of interest at the time, business and psychology, I even try to put the professional direction of business, I have registered the MBA program at the time, That’s when I found George Leonard’s book and knew I was wrong.
So in June of this year I dropped out of business school to revive my plan to become a good programmer. Instead, I evaluated what I was doing right and wrong so far to reach my goals: ##### What I was doing wrong:
- There is no regular and consistent practice
- Thinks I know the basics
- No sense of competition
- Not doing well in math
To solve the first problem, I used the “Seinfeld technique”. I tried to finish one task a day in the open source software projects I worked on, and I found that the best way to do one thing was to use the “Hemingway technique”, which left one task or sub-task at a time for the next day, so that it was easier to contribute.
Second, I decided to go back and relearn data structure principles and algorithms, spend time reading about principles that were too “basic” for me, and relearn areas of computer science that I didn’t cover
I also tried to simplify my programming style. Everyone agrees that simplicity is good, but now whenever I have to make a decision to design my program, I tell myself (a trick from Mastering) : What’s the dumbest way to implement it? I find that I’m smartest whenever I try to simplify, so I force myself to write the dumbest implementation so I can come up with the best solution when I simplify
The exercise of pretending to be stupid allowed me to abandon any programming paradigm or programming taboo. Now I write code that is not “smart” or dogmatic but really bad, but by the end of the code is simple and easy to understand. I used to think functional programming was better than object-oriented programming, but now I think it’s bad
Point 3 is new to me, but it should be obvious. , after all, a good programmer is relative only with other people than you know you are in which one end of the normal distribution, I’ve never been interested in programming contest before (I have only been to two times, the last time was in 2007 the international conference on Lisp) now I plan to start preparing for a TopCoder competition, I have put off some other plan, I don’t know how long it will take for me to get better, but I think I will (my ILC07 project has the highest score and fastest running time)
Fourthly, it should be obvious that one of my bachelor’s degrees was in basic math, and I think there are only two things I didn’t do well in college: sex and math
##### I do the right thing
-
Learn from the best
-
Learn from everyone
-
Spend time on ambitious projects
-
Niels Abel said that the key to his learning was to learn from his teacher rather than from his students
I’m a huge fan of MIT computer science courses, and I think the three best computer science books are Abelson and Sussman and Sussman’s The Construction and Interpretation of Computer Programs, Introduction to Algorithms by Cormen, Leiserson, Rivest and Stein, Principles of Computer Design by Saltzer and Kaashoek
A good computer science book, paper and monographs from the 1950s, ’60s,’ 70s and ’80s are full of insights that will never go out of date. In college, I came to the conclusion that computer science books were published before 1990, A recent project is to read all four chapters of The Art of Computer Programming
This seems to contradict the previous point, but once you know what’s important to you and what’s not, you can evaluate other people’s ideas so that you can discard or learn from them, but unfortunately does every discussion involve a brilliant argument
And number three and this is very important, if you want to do a project and someone tells you it’s hard, you need to do it. If you make a good project, by definition you will be a good programmer. Don’t prioritize writing small and simple projects. You will have to solve many small and simple projects in a large project.
Doing a difficult and ambitious project means that is likely to fail, one of the most common failure is out of time, you can be free in a long-term project to avoid this, I really spent a year in my free time, within the scope of the long enough, major life changes and changes in priorities will get in the way, If I get stuck in a technical problem and can’t come up with a good solution, I will lose it for a while until I get along with a satisfactory solution before coming back. So, the only reason to throw out a project is because it doesn’t need my time
One of the downsides of open source software is that it prevents your small, simple programs from progressing to open source, but you can benefit a lot of people by making a single contribution, all of which are programmers doing what you love and making you better at the same time
I can’t say it’s guaranteed success or that it’s the best way to do it, but if you have a good idea, share it