Everyone has the desire to grow, and there will be growth bottlenecks. The following question was asked by a reader:
How do you train to be a good programmer?
Firstly, I would like to tell you the background of this reader: he has worked for more than 3 years and is now doing background development in dachang. There are many programming masters around him, which is his goal to catch up with. In the last half year, he spent some energy on studying source code and underlying principles, but he always felt that these knowledge did not connect well with actual work, and his improvement was slow, and his learning motivation was getting worse and worse. I hope I can give you some suggestions.
I had a voice chat with him for half an hour, telling him some personal cases and those of colleagues around me. After the exchange, both sides have been inspired. So take a look at this and share it with you.
1. What is a “master programmer”?
I think it can be divided into three categories:
The first category: people with high talent and achievements, such as Qiubojun who can write WPS by himself, Zhang Xiaolong who developed E-mail Foxmail by himself, Zhang Yichun who has a great influence on the open source field.
Category 2: well-known and well-reputed technology giants, who have generally served in important positions in well-known companies, have pure love for technology, and are keen to share, such as Mouse Brother, Ruan Yifeng, You Yuxi, etc.
Category 3: the high-P or architect we look up to at work as a future prospect.
The first two are out of my range (aside from a brief encounter with Ratboy in the Amazon), so this article focuses on the third group. This is also the group that most readers care about most and can be set beyond the target.
This raises a new question: since we want to be a category 3 person, how can we give a relatively accurate and concrete definition of category 3 person? This is actually an interesting question, and the answer may vary from person to person, because “high or low programming level” is a relative concept. Let me start by saying what I think.
When I just graduated, the programming expert in my eyes was my colleague chao Elder brother, who was an architect of Amazon and the most skilled person in the team (later he achieved the position of the first amazon model in China, and is now a well-known giant in the circle).
Super brother is the kind of person who can handle a complex project (across multiple systems), from architectural design, to coding, to automated testing, to operations tools, and even writing documentation. Apparently, it’s the boss that this new grad boy idolizes.
Later, AFTER working for four or five years, I moved to the technical management route. Due to leading a team, I had a new perspective to look at people who are good at programming. Compared with the so-called PPT architects, and those who are full of technical principles while their coding skills are mediocre, I tend to give a more pragmatic definition of “programming expert” : ** That is, those who can achieve high efficiency, high quality and stable output in practical work. ** Looks easy, but in fact it is difficult. My detailed interpretation of this definition is as follows:
High efficiency: Be the Top programmer in the team, quickly understand complex requirements or problems, and have the ability to break down complex work into a series of simple sub-problems and solve these problems. They can start from the actual situation, have the ability to make wheels, but also have the consciousness not to make wheels.
High quality: Top in the team in terms of programming quality; able to think comprehensively about the rationality of design schemes, the rigor of coding, testing methods, monitoring operation and maintenance schemes, etc.
Stable output: adds limits to efficiency and quality. In my opinion, only quantitative change leads to qualitative change, and only those who have truly formed their own methodology and can consistently solve a class of problems rather than a single problem are considered masters.
You might say it’s too hard to do all three, but in the real world, there are people who can do something or something, and you can use them as a benchmark. Because being a “good coder” is just a goal we set, and it’s enough that you know what that goal is, not necessarily the same person.
2. How to understand the value of “low-level knowledge”?
To be a good programmer, basic knowledge is essential. This is a correct nonsense, not to expand the explanation. The real question for readers is: how do you connect the underlying knowledge with the actual work so that they complement each other?
Let’s take a concrete example. When I interview candidates who say they have done performance tuning, I like to ask: How did you locate and tune performance bottlenecks? What are your specific thoughts if you are faced with this problem again?
It is clear that this is a systemic engineering problem that can examine both the depth and breadth of technology. Not just application-layer code, but frameworks, middleware, virtual machines, networks and even operating systems used. Basic knowledge of performance indicators, the use of monitoring and pressure measurement tools, and systematic investigation and optimization methods, and so on.
If it’s a bad programmer, their answers usually fall into one of these categories:
1, the performance indicators are not clear, do not know what tools to use when facing problems, this kind of people are not up to standard application layer.
2. After initially locating a suspected bottleneck point, we started optimization, and finally solved only a shallow performance bottleneck problem, while the root cause was not reached.
3. Able to locate the root cause, but lack of in-depth thinking on the rationality of the solution, and do not pursue perfection. Finally, the performance problem is hidden again by using a curve solution.
Through this example, I actually want to make two points:
1. Without basic knowledge, your vision cannot touch the bottom things at all. Your thinking and ability can only stay at the application level forever, and the problems you can solve are limited.
2, read the source code, learning all kinds of principles, all these are just learning and consolidating knowledge of the process, truly reflects the programming level is the ability to solve problems, so how to turn knowledge into effective experience? That’s the key. It’s either not enough practice or not enough research.
Then, we come back to the question: how can we make the connection between the underlying knowledge and the actual work? If the connection is not good, which link is the problem?
You can start by thinking about some of the things that have helped your programming skills in the past. What do you think are the most important things that have helped you improve your programming skills? Is it a store of underlying knowledge? Not when you think about it, but the ability to identify problems. (Note: I say the most critical factor, not to deny that the underlying knowledge is not important.)
You can observe a very common phenomenon in work: which layer can you see on the same question? Which layer can a programmer see? Who can get to the heart of the problem faster? Who can create a series of problems? This is the ability to “see a problem”. There is layer upon layer of thought, layer upon layer of analysis, only when you realize that it is a problem worth digging into.
So how do you improve your ability to do that? In fact, it is a process of improving thinking ability, and I can’t think of any better advice than observation and deliberate practice. How does the multiviewer do it? Ask yourself more why when you have a problem? Are you thinking right? The cumulative level will naturally improve. When you have the ability to identify problems, you build a bridge between knowledge and experience that really complement and drive each other.
3. Tips for becoming a “master programmer”
Programming as a practical discipline, more hands-on problem solving is the most basic requirements, the more problems to solve, the more difficult, the ability to improve faster. In this process, if there is knowledge input (the store of underlying knowledge), and the thinking bonus (the ability to find problems), programming will improve more quickly.
Another group of people I’ve worked with say they’re making slow technical progress and don’t have challenges. However, when the team meets a technical problem, he is not willing to do in-depth understanding. He says he loves technology and longs for growth, but fails to take action. Such a person will never become a programming master.
True love comes from taking action, not making excuses or seeking comfort, which is an important distinction.
How to become a programming expert? In this way, it is actually a physical, mental and mental way to cultivate immortals.
Zero basic learning Java programming, you can join my ten years of Java learning garden, technical exchanges, resource sharing, answering questions, and I summed up the learning materials in the development work.