The first two programmer growth route articles are more popular, decided to write a new integration, I hope that they and everyone can grow together in this road better, this article mainly about the hard power of programmers ability growth, soft power those not to talk about.

From amateur programmers to professional programmers


Programmers just into the row, I think the most important is to cultivate themselves into professional programmers, I started much later than their peers are programmers, 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: can 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, May simply because other people than you know a tool, in addition to 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, Some time to find out the cause of the problem only because effective tools, learning don’t know why, I gave a lot of ali’s classmate trained Java screening problem, in this training, I often also talked about the cultivation of the ability to check the problem is mainly a skill, to try to give yourself some will write a program, more positive look at the others how to check the problem, More positive to participate in the screening problem, many people finally find problem ability most simply because “without him, but the hand cooked”, 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) members to deal with a lot of faults and problems, At that time, the fire brigade also had Doron, ali’s most recognized technical god, from whom I learned a lot of troubleshooting skills. Compared with him, my troubleshooting ability was elementary. What impressed me most was that once we checked a problem with high CPU US. We two is a piece of code to locate at the time of some sort of input parameters can cause the CPU us after the cause of the high, I can think of to continue to check method is to produce environmental stresses the input parameters, and then use parameters to local debug to see what reason be, but many long watching for a while after the code, gave me an input parameter, I take this parameter a run, Sure enough, CPU US is very high, alas, and this kind of case is not once or twice, so I often tell others that I need to have a problem scene to troubleshoot the problem, but it is completely possible to see the problem by looking at the code, this is the essential gap.

    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, And only show a small piece of code can, for a small case everyone feeling, was a serious fault, finally find out the reason is that the input parameters in one array, the array of values as a parameter to check the database, the results earlier entered a large array of lead to look up a large amount of data from a database, memory, Many programmers will now understand the protection check of input and output parameters, but I really encountered a lot of cases like this in my own troubleshooting experience.

    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 written Java code for many years that I began to learn and master some of the more advanced APIS of Java in a more detailed way. I believe that most Java programmers also do the same. I started to write code for commercial systems in Java in 2003, but after I joined Taobao in 2007, Began to be very serious study Java IO communication, concurrent these parts of the API, despite previously learned also wrote some of this code, but is completely fur, of course, these usually have a large part of the reason is the correlation work, most of the basic don’t need to write business system programmer might use these, Will be very difficult due to the relatively advanced some API, but the API to a true understanding of a programming language is important, however, I think in the previous programmer route I also speak to this part of the article and in the absence of scenarios, are on their own to create scenarios to study well, I think as long as there is enough interest, the problem is not big, After all, now there are various open source, these can be very good to create opportunities to learn, for example, learn Java NIO, you can based on the NIO package framework, and then compare Netty, see which is not as good as Netty, this will be very helpful to real understanding.

    In the process of learning advanced API, and troubleshoot problems in the process of my own more and understand it is very important to understand the operation principle of the programming language, so I went to the back of the stage to start learning the Java compilation mechanism, memory management, thread mechanism, etc., for me this not trained to learn these will be harder to many because of the lack of basis, But these more rational things to learn, their programming ability will have a qualitative improvement, including the ability to learn other programming languages, the best way to learn these principles I think is to look at some books about related knowledge, and then go to look at the source code, so as to really better master, Finally, in the process of writing code in the future, in the process of checking the problem more combined with the master principle, in order to do even after N years will not forget.

On the growth of the programming ability, I don’t feel any shortcut, very positive theory, 10000 hours in the intermediate and advanced stage if someone give directions or work with good programmers, will be good very much, but I think this and read a bit like, to a certain stage (high school), for example, after day branch become one of the most important watershed, but like most of the industry, Most cases are not to spell talent, just need to spell hard work.

The growth of system design capabilities


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

Usually a programmer with good programming skills, after a certain period of time, will start to take on the work of a module, then take on a subsystem, a system, a larger system across multiple domains, etc.

Myself in the third year of work began to assume a process engine design and implementation of the work, is a not small system, and also is the core part of the project at the time, the phase 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., I didn’t come up and start writing code, but at the time I was writing the whole system by myself, so I didn’t really have a strong sense of design.

A few years after that is also responsible for some systems, but the overall feeling as if she had not so much on the system design of growth, until in ali’s experience, will dare to himself on the system design have more and more experiences (References in an article I made 14 fault on system design, you can see me a bunch of detour), do share in ali once, Speaking of my growth in system design ability, I mainly derived from three experiences: responsible for system design in the professional field; responsible for the design of professional system across the professional field; 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 scratch, which is mainly used as a framework to support servitization and is a system in a very professional field. When put into the whole taobao e-commerce system, it is actually a very small subsystem.

