preface

Introduction to Software Engineering

When I first took this course, I was very serious in class and tried my best to listen to the lectures and learn, but I found that I had a little understanding of the UML methods and agile development processes in the book, but they seemed to hover around me. So after learning for a month, I began to pick up the books I was interested in, sometimes playing with my mobile phone. At the end of the course, I felt as if I had learned something, such as UML, Software Engineering development pattern (waterfall development, Agile), ER, five basic principles of Object orientation, etc. However, I felt that I had learned nothing. With the end of this course, these concepts gradually faded from my mind. As the coding became more and more, I began to review my code.

  • How to choose the five basic principles of object orientation? Are these five basic principles to be observed unconditionally?
  • What do we think of our software?
  • What are those software development patterns?
  • How do you measure a software engineer?
  • Is UML that important?
  • How to design software?
  • What is the difference between designing a framework, a library, or an application?

Maybe this is the question that software engineering should answer, but why didn’t I feel this way when I was studying Introduction to Software Engineering? Maybe is the amount of code is less, I was at my introduction to the software engineering, also did not try to build a small program, perhaps is the issue of teaching methods, the teaching way of this course is that the teacher speak on the concept of the book, similar to the patterns of Chinese classes, the teacher is the experience of software development, but we haven’t cooperation development at that time, Maybe a little understanding of “software”, but not engineering at this point. Perhaps introduction to Software Engineering itself should be a course of learning in doing.

I hope to get answers to above questions, so I am going to learn software engineering back, but I don’t want to use an introduction to the software engineering and the teaching material, I found another in douban this software engineering teaching “method of building”, I roughly and proved the chapters, think of the book was able to answer my questions above, so I just bought it, After reading carefully, I found some unexpected harvest. Now I will share my reading notes with you. I hope it will be helpful to you.

How do you measure a software engineer?

This year I changed my job and went through nearly a dozen interviews. I am a Java backend engineer, so the main technical points of the interview are as follows:

  • Collection: LinkedList ArrayList CopyOnWriteList HashMap ConcurrentHashMap
  • Spring Cloud Spring Boot MyBatis
  • Data structure and algorithm: sorting algorithm, binary tree
  • Computer networks: UDP, TCP, HTTP, HTTPS, WebSocket
  • Database: index, SQL optimization, transaction, transaction isolation level
  • JVM: Garbage collection algorithm, garbage collector
  • Multithreading: Thread pool CountDownLatch

The basic process of the interview is generally: written examination -> technical interview (may be several interviews)->HR interview. Most of the interviewers’ interview methods are in the mode of question and answer. Some of them are biased to ask specific details about my blog and salary expectation, and some of them are asked where they want to go. There are also some interviews that make me feel more interesting and in-depth. After the interview, I was thinking about this question, is this the right way to interview? Does that measure a software engineer? I have added some technical groups before, saw some fresh graduates face big factory situation, big factory seems to be such an interview method, question and answer questions. When I talked to them, it seemed common to think that working with distribution, algorithms and data structures, design patterns, and source code was the best way to measure a software engineer. This also forms a loop, big factory surface these technical points, and then each technical video explains how to answer. Are these correct? This way seems to have been the case since I graduated from the interview. While I have rich experience before, it seems that the interview three years ago was also the case.

So I asked myself what if I gave you an interview? How would you interview someone? How would you ask? Or even more, how do you measure a software engineer?

Q: Are you a software engineer by profession?

A: is the

Q: Where do you consider your “career” to be?

A: Well, I work in a salaried place and earn money from my software skills, so I’m quite professional.

Like a professional basketball player?

A: Pretty much.

Q: Professional basketball players are well documented. For example, the following chart shows the performance of professional BASKETBALL players in the NBA:

The chart shows the number of games played, starts, minutes, shots, percentage, etc. Do you have similar statistics for all your professional activities and accomplishments as a professional software engineer?

A: HMM… No.. The only statistic is that MY “minutes” are still quite high, and I play a lot of overtime — overtime.

It may seem difficult to measure a software engineer on a graph, but the work a software engineer does seems a little more complicated. How do you measure a software engineer?

