Course aims ----------- This unit aims to provide students with an introduction to programming computer systems. It will provide an understanding of software development tools, and hands on experience of coding simple programs to build practical skills. This will give awareness of different types of programming approach (interpreted, procedural, and object orientated), and an introduction to coding for problem solving and creating algorithms. The unit focuses on the programming of desktop/laptop class devices, with some consideration of high performance computing (whether for high-spec computers, or embedded/single-board computer systems). .. _topics: Topics ------ The unit will cover the following topics: 0. Introduction and motivation (including considering factors such as sustainability, risk, security, and equality/diversity/inclusion in programming). 1. Overview of major operating systems (e.g. Windows, macOS, Linux, Real-time Operating Systems (RTOS)). 2. Software engineering techniques (e.g. integrated development environments, version control, software lifecycle, debugging, unit testing). 3. General automation of computer tasks (e.g. shell scripting). 4. Core programming concepts (e.g. variables, if statements, loops; illustrated in Python). 5. Computer hardware and software concepts for programmers (e.g. memory addressing, heap and stack memory, data types, number formats, ASCII and UFT-8). 6. Practice using interpreted languages, including using standard packages and performing data visualization (e.g. via Python, Numpy, Scipy, Pandas/Polars, Matplotlib). 7. Practice using compiled high-performance languages (e.g. Rust). 8. Awareness of other compiled high-performance languages (e.g. C/C++). 9. Overview of coding for problem solving: common algorithms and high performance computing concepts. 10. Industry relevance (e.g. guest lecture). 11. Revision. Items 0-9 are covered in these notes. Items 10 and 11 are only covered in the in-person lectures, if taking the course in-person in Manchester. Intended learning outcomes -------------------------- After successfully completing the course students should be able to: 0. Explain the need for, and importance of, programming, including why higher performance code may be needed and how this can be achieved. This includes an awareness of factors such as sustainability and security which may affect program design and implementation. 1. Demonstrate an awareness of the hardware and software in a computer system and how to program a desktop/laptop type device. 2. Explain the software development process, from requirements capture to long-term support, including the importance of documentation. 3. Use standard development tools (e.g. integrated development environments and version control) for writing and debugging software. 4. Apply standard programming techniques (e.g. if statements, loops) in different programming languages. 5. Test developed software to give evidence that the code is working and is functionally correct. 6. Perform data visualization using standard libraries. 7. Work individually to translate a given descriptive problem or algorithm into program code using appropriate programming elements, techniques and data structures.