-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathafter-scratch.html
448 lines (436 loc) · 26.9 KB
/
after-scratch.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
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
<!DOCTYPE html>
<html>
<head>
<link rel="canonical" href="https://hardmath123.github.io/after-scratch.html"/>
<link rel="stylesheet" type="text/css" href="/static/base.css"/>
<title>The Seasoned Scratcher - Comfortably Numbered</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<link rel="alternate" type="application/rss+xml" title="Comfortably Numbered" href="/feed.xml" />
<!--
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script>
MathJax.Hub.Config({
tex2jax: {inlineMath: [['$','$']]}
});
</script>
-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css" integrity="sha384-Um5gpz1odJg5Z4HAmzPtgZKdTBHZdw8S29IecapCSB31ligYPhHQZMIlWLYQGVoc" crossorigin="anonymous">
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.js" integrity="sha384-YNHdsYkH6gMx9y3mRkmcJ2mFUjTd0qNQQvY9VYZgQd7DcN7env35GzlmFaZ23JGp" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/contrib/auto-render.min.js" integrity="sha384-vZTG03m+2yp6N6BNi5iM4rW4oIwk5DfcNdFfxkk9ZWpDriOkXX8voJBFrAO7MpVl" crossorigin="anonymous"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
renderMathInElement(document.body, {
// customised options
// • auto-render specific keys, e.g.:
delimiters: [
{left: '$$', right: '$$', display: true},
{left: '$', right: '$', display: false},
{left: '\\begin{align}', right: '\\end{align}', display: true},
{left: '\\(', right: '\\)', display: false},
{left: '\\[', right: '\\]', display: true}
],
// • rendering keys, e.g.:
throwOnError : false
});
});
</script>
</head>
<body>
<header id="header">
<script src="static/main.js"></script>
<div>
<a href="/"><span class="left-word">Comfortably</span> <span class="right-word">Numbered</span></a>
</div>
</header>
<article id="postcontent" class="centered">
<section>
<h1>The Seasoned Scratcher</h1>
<center><em><p>What to learn after Scratch: a definitive guide.</p>
</em></center>
<h4>Sunday, August 16, 2015 · 12 min read</h4>
<blockquote>
<p>Your hosts for the evening are <code>Hardmath123</code> and
<a href="http://technoboy10.tk"><code>technoboy10</code></a> from Scratch. Together, we have over
13 years of experience with Scratch and the computer science world beyond.</p>
</blockquote>
<p>So you think you’re a Scratch expert. You know the ins and outs of Scratch like
the back of your hand. You may even have hacked around with the Scratch source
code.</p>
<p>But you want something new. You want to learn more, explore, and discover. And
you don’t know where to start. Everyone you ask gives you their own advice.</p>
<p>Here’s ours.</p>
<h3 id="which-language-should-i-learn-">Which language should I learn?</h3>
<p>The eternal question. A lot of people define themselves by the programming
languages they use. People have very strong, emotional opinions about these
things. The truth is, in the big picture, you can get most things done with
most languages.</p>
<p>So before you pick a language, here’s a piece of advice: don’t collect
languages, collect <em>paradigms</em> (that’s CS for “big ideas”). Once you know the
big ideas, learning a new language should take you at most a weekend. Paradigms
stay the same; they just show up in different languages hidden in a new syntax.</p>
<p>Having said that, here are the big ideas we think you should look at.</p>
<p><strong>Functional programming</strong> is programming with functions. That means, in a way,
that you’re more focused on <em>reporter blocks</em> than <em>stack blocks</em>. You don’t
assign to variables much; instead of changing data in-place, you create copies
that have been modified.</p>
<p>A lot of people think functional programming is impractical when they first get
started–they don’t think you can get useful things done, or they think
functional languages are too slow. Paul Graham, founder of Y Combinator (a
Silicon Valley start-up which has more money than you want to know about) wrote
<a href="http://www.paulgraham.com/avg.html">this</a> piece on how his company very
successfully used a functional language called Scheme to “beat the averages”.</p>
<p>Scheme is one of the oldest languages around. It started off as an academic
language used in MIT’s AI labs but over decades has evolved into a more
mainstream language.</p>
<p>Many people have written their own versions of Scheme. The most popular one,
and the one we recommend, is Racket, which was built by an academic research
group but used by everyone–even <a href="http://practicaltypography.com/why-racket-why-lisp.html">publishers of
books</a>. It comes with
a <em>lot</em> of built-in features.</p>
<p>The best book to learn Scheme (and the rest of computer science) is <em>The
Structure and Interpretation of Computer Programs</em>, aka <em>SICP</em>. <a href="https://mitpress.mit.edu/sicp/full-text/book/book-Z-H-4.html#%_toc_start">It’s free to
read
online.</a>
Another good one is <em>The Little Schemer</em> and its sequel <em>The Seasoned Schemer</em>.</p>
<p>If you want to learn functional programming but still want Scratch-ey things
like blocks and sprites, learn to use <a href="https://snap.berkeley.edu">Snap<em>!</em></a>.
Snap<em>!</em> is Scratch with the advanced Scheme features thrown in.</p>
<p>(Bonus: Here’s Brian Harvey, the creator of Snap<em>!</em>, on <a href="https://www.cs.berkeley.edu/~bh/proglang.html">why Scheme should be
taught</a>.)</p>
<p>If you want to know more about Snap<em>!</em>, ask us on the <a href="https://scratch.mit.edu/discuss/topic/4455/">forum
thread</a>.</p>
<p><strong>Object-Oriented Programming</strong> is based on the idea of grouping data and
functions under structures called “objects”. A lot of languages provide
object-oriented features, and so you’re likely to run into the ideas no matter
what you choose to do.</p>
<p>The classic object-oriented language is Smalltalk—if you recall playing with
the Scratch 1.4 source code, you were writing in Smalltalk. Smalltalk is an old
language and isn’t used by anyone anymore. However, its legacy lives on: much
of its syntax and some of its ideas are evident in Objective-C, the language in
which you write iOS and OSX apps.</p>
<p>Another OOP language, Self, preached <em>prototyping</em>: a special kind of
object-oriented programming where objects come out of “factories” called
prototypes. You literally make a copy of the prototype when you make a new
object. Self let you treat prototypes as objects themselves. It was very meta.
This tradition lives on in JavaScript’s object-oriented style. JavaScript is
the programming language of the web: originally designed for making webpages
interactive, but now used for desktop software as well using Node.js.</p>
<p>The other kind of object-oriented programming is based on <em>classes</em>, which are
pre-defined kinds of objects. Your program is a list of definitions for
classes, and right at the end you create some instances of the classes to get
things done. This pattern is the focus of the AP Computer Science course, which
teaches you Java (more on this later). Java was widely used in industry for
many years, and is still popular (though less so than before).</p>
<p><strong>Statically Typed Languages</strong> are languages which care a lot about what kind
of thing your variables are. In Scratch, you can put a string into the addition
reported block and not have horrible things happen to you. Scratch isn’t
statically typed.</p>
<p>In a statically typed language, you will be warned that you can’t add a string
and a number even before you try to run the program. It will refuse to let you
run it. For huge codebases managed by hundreds of programmers in a big company,
this helps prevent silly errors. Though static typing probably won’t help you
much on a day-to-day basis, the ideas are worth learning about and you should
eventually get familiar and comfortable with the paradigm.</p>
<p>Java, as mentioned before, is statically typed. Other such languages are
Mozilla’s Rust and Google’s Go-lang. A recent trend is to add static typing
onto JavaScript, because plain old JavaScript is not very type-safe. You may
have heard of TypeScript by Google or Flow by Facebook.</p>
<p>The C programming language is also statically typed. C is extremely low-level.
It gives you a lot of control over things like memory use, the operating
system, hardware, networking, and processes. This lets you write very efficient
programs, but also makes it difficult to learn. It’s useful to have a working
knowledge of what the C compiler does, and how assembly languages work. As
such, learning C won’t teach you as much of the mathematical side of computer
science as the practical side.</p>
<p>Finally, Haskell is an old academic language that is making a serious comeback.
Haskell is statically typed with a very advanced type system. It is also
functional. It has a lot of neat language features, but is not very
beginner-friendly for a variety of reasons.</p>
<p><strong>Logic programming</strong> or <strong>declarative programming</strong> is a completely different
outlook on programming. Rather than telling the computer <em>how</em> to do something,
you tell it <em>what</em> to compute and the computer tries all possible inputs until
something works—in a clever and efficient way, of course. You can use it to
solve a Sudoku by explaining the rules of the puzzle without giving any hints
on how to solve it.</p>
<p>It looks like the computer is reasoning on its own, and in fact logic
programming is closely related to automatic proof generation.</p>
<p>Logic programming is mainly an academic thing with not too many practical
applications in the Real World™. One application is database querying
with languages like SQL, which try to find all elements in a data base which
satisfy some criteria.</p>
<p>The popular languages of this paradigm are Prolog and Mercury.</p>
<p>We mention logic programming here only to give you some idea of what other
paradigms are out there. If you learn functional programming with <em>SICP</em>
(above), you’ll learn the basic ideas. As such, don’t worry too much about
learning logic programming unless you’re really interested in this stuff. You
won’t find yourself writing any “practical” code in Prolog.</p>
<p>Other well-known books on this material are <em>The Reasoned Schemer</em> and <em>The Art
of Prolog</em>.</p>
<hr>
<p>Having said all that, here’s a recap of the languages you might care about,
what they’re good for doing, what paradigms they try to embrace, and what we
want to say about them.</p>
<ul>
<li><p><strong>Snap<em>!</em> </strong> is just a step up from Scratch. The motto was “add as few new
things as possible that let you do as many new things as possible”. It’s a
great program with a nice community behind it, and can teach you a lot of CS.</p>
</li>
<li><p><strong>Scheme</strong> is like a text-based Snap<em>!</em>. Though there isn’t <em>too</em> much
“real-world” software written in Scheme, it’s certainly not “impractical”.
There exist popular social networks (Hacker News) and music notation software
(LilyPond) running on Scheme. Scheme will teach you to think in a new way.</p>
</li>
<li><p><strong>Python</strong> is a relatively easy language to learn after Scratch for most
people. Its syntax is supposed to resemble English. Python comes with a <em>lot</em>
of batteries included: there are modules that let you do many cool things.
It’s the most popular language out there for programming websites, and along
with IPython and sage/scipy/numpy/matplotlib, it’s used in the scientific
community. Python is good for automating some quick tasks (“I want to save
all Wikipedia articles in this category as HTML files in this folder on my
computer”). However, Python has its share of issues: it’s not easy to
distribute your code, and the language itself isn’t as “pure” or “clean” as
Scheme: it’s object-oriented (class-based) but also tries to be functional.</p>
</li>
<li><p><strong>JavaScript</strong> is the programming language of the Web: almost every website
you visit has some JavaScript on it. It’s functional, and it has prototyping
OOP. It resembles Scheme in a lot of ways. However, it is <a href="https://www.destroyallsoftware.com/talks/wat">often
criticized</a> for a really weak
type system (you can add two lists and get a string as a result). Though it
has flaws as a language, it is worth learning for its versatility: it runs on
anything that has a web browser (phones, laptops, televisions, watches,
toasters). You can make games with the <code><canvas></code> element, and even use
Node.js to run servers on your local computer (like Python). The blog you are
reading this post on runs on is compiled by JavaScript. There are tons of
libraries out there—don’t bother to learn jQuery or React or any other
“framework” when you’re getting started. Learn to manipulate the DOM
manually, and you’ll discover that you don’t need a framework for most
things.</p>
</li>
<li><p><strong>C</strong> is a low-level language, which makes it kind of messy to use. You need
to manage memory on your own (people say it’s the difference between driving
an automatic and a stickshift). However, it’s incredibly fast, and has some
surprisingly elegant features. C teaches you how the insides of your computer
<em>really</em> work. It also gives you access to a lot of low-level details like
hardware and networking. Variations on C include C++ and C#, which add
various features to C (for better or for worse). We recommend learning pure C
to get started.</p>
</li>
<li><p><strong>Java</strong> is an object-oriented language which was originally loved because,
like JavaScript today, it ran everywhere. The language itself is very
verbose—it takes you a <em>lot</em> of code to get simple things done. We
recommend only learning Java if you’re writing an Android app, or if you’re
taking the AP Computer Science course (which, for a smart Scratch programmer,
is pretty straightforward). </p>
<blockquote>
<p><strong>Should I take AP CS?</strong></p>
<p>Yes. Take it if you have a free spot in your schedule, because you will
probably breeze through the course. Don’t stress out too much about it. Use
it as an opportunity to make friends with fellow CS students at your school
and to get to know the CS teacher there.</p>
<p>If you don’t have a free spot, you could probably self-study it, but we see
little educational value (it might look good on a college application?). You
have better things to do.</p>
</blockquote>
</li>
<li><p><strong>Haskell</strong> is Scheme with a very powerful, “formal” type system. It is much
easier to understand the concepts once you’ve used Scheme and Java a bit. We
list it here only to warn how unintuitive it is at first and how hard it is
to get practical things done with it (like printing to the screen), and to
recommend <a href="http://learnyouahaskell.com"><em>Learn you a Haskell</em></a> as a learning
resource.</p>
</li>
</ul>
<p>Here are some languages you shouldn’t care about:</p>
<ul>
<li><p><strong>CoffeeScript, TypeScript, anything that compiles to JavaScript</strong>: Don’t use
one of these unless you really feel the need for a particular language
feature. Certainly make sure you know JavaScript really well before, because
all these languages tend to be thinly-veiled JavaScript once you really get
into them.</p>
</li>
<li><p><strong>Blockly, App Inventor, Greenfoot, Alice, LOGO, GameMaker, other teaching
languages:</strong> unless you have any particular reason to use one of these
languages, you will probably find it too easy: they are designed for
beginners, and won’t give you the flexibility or “real-world” experience you
want.</p>
</li>
<li><p><strong>Rust, Go, anything owned by a company</strong>: not because the language has any
technical flaws, but because of “vendor lock-in”: you don’t want your code to
be at the mercy of whatever a private company decides to do with the
language. Languages that have been around for a while tend to stick around.
Go for a language that has more than one “implementation”, i.e. more than one
person has written a competitive interpreter or compiler for it. This helps
ensure that the standards are followed.</p>
</li>
<li><p><strong>PHP:</strong> <a href="http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/">PHP is not a great
language.</a> The
only time the authors use PHP these days is when trying to exploit
badly-written PHP code in computer security competitions.</p>
</li>
</ul>
<ul>
<li><p><strong>Perl, Ruby, Lua:</strong> Perl has essentially been replaced with Python in most
places: a good knowledge of the command line and Python are far more useful
to you. We haven’t seen any new exciting software written in Perl in a while.
Ruby also resembles Python in many ways—many say it’s much prettier—but
it’s known to be slower. It’s not as widely-used, but there exist big
projects that do (Homebrew and Github are both Ruby-based). Same for Lua:
it’s a nice language (Ruby’s syntax meets JavaScript’s prototyping OOP), but
it isn’t used by enough people. Languages like this tend to be harder to find
documentation, help, and working examples for.</p>
</li>
<li><p><strong>Esoteric languages:</strong> these are written as jokes. You should be creating
new ones, not programming in existing ones!</p>
</li>
</ul>
<p>Still confused? Here’s a flowchart to help you out (click for a large SVG, or
try Tim’s <a href="https://scratch.mit.edu/projects/102723127/">interactive Scratch
project</a>):</p>
<p><a href="static/scratch-graph.svg"><img src="static/scratch-graph.png" alt="Flowchart"></a></p>
<p>Finally: your personal experience and preference is far more important than
anything we say. We cannot recommend a practical language any better than one
you are already productive in (pedagogical languages, however, are a different
deal).</p>
<p>So we’ve come a full circle: collect <em>paradigms</em>, not <em>languages</em>.</p>
<h3 id="tools-of-the-trade">Tools of the trade</h3>
<p>Programmers in the Real World™ are very dependent on their tools. In
fact, though we don’t recommend it, most people define themselves by their
tools.</p>
<p>This is largely because many of the more established tools in the CS world have
a very steep learning curve (because they were written by lazy hackers who want
to minimize keystrokes).</p>
<p>Here are our recommendations for what to invest in.</p>
<p><strong>A text editor</strong>: Text editors are sacred, because in theory they’re the tool
we spend the most time using. We can’t really recommend one because whatever we
say, we’ll face lots of heat from supporters of some other one. Instead, here’s
a short list of editors you might consider. All of these are free and available
for Mac/Linux/Windows.</p>
<ul>
<li><p><strong>Atom</strong>: This editor was created by the GitHub team. It’s hugely
customizable, with hundreds of themes and packages written by people. Atom is
notoriously slow, though, because it essentially loads an entire web browser
for its GUI. Cousins of Atom are <strong>Brackets</strong> by Adobe (just as slow, fewer
packages) and <strong>Sublime Text</strong> (faster and prettier). </p>
<blockquote>
<p>Tip from <code>technoboy10</code>: Oodles of packages are available, but don’t try to
use all of them. Find a few that really improve your coding workflow and use
those.</p>
</blockquote>
</li>
<li><p><strong>Vim</strong>: Vim is one of the oldest and most well-known text editors—if
you’re on a UNIX, you already have it installed. It runs in the command line,
and requires you to learn several key-combinations to get started. It really
is worth it, though, because Vim is amazing for productivity. In addition,
several other applications use Vim-style keybindings. It’s an informal
standard.</p>
<blockquote>
<p>Tip from <code>hardmath123</code>: trying to learn Vim? Write a blog post entirely in
Vim. Maybe just stay in insert mode for the first hour. Use <code>vimtutor</code> to get
started.</p>
</blockquote>
</li>
<li><p><strong>Emacs</strong>: Like Vim, it runs in the command line and has a nontrivial
learning curve. Unlike Vim, it is anything but lightweight. You can use Emacs
to check your email, play tetris, and get psychiatric counseling (<a href="https://en.wikipedia.org/wiki/ELIZA">no
joke</a>). Vim and Emacs users are old
rivals. See <a href="https://xkcd.com/378/">this comic</a> for details.</p>
</li>
</ul>
<p>The <strong>command line</strong>: learn to use <code>bash</code> from your terminal. It is extremely
empowering. The command line is the key to the insides of your computer, and
turns out to be surprisingly easy to get started with. Start with simple
operations like creating (<code>touch</code>) and moving (<code>mv</code>) files. Use <code>less</code> to read
them, and use <code>pico</code> or <code>nano</code> (or <code>vim</code>!) to edit them. Along the way, learn
important components of the <a href="https://en.wikipedia.org/wiki/Unix_philosophy">UNIX
philosophy</a> by piping programs
to each other. Learn how to use regular expressions with <code>grep</code>; this is
life-changing because regular expressions show up in every language and give
you a lot of power over strings. Figure out how to use <code>man</code> pages and
<code>apropos</code> to get help. Soon you won’t be able to live without the command line.</p>
<p><strong>Git</strong>: For better or for worse, the most popular way for you to share code
these days is using a website called <a href="https://github.com">Github</a>. Github is a
web interface for a tool called <code>git</code>, which is a <em>version control software</em>
(another one is <code>hg</code>, a.k.a. Mercurial). <code>git</code> lets you keep track of your code
as it changes, and lets other people contribute to it without having to email
different versions of code around. It’s not that hard to learn, and you’ll need
to learn it if you want to contribute to any projects these days.</p>
<blockquote>
<p>Tip from <code>hardmath123</code>: Don’t worry if you don’t truly grok <code>git</code>. It’s my
personal hypothesis that nobody really understands it. Just have enough
working knowledge to get stuff done.</p>
</blockquote>
<p><strong>IRC</strong>: IRC or Internet Relay Chat is a decentralized chat protocol, which
means it’s like Skype except not controlled by any one company. It’s been
around for a while–it was used to organize a 1991 Soviet coup attempt. You
want to learn to use IRC because it’s not very intuitive at first look. But
many communities in the tech world communicate through IRC chatrooms, called
“channels”; it’s a great way to reach out and get help if you need it. The best
way to get into IRC is to just dig in–use <a href="http://webchat.freenode.net">Freenode’s
webchat</a> client at first, then experiment with
others (Weechat, IRSSI, IRCCloud, etc). Feel free to say hi to us: we’re
<code>hardmath123</code> and <code>tb10</code> on Freenode.</p>
<p><strong>Find (good) documentation</strong>: know about StackOverflow, Github, MDN, etc. We
won’t drone on about these sites. Just know that they exist. </p>
<blockquote>
<p>Tip from <code>technoboy10</code>: Google is a coder’s best friend. Everybody has a
different way of finding solutions to programming problems, but learning to
search and find answers online is an immensely valuable skill. If you’re not
a fan of Google, I recommend the <a href="http://ddg.gg">DuckDuckGo</a> search engine.</p>
</blockquote>
<h3 id="folklore-and-culture-some-reading-material">Folklore and Culture: some reading material</h3>
<p>The CS world, like any community, has its own set of traditions. It’s said that
UNIX is more an oral history than an operating system. With that in mind, here
are some books, articles, and websites for you to peruse at your leisure.</p>
<p>Don’t take any of them seriously.</p>
<p>(Disclaimer—some of these may have PG-13-rated content.)</p>
<ul>
<li><a href="http://www.catb.org/jargon/">The Jargon Files</a></li>
<li><a href="http://www.catb.org/esr/faqs/hacker-howto.html">How to be a hacker</a></li>
<li><a href="http://www.csf.ac.at/fileadmin/user_upload/BioComp/training/unix_haters_handbook.pdf">The UNIX-Haters’ Handbook</a></li>
<li><a href="http://folklore.org">Folklore</a></li>
<li>Webcomics:<ul>
<li><a href="https://xkcd.com">xkcd</a></li>
<li><a href="http://commitstrip.com">Commitstrip</a>,</li>
<li><a href="http://geek-and-poke.com">Geek&Poke</a> (read these mainly to keep up with inside jokes)</li>
</ul>
</li>
<li><a href="http://www.goodreads.com/book/show/7090.The_Soul_of_a_New_Machine"><em>The Soul of a New Machine</em></a></li>
<li><a href="http://textfiles.com/100/dec.wars">DEC wars</a></li>
<li><a href="http://telehack.com">Telehack</a> (tell <code>forbin</code> that <code>hm</code> says hi)</li>
<li><a href="http://www.goodreads.com/book/show/816.Cryptonomicon"><em>Cryptonomicon</em></a></li>
</ul>
<h3 id="parting-words">Parting words</h3>
<p>You’re about to start on a wonderful journey. Enjoy it. Make friends. Make
mistakes. These choices are all meaningless; you’re smart and you’re going to
be alright no matter what text editor you use or which language you learn.</p>
<p>Hack on!</p>
</section>
<div id="comment-breaker">◊ ◊ ◊</div>
</article>
<footer id="footer">
<div>
<ul>
<li><a href="https://github.com/kach">
Github</a></li>
<li><a href="feed.xml">
Subscribe (RSS feed)</a></li>
<li><a href="https://twitter.com/hardmath123">
Twitter</a></li>
<li><a href="https://creativecommons.org/licenses/by-nc/3.0/deed.en_US">
CC BY-NC 3.0</a></li>
</ul>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-46120535-1', 'hardmath123.github.io');
ga('require', 'displayfeatures');
ga('send', 'pageview');
</script>
</footer>
</body>
</html>