This month we’re going to discuss a little bit about software engineering, what it is and just what it entails. But first I have a few smaller points that need to be addressed in relation to past articles.
I have completed last months demo package for Part 2 of Learning How to Program. You can find it here. Please do give the problems a try on your own before looking at my solutions. I’m sorry for the delay but something RSBandB related got in the way.
Secondly, you’ll probably know by now that on Monday iPhone 4 was unveiled. iPhone 4 features a camera capable of shooting HD video, to go along with this Apple is releasing a mobile version of iMovie. From this it’s logical to assume that in the future iMovie will be able to run on iPad. This furthers the argument that with proper changes to software (making a mobile iMovie) the iPad could easily become a catalyst for a major paradigm shift as outlined back in early February.
Software Engineering, what is it? How does it work? And finally, why is it so important? These are all questions that I will answer in one form or another. This article is here because the average person has no idea what goes into creating software, even the most simple pieces that we all take for granted. I also wanted to provide more information about this very large area of Computer Science. This might be of use to you if you’re thinking of taking Computer Science as your degree in post-secondary education. If you want a more general rundown of what Computer Science is you should read What is Computer Science?
To put it simply, software engineering is the process in which software is made. The starts at conception and extends to cover maintenance, bug fixing, and planning of future versions all after the first version has been implemented. Software engineering is never done by one person alone. There may be small projects in which one person may plan the project, implement, and test it but this is rarely the case. Software engineering principles apply whether the project is a simple webapp to take notes or the next version of the Windows OS. Software engineering is a process, the process can take a variety of forms. The process is chosen at the start of the project and remains through the life cycle of the project. Now that we know what software engineering is, we’ll talk about some of the ways it’s performed.
The classic way to think about software engineering is the waterfall model. The waterfall model is one in which each step cascades down to the next, as a waterfall does. There are five main steps to the waterfall model: requirements, design, implementation, verification/testing, and maintenance. Each of these steps will have some overlap when moving to the next. There are various negative aspects to the waterfall model but in general it is considered the classic approach to software engineering.
The requirements phase is key. In the requirements phase the software engineering team will interview and visit the client to find out what the requirements of the software are. These requirements may be as simple as ensuring that the software will run on the client’s hardware. A more in depth requirement may be implementing a proper storage system for the software that will comply to the clients standards for their data and work with the new software. With software engineering it’s important to ensure that both interviews and observation take place. Interviews are fine for general requirements as listed above but observation can reveal requirements that the clients don’t know they have. An example of this might be using your software engineering expertise to take note of flaws in the current system by observing the client and make sure these are remedied with the new system. Overall if the requirements phase is not completed properly the software won’t perform the desired function and it will be useless.
The design phase is in which the software engineering team takes what they have learnt and conceptually build the new system. This will include workflow diagrams, user interface mockups, and a general plan of how the system will be implemented in software. Some other considerations will be what programming language and platform to use along with what style of programming (object oriented, procedural, low level, etc.) to use. There may be backtracks to the requirements phase as it might appear through the design process that a fundamental requirement has been glossed over. Once the design is deemed solid implementation will commence.
Implementation is the phase in which the software is actually built. Implementation also includes programming, which is what most people who have casually built software are experienced in. Implementation can be handled by the same team or a different team entirely. The team is divided into sections for implementation. One group of people may be responsible for the low level code that powers the back-end or guts of the system. Another may be tasked with building the interface and polishing it to standards. Another may be tasked with proprietary file system interaction. And, another may be tasked with building a database back-end for the software. Ultimately there are many facets to the implementation phase and each project will have different divisions.
Once implementation is complete testing must commence. Testing is key because no one writes a perfect application on the first try. Testing not only rids the application of performance bugs and typical “glitches” but it also can flush out problems that may have surfaced from design oversights. If the company is large enough it’s likely there will be an entire division devoted to QA (Quality Assurance) it’s the responsibility of these people to try to make the application as smooth as possible by providing feedback to the developers. Testing is done on individual sections of the code in the application through unit testing. Unit testing is when a section of code is tested with given data and the result is compared to the expected data. Testing can also done at a high level on developer systems, testing should also be done on production units to provide the most accurate representation of the software’s final state. After the software is deemed acceptable it is sent to the client in its final form.
The cycle does not end here. The developers always remain attached to a project for maintenance purposes. Maintenance may include bug fixes for bugs that were not initially found or bugs introduced by a systems change. It may also include small feature releases to account for a new requirement that was not present in the initial design phases. Maintenance can be tricky because it’s not as simple to add new features while the system is in use. This brings the cycle to a point where it can start from the beginning again for any possible new feature sets. Once work on any feature sets are complete they will be rolled into the main development cycle.
The above process is most common approach to software engineering. Recently there has been increased attention a new way to look at software engineering, agile methods. Agile methods for software engineering are defined by the Agile Manifesto. Overall agile methods prefer more interaction with the client and finished software rather than having a set contract and a stack of manuals for the software. Agile methods also stand for flexibility in response to requirement changes during the development process rather than setting the requirements and design in stone early on.
Finally, the most important question: Why is software engineering important? Quite frankly if there’s no set process of any sort in use while creating software it’s highly likely that the resulting software will be useless, buggy, and a pain to use. I’m sure we’ve all downloaded various freeware or applications slapped together by someone that were infuriating to use. This doesn’t mean that if you want to build something simple you have to exhaustively follow this process but there should be some resemblance of order. If you’ve never evaluated requirements or planned a design before beginning a project, give it a try, you’ll find it greatly helps making a more polished product once you are finished.