CST 438 Week 1
This was our first week in CST 438 - Software Engineering.
Reflection
In our first lab for the week, we covered RESTful API, Spring Server, and Java Persistence Architecture (JPA). Although I had heard about RESTful API in the past, I had never used it up until this lab. Although some of the implementation was rather complex, the concepts of the API themselves seemed straightforward, as I was already familiar with how HTTP requests work from another class. I had also briefly learned about JPA in another class. I remembered JPA being complicated and difficult to learn in that class, and it continued to do so in this lab. Although I do feel like I have a better grasp on the architecture after the first lab, I think I will have to practice more to feel comfortable with it. We used Spring Server for both labs one and two. Similar to the other two APIs/tools, the usage of Spring was complicated, although some of the setup was simplified thanks to this tool.
In our second lab we covered unit tests, why they are used, and how they should be FIRST (Fast, Independent, Repeatable, Self-checking, Timely). Similar to the topics we had covered in lab one, I had very little experience creating unit tests, although I did have some experience using them.
We also read the first chapter of our school textbook, which covered some of the basic concepts of software engineering, including the difference between software engineering and programming.
At the beginning of this week, I expected a course covering Software Engineering to cover strategies for how to design and manage programming and software projects. Based on the course information and this week's reading, this assumption appears to be correct. For example, later in the course we will be covering strategies for project management, like AGILE. We will also be covering how to test our software and certain tools and APIs that are popular. While I didn't necessarily expect to cover these types of topics, it does make sense that we would cover them. After all, choosing which tools a project will use and understanding what they can do and how they will be used are parts of software engineering.
SAG Ch. 1
The textbook we will be using in this class is Software Engineering at Google, by Mantric and Wright. This week we read the book's first chapter.
This chapter discusses the definition of software engineering versus programming. It states that programming involves one programmer and small tasks, while software engineering involves teams of people and larger projects and decisions. It equates programming to a square, and software engineering to a cube.
Important factors in software engineering and programming include time, scale, and sustainability:
- Time: The lifespan of a project and its code. How long will a project be worked on? How long will it have to be maintained? Will it be maintained long enough to worry about refactoring or changes in the libraries or OS that it uses?
- Scale: The size of a project and how many resources it has access to. Is it simply a programming assignment or exercise or is it a AAA video game? Does it have access to one person or 10,000? Does it have access to one computer or a large network?
- Sustainability: How easy is it to upgrade or adapt a project to new library or OS versions? Is it simply going to be rewritten? Will upgrading it be a headache or will it be planned for?
The book defines Hyrum's Law as, "With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody." The book warns against relying on niche behaviours in APIs in long-lasting projects, because they might be changed and thus break your program, but admits that it might not matter for short-lived projects. The book also states that this can relate to hardware just as much as software, as the benefits of getting newer, more powerful hardware can be diminished if the software is not changed to compliment it.
The book states that software engineering involves making decisions about projects. Most decisions inherently come with some kind of trade-off in cost. The book defines the following categories of cost to be able to make more educated decisions:
- Financial costs (e.g., money)
- Resource costs (e.g., CPU time)
- Personnel costs (e.g., engineering effort)
- Transaction costs (e.g., what does it cost to take action?)
- Opportunity costs (e.g., what does it cost to not take action?)
- Societal costs (e.g., what impact will this choice have on society at large?)
Comments
Post a Comment