Bi Xuan is known to many people in the technology circle. He joined Ali in 2007. After more than 10 years of technical architecture evolution of Ali e-commerce, he created an important middleware HSF service framework of Ali and designed and led multiple teams to realize the remote multi-live architecture of Ali e-commerce. In 2011, we started to build ali-developed containers and a unified scheduling system that greatly improved resource utilization. Worked as an architect of Taobao platform architecture Department, senior technical expert of group core system RESEARCH and development Department, and head of Ali middleware.

Like a lot of Ali techs, she forgot her real name when she was famous. His name is Lin Hao. I have known Lin Hao for a long time, when he was still studying OSGi technology. I happened to share an OSGi application at QCon, and then I got to know him. He even gave me a signed book. He threw me a few days ago to write their own programmer growth route, said the old pool you many readers, see if this is valuable. It took me more than ten minutes to read the full text, delightfully. Bi Xuan combined with his ten years of actual combat experience in Ali, gave a programmer’s growth route.

If you want to be a good programmer, this article is for you (I’ve made some simple polish and revisions, and added some graphics to ease reading fatigue).

Ps, Bi Xuan is a biological professional, the first to write ASP, will do add, delete, change, check, this programming basis you see whether it is not as good as you?

From amateur programmers to professional programmers

Programmers just into the row, I think the most important is to cultivate themselves into professional programmers, my program started much later than their peers are in life, not to mention, today’s young people, I read university majored in biology, in front of the college basic is that there has been no contact with the computer, military training because it is boring, my roommates and I run every day to play in the school computer room, I’m still very impressive, and for the first time I walked into the room, others ask, do you want to play the Windows, or DOS, I it is completely a smear, then just remember in the room a bunch of people are in the practice of blind play, after military training, the blind down is the practice about, has strong interest, on the computer so freshman year are playing group installed, A little tinkering, a little understanding of computer hardware.

After my sophomore year, I bought some books and began to learn the three most popular webpage swordsmen at that time. I learned the basic skills of handwritten HTML and PS, and I also started to make websites for people in my spare time and summer vacation (PS: At that time do website really good money), may be that after a year or so, do static webpage is not good to make money, is not good to find internship work, so began to learn ASP, write some simple CRUD, do message board, forum these dynamic procedures, should be in this stage contact programming.

After graduation to join the shenzhen a company do the government industry software, a very by spectrum and give me the Leader of the space, make oneself in the years with good growth, finally became a professional programmer, generally speaking, the amateur or semi-professional programmers, majority is one, or a small team to develop, As a result, there is usually a great lack of development process, collaboration tools (such as JIRA, CVS/SVN/Git, etc.) and testing, while professional programmers are very professional in this aspect. In addition, professional programmers usually run systems for a long time, so they pay special attention to maintainability. This is something THAT I learned more about when I joined Ali. There’s a huge difference between a system that’s been running for 10 years and a system that’s been written for fun.

It’s hard to explain this, but it’s vague. There’s a concept, and I don’t think it’s too difficult to make the leap from amateur programmer to professional programmer based on interest.

The growth of programming ability

As a programmer, the most important ability is always the ability to program. From my own experience, I think the growth of programming ability mainly has the following parts.

1. Basic programming ability: able to use

Programming begins with learning the basic knowledge of programming language. No matter what programming language it is, there are many common basic knowledge, such as how to write the first Hello World, if/while/for, variables, etc. Therefore, I suggest that at the beginning of learning a programming language, It is better to read some documentation of the programming language itself, rather than to read some advanced books. When I learned Java, I read Think in Java, Effective Java and so on. It is really difficult to understand.

In addition to the document, programming is a great practice of live, so be sure to write more code, only in this way can truly skilled, and this is why I still feel that to let the interviewer during the interview it is important to write code, this process is very easy to judge familiar degree of writing code, because a lot of people will say that writing code is highly dependent on the IDE, In handwriting is difficult, but I definitely believe that writing code to write a lot of people, handwritten a not too complicated to run code is easy, even if like this more than three years I didn’t have written code, now let me write a less complex can run Java programs, or no problem, N years of writing code in front of the career makes a lot of things already thorough marrow.

