SpaCy: Industrial-strength NLP with Python and Cython - <AUTHOR> http://honnibal.github.io/spaCy <comment><USER2> NLTK has always seemed like a bit of a toy when compared to Stanford CoreNLP. I'd be very curious to see performance/accuracy charts on a number of corpora in comparison to CoreNLP.

The Cython implementation makes it somewhat believable that it's faster than CoreNLP, but I'd also like to hear a deep-dive on why it's several times faster, beyond that control over memory layout is the best way to win performance (stipulated). In particular, it would be good to know whether CoreNLP is doing more processing than spaCy or otherwise handling more concerns.

Finally, I'd really love to see a feature table comparing spaCy with CoreNLP.

Compelling work!

<comment><USER3> _The Cython implementation makes it somewhat believable that it 's faster than CoreNLP, but I'd also like to hear a deep-dive on why it's several times faster,_

Time complexity. The Stanford parser is a phrase structure parser that creates dependencies as a post processing step. So, assuming that they use some variation of CKY, the time complexity is O(N^3 |G|) where |G| is the size of the grammar. This uses Nivre-style greedy parsing, which is O(N).

So, a slightly fairer comparison would be e.g. the Malt parser. Although this will probably be better than that in terms of accuracy, since last time I checked the Malt parser doesn't use dynamic oracles yet and by default doesn't integrate Brown clusters or word embeddings (though you could do that yourself). Though I wonder a bit about feature set construction, because in my experience perceptrons are far more sensitive to adding 'wrong' features than e.g. SVM classifiers. This becomes interesting especially when you train a model for another language or dependency scheme annotation, since the features that are relevant differ per set-up.

<comment><AUTHOR> That's not true --- I'm comparing against their neural-network shift-reduce dependency parser, which is very fast. Actually I don't know of a faster parser than theirs, other than spaCy.

<comment><USER4> I'm curious how this parser compares to ClearNLP [http://www.clearnlp.com/](http://www.clearnlp.com/) which is similarly a shift-reduce parser.

</comment></comment></comment></comment><comment><USER3> First of all: great work! Even though I think OpenNLP should also be mentioned, since it's released under the commercially-friendly Apache 2 license, it's great that you provide this. Also, I think it is a shame that science lost you (I assume) ;).

I think the other interesting problem to tackle currently is training data. The situation for English is ok, if you have a couple of thousand of dollars to spare for a commercial license (which may be problematic for bootstrapping). But for many other languages there aren't even treebanks available that can be used for commercial purposes.

It would be great if some annotation project started that aimed to provide annotations under a liberal license.

(Ps. I have a statistical dependency parser written in Go, which I will probably release soon in case anyone is interested ;).)

<comment><AUTHOR> Well, I'm distributing trained models with this. Users shouldn't need to retrain unless they're doing research, in which case they should have access to the data.

I agree that the data situation is troubling, though. I don't understand why Google gave the English Web Treebank to the LDC. Why not just distribute it themselves?

The LDC is really more of a problem than a help now. For instance, the OntoNotes corpus costs $0 for non-commercial use. Great! How do you get it? Send the LDC a fax, and when they get around to it, they send you a log in to their ancient website.

It used to be a valuable service to host and distribute this data. Now, this is no longer really the case, but it's still standard to distribute via them.

<comment><USER3> _Well, I 'm distributing trained models with this. Users shouldn't need to retrain unless they're doing research, in which case they should have access to the data._

I haven't read LDC's license on Penn Treebank recently, but AFAIR you cannot just redistribute models that were trained on the Penn Treebank. Or put differently, you can distribute the model, but any users still have to obtain a license for the treebank. That's why we are still stuck with the Brown corpus and such.

 _I don 't understand why Google gave the English Web Treebank to the LDC. Why not just distribute it themselves?_

Indeed.

<comment><USER3> _I haven 't read LDC's license on Penn Treebank recently,_

Just checked the license and my memory seems to be correct:

