Our first year is an introduction to four of the main themes at the heart of Computer Science.
- Professional Computing
- Computer Systems
- Mathematics for Computing
In the second and third year (and fourth year of the MEng in Computing) you will get to explore these themes in more depth, as well as branch out into other areas of the subject.
Programming is a key skill in Computer Science, and you will write a lot of programs during a degree in the subject. Although not all Computer Science graduates go into careers that involve programming, quite a lot do (at least to start with). Also, even if your career in Computer Science doesn't directly involve programming, it is almost always important that you have some knowledge and experience of it.
We have two main programming modules for students who are studying degrees that consist solely or mainly of Computer Science. Programming: Principles and Practice is an introduction to programming in Java, and runs throughout the first year. It is very hands-on and develops the practical skills of problem solving and design, that are key to writing good programs, in a language that is widely-used in industry. After Christmas, you will also study Programming: Performance and Efficiency which looks at more advanced topics, like how to organise data and choose fast solutions to problems. Computer Science students will also study a module on Functional Programming, which is a more specialised approach. For example, functional languages have advantages when writing programs that might be run on parallel computers.
Students who are studying degree schemes that only consist of a minority of Computer Science normally study Introduction to Computing I and Introduction to Computing II instead. These modules cover much the same material as Programming: Principles and Practice and Programming: Performance and Efficiency but in a bit less detail, and at a slower pace.
Computer Scientists have many responsibilities in their working careers. They must build systems that are effective, safe and meet cost and time targets. They are often responsible for sensitive personal and commercial data. They are in control of technology that can have disasterous consequences if it is misused, or used carelessly. Computer Scientists also need to be able to communicate knowledge and ideas - both to other Computer Scientists and members of society in general. The Professional Computing theme is aimed at making sure our graduates can act responsibly and effectively in their professional career.
Computers and Society introduces the legal, ethical, moral and professional responsibilities of a Computer Scientist. You would study issues like codes of conduct that that govern professionals behaviour; legal concepts - like copyright and data protection; and ethical problems - like censorship, privacy, freedom of speach and surveillance.
Building reliable software does not just need good programmers. You also need to understand: what the user of the software needs (requirements); what the software will actually do to meet those needs (specification); how the software is intended to work (design); how everyone involved - and there could be thousands of them on a very big project- can work together effectively (organisation and management); what could go wrong and what to do about it (risk anlysis and management); how to make sure everything works properly (testing and debugging ); how long it's all going to take and how much it's going to cost (planning); how to make sure that any changes that need to be made in the future are as easy as possible (maintenance). Collectively, this process is called Software Engineering. The module Software Development: Tools and Techniques is an introduction to both Software Engineering and the sophisticated software we can now use to make the process easier.
Computer programs obviously don't work on their own - they need hardware to run on; and system software to manage the hardware and provide services for our programs. Computer Systems is about that hardware and system software. It also introduces the question: how do we know exactly what software is supposed to do?
Computer hardware is extremely complex and ultimately relies on sophisticated Physics to work - luckily, we can abstract away from the detail and deal with much simpler ideas. The idea of abstraction is very important in Computer Science. The systems we deal with are much too complex to think about in detail all the time, so we build layers of simplifying abstractions to make them easier to deal with. We do this when dealing with software, networks and hardware. For example, the programs we write are actually translated into simpler but harder to understand languages; which in turn are translated into ones and zeros; which in turn are represented in computers by electrical and magnetic charges. But we hardly ever think about these lower level versions of our programs, because it isn't necessary - or helpful! However, we do need to have some idea how they work. The module From Language to Hardware is about how computer hardware works - without getting down to the actual electronics. Similarly, the module Computers and Computation is about operating systems and how they provide services for our programs, enabling them to use the computer hardware (and other programs) effectively.
When building software we often forget the issue of knowing exactly what it should do and instead focus on how it works. Building software that doesn't do exactly what it's supposed to is always expensive and annoying (and actually very common). But in some circumstances (for example medical equipment, avionics, industrial equipment control, automotive systems) it could be disasterous. Modelling Computer Systems is about expressing what systems should do. It also introduces the problem of how we can be completely sure that software does always do what it is supposed to.
Like any technical subject, Computer Science uses mathematics to explain how things work, and predict behaviour - what we generally call Theoretical Computer Science . For example, we can use mathematics to explain how our programs work, how long we can expect them to take to solve problems, what problems we can and cannot solve, and what our programming languages and computer systems mean. The mathematics of Computer Science is not like the mathematics of anything else. This means that we cannot assume that you will know anything about it - even if you have, say, an A-level in Mathematics. Consequently we do not require an A-level in Mathematics - because we will have to teach all the mathematics we need in any case. We do however require a good GCSE or equivalent.
The mathematics of Computer Science is usually called Discrete Mathematics - and it is about logic, reasoning and about dealing with different types of data (not just numbers). There are two mathematics modules in the first year: Discrete Mathematics for Computer Scientists I and II. As well as introducing the essential mathematics of Theoretical Computer Science, these modules also teach the mathematics you will need for some applications of Computer Science - like Graphics.