Today we won't talk about ambitions and ideals, nor about specific technologies. We'll talk about several typical mistakes in programmers' perspectives. The following issues are ones I have encountered, or problems my friends have encountered. These are all my personal understandings, and I hope they are helpful to everyone.

About Design Patterns and Design Principles
Some people think that once you are familiar with design patterns and design principles, you have learned design. In fact, design patterns and design principles are only summaries and distillations made by predecessors based on design practice. Design, in the final analysis, is about solving problems - transforming solutions to specific problems, through a certain degree of abstraction, into the programmer's language.
I have seen some people who are knowledgeable and well-read, and can even explain theories to you in high-sounding terms, but when it comes time to actually solve problems, they cannot come up with clever, elegant solutions. These are typical ivory tower people.
On the other hand, there are also some people who look down on those who learn design patterns. They feel they have already mastered the secrets of software design, and these are meaningless words to them. You can just laugh this off.
Sometimes we are instead bound hand and foot by a crude mastery of design patterns or design principles. For example, I encountered something like this: a diligent programmer's designed code used composition everywhere (for example, placing a User object inside Administrator). I curiously asked, some class and object relationships clearly fit the characteristics of inheritance, so why were they unwilling to use it? He said, design principles tell us to favor composition over inheritance. I think, if these excellent patterns, principles, and methodologies cannot be mastered thoroughly and cannot be applied appropriately according to actual scenarios, wouldn't it be better not to understand them at all?
About Learning Multiple Computer Languages
Some people feel that learning one language is enough, and that learning so many languages is unnecessary. In fact, mastering an additional suitable computer language is not just about gaining another tool for making a living. If a new language can greatly change your views on programming and design, then perhaps it is worth learning.
For example, the C language can cultivate rigorous thinking; dynamic languages, for example, can help programmers do object-oriented coding better; functional languages, for example, play an irreplaceable role in industrial production and computation fields.
Of course, that said, as the saying goes, "mastery comes from focused expertise." An in-depth mastery of a particular computer language (including the runtime environment required by the language, and the principles of its compilation or interpretation) is very necessary.
In addition, we often see debates about which computer language is better or worse. In the final analysis, computer languages are tools, and tools are upgraded and changed as the times develop. A simple debate over which is better or worse has little meaning.
About English
Why do Chinese people need to learn English? Why do programmers need to learn English? When I name all those method names and variable names in pinyin, it works just as well. Who made this damn rule?
Unfortunately, many learning materials, papers, and technical resources (especially some recently released technologies) are in English. On the other hand, international standards and the common way programmers communicate are all in English. I think it would certainly be hard to imagine what the source code of those famous frameworks and libraries would look like if variable names were written in pinyin.
So, if your English is not good (at least reading and writing), don't make excuses for yourself. English is a tool for mastering other tools, unless you firmly believe that Chinese will soon become the world's most universal language in the computer industry.
About Algorithms
How important algorithms are - this matter has always been highly controversial.
Software, in the final analysis, is used to solve problems. When mentioning algorithms, one cannot avoid mentioning mathematics (this is also why many masters in the software field have considerable mathematical backgrounds). For solving problems, it can be simply summarized into two steps:
- (1) Abstract the actual problem into a simplified mathematical model
- (2) Use algorithms to solve this mathematical problem
Algorithm, here, should be a broad concept (the algorithm here does not only refer to the narrow specific algorithms learned in university). An algorithm is a method for solving the above mathematical problems. If you are not aware of its existence in your work, it only means that the mathematical model you abstracted is relatively simple, the method for solving this model is also simple, or there are ready-made approaches to imitate, or a ready-made framework has done it for you, so that you don't pay attention to it or care about it.
If what you are doing is full of innovative significance and is something others have never done before, then algorithms may become the factor that determines your success or failure.
In the current environment in China, people with broad vision and rich experience are easy to find, but it is actually very difficult for companies to recruit people who possess the above two abilities to solve problems.
About Experience
There are many people who are experience-only theorists. They believe that in software companies, position, salary, and even decision-making ability all depend on experience. An engineer with 5 years of experience can certainly find a better job than an engineer with 3 years of experience:
"I'm a senior employee, I've worked for 5 years. Why does he, who has worked for only 3 years, get such a higher salary than me?!"
In fact, many factors, including domain accumulation (this is business-related, such as the Internet field or traditional software field, which has no direct relationship with so-called pure technology), vision, ability to withstand pressure, and so on, often largely depend on the accumulation of "experience." However, this is not absolute. There is a saying: "A career is half built by doing and half built by summarizing." Indeed, there are some outstanding programmers who are good at summarizing, good at observing and accumulating, and good at continuous thinking. Such programmers are the ones who possess more excellent experience.
On the other hand, programmers are there to solve problems. Experience cannot replace solving problems. If some people have better problem-solving abilities, why can't they get a more generous salary?
Source: http://www.raychase.net/359