WEBVTT

00:00:00.000 --> 00:00:00.500 align:middle line:90%


00:00:00.500 --> 00:00:03.210 align:middle line:84%
First time it's ever
actually worked.

00:00:03.210 --> 00:00:04.470 align:middle line:90%
Maybe.

00:00:04.470 --> 00:00:05.496 align:middle line:90%
OK.

00:00:05.496 --> 00:00:07.230 align:middle line:90%
[LAUGHS]

00:00:07.230 --> 00:00:08.850 align:middle line:84%
As mentioned, I
am Gary Bernhardt.

00:00:08.850 --> 00:00:11.903 align:middle line:84%
On the computer,
I look like this.

00:00:11.903 --> 00:00:13.320 align:middle line:84%
I own a company
called Destroy All

00:00:13.320 --> 00:00:15.660 align:middle line:84%
Software that
produces screencasts

00:00:15.660 --> 00:00:17.740 align:middle line:90%
on various development topics.

00:00:17.740 --> 00:00:20.370 align:middle line:84%
And one of the nice things
about producing a screencast

00:00:20.370 --> 00:00:24.960 align:middle line:84%
is that it takes me maybe 10
hours per week to produce one.

00:00:24.960 --> 00:00:28.470 align:middle line:84%
And the rest of the time I
spend idly thinking or playing

00:00:28.470 --> 00:00:30.660 align:middle line:84%
with side projects just
to keep myself interested

00:00:30.660 --> 00:00:33.150 align:middle line:84%
and to find new
things to talk about.

00:00:33.150 --> 00:00:36.383 align:middle line:84%
And this entire talk
is the story of one

00:00:36.383 --> 00:00:37.800 align:middle line:84%
of those side
projects, which I've

00:00:37.800 --> 00:00:41.640 align:middle line:84%
been working on for a little
over a year, in secret.

00:00:41.640 --> 00:00:45.960 align:middle line:84%
And the title of the talk
is "A Whole New World."

00:00:45.960 --> 00:00:48.390 align:middle line:84%
I'm going to make
three confessions

00:00:48.390 --> 00:00:52.590 align:middle line:84%
in this talk, the first of
which is that I have written

00:00:52.590 --> 00:00:54.960 align:middle line:90%
an editor, a text editor.

00:00:54.960 --> 00:00:58.100 align:middle line:90%


00:00:58.100 --> 00:00:59.880 align:middle line:90%
Its name is aneditor.

00:00:59.880 --> 00:01:03.390 align:middle line:84%
So if I'm at a terminal
and I fire up aneditor

00:01:03.390 --> 00:01:06.373 align:middle line:90%
on a source file, this is--

00:01:06.373 --> 00:01:08.040 align:middle line:84%
oh, is it act-- yes,
it is going, right?

00:01:08.040 --> 00:01:10.620 align:middle line:84%
So if I whack Enter,
fire up the editor--

00:01:10.620 --> 00:01:12.370 align:middle line:84%
this is editing part
of a Twitter client,

00:01:12.370 --> 00:01:15.360 align:middle line:90%
another project I wrote for fun.

00:01:15.360 --> 00:01:18.780 align:middle line:84%
But it looks a lot like Vim or
Emacs or any terminal editor.

00:01:18.780 --> 00:01:19.890 align:middle line:90%
It is not like them.

00:01:19.890 --> 00:01:23.397 align:middle line:84%
It does a lot of things
that they don't do.

00:01:23.397 --> 00:01:24.480 align:middle line:90%
Now, it is a modal editor.

00:01:24.480 --> 00:01:27.540 align:middle line:84%
I like Vim, as anyone who
has seen my screencast knows.

00:01:27.540 --> 00:01:29.700 align:middle line:84%
So I can do things like
visual line-wise select.

00:01:29.700 --> 00:01:34.170 align:middle line:84%
It's keystroke-compatible with
Vim in terms of basic editing.

00:01:34.170 --> 00:01:35.850 align:middle line:90%
So yes, it's modal.

00:01:35.850 --> 00:01:37.800 align:middle line:84%
Yes, it is actually
terminal-only,

00:01:37.800 --> 00:01:40.260 align:middle line:84%
for reasons that will
become clear later.

00:01:40.260 --> 00:01:42.480 align:middle line:90%
It is not Vim.

00:01:42.480 --> 00:01:44.520 align:middle line:84%
It is much more
powerful than Vim.

00:01:44.520 --> 00:01:46.270 align:middle line:90%
But it is not an IDE, either.

00:01:46.270 --> 00:01:51.515 align:middle line:84%
It's not some giant ball of
millions of lines of code,

00:01:51.515 --> 00:01:53.640 align:middle line:84%
or however much is in
something like Visual Studio.

00:01:53.640 --> 00:01:55.098 align:middle line:84%
There's no debugger
in this editor.

00:01:55.098 --> 00:01:57.480 align:middle line:84%
There are other very
powerful features

00:01:57.480 --> 00:01:59.940 align:middle line:84%
that are not in other
editors, like it

00:01:59.940 --> 00:02:01.973 align:middle line:90%
has this idea of layers.

00:02:01.973 --> 00:02:03.390 align:middle line:84%
I've been wanting
this in my tools

00:02:03.390 --> 00:02:06.240 align:middle line:84%
for years, the
idea of overlaying

00:02:06.240 --> 00:02:09.400 align:middle line:84%
sort of orthogonal information
onto the source code.

00:02:09.400 --> 00:02:12.180 align:middle line:84%
For example, the sort of
classic example of this

00:02:12.180 --> 00:02:16.165 align:middle line:84%
is a diff layer or a diff
mode in something like Emacs.

00:02:16.165 --> 00:02:18.540 align:middle line:84%
If I'm looking at some source
code, I whack a single key,

00:02:18.540 --> 00:02:20.490 align:middle line:90%
it inlines the diff.

00:02:20.490 --> 00:02:21.420 align:middle line:90%
Sort of uninteresting.

00:02:21.420 --> 00:02:23.030 align:middle line:90%
Most editors can do this.

00:02:23.030 --> 00:02:24.780 align:middle line:84%
But here's a much more
interesting layer--

00:02:24.780 --> 00:02:26.280 align:middle line:90%
the crash layer.

00:02:26.280 --> 00:02:28.350 align:middle line:84%
So your system is
running in production.

00:02:28.350 --> 00:02:31.410 align:middle line:84%
It's emitting tons of log files
that look like this, maybe.

00:02:31.410 --> 00:02:34.990 align:middle line:84%
I'm using Ruby for
all my examples.

00:02:34.990 --> 00:02:36.700 align:middle line:84%
Sometimes the logs
contain crashes,

00:02:36.700 --> 00:02:40.030 align:middle line:84%
they contain uncaught exceptions
with tracebacks in them.

00:02:40.030 --> 00:02:43.770 align:middle line:84%
So if you load these production
logs into an editor, it can--

00:02:43.770 --> 00:02:45.720 align:middle line:84%
as you're editing
the code, and when

