How to grow from a rookie programmer to a (pseudo) master

1. Summary

Recently, some colleagues who have just graduated recently asked me: "Do you have any tips when you are working? How can you quickly become a master?"

I remembered that when I first joined the company, I also discussed this question with other colleagues when I was training for new employees: How can I become a leader in the industry? At that time, I just thought that interest was the best teacher, and I didn't think much about ideas and methods.

It’s not too long since I joined the Weibo Platform Architecture Department. Taking advantage of the Spring Festival, I summed up my work since joining Weibo. From being a layman in Internet development, I can now design some structures, troubleshoot some problems, and share. I have gained a lot of experience, I have a lot of feelings, and I have gradually realized the importance of ideas and methods. I would like to share it with you here. It is mainly divided into three aspects: learning, doing and thinking.

2. Learn to learn

Learning is undoubtedly one of the most important qualities of a programmer, especially in a rapidly changing industry like the Internet, it is not an exaggeration to regard learning as more than half of the work.

2.1. Self-directed learning

Recently, I found that the people around me don’t want to learn, but they are struggling with what to learn every day: simple ones are not challenging, complex ones are incomprehensible; old technologies are afraid of being outdated, new technologies have no direction…

Tell me about your experience after graduation. After graduation, I went to a small and medium-sized company. The main work is to do some things like XX management system. Set a sql server to solve. The job has been stable for a few years, and I have nothing to do in my spare time except wow. I feel that it is not the way to be so idle, so in the next year, I used the time to catch fish at get off work and take a break from work to learn these things:

I was bored and wanted to make a small game. I found that most of the books related to the game were in English. Word by word, it takes a few hours to figure out what the author means in a sentence. After translating hundreds of pages of English books, I found that I had no trouble reading English books, so I began to read books every day with rest and fishing. After reading the game engine book, I read the code of the irrlicht engine, and then I copied a 3d rendering scene manager and a simple rendering engine. I wrote a scripting language-based interpreter for my game engine. I read a lot of books on compilation principles and virtual machines, and learned what a program is. This is something I think is very profitable. When I read the book on the principle of compilation, I found that the knowledge of the operating system was somewhat lacking, and then I read the book related to the linux kernel. After that, I bought a development board and modified the kernel to play every day. After graduation, I learned about the cpu scheduling, memory management and file system of the kernel again. I learned how the application runs on the operating system and how the operating system runs on the hardware. This is also a very profitable thing. After reading the operating system, I followed the network-related books, and then read the code of lighthttpd, wrote a http server under Linux in C, and implemented several network programming models one by one. In the process of implementing the http server, I felt that my coding ability was still lacking. I flipped through the code, read the book on design patterns, and re-described each pattern in words with my own understanding. In the middle, I also read a lot of books related to languages ​​and frameworks, so I will not list them one by one. You can refer to here. I divide the learning direction into three categories:

In order to work, the knowledge necessary to satisfy the current job In order to improve, the knowledge related to the current job (depth) To expand the horizon, the knowledge not related to the current job (breadth) After learning (1), you are only a skilled worker, 2 and 3 are The way to improve oneself, along with the improvement of knowledge reserves, it is easier to find similar knowledge to make analogies when contacting new things, speed up understanding, and it is easier to grasp the essence. If you are struggling with "what to learn" every day, it can only mean that you have learned too little. (The big cows who really have nothing to learn should not read this...)

So, if you feel that there is nothing to learn, then you can consider learning more in-depth knowledge (such as virtual machines or compilers), or completely different knowledge (new languages ​​or current popular directions), or even Completely irrelevant knowledge (just practice English reading, learn ppt typesetting, etc.). With the increase of knowledge reserves, one's own deficiencies and the direction of future learning will become clearer.

2.2. Learning from history

Taking Weibo as an example, we have experienced many twists and turns in the development of Weibo, and gradually derived the current system architecture. The question that many newcomers like to ask is "How are you doing online now?"

