Tutorials should be about teaching others. But many tutorials today seem to be more about showing what the author knows.
132 karma · joined August 18, 2011
Tutorials should be about teaching others. But many tutorials today seem to be more about showing what the author knows.
The reality is that many species can coexist in the same habitat. You don't have to pick just one. Cats don't have pincers, but does that have to mean lobsters are superior? Nope.
I love the idea - and it strongly appeals to me as a developer - but what would make the average user switch to it?
With so much conflicting wisdom to sort through - "yuck, monolith!", "omakase!", "YAGNI!", "not enough abstraction!", "too much abstraction!" - we should admit that we often end up leaning on instinct/emotion when making these decisions.
Just remember that you don't have to pick one philosophy and stick with it for all time exclusively. Often down the road you'll see the value in something you thought you had sworn off.
Intelligent design is just one hypothesis among many to explain the complexity (the apparent "design") of the universe. But it posits the existence of an even more complex entity. If we really need intelligent design to explain where eyeballs and bird wings came from, why don't we also need an explanation of the omnipotent designer?
> a systematic enterprise that creates, builds and organizes knowledge in the form of testable explanations and predictions about the universe.
The key word being "testable". The fallibility (or falsifiability) of scientific hypotheses is the great strength of science: We can improve, or prove wrong, our understanding.
Dawkins writing celebrates this, and I think it's unfair to characterize his passionate (OK, sometimes strident) advocacy as "unquestioning" fanaticism.
If it's a "leap of faith" to accept the axiom that we can refine/invalidate knowledge through experimentation, then "a leap of faith" isn't a very profound deed.
This is the first I've heard of that project, but based on a quick skim, I can point out a few differences between it and Runiq - although the two are certainly similar in that they execute over a very simple plain-array-based AST. (Clearly miniMAL and Runiq were created with different ultimate aims in mind, so any fair comparison ends there. :) )
- Runiq is fully designed around async. (At first glance I'm unsure how you would express, say, an HTTP request or file I/O in miniMAL - i.e., anything which in JS would require a callback.) In Runiq it would look something like this:
; assuming 'print' and 'read-file' are defined in the DSL... ;
(print (read-file "foo.txt"))
- Runiq execution happens in parallel (taking a cue from functional languages) and the tree can be reduced stepwise; Runiq has a built-in mechanism for pause and resume. It looks like miniMAL executes wholesale, but I may be mistaken.- Runiq has no (built-in) JavaScript interop, although it would be trivial to add that feature via Runiq's DSL-building API. I specifically avoided adding any type of sytnax to talk to JS directly because I wanted Runiq to be a safe sandbox by default, with the option to add "dangerous" functions easily if need be.
But, that's super cool and I wish I'd come across that earlier!
Runiq more or less does this translation:
source: (hack (the) (planet!))
ast: ["hack", ["the"], ["planet!"]]
reduce order: "the" "planet!" -> "hack"
Function tokens map to predefined CPS JavaScript functions: "hack": function(a,b,cb){...}, // add numbers
"the": function(cb){...}, // return 1
"planet!": function(cb){...}, // return 2
Outputs produce new trees that eventually reduce to a value. -> ["hack", ["the"], ["planet!"]]
-> ["hack", 1, 2]
-> [3]
-> 3
Runiq is very much an experiment, and some design decisions I made have trade-offs (speed, for one). But Runiq could still find a niche somewhere between grown-up projects like Clojure(Script) and single-purpose languages like PuzzleScript, both of which I admire.I agree that other ecosystems could learn a lot from the Node philosophy. And in general I enjoy working with the technology. But it's not all roses. In an ecosystem of small modules, you often find yourself wading through many -- equally small -- annoyances which can add up to a lot of friction. Here's a contrived fake example:
Your app needs ABCXYZ. So you go shopping for a module. The most popular one looks good, but when you Browserify it your bundle ends up with 1,000s of extra lines of code for the Buffer shim. So much for keeping that footprint small. So you keep looking and find another one that has a good footprint, but a weird API and it hasn't been updated by the maintainer since 2011. The next one you find looks great, but the maintainer decided they were tired of ES5 and didn't feel like adding a distfile, so you would have to install a bloated transpile toolchain to use it. You're getting annoyed but you keep going. The next one's author inexplicably decided to implement everything with streams. But you're too busy to spend a day grokking streams and reworking your entire API to be compatible. The next one is packaged as a jQuery plugin. The next one doesn't have a license. The next one uses Web Workers for no reason you can see. Etc. etc. etc. Repeat.
Any of these could be problems with a monolith (and monoliths certainly come with their own pile of frustrations), but monoliths are less likely to hit these problems simply because they consolidate effort and personal emotional investment around a certain set of techniques and standards, which leads to more consistency overall.
That said, I have two problems with the article.
#1 - I don't like the idea of qualifications. Sure, the lack of career-path guarantees sucks, but that anarchy also benefits us. If I can get my hands on a computer, I can learn to code on my own (with lots of hard work, yes), build what I dream of, change my life. I can sidestep red tape, bias, prejudice, and credentialism that might work against me elsewhere.
#2 - I dislike the vague word 'aptitude', which the author uses many times. The idea of 'aptitude' may help distinguish Mozart from Salieri, but not Salieri from his cousin Fred. What I mean is, at the level most of us operate at, mightn't factors like motivation, persistence, and health affect us more than 'aptitude'? If the article replaced the word 'aptitude' with 'motivation' I'd like it better.
- Functions
- Abstraction
- Modularity
- Design patterns
- Programming paradigms
- DSLs
- Conventions for naming/formatting/arrangement
Although I grant that any of these could possibly work even better when codified into a framework.In any case, I love this discussion. Programming is fun.