00:02:45.720 --> 00:02:49.260 align:middle line:84%
you whack a single keystroke--
it can overlay the trace back

00:02:49.260 --> 00:02:50.200 align:middle line:90%
onto the source code.

00:02:50.200 --> 00:02:52.740 align:middle line:84%
So every line, all one
lines that are yellow here,

00:02:52.740 --> 00:02:55.110 align:middle line:90%
were involved in a crash.

00:02:55.110 --> 00:02:57.720 align:middle line:84%
And I can narrow onto
a single traceback

00:02:57.720 --> 00:02:58.870 align:middle line:90%
and move up and down it.

00:02:58.870 --> 00:03:00.330 align:middle line:84%
So if I move down
this traceback,

00:03:00.330 --> 00:03:03.220 align:middle line:84%
the red line is where
the crash originated.

00:03:03.220 --> 00:03:05.500 align:middle line:84%
So as you're editing the
source code, you hit a key,

00:03:05.500 --> 00:03:07.865 align:middle line:84%
there's zero delay, and
it shows you everything

00:03:07.865 --> 00:03:09.990 align:middle line:84%
on the screen that has ever
caused or been involved

00:03:09.990 --> 00:03:12.573 align:middle line:84%
with a crash, which I think is
very useful information that we

00:03:12.573 --> 00:03:13.860 align:middle line:90%
don't currently have.

00:03:13.860 --> 00:03:15.330 align:middle line:84%
Right now your
exceptions are maybe

00:03:15.330 --> 00:03:16.692 align:middle line:90%
stored in some web-based system.

00:03:16.692 --> 00:03:18.150 align:middle line:84%
You have to open
a browser, log in.

00:03:18.150 --> 00:03:21.760 align:middle line:84%
It's very cumbersome
as a process.

00:03:21.760 --> 00:03:24.800 align:middle line:84%
So I've tried to integrate it
into the editing experience.

00:03:24.800 --> 00:03:26.340 align:middle line:90%
Now, as I go through--

00:03:26.340 --> 00:03:28.350 align:middle line:84%
the first 2/3 or so
of this talk is just

00:03:28.350 --> 00:03:30.120 align:middle line:90%
explaining this thing to you.

00:03:30.120 --> 00:03:31.870 align:middle line:84%
I'm going to show you
features, and then I

00:03:31.870 --> 00:03:33.960 align:middle line:84%
show you how it works,
how the editor does it.

00:03:33.960 --> 00:03:35.400 align:middle line:90%
So this one's pretty easy.

00:03:35.400 --> 00:03:37.410 align:middle line:84%
For diff layer, it
just does a git diff.

00:03:37.410 --> 00:03:38.900 align:middle line:90%
Not difficult.

00:03:38.900 --> 00:03:40.620 align:middle line:84%
For crash layer,
it's a little harder.

00:03:40.620 --> 00:03:42.120 align:middle line:84%
It has to parse the
logs, of course.

00:03:42.120 --> 00:03:44.880 align:middle line:84%
It has to know how to find
the tracebacks and read them.

00:03:44.880 --> 00:03:47.880 align:middle line:84%
But it also-- the problem
is that the production box

00:03:47.880 --> 00:03:49.930 align:middle line:84%
might be running a different
version of the code.

00:03:49.930 --> 00:03:52.980 align:middle line:84%
So if the production box
ever printed into the log

00:03:52.980 --> 00:03:55.732 align:middle line:84%
what version it was running,
what git hash it was running,

00:03:55.732 --> 00:03:57.690 align:middle line:84%
then the editor will
actually fast-forward that

00:03:57.690 --> 00:03:59.640 align:middle line:84%
through time to the
current working copy

00:03:59.640 --> 00:04:01.800 align:middle line:84%
to figure out what
lines are what

00:04:01.800 --> 00:04:03.450 align:middle line:90%
so it can display them properly.

00:04:03.450 --> 00:04:06.600 align:middle line:84%
Or occasionally it gives
up, because it's ambiguous.

00:04:06.600 --> 00:04:09.000 align:middle line:90%
It doesn't know.

00:04:09.000 --> 00:04:11.340 align:middle line:84%
So layers-- those are
some basic layers it has.

00:04:11.340 --> 00:04:13.290 align:middle line:90%
It also has more powerful ones.

00:04:13.290 --> 00:04:16.800 align:middle line:84%
But I wanted to start with that,
because it's a simple feature.

00:04:16.800 --> 00:04:20.220 align:middle line:84%
Here is a much deeper
and more complex feature.

00:04:20.220 --> 00:04:22.260 align:middle line:84%
The editor knows about
all the interactions

00:04:22.260 --> 00:04:24.930 align:middle line:84%
between all the units
of code in your system.

00:04:24.930 --> 00:04:27.020 align:middle line:84%
And by this I mean
classes in Ruby.

00:04:27.020 --> 00:04:29.250 align:middle line:84%
In a language like Clojure,
this might be namespaces

00:04:29.250 --> 00:04:32.040 align:middle line:90%
and types and things like that.

00:04:32.040 --> 00:04:34.160 align:middle line:84%
If I am looking at
some source code

00:04:34.160 --> 00:04:36.540 align:middle line:84%
and I whack a
single keystroke, it

00:04:36.540 --> 00:04:40.920 align:middle line:84%
pops up a graph of
the interactions

00:04:40.920 --> 00:04:42.510 align:middle line:90%
between the classes.

00:04:42.510 --> 00:04:44.922 align:middle line:84%
And this is starting at the
test for the current file

00:04:44.922 --> 00:04:45.630 align:middle line:90%
I was looking at.

00:04:45.630 --> 00:04:49.500 align:middle line:84%
Now, I told you this
is terminal-only.

00:04:49.500 --> 00:04:51.723 align:middle line:84%
So this should
immediately make you

00:04:51.723 --> 00:04:54.015 align:middle line:84%
ask a lot of questions about,
what the hell is going on

00:04:54.015 --> 00:04:54.610 align:middle line:90%
on the screen?

00:04:54.610 --> 00:04:57.180 align:middle line:90%


00:04:57.180 --> 00:04:59.970 align:middle line:84%
Allow me to cause you
to have more questions.

00:04:59.970 --> 00:05:01.800 align:middle line:84%
I can actually scroll
through this graph.

00:05:01.800 --> 00:05:02.740 align:middle line:90%
It's interactive.

00:05:02.740 --> 00:05:06.390 align:middle line:84%
So you just saw me scroll from
the database spec at the top

00:05:06.390 --> 00:05:07.290 align:middle line:90%
down into the tweet.

00:05:07.290 --> 00:05:09.510 align:middle line:84%
If I whack Enter on that,
I'm navigating the system

00:05:09.510 --> 00:05:10.080 align:middle line:90%
dynamically.

00:05:10.080 --> 00:05:12.210 align:middle line:84%
Tweet has no
outgoing interaction,

00:05:12.210 --> 00:05:15.390 align:middle line:84%
so it's a value object at the
sort of root of the graph--

00:05:15.390 --> 00:05:19.270 align:middle line:84%
or, excuse me, at the
leaves of the graph.

