CSCI3100 Software Engineering - CUHK Course Review

Term Taken: 2020 Spring

Remote Teaching due to COVID19

Instructor: Prof. Lyu Rung Tsong Michael

Grading Scheme

  • 6 written assignments (20%)
  • Group project - (free topic) web application (40%)
  • Final exam (40%)

Midterm exam cancelled due to COVID-19


Fundamentals of Software Engineering. (Ghezzi, Jazayeri, Mandrioli)

Topics Covered

  • Software life cycle.
  • Software qualities.
  • Software engineering principles.
  • Software specification: UML, DFD, FSM, petri-net, logic spec, ER-diagram.
  • Software design: design patterns, step-wise refinement, TDN.
  • Software testing and analysis.

Covered in tutorials:

  • Web client side intro.
  • Web server side intro.
  • Android dev intro.


This is a required course for CS majors, CS minors, and CE majors, so there were up to 250 students in the class. It taught us the more theoretical side of software engineering, which I disliked a lot since I always got bored when studying pure theory. Aside from that, software engineering’s theory was mostly based on heuristics and was seldom rigorous, this doubled the boredom. I just don’t get how studying terms like “rigor and formality”, “incrementality”, “portability”, “interoperability, and “ideal/complete/finer test set” improve our software engineering skills.

Another focus of the course was to learn specification techniques in software engineering. This included UML, DFD, FSM, Petri-net, logic specification, and ER diagram. This part was more useful, since we got a lot of chance practicing the techniques we studied when doing assignments and writing the specifications of the group project. However, I haven’t really worked in the industry before, so I don’t know whether the software engineering companies really write their specifications this way. Nevertheless, I think at least we got a chance to understand the structural design of our programs deeper.

The last part of the course was software testing. I got really excited at first since I always wanted to hone up my software testing skills, but after the lectures, I was slightly disappointed since the focus was again on the more theoretical side of software testing. We were introduced to McCabe’s cyclomatic number, white-box testing, black-box testing, and other not-too-practical ideas. We only got the chance to analyze a program and write some test sets using pen and paper instead of performing a real-world automated software testing workflow.

The assignments of the course were kind of tedious. Each of the assignment contains 4 (usually) open-ended questions. Students could get homework coupons by answering questions in class, each of it could be used as a waiver for one homework question. Although there were only 4 questions, we usually need to draw tons of diagrams for each of them, so saying that we spending 5 or more hours on a single assignment is not exaggerating. Also, the questions of the homework were always too ambiguous, so we had to spend a lot of time just to understand the questions. In short, I hated the assignments.

The group project was the spotlight of the course. We grouped in a team of 4-5 people and worked on a web application of our own choice. If you’ve ever attended a hackathon before, it was pretty much like it, except we had to write rigorous specifications for our project and the project timeline was 13 weeks. In this term, due to COVID-19, we had to do the project remotely, so it was a little harder. Usually there were 1-2 free-riders per group on average, as for our group, there was a Mainland Chinese student who simply couldn’t contact us since we were collaborating using What’s App and Google Doc, but he was blocked by the Great Firewall and he probably didn’t know how to use VPN. Free-riders were reportable to the professor, but we let our poor group mate pass for the sake of karma.

The course didn’t teach us any web application skills, so we had to learn frontend, backend, and database all by ourselves. For our group, we decided to make a bus management system including an administrator’s web client, an end user’s mobile client, and a backend which connects the clients to the database. The technology to use was also free of choice, so our group used Go, PostgreSQL for backend, Bootstrap for web client, and React Native for mobile client. It was interesting to look at the technologies used by other groups, including Vue, Flutter, Node, Typescript, Ruby on Rails, Django, PHP, and so on. The most painful part of the project was that we had to write a design report at the beginning and final report at the end, which contained UML, DFD, and other specification techniques taught in the lecture. The final report should be 30+ pages, and for our group, the final version of the report was over 60 pages long. It was impossible to do it alone, so group mates were very important. Aside from that, we needed to do a short project demo at the end of the course to show that the project was fully operable (that is, we didn’t lie in our reports).

In conclusion, I don’t think the course was interesting and useful except for the group project. However, since this is a major and minor required course, welp

Updated after I graduated – In Hindsight

In hindsight, CSCI3100 was actually a very valuable course. Now that I’m working in the software industry, many of the techniques I previously thought useless proved to be actually quite important. For example, in my day-to-day job, I need to write many design docs for new projects. Drawing diagrams such as UML, ER-relation and activity flow are the bread and butter for such tasks. Also, it is highly encouraged to write tests to coverage at least 90% of the production code in my company. Having some fundamental theory on software testing really helps. Thus, I would say, if you are more programming-oriented and found this course boring, just push through it and you will be rewarded once you get into the real-world software industry.

Project Link


More CUHK Course Reviews