[https://catalog.ldc.upenn.edu/license/ldc-non-members- agreem...](https://catalog.ldc.upenn.edu/license/ldc-non-members- agreement.pdf)

:(

<comment><AUTHOR> This is the non-commercial agreement --- I'm licensing the resources commercially.

</comment></comment></comment></comment></comment><comment><USER5> The idea of implementing cutting-edge NLP algorithms is fantastic and greatly needed. However I believe the multi-licensing will not be sustainable in the long term. It limits the ability (and interest) in others contributing into the library because you'll have to get a copyright transfer for any pull requests in order to merge into the commercial branch. It seems difficult to imagine one person being able to develop and maintain a library of this scope. This is particularly true when they are dependent on it for income rather than some tenured academic who can invest all of their time into the project without much risk or need for short-term gains.

<comment><AUTHOR> The idea of a tenured academic spending all day coding their non-research library is...let's just call it unrealistic. If you find an hour to write code, it will not be during business hours.

I'm curious why you think there's a market failure here. If a library like this can produce N salaries of value, then it should be able to earn N salaries of revenue. Maybe it takes >N salaries of work to produce it --- in which case, okay. That means this project is more costly than it is useful.

I definitely believe that market failures exist, and are quite common. But the service I'm trying to sell is trying to create economic value very directly. I'm not writing poetry here.

<comment><USER5> I'm not saying that tenured faculty working on these projects is the norm; that's not at all the case. It's just that the few instances were I know of someone successfully building and maintaining a large low-level library like this on their own come from dedicated academics who can de-facto make it the majority of their job. The best example I know of being Tim Davis' SuiteSparse C library for sparse matrix algebra.

Aside from that, the market failure I foresee for your project is the following: Say you keep building this out and write a fantastic, state of the art general purpose NLP python library. Now an a academic like myself comes along and forks the AGPL version of your repository, contributing additional functionality to the parts of the pipeline I am most familiar with. You cannot re-incorporate my work into your commercial license (unless I sign those rights away, which I won't), so now you're stuck trying to license an inferior version of my fork. Meanwhile, since mine truly is just open source, my version can freely accept both bug fixes and added functionality from one-off contributors who are using said fork. Better yet, unless you change your business model, I can continue to re-fold in any changes you make upstream, as well as include parts of other GPL libraries that build up in the intervening time.

Now, I'm not saying this is a perfect argument. Perhaps enough people are still interested in paying you for a a commercial version of the original software, but I think in the long run as the two version diverge that's unlikely to generate sufficient revenue for you.

<comment><AUTHOR> My thinking is that there will be commercial contexts where an AGPL license is a non-starter --- it's incompatible with the business model. If so, I think it makes sense for them to buy a commercial license from me, even if it lacks features in your fork. If they can't use AGPL code, your fork may as well not exist, except as this tantalizing something-I-can-never-have that makes the main library look worse.

I'd also note that you gain absolutely nothing from maintaining your separate fork, other than the principle of the thing. I'm compelled to distribute the code under the AGPL, just as you are. If your features are compelling you could instead negotiate with me for a cut of the license fee.

</comment></comment></comment></comment><comment><USER6> In fact I would wish for more thematic articles from people like OP, who know the topic. It is easy to find some introductory course on NLP, but introductory is introductory, and as OP states there's a visible gap between what Google does in 2015, and what some GPL/MIT/BSD-licensed project does in 2015 in that area. While there's relatively large amount of material on DSP or CV, all these linguistics-related areas seem to have quite a barrier to entry even for those willing to learn.

<comment><USER7> I have a feeling that's because a great deal of NLP use is either proprietary or academic. It's either buried away in a combination of academic papers and academic heads or hidden away in a corporate codebase the world doesn't have access to.

The best way as far as I'm aware of to get into NLP is to take a course at a university. My university (University of Melbourne) was lucky to have an undergraduate subject taught by one of the lead authors of NLTK (Stephen Bird) and that was a great help. You can even take the subject on its own without enrolling in a full course.

Plus there are books on it. One of the main ones I'm aware of (by Bird) is [http://www.chegg.com/textbooks/natural-language- processing-w...](http://www.chegg.com/textbooks/natural-language-processing- with-python-1st-edition-9780596516499-0596516495)

<comment><USER8> FYI, the book is available for free here under cc-by-nc-nd: [http://www.nltk.org/book/](http://www.nltk.org/book/)

A Python 3 edition will be released next year.

</comment></comment></comment><comment><USER9> So, how does this compare to Pattern ([http://www.clips.ua.ac.be/pages/pattern](http://www.clips.ua.ac.be/pages/pattern)) -- a (in my opinion) very high-quality, BSD-licensed data mining and NLP library coming from the academic world?

<comment><AUTHOR> From a quick speed test on my laptop, Pattern is 48x slower at POS tagging, and 8x slower at parsing. I last benchmarked its accuracy in 2013, where I found it got 93.5% on the WSJ corpus, vs 97% for the state-of-the-art taggers --- so twice as many errors. It was also more domain-dependent. Its parser doesn't produce exactly the same representations as mine, so I can't easily evaluate its accuracy. But, I doubt it's very high.

Pattern doesn't really use machine learning, just some pre-computed statistics from the annotated data, and some hand-crafted rules. Machine learning is good. It's really the right way to build these systems.

</comment></comment><comment><USER10> Only english, right ? Any plan for other languages ? (spanish, french, ...) ?

<comment><USER3> One of the great things of modern NLP is that a system can easily be trained for another language (assuming that you have training data, see my other comment). Since this uses statistical NLP techniques, it should be easy to add languages.

</comment></comment><comment><USER11> This looks fantastic, best of luck with it!

Sorry you're dealing with so many licensing questions here but a quick clarification:

> If their company is acquired, the license will be transferred to the company > acquiring them. However, to use spaCy in another product, they will have to > buy a second license.

Is the second license only required because they sold the company on (and the license along with it), or is a license per product generally required? In other words, if I buy a single license, can I make and sell two different products?

<comment><AUTHOR> Actually I appreciate the license questions, because it makes it easier to know how to re-write the docs to clarify.

One license allows you to develop one product. If you stop work on one thing you can re-use the license on something else, though --- it would be silly to ask at what point a change of focus becomes a different product.

This seemed the sanest way to do it. I think per-site, per-user etc licenses are really stupid. The license then impinges on your technical decisions.

</comment></comment><comment><USER12> This is great thanks! I had a few weeks ago the problem of not being able to get a passive verb parser in CoreNLP fast enough to work. Does SpaCy support reduced passives?

<comment><AUTHOR> You can write rules to find them in the dependency parse, although the parse tree won't necessarily be correct.

I've thought a lot about passive reduced relative clauses over the years --- they were a big part of my PhD thesis. So I happen to know that the first one in the WSJ data is wsj_0003.1. This isn't in the training or development data, but it's in the same data set --- so, this is a fair but optimistic spot- check. The sentence is:

> A form of asbestos once used to make Kent cigarette filters has caused a > high percentage of cancer deaths among a group of workers exposed to it more > than 30 years ago, researchers reported.

There are two reduced passives here --- "used" and "exposed", and a potential (but unlikely) false positive in "reported".

spaCy correctly attached "exposed" to "workers", but didn't attach "used" correctly --- it attached it to "reported" instead of "form". This doesn't really make syntactic sense, but that's what it did --- the system's entirely statistical; there's no grammar licensing certain attachments.

To see the parse, run:

       from spacy.en import English
       nlp = English()
       tokens = nlp(u'A form of asbestos once used to make Kent cigarette filters has caused a high percentage of cancer deaths among a group of workers exposed to it more than 30 years ago, researchers reported.')
        for word in tokens:
            print word.orth_, word.tag_, word.dep_, word.head.orth_

<comment><USER12> Thanks! spaCy seems to be really easy to use, but CoreNLP still yields better results, cf. [http://nlp.stanford.edu:8080/corenlp/process](http://nlp.stanford.edu:8080/corenlp/process)

</comment></comment></comment><comment><USER13> Glad to see the progress and will pass the word. Maybe you want to comment regarding semantic parsing, if your parser can help it in a pipeline, if one can factor it through your parser, or maybe as in task 8 of semEval '14 [1], you need to rethink your structure (dep. tree vs. dependency graph).

[1] [http://alt.qcri.org/semeval2014/task8](http://alt.qcri.org/semeval2014/task8) (with 2015 rerun)

</comment><comment><USER14> This is a really neat project OP, and I hope you can make enough money to sustain development. I really, really wish academia did a better job of sponsoring people to maintain high quality software libraries, so you didn't have to 'strike out' on your own though.

<comment><USER15> I am willing to donate and I guess many people will be. OP should add Flattr or Bitcoin wallet address. At least that should help this project.

edit: noticed OP offers trial license at $1: [http://honnibal.github.io/spaCy/license.html](http://honnibal.github.io/spaCy/license.html)

<comment><AUTHOR> Better donation targets can be found at [http://www.givewell.org](http://www.givewell.org) :)

I appreciate the thought, but if this isn't useful to support itself, then obviously I was wrong, and I should find a more valuable project. But I don't think that's the case --- I think this will help a lot of people build useful products, so the commercial license should fund its development quite adequately.

<comment><USER16> Then don't consider it a donation, but as a separate pricing tier. Currently, you are charging $5000 to those who don't want AGPL, and $0 to those who are fine with AGPL. You can charge, say, $100 to those who are fine with AGPL but want to pay.

If you want to increase sale, you could include donors' names in the documentation in return to $100, for example.

</comment></comment></comment></comment><comment><USER17> How about semantic parsing? It's a much less developed area than syntactic parsing and ultimately that's where the real need is.

</comment><comment><USER18> Great work! Do you consider PyPy support also?

<comment><AUTHOR> I've considered it, yes --- but it's hard. Currently I segfault under PyPy. I've got the learner and hash-table code working, but I need to debug the NLP. I suspect it's the way I'm interning my strings.

</comment></comment><comment><USER19> I didn't know what NLP is, maybe you should explain it (or simply write full words in stead of the abbreviation) once in the beginning of your website.

<comment><USER20> Natural Language Processing.

<comment> semi-extrinsic I clicked this post because I assumed Non-Linear Programming. Was disappointed.

</comment></comment></comment><comment><USER21> For anyone who has used this, how does this compare to TextBlob or Gensim?

<comment><AUTHOR> TextBlob is a wrapper around NLTK and Pattern. Those libraries don't use very sophisticated statistics, so in 2013 I wrote a small Python POS tagger for TextBlob, which performs much better: [https://honnibal.wordpress.com/2013/09/11/a-good-part-of- spe...](https://honnibal.wordpress.com/2013/09/11/a-good-part-of-speechpos- tagger-in-about-200-lines-of-python/)

spaCy's POS tagger works like the one in the blog post, but it's implemented in Cython, and has some extra features.

Pattern has some nice morphological processing features. I don't do morphological generation, for instance, and I haven't hooked up the morphological analysis to the Python API yet.

TextBlob also gives you a few extra bits and pieces, like a wrapper of the Google translate API.

I'm really targeting the situation where you want to build a product around some NLP. In this use-case, you need the NLP to be fast, you need it to be as accurate as anyone knows how to make such a system, and you need it to be entirely in your control.

As far as GenSim goes: it's good. It does different things from spaCy, though --- topic modelling, etc. It would be nice to interoperate between the two libraries. I have no plans to implement topic models.

<comment><USER22> ...and I have no plans to add NLP tools in gensim. The connection between gensim and tokenizing/tagging/parsing libs is intentionally loose and flexible.

I'm a fan of "do one thing, do it well".

Having said that, it would be great to facilitate "spaCy + gensim" pipelines for users.

For example, the "word vector representations" can be trained easily with gensim, on arbitrary user-specified corpora, whereas spaCy loads something pre-trained, in a specific format. Maybe room for some interoperability there?

</comment></comment></comment><comment><USER23> > But the academic code is always GPL, undocumented, unuseable, or all three.

I'm not sure why this author is further propagating FUD that suggests GPL code is unsuitable for commercial use. Just because companies are irrationally afraid of the GPL doesn't make it true.

<comment><AUTHOR> This was my understanding --- actually I designed the licensing structure of this project around the assumption that companies would not want to use GPL licensed code commercially. I offer an AGPL license, and offer a commercial license for a fixed fee.

My understanding is that if you link to the library, your code must also be GPL, which means that anyone linking to your code must be GPL, etc.

This is a problem if you're trying to sell your code. Probably you don't want to make it GPL, and you probably don't want to force your customers to make _their_ code GPL.

<comment><USER23> > This is a problem if you're trying to sell your code.

I think relatively few tech companies are trying to sell their code directly these days. Most are hoping to build a product and/or service and then charge customers for access to it.

<comment><AUTHOR> An API or a web service counts as distribution under the AGPL. If you run such a service, and you use spaCy --- either by linking the binary, or using it as a network service --- you'll have to AGPL your code. Which introduces equivalent restrictions on anyone who uses your service.</comment></comment></comment></comment>


Create Your Own Programming Language (Book) - <AUTHOR> http://createyourproglang.com/ <comment><USER2> This is a scam. Take a look at the toc to see how many pages are devoted to the interpreter, the VM and so on. It is impossible to learn how to write a complete interpreter or compiler, (leave alone VMs etc) in such a small "book".

The blurb says

"Become the next Guido Van Rossum, Matz, Larry Wall or Rasmus Lerdorf by creating your own revolutionary programming language in a few days"

yeah right! :-D.

If anyone is really interested in learning to build an interpreter or compiler, here is a book list to work through in order.

(1) SICP (do _all_ the exercises in Chapter 4 and Chapter 5). There is an incredible amount of learning there. Once you've done this, you can write a basic interpreter/compiler for languages with s-expression _syntax_. [The semantics can be anything you imagine]

(2) Essentials of Programming Languages. This will teach you how many language features work (lazy evaluation, object systems, static type systems ..)

(3) Lisp in Small Pieces - how to implement byte code compilers, macro systems, compilation to C, lots of good stuff here.

(4) A book on lexing and parsing so you can give your language any syntax you want. I prefer Modern Compiler Design by Gries. If you understand the first three chapters you can write your own lex/yacc equivalents. (the book has a lot more to it than these chapters, but it is the best I've seen on lexing/parsing).

(5) Now take a look at the source of your favorite language. ((Lua and the lcc compiler (it even has a book explaining its design) in particular, are very educational).

(6) If you are REALLY serious about optimization, Steve Muchnick's book, Advanced Compiler Design and Implementation.

I have all these books and have derived an incredible amount of learning and joy from them.

yes it is a bit of work, but it is fascinating journey. Enjoy.

EDIT: If you want to go deep into type systems (say you want to grok Haskell's type system from first principles, (or add OCAML like modules to your language, say) Benjamin Pierce's Types and Programming Languages - You are in good shape to work through this after you've finished EOPL

<comment><USER3> Your advice is good, but you're being a snob. The complexity of a simple compiler is not that high. My language (<http://plausible.org/nasal>) has a core of about 3-4000 lines of C, well under the size of the Unix kernel explained (very well) by Lions in his classic book.

Sure, language design is a deep field, with lots of subtlety and complexity. And people spend years studying it. That doesn't mean that every language requires a huge tome of background to implement.

<comment><USER2> "Your advice is good, but you're being a snob. The complexity of a simple compiler is not that high. "

Sure reccomending someone work through SICP chapters 4 and 5 (enough to write an ultra simple compiler/interpreter) is "snobbery". ;-)

So be it. :-P

That doesn't mean _this_ book (referred to in the original posting) isn't a scam. It is.

Any reccomendation on the internet (including mine) is worth only the electrons it consumes. Caveat Emptor!

I've worked through the books _I_ reccomended (and was careful not to reccomend great books like CTM which I have no experience of).

This is the best way _I_ know how to get this knowledge. I am not claiming it is the most efficient method. feel free to provide better paths.

If that strikes you as "snobbery" , bleh to you ;-)

<comment><USER3> The part that strikes me as snobbery is your statement that you _cannot_ learn language design from a small book. Based on my actual experience in the same regime, some of which involved reading books but far more of which involved thinking through code, I think you're just wrong.

<comment><USER2> "The part that strikes me as snobbery is your statement that you cannot learn language design from a small book. "

I stand by that. _Design_ in _any_ endeavor can't be learned from books, small or big. Before you can "design" you need the nuts and bolts skill to implement your designs.

The books I reccomended, if sincerely worked through, give you the nuts and bolts knowledge to implement the designs you _do conceive_. Reading through the source of languages you admire, will teach you a lot (I reccomended that too).

Since I _never said_ you could learn language _design_ (vs learning how to _build_ interpreters and compilers - I started my reccomendation list with "If anyone is really interested in _learning to build_ an interpreter or compiler, ..." -) by _working though_ books, I fail to see what you are reacting against?

I maintain that a 44 page book (particularly _this_ one which is an outright scam) doesn't have the space to cover even the basic _implementation techniques_ , leave alone "design".

Please provide counter examples of such "small books" that teach "language design" if you disagree. One counter example is worth a lot of internet debate!

The shortest introduction _I_ know capable of turning you into an interprter/compiler _writer_ is Chapters 4 and 5 of SICP (and there is a lot of stuff in the previous 3 chapters that lead to these chapters).

</comment></comment></comment></comment></comment><comment><USER4> Hey, I'm the author of the book. I agree the marketing site is not perfect, I'm still looking at ways to improve it, sorry if if it sounds like a scam.

Any tips on improving the copywriting or anything are greatly appreciated!

<comment><USER5> The copywriting is a little over the top, but my suggestion is for the book itself.

I'd like to see more details. Your sample chapter on Lexers, for example, would be much stronger if you went into more details (maybe 3-4 pages) on how a scanner identifies a token, how it knows when it has reached the end of a word, how it recognizes and handles whitespace, why it's important to keep track of indentation and newlines, what is the difference between keywords and other identifiers, etc. Maybe also give a written explanation describing what each section of your lexer for Awesome is doing.

Please consider this as constructive criticism: I think the book is a good idea, but I also think it needs more meat. I don't know how easy it is to revise it at this time, but I think you'd have better luck if you added more details.

<comment><USER2> "The copywriting is a little over the top,"

a _little_?

"Become the next Guido Van Rossum, Matz, Larry Wall or Rasmus Lerdorf by creating your own revolutionary programming language in a few days"

Heh heh!

<comment><USER6> Lose 120 pounds in six minutes!

<comment><USER7> ...even if you only weight 80 pounds.

<comment><USER8> I've always wanted to weight -40 pounds; where do I sign up?

</comment></comment></comment></comment></comment></comment><comment><USER8> $39.99 for a 44 paged PDF? On Amazon.com I can buy a hardcopy version of _Compilers: Principles, Techniques, and Tools (2nd Edition)_ for $86.29 and its got (according to amazon) 1000 pages.

<comment><USER9> I have a few reams of paper (about 2000 sheets) you can buy for $40 if you want. That's even better value than the book you suggest.

<comment><USER10> Depends on your definition of value. Aho Sethi Ullman will teach you rather more about compilation of programming languages than 2000 sheets of paper ;-)

</comment></comment></comment><comment><USER11> I feel the copywriting of the site is a little over the top. The subject matter is interesting enough that most geeks should want to have a look.

Is this a sign of the times? (See also: <http://perl6.org>). Sure there's nothing wrong with dressing tech up and making it look fun, but at some point it becomes a turn-off, which is a shame. 2600 et al did not need fancy fonts and bright colors to appeal to hackers.

tl;dr - get off my lawn!

</comment><comment><USER12> Seems like the "book" (44 pages in PDF) is a walkthrough to using compiler building tools and the like. Not a bad idea.

A lot of what surrounds it sounds way too much like a mix of spam and infomercial for my taste. Then again, I am most likely not the intended audience. I must say it makes me smile seeing this marketed as a "cool thing" tough.

</comment><comment><USER13> Hmm. Are you sure this is not some tongue-in-cheek prank?

<comment><USER14> Yeah, it kind of reads like ParrotSecrets.com for hackers.

</comment></comment><comment><USER15> I agree that learning how to create a programming language is a valuable lesson in and of itself -- I may even buy the book to see what it's like -- but claiming that you can create a "revolutionary" programming language within a few days conveys the wrong message.

Creating programming languages is not difficult but designing good programming languages is.

<comment><USER16> Creating a new programming language is trivial. I just invented one called "awesomepython". It's just like python, except that the keyword "and" is replaced by "awesomeand", "if" is replaced with "awesomeif", and so forth. The compiler is one line of awk.

Creating a language that's actually good for something is a very different sort of challenge...

<comment><USER2> "Creating a new programming language is trivial. I just invented one called "awesomepython". It's just like python, except that the keyword "and" is replaced by "awesomeand", "if" is replaced with "awesomeif", and so forth. The compiler is one line of awk."

Coffee all over keyboard! Damn you!! :-D

Hilarious! Upvoted! Now to clean that spilt coffee!

</comment></comment></comment><comment><USER17> Became the next Guido Van Russom, Matz... with just reading a book? Seriously?

Edit: it looks like a good website but I'm still skeptical.

<comment><USER18> The tone seems tongue-in-cheek to me. The page is a humorous parody of get rich quick sites. The product itself is real and, if it gives somebody a quick way to get up and running exploring the basics of language, it's likely worth the $40.

</comment></comment><comment><USER19> I ctrl+w'd at "your own freaking awesome programming language."

</comment><comment><USER20> The Dragon Book!

</comment><comment><USER21> I think its great that we've reached a point in technology that we have people (rather than teams or large companies) creating languages that people can use.

However, if you are looking at books to learn HOW to create a new language you likely haven't answered a more important question: WHY.

<comment><USER22> What do you mean, why? How many reasons do you need to write code that does something cool?

<comment><USER21> Writing something cool is one thing. writing a language is another. What I'm saying is if you are using an ebook to create your language (on the jvm no less) I expect there are several other languages that people have spent YEARS on that I bet would solve most of the issues you could ever have if you learned them a bit better

* The JVM is awesome. But there are lots of "hosted languages" already on that platform that likely will suit most peoples' needs.

<comment><USER23> How writing a compiler not cool? Just because someone uses a book and targets the JVM, which is a great target platform for a lot several reasons, doesn't mean they aren't doing it just because it's fun.

<comment><USER8> But why pay $40 for _fun_ when you can do it with free information on the net? If you're doing it for fun, then that information is more than adequate. If, however, you're doing it because you want a real language that people should/would use, then a 44 page PDF is not nearly enough, regardless of how good and densely packed it is. For a _real_ (as opposed to a _toy_ ) language, you require theory on language design, on compilers, on programming paradigms, on syntax, on computation models and so much more.

</comment></comment></comment></comment></comment><comment><USER24> Why not write a book that lets you create your own programming languge in _javascript_ ??

That way you at least get something _useful_ out of the exercise.

(Ducks)</comment>


Parallax Propeller 1 P8X32A Released as Open Source Design - <AUTHOR> http://www.parallax.com/microcontrollers/propeller-1-open-source <comment><USER2> I have loved working with this chip because the paralelism is so simple. Each processor works at a consistent speed no matter what. In low level robotics, timings is crucial. You can have one core positioning a bunch of servos, another core sampling ultrasound, another doing serial connections etc. For a cheap, simple chip it worked very well for a lot of robots I have built. I have used an Ardiuno Mega on a robot and while Arduinos have a lot going for them, it is difficult to control many things at the same time.

The problrm is that this chip hasn't really improved in seven years. Now the alternative is things like a Raspberry PI or other boards with cheap ARM processors which are much more powerful. A Prop is still great for I/O.

<comment><USER3> Agreed. Parallax simply left it in suspended animation. Its a nice chip that would have had a bigger impact had they put the same effort into it as they put into the Basic Stamp. You can still use a Basic Stamp and do lots of fun stuff. Even though its ancient and outdated. But the learning materials and amount of knowledge shared by parallax and others is huge. Had they supported the properller in the same way I think that they could have Arduino'd (sorry for this) it. Creating a community of fans around such a great platform would have made robotics much more fun.

<comment><USER4> I once used the Basic Stamp in a product prototype - a fairly sophisticated piece of instrumentation. I initially chose the Basic Stamp (iirc it had a Ubicom chip) for its totally rock solid RS-232. Eventually I realized that the Basic Stamp was enabling me to write firmware for a reasonably complex "real time" control system. Over thousands of cycles of tests on a limited production run I never had a single glitch or problem with the firmware.

<comment><USER3> The Basic Stamp is still a rock solid platform. I know of places using it in production systems without any issues. The problem is how its been replaced in the mind of the hobbyist (at least the younger ones). Before the arduino, you basically went with a PIC16F84 or a Basic Stamp. The Atmels were available, but IMO, they weren't as popular.

Plus BASIC feels "old" these days. People get introduced to programming trough the web (which uses C-style syntax languages like Javascript), scripting with Pyton/Ruby, or mobile development which follows the same pattern. Even though BASIC is a fine language (it was my first) people can't relate to it anymore.

</comment></comment></comment></comment><comment><USER5> I wonder if this means Propeller 2 is about to drop. Seems like it's on schedule for what they said back in February: [http://www.parallax.com/news/2014-02-24/propeller-2-schedule...](http://www.parallax.com/news/2014-02-24/propeller-2-schedule- update-february-2014-read-schedule-completion-propeller-2)), but they've slipped several times on their schedule from Prop2 in the past.

Anyway, the Propeller is a really cool chip. For the same price as an Arduino you get an 8-core, 32-bit, 80Mhz per-core processor and programmer board. Now, you often have to waste one of them for "process" scheduling (which you write yourself) and one for IO mapping (which you also write yourself), but it's really fun if you're more into programming than the average bear.

It supports mouse and keyboard from the start and it has an add on to very easily setup RCA video and audio to a TV. I've even seen speech synthesis done on it. There is a lot of really good code available for basically putting together a really simple, almost Atari VCS-like computer, except capable of doing rudimentary 3D graphics.

And the Propeller 2 is going to be 10 times faster. I don't know about the rest of you, but I'm freaking excited.

</comment><comment><AUTHOR> Some other interesting, related news to this:

[http://hackaday.com/2014/10/30/improving-the-parallax- propel...](http://hackaday.com/2014/10/30/improving-the-parallax-propeller-in- an-fpga/)

</comment><comment><USER6> Nice move by the Parallax folks. I expect this will actually get a lot more participation with it. One of the challenges that Parallax has had in the past is that nobody sees them as a 'chip' company so they never get any respect when you suggest designing in their CPU design.

That said, it is a wonderfully quirky design. With its multiple execution units and odd syntax. I built a Lissajous generator out of one and it was quite fun. Highly recommend it to anyone interested in CPU architectures.</comment>


Show HN: Make money interviewing candidates - <AUTHOR> http://thegatekeepers.co/ <comment><USER2> This looks a bit different from karat.io which specializes in engineering candidate screens. Aside from the different roles what is different about this from that service?

Also, "gatekeepers" may have a negative connotation for some. It can imply status conferred by tenure or social acumen, not merit, for example. Think "ball of mud architecture", where the ones who created the ball are gatekeepers usually in the negative sense that they don't want to see change because it might disrupt their position.</comment>


Show HN: RealContacts, an app for boosting your real-life reputation - <AUTHOR> http://www.realcontacts.us/product?utm_source=hn&utm_medium=sn&utm_campaign=l1_1 <comment><USER2> I read through the page but could not figure out what it does. Mind telling us?</comment>


BASIC Programming Language in Minecraft - <AUTHOR> http://sethbling.com/Scripting <comment><USER2> From a calculator to a BASIC interpreter. Minecraft's come a long way.

Oh, and then there's that mod with the Lua-based Unix machines.</comment>


Vegeta: HTTP load testing tool written in Go - <AUTHOR> https://github.com/tsenart/vegeta

<comment><USER2> Good start!

Some useful feature additions would be:

(1) Tunable number of requests per connection: it's often useful to be able to see how webserver performance differs when multiple requests are made per connection (Connection: Keep-Alive) vs. a single request per connection (Connection: Close).

(2) Tunable concurrency: webservers have to serve requests from different clients concurrently. It's much more illuminating to see how a webserver performs when multiple requests are coming in simultaneously than sequentially. Simply divide the total request rate by the number of threads/goroutines created, and assign each the fractional request rate.

(3) The ability to specify custom request headers. Enough said.

<comment><AUTHOR> Hey there,

Thanks for the thoughts. Let me answer to those.

1) That's something I could do but it wasn't really the goal originally as what I wanted to test was not so much the latencies of connection establishment (TCP Handshaking) but rather an HTTP service itself. I will give it some thought though.

2) I explicitly wanted to abstract the concurrency away from the user of the tool. The API is simplified purposefully. However, I am not sure why you think the requests are sequential. Have a look at this line of code [https://github.com/tsenart/vegeta/blob/master/lib/attack.go#...](https://github.com/tsenart/vegeta/blob/master/lib/attack.go#L44)

3) Agreed. I have to think the best way to fit this into the targets file format.

Cheers

<comment><USER2> > That's something I could do but it wasn't really the goal originally as what > I wanted to test was not so much the latencies of connection establishment > (TCP Handshaking) but rather an HTTP service itself. I will give it some > thought though.

It's not the TCP connection latency you're testing; that is effectively a constant. What you're testing here is the performance of new-connection initialization by a web server after the accept() function has returned a new file descriptor. The code path in a webserver relating to a newly-accepted socket will be different from the path for a reused one.

> I explicitly wanted to abstract the concurrency away from the user of the > tool. The API is simplified purposefully.

I think you'll sacrifice some utility by doing that. An event-driven webserver exhibits certain properties at various concurrency levels, while a forking one exhibits others. That's why good benchmarks have concurrency levels as variables in them.

</comment></comment></comment><comment><USER3> What happens to the plot when it's way over 9000 ?

<comment><USER4> Came to the comment thread to see if anyone made that joke. Was not disappointed.

</comment></comment><comment><USER5> This is seriously an awesome name for a load tester. The concept totally fits that "desperation" attack Vegeta would use on any season boss before he got his ass kicked (the screaming and throwing a million fireballs thing)

Nice project, btw. Do you think it's worth building cluster mode into the tool itself when there are existing methods of sync'ing commands across boxes?

<comment><AUTHOR> Hey there! A little bit of trivia about the name: I have been working at an internal project at SoundCloud called goku (not the web framework). It came the time where I needed to load test it and didn't find the available solutions to my taste. Hence, vegeta was born :)

Regarding the cluster mode, it's trivial to sync commands across machines but it's not trivial to sync the state that generates the reports. That's what cluster mode would do. Some sort of master-slave architecture scatter execution and gather and compute the aggregated reports.

<comment><USER6> ... and a bit more trivia about the name ... for the folks from the ex- Yugoslavia, when you say Vegeta it means this: [http://en.wikipedia.org/wiki/Vegeta_(food)](http://en.wikipedia.org/wiki/Vegeta_\(food\))

</comment></comment></comment><comment><USER7> I like the style of it but I'm afraid that using a copyrighted image right in the README invites a completely needless DMCA takedown.

<comment><AUTHOR> Thanks for the warning. That's something I didn't consider at first. I have changed it to a Creative Commons licensed image.

</comment></comment><comment><USER8> If you want something more configurable / heavyweight checkout Tsung: [http://tsung.erlang-projects.org/](http://tsung.erlang-projects.org/)

Perhaps could serve as inspiration for future work :)

</comment><comment><USER9> Cool stuff, I saw your submission on the mailing list yesterday and there wasn't yet a plotter. You got around with it pretty quickly! This speaks to the quality of Plotinum!

<comment><AUTHOR> It was pretty straightforward to add the plotter. +1 for Plotinum :)

</comment></comment><comment><USER10> Useful with [https://github.com/QLeelulu/goku](https://github.com/QLeelulu/goku)

<comment><USER11> So many frameworks popping left and right for Go. Any thoughts on how this compares with something like Revel?

<comment><USER10> Sorry but I was only quoting this one because of the name (vegeta, goku, same cartoon). I actually only knew Revel prior this post, and didn't know about golang being filled with web frameworks.

</comment></comment></comment><comment><USER12> This looks awesome. Personally, I would have gone with a Super Saiyan 4 Vegeta for the logo though.

<comment><USER13> I am starring your project as I think it could be very useful for me and many others. Btw I think you should show Vegeta doing the Big Bang Attack as the project image - it would look cooler:-)

<comment><AUTHOR> I am glad it is of some use :)

</comment></comment></comment><comment><USER14> I approve

<comment><USER15> Is it just me, or does anyone else want to see missile/beam/energy bold spam in a situation where it's tactically relevant and very effective? (Instead of just a chance to let the hero shrug it off and look tough.)

EDIT: Outside of The Last Starfighter.</comment></comment>


It's time for seat-based software licensing to end - <AUTHOR> http://www.cmswatch.com/Trends/1550-End-Software-Seat-Licensing?source=twitter

<comment><USER2> Seat-based licensing allows enterprise software companies to value-price; they can sell to a 50 person law firm for a low amount, without giving away the store to a 5000 person enterprise. The alternatives are to forgo the smaller companies and market exclusively to BigCo's, or to leave huge amounts of money on the table.

This person's problem isn't with seat-based licensing. It's with license enforcement. No license enforcement scheme is good. They all suck, no matter how simple the pricing model.

A reasonable response to this complaint is, maintain seat-based pricing, but don't do "hard" enforcement; just alert the product admin that they need to update their licensing, and make it extremely easy for them to do that. Have a maintenance and support process that checkpoints licensing compliance, so that customers can run the product indefinitely without complying, but will be forced to confront licensing when they call for support or try to upgrade the software.</comment>


Fear of Palindromes... - <AUTHOR> https://en.wiktionary.org/wiki/aibohphobia

<comment><USER2> The condition was first described by _Dr. Awkward_.</comment>


Show HN: UniFlow – methodology and iOS framework for writing perfect apps - <AUTHOR> https://xcessentials.github.io/UniFlow <comment><AUTHOR> Every app has an architecture, good or bad. Since there is no universal set of rules (methodology) about how to build an app, every developer/team has to come up with their own solution every time an app is being built. There are quite few design patterns that are trying to describe how to organize overall application structure on a high level, but one of the most promising is so- called "unidirectional data flow" pattern introduced by Facebook in their Flux framework. UniFlow is an attempt to build a universal foundation for any iOS app.</comment>


Apple rolls out "Chomp" update outside of U.S. - <AUTHOR> http://blog.appcod.es/?p=70

<comment><AUTHOR> It may have actually happened a week or two ago, but it seems nobody covered the subject yet.</comment>


Google vs Apple: Google Doesn't Need To Win - <AUTHOR> http://radar.oreilly.com/2010/05/google-vs-apple-round-1.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+oreilly%2Fradar%2Fatom+%28O%27Reilly+Radar%29&utm_content=Google+Reader <comment><USER2> All this nonsense about whether google or apple will win is completely besides the point anyway. Both companies will end up with some x% of the market, whoever has the largest amount will - maybe - make a bit more money, or maybe not (apple seems to be doing just fine making more money from less sales).

"Winning" assumes a loser, and both Google and Apple are going to be around for a long long time.

The real winner in this battle is the consumer, both companies will do their best to get as large a share of the market as they can get, and they'll do so by coming up with ways of doing stuff cheaper, better, more polished or more powerful than they ever would do if they were not in a competitive situation.

Let's hope neither will win. And that they'll keep trying.

<comment><USER3> This *could be true, but it could well not be true.

In any system with a powerful network effect, such as: a platform with more users will get more apps, and the platform with more apps will get more users, there definitely could be a winner or loser!

If one platform has too much momentum, displacing it might become next to impossible. Think x86, or the telephone platform by American Telephone & Telegraph.

<comment><USER2> No single vendor will ever be able to displace another completely in this market, I really don't see how.

Right now there are already at least 4 different smart phone lineages and you can expect that number to increase in the future. Each of those will find their following, some will be more successful than others, but nobody will be able to claim the cake for themselves.

We're not talking about network effects to the exclusion of others, after all if there is a 'niche' then someone will fill it.

Imagine today there would be nobody developing for the android, then that by itself would be an enormous incentive to develop for it because you'd be king of the hill instantly. Users don't need 100,000 apps, they need at best a few that work, so you'd only need to clone the 'top sellers' in order to have significant presence, and that is not at all impossible.

Smartphones are like computer systems, just like apple managed to stay alive in spite of limited marketshare and linux has a dedicated following and both of them competed with microsoft (which used every dirty trick in the book) they _still_ persisted.

And yesterdays 'loser' seems to be todays winner, elsewhere someone is asking where Nokia is, you could ask the same thing about Sony-Ericsson and Microsoft.

They'll all be back, they'll learn from their mistakes and will attempt to get another piece of the pie.

<comment><USER4> But that's exactly the situation we had in the PC world in the mid-80s, when there were competing GUI environments that ran on top of DOS (Windows, GEM, Visi On). In theory, they could've continued coexisting indefinitely; in reality, network effects meant that one won out and the others died off.

Now, granted, the big difference there was that MS had an advantage over its competitors, since they made the platform everybody was building on. The flip side, though, is that it was possible to install multiple windowing systems on the same PC, so that users didn't have to pick one and stick with it. With cellphones, you can't do that. The closest you come is being able to move your SIM from one phone to another; but you leave all your data behind.

<comment><USER2> Funny you should remember GEM, I actually quite liked it.

Digital Research made some nice things.

I agree, there _can_ be such an effect, but since every phone carries windowing system and OS on board from a single vendor (for the most part) the competing standards are not running on the same hardware. In other words, you are not going to take your iphone and put android on it, unless you are exceedingly technical. (in the end it is just software, so sure, it can be done).

Then there is the fact that there are already open software stacks for phones and I expect that trend to continue.

The open source movement missed out on the desktop wars, simply because they got off the ground much later, but I expect the cell phones arena to be different in that respect.

Android is a really big step in the opening up of the cell phone world.

<comment><USER5> _The open source movement missed out on the desktop wars, simply because they got off the ground much later_

Very well could be true. But is by no means proven.

</comment></comment></comment></comment></comment></comment><comment><USER6> I agree with Loukides' premise--I commented yesterday that Fox and HBO have different business models, and there's clearly room for both.

What Mike Loukides overlooks while discovering that HTML5 is important is that initially "developers" complained when Apple, and Jobs, said "to put your apps on the iPhone, use HTML5". The iPhone was released without an Objective C SDK. Developers didn't want to make HTML5 apps, begged for the Objective C SDK, and we got what we asked for.

Apple doesn't need to be persuaded about HTML5, developers do. A majority of the apps on my iPhone would work just fine as HTML5 apps.

HTML5 apps on the iPhone are true citizens. They are installable from the web (no app store required). They are stored on the iPhone and run offline. They use persistent storage. You can even program games:

> "And there's no easier way to get an app than by installing it right from > its website - that's right, easier than the App Store. One tap and you're > set. Because it's a web app, see. Not one of those where you need to be > online either - once you add Pie Guy to your home screen, it'll run even > when you're not connected to the Internet. And of course, your game will be > saved to a local database. Read on."

<http://mrgan.tumblr.com/post/257187093/pie-guy>

Write once run anywhere HTML5 is nearly within reach largely thanks to the ubiquity of WebKit. Apple made WebKit truly "open", its openness driving adoption as a core technology across multiple devices. Adobe's Flash runtime being bundled in Chrome isn't the same sort of open, so Adobe has some work to do to put Flash everywhere.

However, I'd prefer Adobe sort out how to let their same developer tools generate HTML5 apps built for each phone. That's the right kind of open: Adobe's tools would generate the same readable text files a human can with notepad, but the tools become worth buying as a productivity booster, not as the way to publish opaque files to a proprietary plugin.

<comment><USER7> > Apple doesn't need to be persuaded about HTML5, developers do.

This is only really true if you're not interested in the 1-3g users. The reason developers didn't take to the HTML5 solution was that it was too slow for anything non-trivial.. I don't personally even care for it when making trivial applications, due to the half second delay before interactions make it to your javascript events in WebKit on my 3g phone. The linked game (which isn't particularly complicated) is completely unplayable on it.

But sure, on the current (3g s) and future gens, it does seem like a reasonable alternative.

<comment><USER5> Other problem is you don't have access to a listing on the App Store and the single-tap buying process that goes with it.

<comment><USER6> Ok, but if you want to sell in Apple's store, well, it's their store. Drafting behind a brand comes with some caveats that are up to the guy driving.

</comment></comment></comment></comment><comment><USER8> Simple calculus shows that under certain models of consumer markets there is space for two big players. Optimal pricing of commodity goods shows that the share of the market is provably strictly less than 50% at the optimum price.

OK, now Google and Apple aren't producing commodity goods, and the model is extremely simplistic, but nonetheless there is probably space for two big players.

<http://news.ycombinator.com/item?id=488663>

<comment><USER9> Interesting link, but it seems (to me) to make a mathematical mistake in that it assumes the drop-off factor (a) to be greater than 1 (in that it assumes 2a >= 2), when at the top it asserts only that a > 0.

<comment><USER8> There was a mistake, but it wasn't the one you think. The derivative was incorrectly stated as N-2ap instead of N-2ap+ac.

I've corrected it now. I'd appreciate another detailed check of the revised calculations.

</comment></comment></comment><comment><USER10> There is no insight in this article. The author makes some asymmetric assertions. Google doesn't have to blahblah; Apple must blahblah; Apple can't take Google on as long as they ignore Flash.</comment>


College in two years: now what? - <AUTHOR> http://delw.in/college-in-two-years-now-what/

<comment><USER2> Semi-full disclosure: I was a UT Austin student, just graduated with a CS degree, Hook 'em

TLDR @ bottom

So you seem to have a really solid plan for your life, but in my humble opinion, college isn't even about learning, for the most part. It's really about social interaction. You will pretty much never get the same chance at unbridled continuous social interaction as college provides. Putting a bunch of post-pubescent "young-adults" in the same central location for 4 or so years allows for a lot of crazy things, but more importantly, a lot of bonds, experiences, etc.

That said, you will also never get the same opportunities in college as you're going to get abroad. You'll meet really awesome, interesting people (hopefully), and have a ton of great times. However, the context in which you meet those people and explore those countries is completely different.

Let me illustrate (and hopefully make my point more believable) with an example. I have studied abroad in Japan -- it is by far the easiest, most carefree way to get there, and stay there (if only for a while). I speak pretty good japanese, but what stuck with me most is that the country can be VERY lonely if you don't have some way to make friends (this applies to any country), and the social skills you learn in college go a LONG way in making that easier, and if you had gone in college, that same young-people-in-an- enclosed-area dynamic would have done wonders in gathering people around you that were similar, and you could easily befriend. When I studied abroad, I met people from ALL over (london,ireland,germany,vietnam,china,korea,americans,spanish), and many of them I actually still like and maintain contact with. My fear is that you won't have such a good chance of that experience by getting out of college so early /quickly.

At this point, there's not really much you can do about that, though I would suggest that somehow you utilize the school to travel. It will be much cheaper, and much more manageable, you'll have more resources, etc.

Also, on a less touchy-feely note, you should have stuck it out for that CS degree. UT Austin is a pretty highly ranked CS school, and the curriculum really isn't even impossible. It's super doable, and if you can stick out (and learn) the theory, the degree is worth alot (trust me, I'm very very comfortably employed now, and it wasn't very hard).

Also, to accomplish your goal, there are a lot of people who do the whole work-x-months, travel-x-months. If you are up front with this, you might be able to find some companies who really need help, and they will hire you. Of course, this would be easier with a CS degree.

In general -- you know what you want, which is good (I've never not known what I wanted either, all I ever wanted was to program computers) -- but be careful not to miss out on the stuff that you didn't know you wanted. My parents are the ones that pushed me to go abroad (literally, they wanted me to just "go somewhere", while I was in school because they know the school would help subsidize and stabilize everything), and they were so right in their decision, as parents often are. On paper, the decision looks like a bad one: delay my graduation, stop me from getting on with my life for a whole year, disable me from doing any CS (there weren't any CS courses I could take while abroad). But, the experience was one I would redo every single time.

tl;dr College isn't about learning as much as it was about social interaction. The CS degree would have been a good idea. Using the university to travel would have also been a good idea. Going forward, finding a company that embraces your desire to travel (or finding a company in the country you want to travel to, and getting hired there) might not be as hard as you think -- but you will really have to show them your skill, since you don't have a CS degree.

<comment><AUTHOR> Thanks for the response! Your points addressed in order:

First, if college is all about social interaction, then it's hardly worth the money. I can go to conferences, take non-university classes, pay for coworking spaces, and intern at places all for much cheaper than college. I found it very difficult to interact socially at UT — the campus is enormous, making it rare for me to randomly run into people, and also, I grew up in Austin, so I already had a pretty solid base of friends and there was little pressure to find new ones (though I did meet many people, mostly through friends I already had).

I think your views on the CS degree are pretty much why I didn't get that degree. I don't want to be comfortably employed; I have no intention of making my life a linear path from college -> work -> family -> retirement. I don't ever plan to retire, because there is nothing I love more than challenging my creativity. If I had a CS degree, I would probably have a pretty high paying job in a nice place right now, but I certainly wouldn't be traveling 5 months out of the year (and in 2014, 11 months if things go according to plan). I like programming, and especially designing, for the web, but I also like working for myself. I have a pretty decent portfolio, and although I haven't gotten any huge jobs yet (biggest so far are a dating social network and a minisite for NASA), I make enough to support myself and my travels.

I also think getting a degree in CS would have minimized my passion for it. Getting a degree in linguistics certainly stamped out any ambitions I had on becoming a professional linguist. Although, I _did_ get an enormous amount of value out of all of the electives I was able to take because linguistics is only a 24-hour major. I would have, no doubt, learned more computer science, but I know enough right now to get paid to do it, which gives me the freedom to learn it on my own time. And, I'm trying to transition to becoming a designer right now, which is its own set of challenges; something I would have completely ignored had I been taking a CS degree.

Lastly, traveling is _definitely_ not cheaper when you're going through the university. When I travel, I stay on couches (CouchSurfing) or work on farms and homesteads (WWOOF), giving me guaranteed access to social interaction and informal education (I am staying on a farm in the mountains of North Carolina for two months while I work on a full-length album at their music studio, this will cost me $150/mo. in rent — and they are eager to teach me everything they know about foraging, which is very popular in this region, given all of the naturally occurring edible plants and fungi; I have also budgeted around $900-1200 for a two-month trip to Peru).

In sum: \- Social interaction can be found elsewhere, for free. College is about learning, at least for me. \- The CS degree probably would have been a good idea for someone who wanted a comfortable, stable livelihood after college. This is not me. \- Using the university to travel would have cost a lot more than my current travel plans. I would have certainly learned a lot studying abroad, but since I plan to be "studying" and traveling "abroad" for most of my life, I

Thanks for the advice, but it is really geared towards someone who is headed for a different path, something more stable, something with a larger salary. Living my life through challenges and adventures is exactly how I want to do it. It pushes my mind and creativity to new places, and I have no plans to become stagnant.

Also, if I had the money, you bet I would go back to school. I would get a Bachelors in history, computer science, music, design, biology, and physics and anything else I could. I love classes, and I love going to lectures. This is why I'm so excited about MOOCs.

<comment><USER2> OK, so it seems like you've found a good set of friends, which is good, but I'm still not sure that you experienced the full extent of the socialization that college offers. But, it's OK if you didn't, it is a high price to pay just to learn how to live with people. You'll be learning that anyway (or probably already have given the way you're travelling).

So my view on the CS degree was that you should have gotten it, not to get a stable job, but to make it easier to get ANY job that you're trying to get. I didn't say to accept the linear path, I just said that if you had a CS degree, it would be much easier to get hired, no matter where you go. And if you state what you're trying to do, there are some companies that will respect that. I interned for 3 months at a company before going to japan (a large one, at that), and they kept me on for the entire year while I was in japan, I worked from home for essentially an entire year. If they can do that for an intern, they can do way more for you, who has a good portfolio.

Also, how is your knowledge of CS theory? You're probably not going to run into automata theory working on simple websites, but it's kind something people expect you to at least have seen/know about.

Your staying plan does sound way cheaper, so that's awesome, sounds like you're gonna have a lot of great experiences under your belt.

At this point, I think you're pretty much set in what you're going to do though, and it seems like a great plan, with some luck</comment></comment></comment>


Ask HN: Please review my new social learning site - <AUTHOR> http://www.cafecourses.com

<comment><USER2> Using javascript for sign up.

Even though something like 90%< of users have javascript enabled, I think it is an unnecessary risk to have a signup form be 100% dependent on javascript. Especially when it is so easy to just provide a real link to a basic signup page and then load that right within the facebox using jquery. Pretty sure you are using facebox and facebox makes this ridiculously easy.

</comment><comment><USER3> Hrm "Get In. Get Out. Get Smarter." Don't like it already, sounds trite.

"Ya tai! \- Hiro Nakamura, Heroes "

What has that got to do with anything? And it is "Yatta" not "ya tai."

The entire style of the site feels cheap too. I'm not sure, maybe the striped banner up top? You need a logo.

<comment><USER4> Cut the guy some slack FFS. He managed to get a _good_ idea and launched it. Congratulations are in order and kudoses. We can't really predict the success of his project by the absence or presence of minor details, like a striped banner, and no site feels cheaper than Craigslist.

Fixing the UI/design is an iterative, everyday process, and the great majority of it will ever come to light after heavy traffic and use.

Regards.

<comment><AUTHOR> Thank you very much!

</comment></comment></comment><comment><USER5> I signed up. The "conversational japanese" course was highly rated and recommended, so I enrolled in it, but I don't know what to do now. There doesn't seem to be anything there. Where's the course?

The "enroll" button was a bit scary, I wasn't sure what that would do. I'd expose as much of the course materials as you can without forcing someone to enroll.

<comment><AUTHOR> On the content issue, most of the existing courses out there were created during the private friends/family beta. I have not removed them under the assumption that they will simply fade to meaningless over time. I believe the "Conversational Japanese" course is still under construction but the owner "published" it for testing purposes. Getting quality content is my primary concern at this point!

Didn't mean to scare you with that enroll button haha. Enrolling at this point really doesn't do anything other than give you full access to the course (you can then rate/review it, access the sections, and partake in the forums).

I have a story to think about letting people in w/out enrolling but am unsure how well that would work because then it is hard to gauge a) how popular is a course and b) should a user be able to review the course. Plus I intend to eventually allow course owners to charge for their courses if they so desire and want to get users used to enrolling since eventually that may have a checkout process attached to it.

<comment><USER5> More food for thought.. "Enroll" feels like there is going to be some requirement of me, and I wasn't willing to make that commitment yet. This isn't the right language, but something like "keep tabs on this course", or simply "follow", or maybe there's two options: "enroll" and "audit"

</comment></comment></comment><comment><USER6> I personally don't like generic icons.

<comment><AUTHOR> Neither do I! Want to make some for me for free? :-)

<comment><USER7> What about just not using them? Or you can find super cheap ones on istockphoto

</comment></comment></comment><comment><USER2> To me, the signup/login forms are not clear. You use "login" on the signup form. I instinctively associated that word with logging in, so i kept looking for where to "sign up". A better word would be username.

When signing up using the big orange sticker icon on the right, you get no status message as to what happend after submitting the form. It was only after trying to sign up using the top left link that it told me "username exists" which meant the sticker signup apparently worked.

Not requiring a password on initial signup tells me you want ease signing up as much as possible; why are you requiring email validation then? Seems counter-productive. Let users gain instance access, and then delete accounts that haven't validated after a set timeframe, (with reminders).

Minor pet peeve. The facebox boxes have too little padding on the left/right margins. It does not look nice.

I tried to sign up for a course by clicking on the plus sign, but after I do that I am lost as to actually how to "take" the course. Maybe this is a lack of content issue, but I'm still puzzled as to whether these courses have video, audio, read like a textbook, or??

That is all for now.

<comment><AUTHOR> I've addressed most of these concerns in the last deployment I just did. The lack of notification on signup was a caching problem.

After signing up for (enrolling in) a course you should be taken to that course's landing page. A navigation section gets added to the sidebar when in a course that lists out that course's sections (assuming it has any). At that point, the norm would be to simply progress through the course's sections in a linear fashion but that is not enforced so you can skip around if you want/need.

I guess I need to somehow make it more obvious what you do when you are in a course.

</comment></comment><comment><USER8> Once you get into the site itself the design is fine. I think the negative reaction you are seeing is more about the landing page. To sum it up; it has a web 1.0 feel. There is a lot of text, and it seems like a pretty intense sales pitch.

I'd cut that landing page down to the bare essentials.

The site itself feels very complete, but without content it is impossible to understand what the point really is. I registered and as others mentioned, I had no clue what to do. The "what to do" drop down is great, but so much to read. I don't have the patience to read all that (and I want to help you), so I wouldn't expect a user to read it.

Regarding content; you need to champion a topic. Pick something you know that would relate to other people. If you can't think of something, do something technical.. The site can't be empty, and the things that people see must be current.

good luck, looks like a strong start

<comment><AUTHOR> That is great feedback. Thank you.

</comment></comment><comment><AUTHOR> Just wanted to say thank you all again for the valuable feedback.

I have taken many of the suggestions from here and updated the site's landing page to be less wordy and more to the point.

Also, I have streamlined the signup process so that you no longer have to validate your email address (although now I probably need to add a CAPTCHA or something at least).

I've also added in a new user help page that you are taken to upon signing up that tries to give some pointers on what to do next rather than just dumping you on your profile page.

Again, thank you all for the feedback!

</comment><comment><USER9> As soon as I understood what you were offering (make your own courses online!) I wanted to browse example courses that had been released, and it wasn't obvious how to do that.

<comment><AUTHOR> Course Catalog link at the top. It's also the home page when you are logged in.

<comment><USER9> Ah, I see. I didn't understand what a course catalog was in this context. Maybe "Browse Courses", or place the link more centrally? Also, it should default to a few examples that are really awesome, not "Most Recent" which is full of garbage at any given moment.

</comment></comment></comment><comment><USER10> for a one man army, I think its pretty neat what you've put out as v1.

Some gripes: \- Please allow me to see content without a signup. it will help in SEO too.

\- You can put up this on your hompage :) <http://www.cafecourses.com/courses/3-course-creation-101> and invite people to take up more courses (if #1 is done)

\- Related courses will help when looking at a particular course (you already have tags and search, so I think it might be easy to do this)

\- Your login form is a bit too intrusive for my taste. Why do I have to check my email to continue using the service? (I dropped out at that point and didnt get to see a course) I didnt mind a signup for testing ur service but checking my email was a blocker. I have 2 emails (both on gmail) and one I dont check at all. Used for experimenting. To see that inbox I have to signoff from my account and log in there, wade through spam to find your mail.

<comment><AUTHOR> Thanks for the comments.

1\. You can already see the content without signing up (at least the course overview pages). It is probably not obvious but the Course Catalog link at the top is accessible when you are not signed in. I didn't want people to get lost in looking at courses (especially when there aren't many yet) because I want them to sign up and get involved in the community.

2\. Related courses is a great idea, thanks!

3\. Due to comments here I am reconsidering the email verification step. Most people just use a trash or temp address to get around it anyways (like I do).

</comment></comment><comment><USER11> Tried to sign up but all I got was an animated gif in the popup window. Tried with Safari and FF on OS X.

Edit: The popup worked from /courses but not from the home page.

<comment><AUTHOR> I think the site is just under a bit heavier load than normal and until I get some more traffic it's running on a pretty low-powered server. Be patient please!

<comment><USER12> Pubb is right, it's the same for me. It works from /privacy and /courses. Clicking on it from the landing page returns 422 "Unprocessable Entity" as a response to the ajax call.

Chrome/XP.

<comment><AUTHOR> Think I fixed it. Sorry for that guys!

</comment></comment></comment></comment><comment><AUTHOR> Thank you all very much for your feedback! I truly appreciate all of it, both positive and negative.

</comment><comment><USER13> nice idea, if a user creates a course will another user be able to modify it? because that might be helpful.

<comment><AUTHOR> This is not implemented yet but there is already a story for allowing possible course author collaborations.

<comment><USER13> i'm reminded of something joel spolsky said about the changing state of volunteering, that people are willing to do small defined tasks, but less willing to volunteer a certain block of their time each week. So if somehow you had a course todo list, and people could each contribute, i think that might work well.</comment></comment></comment>


A phonetic writing system based on cellular automata (2011) - <AUTHOR> http://firstchurchofspacejesus.blogspot.com/2011/06/phonetic-writing-system-based-on.html <comment><USER2> Initial concerns:

\- Is it guaranteed that the ruleset can produce any sequence of collisions?

\- Seems like the vast majority of possible states would represent words with concurrent phonemes, which is pretty much undefined behavior for the human mouth. I guess you don't want the ideograms to be _too_ informationally-dense, but that's a pretty sparse encoding.

\- Example table only does CV syllables and it's not immediately obvious to me how to extend it to more syllable types. (especially crazy consonant-dense clusters like "twelfths") You could have ∅ entries in each vector, but then you start to lose some of the natural "timing" analogy if some collisions don't represent syllables.

\- Not a lot of visual distinction between different words (e.g. "like" and "site" are just 1 step vertically transposed from each other).

\- Each word has many many possible ideograms, not just because each collision can be generated multiple ways, but also since you can create non-colliding "noise" cells in unused areas.

I guess you could leverage the expressiveness somehow, like tending to use certain collision types or cell states implies something about the context / pragmatics.

I do really like the out-of-the-box thinking that inspired this, but I also like seeing it taken to the rational extreme. How can you get the dynamic nature of the cellular automata shine in your system? What distinguishes it from using the same table, but just putting numbers in the cells for when each combination occurs?

<comment><USER3> Good list of concerns. I'd also add that the slower pace of writing system changes versus direct phonetics is more often a feature rather than a bug. For instance, despite some rather huge shifts in phonetics over centuries and distributed across a large variety of accents, written English is relatively stable, allowing people to read Middle English and sometimes even Old English documents with relatively more ease than had they followed more strictly phonetic renderings.

</comment></comment><comment><USER4> I'm trying hard to understand this, but am having trouble.

If someone wouldn't mind drawing an example of this freehand, with a two- syllable English word, I'd appreciate it.

</comment><comment><USER5> Maybe I'm missing some insight here, but this doesn't look useful at all.

It seems to just overcomplicate things.</comment>


Stop Filing Bugs, File a Container - <AUTHOR> http://blog.runkit.com/2017/02/01/stop-filing-bugs-file-a-container.html <comment><USER2> I hate to be negative, but this feels like an invitation for very poor bug quality reports where now you have to debug an application _AND_ an OS (the container).

<comment><USER3> Hi there, I'm on the RunKit team.

I think we've all been in a situation where we have a bug reproducing in front of us but when we ask for help by describe or even give code to someone else they say "hmm, it works on my machine". Since software rarely runs in a vacuum, having better system level access can sometimes be the only way to debug it.

Our hope here is that RunKit notebooks make it easier to see what's wrong, even when the problem is less obvious.

<comment><USER4> The most common situations for having a bug that works on my machine but not other people's have to do with memory access violations. But it seems like when you containerize the environment, you will change the memory layout and risk the same situation where the bug disappears because you've moved it to a different machine.

<comment><USER5> > _The most common situations for having a bug that works on my machine but > not other people 's have to do with memory access violations._

Not even close. Different classpaths, different versions of packages, some ENV setting like LOCALE causing havoc, a different configuration between the two installations of the programs that are debugged, a single core vs multi core cpu that masks some race conditions, there are literally MILLIONS of things that can, and in my experience, have, cause something to work in one machine and not another.

In fact memory access violations do not even register as a blip on the top-100 reasons...

</comment></comment></comment></comment><comment><USER6> Wow. Not sure why all the hate. This is amazing.

It's like the live javascript/html/css editors, but for systems!

[https://runkit.com/npm/lodash](https://runkit.com/npm/lodash) and poof, you can run queries against lodash and share and they can edit it. (which you could do in a plunkr too, if you loaded it). I didn't even need to sign up...

Looks like [http://code.runnable.com/](http://code.runnable.com/) does similar for more stacks, but you have to sign up for that.

</comment><comment><USER7> I find Nix invaluable for this kind of thing; especially how it rebuilds anything who's dependencies have changed, and caches everything else.

I tried to play with docker, but haven't seen much use for it in for my current workflows.

<comment><USER8> I don't work on projects where Docker is useful in production, but I've found it tremendously useful in continuous integration. It guarantees a reproducible environment, which a VM could do, but just as importantly it _documents how to produce that environment from scratch_. I've found that hugely valuable.

I've always liked the idea of Nix but I've never used it. How easy is it to extract and understand the details of the environment you've constructed to build your project?

<comment><USER7> > Docker... documents how to produce that environment from scratch. I've found > that hugely valuable.

> How easy is it to extract and understand the details of the [Nix] > environment you've constructed to build your project?

The "extract" part is easy: Nix uses a declarative language to describe the environment, so in that sense it's like docker, but more fine-grained: each package is built in isolation, and installed to a read-only filesystem.

As far as "understanding the details", it depends on what you want to know. You can use "nix-shell" to enter a build environment in a shell, e.g.

        nix-shell -E 'some Nix expression'

will enter the build environment of 'some Nix expression',

        nix-shell -p 'some Nix expression'

will create an environment with 'some Nix expression' installed, etc.

For example, I'm currently tracking down a space leak in a Haskell program by running the following command after each edit of the source code:

        nix-shell -p 'with import <nixpkgs> {}; profiledHaskellPackages.callPackage (runCabal2nix { url = ../myTester; }) { myDependency = profiledHaskellPackages.callPackage (runCabal2nix { url = ./.; }) {}; }' --run 'tester +RTS -M100M -xc'

The command 'tester +RTS -M100M -xc' is a Haskell program which dies if it uses more than 100MB of heap, exposing the space leak and dumping a stack trace.

This will be run in an environment containing Haskell packages built from the source code in "./." (the current directory, for "myDependency") and "../myTester" (for the "tester" command). These packages and all of their dependencies will be built with profiling enabled.

Running this command over and over will just re-use the previously-built environment. If I edit the source in ./. or in ../myTester, Nix will notice that the hashes have changed, rebuild the packages and their dependents and make a new environment using those. This makes it easy for me to test potential fixes.

</comment></comment></comment><comment><USER9> So now someone can reproduce the bug, but can't test a fix to it. They can take apart the container and attempt to reproduce in their own environment, but that's a lot of work.

<comment><AUTHOR> We provide a download link on the left which will download the file with all the dependencies shrink-wrapped, so that you can certainly start hacking on it locally too. This is a great start and a lot easier than manually trying to npm install the right combination of sub-dependencies, etc. If you have any other ideas we're happy to implement!

<comment><USER10> The point is that complexity is most effectively managed by discrete (modular) consideration, not another layer of abstraction, which tends to hide it. Build process is a discrete development process problem space with its own group of established solutions. It should not be conflated with bug reporting.

 _All problems in computer science can be solved by another level of indirection, except of course for the problem of too many indirections._ \- David Wheeler

<comment><USER11> If you are in the type of bug runkit targets, getting the exact same env right will take you days. With runkit, you do have a little setup to do, but the days can be used to debug.

This is a great concept : remove the work to reproduce an environment, and use the freed resource to understand said env.

Major advantages are:

\- the bug reporter may not know his/her case is special and won't provide you with the information you need to see it. Providing a running container with the bug just obliviate that.

\- the running container can come with a docker file, which gives you everything: libs, versions, settings. It's basically a summary of the stuff you need for it to go wrong.

\- you can try locally the stuff, even if your setup is completly different, without messing with your setup. Because complex bugs rarely are reproducible with a bunch or pip install, apt get and other yum incantations.

It's not good for all bugs. I would say it's actually bad for most bugs. But for the bugs that needs it, it seems fantastic.

<comment><USER10> _getting the exact same env right will take you days_

If your codebase has significant undocumented environmental dependencies and these are hard to script in place, there's something far more fundamentally wrong with your development process than bug reporting.

<comment><USER11> Lol you react like most of us have software deployed in controlled environments.

I create Python libs that are used in so many various configurations by so many people I don't know. They come back and say "hey, I got this stack trace" (in the best case).

Now I have to play the guessing game. Is it me, is it you ? Wrong path ? Permission problem ? Bad conf ? Network is having trouble ? Server is this particular linux version and and there is something important about the SEL setup here ? Oh but upstart/systemd don't behave the same way. Output is redirected here look. Stuff is not the expected encoding. Na it was not a bug but you're file is corrupted. What the heck is this data format ?

Etc, etc.

You thing you though about every single thing ? Your error handling is perfect for all IO ? You deal with all encoding, all user inputs perfectly ? You know all the little OS peculiarities that will make your subprocess run in the exact way you think ?

Of course you don't, nobody is perfect, we don't have infinite resources. But there are infinite ways to fail.

And for many things, you can figure it out with with just your code base and the error because it's a simple cause. But from time to time arrive this terrible bug that is a mix between a strange LOCAL, this particular version of the VM you use but only in one time zone with this env variable set. And for that, yes, a good container with a reproducible bug in the proper env is an interesting idea.

Apparently, you don't ship software that is wildly used enough or you would not be that arrogant.

Deploying on your own 100 servers is hard. Try seing your code deployed on 1000 servers that you don't own, nor configure.

<comment><USER10> I'm trying to help point you in the right direction based on my own experience, not be arrogant. It sounds like you would get a lot out of spending some time working on CI/CD concepts.

In short throwing your hands up in frustration at the complexity of software is not a solution and gets you nowhere. The way we deal with "infinite ways to fail" is to control the environment. These days, quality projects are expected to version control their environments and conduct test deployments within a representative set of environments using a representative set of configurations.

Docker provides an easy way to do this ("always deploy on <distro>-<os>-<version>"), but it's only one approach. Another free and relatively straightforward place to start getting up to speed would be automating build and test processes with Travis CI for an open source project.

Deploying to any number of tested environments is trivial.

<comment><USER11> You are completly missing the point.

If you create a Python lib, 10000 people will pip install it. You have no control on the env.

If you create a deb package, you will see ppa and it will be installed on many various env. You have no control on the env.

Again, you definitely have no experience in shipping software outside of your bubble.

A lib is not "a web project". A cmd line tools is not either. You still need to debug them. People will run them on windows, linux, mac, bsd, and who knows where. And they will come for you.

Now you can choose to simplify the problem and only support a limited number of env. But I guess I'm quite happy the guys who created apache, ffmpeg didn't force me to only used them on Linux with LOCALE set to accept only ascii and CEST.

<comment><USER10> No. As I said, in these cases you use a CI tool to test on a broad range of environments.

For example, here is a library I maintain with 12,000+ installs per month that is tested on 7 different environments every commit using Travis: [https://github.com/globalcitizen/php- iban](https://github.com/globalcitizen/php-iban)

<comment><USER11> 7 env. LOL.

Don't get me wrong. It's a good thing. Most people I know don't even have unit tests. Having a CI is fantastic. 7 env is more than a lot of people do.

But that doesn't even scratch the surface of the combinations of factors you can get. It can't.

You can't install all the locals, all the lib versions, simulate all network conditions and all user inputs.

You will get strange bugs that your CI didn't take in consideration. And some of them will be very hard to reproduce. That's just a fact.

Now knowing you do have all this setup I just can't understand we still disagree. It's impossible you didn't run in those.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER12> I wish we had better reproducibility tools. It should be possible to write a failing test case, and everything that is not of value to that test case gets stripped out, containing just the parts of the program/environment that can affect the test case (including sources of non-determinism like clocks and RNGs). Kinda like C-Reduce, but on steroids.

And we should be able to look at the problem probabilistically too: given the form of the test case, the value pipeline through the debugger, and the structure of the program, we should be able to narrow down places to look as much as possible using some form of bayesian search theory.

<comment><USER13> Minimal test cases sounds like QuickCheck.

</comment></comment><comment><USER14> We have something "similar" for the .NET Native compiler. You pass a special flag to the compiler and it will generate a file with more or less everything we need in house to diagnose your issue.

Compared to cut down repros, the packages are huge (200+MB) and debugging requires more gumption but we save a huge amount of time going back and forth with customers. It's not ideal but we'd rather have a "bad" repro than never hear about it.

We've been taking customer issues this way for almost 2 years and it's been a good thing to have in the tool belt.

</comment><comment><AUTHOR> Hi I'm part of the RunKit team and am happy to answer any questions!

</comment><comment><USER15> This looks really cool. I wish I could do this with other languages.

<comment><USER16> You could do something similar with [http://code.runnable.com/](http://code.runnable.com/)

[Disclaimer - I work at Runnable]

</comment></comment><comment><USER17> This looks really awesome. I really like that you allow users to try it out without having to sign up.

I think probably the biggest hurdle with something like this gaining traction is having the users remember that it's available.

Is it possible to fork from an existing container? If that's possible, you can probably get maintainers to include a link to a working container with the lib already setup in the project's new issue template.

<comment><AUTHOR> You can link to an existing notebook and add "/clone" to the end of the URL to basically get this behavior. That's how the 'Try It Now' button at the bottom of the page works, we should definitely make this more obvious. Additionally, maintainers can embed RunKit on their pages with our embed API: [https://runkit.com/embed](https://runkit.com/embed). For example, Lodash uses embed on their documentation: [https://lodash.com/docs/](https://lodash.com/docs/).

</comment></comment><comment><USER18> Or send a coredump :)

</comment><comment><USER19> I think this would make a lot of sense on platforms that undergo massive fragmentation(all fingers pointing at android here). Browsers are also fragmented , but websites like Can I Use It[1] should be able to reduce the problem to a manageable extent. I love the idea of reproducible bugs. Because often the hardest part of solving any bug is first being able to reproduce it followed by finding the source. Since I presume these containers would also help in reliably reproducing those one-off bugs which happen only on first install/ first open / on some other event.

[1]:[http://caniuse.com/](http://caniuse.com/)

</comment><comment><USER20> Down in microcontroller land we generally just send an email describing the problem. But not knowing much about web development, I suppose problems in that area are much more complicated.

</comment><comment><USER21> Am I the only one put off by the bad "s-t" ligatures as being too twee? It may or may not be a good approach, but I stopped reading literally ("Archer" literally) got too annoyed by the distraction of that font face. Edit: I want to downvote myself-my wife's W10 box show no annoying ligatures. My Linux Mint 18/Firefox setup is otherwise. Sorry for the distraction!</comment>


Tangled Up in Tools: What's wrong with libraries and what to do about it - <AUTHOR> http://www.pragprog.com/magazines/2010-04/tangled-up-in-tools

<comment><USER2> I'm halfway through this post...and _famished_.

</comment><comment><USER3> Is the TLDR: Have smaller API's for your libraries?

<comment><USER4> Not exactly. I only skimmed it (and yep, the sushi looked good :-), and mostly looked at his second point, which is more like keeping the _scope_ of your APIs small.

To use a delightful term from Ted Nelson, you very much want to limit how the parts of your system are intertwingled (<http://en.wikipedia.org/wiki/Intertwingularity>). The less you have to juggle in your head at once, the better; he connected this to flow (quoting Joel S.) ... I'd put it "the less deep you have to get into flow the better".

Or to quote Brooks, limit accidental complexity (<http://en.wikipedia.org/wiki/No_Silver_Bullet>).</comment></comment>