preface

Let’s talk about the Introduction to Software Engineering I studied in college. It looks like this:

When I first took this course, I was very serious in class, I tried very hard to listen and learn, but I found that I had a little understanding of the UML methods and agile development processes in the book, but it seemed to hover around me. So after studying for a month, I began to turn over the books I was interested in, and sometimes I played with my mobile phone. At the end of the course, I felt as if I had learned something, such as UML, software Engineering development patterns (Waterfall, Agile), ER, the five Basic principles of Object-oriented, etc. However, I felt that I had not learned anything. With the end of this course, these concepts gradually faded from my mind. With the increase of coding, I began to review my code.

  • How to choose between the five basic principles of object orientation? Are these five basic principles to be adhered to unconditionally?
  • What should we think of our software?
  • What are those software development models?
  • How do you measure a software engineer?
  • Is UML that important?
  • How should design software be designed?
  • What’s the difference in designing a framework, a library, an application?

This may be the question that software engineering should answer, but why didn’t I feel this way when I studied 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 have been a learning in doing course.

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, Read carefully found that there are unexpected gains, now will be reading notes to share to you, I hope you will be helpful.

How do you measure a software engineer?

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

  • Set: LinkedList ArrayList CopyOnWriteList HashMap ConcurrentHashMap
  • Spring Spring MVC Spring Cloud Spring Boot MyBatis
  • Data structures and algorithms: sorting algorithms, binary trees
  • Computer network: UDP, TCP, HTTP, HTTPS, WebSocket
  • Database: Indexes, SQL tuning, transactions, isolation level of transactions
  • JVM: Garbage collection algorithm, garbage collector
  • Multithreading: The thread pool CountDownLatch locks

The basic process of the interview is: written test -> technical (may be several)->HR. Interviewers often ask me questions in the form of essay questions. Some of them read my blog and ask me specific details about my salary expectations. Others ask me everything I want to know. 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 group before, saw the situation of some fresh graduates face big factory, big factory seems to be such an interview method, answer questions. Big factories can lead the way in technology, and when I talk to them, it seems to be a common belief that distribution, algorithms and data structures, design patterns, and source code are the best measure of a software engineer. This also forms a cycle, dacang face these technical points, and then each technical video tells how to answer. So are these right? This way seems to start from my graduation interview is such, asked before the experience is relatively rich at the same time, it seems that the interview three years ago is also such, always so, right?

So I asked myself what if I asked you to do the interview? How would you interview someone, what would you ask? Or further, how do you measure a software engineer?

Q: Are you a software engineer by occupation?

A: is the

Q: How would you describe your “career”?

A: Well, I work at a salaried place and I make money with my software skills, so I’m quite a professional.

Q: Like a professional basketball player?

A: Pretty much.

Q: Professional basketball players have very detailed records. For example, the following table shows the on-court performance of NBA professional basketball players:

The chart shows the number of games, starts, time, shots, percentage, etc. As a professional software engineer, do you have similar data for all your professional activities and achievements?

A: HMM… No.. The only statistic is that I still play a lot of minutes, and a lot of overtime — overtime.

It may seem difficult to measure a software engineer with a chart. Software engineers do more complicated jobs. How do you measure a software engineer?

I think it can be measured from the following directions, or software engineers can consider to grow from the following aspects:

  1. Accumulate knowledge of software development and improve technical skills (e.g., technical mastery, hands-on skills).
  2. Build knowledge and experience in problem areas (e.g., gaming, healthcare, and finance)

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

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

    What is a good software design idea? What is a good software engineering idea? An engineer started a blog and forwarded a lot of other people’s articles. Do you have any ideas? Another engineer insisted on drawing UML diagrams for any design. Is that thoughtful?

  4. Develop professional skills (as distinct from technical skills) Professional skills include self-management, the ability to express and communicate, to work with people, and the ability to execute tasks with quality and quantity, which are important in IT and other industries.
  5. Most software engineers’ work is open to the public. How about user reviews of your products? What is your market share? How valuable it is to users. What part did you play in that? Actions speak louder than words, and the results of practical work are the most important evaluation criteria.

My current shallow view is that most software engineers will choose the first aspect to grow, the rest of the few aspects most people will not think about, and very few people will think about.

How to think about software engineering

How to think about software

As 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. There are various classification methods for software. Generally, we divide software into the following categories:

  • System software: operating system, device driver, tool software, etc
  • Applications: Users use them to perform tasks ranging from managing nuclear power plants to writing articles, or to communicate, play games, browse the Web, play videos, etc.
  • Malware: software virus, etc.

So I wrote a HelloWorld in Java like this:

