How to grow from a novice programmer to a (pseudo) expert

How to grow from a novice programmer to a (pseudo) expert

1. Summary

Recently, some colleagues who have just graduated asked me: "Do you have any tips when working? How can I become an expert quickly?"

I remember when I first joined the company and was training new employees, I discussed this question with other colleagues: How can I become a big shot 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.

I have been in Weibo's platform architecture department for quite a while. As the Spring Festival is coming, I would like to summarize my work since I joined Weibo. From a layman in Internet development to being able to design some architectures, troubleshoot some problems, and share some experiences, I have gained a lot and have many thoughts. I have also gradually realized the importance of ideas and methods. I would like to share them with you. It is mainly divided into three aspects: learning, doing, and thinking.

2. Learn to learn

Learning is undoubtedly one of the most important qualities for a programmer, especially in an industry as fast-changing as the Internet. It is not an exaggeration to regard learning as a large part of the job.

2.1.Self-directed learning

Recently I found that people around me are not unwilling to learn, but they are struggling every day about what to learn: simple ones are not challenging, complex ones are incomprehensible; old technologies are afraid of being outdated, and new technologies have no direction...

Let me talk about my experience after graduation. After graduation, I went to a medium-sized company. My job was mainly to do some XX management system and the like. There was no challenge and no technical skills were used. Basically, I used extjs on the front end and sql server on the back end. I had a stable job for a few years. In my spare time, I had nothing to do except WoW. I felt that it was not a good idea to stay idle like this. So in the next year, I used my time at work and after get off work to learn these things:

I was bored and wanted to make a small game. I found that most of the books related to games were in English and I couldn't understand them. So I gritted my teeth and translated the first few chapters of "Real-time Rending 3rd". At the beginning, I couldn't understand the preface. I could only look up the words in the dictionary one by one. I had to think about the author's meaning for several hours. After translating hundreds of pages of English books, I found that I had no problem reading English books, so I started to read books every day during my rest and idle time.

After reading the book on game engines, I went through the code of the irrlicht engine, and then copied a 3D rendering scene manager and a simple rendering engine.

I wrote an interpreter based on a scripting language for my own game engine. For this purpose, I read a lot of books on compilation principles and virtual machines, and learned about what a program is. I think this is something that has benefited me a lot.

When I was reading a book on compiler theory, I found that I lacked some knowledge of operating systems, so I read books related to the Linux kernel. After that, I bought a development board and modified the kernel every day. After graduation, I learned about the kernel's CPU scheduling, memory management, and file system, and how applications run on the operating system and how the operating system runs on hardware. This was also a very beneficial thing.

After reading about operating systems, I read books related to the network. Then I read the code of lighthttpd, wrote an http server under Linux in C, and implemented several network programming models one by one.

During the process of implementing the http server, I felt that my coding ability was still lacking, so I read the code collection again, then read the book on design patterns, and re-described each pattern in words based on my own understanding.

I also read a lot of books related to languages ​​and frameworks, which I won’t list here. You can refer to it here.

I divide the direction of study into three categories:

In order to work, you need to have the knowledge you need for your current job

Knowledge related to current job for advancement (depth)

Expand your horizons, gain knowledge not related to your current job (breadth)

After learning (1), you are just a skilled worker. 2 and 3 are the ways to improve yourself. With the improvement of knowledge reserves, it is easier to find similar knowledge to draw analogies when encountering new things, which speeds up understanding and makes it 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 experts who really have nothing to learn should not read this...)

Therefore, if you feel that there is nothing to learn, you can consider learning more in-depth knowledge (such as virtual machines or compilers), or completely different knowledge (new languages ​​or currently popular topics), or even completely irrelevant knowledge (simple practice of English reading, learning PPT typesetting, etc.). As your knowledge reserves increase, your shortcomings and future learning directions will become clearer.

2.2. Learning from history

Take Weibo as an example. During its development, Weibo experienced many twists and turns and gradually developed its current system architecture. The question many newcomers like to ask most is "How is online business being done now?"