This question is good, but not good enough. In the world of programmers, there are few "silver bullets" that can solve all problems. The current practice will be replaced soon. If you want to understand one thing, then pay more attention to "How did it become what it is today?" "Bar. Learning to look at problems from a developmental perspective and understanding some of the experiences and lessons that have been experienced will yield much more than simply learning one thing.

So, how to learn from history?

The internal databases, wikis and other metropolises of the company have old materials. Most of them are not too busy when they first joined the company. These databases are simply endless treasures to be shared within the department. For example, when I first joined the company, I often listened to "Weibo XXXX For internal sharing such as "architecture evolution process", ask yourself "why is it not so designed" when old employees remember bittersweet and bragging, please flatter a few words _(:з" ∠)_

2.3. Learning from others

There are two extremes here,

Some people like to keep their heads down and don’t ask anything, which is definitely not conducive to their own improvement; some people ask questions when they encounter problems, which is also a problem and waste other people’s time. The idea of ​​​​is wrong. It is not a specific knowledge to learn from others (you can solve it by reading a book), but to learn the way of thinking of others. But the way of thinking is difficult to learn through communication. Later, I found that there is a very simple way of learning: mantras. Here are a few examples for you to experience:

"This is actually two questions" "Is there a better solution" "Can you give an example" "Can you give a one-sentence summary"

In addition to mantras, many excellent people will have very distinct ways of thinking and principles of doing things. If you are fortunate to work with the big cows in the industry, then congratulations, as long as you communicate more, observe more, and think more, the speed of improvement will increase by several orders of magnitude.

3. Do more meaningful things

Some people waste their time on things that have nothing to do with the problem itself. For example, when I want to design the architecture, I have to consider how to draw the architecture diagram. After writing the code, I have to repeatedly deploy and test for several rounds before passing, and I waste time when checking bugs. on the scan log. Human energy is always limited, wasting time on these things will reduce the time for self-improvement.

3.1. Practice, more practice

Here's a misunderstanding: "Doing something meaningful" doesn't mean "doing only what you haven't done."

For programmers, writing code is one of the basic skills. Coding specifications, design trade-offs, and even easy IDE shortcuts all depend on daily trial and error and accumulation. It is difficult to comprehend through a few books or a few days of training. .

I have seen some people start designing some small projects after writing code for a year, and then they can't wait to shift their focus to design and even architecture. This kind of design and architecture without basic capabilities can only be regarded as high-level obscenity at most. , Most of them were abandoned before they landed, which is of little significance. The reason is that most of the designed things are "not easy to do" or "not easy to use", just like taking the advanced mathematics exam after reading the textbook once, is it realistic? (Scholars, I was wrong...)

For example, in the process of reading design patterns a few years ago, I used qt to make an application for reading comics, and I tried all the patterns that could be used. Of course, there are many inappropriate places, and these are inappropriate. The place made me think a lot more about object-oriented programming and design patterns, and have a new understanding of how to trade off flexibility and complexity. After that, I took a lot of detours when designing many systems, which not only guaranteed the timing and quality. If you counted on "talking when you use it" at that time, you might have been trapped by the project and couldn't take care of yourself.

3.2. Make good use of tools

Use tools to solve things that can be solved by tools, and good tools can save a lot of time on more meaningful things.

The scope of tools is very wide, such as various commands of linux, such as various systems within the team, such as smooth applications, and even bicycles to and from get off work. As long as it saves time and improves efficiency, it's worth a try.

Here I list a few things that have greatly improved my efficiency:

Dual-screen display keyboard google (not baidu! Not bing!) mac applications on mac: idea, alfread, omnifocus, and even synergy and isats menus and other applications that have little to do with the development itself. I prefer to use "tools" as a life attitude: do you want to focus your life on meaningful things. If you agree with this point of view, then think about the investment and return ratio, it is still very impressive.

(Of course, the great god who cracks the application by himself in order to not spend money is also very popular...)

3.3. Improve the utilization of time

Time is the most precious resource for all those who are looking forward to improving themselves. No matter how efficient it is, it is meaningless if there is no time to do it.