00:05:19.270 --> 00:05:20.770 align:middle line:84%
If I switch it to
incoming edges,

00:05:20.770 --> 00:05:22.300 align:middle line:84%
then you can see all the
things that reference tweet.

00:05:22.300 --> 00:05:23.850 align:middle line:84%
So I'm just sort
of like dynamically

00:05:23.850 --> 00:05:26.430 align:middle line:84%
navigating through
the system, observing

00:05:26.430 --> 00:05:28.920 align:middle line:90%
how the objects interact.

00:05:28.920 --> 00:05:32.460 align:middle line:84%
So how does it do that,
especially in terminal?

00:05:32.460 --> 00:05:35.880 align:middle line:84%
Well, in terms of the data,
we need to retrieve and store

00:05:35.880 --> 00:05:36.867 align:middle line:90%
the graph information.

00:05:36.867 --> 00:05:38.700 align:middle line:84%
You might have seen
that and assumed that it

00:05:38.700 --> 00:05:39.783 align:middle line:90%
was doing static analysis.

00:05:39.783 --> 00:05:41.850 align:middle line:84%
There is no static
analysis in this editor.

00:05:41.850 --> 00:05:45.378 align:middle line:84%
I think static analysis
is not the wrong thing

00:05:45.378 --> 00:05:46.920 align:middle line:84%
for dynamic languages,
but I've never

00:05:46.920 --> 00:05:48.587 align:middle line:84%
seen an implementation
that convinced me

00:05:48.587 --> 00:05:50.490 align:middle line:90%
that it was really useful.

00:05:50.490 --> 00:05:53.580 align:middle line:84%
Instead, it's auditing
all the test runs to learn

00:05:53.580 --> 00:05:55.080 align:middle line:90%
how the objects interact.

00:05:55.080 --> 00:05:58.470 align:middle line:84%
So whenever it runs
tests, or actually,

00:05:58.470 --> 00:06:00.480 align:middle line:84%
whenever it forks
any process, it

00:06:00.480 --> 00:06:02.610 align:middle line:84%
has an environment
variable called RUBY_AUDIT,

00:06:02.610 --> 00:06:03.630 align:middle line:90%
if it's in Ruby mode.

00:06:03.630 --> 00:06:05.970 align:middle line:84%
In other languages, the
variable changes names.

00:06:05.970 --> 00:06:10.920 align:middle line:84%
This points to a FIFO, a
named pipe on the disk.

00:06:10.920 --> 00:06:12.360 align:middle line:84%
In your tests,
you're going to say

00:06:12.360 --> 00:06:15.960 align:middle line:84%
RAudit.audit!, which is going
to enable the entire auditor.

00:06:15.960 --> 00:06:18.720 align:middle line:84%
That's going to fire up
the profiler, turn it on.

00:06:18.720 --> 00:06:20.590 align:middle line:84%
It's going to turn
on a trace function,

00:06:20.590 --> 00:06:22.740 align:middle line:84%
so it observes every
line as it executes.

00:06:22.740 --> 00:06:25.210 align:middle line:84%
It's going to set an at_exit
handler for the process

00:06:25.210 --> 00:06:28.290 align:middle line:84%
so that when the process exits,
all the profile data and all

00:06:28.290 --> 00:06:31.350 align:middle line:84%
the tracing data get dumped
out to that FIFO that was named

00:06:31.350 --> 00:06:33.505 align:middle line:90%
by that environment variable.

00:06:33.505 --> 00:06:35.130 align:middle line:84%
And so it's going to
dump out a profile

00:06:35.130 --> 00:06:36.680 align:middle line:84%
database, a trace
database, and it's

00:06:36.680 --> 00:06:39.720 align:middle line:84%
going to dump out an unstyled
dot file, a Graphviz dot file.

00:06:39.720 --> 00:06:43.890 align:middle line:84%
That's the format that I
use for the object graph.

00:06:43.890 --> 00:06:45.840 align:middle line:84%
So that's just
retrieving the data.

00:06:45.840 --> 00:06:48.703 align:middle line:84%
To query it, for the simple
case like the one I showed you,

00:06:48.703 --> 00:06:50.370 align:middle line:84%
all we have to do is
take that dot file,

00:06:50.370 --> 00:06:52.410 align:middle line:84%
throw some styles in, and
push it into Graphviz,

00:06:52.410 --> 00:06:54.550 align:middle line:90%
so that's easy.

00:06:54.550 --> 00:06:56.910 align:middle line:84%
The rendering itself--
fortunately, Graphviz

00:06:56.910 --> 00:06:59.600 align:middle line:84%
takes dot data on standard in,
emits images on standard out.

00:06:59.600 --> 00:07:01.755 align:middle line:84%
So I just fork off a
Graphviz, throw data into it,

00:07:01.755 --> 00:07:04.090 align:middle line:84%
read data out, and
everything's good.

00:07:04.090 --> 00:07:05.100 align:middle line:90%
It needs to be fast.

00:07:05.100 --> 00:07:07.530 align:middle line:84%
So when I initially
bring that up,

00:07:07.530 --> 00:07:08.960 align:middle line:84%
it takes 200 to
400 milliseconds.

00:07:08.960 --> 00:07:11.790 align:middle line:84%
Then I fork off a
prerendering process that

00:07:11.790 --> 00:07:15.160 align:middle line:84%
will prerender all the movements
I could make through the graph,

00:07:15.160 --> 00:07:18.100 align:middle line:84%
so if I do make those movements,
then they're already there--

00:07:18.100 --> 00:07:21.550 align:middle line:84%
sort of like prefetching
in a web browser.

00:07:21.550 --> 00:07:23.040 align:middle line:90%
So that's how it works.

00:07:23.040 --> 00:07:25.183 align:middle line:84%
And there are a lot
of useful questions

00:07:25.183 --> 00:07:26.850 align:middle line:84%
you can answer with
something like this.

00:07:26.850 --> 00:07:29.340 align:middle line:90%
Like, I'm writing a web app.

00:07:29.340 --> 00:07:32.880 align:middle line:84%
A request comes in and hits this
piece of the controller layer.

00:07:32.880 --> 00:07:34.770 align:middle line:90%
What code gets executed?

00:07:34.770 --> 00:07:36.660 align:middle line:84%
That's a question
that is not that

00:07:36.660 --> 00:07:39.060 align:middle line:84%
easy to answer with
most current tools,

00:07:39.060 --> 00:07:41.850 align:middle line:84%
just seeing the graph of
what actually happens.

00:07:41.850 --> 00:07:43.410 align:middle line:90%
Or what code does this test run?

00:07:43.410 --> 00:07:46.290 align:middle line:84%
That's actually even less
common to be able to do.

00:07:46.290 --> 00:07:49.710 align:middle line:84%
Or maybe the best one, the most
interesting one-- what code

00:07:49.710 --> 00:07:51.325 align:middle line:90%
might hit this crash point?

00:07:51.325 --> 00:07:52.950 align:middle line:84%
So we already have
the production logs.