I think the primary stage of programming ability will not be a problem for most programmers. Hard work is the core of this stage.

2. Intermediate programming ability: able to check and avoid problems

In addition to solving problems proficiently using programming language for the primary level, I think the first step for the intermediate level is to improve the ability to find problems.

In the process of writing code, the problem is very normal, how to effectively and efficiently troubleshoot problems, is among programmers usually can feel all the biggest gap in the programming ability, basic ability to solve the problem of easy has very high recognition in the programmer group, on the ability to check problems, first of all, to master some basic debugging technique, Easy to use debugging tools, such as jstat, jmap, jInfo in Java JDK, mat, gperf, btrace, etc., not in the JDK, to do a good job will be the first tool, in the problem is very typical, sometimes when we check the ability gap, It could simply be that someone else knows one more tool than you do.

Besides debugging techniques and tools, will check the problem of higher level and the advanced stage of programming ability to have the very big relations, is to understand the principle, a programmer who understand the principle of the level in question is a significant gap, I think a lot of students should be able to feel that, in some cases and find out the cause of the problem just because of effective tools, learning do not know why, I have trained many ali classmates on the method of Java troubleshooting. In this training, I often talked about how to cultivate the ability of problem solving. The most important thing is to be proficient. Many people end up being good at problem solving simply because they are familiar with the problem.

Like myself, screening ability of the problem is mainly in 2009 and 2010, the two years as taobao fire brigade (virtual team to deal with all kinds of problems and faults) dealt with many faults and problems, the members of the most recognized technology at that time the fire brigade and ali great god more, to learn from him to many problem screening techniques, and much more than, My troubleshooting ability is the primary kind. The most impressive thing is that once we checked an application with high CPU US. After we identified the cause of high CPU US caused by a certain input parameter of a piece of code, I could think of a way to continue the investigation is to go to the production environment to capture input parameters. But after reading the code for a while, Dolon gave me an input parameter. I ran it with this parameter, and sure enough, THE CPU US was very high. Ah, and this kind of case was not repeated once or twice, so I often told others that I needed to have a problem scene to troubleshoot the problem. But it’s entirely possible to look at the code and see the problem, and that’s the fundamental difference.

Programmer in addition to check the problem, more is in the process of writing code will be very good to avoid the problem, everyone is the most easy to understand when you write the code to handle all kinds of exceptions, but here is usually very big disparity, programmers write a positive logic code, in most cases even if there is gap, also too won’t big, But in the process of how to well deal with the possible exception, at this time of the capability gap is very obvious, a lot of time to handle the exception in a piece of code logic part of the amount of code will be more than normal logic, I often say that a good programmer and ordinary programmers gap, a lot of the time don’t need to look at what flying architecture diagram, Instead, just show a little bit of code.

Take a small example for you to feel, there was a serious fault in that year. The reason was that one of the input parameters was an array, and the value in the array was used as the parameter to check the database. As a result, a large array was entered before, resulting in a large amount of data was checked from the database, and the memory ran out. Many programmers now see will understand the input, input protection check, but similar to this case in my own troubleshooting experience really encountered a lot of problems.

In the intermediate stage, I would recommend that you deliberately cultivate these two abilities as much as possible to become a good programmer who can write high-quality code and effectively solve problems.

3. Advanced programming ability: understand advanced APIS and principles

In my own experience, IT was only after I had been writing Java code for many years that I really began to learn and master some of the more advanced APIS of Java in more detail. I believe most Java programmers do the same. I started writing commercial system code in Java in 2003. But it was not until I joined Taobao in 2007 that I began to learn the API of Java IO communication and concurrency very seriously. Although I had learned and written some such codes before, they were just superficial.