There is a widely circulated picture on the Internet: the cost of disturbing programmers. In fact, my daily working hours are very fragmented. After I come to the company, I may keep answering the phone, being asked questions, being pulled to meetings, replying to emails, etc.; I also often have the confusion that there is not enough time or nothing to do, share here Take a look:

GTD can integrate a lot of fragmented time. In addition to getting things done, it can also be helpful to get contextual things done together. For example, combine several things you want to do in other offices into one trip. Cut down on pointless waste of time, such as living next to a company and saving a few hours a day to study or do other things. (But if the time saved is used to swipe Weibo, then there is no need.) Another very interesting phenomenon: the registration fee for a software is only 10 dollars, which is a few hundred dollars more expensive. The cost of all the tools is not as expensive as a kidney 6, but many people still insist on the concept of not using it without cracking, and waste a lot of time for a few hundred dollars. Overtime can create a lot of time and can effectively reduce the chance of being interrupted, but it will also bring a lot of physical and mental burden. Therefore, overtime must be able to produce enough benefits for personal progress. If overtime is just for meaningless work, then there should be something wrong with the day job. Things can be divided into four categories: urgent and important, urgent and not important, important and not urgent, and not important and not urgent. There should be important and not urgent things in the todo list at any time.

4. Learn to think

4.1. In-depth study

When there is a problem that cannot be solved, many people will feel fearful or procrastinate. The typical mantra is "just use it like this" or "do this first, and then study it later". Most of the people who say these words are not I'm really so busy, some people even told me that they don't have time to study while swiping Weibo... (Are you kidding me?)

To overcome the fear of difficulties is actually very simple. Find a specific problem that you don’t understand but don’t understand, try your best to study the problem clearly, experience the pleasure of solving the problem several times, and build up self-confidence.

Most of the problems do not actually have any profound scientific principles, and they can even be solved by turning over a few pages of a book. However, if you don’t get into the problem, you will form self-suggestion over time: I understand these problems, and those I don’t understand. Blocked the way to progress.

When it comes to how to go deeper, there are also a few experiences:

When things happen, think about why, and ask why repeatedly. Many questions that seem to be understood will be re-thought after a while, and you will often find that there are areas that have not been considered before. There must be clear answers. For philosophy and the like, don’t worry about choosing authoritative books or websites when looking for information to avoid being caught. Misleading to find someone to discuss, or directly pull a small partner to join the team, you can communicate with each other, and you can supervise and share your results with each other. Don’t go into everything, it will put too much pressure on yourself

4.2. Talk more, write more, communicate more

In daily work, there is a feeling that people with communication and writing habits will have a clearer mind and more viewpoints. This aspect is actually my weakness, and I can summarize a few points of view.

From time to time, it is best to summarize your recent work in writing, for example, to write an opinion, or to continuously update your resume. There are two difficulties when writing: summarizing and abstracting the things to be explained, forming a unified point of view and conditioning A clear main line; consider the other person's point of view, make things clear, and avoid talking to yourself. Before looking for someone to discuss, you must have a basic and complete idea, otherwise most of your time will be spent on things like explaining the principle and searching the Internet faster. After the discussion, there should be a conclusion that can be explained in one sentence and a clear description of the time point. Some people like to dwell on things like "this is not my problem, why should I deal with it". In my opinion this is a great opportunity. Not only can you increase your knowledge, but also show your level, and you can also leave a good reputation for being serious and responsible. Why not do it.

5. Finally

Finally, I would like to share about the self-cultivation of programmers I understand. In my opinion, it can be summed up as: responsible, reputation.

Responsibility, to be more specific: Have you tested the code you wrote, have you used the framework you have built, and have you carefully weighed the designed architecture.

Reputation, let's put it more directly: code that has not been tested, framework that has not been used, and solutions that have not been weighed have the face to be delivered to others.

Share with you. Original source: Enter the link description Author: Enter the link description

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325124556&siteId=291194637