00:07:52.950 --> 00:07:54.650 align:middle line:84%
We know where
crashes originated.

00:07:54.650 --> 00:07:57.150 align:middle line:84%
We can back out a graph of all
the code that might have come

00:07:57.150 --> 00:07:59.010 align:middle line:90%
into there from other places.

00:07:59.010 --> 00:08:01.080 align:middle line:84%
And we can even
organize it, maybe,

00:08:01.080 --> 00:08:03.990 align:middle line:84%
with the left-hand side being
code that did cause a crash,

00:08:03.990 --> 00:08:06.535 align:middle line:84%
the right-hand side being code
that didn't, all the paths

00:08:06.535 --> 00:08:08.910 align:middle line:84%
coming into that one line,
and why did some of them cause

00:08:08.910 --> 00:08:09.930 align:middle line:90%
a crash and some didn't?

00:08:09.930 --> 00:08:12.210 align:middle line:90%
We can ask questions like that.

00:08:12.210 --> 00:08:16.337 align:middle line:84%
None of these are implemented,
but the data is all there.

00:08:16.337 --> 00:08:18.420 align:middle line:84%
But of course, the big
question is how in the hell

00:08:18.420 --> 00:08:20.420 align:middle line:84%
did I just draw a raster
graphics in a terminal?

00:08:20.420 --> 00:08:22.650 align:middle line:90%


00:08:22.650 --> 00:08:24.210 align:middle line:84%
Well, you will
remember that there

00:08:24.210 --> 00:08:25.740 align:middle line:84%
were three confessions
I was going to make,

00:08:25.740 --> 00:08:27.032 align:middle line:90%
and I've only made one of them.

00:08:27.032 --> 00:08:28.440 align:middle line:90%
So I've written an editor.

00:08:28.440 --> 00:08:30.336 align:middle line:90%
I've also written an terminal.

00:08:30.336 --> 00:08:34.440 align:middle line:90%
[LAUGHTER]

00:08:34.440 --> 00:08:36.230 align:middle line:84%
So let's, like,
rest for a moment.

00:08:36.230 --> 00:08:39.789 align:middle line:84%
And I'm going to just rant about
terminals for just a minute.

00:08:39.789 --> 00:08:41.309 align:middle line:84%
This is my configuration
for iTerm2.

00:08:41.309 --> 00:08:43.226 align:middle line:84%
It's the terminal I use
in all my screencasts,

00:08:43.226 --> 00:08:46.190 align:middle line:84%
and the one I used
before I wrote one.

00:08:46.190 --> 00:08:49.350 align:middle line:84%
It's currently
configured for xterm.

00:08:49.350 --> 00:08:52.070 align:middle line:90%
xterm is basically doing VT100.

00:08:52.070 --> 00:08:57.210 align:middle line:84%
VT100 is also ECMA-48,
ISO 6429, ANSI X3.64,

00:08:57.210 --> 00:08:58.390 align:middle line:90%
or just ANSI escape codes.

00:08:58.390 --> 00:09:01.000 align:middle line:84%
These all mean the same
thing, pretty much.

00:09:01.000 --> 00:09:03.000 align:middle line:84%
And it all goes back to
this piece of hardware--

00:09:03.000 --> 00:09:07.452 align:middle line:84%
Digital Equipment Corporation,
VT100 terminal, 1978.

00:09:07.452 --> 00:09:09.660 align:middle line:84%
This is where the terminal
protocol we're still using

00:09:09.660 --> 00:09:11.940 align:middle line:90%
comes from.

00:09:11.940 --> 00:09:14.370 align:middle line:84%
To digress even
further, here's a graph

00:09:14.370 --> 00:09:18.057 align:middle line:84%
you've all seen before of
transistor counts and CPUs.

00:09:18.057 --> 00:09:19.140 align:middle line:90%
At the right, you'll see--

00:09:19.140 --> 00:09:21.140 align:middle line:84%
I don't think you can
read the words very well--

00:09:21.140 --> 00:09:23.010 align:middle line:84%
but you'll see an
Ivy Bridge CPU.

00:09:23.010 --> 00:09:24.540 align:middle line:90%
That's a current Intel CPU.

00:09:24.540 --> 00:09:27.120 align:middle line:84%
1.4 billion, with
a B as in boy--

00:09:27.120 --> 00:09:29.810 align:middle line:84%
1.4 billion transistors
in that thing.

00:09:29.810 --> 00:09:31.770 align:middle line:84%
A P4 is the fourth
one from the right.

00:09:31.770 --> 00:09:36.510 align:middle line:84%
You can see it's basically a
0 compared to an Ivy Bridge.

00:09:36.510 --> 00:09:41.915 align:middle line:84%
So if we scope this just
to the P4, the P4 has--

00:09:41.915 --> 00:09:42.540 align:middle line:90%
what is that?--

00:09:42.540 --> 00:09:44.700 align:middle line:84%
40-something
million transistors.

00:09:44.700 --> 00:09:47.460 align:middle line:84%
And you can see that
a 486 basically has 0.

00:09:47.460 --> 00:09:49.680 align:middle line:84%
So let's remove Pentium,
scope it to 486.

00:09:49.680 --> 00:09:52.590 align:middle line:84%
And you can see at the left
there, the 8008 and the 8080

00:09:52.590 --> 00:09:54.030 align:middle line:90%
basically have 0 transistors.

00:09:54.030 --> 00:09:58.250 align:middle line:84%
They both have on the
order of 10,000, I think.

00:09:58.250 --> 00:10:02.800 align:middle line:84%
The 8080 CPU, the one with 0
transistors compared to a 486,

00:10:02.800 --> 00:10:03.880 align:middle line:90%
is this.

00:10:03.880 --> 00:10:06.723 align:middle line:90%
And this is the CPU in a VT100.

00:10:06.723 --> 00:10:08.140 align:middle line:84%
You can see it's
in a DIP package.

00:10:08.140 --> 00:10:10.432 align:middle line:84%
I'm pretty sure I could
hand-solder this even if I were

00:10:10.432 --> 00:10:14.020 align:middle line:90%
drunk, and it would be fine.

00:10:14.020 --> 00:10:16.210 align:middle line:84%
This is the CPU that
powers the machine that

00:10:16.210 --> 00:10:18.580 align:middle line:84%
defined the terminal
protocol that you all

00:10:18.580 --> 00:10:20.860 align:middle line:90%
use every single day.

00:10:20.860 --> 00:10:22.135 align:middle line:90%
And I find this--

00:10:22.135 --> 00:10:24.010 align:middle line:84%
I don't necessarily
think old things are bad.

00:10:24.010 --> 00:10:25.990 align:middle line:90%
I love UNIX, and UNIX is old.

00:10:25.990 --> 00:10:29.118 align:middle line:84%
But this I find
pretty offensive.

00:10:29.118 --> 00:10:31.660 align:middle line:84%
And so the things I wanted, the
reason I wrote this terminal,

00:10:31.660 --> 00:10:34.100 align:middle line:84%
is I wanted raster
graphics on the grid.

