-
Notifications
You must be signed in to change notification settings - Fork 1
Software Engineering
What do we mean by "software engineering"? What distinguishes "software engineering" from "computer science"?
The terms "programming" and "software engineering" are sometimes used interchangeably, although each term has different implications and different emphasis. Programmers write code. Engineering means using theoretical knowledge to create something real. Software Engineering is about building something real, a software tool, although less tangible than a physical product. Our group writes code, but more importantly maintains that code, designs software tools (conceptually / architecture / implementing design patterns), and makes sure to use version control tools correctly, to have high automated testing coverage (continuous integration ,CI), and to have every contribution peer reviewed. There are all engineering aspects.
Software Engineering encompasses not only writing code, but all the tools and processes for building and maintaining that code over time. We try to make the code-base sustainable, and the act of programming more rigorous. Software Engineering can be thought of as "programming, integrated over time": from conception to introduction to maintenance to deprecation.
The three fundamental principles we keep in mind are:
- Time and change. How code will need to adapt over its lifetime? What is the expected lifetime of your code?
- Scale and growth. How do we adapt as the code evolves?
- Tradeoffs and costs. How to make depressions based on the lessons of time, scale, and growth?
When we add new features we have to make sure that we don't harm other features of the software. A related concept is called Hyrum's Law which means that if there are enough users to a software, all aspects of it (even unplanned aspects) will be eventually dependent on by someone. Discussions of change and maintenance over time must be aware of Hyrum's Law, just as discussions of thermodynamics must be mindful of entropy. Just because the overall entropy doesn't decrease doesn't mean we shouldn't try to be efficient; just because Hyrum's Law will apply when maintaining software doesn't mean we can't plan for it or try to better understand it.
It is important to distinguish between "it works" and "it is maintainable". Another concept that is important to know is called "The Beyoncé rule": "If you like it, you should put a CI test on it."
A Software Engineering is a team effort. Yet the one parameter you have control over is You. We must work together towards a higher goal, provide code review in a polite and timely manner (try to give an initial feedback within a day if you can) and make our code open to the group and to the wide community. A great software is a product of great joint labor.
We share our code with the group and with the community to make sure we're working on the right thing, doing it correctly, and it hasn't been done before. The more feedback we get early on, the more we reduce the risk of discovering mistakes too late. The mantra is "Fail early, Fail fast, Fail often". Working openly and receiving feedback is critical to achieve this.
It's also important to strengthen "The Bus Factor" of a project. The Bus Factor is the number of people that need to get "hit by a bus" before the project is completely doomed. The knowledge and know-how of a project must be dispersed. It's better to be one part of a successful project, than the critical part of a failed project.
How do we build a collaborative team? We remain open to self-improvement, we respect others we work with, we trust that others are competent and we let them drive when appropriate.