-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
executable file
·406 lines (322 loc) · 18.7 KB
/
index.html
File metadata and controls
executable file
·406 lines (322 loc) · 18.7 KB
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
<!DOCTYPE html>
<title>Eve</title>
<meta name="description" content="Eve: Programming designed for humans.">
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
<link rel="stylesheet" type="text/css" href="/assets/css/philosophy.css" />
<link rel="icon" type="image/png" href="/assets/img/favicon.png" />
<link href='https://fonts.googleapis.com/css?family=Open+Sans:400,600' rel='stylesheet' type='text/css' />
<nav>
<a href="/">Home</a>
<a href="http://play.witheve.com">Play</a>
<a href="https://groups.google.com/forum/#!forum/eve-talk">Community</a>
<a href="http://docs.witheve.com">Docs</a>
<a href="https://incidentalcomplexity.com">Blog</a>
<div class="github">
<a class="github-button" href="https://github.com/witheve/eve" data-style="mega" data-count-href="/witheve/eve/stargazers" data-count-api="/repos/witheve/eve#stargazers_count" data-count-aria-label="# stargazers on GitHub" aria-label="Star witheve/eve on GitHub">Star</a>
</div>
</nav>
<div class="wrapper">
<row style="margin-top:70px;">
<co1>
<h1>Eve: Programming designed for humans</h1>
<p>
Eve is a programming language and IDE based on years of research into building a human-first programming platform. From code embedded in documents to a language without order, it presents an alternative take on what programming could be - one that focuses on us instead of the machine. This is Eve:
</p>
<a class="image-link" href="http://play.witheve.com/#/examples/quickstart.eve"><img class="gameover" title="Eve" src="/assets/img/philosophy/eve.png" /></a>
</co1>
</row>
<h2 id="abouthumans" style="margin-top:50px;">Eve is about humans, not computers</h2>
<row>
<co1>
<p>
We've made tremendous advancements since the early days of programming, but the modern form still forces us into the role of bit shifting machines. Programming has always been for us - the humans tapping at keyboards. The computer doesn't care what syntax or semantics we use or how error messages are phrased. Those are for you and me. And this is how we treat ourselves...
</p>
<img class="error" style="margin:20px 0 30px 0;" src="/assets/img/philosophy/error.png" />
<p>
Focusing on the machine and ignoring the human factors of software engineering have led us down a difficult road. From inscrutable error messages to semantics that require years of study to understand, we've landed on a version of programming that is actively antagonistic toward our goal of creating usable and robust software. To make matters worse, we're programming as if we still had the 1970's computer that our tools were developed for. Unsurprisingly, we are struggling. <a href="http://www.tricentis.com/blog/2014/12/18/top-10-software-fails-of-2014/">A lot</a>.
</p>
<p>
There's no reason we have to stay on top of a sinking foundation though. What if we went back to first principles and put humans first? What would that look like?
</p>
</co1>
</row>
<h2 id="different" style="margin-top:60px;">A different kind of programming</h2>
<row>
<co1>
<p>
Over the past several years, we've been exploring what an alternate future could look like and have distilled that research into a platform that we call Eve. To get a taste, let's take a look at a day in the life of someone programming in Eve:
</p>
</co1>
</row>
<div class="super-wrapper">
<div class="videowrapper large">
<iframe class="video" src="https://www.youtube.com/embed/TWAMr72VaaU?rel=0&showinfo=0" frameborder="0" allowfullscreen></iframe>
</div>
<div class="caption">Don't want to put on headphones? We added captions! Just press the CC button.</div>
</div>
<h3 id="prose">Prose and then code</h3>
<row>
<co>
<p>
The first difference you'll notice is that programs look more like word documents than code files. Eve is designed for "literate programming" - instead of comments embedded in code, code is embedded in a document.
</p>
<p>
This gives us the freedom to organize our programs based on how we actually think, not how the code will be compiled. We can group blocks based on functionality, similarity, owner, or anything else we can think of.
</p>
<p>
More importantly though, it gives us the ability to weave a narrative of not just what the program does, but why it does it. You can write a spec and then embed the blocks of code that make it work. Someone new to the project can look at the table of contents to get a sense of what's going on and then dig into a section to add something. Instead of constantly trying to piece the narrative back together every single time we fix a bug, we can make it an artifact of programming in the first place.
</p>
</co>
<co>
<img class="evedoc" src="/assets/img/philosophy/doc.png" title=" eve doc " />
</co>
</row>
<h3 id="betteride" style="margin-top:30px;">An IDE like Medium, not Vim</h3>
<row>
<co>
<p>
The environment we want in this context is more about narrative creation than class hierarchies. We want a *reading* and *writing* environment that allows us to meaningfully lay out and explore our program. The first step towards that is having a table of contents that provides both an outline and a convenient form of navigation.
</p>
<p>
But just because we have a linear representation of the program, that doesn't mean we can't view it in other ways just as easily. Instead of a slew of tabs and complex navigation features, we have a document that arranges itself in whatever shape we need. And as much as possible, everything is placed in context so that the narrative is kept front and center.
</p>
<img style="margin-bottom:40px;" src="/assets/img/philosophy/comment.png" title=" errors " />
</co>
<co>
<img src="/assets/img/philosophy/elision.gif" style="" title=" TOC + elision " />
</co>
</row>
<h3 id="simplemodel" style="margin-top:30px;">A simple model: the world as data</h3>
<row>
<co1>
<p>
Eve is based on a single unifying principle: everything is a record - a set of attribute/value pairs associated to an ID. With this uniformity, Eve only needs a handful of operations that query and manipulate records. Want to send an email? You create an email record. Want to look at messages sent to slack? You query for message records in the slack database. Want to make a todo app? Query for todos and create div records in the browser database.
</p>
<img class="email" src="/assets/img/philosophy/email.png" title=" email, slack, and todos code" />
</co1>
</row>
<row>
<co>
<img class="flappy" src="/assets/img/philosophy/flappy.gif" title="flappy bird" />
</co>
<co>
<p>
Blocks are reactive in Eve; they declaratively specify "when I see these patterns, do these things." You don't need to specify how they update, or how they're cached, or how they're stored, or... If you add new todos, new divs will automatically appear.
</p>
<p>
Just nine operations let us write everything from a flappy bird clone to Eve's code analyzer.
</p>
</co>
</row>
<h3 id="trasparent" style="margin-top:50px; ">Absolute transparency and effortless visualization</h3>
<row>
<co>
<p>
Because literally everything is a record, we have a completely transparent view into our system. Let's say we wanted to know how many http requests were open right now. In a Javascript app we'd have no way to know unless we explicitly captured that information. In Eve, we just ask:
</p>
</co>
<co>
<img src="/assets/img/philosophy/openhttp.png" title=" open http requests " />
</co>
</row>
<row>
<co>
<p>
How about memory? Like anything else in Eve, we search for what we want and then use the full power of the language to react to it. Let's send ourselves a slack message if the free memory on this machine goes below 200mb.
</p>
</co>
<co>
<img src="/assets/img/philosophy/memoryslack.png" title=" memory slack message " />
</co>
</row>
<row>
<co>
<p>
But we can do even better. Let's visualize free memory over time:
</p>
</co>
<co>
<img src="/assets/img/philosophy/memory.gif" title=" line chart of memory over time " />
</co>
</row>
<row>
<co>
<p>
Think about what this does for our ability to understand programs - we can trivially visualize and react to anything in our system. Want to see a real-time visualization of users signing up? Write a single block to do it:
</p>
</co>
<co>
<img src="/assets/img/philosophy/users.png" title=" cool view over users " />
</co>
</row>
<h3 id="gadget" style="margin-top:30px;">The inspector</h3>
<co1>
<p>
Visualization is only one part of the story though, sometimes we need to just dig in and investigate what's going on. When something isn't working, you press the inspect button and Eve will help you figure out why.
</p>
<div class="super-wrapper2">
<div class="videowrapper">
<iframe class="video" src="https://www.youtube.com/embed/JJk9PTzz_8M?rel=0&showinfo=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<p>
The inspector is an example of something that just can't be done in traditional languages. It requires knowing where things came from and how your program fits together. The vast majority of our effort debugging is spent just trying to figure out where the error even is, but Eve can take us right to it. Even better, it points us toward why it's going sideways in the first place. This is like giving a car mechanic a device that holds up a giant red arrow saying "The alternator wire is loose right here!"
</p>
<div class="super-wrapper2">
<div class="videowrapper">
<iframe class="video" src="https://www.youtube.com/embed/oPyQf0rk8V4?rel=0&showinfo=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<p>
Given that we spend most of our time hunting down and fixing errors, the implication of having this button is clear: we've got a lot more free time.
</p>
</co1>
<h2 id="intothedeep" style="margin-top:60px;">Into the deep</h2>
<co1>
<p>
As we've developed Eve, we've learned that these seemingly simple choices have remarkably broad consequences on what it means to program. Let's look at a few of them.
</p>
</co1>
<h3 id="smallblocks">Small blocks that fit into a broader story</h3>
<row>
<co1>
<p>
Code isn't an asset, it's a liability. Every line adds to the surface area of potential bugs and to the pile of things that must be understood and maintained. As long as we aren't obfuscating intent, our goal should be to have less code. Eve programs tend to be very small, but even more importantly, individual blocks remain short and single purpose. Because of the literate programming focus, blocks also fit into a narrative that helps provide context. Code is presented in small, digestible pieces, with built-in explanations and a place in the larger picture. The impact this has on maintenance, navigation, and collaboration can't be overstated.
</p>
</co1>
</row>
<h3 id="composition101">Programming by composition</h3>
<row>
<co1>
<p>
The common interface of records means that Eve blocks compose by default and because there's no inherent ordering to blocks, we're free to organize them however we want. Instead of constantly re-architecting to deal with changes, or building complex infrastructure to deal with evolution, Eve programs grow organically. Features, fixes, even visualizations can all be added without changing existing code and the lack of order allows us to put them wherever it makes the most sense.
</p>
</co1>
</row>
<h3 id="correct">The power of global correctness</h3>
<row>
<co1>
<p>
Instead of spreading null checks and asserts throughout our code, invariants can be enforced globally by producing error records. Doing this through normal Eve blocks gives us the full power of the language to express arbitrarily complex invariants.
</p>
<img src="/assets/img/philosophy/integrity.png" title=" integrity constraint example " />
<p>
The fact that constraints can be expressed globally through block composition has a couple of interesting implications. The first is that correctness is pay as you go. We don't have to lay out a bunch of types or schemas before we even really know what we're trying to build. We can work on our program and layer on invariants as it seems appropriate.
</p>
<p>
The second is that these integrity constraints will never allow our records to enter into a bad state. As such, it's safe for us to think just about the block we're working on. No need to check invariants every line or worry about adding code that gives everyone ten salaries. We have local reasoning with global enforcement.
</p>
<p>
The best part though is that just like everything else, errors are records. Error handling is just another block.
</p>
</co>
</row>
<h3 id="zoomenhance">"Zoom and enhance"</h3>
<row>
<co>
<p>
"Zoom and enhance" is a common trope in science fiction, but what prevents us from actually having it? In the case of images, we really are missing the data, but with software there's an incredible amount of information that we just throw away. What if we didn't?
</p>
<p>
The closest thing we have to this now is the web inspector in browsers, but it's still missing a lot of information. Eve captures everything it can, which allows us to connect the dots in very useful ways.
</p>
</co>
<co>
<img src="/assets/img/philosophy/zoom.png" title=" inspect a dom node, inspect a block " />
</co>
</row>
<h3 id="neverstuck">We're never stuck</h3>
<co1>
</co1>
<row>
<co>
<p>
Our systems should be measured by our ability to understand them when they're falling apart. Why can't we ask "Computer, why is this malfunctioning?" like they do in Star Trek?
</p>
<p>
The inspector is like having another programmer right next to us 24/7. When we're stuck, we hit a button and Eve sets us on a path toward finding and fixing whatever's wrong - "Computer, why is this slow?"
</p>
<p>
One of the single greatest changes we can make to programming is giving ourselves the ability to ask questions. Not just why doesn't this work, or why is this slow, but what's the average number of times a user clicks this button or how many people did we pay this week? Eve's entire model is based around allowing us to ask any question we come up with. It liberates us from the "undefined of undefined" and let's us peer deep inside our systems.
</p>
</co>
<co>
<img src="/assets/img/philosophy/slow.png" style="" title=" performance information per block " />
</co>
</row>
<h2 id="simplicity" style="margin-top:100px;">Simplicity</h2>
<row>
<co1>
<p>
Simple solutions are unfortunately much more difficult to find than complex ones. It requires being deliberate and questioning many of the things we hold as inherent truths. In the end, the design of Eve stems from a complete focus on simplicity. Instead of Eclipse, let's do our work in something more like pen and paper. Instead of complex semantics, let's have everything be a record. Instead of thousands of debugger options, let's have a magic tool where you click on the thing that's going wrong. Eve is about making things simpler for the people solving problems: us.
</p>
</co1>
</row>
<h2 id="justataste" style="margin-top:100px;">Just a taste</h2>
<co1>
<p>
There's a lot more to dig into, from how we think Eve can shift the bell curve of programming to how we can make this crazy language fast. This is, however, just the first of three milestones on our roadmap:
</p>
<ul>
<li>
<h4>Eve: Programming designed for humans (0.2.0 implementation)</h4>
<p class="light">
The first step was to build a simple, human-centric form of programming. What we've shown here isn't just a demo, it's a real, albeit early, piece of software. You can play with it <a href="http://play.witheve.com">here</a>.
</p>
</li>
<li>
<h4>Eve: The world scale computer (designs, prototypes)</h4>
<p class="light">
The next step is to show how Eve allows us to get rid of the 1970's notion of a computer and embrace a distributed world. Along the way, maybe we could get something like Moore's law back without forcing people to understand Paxos.
</p>
</li>
<li>
<h4>Eve: Computation for all (research, prototypes)</h4>
<p class="light">
The final step is to show how all of this lays the foundation for a more powerful version of end-user computing. While not everyone wants to write *software*, we all have something to get done and chances are the computer can help us do it.
</p>
</li>
</ul>
<p>
Through all of our research, we've started to piece together a future of computation to aspire to - from humane tools and a different concept of the machine, to giving everyone on the planet a superpower. There's so much more to do and regardless of whether or not you believe Eve is it, it's up to all of us to make such a future a reality. Failing to do so doesn't just hold our industry back. It drags down all human endeavors waiting to be driven by better forms of computation. The computer is arguably the single most powerful tool ever developed. It's time for us to truly wield it.
</p>
</co1>
<row>
<co>
<h3 id="getinvolved">Get involved</h3>
<p>
The more interest we can show, the easier it will be for us to continue doing this work. The best way to help is to spread the word and engage with us. Unfortunately we aren't hiring right now, but we hope to change that in the not too distant future.
</p>
<ul class="small">
<li>Send it to people!</li>
<li>Star us on GitHub <div class="inlinebutton"><a class="github-button" href="https://github.com/witheve/eve" data-style="mega" data-count-href="/witheve/eve/stargazers" data-count-api="/repos/witheve/eve#stargazers_count" data-count-aria-label="# stargazers on GitHub" aria-label="Star witheve/eve on GitHub"></a></div></li>
<li><a href="http://play.witheve.com">Quick Start</a></li>
<li><a href="https://groups.google.com/forum/#!forum/eve-talk">Join the mailing list</a></li>
<li><a href="https://twitter.com/with_eve">Follow us on twitter</a></li>
<li><a href="https://github.com/witheve/Eve/issues">File bugs</a></li>
</ul>
</co>
<co>
<h3 id="learnmore">Learn more</h3>
<p>
Below we've put together a few followup pages and over the next several weeks we'll be adding a set of deep dives. If you're interested in how Eve came to be, the research it's based on, or some of the deeper implications, check them out:
</p>
<ul class="small">
<li><a href="/deepdives/lighttable.html">Realizing Light Table</a></li>
<li><a href="/deepdives/whateveis.html">What Eve is and isn't</a></li>
<li><a href="/deepdives/literate.html">Literate Programming</a></li>
</ul>
</co>
</row>
</div class="wrapper">
<!-- Place this tag in your head or just before your close body tag. -->
<script async defer src="https://buttons.github.io/buttons.js"></script>
<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','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-74222157-3', 'auto');
ga('send', 'pageview');
</script>
<script async src="https://arc.io/widget.js?JCsevYbDQepKMr7CmBZQhc"></script>