Of course, this is often due in large part to the relevance of the work. Most programmers who write business systems do not need to use these apis, so it is difficult to understand these relatively advanced apis, but they are essential to truly understanding a programming language.

How do you learn? In the absence of scenes, we can only rely on ourselves to create scenes for learning. I think this problem is not a big problem as long as there is enough interest, after all, there are various open source, which can help us to create opportunities for learning. For example, to learn Java NIO, you can build your own framework based on the NIO package, and then compare it to Netty to see what is not as written as Netty. This will help you understand the nature of the technology behind it.

In the process of learning advanced API and troubleshooting problems, IT is very important for me to understand the operation principle of programming language more and more. Behind me began to learn Java compilation mechanism, memory management, thread mechanism, etc., to me this not trained programmers could learn that it is difficult because of the lack of basic, but the original rational thing learned, to their own programming ability quality, including the ability to later to learn other programming languages.

The best way to learn the principle is to look at some related knowledge books first, and then to look at the source code, so as to really master, and then continue to practice. Later, in the process of writing code to check the problem, more combined with the master principle, in order to do N years will not forget.

Chi teacher they do geek time there are a lot of basic and rational courses, are summed up and comb the knowledge of technology masters, very worth reading, after reading these elite columns to see the source code or eat a tome, will be a lot easier. We didn’t have that back then.

There are no shortcuts to developing your programming skills. I’m a big fan of the 10,000-hour theory. It’s much better to have someone to mentor you at the intermediate and advanced levels, or to work with great programmers. However, I think it is a bit like reading books. After a certain stage (such as high school), the day becomes the most important watershed. When you reach the limit, it’s hard to break through.

However, like most industries, most people are not to fight talent, just need to fight hard.

4. Growth of system design ability

With the exception of a few programmers who will move into more sophisticated fields, such as the Linux Kernel and JVM, the majority of programmers will increasingly need system design skills in addition to growing programming skills.

Usually a programmer with good programming skills will, after a certain period of time, take on the work of a module, and then be responsible for a subsystem, a system, a larger system that spans multiple domains, etc.

In the third year of my work, I began to undertake the design and implementation of a process engine, which was not a small system but also the core part of the project at that time. That stage I learned some basic knowledge of the system design, such as the need to clear the goal of the whole system, module division and responsibilities, key object design, etc., rather than up and started to write code, but at that time because I was a person to write the whole system, so it actually feel about design and also do not have so strong feeling.

In the years after that, I started to be responsible for more systems, but it seemed that I didn’t grow much in system design, until ali’s experience made me feel more and more experienced in system design. Once WHEN I did an internal sharing in Ali, I said that my growth in system design ability was mainly due to three experiences: responsible for system design in professional fields; responsible for professional system design in trans-professional fields; responsible for the design of ali e-commerce system architecture-level transformation.

The first experience was that I was in charge of HSF. HSF is a system built from 0, which is mainly used to support the framework of servialization. It is a very professional system, and it is just a small subsystem when viewed from the whole system of Taobao e-commerce.

1. The depth of professional knowledge is very important to the design of such a system in a very professional field. In the early design of several frames of HSF, I did not have a good idea about how to combine service consumers/providers with the existing framework, and I also repeated several times in the design of load balancing, which was mainly caused by my poor grasp of this field at that time.

2. Too technical. During the HSF phase, I put a lot of effort into introducing OSGi and making it dynamic in one of the releases for sentimental reasons, which turned out to be a very, very wrong decision. From this point, I really understand that we must have a clear goal when designing the system, and the most important goal is to combine with the development stage of the company.

3. Sustainability. As a system to run for many years in the production environment, how to make the system stable and efficient operation for a long time is crucial to the design stage. Here is the lowest example. When I designed THE HSF protocol at the earliest, there was no version number in the header of the protocol, which made each upgrade very complicated. Another typical example is the lack of service Tracing design in THE early stage of HSF, which led to the later redesign and took several years to implement. Another example is the lack of Filter Chain design in the early stage of HSF, which makes it very inconvenient to expand and customize.

