I haven't written a blog for a long time, not because I haven't learned anything, but because I have not learned enough systems, not specific enough, not sorted out (and I am too lazy ), so I don't want to waste ink. So continuous diving .. But there will always be feelings. During the course of study, there will often be some surprising and amazing things, but after learning it, I think it is simple or not worth mentioning, as a result, some insights were not written out on the fly. I took it for granted when I used it later. In fact, this is not necessary. I think the learning process should not be purely absorbing, but should be selective filtering, leave the essence to go to its dregs . It would be better if I could add my own summary. Unfortunately, I forgot this many times, or, in many cases, there is no such serious summary. However, at the technical level, the general saying is that any technology is based on a certain design idea, and what to implement is not the most important. In fact, ideas and designs cannot be illustrated by simple one-to-one and one-to-many relationships. It is often said that an idea can derive multiple technologies. In fact, he is only half right, because a technology is not just an implementation of an idea, but a blend of multiple ideas.
for software design, for window-based Program design, we have a variety of technical solutions to choose from, in Windows, there are MFC ,. net, WPF, GTK, QT, wxWidgets in Linux, and cocoa in Mac, but the core idea is similar. Most of them use MVC, but MVC is also a combination of ideas, it combines the policy mode and observer mode. For such a design idea, it is actually a highly abstract design. I can even make a strange thought: If the MVC pattern is applied to people, what people see is view, and what people think is controller, if a person uses a model, the basic actions of a person may be as follows: see things-> Generate requirements-> find tools to meet their own needs. So I feel that software design is sometimes more like simulating human behavior, and the software system is more like a virtual person (the person's IQ depends on how much knowledge and ability you give him), or, software design is implemented by human cognition. Therefore, we need to divide modules, clarify the relationship between modules, and consider the mutual influence between them, we also need to consider the interaction between them. If the relationship between the modules is unclear, you will be stuck in a bad system, and you won't know what the results will be. To give a simple example: Imagine how embarrassing it would be if you have bit your tongue at dinner, but you have found a pain in your ass.
Therefore, software design is actually a complicated task. A superior software is more complicated, because it is extremely complicated to consider too many situations. But just as all matter are made up of simple atoms, all complexity can be divided into the simplest and most basic thing. It is like an operating system that is hard to reach. In fact, there are six operations at the bottom layer. Linus, the Linux founder, is quoted as follows: "most of the tasks you complete on UNIX are completed through six basic operations, which are called" system call ). The first basic operation is to create a sub-process (fork). A program completely copies itself, so that you have two identical copies. The second basic operation is to copy the program and replace it with a new project. The other four basic system calls-Open, close, read, and write-all aim to access files. These six system calls constitute a simple UNIX operation. Then, you only need to create a communication channel (pipes) between programs to solve complicated problems .", It comes down to people, that is, activities (Physical Activity and thinking activity), metabolism, and sleeping (purely personal thoughts do not spray ).
I remember a piece of Turing mentioned in the BBC documentary chaos theory. Turing once proposed a great idea: nature is composed of the simplest mathematical formula. This theory promotes the subsequent research and development of "Chaos theory" and "fragment theory", including the famous "Butterfly effect", which is also related to "Chaos theory. We all know that Turing is known as the "father of computer", and modern software design methods are bound with such ideas. Therefore, in my opinion, if software design is a complicated design that involves problems, it will be a failed design. Software design should be a process of dividing a complex system into "atoms" step by step.The goal of the software architecture should be to make every part easy to understand and change.(Maintainability and scalability ).
for humans, if they regard human history as a day in a "entity" world, the true idea of human beings is one minute ago, therefore, God cannot prevent humans from using an "Object-Oriented" approach to software design, nor prevent programmers from using MVC ideas to implement a software system, because all this seems to be taken for granted. So no matter how advanced your technology is, I can imagine how you feel different when facing a bunch of complex algorithms and a bunch of fresh objects, because I can also feel the same way :). All people like to solve problems in a simple way (if you are not, you may be a civil servant). If you prefer to solve complicated problems in a simple way, you will have a sense of accomplishment, programmers are the best cases. Why is it true that a programmer who is lazy is a good programmer? This is because the programmer's laziness is the abstraction and expansion of the problem. It establishes a broader applicable model for the lengthy and tedious method of solving the problem to deal with similar repeated problems. The so-called abstraction is the crystallization of thinking. In fact, abstraction has been applied in all walks of life, but in the field of software development, this word is mentioned very widely and very loud, as a result, it becomes a keyword of some programming language . Abstract is a very broad concept. it is a process of extracting the essence of things (this is defined in data structure ), therefore, I think that the abstraction in software design can be applied to other fields, and the abstraction in other fields can also be applied to software design. So there's no need to be surprised that Turing is a mathematician, or Donald is also a mathematician ..., in essence, mathematics is an abstract science that abstracts nature into mathematical models, while computers are Simulators of mathematical abstract models.
I don't know where I came from, but as a software engineer, I think these things should be worth thinking about. Last time I saw a blog post saying that the world was driven by three types of people: scientists, artists, and engineers. Maybe this is not necessarily true, but at least one idea is explained: engineers must understand the abstraction of scientists and artists to achieve excellent products, because it is the crystallization of their thinking. a good engineer is also a scientist or artist to some extent .