This is a good question, but it is not good enough. In the programmer's world, there is rarely a "silver bullet" that can solve all problems. The current approach will be replaced in a short time. If you want to understand something, then pay more attention to "how it became what it is today." Learn to look at things from a developmental perspective and understand some of the lessons learned. You will gain much more than simply learning one thing.

So, how to learn from history?

Internal databases and wikis in a company often contain old information. When you first join the company, you are usually not too busy, and these databases are simply a treasure trove of information.

Internal sharing within the department, for example, when I first joined the company, I often listened to internal sharing such as "The Evolution of Weibo XXXX Architecture"

Ask yourself more often "Why is it designed that way?"

Old employees recall the good old days and flatter when they brag (:з」 ∠)

2.3. Learn from others

There are two extremes here.

Some people like to tinker with things by themselves without asking any questions, which is definitely not conducive to their own improvement;

Some people ask questions when they encounter a problem. This is also a problem. Not only does it waste other people's time, but more importantly, it shows that this person's approach to learning from others is wrong. What you want to learn from others is not a specific knowledge (you can learn knowledge by reading books), but learn other people's way of thinking.

But it is difficult to learn thinking patterns through communication. Later, I found a very simple way to learn: using catchphrases. Here are a few examples for you to understand:

“This is actually two questions.”

“Is there a better solution?”

“Can you give me an example?”

“Can you give a one-sentence summary?”

In addition to their catchphrases, many talented people have very distinct ways of thinking and principles of doing things. If you are lucky enough to work with a big shot in the industry, then congratulations! As long as you communicate more, observe more, and think more, your improvement speed 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. For example, when I design the architecture, I have to consider how to draw the architecture diagram. After writing the code, I have to deploy and test it repeatedly for several rounds before it passes. When checking bugs, I waste time scanning logs. People's energy is always limited. If you waste time on these things, you will have less time to improve yourself.

3.1. Practice, and more practice

There is a misunderstanding here: "Doing meaningful things" does not mean "only doing things you have never done before."

For programmers, writing code is the most basic of the basics. Coding standards, design trade-offs, and even handy IDE shortcuts all rely on daily trial and error and accumulation. It is difficult to understand them 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 or even architecture. This kind of design and architecture without basic ability can only be regarded as advanced fantasy at best, and most of them are abandoned before they are implemented, which is not very meaningful. The reason is that most of the things they designed are "difficult to make" or "not easy to use", just like taking the advanced mathematics exam after only reading the textbook once. Is it realistic? (Student masters, I was wrong...)

For example, a few years ago, when I was studying design patterns, I used Qt to make a comic reading application. I tried all the available patterns. Of course, there were many inappropriate uses. It was these inappropriate uses that made me think more deeply about object-oriented programming and design patterns, and I also had a new understanding of how to balance flexibility and complexity. After that, I took fewer detours when designing many systems, ensuring both time points and quality. If I had hoped to "think about it when I use it" at that time, I would probably have been trapped by the project and couldn't take care of myself.

3.2. Make good use of tools

Use tools to solve problems that can be solved by tools. Good tools can save a lot of time that can be used on more meaningful things.

The scope of tools is very broad, such as various Linux commands, various systems within the team, convenient applications, and even bicycles for commuting. As long as it can save time and improve efficiency, it is worth a try.

Here are a few things that have greatly improved my efficiency:

Dual monitors

Easy-to-use keyboard

Google (not Baidu! not Bing!)

Mac

Applications on Mac: idea, alfread, omnifocus, and even applications such as synergy and istats menus that have little to do with development itself.

I prefer to regard "using tools" as a life attitude: whether 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, which is still considerable.

(Of course, those who crack the app themselves to save money are also awesome...)

3.3. Improve time utilization

Time is the most precious resource for anyone who hopes to improve themselves. No matter how efficient you are, it is meaningless if you don’t have time to do it.

There is a widely circulated chart on the Internet: The cost of interrupting programmers. In fact, my daily working hours are very fragmented. After arriving at the company, I may constantly answer calls, be asked questions, be pulled into meetings, reply to emails, etc. I often feel confused about not having enough time or having nothing to do. Here I share my experience:

GTD can integrate a lot of fragmented time. In addition to getting things done, it is also helpful to complete context-related things together. For example, you can integrate several things you want to do in other offices into one trip.

Reduce meaningless time waste. For example, living near the company can save several hours a day for study or other things. (But if the saved time is used to check Weibo, it is not necessary.)

Another very interesting phenomenon: the registration fee for a software is only a dozen dollars, and the more expensive ones are hundreds of dollars. The added cost of all the tools used in daily life is less than the cost of a kidney, but many people still insist on the idea of ​​not using it unless it is cracked, and waste a lot of time for a few hundred dollars.

Working overtime can create a lot of time and effectively reduce the chance of being interrupted, but it can also put a great burden on the body and mind. Therefore, the work done overtime must be able to produce enough benefits for personal progress. If overtime is only used to deal with meaningless work, then there must be something wrong with the daily work.

Things can be divided into four categories: urgent but important, urgent but not important, important but not urgent, and unimportant but not urgent. There should always be important but not urgent things in the to-do list.

4. Learn to think

4.1. Further study

When there is a problem that cannot be solved, many people will feel intimidated or procrastinate. The typical mantra is "Let's just make do with it" or "Let's do it this way for now and study it later when we have time." Most people who say these things are not really that busy. Some people even told me that they don't have time to study while browsing Weibo... (Are you kidding me?)

It is actually very simple to overcome the fear of difficulty. Find a specific problem that you seem to understand but not quite, do everything you can to study the problem clearly, experience the pleasure of solving the problem a few times, and build up your confidence.

In fact, most problems do not involve any profound scientific principles, and they can even be solved by just flipping through a few pages of a book. However, if you do not delve into the problems, over time you will form a self-suggestion: these are the problems I understand, and those are the ones I don’t understand, and you will end up blocking your own path to progress.

When it comes to how to delve deeper, there are also a few tips:

When something happens, think more about why, and ask why repeatedly. When you think about a problem again after a while, you will often find that there are things you haven't considered before.

Questions should have clear answers, don't worry about philosophy or anything like that

Choose authoritative books or websites when searching for information to avoid being misled

Find someone to discuss with, or directly invite friends to join, so that you can communicate with each other and supervise each other

Share your results

Don't delve into everything, it will put too much pressure on yourself

4.2. Speak more, write more, and communicate more

I have a feeling in my daily work that people who have the habit of communicating and writing have clearer ideas and can be exposed to more viewpoints. This aspect is actually my weakness, so I will summarize a few points.

Every once in a while, you can summarize your recent work in written form, such as writing a reflection or continuously updating your resume.

There are two difficulties when writing: to summarize and abstract the things to be explained, to form a main line with unified views and clear logic; to consider things from the other party's perspective, to make things clear, and to avoid talking to yourself.

Before finding someone to discuss something, you should first have a basically complete idea in mind. Otherwise, most of your time will be spent on explaining principles and other things that can be done faster by looking them up on the Internet.

After the discussion, there should be a conclusion that can be clearly stated in one sentence and a clear 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. It can not only increase your knowledge, but also show your level, and leave a good reputation for being serious and responsible. Why not do it?

5.***

***Let me share my understanding of a programmer's self-cultivation. In my opinion, it can be summarized as: responsible and reputation-oriented.

Be responsible, to be more specific: Have you tested the code you wrote, have you used the framework you made, have you carefully weighed the designed architecture?

If you value your reputation, to put it bluntly: How can you have the face to deliver to others untested code, unused frameworks, and unweighed solutions?

I wish you all the best.

<<:  iOS 9 Learning Series: How UIStackView Makes Your Development Easier

>>:  Why is it so difficult to start a business? Here are a few key points where you may fail

Recommend

Re/code editor tries out iOS 9: Upgrading is not recommended at this time

Apple recently released a beta version of iOS 9 a...

A programmer's epiphany: The ideal programmer is only 6 more than you

I got into the programmer's door by cheating ...

Will GitHub's App be open source?

As early as the GitHub Universe conference in 201...

Xiaohongshu marketing method!

The "Insight Report on the Rise of Domestic ...

Tips for setting up advertising and promotion accounts!

Friends who have done SEM know that account build...