00:10:34.100 --> 00:10:35.230 align:middle line:90%
So it's still a terminal.

00:10:35.230 --> 00:10:36.397 align:middle line:90%
It's still a character grid.

00:10:36.397 --> 00:10:38.997 align:middle line:84%
But sometimes a character
is a blob of raster data.

00:10:38.997 --> 00:10:41.080 align:middle line:84%
So it's still easy to think
about writing software

00:10:41.080 --> 00:10:41.440 align:middle line:90%
for this.

00:10:41.440 --> 00:10:43.540 align:middle line:84%
You don't have to think about
arbitrary pixel positioning

00:10:43.540 --> 00:10:44.445 align:middle line:90%
and views and stuff.

00:10:44.445 --> 00:10:45.820 align:middle line:84%
But you can throw
raster graphics

00:10:45.820 --> 00:10:49.240 align:middle line:84%
in for simple things like
the interaction graph.

00:10:49.240 --> 00:10:50.320 align:middle line:90%
24-bit color.

00:10:50.320 --> 00:10:52.090 align:middle line:84%
If you've ever tried
to get 256 working,

00:10:52.090 --> 00:10:53.890 align:middle line:84%
you'd know that
stepping into the '90s

00:10:53.890 --> 00:10:56.560 align:middle line:90%
is very difficult in 2012.

00:10:56.560 --> 00:10:58.480 align:middle line:90%
So I want to try to fix that.

00:10:58.480 --> 00:11:00.380 align:middle line:84%
Italics and bold and
underline-- basic text

00:11:00.380 --> 00:11:04.150 align:middle line:84%
stuff that the original
Macintosh had in the '80s.

00:11:04.150 --> 00:11:06.850 align:middle line:84%
Momentary keypresses-- like I
whack Control and then release

00:11:06.850 --> 00:11:07.350 align:middle line:90%
it.

00:11:07.350 --> 00:11:09.142 align:middle line:84%
I want to be able to
see that in my editor.

00:11:09.142 --> 00:11:10.933 align:middle line:84%
I didn't show this
feature, but it actually

00:11:10.933 --> 00:11:12.970 align:middle line:84%
has a feature where if
you hit a keystroke,

00:11:12.970 --> 00:11:16.180 align:middle line:84%
it opens a split for the
definition of a function

00:11:16.180 --> 00:11:17.170 align:middle line:90%
under your cursor.

00:11:17.170 --> 00:11:19.545 align:middle line:84%
Then you let go of the key,
and the definition goes away.

00:11:19.545 --> 00:11:23.950 align:middle line:84%
So it's a very quick way to
just see sort of offhand data.

00:11:23.950 --> 00:11:26.020 align:middle line:84%
And finally, I don't
like mice at all,

00:11:26.020 --> 00:11:29.613 align:middle line:84%
but some people do, so it
does support the mouse.

00:11:29.613 --> 00:11:31.030 align:middle line:84%
So that is why I
wrote a terminal.

00:11:31.030 --> 00:11:33.012 align:middle line:84%
And now let's go
back to the editor

00:11:33.012 --> 00:11:34.720 align:middle line:84%
and see some of the
more powerful layers.

00:11:34.720 --> 00:11:36.928 align:middle line:84%
I showed you the simple diff
layer, the slightly more

00:11:36.928 --> 00:11:38.190 align:middle line:90%
complex crash layer.

00:11:38.190 --> 00:11:40.867 align:middle line:84%
There is a performance
layer, which is really cool.

00:11:40.867 --> 00:11:43.450 align:middle line:84%
So you're looking at some source
code, you whack a single key.

00:11:43.450 --> 00:11:46.605 align:middle line:84%
It overlays, on the left,
performance information.

00:11:46.605 --> 00:11:48.730 align:middle line:84%
Most of those lines have
a gray marker on the left.

00:11:48.730 --> 00:11:50.460 align:middle line:84%
That means that it
was in the bottom 95

00:11:50.460 --> 00:11:52.480 align:middle line:90%
percent of the profile.

00:11:52.480 --> 00:11:53.673 align:middle line:90%
Yellow means top 5 percent.

00:11:53.673 --> 00:11:55.840 align:middle line:84%
Red, which is the very last
line of the source code,

00:11:55.840 --> 00:11:57.650 align:middle line:90%
means top 1 percent.

00:11:57.650 --> 00:11:59.440 align:middle line:84%
So single keystroke,
no wait time, you

00:11:59.440 --> 00:12:03.000 align:middle line:90%
can see profiling information.

00:12:03.000 --> 00:12:04.750 align:middle line:84%
It also has a series
of type layers, maybe

00:12:04.750 --> 00:12:07.030 align:middle line:84%
the most interesting for
a conference like this.

00:12:07.030 --> 00:12:08.200 align:middle line:90%
Remember, this is Ruby.

00:12:08.200 --> 00:12:11.710 align:middle line:84%
But with a single keystroke,
I can overlay type annotations

00:12:11.710 --> 00:12:15.250 align:middle line:90%
onto every single function.

00:12:15.250 --> 00:12:17.050 align:middle line:84%
It is not doing
type inference here.

00:12:17.050 --> 00:12:19.270 align:middle line:84%
Remember, there's
no static analysis.

00:12:19.270 --> 00:12:22.940 align:middle line:90%
This is by observing the system.

00:12:22.940 --> 00:12:25.030 align:middle line:84%
And I can also
shorten identifiers.

00:12:25.030 --> 00:12:26.262 align:middle line:90%
So this is the shorten layer.

00:12:26.262 --> 00:12:27.970 align:middle line:84%
At this point, as soon
as I turn this on,

00:12:27.970 --> 00:12:30.790 align:middle line:84%
the code becomes
read-only within a line.

00:12:30.790 --> 00:12:32.920 align:middle line:84%
But now it looks
quite a lot more

00:12:32.920 --> 00:12:35.260 align:middle line:84%
like maybe Haskell would
look, or something, where

00:12:35.260 --> 00:12:37.585 align:middle line:84%
you can glance at the type
information that tells you

00:12:37.585 --> 00:12:38.710 align:middle line:90%
what the function is doing.

00:12:38.710 --> 00:12:42.010 align:middle line:84%
You can see the structure of
it because the names are short.

00:12:42.010 --> 00:12:44.180 align:middle line:90%
And finally, a third type layer.

00:12:44.180 --> 00:12:46.148 align:middle line:84%
It can annotate every
line with the type

00:12:46.148 --> 00:12:47.440 align:middle line:90%
of the expression on that line.

00:12:47.440 --> 00:12:50.450 align:middle line:84%
Just sometimes sort
of useful to see that.

00:12:50.450 --> 00:12:53.170 align:middle line:84%
And then when I turn all these
off, code goes back to normal.

00:12:53.170 --> 00:12:54.370 align:middle line:90%
The code never changed.

00:12:54.370 --> 00:12:58.065 align:middle line:84%
Only the representation
on the screen changed.

00:12:58.065 --> 00:12:59.440 align:middle line:84%
So how does it do
all that stuff?