I think it can be measured in the following ways, or software engineers can consider growing in the following ways:

  1. Accumulate knowledge related to software development, improve technical skills (such as the mastery of specific technology, hands-on ability).

  2. Build knowledge and experience in problem areas (e.g., gaming, healthcare, financial industry)

    The first and second points are mostly visible on a resume and can be easily detected. With increasing experience, an engineer can acquire a broader and deeper knowledge of technical and problem areas.

  3. Understanding of general software design ideas and software engineering ideas

    This aspect is more empty, what is a good software design idea? What are good software engineering ideas? An engineer starts a blog and reposts a lot of other people’s articles. Another engineer insisted on drawing UML diagrams for any design. Was that thinking?

  4. Upgrade vocational skills (as opposed to technical skills)

    Career skills include: self-management, presentation and communication, the ability to work with people, and the ability to deliver on quality and quantity, all of which are important in IT and other industries.

  5. The actual results

    Most of the work of software engineers is open to the public. What is the user evaluation of the products you are involved in? What is the market share? How valuable it is to the user. What part did you play in that? Actions speak louder than words, and these results are the most important criteria for evaluation.

My current superficial view is that most software engineers choose the first area to grow, and the remaining areas are mostly unthought of and rarely thought about.

How do you think about software engineering

How do you think about software

Almost all programmers know: program = data structure + algorithm. So the natural question here is what is software? Software is an ordered combination of instructions and data that can be run in computers and electronic devices. Software has a variety of classification methods, generally we will be divided into the following software:

  • System software: operating system, device driver, tool software, etc
  • Applications: Users use them for tasks ranging from managing nuclear power plants to writing articles, or for communication, games, web browsing, and video streaming.
  • Malware: Software viruses, etc.

So I write a HelloWorld in Java, like this:

Is this a program? A. Is it an app? After a fashion, it seems to be the only user I have, and the only application scenario is to output Hello World for safety. Is it a piece of software? It doesn’t seem to be. Recall that software introduced in Introduction to Software Engineering has a large number of participants and users, and a relatively long life cycle. Like the program I wrote above, it seems that when the results come out, its life cycle is over. Because all it does is give me stickers. What happens when an application has many users? These users all have different needs for the program, and we seem to have a lot to think about, not only to ensure that we meet the needs, but also to ensure the quality of service. It reminds me that children build small castles with sand on the beach. Can these small houses built by children with sand be counted as buildings? Not really, because no one can live in these little houses. What if we build houses for people to live in? We should use the engineering perspective to consider, because there are many things to consider, such as the construction period (how long it will take to complete), floor area, architectural style, the life of the house.

When we compare building a house to developing software, it’s the same thing. When the software is designed for a certain number of users, it’s not as loose as it should be. We also have to consider the time limit, the software architecture, the life of the software. So we can promote and expand the concept of software, that is, software = program + software engineering. Why software engineering? Because software engineering is different from civil engineering, for example, when a 20-story building is almost finished, no one wants to add a basement under the 20-story building, but in software development you will often see changes like this.

How to think about engineering

Engineering is commonly used in the daily frequency is very high, biological engineering, civil engineering and so on, what is engineering?

Engineering: The creative application of scientific principles to the design and implementation of buildings, machines, devices, or production processes; Or use one or more of these entities in practice; Or the process of implementing those entities.

Collaborate built by people from ancient to now, many engineering marvel, some of which can still see (for example the passat in Athens, Greece, the Roman empire, the Roman temple waterway, the Great Wall of China, etc.), choose the cover image is read river building, completed the design, after a six hundred introduction about reading jiang floor can see resources at the end of the article.

We imagine that the design and construction of these projects must involve a great deal of planning, calculation, collaboration of various actors, and the labor of hundreds of thousands of people, animals, and machines over many years. These factors are still present in the various “engineering” that came later, such as chemical engineering, civil engineering, software engineering.