The second experience is doing T4. T4 is Ali container based on LXC technology. Different from HSF, it is a multi-domain system, including container engine and container management system on a single machine. Container management system provides API externally, through which other systems or users manage containers. The development process of this system is also a variety of mistakes, the main reason for the mistakes is also due to the lack of deep grasp of the field. During the days of T4, I learned how to design such a system across multiple professional fields, how to better divide module responsibilities and design interactive logic. That experience gave me the confidence to do something on a larger scale.

The third part of my experience was working in alie-commerce in different places, which was a huge challenge for me because it was a huge system. Although I participated in the major technical transformation from Taobao E-commerce 2.0 to 3.0 when I was an HSF, as we all know, there is a big difference between participation and self-leadership. This structural transformation involved technical teams in various professional fields of Ali E-commerce. At this stage, I mainly learned the following:

1, subsystem responsibility division, in this large technical solution, it is easy to appear some parts of the responsibility overlap and conflict, this time how to divide the subsystem, it is very important. As a large architect, select teams based on their responsibilities and sustainability.

2. The major responsibility of a large architect is to control system risks. For such a large system, it must be jointly designed by architects from multiple professional fields and large architects to ensure that the most important risks of the system can be controlled in the process of implementation. This is when I really understood the system design principles. Design principles are designed to ensure that each subsystem is designed to be followed and considered, rather than an empty rule. For example, in remote live architecture, the most important thing is how to control data risk, which needs to be written in the principle. The most basic principle is to accept system unavailability, but also ensure data consistency.

I’ve seen a lot of design principles in system design that are either generic or generic and worthless. The design principles should actually reflect the architect’s understanding of the goal (for example, the degree to which offsite living is considered offsite is a concept to begin with, and is a matter of constant interpretation, as well as ensuring that the technical aspects of the design meet the goal). The principles of technical solution selection should be ensured to be reflected in the detailed design solution and implemented accordingly.

3, comprehensive consider problems, such as different live big architecture transformation, will be involved in business level, technology level, basic infrastructure level, it should be considered the execution of the rhythm effort, machine cost, infrastructure layout, stability control, etc., this complexity will be more than a small system or independent system several orders of magnitude.

The growth of system design capability is most important in two aspects:

First, specialize in one or two technical areas and then try to broaden your knowledge beyond, for example, writing code. You should also know how and where the system is deployed, what the environment is like, and how it relates to the system as a whole. Like myself, it was only after I joined the infrastructure team that I became more aware of the fact that sometimes a software decision can lead to a huge hardware, network, or machine room investment in the infrastructure. Sometimes it just takes a few software tweaks to avoid these problems. Doing research and development, followed by operations, would be a good way to expand knowledge.

Second, practice your ability to do tradeoff, which is quite difficult. To do tradeoff requires comprehensive consideration of various factors, but it is also the most critical responsibility of all architects. You can turn back when he’s doing all kinds of system design under the reflection of what is tradeoff, this is the best experience, listen to some experienced architects to share their logic behind the choice will be very helpful, especially if you are in the same challenge stage, the light of limited help to the architecture results in fact most of the time listening to the final.

Programmer pyramid

I think the key value of a programmer is in the product, and it’s a great honor to be labeled as a product. The scale of the impact of a work determines the level of the pyramid, so that’s how I understand the programmer pyramid.

Spire: a tower with world-class works: a tower with national works: a tower with corporate works

A programmer without work is not a good programmer. An entrepreneur who doesn’t have a product signature is not a good entrepreneur.

Of course, in order to create a work, only the above two abilities are not enough, the most important point in the work is the judgment of business and technical trends. Hopefully, readers of this article will have the opportunity to create a world-class product that will contribute to the development of the Internet and software.

Finally, I recommend bi Xuan’s official account. He often shares his thoughts and thoughts.

Recommended recent articles:

The most popular programming language of 2019 has three elements of concurrent programming