00:12:59.440 --> 00:13:02.325 align:middle line:84%
Well, actually, this one's
not that hard to explain.

00:13:02.325 --> 00:13:04.450 align:middle line:84%
The performance layer just
loads all those profiles

00:13:04.450 --> 00:13:07.450 align:middle line:84%
that were dumped out by the
auditor during test runs.

00:13:07.450 --> 00:13:08.950 align:middle line:84%
But of course, you
don't want to see

00:13:08.950 --> 00:13:10.350 align:middle line:90%
profiling data for unit tests.

00:13:10.350 --> 00:13:11.690 align:middle line:90%
That doesn't make any sense.

00:13:11.690 --> 00:13:14.110 align:middle line:84%
So if you tell the editor
that my perf tests live

00:13:14.110 --> 00:13:16.990 align:middle line:84%
in this directory, it will only
use those for the perf tests.

00:13:16.990 --> 00:13:19.600 align:middle line:84%
And in fact, you can
write a single perf test

00:13:19.600 --> 00:13:22.810 align:middle line:84%
for the thing you're curious
about, scope the layer to that,

00:13:22.810 --> 00:13:25.990 align:middle line:84%
turn the layer on, run the
test, and with a couple

00:13:25.990 --> 00:13:29.260 align:middle line:84%
of seconds of time you can
see the performance data

00:13:29.260 --> 00:13:33.510 align:middle line:84%
for the test you just wrote
inline with your source code.

00:13:33.510 --> 00:13:35.510 align:middle line:84%
The type layer is also
pretty easy to implement.

00:13:35.510 --> 00:13:38.560 align:middle line:84%
You just load up that trace
data that the auditor dumped.

00:13:38.560 --> 00:13:42.100 align:middle line:84%
And it sounds
expensive, but it's not.

00:13:42.100 --> 00:13:44.710 align:middle line:84%
Type inference is
expensive because there's

00:13:44.710 --> 00:13:46.000 align:middle line:90%
a graph it has to crawl.

00:13:46.000 --> 00:13:48.310 align:middle line:84%
But if you've just recorded
every single call point

00:13:48.310 --> 00:13:50.650 align:middle line:84%
in the whole test run,
in every test run,

00:13:50.650 --> 00:13:52.690 align:middle line:84%
it's a linear scan of
that to find out what

00:13:52.690 --> 00:13:55.620 align:middle line:90%
the types of the function are.

00:13:55.620 --> 00:13:58.120 align:middle line:84%
Finally, you can turn all
these on at the same time

00:13:58.120 --> 00:13:59.270 align:middle line:90%
if you want.

00:13:59.270 --> 00:14:01.360 align:middle line:84%
And it makes it kind
of hard to read.

00:14:01.360 --> 00:14:03.238 align:middle line:84%
But the most
magical part of this

00:14:03.238 --> 00:14:04.780 align:middle line:84%
is that if I go into
visual line mode

00:14:04.780 --> 00:14:07.197 align:middle line:84%
and select those bottom three
lines, that bottom function,

00:14:07.197 --> 00:14:10.810 align:middle line:84%
and delete it, it
marks it as deleted,

00:14:10.810 --> 00:14:12.822 align:middle line:90%
but it's still being rendered.

00:14:12.822 --> 00:14:14.530 align:middle line:84%
So all of these things
can work together,

00:14:14.530 --> 00:14:15.863 align:middle line:90%
and you can still edit the code.

00:14:15.863 --> 00:14:18.393 align:middle line:84%
You can't edit within a
line with shorten layer on.

00:14:18.393 --> 00:14:20.560 align:middle line:84%
But with all the other
layers, you can actually even

00:14:20.560 --> 00:14:23.410 align:middle line:90%
edit within a line.

00:14:23.410 --> 00:14:26.770 align:middle line:84%
So assuming-- so this system
has all this knowledge

00:14:26.770 --> 00:14:29.470 align:middle line:84%
about the structure of your
system, the crashes that

00:14:29.470 --> 00:14:30.870 align:middle line:90%
have happened in production.

00:14:30.870 --> 00:14:33.886 align:middle line:90%


00:14:33.886 --> 00:14:36.680 align:middle line:84%
If I release this
editor today publicly,

00:14:36.680 --> 00:14:39.820 align:middle line:84%
and it supported your
favorite dynamic language,

00:14:39.820 --> 00:14:40.797 align:middle line:90%
would you use this?

00:14:40.797 --> 00:14:42.130 align:middle line:90%
Do you think you would use this?

00:14:42.130 --> 00:14:44.000 align:middle line:90%
Do you think you might use this?

00:14:44.000 --> 00:14:45.590 align:middle line:90%
OK, a lot of hands.

00:14:45.590 --> 00:14:48.310 align:middle line:90%
I'm very glad to hear that.

00:14:48.310 --> 00:14:53.590 align:middle line:84%
I'm also a little
disappointed, because--

00:14:53.590 --> 00:14:55.960 align:middle line:84%
I haven't made my
third confession yet.

00:14:55.960 --> 00:14:57.440 align:middle line:90%
I wrote an editor.

00:14:57.440 --> 00:14:59.170 align:middle line:90%
I wrote an terminal.

00:14:59.170 --> 00:15:02.550 align:middle line:90%
I also told you an lies.

00:15:02.550 --> 00:15:04.620 align:middle line:84%
I did not actually
write an editor.

00:15:04.620 --> 00:15:07.810 align:middle line:90%


00:15:07.810 --> 00:15:09.638 align:middle line:90%
I did not write a terminal.

00:15:09.638 --> 00:15:11.680 align:middle line:84%
Everything you just saw
was actually all Keynote.

00:15:11.680 --> 00:15:13.894 align:middle line:84%
That was all text
boxes in Keynote.

00:15:13.894 --> 00:15:16.798 align:middle line:90%
[LAUGHTER]

00:15:16.798 --> 00:15:20.186 align:middle line:90%
[APPLAUSE]

00:15:20.186 --> 00:15:22.440 align:middle line:90%


00:15:22.440 --> 00:15:22.940 align:middle line:90%
Yeah.

00:15:22.940 --> 00:15:26.050 align:middle line:84%
That's a lot of hours of my
life you just watched go by.

00:15:26.050 --> 00:15:27.540 align:middle line:84%
It takes a long
time to fake that.

00:15:27.540 --> 00:15:31.410 align:middle line:90%


00:15:31.410 --> 00:15:35.460 align:middle line:84%
Now, the reason I
just did this is

00:15:35.460 --> 00:15:38.880 align:middle line:84%
that I tried to design a
talk demonstrating something

00:15:38.880 --> 00:15:41.310 align:middle line:84%
where if I were sitting in
the audience who saw it,

00:15:41.310 --> 00:15:43.980 align:middle line:84%
I would be, number one,
excited that this existed.

00:15:43.980 --> 00:15:45.960 align:middle line:90%
This is what I want to exist.

00:15:45.960 --> 00:15:48.000 align:middle line:84%
But number two, I would
actually be surprised

00:15:48.000 --> 00:15:49.680 align:middle line:90%
that someone had built it.