Writing here, I suddenly remembered a project competition organized by my class in college, which was to write a project based on what WE had learned. We had just learned Servlet, JDBC, HTML, CSS, JavaScript and JQuery. Naturally, we were full of confidence at that time, and we were discussing with some students. Some students are confident that Java is not CRUD(add, delete, change and check), we find a background template, write CRUD. At that time, almost all the students thought so, so I found a background template to save the working time in the front page, there was no design goal, it was very simple allocation. Some students spent a period of time in the database, drawing and drawing with ER, but in the end, the same, the final software is to cope with the homework. I was involved in the project, my project leader is going to be a beauty makeup community, the team have a classmate want to use the prototype picture what the software should be, but then have a classmate reaction project is too small, we do kill the goose that how to use, a specific division of labor is related to the page tables, background design is divided into a person, But what is the ultimate goal? We didn’t seem to have a clear consensus, and the collaboration was divided randomly. The software was built like a thatched hut that was never meant to be lived in. It collapsed on a gust of wind.

But what if it’s really user-oriented, that you’re building software that people need to use? We need to design goals, collaboration, development processes. Software to some extent, like a house, but a little different, a building was built after the structure has been basically can’t have too big change, but the software, the software and it’s like a city, in the planning of urban development, we will not happen overnight, the urban construction too futuristic, cities are always along with the development of the economy, the increase of population, Road expansion and new urban planning (code reconstruction after the number of users of the corresponding software increases).

From an architectural point of view, no one would think that building a house is only moving bricks and cement, which seems to correspond to the service side is adding, deleting, changing and checking, we are using these to build a project, in the construction process, we consider the points: safety, ease of use, performance. That is to say, we should consider all aspects of a problem. We should not look at one part and see the whole as a whole.

How to think about software engineering?

Here we have discussed software and engineering, and roughly got a inference: software = program + software engineering, then what is software engineering:

Software engineering is the process of applying systematic, orderly, and quantifiable methods to software development, operation, and maintenance.

Software engineering includes the following areas: software requirements analysis, software design, software construction, software testing, and software maintenance.

Software engineering is related to the following disciplines: Computer science, computer Engineering, management, mathematics, project management, quality Management, Software ergonomics, systems Engineering, industrial design, and User experience Design.

The above formula is a relatively narrow and simple formula, the broad sense of software engineering also includes user experience, user interface design, etc.

We mentioned above that program = data structure + algorithm, can we plug this equation into the above equation?

Software = program + software Engineering = data structure + algorithm + software engineering.

You can’t do that. In fact, the plus sign is what we think of as a good piece of software, even if it doesn’t have the same functionality as the same kind of software, but it feels very good. This is the User Experience of software. User experience is not directly related to data structures and algorithms (if you insist that I write SQL that is slow to respond, so the user experience is also poor, you also see a lot of very good buildings that are also rated as failures), but a lot of very successful software wins in this area.

For the program = data structure + algorithm of the famous saying, almost all programmers know, but in the actual study and work, there are many people have questions:

  • I use C language to achieve binary tree traversal calculation method. Here, the binary tree is the data structure, the implementation details of the traversal are the algorithm, and the C program is the result. But what’s the use of this program? In Java and some other languages, there seem to be no Pointers, so can I not learn about binary trees?
  • I became a professional programmer, but I realized that all the algorithms were already implemented and I could just call them. It seems that our company’s software has little to do with data structures and algorithms. Did the data structures and algorithms I had worked so hard to learn work? How do you tell a good programmer from a bad one?
  • When I went to work, I found that the program written by my former colleague was so rubbish that I could not understand it and maintain it. I want to override the rewrite! Later, an old employee told me with a smile, we now see the program, is last year’s new employees pushed to rewrite the results, we reflect that the previous version is not good.

The refactoring I’m thinking of here is simply replacing someone else’s code style with your own. The conclusion seems to be that programs (algorithms, data structures) are fundamental skills, but above algorithms and data structures, software engineering determines the quality of the code; Business model affects the success or failure of a software enterprise.

Write in the last

This article is mainly “the method of construction modern software engineering” reading notes, in my way “the method of construction” about the things combined, is a reading notes. The picture on the cover is Yuejiang Building. When I was writing this note, I felt that software engineering was somewhat similar to civil engineering, so I wanted to find some beautiful and successful architectural pictures. However, I also thought that after a high-rise building is built, will it still adjust its structure on a large scale? Should not, this is a very dangerous move, but a software in the face of different users, is slowly adjust the internal structure, this is the difference between software engineering and other projects.

The resources

  • What were the most stylish buildings built after the founding of the People’s Republic of China?
  • “Construction method of modern Software Engineering” third edition author Zou Xin