Programmer's thoughts

Programmer's thoughts

Lei Jun 

I am not a born programmer, and I am not born to like computers. When I was in high school, I never thought that I would become a programmer in the future. My contact with computers was purely accidental. Friends have more "common language" and I chose the Department of Computer Science. In college, I peeked into the computer world and began to "fever"; after graduation, I started a career as a programmer.
It has been almost ten years since I started writing programs, and I have written many programs. From the ups and downs of these years, I can't help but have some experience. When it comes to experience, the biggest experience is that this road is too long.
1. I am willing to have you in my life.
I don't expect everyone to compare writing programs with literary creation, but the suffering is not something that an ordinary user can appreciate. To write a good program, we spend too many sleepless nights. A friend commented, "Writing a program is suicidal, and it takes a lot of energy and brains." But there are still many people who are not afraid of the hardships and continue to follow.
When I first came into contact with computers, I discovered the beauty of computers: computers are far less complicated than people. If your programs are well written, you can have a very harmonious relationship with the computer, and you can direct the computer to do what you want. This At times, you are in full control. Every time you sit in front of the computer, it's like you're cruising in a kingdom.
The world in the computer is very big, and programmers live in the kingdom of their own imagination. You can get down to every byte, every bit of stuff in the computer.
Days like these are simply heavenly, and many people fall in love with them.
Many people think that programmers can work until the age of thirty-five at most, and their brains should almost rest. They think that writing programs is a matter for young people. When they reach a certain age, it is estimated that few people will become programmers.
When I first graduated, I was in high spirits, and I wanted to endure hardship first, and quit when I was 30 years old. I discovered my ignorance as I got older. When a person graduates from college, he will be 21 or 25 years old. When his technology matures, he may be 25 years old. Then he will be busy with many things such as money, wife and house. Maybe thirty-five years old when everything is settled. If we gave up at thirty-five, we wouldn't have to choose the path of programmers.
It took a long time for computers to enter my country, but the real large-scale use of computers was only when PCs landed in my country in 1985. Therefore, people who actually write computer programs in China have been writing for more than ten years at the longest (I don't know if there are such people). Due to the relatively short time of computer application in China, the main force of domestic program development is mainly young people under the age of 35, but this does not mean that programmers are easy to age like pink beauty. Developers in the United States and Taiwan are dominated by people in their thirties and forties. When we started writing programs, we felt that there was nothing we couldn't do (I can still hear such rhetoric now), and what was even worse, it seemed that we were very smart, especially suitable for developing software, and much stronger than foreigners. When we really got in touch with those outstanding foreign developers, we found that they are too powerful. They have more than ten years of development experience, and most of the products are from these programmers with rich development experience.
After graduation, programming is not only a hobby, but also a lifelong job, and I can definitely do it for the rest of my life, although I didn't plan to do it all my life. It's both easy and difficult to program a lifetime. If you do nothing, write some programs for the intersection, so that there are people who write in two lifetimes. But if you want to devote yourself to writing programs, it is not an easy task to write for ten years. Now many of my friends have washed their hands, and sometimes I have the same thought, but once faced with the computer, I immediately realized that the computer is still the best thing I do, and it is also the easiest thing to do.
2. My future is not a dream.
Some people study programming techniques hard, strive to improve their programming level, and regard senior programmers as their pursuit goals, or even lifelong goals. Later, after participating in real commercial software development, I was very confused and at a loss.
Senior programmers were also my goal when I was in college. At the time, I passed the grading exam to get the Advanced Programmer certificate and put the words "Advanced Programmer" on my business card. Later, my level has improved, and it seems that I have become a good programmer recognized by everyone. At this point, I started to be at a loss. I hope that my technology can be recognized by others, when it is recognized by others, what can I do? Later I found out that no matter how advanced a programmer is, it is useless, the key is whether you can come up with ideas and products, whether your labor can be recognized by the society, and whether you can create wealth for the society.
My future is clear, to develop high-quality products suitable for society and create wealth for society.
3. Every program is a work of art.
Some people think that programmers are nothing but a kind of skilled craftsmanship; These two opinions are more heated, and can even be said to be tit for tat.
Let's look at it from another type of work. The stonemason should be a skilled type of work, and it seems that it has nothing to do with art. But it is these masons who have left us countless cultural relics, such as the Leshan Giant Buddha, the Mogao Grottoes and so on. It should be said that this mason left us with infinite cultural wealth. I think the work of programming is similar to that of masons, it is a technique and an art.
The modern software industry has a considerable scale, and the completion of a lot of software requires large corps to fight. When a proficient programmer accepts the task of writing a certain block, he often just writes the code, with little leeway. In large projects, many programmers can only understand very local details related to the modules they have compiled, and they are also limited by the development environment. It is really difficult to realize that they are engaged in "art" creation, and more often It is the feeling that you are doing heavy physical work. Sometimes I worry about whether the project I have worked so hard to participate in is meaningful, whether it is competitive with similar products, and whether it will become outdated due to the development of hardware and the replacement of operating systems after it is developed. . . . . .
Programming is a technical activity, and it is possible to carry out large-scale operations and to have the theory of software engineering. It is precisely because programming has the characteristics of artistic creation that there are so many good software products in our lives. Writing a program requires mental and physical effort, and when I - we - a group completes a program, in our eyes, every program is a work of art.


Qualities
a Programmer Should Possess From the construction of the application layer to the construction of various data marketing platforms on the application layer, programmers play a pivotal role and make great contributions to the development of the IT industry.

There are many people who are proficient in coding in China, but there are many misunderstandings in China's software industry, especially in network application development, and it is difficult to form a large-scale software development force and product capability. There is no better. These problems do not lie in the IQ and hard work of Chinese programmers, nor do they lie in the level of investment in development by the state and the people, but to a large extent, there are some misunderstandings about technology, program development, and project design. These misunderstandings have led to the lack of productization capabilities in the software industry, and the lack of large-scale and large-scale reuse system research and development capabilities. It can be said that changing the misunderstandings is an important solution to the limitations brought by the small workshop model and the individual hero model in the software industry. Work.

There are many children in China. They are 18, 9 or 21, 2 years old. They have also written a lot of code through self-study. Some of their code is beautifully written, some technical details are quite outstanding, and they are also very inquisitive, but they are being studied by some Wrong understandings and opinions, lack of overall understanding of the system and program, these people, an online friend said it very well, they are actually just some Coding fans, they are not qualified to be called programmers at all, but according to my opinion I know that the CTOs of many small Internet companies are such coding fans, with terrifying salaries, doing terrifying projects, and the endings of the projects are usually terrifying.

First, the basic
quality of programmers To be a truly qualified programmer, or a programmer who can truly qualify to complete some code work, should have the quality.
1: Team spirit and collaboration ability It is not unimportant to
regard it as a basic quality. On the contrary, it is the most basic and most important foundation for a programmer to have a life. Those who call high-level programmers a lone ranger are raving. The power of any individual is limited. Even a genius like Linus needs to create a miracle by forming a strong team. Those who write cores for linux all over the world It is unimaginable without the spirit of collaboration. Lone Rangers can make a small fortune by making small money-making software, but once they enter the R&D team of some large systems and enter the development tasks of commercialization and productization, those who lack this quality are completely unqualified.
2: Documentation Habits Those who
say that high-level programmers never write documentation are definitely young children. Good documentation is a very important part of the formal R&D process. As a code programmer, it is normal to write technical documentation 30% of the working time. , and as senior programmers and systems analysts, the proportion is much higher.
Without documentation, a software system lacks vitality, and will encounter great troubles in future error checking, upgrades, and module reuse.

3: Standardized and standardized code writing habits
As the rules of some well-known foreign software companies, the naming of variables in the code, the format of comments in the code, and even the length of indentation in nested lines and the number of blank lines between functions are clearly defined. Good Writing habits not only help with code porting and error correction, but also help with collaboration between different technicians.
Some coding fans clamor that the code written by high-level programmers can never be understood by others. This clamor can only prove that they are not worthy of calling themselves programmers at all. Code has good readability, which is the basic quality requirement of programmers.
Looking at the entire linux construction, without standardized and standardized code habits, global R&D cooperation is absolutely unimaginable.

4: Ability to understand requirements
Programmers need to understand the requirements of a module. Many children write programs often only focus on one functional requirement. They attribute all performance indicators to hardware, operating system and development environment, while ignoring the performance considerations of their own code. Someone once said that it is easy to write an advertisement exchange program. This kind of person never knows how to achieve the performance index in the case of millions or even tens of millions of visits. For such a programmer, you give him the deep blue system , he also can't make the Taiji chain's ability to visit concurrently. Among the performance requirement indicators, stability, concurrent access support capability and security are very important. As a programmer, you need to evaluate the environment in which the module is operating in the system, the load pressure it will be subjected to, and the potential for various potential dangers and malicious attacks. possibility. At this point, a mature programmer needs at least 2 to 3 years of project development and tracking experience to have experience.
5: Reusability, modular thinking ability
It is often heard that some programmers have such complaints. After writing programs for several years, they have become skilled workers, and they repeatedly write some codes without any new ideas every day. This is actually China. The biggest waste of software talents is that some repetitive work has become the main work of skilled programmers, and these are actually completely avoidable.

Reusable design, modular thinking is to ask programmers to think more when completing any functional module or function, not limited to the simple idea of ​​completing the current task, think about whether the module can exist without this system , whether it can be directly referenced in other systems and application environments by simply modifying parameters, so that repetitive development work can be greatly avoided. If a software development unit and working group can take into account in each development process With these problems, programmers will not waste too much time in repetitive work, and will have more time and energy to devote to innovative code work.

Some good program module codes, even if they were written in the 1970s, can be used as functional modules in some systems. What I see now is that many small companies will easily upgrade or improve their software. All the code is rewritten, and most of the repetitive work is a waste of time and energy.
6: Testing Habits
As for some commercial and regular development, full-time test engineers are indispensable, but it does not mean that with full-time test engineers, programmers can not conduct self-testing; software development is a project. In other words, a very important feature is that the earlier the problem is discovered, the lower the cost of solving it. The programmers carefully test each piece of code and each sub-module after completion, so that they can try to find and solve some potential problems as early as possible. solve, so that the efficiency and reliability of the overall system construction have the greatest guarantee.

The testing work actually needs to consider two aspects. On the one hand, it is the test of the normal call, that is, to see whether the program can complete the basic functions under the normal call. This is the most basic test responsibility. Unfortunately, in many companies, this has become the only test task. The second aspect is the test of abnormal calls, such as the stability test under high pressure load, the test under the potential abnormal input of the user, and the impact of the module in the case of a partial failure of the overall system. Testing, module stability testing when frequent abnormal requests block resources, etc. Of course, it is not necessary for programmers to perform such a complete test on every piece of their code, but programmers must clearly understand the status of their code tasks in the overall project and various performance requirements, and conduct relevant tests in a targeted manner. Identifying and solving problems early, of course, requires the understanding of the needs mentioned above.
7: The ability to learn and summarize
Programmers are a profession in which talents are easily eliminated and outdated, because a technology may only take the lead in three or two years. If programmers want to settle down, they must constantly follow up with new technologies , learn new skills.
Being good at learning is a necessary driving force for any career, and for programmers, this requirement is even higher.
But learning also needs to find the right goal. Some small coding fans, they also talk about their learning ability. They have learned asp, php, and jsp. They use this as a capital to show off blindly. chasing some superficial and superficial things and nouns, do not understand communication transmission protocols when working on network programs, and do not understand interrupt vector processing when working on application programs. Such technicians, no matter how many so-called new languages ​​they have mastered, will never have quality improve.
Being good at summarizing is also a manifestation of learning ability. Every time you complete a research and development task or a piece of code, you should purposefully track the application status of the program and user feedback, summarize at any time, and find your own shortcomings, so as to gradually improve, a Programmers can grow up.
A programmer who does not have the growth potential, even if he looks like a master, it is recommended not to use it, because the time when he is outdated will come soon.
A person with all the above qualities should be said to be a qualified programmer. Please note that the above qualities are not determined by IQ, nor can they be learned in some university textbooks. Awareness of work is a matter of consciousness.

2. Qualities that senior programmers/project designers need to possess
So as senior programmers, even system analysts, that is, for the designer of a program project, in addition to all the above qualities, they also need to have The following qualities:
First, the ability to analyze requirements
For programmers, they can complete qualified code by understanding requirements, but for R&D project organizations and managers, they must not only understand customer requirements, but also formulate some requirements by themselves. , why do you say that?
Generally speaking, when conducting R&D tasks, it may be the needs of customers, or the needs of marketing and marketing departments. At this time, for the R&D department, what they see is not a complete demand. Generally speaking, the demand is only some functions. The above requirements, or more formally, may obtain a complete user view; but this is not enough, because customers may have more non-technical factors, it may be difficult for them to put forward complete and clear, or professional performance requirements, but for Project organizers and planners must be able to clearly recognize the existence of these requirements and put them forward appropriately when completing the requirements analysis report. At the same time, they must be fully and clearly reflected in the design specification, so that programmers will not lose them when coding. these guidelines.
The programmer must correctly understand the environment in which the user's needs are located, and analyze the needs in a targeted manner. For example, if the same software is released through ASP rental and released through a license, the performance requirements may be different. The former emphasizes It is better support ability and stability, while the latter may emphasize the universality under various platforms and the simplicity of installation and use.
Second, project design methods and process processing capabilities
. Programmers must be able to master no less than two or three project design methods (such as top-down design methods, such as rapid prototyping, etc.), and be able to adapt to project requirements. Matching with resources to select a suitable design method for the overall design of the project.
Improper selection of the design method will delay the R&D cycle, waste R&D resources, and even affect the R&D effect.
A programmer also needs to devote a lot of effort to the design and processing of flowcharts. He needs to make data flow diagrams to establish a data dictionary; he needs to process logic flow diagrams to form an overall system processing flow.
A system with problematic processes will not be a good system, no matter how beautiful the code is and how delicate each module is. Of course, to do a good job in process analysis and choose a good project design method, it is necessary to have sufficient grasp of the requirements analysis ability.
Third, reuse design and modular decomposition ability
This seems to be an old tune again. Didn’t the previous basic qualities already explain this problem?
As a programmer engaged in modular tasks, he needs to consider the reusability of the specific functional modules he faces, while as a system analyst, the problems he has to face are much more complex, and he needs to analyze the overall system according to a kind of The modular analysis capability is decomposed into many reusable functional modules and functions, and an independent design requirement is formed for each module. For example, it is like car production. At first, each car was installed independently, and each component was tailor-made, but later on, it was different. Machined production began, and a car factory began to produce cars through assembly lines. , Independent components began to have a certain degree of reusability, and later standardization became a major trend. Different models, brands and even different manufacturers of auto parts can also be easily replaced and upgraded. At this time, the efficiency of automobile production is maximized. The same is true for software engineering. In a mature software industry, in some related projects and systems, different components can be replaced at will, such as many desktop software of Microsoft, in many operation modules (such as opening files, saving files, etc. etc.) are the same set of functional modules that are reused, and these interfaces are provided to desktop application developers for easy hooking through some class libraries, which is an obvious proof of the reused module design.

Decomposing a large, intricate application system into some relatively independent, highly reusable modules that can complete data connection only by relying on a few parameters is the most important thing for senior programmers and system analysts. Good work, a suitable project design method, and a clear flow chart are important guarantees to achieve this goal.
Fourth, the overall project evaluation ability
As a system designer, you must be able to start from the overall situation and have a clear understanding of the project as a whole, such as whether the company's resource allocation is reasonable and in place, such as whether the project schedule can maximize efficiency without being impossible. Completed on schedule. Evaluating the workload of the whole project and each module, evaluating the resources required by the project, and evaluating the difficulties that the project may encounter requires a lot of experience accumulation. Some of the leaders of software system design in the West are very old, such as 4, 50 years old, or even older. They are far less active in coding than young people, but in terms of project evaluation, they are decades old. The accumulation of experience is the most important and valuable wealth. The lack of such a generation of programmers in China is mainly not the lack of programmers of that age, but the programmers of that age are basically made by research institutes, not from the research and development of professional productized software. There is no way to accumulate that kind of experience in product R&D.
Fifth, team organization and management capabilities To
complete a project project requires the concerted efforts of the team. As a project designer or R&D supervisor, you should be able to maximize the overall strength of the team. Due to its professional nature, technical management is not different from General personnel management, because some technical indicators and factors are designed here.
The first is the quantification of work. Without quantification, it is difficult to achieve proper performance appraisal, and program quantification cannot be calculated simply by the number of lines of code. Therefore, technical managers are required to be able to truly evaluate the complexity and workload of a module.
The second is the adjustment of the team collaboration model. Generally speaking, the collaboration of program development is usually divided into groups. The group has the main programmer method and the democratic method. According to the ability level gap between programmers, and according to the project development To meet the needs of the team, choose the appropriate team formation method, and closely combine the responsibilities and the work tasks of the members, so as to maximize the efficiency of the team formation.
A person with a high level of coding may not be able to become a qualified project R&D supervisor. The lack of ability in this area is often easily overlooked.

To sum up, it can be seen that as a person in charge of research and development, a project designer, the qualities and abilities that you need to have are not the ability to write program codes. Of course, under normal circumstances, a programmer can achieve this through continuous summarization and improvement. At the time of this kind of quality, his ability to write code is not simple, but please pay attention to the causal relationship. A high-level project designer is usually a very good code writer, but not a code Very good programmers can be competent for project design work. The problem here is not about IQ and textbooks, but because a programmer does not realize what to think about when he accumulates experience and gradually improves. There is no regular document habit and summary habit. If we do not change these, our qualified project designers are still very lacking.

In addition, in order to prevent boring people from being serious with me, I will add that this article is aimed at software projects and projects that are aimed at commercialization. Those programming experts in scientific research institutions, such as algorithm experts, such as image processing experts, their work is research Projects rather than directly completing commercial software (of course, eventually become commercial products indirectly, such as the research projects being done by Microsoft Research), so the quality they emphasize may be something else. These people (experts) cannot be said to be programmers. Can't be measured by programmer's standards.

Third, the design process of software project development
Finally , add something, what is the design process of a software project development? Take the usual standard design approach, for example (though I like rapid prototyping).
The first step is market research
Technology and the market must be combined to reflect the greatest value.


The second step is requirements analysis.
This stage requires three things, user view, data dictionary and user manual.
The user view is the page style that the software users (including end users and administrative users) can see, which contains many operational processes and conditions.

The data dictionary is the stuff that specifies and organizes the logical relationship of the data. After the data dictionary is completed, the design of the database is more than half completed.
The User's Manual is a manual that specifies the operation procedure.
Please note that the user operation process and user view are determined by requirements, so they should be completed before software design. Completing these provides constraints and guidelines for program development. Unfortunately, too many companies do not do this, and the cause and effect are reversed. The sequence is not divided, and the development work and the actual needs are often separated from each other.
Demand analysis, in addition to the above work, the author thinks that as a project designer, a complete performance requirements specification for the project should be made, because often the performance requirements can only be understood by people who understand technology, which requires technical experts and demanders (customers or company marketing departments) ) to be able to have genuine communication and understanding.
The third step is the outline
design , which preliminarily divides the system functional modules, and gives reasonable R&D process and resource requirements. As a rapid prototyping method, the coding stage can be entered after the outline design is completed. This method is usually adopted because the R&D tasks involved belong to a new field, and the technical supervisor cannot give a clear detailed design specification, but it does not mean the detailed design. The design specification is not important. In fact, after completing the prototype code, the rapid prototyping method needs to re-design the steps according to the evaluation results and the summary of lessons learned.

