Introduction ============ In this Part we're going to look at a number of different ways in which computers operate and how we program them. It would probably be possible to do an entire course on any one of these topics! Our aim isn't to be the expert in all of them. Rather, the aim is to have enough familiarity in order to be able to progress with our programming. We won't get very far with our programming without needing to know a little about how computers work *under the hood* in order to know why our code looks the way it does. If we treat the computer as an opaque box, it's very hard to get the most out of it. We don't need to know everything about what's inside the box, but knowing a little helps a lot. The same applies for software engineering techniques. Writing code is only one part of the process of developing software. There are many other aspects to consider, from how we manage our code, to how we test it, to how we work as part of a team. All of these things impact on how we write code, and so we need to know a little about them too before you practice them in the lab. Remember that computers are human designed objects - they work the way they do because someone decided to make them work that way. Sometimes these decisions make a lot of sense. Sometimes the decision made sense at the time, possibly 50+ years ago. We might do it differently if we were to do it today, but we have to stick with what's already in place. Sometimes, different people decided different things, and there are different standards or ways of doing things. We need to pick one to actually use, even if other choices are perfectly good and someone else might pick a different one. Before starting our programming we need to know a little about which choices we're making and why. This includes learning about some common software development techniques. In places some of what we cover will be a bit *approximate*. The descriptions are sufficient and accurate for the depth we need them to be for this course. If you go on to cover some of the topics in more detail, you might find that some of the definitions get refined and a bit tighter compared to what we have here. The contents of Part 1 of the notes are: .. toctree:: :maxdepth: 1 :numbered: :includehidden: 0. Introduction chapters/motivation chapters/computer_hardware chapters/computer_software chapters/software_lifecycle chapters/software_development_tools chapters/programming_fundamentals chapters/wider_factors In general, we would advise you to read these notes once, at the start of the course. There's quite a few notes and so it will take a good few hours, but it will time well spent. There will likely be lots of items that you don't completely follow or don't make sense. Don't dwell on them for too long. Press on and read through everything before starting the labs. This will give you the best starting point. Then, come back to this section at the end of the course and read through it again. After you've done all of the labs, lots of things which you didn't completely follow at first will likely make much more sense. Links to the other parts of the course: - `Part 0 on course administration `_. - `Part 1 (this part) on underlying theory of how computers operate `_. - `Part 2 on general purpose computing, mainly with Python `_. - `Part 3 on higher performance computing, mainly with Rust `_.