This unit develops the students' ability to design, implement and maintain moderately complex, realistically-sized programs using an Agile software development methodology. It builds upon the basic programming techniques introduced in introductory programming unit and offers the first introduction to the implementation of more complex real-world programs. Examples of such systems include compilers and interpreters, simulations, visualisation tools, drawing packages, database systems, graphical games. Such systems may be implemented in the context of non-traditional computing environments such as smartphone "apps". The unit may offer students the opportunity to get acquainted with a second programming language within the procedural-object oriented paradigm, such as C++, Python or one of their cousins, depending on the scope of the project chosen in a particular semester.
The unit bridges between core programming knowledge and the large-scale software engineering context. It will emphasise the implementation and use of intermediate to advanced data structures (such as search trees, hash structures, graphs and graph algorithms etc.) and the embedding into an actual computing system (i.e. interacting with the O/S, networking components etc).
Upon successful completion of the unit, students will have an understanding of:
- agile software development practices including iteration, test-driven development, spiking, and continuous customer involvement;
- how to design moderately complex programs where that design will typically incorporate a number of modules and a number of levels of refinement;
- the role of software architecture in program design and a knowledge of a number of commonly-applied software architectures;
- how to make use of design patterns, re-usable components and software libraries in designing modular software;
- how to make design decisions that take into account desirable quality attributes such as flexibility, maintainability and re-usability;
- how to implement programs in a systematic manner using an integrated testing procedure in such a way that modules are highly likely to function as specified;
- how to isolate faults within a program in a systematic manner;
- how to use software tools to aid in the program design and implementation process. These tools might include program design tools, integrated program development environments, configuration management systems, re-factoring tools, automatic testing environments and debuggers;
- how to adequately document a software project.
They will have developed attitudes that enable them to:
- evolve a software system in response to feedback over time;
- recognise the importance of process in achieving quality in a repeatable manner;
- appreciate the distinction between analysis of program requirements and design that seeks to meet specifications;
- develop software designs that place appropriate importance to the user experience;
- adopt an approach to making design decisions that involves considering a range of options for design decisions and evaluating potential design decisions with reference to a system of values;
- evaluate product and process development with the aim of continuously improving their software development methodology;
- understand the importance of being able to communicate all aspects of the program development process, and identify the most appropriate medium for that communication.
They will have developed the skills to:
- design moderately complex, real-world programs where that design involves multiple levels of refinement and the specification of a non-trivial number of modules;
- learn a new programming language or environment efficiently when that programming language or environment is similar to a programming language the student already knows;
- develop software in a modern software environment that may include software development tools such as those found in an integrated, programming environment, configuration management systems and automated testing systems;
- design and implement programs that can interface with complex software systems such as graphical-user interfaces, database systems and mathematical libraries;
- design and implement programs that may need to communicate via a computer network with software systems on other computer devices;
- design and implement systems on alternative computing platforms including smartphones and embedded systems;
- identify performance-critical aspects of a software system and learn to apply their analysis skills in larger systems.
They will have demonstrated the communication skills to:
- create design documents that can be used to present a view of the software to other stakeholders;
- identify items that are insufficiently clear from written documentation and proactively seek clarification from stakeholders;
- create documents or on-line help that enable people to understand how to use the program;
- create documents that allow a programmer to understand the program in sufficient detail to allow the software to be maintained;
- produce literate programs, i.e. program source statements that are well commented.
Examination (3 hours): 50%; In-semester assessment: 50%
Minimum total expected workload equals 12 hours per week comprising:
(a.) Contact hours for on-campus students:
- Two hours of lectures
- One 3-hour laboratory
(b.) Additional requirements (all students):
- A minimum of 7 hours independent study per week for completing lab and assignment work, private study and revision