1). To design such a system in a very professional field, the depth of professional knowledge is very important. When I designed several frames of HSF at the very beginning, I failed to design how service consumers/providers should integrate with the existing framework, and I also repeated several times in designing load balancing. This is mainly because I was not deep in this field at that time.

2). Too technical, in which stage, out of feelings, in a version devoted great energy to the introduction of OSGi, and to be dynamic, the later proved a very, very wrong decision, from this point I really understand when designing the system must want to clear the goal, the goal is very important and company development stage;

3). Sustainability, as a must in production system is run continuously for many years, how to make it more sustainable development in the future, this is essential for the design phase, the most low example is the earliest design HSF agreement, agreement head unexpectedly has no version number, resulted in upgrades are extremely complex, The most typical example is that HSF lacked the design of service Tracing in the early stage, which took several years after it was found that this place was very important. For example, HSF lacked the design of Filter Chain in the early stage, which made it very inconvenient to expand and customize.

The second episode, do T4, T4 is based on the LXC ali’s container, it’s different from the HSF is that it is actually a field across multiple systems, including the container on the single engine, container management system, container management system provides API, or other system user management by the container, the system development process is also a variety of mistakes, Make mistakes but also for field control is not deep, the main reasons for doing the T4 days, learn to one of the most important is how to design this across multiple systems in the field of professional, better classification module to function, design of interactive logic, this experience yourself is more important to me is I have to do more some of the system architecture of confidence.

Ali electricity the third episode, do different live, this is true for me to do a huge system of architects, although when I used to do HSF is involved in taobao electricity 2.0 3.0 major technological transformation, but participation and their dominant, there is a big difference between this architecture ali electricity transformation involves many different professional technical team, At this stage, I learned the most important things:

1) division of responsibilities of subsystems. In such a large technical solution, it is easy to have overlapping and conflict of responsibilities in some parts, so it is very important to divide subsystems. As a large architect, the team should be selected from the responsibility and sustainability of the team.

2). The architect’s main duty is to control the system risk, for this kind of large system, must be more professional architect and architect to design, how to ensure that in the process of execution for the system is the most important risk can be controlled, this is what I really understand what is in the system design document part of the design principles, Design principle I think is to ensure that each subsystem will follow and consider, when the design must not be empty, for example, in many different architecture, the most important thing is how to control the risk of data, the need to write in principle, the basic principle is acceptable system is not available, but also to ensure data consistent, And I have seen more of the system design in the design principle is to write, or the same, the design principle of tangible embodies the architects’ understanding of the target (such as when a long-distance live this actually began as a concept, but now what degree’s do different live, this is the need to interpret, also want to make sure on the design of the technical level is reached the goal). Selecting principles at the technical solution level, and ensuring that the design principles are carried out and implemented in the detailed design solution;

3) comprehensive considering problems, such as different live big architecture transformation, involving the business level, all kinds of basic technical level, the infrastructure level, to carry out the decisions of the rhythm to consider effort, machine cost, infrastructure layout, stability control, etc., than just doing a little of the design of the system is very complex.

System design ability of growth, I think the most important one is the first in one or two to do professional technology domain, and then try to expand their knowledge scope, in addition to their own code section, for example, you should also know how specific deployment, deployment go, deployment environment specific what is, and what’s the relationship between the whole system, like myself, Only after to join infrastructure team more understand sometimes software do a decision, will lead to huge on infrastructure, hardware, network, or room but may only need to make some change on the software can be avoided, do some research and development, do some operations may be a better way to expand the knowledge breadth, The second point is to practice their ability to do tradeoff, which is difficult. To do tradeoff requires a comprehensive selection of various factors, but it is also the most critical for all architects. They can go back and reflect on what tradeoff they have done in various system designs. It can also be helpful to hear from experienced architects who share the logic behind their choices, especially if you happen to be in the same challenging phase, and just hearing about the final architectural result is not helpful most of the time.

I think it is better to be a technical Leader on the basis of the architect. There is still a big difference in the following aspects of growth. I will not write in this article, and then I will write a special article.

Programmer pyramid


In my opinion, the value of programmers is mainly reflected in their works. It is a great honor to be labeled as works. The level of influence of works determines the level of the pyramid, so I will understand the pyramid of programmers in this way.

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 technology trends, I hope that as programmers, we can have the opportunity to create a world-class work, to contribute to the development of the technology circle.

Due to the current IT technology update speed is still very fast, the programmer this profession is in particular need of learning ability, I always think, only to the programmer this profession is really full of interest, keep self-driven, IT is possible to do well in this profession, otherwise IT is easy to eliminate.

Finally, a quick survey:

The poll doesn’t confuse readers, but you are welcome to reply to questions about your programming career.

References


The growth path of programmers

The Growth path of programmers (continued)

14 Mistakes I made in system design

The core of system design: design principles