-
Notifications
You must be signed in to change notification settings - Fork 7
/
curriculum.html
379 lines (327 loc) · 17.2 KB
/
curriculum.html
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
---
layout: page
title: The BJC Curriculum
call_to_action: Try the Curriculum
call_to_action_link: https://bjc.edc.org/bjc-r/course/bjc4nyc.html
header_background: class2
redirect_from:
- /website/contact.html
---
{% capture section_content %}
<p>The authors of the BJC curriculum think that computer programming is one of
the most satisfying of all human activities—it's generally fun (when
it's not frustrating because of a bug you can't find), but it's what Seymour
Papert called "hard fun," mind-stretching and, because the authority is the
computer rather than the teacher, a big change from jumping through hoops.
It's a game of skill, like chess, but
without the competitive aspect, and with useful results beyond the act of
programming itself. That's the best reason to study computer science, and we
want <b>all kids</b>, not just the ones who fit the nerd stereotype, to
experience our joy in programming.</p>
<p>We also think that computer programs (not just the pictures that programs
can produce) can be things of beauty. Yes, programs can also be ugly, if
they're long sequences of assignment statements with no structure. But good
programmers develop a sense of programming aesthetics. This is one reason why
it's so important to us to include <em>recursion</em> in the curriculum:
A recursive program can generate a complex, intricate computing process from a
very small piece of code, and we remember that revelation as the moment when
we discovered the beauty of programs.</p>
<p>It's not easy to preserve beauty and joy when translating a course taught
by its authors into a curriculum for widespread use. Too much scaffolding in
a project and the joy is gone; too little scaffolding and the student feels
helpless and incompetent. That's why the original authors from the University
of California, Berkeley, formed a partnership with the high school curriculum
experts at EDC (Education Development Center).
<a href="https://bjc.edc.org" target="_blank">Try the
curriculum</a> to see how you think we did.</p>
{% endcapture %}
{% include section.html %}
{% capture section_content %}
<h2>Computer Science Principles</h2>
<p>The College Board <a
href="https://advancesinap.collegeboard.org/stem/computer-science-principles" target="_blank">
AP CS Principles</a>
curriculum framework is organized around
seven "Big Ideas" (things to learn) and six "Computational Thinking Practices"
(things to do):
<p class="centered-strip">
<img src="{{ site.baseurl }}/assets/img/screenshots/pies_new.png" class="img-responsive"
alt="Pie Chart of 6 CSP Big Ideas (explained below)">
</p>
<p>Every conforming curriculum must teach all of these, but curricula may
differ in the amount of emphasis given to each. (The slices in the pies aren't
really quantitative, just a suggestive snapshot of how BJC stands out.)
</p>
<p>There is much overlap between the Ideas and the Practices. Creativity is
an Idea, but Creating is a Practice. Similarly, Abstraction is an Idea, but
Abstracting is a Practice. Think of the first pie as representing text in the
curriculum materials, and the second pie as representing how we expect
students to spend their time. The circles at the center of each pie indicate
that the idea of Programming and the practice of Creating are at the center
of BJC, and intersect with all the others.
</p>
<p>First, the Big Ideas. BJC is proudly <b><i>Programming</i></b>-heavy. We
believe that Snap<i>!</i>, the programming language we use, allows us to reach
a diverse audience of beginners, who may initially not think they're
interested in programming, because it combines the ease of use of visual
programming with expressive power previously found only in the most
sophisticated text-based languages. (More on this <a
href="#visual">below</a>.) We go far beyond the CS Principles requirements,
featuring the advanced techniques of recursion and higher order functions.
</p>
<p>We view <b><i>Abstraction</i></b> as the central idea of computer science,
and we emphasize the use of abstraction in the context of programming. This
includes both control abstraction to generalize programming patterns and data
abstraction to isolate the implementation of an abstract data type from its
use.
</p>
<p>Our secondary emphasis is on <b><i>Global Impact</i></b>, the social
implications of computing. We use readings and classroom discussion to
explore various aspects of this topic in each unit of the course.
Details of the topics and teaching goals are <a href="#social">below</a>.
</p>
<p>Two of the remaining four topics are more implicit than explicit in our
approach. Students <i>exercise</i> <b>Creativity</b> in their programming
projects, but we don't <i>talk about</i> it to the same extent as the other
topics. Similarly, students <i>develop</i> <b>Algorithms</b> as they program,
but we don't often treat algorithms as a separate topic, except when we are
teaching about analysis of algorithms and asymptotic orders of growth.
</p>
<p>The final category of topics, <b>Data</b> and <b>the Internet</b>, are
important and are covered thoroughly, but where possible our coverage takes
the form of programming activities rather than, for example, using commercial
database software.
</p>
<p>Now, about the Practices: The phrase "Computational Artifacts" is
meant to encompass videos, slide decks, blogs, programs, music,
spreadsheets—anything you can create with a computer. Creating is, we
think, by far the most important of the Practices, but the most important
artifacts are computer programs! More precisely, if a student is writing a
game program, for example, there are two acts of creation happening at once.
The student is interested in making a game, and displays creativity in the
design of the game. But she creates the game by creating a program, and
<em>also</em> displays creativity in the design of the program structure.
And the latter is the real computer science.
</p>
<p>Just as the idea of abstraction is central to, and inseparable from, the
idea of programming, the <em>practice</em> of abstraction is central to
programming. We constantly encourage students to use layers of abstraction to
structure a programming project.
</p>
<p>"Connecting computing" can mean connecting it to hobbies, or connecting it
to industry, or to science. But most importantly, for us, students connect
computing to its social implications, our secondary focus.
</p>
<p>Almost as important is the practice of analyzing programs: debugging,
predicting the behavior of someone else's code, and thinking about efficiency.
But we would emphasize that this skill is not an end in itself; it serves the
ultimate goal of creating programs that work. We're not nearly as interested
in analyzing "artifacts" other than programs.
</p>
<p>The two remaining practices are important, but less emphasized in BJC.
Like most CSP curricula, we use pair programming, so students are constantly
talking with their partners and sharing the work. At the beginning of the
course we teach the process of pair programming, and in the discussion of
social implications of computing students have to communicate their ideas, but
communicating and collaborating aren't unique to computer science.
</p>
{% endcapture %}
{% include section.html %}
{% capture section_content %}
<a class="anchor" id="visual"></a>
<h2>Visual Programming</h2>
<p><a href="https://snap.berkeley.edu" target="_blank">Snap<i>!</i></a>, the programming
language designed to support this course, starts with the <a
href="https://scratch.mit.edu" target="_blank">Scratch</a> design of drag-and-drop blocks
representing primitive capabilities. Scratch is routinely learned by
self-taught eight-year-olds, so it's not intimidating and has a very low
barrier to entry. The blocks' shapes and colors remind users of
the block categories.</p>
<p class="centered-strip">
<img src="{{ site.baseurl }}/assets/img/screenshots/flagsquare.png" class="img-responsive"
alt="Snap! programing showing how to draw a sqaure using repeat"/>
</p>
<p>The C-shaped block is a loop, and visually encloses the code that should be
repeated. Green blocks are about drawing, and blue blocks are about motion.
</p>
<p>But because Scratch was designed to be usable by eight-year-olds, its
designers left out some key capabilities for teaching computer science.
Snap<i>!</i> adds the needed abstraction capabilities, while preserving the
use of carefully designed visual metaphors to aid understanding:
</p>
<hr />
<p>For control abstraction, Snap<i>!</i> users can build their own
blocks, including functions as well as action scripts.
</p>
<p class="centered-strip">
<img src="{{ site.baseurl }}/assets/img/screenshots/makeablock.png" class="side-by-side img-responsive"
alt="Snap! make a block dialog" />
<img src="{{ site.baseurl }}/assets/img/screenshots/blockeditor.png" class="side-by-side img-responsive"
alt="Snap! block editor dialog" />
<img src="{{ site.baseurl }}/assets/img/screenshots/scriptwithblock.png" class="side-by-side img-responsive"
alt="Snap! script using when green flag clicked"/>
</p>
<p>This capability is essential to the Abstraction big idea, but it
also lets us teach recursion, through which a small program can
have a very complex result:
</p>
<p class="centered-strip">
<img src="{{ site.baseurl }}/assets/img/screenshots/livetree.png" class="img-responsive side-by-side"
alt="Snap! Script of a `tree` block to draw a fractal" />
<img src="{{ site.baseurl }}/assets/img/screenshots/treepic.png" class="img-responsive side-by-side"
alt="A tree fractal drawn by the tree block" />
</p>
<p>Because Snap<i>!</i> blocks can take other blocks or scripts as
inputs, and because of the very simple notation used for anonymous functions,
we can teach the even more powerful control abstraction of higher order
functions:
</p>
<p class="centered-strip">
<img src="{{ site.baseurl }}/assets/img/screenshots/plusfour.png" class="img-responsive"
alt="Snap! Code: map plus 4 over a list of 3 numbers" />
</p>
<p>This capability, first class procedures, makes Snap<i>!</i> more powerful
and expressive than most text-based programming languages. The visual
representation makes procedure as data seem concrete to students, as in this
<em>list of procedures:</em>
</p>
<p class="centered-strip">
<img src="{{ site.baseurl }}/assets/img/screenshots/blocks.png" class="img-responsive"
alt="3 blocks inside a Snap! list" />
</p>
<hr />
<p>Finally, because lists are first class data in Snap<i>!</i>, we
can build abstract data types and use them in larger data structures, such as
this triangle:
</p>
<p class="centered-strip">
<img src="{{ site.baseurl }}/assets/img/screenshots/pointlist.png" class="img-responsive"
alt="A Snap! program showing a list of 3 items using the point block" />
</p>
<hr />
<p>For students who insist on programming in a text language,
Snap<i>!</i> provides access to the Javascript environment in which it is
implemented:
</p>
<p class="centered-strip">
<img src="{{ site.baseurl }}/assets/img/screenshots/speakblock.png" class="img-responsive"
alt="A Snap! speach to text block using JavaScript" />
</p>
<p>(The picture shows a one-liner, but there is no limit to the length or
complexity of the Javascript function defined by the block.) With this
capability we can have our cake and eat it too, with respect to the
(pointless, we think) argument about block languages vs. text languages.
We don't teach Javascript in BJC, but it's available as an enrichment
activity if needed.
</p>
<p>Also, since Snap<i>!</i> runs in any modern browser, students can make
mobile apps for iOS or Android by putting a shortcut to the project's URL on
the device's desktop. From the browser we can't access phone-specific
information such as contact list or GPS position (standalone versions are in
the works), but things like video game projects work fine.
</p>
<p>Snap<i>!</i> also connects with several robots and sensors (Finch,
Hummingbird, Sphero, Lego NXT, Wiimote, LEAP Motion, Arduino, etc.) by way of
small applications installed on the local computer.
</p>
{% endcapture %}
{% include section.html %}
{% capture section_content %}
<a class="anchor" id="social"></a>
<h2>Social Implications of Computing</h2>
<div class="side-by-side">
<p>
Here are the topics included in the BJC units:
</p>
<ul>
<li>Privacy and Search Engines</li>
<li>Video Games and Violence</li>
<li>Owning Ideas (Copyrights and Patents)</li>
<li>Encryption</li>
<li>Innovation</li>
<li>Computers and Community
<ul>
<li>Social networks</li>
<li>Cyberbullying</li>
</ul>
</li>
<li>Computers and War</li>
<li>Computers and Work</li>
</ul>
</div>
<div class="pull-right">
<img src="{{ site.baseurl }}/assets/img/blown-to-bits.png" height="250px"
alt="Cover of the Blown to Bits book" />
</div>
<p>In all of these topics, our goal is to avoid preaching; we look for
alternate points of view. For example, we don't assume that pirating
copyrighted works is wrong; since many students do it, we try to elicit honest
perspectives on why it might be okay, and consider alternate ways to support
artists and writers. Both student pages and the Teachers' Guide point to
provocative readings on each topic.
</p>
<p>In general, we hope to leave students feeling optimistic about the benefits
of technology, but also ready to think critically about any <i>specific</i>
technology. We also remind them that the decisions about how a new technology
is used are made by human beings, including themselves if they pursue a career
in computer science, so they shouldn't feel helpless in the face of a supposed
technological imperative.
</p>
<p>We use the excellent <a href="https://bitsbook.com" target="_blank"><i>Blown to Bits</i></a>
as the textbook for this part of the course. (There is no textbook for the
technical parts of the course, beyond the online materials we provide.) The
book is aimed at adult readers, and will be difficult especially for ESL
students, so we use short excerpts and discuss alternative presentations in
the Teachers' Guide. Like the rest of the course materials, this book is
avaliable free online, with a Creative Commons BY-NC-SA license.
</p>
<p>The book is a few years old now, so we supplement it with current readings,
looking for topics that will be relevant to students. Students choose their
own topics to study in more depth; this is one way we appeal to a diverse
audience. We start class meetings
with "Computing in the News," presenting items from that morning's newspaper,
one generally positive and one problematic. After some teacher-chosen
examples to illustrate the idea, we encourage teachers to assign the selection
of articles to students in rotation.
</p>
{% endcapture %}
{% include section.html %}
{% capture section_content %}
<h2>About Snap<i>!</i></h2>
<p class="pull-right hidden-xs">
<img src="{{ site.baseurl }}/assets/img/partners/snap.png" class="img-responsive"
alt="Snap! logo" />
</p>
<p>
Snap<em>!</em> is a visual programming language based on
<a href="https://scratch.mit.edu" target="_blank">Scratch</a> (MIT Media Lab), but
<a href="https://snap.berkeley.edu/about" target="_blank">extended</a>
to support more advanced computer science ideas, especially
recursion and functional programming.
</p>
<ul>
<li>
<a href="https://snap.berkeley.edu" target="_blank">Snap<em>!</em> Home Page</a>
</li>
<li>
<a href="https://snap.berkeley.edu/snap/help/SnapManual.pdf" target="_blank">Snap<em>!</em> Manual</a>
</li>
<li>
<a href="https://snap.berkeley.edu/run" target="_blank">Run Snap<em>!</em> Live</a>
</li>
<li>
Snap<i>!</i> Projects:
<ul>
<li><a href="https://snap.berkeley.edu/snapsource/snap.html#present:Username=bh&ProjectName=vee" target="_blank">Vee</a></li>
<li><a href="https://snap.berkeley.edu/snapsource/snap.html#open:https://snap.berkeley.edu/snapsource/demo/treedemo.xml" target="_blank">Tree Demo</a></li>
<li><a href="https://snap.berkeley.edu/snapsource/snap.html#open:https://snap.berkeley.edu/snapsource/demo/live-tree.xml" target="_blank">Live Tree</a></li>
<li><a href="https://snap.berkeley.edu/snapsource/snap.html#open:https://snap.berkeley.edu/snapsource/demo/palindrome.xml" target="_blank">Palindrome Exercise</a></li>
<li><a href="https://snap.berkeley.edu/snapsource/snap.html#open:https://snap.berkeley.edu/snapsource/demo/count-change.xml" target="_blank">Count Change</a></li>
</ul>
</li>
<li>
<a href="https://forum.snap.berkeley.edu/c/bugs/7" target="_blank">Report a Snap<em>!</em> bug</a>
</li>
</ul>
{% endcapture %}
{% include section.html %}