More than 20 years ago, I had just graduated from college and had a very limited understanding of software development and not many skills.
first job
The first job was to build a BBS forum, imitating the popular Sanfu Outdoor Forum at the time.
At that time, I was very hungry for knowledge. Since I couldn't afford books, I often went to bookstores to find relevant ASP books, copied the codes into my notebook with a pen, and then entered them into the computer the next day. Combining the books at hand and studying ASP seriously, although it was hard, the time was fulfilling and enjoyable.
In this job, I designed an unlimited forum post browsing tree structure, which became one of the proudest achievements of my career. This is achieved by adding level numbers and dynamic grading. At the same time, this was also my first contact with .NET and C#, and I learned how to install and initially use them, which laid the foundation for subsequent technology development.
second job
The second job was to develop an integrated drilling rig, and it was also the first time working on client development on a real project.
The most impressive thing is that our team once conducted closed development in the mountains.
During this time, I re-read database-related books and deepened my understanding of databases.
Later, he participated in the outsourcing project to Japan. The requirements for outsourcing software are very strict, even including Excel format. During this period, my Excel level gradually improved.
The process of Japanese development is very formal and strict. I studied and experienced it carefully and gained a deep understanding of planning, quantification and review. For example, when making plans, you must have the planned time, actual time, and the gap between the two; when writing code, the error rate can be quantified; when reviewing, you must first understand the context, conduct the review according to the context, and follow up after the review; if When a problem occurs, in addition to solving the current problem, you must also check whether there are similar problems. Find them and solve them, don't leave them until later. These experiences played a good role in the subsequent CMMI3 certification. See blog for detailsCMM’s thoughtsandUnderstanding of CMM。
During the period of outsourcing to Japan, I became more proficient in using Excel and Word. What impressed me most was that outsourcing to Japan required writing detailed designs and writing unit tests.
At that time, I didn’t understand much about unit testing. I even tested private functions and tried every means to test them. Looking back now, although I feel a little blushing, this is the only way for me to grow up. Later, unit testing was deeply understood and viewed as a developer's "hiking pole." In many companies, if I am not the only advocate of unit testing, I am one of the few practitioners and promoters.
Enlightenment of object-oriented programming
Before this, the understanding of object-oriented programming was still very shallow. When writing code, I often wrote wherever I thought. Over the next few years, I gradually developed a deeper understanding of object-oriented programming and began to focus on the software development process and business.
code generator
After working for a few years, I came into contact with a code generator for the first time. The work at that time mainly used C# to perform addition, deletion, modification and query operations, and the code generator was very useful. Therefore, take the initiative to maintain this tool. In the following ten years, I gradually improved and enriched this code generator, learned many techniques, and gained a lot of insights. I organized this experience inLooking Back at My Software Development Experience: My Road to Nirvana with Code Generators。
When writing code generators, I benefited greatly from the book "C# Primer Plus". Think while reading and using. Sometimes the ideas come first, and then you find technical support through reading; sometimes you read ahead, and then you find the appropriate usage point from the code generator. This reading experience is amazing.
By writing code generators, I gained a deep understanding and practice of refactoring, and became an active practitioner and advocate of refactoring in my subsequent work.
During this period, there were several other things that impressed me: 1. Trying to understand and write detailed designs. This was my understanding and perception at that time.understanding of detailed design, and you will gain new understanding and insights into detailed design in the future. 2. Try to understand and write the outline designInitial understanding of outline design。
Agile development practices
During this time, I was reading "Agile Software Development: Principles, Patterns and Practices". Combined with my insights at work, I felt that this book was very good, and many of the problems were very similar to our reality. Recommend colleagues to read it together and try to apply it at work. We first implement a illogical front-end page and implement jumps. Through the demonstration of the front-end page, we gained a deep understanding of the business and then implemented the functions, achieving good results.
During this period, I also tried to lead the team to do business. What impressed me most was contacting customers and grasping business key points. This is an effective way to drive the team. When you sit in the office and study competing products, you also need to be attentive, study with ideas, and communicate more. Otherwise, it will be superficial and the team will be passive and unmotivated. These are some thoughts at that timeSome ideas in software development。
influence of books
I started reading a book that had a great influence on me - "Programmer's Way of Cultivation - From Jobber to Expert". I didn’t gain much from reading this book at the time, but I will read it again and again in the years to come. At work, many ideas in the book will come to mind unconsciously, such as: stone soup and frogs, the DRY principle, orthogonality, no excuses, etc.
During this time, I also read another book ".NET Framework Design: In-depth Understanding of the Common Language Runtime (CLR)". Through reading, I have a deep understanding of .NET and mastered MIL, garbage collection mechanism, .NET memory layout, reflection, assembly and metadata, exception handling, etc. Thinking about it now, this book has been a great help to my ORM framework.
In addition, I also read "Data Warehousing", which I felt was well written and very rewarding. Although there was no practical application in subsequent work, many of its ideas were used unknowingly when I designed the database. I also wrote a program for myself to record expenses and analyze expense records. Many design ideas came from "Data Warehouse".
National level preliminary research project
The next work is a national pre-research project, similar to the current Amap navigation. By integrating various information such as roads, traffic, weather, and construction, it provides travelers with accurate travel guidance.
Didi and Gaode didn’t exist at that time. The system is very complex and there are a lot of various types of data, which made me very confused at first.
Later, I remembered that there were similar parts in the management information system I learned in college, so I re-read the management information system textbook and found that the data flow diagram in it was particularly suitable for sorting out the system.
I tried to draw a data flow diagram for this system. Although I didn’t think it was very good now, I used this diagram to clarify the business and design the system. It felt very clear.
My colleagues are also very positive about this. They think that my work progress was not obvious a while ago. After using the data flow diagram, the effect is remarkable and I can clearly explain to others what to do and how to do it. It was a very good experience.
First attempt at C++
While working on this project, I needed to write a navigation program, and this was my first time using C++. The navigation program is a Windows program written in C++. It has an interface but does not use MFC.
Based on my experience in writing code generators, I used an object-oriented approach to write a program similar to MFC, configuring the interface through configuration files, and handling events through inheritance and the observer pattern. At the time, it seemed quite satisfying. Since I was using C++ for the first time, I didn’t understand many technologies, so I often asked other colleagues for advice. I also used this program to communicate with my colleagues, which was recognized by my colleagues.
In this program, object-oriented programming came into its own, but there were some issues that I didn't understand at the time. I remember when chatting, a colleague said that he now likes to write similar C programs because it looks smooth and he doesn't like the jumping around of C++. I didn't understand it at the time, but now I have a new understanding. Although I don't completely agree, it is correct not to overuse the object-oriented perspective. In later work, I will deliberately try: use object-oriented; do not use object-oriented; do not use object-oriented interfaces, do not deliberately avoid object-oriented implementation, etc.
This experience made me deeply realize that the learning and application of technology is a process of continuous exploration and adjustment, and every attempt lays the foundation for future growth.