Back to List of Programmes

How and Why We Teach What We Teach

The information below outlines some specific questions that we have been asked in the past.

How much of the course is theoretical?

  • Our courses are theoretical - but also cover practice. They include hardware - but proceed into the theory of the abstract representation of data and algorithms. Hardware has its theory. Software has its engineering context.
  • Our graduates have few worries about employability, due to the nature of our courses. As we teach theory as well as practice, you will be able to easily pick up any programming language or concept in the workplace.
  • If, in ten years' time, you want to be making decisions rather than being told what to do, make sure that you understand the theoretical basis of what you are doing. Theory makes for flexibility. Theory makes for an interesting and rewarding future. Theory is fun.

How are science/engineering, theory/practice and hardware/software related?

  • Most universities offer a variety of courses, called Computer Science/Engineering, Computer Systems/Software Engineering, Theoretical/Mathematical Computer Science, and so on. In some of these, 'engineering' implies a greater hardware component, in others it implies an engineering approach to software systems, and in others it implies both of these. But, generally, the science/engineering, hardware/software and theory/practice axes are at right angles to one another.
  • Here at York, our Computer Systems and Software Engineering, Computer Science with Embedded Systems, and Computer Science programmes lie near to one another, at particular points in this space.
  • Our Computer Science and Mathematics and Computer Science and Philosophy programmes are more towards the theoretical, software and scientific end, while still covering practical matters and looking at computer systems and their software in the context of the real world that needs things to work and work well.

Why is there a fixed programme (no options) in the first year?

  • We believe that you need enough breadth in the first year that you can choose freely what modules to follow in the second and later years. That is, not any breadth, but a range of courses designed to provide you with the essential pre-requisites for later studies.
  • In the second year, there is some optionality in some of our courses, but there is a great range of options in the third and fourth years. We try to ensure that you do not close off your options in later years by missing their pre-requisites in earlier years, at least up to the point where you are specialising in a well-informed way. We do not want you to say 'If only I had known ...'
  • The ultimate freedom comes in your third and fourth years, where you can choose your individual project topics. Also, you can undertake modules taught by other departments. By that stage of the programme, you should be following your own interests intensively in your projects and also, if you wish, by exploring ideas in other subjects.
  • As an overall guiding principle, we think that optionality should increase over the duration of the three- or four-year programme.

Why does the first year include hardware?

  • Why hardware? All Computer Science courses contain hardware to some extent. Partly, it is a matter of familiarisation: providing you with a piece of the cultural background of Computer Science. Even if you see yourself as a software person, you don't want to find yourself simply not understanding what is the topic of discussion during a design meeting.
  • You will find that Computer Systems and Software Engineering, Computer Science with Artificial Intelligence and Computer Science with Embedded Systems have a hardware strand (one quarter of your time) in the first year, and also a hardware/software 'hardware systems' course in the second year. Beyond that, it is up to you whether or not to choose hardware options and projects.
  • Our Computer Science course is similar to these programmes, except that the second-year hardware systems course is optional.
  • The hardware strand begins with un-assessed familiarisation. Most students find that they enjoy the practical work, even (or especially) those to whom it is largely new.

What programming languages would I learn, and why?

We aim to educate our students to be able to choose, learn, understand and exploit a new language in a matter of days. That calls for flexibility of mind, and deep knowledge of the concepts of programming and software engineering, rather than a list of languages that you 'know'.

  • We make available to you the information and facilities to learn about whatever programming languages you wish.
  • Computer Science is about more than programming. Many of our modules have nothing to do with programming. Nevertheless, it is certain that programming is an important part of Computer Science, and indeed is its distinctive activity.
  • Bear in mind that there are not just many programming languages, each with its own name, but that these languages fall into groups of various kinds: procedural, logical, functional, object-oriented (OO).

