这是我在2018年4月写的英语演讲稿,可惜没人听得懂(实际上就没几个人在听)。
文章的内容是我从此前做过的项目中总结出来的经验,从我们的寝室铃声入手,介绍了可扩展性、兼容性与可复用性等概念,最后提出良好的设计应该平衡这些特性与性能、成本之间的三角关系。
第一次用英文写有一点专业性的东西,不知道算不算好。
以下为原文:
Design Principles
Intro
One day, on the noticeboard in our dormitory, there was a paper saying that the ring for rainy days cannot be added into the bell system in our dorm, and also, they won’t rebuild the system for us. I wondered why, because if the system were designed by me, anything could be easily added. Today, I’m not going to comment on their attitude or solution, but to show what a well-designed system should be like, or, what features should a well-designed system have.
Performance
No matter the system is made for yourself or for others, your design must meet the requirements.
The stick in my hand can display images when I’m shaking it. It has a microcontroller, running at 8MHz, to take control of the LED’s. If I used a microcontroller that could only run at 1MHz, it couldn’t display such complex words.
Cost
Obviously, the one at 8MHz is more expensive than the one at 1MHz. Usually the higher the performance, the more you should pay.
Some people build their computers with accessories chosen by themselves. They can be cheap or expensive, according to your choice. If you don’t pay attention to the balance between performance and cost, you’ll probably have a budget of 3’000 and finally spend 98’000.
This stick examines the frequency of shaking by a mercury switch. (If you are interested, I’ll explain its principle after class.) Another approach is to examine the direction of acceleration to get a more accurate position and frequency, which will be more expensive. However, I made it just for fun, so I didn’t want to spend more.
Extensibility
Performance and cost are basic, which everyone, when designing a system, can take into consideration. But engineering design is not such simple. From now on, I will introduce some professional concepts.
Extensibility is the ability to be extended or stretched, or the quality of being designed to allow the addition of new capabilities or functionalities.
Take an example. Some of you know my research project, which is to build a modular development system. It has pluggable boards and abstractions of every module in source code. The use of the system is quite simple but the usage is powerful: buy modules with functionalities you want, plug them together, write several lines of code, then, it works. The core module itself has limited functions, but by plugging and programming, all functionalities of other modules can be added, which means it has strong extensibility.
Compatibility
We need extensibility because the requirements may change, but what if it changes too much? We can design a new system, but we already have something useful in the previous system. Can they work together? A system with compatibility can.
Compatibility is the state of being compatible, in which two or more things are able to exist or work together in combination without problems or conflict. In your computer, sometimes you have to run a program in compatibility mode. The word here refers to backward or downward compatibility, which is a property that allows for interoperability with an older legacy system.
My modular system is a new concept, but there are already lots of traditional dev boards, a large number of users who are familiar with them, and an amount of valuable but not portable code. So, I’m going to program on other platforms to make my system compatible with them.
A complementary concept is forward compatibility. While backward compatibility can solve some historical problems, extensibility and forward compatibility can reduce the workload in the future.
Reusability
Since a system may upgrade, the unchanged parts in the previous version can be reused in the new version. Also, different systems may have something in common.
The modules in my modular system communicate on a bus. The microcontroller on this stick has access to the storage chip by the same kind of bus. Actually, in the source code of the stick, I just wrote an instruction to include the file in the former system. The source code of bus communication is reused.
Reusability is the state or quality of begin used more than once.
The bus of the stick is only used to transfer data from the storage chip to the microcontroller, but the whole functionality of bus communication is implemented. If I made the stick before the modular system, I may have integrated the storage operation with bus communication, which could make the program faster. But when building the modular system, I would have to redo the work.
Relationship among these features
Extensibility, compatibility and reusability have many emphasized properties in common, including modularity, high cohesion and low coupling. They are tightly linked.
All features above can be divided into 3 groups: performance, cost, and the other 3. An ideal system with high performance, low cost and many other features, can only exist in our mind. We cannot have everything at the same time.
As explained before, and also in your common sense, performance and cost are often incompatible.
If I use the modular system to make a simple project, you may think that it will be better to make a single board. Yes, I’ll need fewer boards, fewer chips, less code, and the program will run faster, which means higher performance. But what if I want to add more functionalities? I’ll have to redesign the board, resolder the board, and change lots of the code.
If I want to change the picture displayed by the stick, I must change the source code. An approach to avoid it is to add a Bluetooth module so that I can control it with my phone. But the price of a Bluetooth module is higher than the whole stick.
The 3 groups can form a triangle. You can’t make all of them the best at the same time. But you can do your best, which is to balance them. So, when you’re designing, think about as many aspects as you can. Don’t design a poor system like the one in our dorm.
Thank you.