Is this a program? A. Does it count as an app? After a fashion, it seems to only be used by me, and the only application scenario is to output Hello World to ensure 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 lifecycle. A program like the one I wrote above seems to end its life as soon as the results come out. Because all it does is give me stickers. What happens when a program has many users? These users all have different needs for the application, and we seem to have a lot to consider, not only to ensure that the needs are met, but also to ensure the quality of service. It reminds me of the little sand castles that children build on the beach. Do those little sand houses count as buildings? Not really, because no one can live in these little houses. What about building houses for people to live in? We should think in terms of engineering, because there are many things to consider, such as duration (how long it is expected to be completed), floor area, architectural style, and the service life of the house.

When we compare building a house to developing software, it is the same. When the software is originally designed for a certain number of users, it is impossible to write the program so loosely. We also have to consider the duration, the software architecture, and the service 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, like a 20-story building that’s already been built, and when it’s almost finished, no one’s going to ask for a basement under that 20-story building, but in software development you’ll often see the need for that.

How to think about engineering

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

Engineering: The creative application of scientific principles to design and implement a building, machine, device, or production process; Or use one or more of these entities in practice; Or the process of implementing these 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 involved a great deal of planning, computation, collaboration of various roles, and the work of hundreds of thousands of people, animals, and machines over many years. These factors are still present in various “engineering” (chemical engineering, civil engineering, software engineering) that have since emerged.

Writing here, I suddenly remembered a project competition organized by my class in college, which was to write a project with what I learned. We had just learned Servlet, JDBC, HTML, CSS, JavaScript and JQuery at that time. Naturally, we were full of confidence and were discussing with some classmates. Some students expressed confidence that Java is not CRUD(add, delete, change and check), we find a background template, write CRUD line. At that time, basically all the students thought so, so I found a background template, to save the work time in the front page, there is no design goal, very simple allocation. Some students spent a period of time on the database, drawing and drawing with ER, but in the end, the software is all for 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 don’t seem to have a clear consensus, and collaboration is randomly divided. The software was like a thatched hut that was never meant to be lived in. A gust of wind blew and the house collapsed.

But what if it’s really user oriented, that the software you’re building is meant to be used by people? We need to design goals, collaborate, and develop 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 city planning (code refactoring after the number of users of corresponding software increases).

From an architectural point of view, no one thinks that building a house is all about moving bricks and cement. This seems to correspond to adding, deleting and checking the server side. We are building a project with these. This means that we should consider all aspects of a problem, rather than being a blind man and feeling an elephant.

How to think about software engineering?

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

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

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. Software engineering in a broad sense also includes user experience, user interface design, and so on.

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

Software = program + software engineering = Data structure + algorithm + software engineering.

In fact, the plus sign above we can understand as and, a good software, even if the function and similar software is not very different, but it will feel very useful. This is the User Experience of software. User experience is not directly related to data structures and algorithms (if you want to say that I wrote SQL that made the response slow, the user experience is poor, and you see a lot of very good quality buildings that are also rated as failures), but a lot of very successful software wins in this area.

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

  • I use C language to achieve the binary tree traversal algorithm. Here, the binary tree is the data structure, the implementation details of 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 have to know about binary trees?
  • I became a professional programmer, but I realized that all the algorithms had already been implemented by others, and I could just call them. It seems that our company’s software has little to do with data structures and algorithms. What about the data structures and algorithms I worked so hard to learn? How do you tell a good programmer from a bad programmer?
  • After I went to work, I found that the program written by my former colleague was so rubbish that I could not understand it and could not maintain it. I want to overturn and rewrite! Later, an old employee told me with a smile that the program we see now is the result of last year’s new employees pushing to rewrite, and everyone said it was not as easy to use as the previous version.

The only refactoring I’m thinking of is replacing someone else’s code style with my own. At this point we seem to conclude that the program (algorithm, data structure) is the basic skill, but above the algorithm and data structure, software engineering determines the quality of the code; Business models affect the success or failure of a software enterprise.

Write in the last

This article is mainly “the method of building modern software engineering” reading notes, in my way to “the method of building” about the combination of things, is a reading notes. The picture on the cover is Yuejiang Tower. When I was writing this note, I thought that software engineering and civil engineering were a bit like each other, so I wanted to find some beautiful and successful building pictures. But I also thought that after a tall building was built, would it be possible to adjust the structure on a large scale? Probably not, this is quite a dangerous move, but a software in the face of different user numbers, will slowly adjust the internal structure, this is the difference between software engineering compared with other engineering.

The resources

  • What special style buildings were built after the founding of the People’s Republic of China?
  • “The Method of Construction modern software engineering” third edition author zou Xin