Of course, it is possible to use a procedural language (Ada, for example) functionally, and Ada has had object-oriented features incorporated in it, in its current version; but it remains true that the design of each language will have been thought out from a procedural, logical, functional or object-oriented starting point. And every programming language must have been designed by someone: perhaps an individual enthusiast, or perhaps a committee. It tends to show.

  • For some of our modules, it is necessary to use a programming language as a means of expression for the subject-matter of the module. For example, Real-time systems and languages involves the expression of real-time concepts in a particular programming language, and also the study of several languages (Ada, Java, ...) to compare their suitability and efficiency for that purpose.
  • When a programming language is necessary, you will be given enough information to get started, and then shown where information and tools are available.
  • In the first year of the programme - for example in the Principles of Programming module - you will get a lot of explicit help concerning the language being used. Later on, especially in the third and fourth years, you will be expected to learn in a much more independent way.
  • Examples of languages that are mentioned, either as a significant part of a module or just in passing, are: Scheme, Ada, Java, Z80 machine code, C++, Prolog.
  • The study of programming languages, their design and especially their implementation, is an important part of our programme. Choice of a type of language, and of a method of implementation, is an important engineering skill, with many intellectually challenging aspects. But please note that that is different from the serial teaching of specific languages as collectable items.

What do you regard as the 'core' topics of Computer Science, and when do you teach them?

  • The core topics are principally algorithms (ways of processing data), programming (ways of expressing algorithms) and architectures (ways of executing programs).
  • What about applications? Well, yes, in any Computer Science course you must study applications, because, without applications, Computer Science would be an interesting sideline of engineering but not at the forefront of social and economic life.

Applications are what computers are for. But different courses at different universities can properly stress different fields of application. Also, applications come in a wide variety, and fit most neatly as options later in the course. That is, it is not optional to study applications (they are core in that sense), but it is optional which applications you study.

But would it be possible, conversely, to regard applications, whichever they are, as the core topics, and to look only briefly at how they work? Yes, to some extent, and for some applications more than others: but then that would be IT rather than Computer Science (see Computer Science (CS) versus Information Technology (IT)).

  • Should core topics come in the first year? Should the first year consist solely of core topics?

Some core topics depend upon other core topics, and so, to that extent, they cannot all be taught in parallel.

Similarly, there are some core topics that need certain other topics to be taught and studied before they can begin, but then those preparatory ideas need not be taught or examined explicitly once that has been done. Such preparatory topics must occur at the beginning of the whole programme, in parallel with some core topics but before others.

That means that some of the first year must be preparatory, rather than core, material; and some core topics must run into the second year. Roughly speaking, core topics occupy half your time for the first half of your entire programme: that is, of the first and second year of your four (or perhaps three) years.

  • What are examples of preparatory topics?

Some of the first-year Computer Science mathematics is preparatory, and some of the first-year Computer Science electronics is preparatory.

The rest of these is core, since they flesh out the study of theoretical computer science, and of computer architectures, respectively.

  • When you say that the principal core topics are algorithms, programming and architectures, what other core topics are there? And when you say that these are 'fleshed out' how is that done?

To a large extent, the answer to these questions is provided directly by a comparison of our second-year with our first-year.

Algorithms must, first, be correct. So we study ways of constructing them to be correct, or proving them to be correct. Then, they ought to be efficient. Further, we might want to concentrate on the structure of the data involved; or perhaps, instead, concentrate on the methods of manipulation.

Programming does involve the study of languages for programming; but, to a much more important extent, it involves programming as a general activity. Also, some languages are tailored for special structures of data, or special methods of manipulation. Some place efficency in time, or in space, above all else (except correctness); while others, as their main goal, enable great flexibility of expression.

Architectures are designed to execute algorithms expressed in the form of programs. But of course they are constrained by having to be physically constructable. An algorithm might be re-classified from 'interesting but impractical' to 'a challenge but possible', through the invention of new hardware: perhaps actually prompted by that specific requirement.

One way in which the early principal topics are fleshed out is through the study of some 'tools', which increase the power of the basic ideas to the point where they can be used immediately and effectively to tackle applications. These tools include compilers, which allow high-level programming languages to be used; operating systems, which allow programs to exploit the architecture of the machine they are running on, fully, but without the programmer having to worry about the details; and so on. The second year of our core programme has a lot about tools.

A glance at the four strands of our second-year will show four activities each requiring a very different approach to programming, and a different style of programming language to do it in. Which of these are regarded as 'core' can be judged to some extent by seeing which are not optional for students of the combined-subject programmes.

Nevertheless, all theory/practice, software/hardware, science/engineering and technology/application problems are related. Knowing more about one helps you to learn about the others.

Back to Top