00:15:49.680 --> 00:15:51.830 align:middle line:84%
Now, the editor I would
find fairly surprising.

00:15:51.830 --> 00:15:53.830 align:middle line:84%
But the terminal I would
really find surprising,

00:15:53.830 --> 00:15:55.747 align:middle line:84%
because the terminal is
infrastructure that we

00:15:55.747 --> 00:15:59.190 align:middle line:90%
don't really replace, ever.

00:15:59.190 --> 00:16:01.110 align:middle line:84%
And now I want to
quickly ask the question,

00:16:01.110 --> 00:16:04.230 align:middle line:84%
with my small amount of
remaining time, why would that

00:16:04.230 --> 00:16:06.690 align:middle line:84%
be surprising to me, and
why was it maybe surprising

00:16:06.690 --> 00:16:09.480 align:middle line:84%
to you, to see that someone
had not only written an editor

00:16:09.480 --> 00:16:13.500 align:middle line:84%
but rewritten the
entire terminal layer?

00:16:13.500 --> 00:16:15.500 align:middle line:84%
I think there are
two big reasons

00:16:15.500 --> 00:16:16.750 align:middle line:90%
that this would be surprising.

00:16:16.750 --> 00:16:19.050 align:middle line:84%
And the first is that
we have this shipping

00:16:19.050 --> 00:16:23.585 align:middle line:84%
culture that is poisonous to
infrastructure replacement.

00:16:23.585 --> 00:16:25.710 align:middle line:84%
You have people like Seth
Godin saying things like,

00:16:25.710 --> 00:16:26.340 align:middle line:90%
"Ship often.

00:16:26.340 --> 00:16:28.080 align:middle line:90%
Ship lousy stuff, but ship.

00:16:28.080 --> 00:16:29.288 align:middle line:90%
Ship constantly."

00:16:29.288 --> 00:16:31.830 align:middle line:84%
--which I think is a great way
to achieve short-term business

00:16:31.830 --> 00:16:34.110 align:middle line:84%
gains, and a great
way to discover

00:16:34.110 --> 00:16:35.670 align:middle line:90%
what your customer wants.

00:16:35.670 --> 00:16:38.102 align:middle line:84%
But when you're a programmer
and you are the customer,

00:16:38.102 --> 00:16:39.810 align:middle line:84%
and you're writing
the system, and you've

00:16:39.810 --> 00:16:41.730 align:middle line:84%
been using these
tools for 20 years,

00:16:41.730 --> 00:16:43.808 align:middle line:84%
you don't need
customer discovery.

00:16:43.808 --> 00:16:46.350 align:middle line:84%
You need to go off and sit in
a hammock for a couple of years

00:16:46.350 --> 00:16:49.650 align:middle line:84%
and think hard, which I know
has come up at this conference

00:16:49.650 --> 00:16:52.140 align:middle line:90%
before.

00:16:52.140 --> 00:16:54.510 align:middle line:84%
The second reason I think
this is sort of surprising

00:16:54.510 --> 00:16:59.130 align:middle line:84%
is that we have not only all
this legacy, like the VT100,

00:16:59.130 --> 00:17:01.010 align:middle line:90%
or autoconf--

00:17:01.010 --> 00:17:03.234 align:middle line:84%
I don't like saying
that word, but--

00:17:03.234 --> 00:17:04.650 align:middle line:90%
[LAUGHS]

00:17:04.650 --> 00:17:07.700 align:middle line:84%
We have not only the legacy, but
we have a paralysis around it.

00:17:07.700 --> 00:17:10.020 align:middle line:84%
We can't even
imagine replacing it.

00:17:10.020 --> 00:17:12.082 align:middle line:90%
I mean, VT100, 1978.

00:17:12.082 --> 00:17:14.040 align:middle line:84%
A lot of the people in
this room weren't alive.

00:17:14.040 --> 00:17:16.170 align:middle line:90%
I wasn't alive in 1978.

00:17:16.170 --> 00:17:18.750 align:middle line:84%
And probably very few of
the people in this room

00:17:18.750 --> 00:17:22.150 align:middle line:84%
were actively
programming in 1978.

00:17:22.150 --> 00:17:25.240 align:middle line:84%
So these things have existed
forever for us, right?

00:17:25.240 --> 00:17:28.440 align:middle line:84%
We can't see the ways in which
they're bad, a lot of times,

00:17:28.440 --> 00:17:31.120 align:middle line:90%
or we just don't think about it.

00:17:31.120 --> 00:17:33.450 align:middle line:84%
So the way that thinking
about this editor started

00:17:33.450 --> 00:17:35.730 align:middle line:84%
was, I had all these
ideas for an editor.

00:17:35.730 --> 00:17:39.510 align:middle line:84%
I had them in my personal
Wiki, sort of in a Wiki page.

00:17:39.510 --> 00:17:41.230 align:middle line:84%
And I realized
pretty early on that

00:17:41.230 --> 00:17:43.110 align:middle line:84%
you would have to write a
terminal to build this editor.

00:17:43.110 --> 00:17:44.818 align:middle line:84%
Or it would not be in
the terminal, which

00:17:44.818 --> 00:17:47.370 align:middle line:84%
is unacceptable to
me, because Control-Z

00:17:47.370 --> 00:17:51.202 align:middle line:90%
is a thing that I want.

00:17:51.202 --> 00:17:53.160 align:middle line:84%
So I realized I would
have to write a terminal.

00:17:53.160 --> 00:17:55.243 align:middle line:84%
And I thought about, what
does that really entail?

00:17:55.243 --> 00:17:59.070 align:middle line:84%
Well terminals are coupled
to the kernel, via ioctls.

00:17:59.070 --> 00:18:02.370 align:middle line:84%
There's a lot of ioctls that
the terminals have to use.

00:18:02.370 --> 00:18:05.580 align:middle line:84%
Or, well, on both sides of
the terminal, ioctls happen.

00:18:05.580 --> 00:18:07.640 align:middle line:84%
There's the tty
and pty subsystems.

00:18:07.640 --> 00:18:09.940 align:middle line:90%
Those are part of the kernel.

00:18:09.940 --> 00:18:13.560 align:middle line:84%
So now I'm basically thinking
about making kernel changes

00:18:13.560 --> 00:18:19.200 align:middle line:84%
to support my terminal, which
seems very difficult in today's

00:18:19.200 --> 00:18:19.860 align:middle line:90%
world, right?

00:18:19.860 --> 00:18:20.843 align:middle line:90%
You can't go up to--

00:18:20.843 --> 00:18:22.760 align:middle line:84%
you can't submit a patch
to the Linux kernel--

00:18:22.760 --> 00:18:25.330 align:middle line:84%
well, we're changing the
nature terminal, guys.

00:18:25.330 --> 00:18:25.830 align:middle line:90%
Here you go.

00:18:25.830 --> 00:18:27.060 align:middle line:90%
Here's the patch.

00:18:27.060 --> 00:18:28.545 align:middle line:90%
It will not be merged.

