This repository has been archived by the owner on Jun 9, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
/
the-little-coder-s-predicament.html
415 lines (289 loc) · 15.5 KB
/
the-little-coder-s-predicament.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
<!DOCTYPE html>
<!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
<!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
<!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
<head>
<meta charset="utf-8">
<title>The Little Coder's Predicament - Literate Programming</title>
<meta name="author" content="Steve Klabnik">
<!-- http://t.co/dKP3o1e -->
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://blog.steveklabnik.com/2009/12/28/the-little-coder-s-predicament.html"/>
<link href="/favicon.png" rel="shortcut icon" />
<link href="/stylesheets/screen.css" media="screen, projection" rel="stylesheet" type="text/css">
<script src="/javascripts/modernizr-2.0.js"></script>
<script src="http://s3.amazonaws.com/ender-js/jeesh.min.js"></script>
<script src="/javascripts/octopress.js" type="text/javascript"></script>
<link href="http://feeds.feedburner.com/steveklabnik" rel="alternate" title="Literate Programming" type="application/atom+xml"/>
<!--Fonts from Google's Web font directory at http://google.com/webfonts -->
<link href='http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
<link href='http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic' rel='stylesheet' type='text/css'>
</head>
<body >
<header><hgroup>
<h1><a href="/">Literate Programming</a></h1>
<h2>Code is data, data is code. s/data/language/g;</h2>
</hgroup>
</header>
<nav role=navigation><ul role=subscription data-subscription="rss">
<li><a href="http://feeds.feedburner.com/steveklabnik" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
</ul>
<form action="http://google.com/search" method="get">
<fieldset role="site-search">
<input type="hidden" name="q" value="site:blog.steveklabnik.com" />
<input class="search" type="text" name="q" results="0" placeholder="Search"/>
</fieldset>
</form>
<ul role=main-navigation>
<li><a href="/">Blog</a></li>
<li><a href="/blog/archives">Archives</a></li>
</ul>
</nav>
<div id="main">
<div id="content">
<div>
<article class="hentry">
<header>
<h1 class="entry-title">The Little Coder's Predicament</h1>
<p class="meta">
<time datetime="2009-12-28T00:00:00-08:00" pubdate data-updated="true" >Dec 28<span>th</span>, 2009</time></p>
</header>
<div class="entry-content"><p>For those of you that don’t know, I’ve taken over a project by someone named
_why. He dropped off of the face of the Internet back in March, and the
community has picked up his works. Because I’ll be writing about the project
in the future, and because I feel these words are still relevant, I’m
reprinting the two of his essays that led up to the creation of the project,
Hackety Hack, here on my blog.</p>
<p>Enjoy.</p>
<h1>The Little Coder’s Predicament</h1>
<p>Okay, then, children of the modern age (where we live in a world so tied
together with wires that Pangaea ain’t goin’ nowhere!), you tell me if this is
a predicament or not.</p>
<p>In the 1980s, you could look up from your <a href="http://www.lemon64.com/">Commodore 64</a>, hours after
purchasing it, with a glossy feeling of empowerment, achieved by the pattern
of notes spewing from the speaker grille in an endless loop. You were part of
the movement to help machines sing! You were a programmer! The <a href="http://kl.net/atari/">Atari 800</a>
people had BASIC. They know what I’m talking about. And the <a href="http://web.archive.org/web/20070612155724/www.guidry.org/ti994a/systempics/4asystem-2.jpg">TI-994A</a> guys
don’t need to say a word, because the TI could <a href="http://www.obsoletecomputermuseum.org/ti99/ti99_syn.jpg">say it</a> for them!</p>
<p>The old machines don’t compare to the desktops of today, or to the consoles of
today. But, sadly, current versions of Windows have no immediately accessible
programming languages. And what’s a kid going to do with Visual Basic? Build a
modal dialog? Forget coding for XBox. Requires registration in the XBox
Developer Program. Otherwise, you gotta crack the sucker open. GameCube?
GameBoy? Playstation 2?</p>
<h2>Coding Just Isn’t Accessible</h2>
<p>Yes, there are burgeoning <a href="http://openxdk.sourceforge.net/">free</a> <a href="http://gbdk.sourceforge.net/">SDKs</a> for many of these platforms. But
they are obscure and most children have no means of actually deploying or
executing the code on their own hardware! This is obvious to us all and likely
doesn’t seem such a big deal. But ask yourself what might have happened had
you not had access to a programming language on an Atari 800 or a Commodore.
You tell me if this is a predicament.</p>
<p>It turns out, most of the kids in my neighborhood are exposed to coding
through the <a href="http://www.ticalc.org/">TI calculator</a>. A handful of <a href="http://www.ticalc.org/programming/columns/">languages</a> are available on
the TI and its processor is interesting enough to evoke some curiousity. But
this hasn’t spread to its PDA big brothers, where young people could have more
exposure to programming. And undoubtedly the utility of a language on the
Palm, Pocket PC and others would be useful to many.</p>
<p>So what’s the problem here? We have no shortage of new languages, but they
become increasingly distanced from the populace. Are the companies behind
these platforms weary of placing the power of a programming language in the
hands of users? Is there not a demand any longer? It’s got to be some kind of
greed, power, money thing, right?</p>
<p>Perhaps this is just another reason to push Linux and BSD on consumer systems.
Still, are scripting languages easily accessible to beginners on those
systems? OSX has made several scripting languages available (including Ruby
and Python), but most users are unaware of their presence.</p>
<p>I should mention that Windows is equipped with its own scripting host for
developing in JScript and VBScript. But the use of the scripting host is (I
believe) under-documented and limited for beginners. Try doing something
useful in a script without using Server.CreateObject. Let’s not let kids touch
the COM objects, please!</p>
<h2>The Christmas List</h2>
<p>I’m thinking a toy language for consoles and desktops alike could be
monumental. I’m ot saying it needs to be cross-platform. A language for
GameCube that took advantage of platform-specific features could be more
appealing to GameCube users than a language that used a reduced featureset,
but could execute on a handheld. Really, we live in a world where both choices
should be available.</p>
<p>As for essential features:</p>
<h3>1. Transportable code.</h3>
<p>On my TI-994A, I could make a little, animated Optimus Prime from pixels.
Insert cassette. Record. Pass around to friends. Receive high fives from
friends. Put on wraparound shades. Thank you, TI! Thank you, Optimus Prime!</p>
<p>A little language for the consoles could be wildly popular if combined with
the good ature of sharing code. This could be done by trading memory cards,
but would be more effective if code could be easily obtained and posted on the
Web. Learning would accelerate and collaborative development could take place.</p>
<p>A suitable language should give coders access to I/O devices, to allow
experimentation with network devices and the ability to enhance one’s
connectivity with others. For the consoles, games could provide hooks for user
mods. This has long proven a successful staple of the desktop gaming world.</p>
<h3>2. Simplicity.</h3>
<p>You’ve got to be able to write a single line of code and see a result. We need
some instant results to give absolute beginners confidence. Simple methods for
sending an e-mail, reading a web page, playing music. Demonstrable in a one-
liner.</p>
<p>Admittedly, as our systems have grown complex, it is difficult to balance
simplicity and capability. Most users will be unimpressed by code that emits
beeps and bloops from a PlayStation 2. If Ruby were available on the PS2, then
I would hope that I could hear rich symphonic sounds from a wee bit of code.</p>
<p><code>Orchestra.play( "A:2", "C:4", "E:1", "G:1" )</code></p>
<p>Access to the graphic engine might require more complex code. But simple
drawing methods could be provided for beginners. Or images could be stored
alongside code and accessed programmatically.</p>
<p><code>ImageLibrary.load( "GolfingOldMan" ).drawAt( 12, 10 )</code></p>
<p>The trick would be to uncover what small applications might entice novices and
still provide the ability to write large applications that would drive
developers to master the language and not limit their growth.</p>
<h3>3. Sensible environment.</h3>
<p>Considering that many won’t want to purchase a keyboard for their gaming unit,
let’s make sure that a reasonable environment is provided for entry of text.
Controllers could be worked like the <a href="http://www.handykey.com/">Twiddler</a>. Or code could be
transferred via IR, TCP/IP. (Dare I say cassette? :D)</p>
<h3>4. Give it away!</h3>
<p>It used to be that programming was practically an inalienable right for users.
Include a language with the system, situated in a friendly spot. Each of the
game consoles I’ve mentioned has launchers. (With the exception of Game Boy
and its successors.) Provide a development prompt from the launcher. From
desktop software, provide shortcuts for both the command prompt and a
development prompt.</p>
<p>Remember, we’re looking for a language that requires no system hacks. No
obscure links. No warranty violation. We’ve become so used to these techniques
that it seems to be an essential part of getting our way.</p>
<p>And in many ways it is essential. Tinkering with hardware is learning.
Lobotomizing and renovating is meaningful, magical. On behalf of those who
prefer to code, I make these wishes. Not to take away jobs from the Phillips
screwdriver.</p>
<h2>The Ultimatum</h2>
<p>My challenge is to Sony, Nintendo, Microsoft, Apple, and to those who
manufacture and develop our interactive technology. Let us interact with these
machines more deeply. Provide us a channel for having a dialogue with the
entertainment boxes we nurture and care for. I swear to you, the relationship
between the public and your product will assuredly blossom. That box will
become more of a chest for our personal works.</p>
<p>In addition, if your developers start putting out crap, then you have a whole
world of people to pick up the slack.</p>
<p>My challenge is for you to bundle a useful programming language with your
product. Ruby, Squeak, REBOL, Python. Take your pick. It will be inexpensive
to add any of these languages to your systems. And people will seriously pray
to you. You know how geeks get when they pledge allegiance to something. But,
yes, Ruby is preferable.</p>
</div>
<footer>
<p class="meta">
<span class="byline author vcard">Posted by <span class="fn">Steve Klabnik</span></span>
<time datetime="2009-12-28T00:00:00-08:00" pubdate data-updated="true" >Dec 28<span>th</span>, 2009</time>
</p>
<div class="sharing">
<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://blog.steveklabnik.com/2009/12/28/the-little-coder-s-predicament.html" data-via="steveklabnik" data-counturl="http://blog.steveklabnik.com/2009/12/28/the-little-coder-s-predicament.html" >Tweet</a>
<div class="g-plusone" data-size="medium"></div>
</div>
</footer>
</article>
</div>
<aside role=sidebar>
<aside>
<img src='http://en.gravatar.com/userimage/5335489/ee56a7574df33ed8748160494c930b98.jpg?size=190' />
<h4>Hi there, I'm Steve.</h4>
<p>
I write both code and prose. Here's some of my thoughts about software,
literature, art and code, with some politics thrown in on occasion.
You might also enjoy <a href="http://steveklabnik.com/">my website</a>.
</p>
</aside>
<section>
<h1>Recent Posts</h1>
<ul id="recent_posts">
<li class="post">
<a href="/2011/09/23/more-rstat-dot-us-refatoring.html">More rstat.us Refatoring</a>
</li>
<li class="post">
<a href="/2011/09/22/extracting-domain-models-a-practical-example.html">Extracting Domain Models: A Practical Example</a>
</li>
<li class="post">
<a href="/2011/09/09/better-ruby-presenters.html">Better Ruby Presenters</a>
</li>
<li class="post">
<a href="/2011/09/06/the-secret-to-rails-oo-design.html">The Secret to Rails OO Design</a>
</li>
<li class="post">
<a href="/2011/09/04/the-self-improvement-pomodoro.html">The Self-Improvement Pomodoro</a>
</li>
</ul>
</section>
<section>
<h1>Github Repos</h1>
<ul id="gh_repos">
<li class="loading">Status updating...</li>
</ul>
<a href="https://github.com/steveklabnik">@steveklabnik</a> on Github
<script type="text/javascript">
$.domReady(function(){
if (!window.jXHR){
var jxhr = document.createElement('script');
jxhr.type = 'text/javascript';
jxhr.src = '/javascripts/libs/jXHR.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(jxhr, s);
}
github.showRepos({
user: 'steveklabnik',
count: 0,
skip_forks: true,
target: '#gh_repos'
});
});
</script>
<script src="/javascripts/github.js" type="text/javascript"> </script>
</section>
<section>
<h1>Latest Tweets</h1>
<ul id="tweets">
<li class="loading">Status updating...</li>
</ul>
<script type="text/javascript">
$.domReady(function(){
getTwitterFeed("steveklabnik", 4, false);
});
</script>
<script src="/javascripts/twitter.js" type="text/javascript"> </script>
<a href="http://twitter.com/steveklabnik" class="twitter-follow-button" data-width="208px" data-show-count="false">Follow @steveklabnik</a>
</section>
</aside>
</div>
</div>
<footer><p>
Copyright © 2011 - Steve Klabnik -
<span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
</p>
</footer>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-10289851-1']);
_gaq.push(['_trackPageview']);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>
<script type="text/javascript">
(function() {
var script = document.createElement('script'); script.type = 'text/javascript'; script.async = true;
script.src = 'https://apis.google.com/js/plusone.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);
})();
</script>
<script type="text/javascript">
(function(){
var twitterWidgets = document.createElement('script');
twitterWidgets.type = 'text/javascript';
twitterWidgets.async = true;
twitterWidgets.src = 'http://platform.twitter.com/widgets.js';
document.getElementsByTagName('head')[0].appendChild(twitterWidgets);
})();
</script>
</body>
</html>