summaryrefslogtreecommitdiff
path: root/01/readme.md
blob: becb6d9da70e73f5c84ab05dfc72d54f918ef4a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
---
author: Adam T. Carpenter, Carpenter Tutoring
---

# Computational problem solving with _Rust_

## The study of computer science

```
~~~fsays
Not just for computer scientists
~~~
```

[practice of computing using python](https://www.pearson.com/en-us/subject-catalog/p/practice-of-computing-using-python-the/p200000003329/9780137524839)

[rust book](https://doc.rust-lang.org/book/)

---

# Why computer science?

Computers are "more universally applicable than any other commodity in history."
(Punch & Enbody)

There is no other machine with as many diverse uses as the computer. A
reprogrammable machine is a machine that works for _you_.

## Not just computer programming

- theory of computation
- efficiency
- algorithms and data structures
- parallelism
- software engineering

_Computer programming is a great way to begin exploring these fields_

---

# Difficulty in first-time programming

It's like learning how to write poetry in a foreign language. You need:

- fluency: the vocabulary and grammar to read and write the language
- ability: the skill to rhyme, write in verse, _make poetry_

Learning to program has similar roadblocks. You need:

- syntax and semantics: the structure of Rust as a language
- problem solving: the skill to transform your problem into a solution

---

# Good programs are essays

Programming is writing how _you_ think a problem should be solved.

A program is your thoughts!

## 1. Think before you program

Writing a program should describe your thoughts well.

Not just for computers, but for other human beings! You're going to read your
program over and over again. Eventually you'll inevitably write programs in a
group. Then others will need to read it too.

## 2. A program is a human-readable essay on problem solving (that also runs on a computer)

---

# The promise

A program, or an essay on problem-solving, has impact because it can be executed
on a computer. Your problem-solving thoughts

- are executable
- are repeatable
- are independent of you

Programming is a leap forward in the way the printing press was hundreds of
years ago.

---

# Choosing a language

The variety of languages is enormous, each one with a specific intended purpose.

## Why Rust? "performance, reliability, productivity"

- useful types and memory guarantees
- makes it easy to write concurrent programs
- has a friendly compiler and helpful borrow checker
- provides good documentation
- offers great standard library and third-party libraries

Thanks to middle school math, most folks have the prerequisite knowledge to
understand variables, functions, and types.

## Why not C, Java, Python, etc.?

Some of these languages force you to think about computer organization. Others
may direct you into an object-oriented programming mindset. Still others promote
dynamic type conversion or make it easy to dereference null values.

The most important reason for using Rust is it helps prevent you from making
mistakes, regardless of your skill level.

---

# Is Rust the best language?

If you don't already know you'll soon learn there is no "best language."

All languages compromise on something; Each has its strengths and weaknesses.

Rust is a good, _general-purpose_ programming language with _broad_
_applications_.

Once you've gotten started, you'll be better equipped to explore other languages
that may be better suited to solving your specific problems.

---

# Computation and computers

_Computation_ is the manipulation of data by humans or machines

...be that data numbers, letters, or other symbols.

A _computer_ is something that does computation

Note this does not specify _how_ the computation is accomplished. However, there
are some things that every computer needs in order to do its job.

- accept data as input
- manipulate data (do computation on the input)
- output data

---

# Mechanical and electronic computers

_Computer_ used to be a job description for human beings!

General-purpose, reprogrammable, electronic digital computers first appeared in
the 20th century.

The basis of every digital computer is an on-off switch. The technology behind
these "switches" has evolved from mechanical relays to vacuum tubes to
transistors.

_Transistors_, the tiny electronic switches powering modern computers, are
either on or off. Just like a light switch, when turned on, they allow
electricity to flow. Using switches to power other switches, you can create
circuits that represent logic.

---

# Example: a three-pole light switch

```
~~~graph-easy --as boxart
[hall switch] .. off ..> [ceiling lamp]
[den switch]  - on -> [ceiling lamp]
[hall switch] <-> [den switch]
~~~
```

```
~~~graph-easy --as boxart
[hall switch] - on -> [*ceiling lamp*] { border: bold; }
[den switch]  - on -> [*ceiling lamp*] { border: bold; }
[hall switch] <-> [den switch]
~~~
```

Note: this is actually an XNOR gate, but we'll talk more about logical operators
later.

---

# Replace AC power with truth

Off: false, 0

On: true, 1

Both switches off: light off, false, 0

---