00:18:28.545 --> 00:18:30.870 align:middle line:90%
[LAUGHTER]

00:18:30.870 --> 00:18:33.810 align:middle line:84%
So I'm not exactly sure
what the answer to this

00:18:33.810 --> 00:18:39.080 align:middle line:84%
is, but I think that it is
basically embrace and extend.

00:18:39.080 --> 00:18:40.830 align:middle line:84%
I think you build a
new terminal protocol,

00:18:40.830 --> 00:18:42.205 align:middle line:84%
you make it
backwards-compatible,

00:18:42.205 --> 00:18:44.970 align:middle line:84%
and you just throw
pty's and tty's away.

00:18:44.970 --> 00:18:46.740 align:middle line:84%
But no one does things
like that, right?

00:18:46.740 --> 00:18:48.870 align:middle line:90%
No one papers over--

00:18:48.870 --> 00:18:53.140 align:middle line:84%
really replaces the
low-level infrastructure.

00:18:53.140 --> 00:18:56.940 align:middle line:84%
The second thing that I've--
this is something I've observed

00:18:56.940 --> 00:18:59.760 align:middle line:84%
from other people, is that
talking about this actually

00:18:59.760 --> 00:19:03.250 align:middle line:84%
makes some people
mad, like mad-mad.

00:19:03.250 --> 00:19:05.250 align:middle line:84%
They are actually
angry that I will

00:19:05.250 --> 00:19:07.525 align:middle line:84%
talk about what a new
editor might look like,

00:19:07.525 --> 00:19:09.150 align:middle line:84%
or what a new terminal
might look like,

00:19:09.150 --> 00:19:12.570 align:middle line:84%
or what a new UNIX might look
like, which doesn't make sense

00:19:12.570 --> 00:19:13.425 align:middle line:90%
to me.

00:19:13.425 --> 00:19:15.300 align:middle line:84%
And some other people
just think it's stupid.

00:19:15.300 --> 00:19:18.360 align:middle line:84%
They think it's masturbatory to
talk about this kind of stuff.

00:19:18.360 --> 00:19:23.440 align:middle line:84%
That part I understand, at
least, but I don't agree with.

00:19:23.440 --> 00:19:25.637 align:middle line:84%
So if you're in
this camp of, why

00:19:25.637 --> 00:19:27.720 align:middle line:84%
would we worry about the
low-level infrastructure?

00:19:27.720 --> 00:19:31.950 align:middle line:84%
Why would we do full redesign
of low-level things that have

00:19:31.950 --> 00:19:33.870 align:middle line:90%
existed for 40 years?--

00:19:33.870 --> 00:19:36.240 align:middle line:84%
I'd like to present this
hypothetical timeline

00:19:36.240 --> 00:19:38.610 align:middle line:84%
of a piece of infrastructure
being developed, where,

00:19:38.610 --> 00:19:42.330 align:middle line:84%
in spring of 2005, someone
decides to work full-time

00:19:42.330 --> 00:19:45.240 align:middle line:84%
on this thing, to redesign
a piece of infrastructure

00:19:45.240 --> 00:19:47.430 align:middle line:90%
we've had for a very long time.

00:19:47.430 --> 00:19:50.490 align:middle line:84%
For the first year, they
just think and prototype,

00:19:50.490 --> 00:19:53.543 align:middle line:90%
until spring of 2006.

00:19:53.543 --> 00:19:55.710 align:middle line:84%
And then in spring of 2006,
they start implementing.

00:19:55.710 --> 00:19:58.380 align:middle line:84%
And in fall of 2007,
they release this thing

00:19:58.380 --> 00:20:00.810 align:middle line:84%
that they've designed
for 2 and 1/2 years

00:20:00.810 --> 00:20:02.190 align:middle line:90%
without it being public.

00:20:02.190 --> 00:20:04.033 align:middle line:90%
They release it into the world.

00:20:04.033 --> 00:20:05.700 align:middle line:84%
Does anyone know-- I
assume someone must

00:20:05.700 --> 00:20:07.200 align:middle line:90%
know what this timeline is.

00:20:07.200 --> 00:20:09.120 align:middle line:90%
[INAUDIBLE]

00:20:09.120 --> 00:20:10.380 align:middle line:90%
Oh, good guess, Git.

00:20:10.380 --> 00:20:11.630 align:middle line:90%
I hadn't even thought of that.

00:20:11.630 --> 00:20:13.153 align:middle line:90%
No, this is actually Clojure.

00:20:13.153 --> 00:20:14.070 align:middle line:90%
This is the timeline--

00:20:14.070 --> 00:20:15.840 align:middle line:84%
I emailed Rich to make
sure I had my dates right.

00:20:15.840 --> 00:20:17.673 align:middle line:84%
This is the timeline
of Clojure development.

00:20:17.673 --> 00:20:21.310 align:middle line:84%
2 and 1/2 years before it was
public, and a full year of that

00:20:21.310 --> 00:20:24.680 align:middle line:84%
was just thinking
and prototyping.

00:20:24.680 --> 00:20:26.750 align:middle line:84%
And I think this
is kind of what you

00:20:26.750 --> 00:20:31.010 align:middle line:84%
have to do to redesign
infrastructure, right?

00:20:31.010 --> 00:20:34.040 align:middle line:84%
Rich didn't just like pile
some crap on top of Lisp.

00:20:34.040 --> 00:20:38.317 align:middle line:84%
He took the entire Lisp and
moved the whole design at once.

00:20:38.317 --> 00:20:39.650 align:middle line:90%
And that's something you can't--

00:20:39.650 --> 00:20:42.620 align:middle line:84%
at least, I don't think
you can get by doing

00:20:42.620 --> 00:20:43.640 align:middle line:90%
incremental development.

00:20:43.640 --> 00:20:46.182 align:middle line:84%
I think you really have to step
back and think hard and spend

00:20:46.182 --> 00:20:50.210 align:middle line:84%
a lot of time laying in a
hammock, staring at the sky.

00:20:50.210 --> 00:20:53.823 align:middle line:84%
So I realize this was
a really weird talk.

00:20:53.823 --> 00:20:55.490 align:middle line:84%
When Alex invited me
to do a lunch talk,

00:20:55.490 --> 00:20:57.290 align:middle line:84%
I decided to do
something totally crazy.

00:20:57.290 --> 00:21:00.260 align:middle line:84%
And usually my talks
are not giant lies.

00:21:00.260 --> 00:21:01.070 align:middle line:90%
[LAUGHTER]

00:21:01.070 --> 00:21:04.510 align:middle line:90%
So I am Gary Bernhardt.

00:21:04.510 --> 00:21:07.040 align:middle line:84%
I own Destroy All Software,
which produces screencasts.

00:21:07.040 --> 00:21:09.050 align:middle line:84%
And I thank you guys
very much for letting

00:21:09.050 --> 00:21:10.760 align:middle line:90%
me lie to you for 30 minutes.

00:21:10.760 --> 00:21:14.110 align:middle line:90%
[APPLAUSE]

00:21:14.110 --> 00:21:20.000 align:middle line:90%