There are two fundamental problems in computer science:

One is theory: algorithms, data structures, complexity, machine learning, pattern recognition, and so on.

One is systems: operating systems, network systems, distributed systems, storage systems, game engines, and so on.

Article Source:www.zhihu.com/question/31…

Theory goes deep, asking how to solve a problem faster and better with given computing power constraints. And the system is breadth, is to ask for a realistic demand in a multitude of technology design how fast, good and provincial technology combination.

The ACM guys only practice the first type. Unfortunately, there is no simple and efficient way to measure the second type of capability, unlike the ACM contest for algorithms and data structures, so many of the seeds of the system fade away due to a lack of motivation and proper guidance.

That’s why Bill Gates said he was sorry to see how often people learning to program today see it as solving brain teasers.

Do system, really do not advocate “reinvent the wheel”. But note that “reinvention” is not advocated, not “remanufacturing”. On the contrary, I believe that the programming ability of a system is the ability to “remanufacture”.

It’s good to be able to connect the parts we already have.

But when you happen to be missing a crucial glue, can you write about it?

When an existing component doesn’t exactly meet your needs, can you improve it?

If you have a bug in a widget, can you fix it?

Who is good and who is bad among the many similar functional components on the Internet? Why is that? Difference in nature?

An open source code library, can you translate it from one language to another? Porting from one platform to another? Can you accurately estimate how long your translation and transplant process will take? Can you accurately estimate whether performance will improve or decrease after translation and migration?

System programming ability is reflected in the existing code and become a better code, embodied in the unused code and turn it into a useful code, embodied in bring a good wheels can draw out the design blue print of the wheels, and where is the key reason to explain the design blueprint, what place is secondary, which parts of the world is not allow to touch, What can be improved?

If you don’t know anything about theory, you should learn something. For the design of system performance, algorithms and data structures are like money in hand, they are not everything, but do not understand is absolutely not.

How to improve system programming ability?

Dirt solution: Build more wheels.

It is like learning to draw eggs. It is not that there is no one in the world who can draw eggs, but drawing eggs can tame fingers and feel shadows, lines and strokes. So, write more yourself. Write a compiler? The renderer? Operating system? Web server? A Web browser? Replace the parts one by one with your own handwriting, and then compare with the existing parts to see who has better performance, who has better ease of use? What’s good about it? What’s the difference? Why is that?

A smarter solution: Remove more wheels.

Study how other people’s code is written. However, the practice is often difficult. The reason: Most industrial wheels may have good design and technology, but they’re poorly designed and manufactured, and they’re messy and at first glance clueless, making them extremely difficult to disassemble for beginners. This situation is actually very bad. Therefore, this method is generally only good for relatively simple wheels, for complex wheels, please do according to your ability.

Wheels are difficult to disassemble, which is actually a very serious problem. Reinventing the wheel is a waste of time, but when the wheel is complicated and difficult to disassemble, especially if the person who made it is no longer there, reinventing and rebuilding the wheel is often the best option.

This is the fundamental reason why the industry keeps reinventing/making the wheel even though it knows that reinventing/making the wheel is very bad.

The program essence is the formal expression of logical deduction, which records the digital understanding of the world.

A wheel that cannot be detachable is like a song poem that has lost its music. It can be read but cannot be sung.

There are two times in my memory when I feel like my programming ability has taken off.

Study is the first time in a foreign company, Japan provides the framework of the source code, and then when the components do not meet the demand made with their own hands so two or three, of course, is based on the component based on the original, but just two or three components after the restructuring, let me in the position in team up in an instant by a high class, because everyone else is in the wheel, and also with bad, I can make wheels.

The reason behind was exceptionally promoted to the group leader is also because of this stubble, followed by the salary range is relatively large.

Is the second time I started systematic share technology blog, because want to give you clear, it must be much more open wheel, whether reading a book, read blogs, source code, or watching video, first of all have to do what you have to really speak to to study thoroughly, and then according to the writing in their own ways, to achieve the effect of plain, humor.

Similarly, building more wheels and dismantling more small wheels is probably the best way to improve your programming ability.

The best time to plant a tree was ten years ago. The second best time is now. ** For programmers who are learning to program or want to be promoted at work, if you want to improve your programming skills, help you improve! ** I may be able to help you here ~

C language C++ programming learning exchange circle, **QQ group [765803539] ** wechat public number: C language programming learning base

Share (source code, project actual combat video, project notes, basic introduction tutorial)

Welcome to change careers and learn programming partners, use more information to learn and grow faster than their own thinking oh!