The fourth step is detailed design,
which is an important stage to test the design thinking of technical experts. The detailed design specification should provide the coders with specific modules in the most 'clean' way (black box structure), so as to maximize the overall modularity of the system; A good detailed design specification can minimize the complexity of coding. In fact, strictly speaking, the detailed design specification should provide detailed definitions of each parameter of each function, from requirements analysis to From the outline design to the completion of the detailed design specification, a software project should be said to be half completed. In other words, a large software system is halfway through without actually starting a line of code work.
Those who think that programmers who make software simply understand that they write code are fundamentally wrong.

The fifth step is coding.
In the standardized R&D process, the coding work will not exceed 1/2 of the entire project process at most, usually 1/3 of the time. , the coding efficiency will be greatly improved, and the coordination and cooperation of the progress between different modules during coding is the most important thing. Maybe a small module problem may affect the overall progress, so many programmers are forced to stop work and wait. , this problem has appeared in many R&D processes. Mutual communication during coding and emergency solutions are very important. For programmers, bugs will always exist, and you must always face this problem. The famous Microsoft has not issued patches for three consecutive months. ? there has never been!
The sixth step is
testing. There are many types of testing:
according to the test executor, it can be divided into internal testing and external testing.
According to the scope of testing, it can be divided into module testing and overall joint debugging
. According to test conditions, it can be divided into normal operation test and abnormal test. Situation test
According to the input range of the test, it can be divided into full coverage test and sample test. The
above is well understood and will not be explained.

In short, testing is also a very important step in project development. For a large-scale software, external testing of 3 months to 1 year is normal, because there will always be unforeseen problems.

After completing the test, completing the acceptance and completing the final help documents, the overall project will come to an end. Of course, upgrades, repairs, etc. will be indispensable in the future. As long as you don’t want to cheat money through one-shot trading, you must keep tracking the operation of the software. status and continue to patch and upgrade until the software is completely phased out.

Writing these steps is not a show off, because honestly I have a copy of "Software Engineering" at hand, which is a required course for computer majors in college, but I know that many programmers seem to never just be interested in "Mastering in 30 Days". VC" and so on, some of them came from guerrillas like me, and have never formally studied this major, and some of them have already returned these really useful things to their teachers after getting enough credits.
The Internet is also very impetuous now. Some coding fans are making noises and confuse the public. In fact, real technical experts rarely post random posts on the Internet. For example, the author is not a master. I am used to this kind of misunderstanding and nonsense about technology and programmers, so I have to stand up and make things right. I also hope that those coding fans who are still addicted to some wrong people can seriously think about it and get on the right path. After all, those smart people The mind is far from being as valuable as it should be.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=327065513&siteId=291194637