Ask HN: Who's using Clojure, and to do what? - <AUTHOR> Hello everyone,
I've seen a lot of articles on HN recently talking about Clojure. I had a quick look at a few pages (Wikipedia, etc...), and I can't help but think that it sounds like the new cool language, pretty much like Ruby in 2007.
But to get a better idea, I'd like to hear the feedback from the community: Who is using Clojure (in real-life cases), and what are you doing with it?
Bonus points if you can tell what specific features made it a better language for the task. <comment><USER2> Another important question to ask is: if you're not using clojure, is there a clojure-specific reason for that? (ie. "I would use clojure but...")

In my case: I reported a bug in the clojure.contrib XML library, on the google group. It's a trivial fix, but not worth the hassle of signing a contributor agreement. So although I'd fixed it myself, I couldn't send a patch. All I could do was report it - and the report was ignored.

Some time later, I reported another, deeper bug that I didn't know how to begin fixing (but did know a workaround for). It got ignored too.

I like the language, and I'm not going to say my experience was typical of the community. I spent some time hanging out on the group and the people there seemed friendly and helpful. But that's one reason I no longer use it. (Another reason is "no reason at all", and I don't know the relative weights of these reasons.)

This feels a little like whining to me, but feedback should be both positive and negative.

<comment><USER3> It's not just you. Requiring copyright assignment is a powerful way to put the brakes on community involvement by itself, but couple that with a policy of "nothing gets applied until the BDFL personally approves it" and things can get frustrating. I've had bugs with perfectly viable patches linger in the issue tracker for 3-4 months before getting applied. In some cases the original author of the library even personally approved the patch, but it still had to wait for the thumbs up.

Hopefully this will improve with the creation of the Clojure/core group. Having every commit need to be approved by a single person is absolutely unsustainable in the long run, and we're definitely already at to the point where it's causing issues.

That said, it certainly doesn't stop me from using Clojure every day; it just makes me prefer decentralization (using 3rd-party libraries rather than contrib, for example) where possible.

<comment><USER3> I should add that having Rich review every single commit is very appropriate for some parts of Clojure: I wouldn't want people committing to the STM mechanism or to the implementation of clojure.lang.PersistentVector without his approval. And for a long time Clojure almost entirely consisted of this kind of code--stuff that's really hard to get right.

But now it's had more more pedestrian nuts-and-bolts kind of libraries added like clojure.test and clojure.main. These are included out of necessity, but they are very easy to understand and fairly easy to patch and improve as well. It would be reasonable if the original authors were allowed to improve them and accept patches from the community for them even after they've been promoted from contrib.

</comment></comment></comment><comment><USER4> I wrote a text classifier in Clojure and I'm currently developing it in to a product. It is fairly good at author identification, with a substantially better success rate than libsvm, the tool most commonly used in academic papers.

I'm looking at several possible applications, the one I find most interesting being a tool to catch students who pay others to write their papers.

Clojure has a few features that have been a big help. The rich set of tree- based data structures is especially helpful because it makes splitting and merging data inexpensive. The ability to inexpensively switch to mutable versions and back where appropriate for performance reasons is also quite nice, and absent from most other functional languages. The fact that its a Lisp has advantages that should be well-known by most people here.

Edit: the fact that it's fast is also important for my application. I need to be able to do classification on a large number of possible categories at web speed.

</comment><comment><USER5> I work at Etsy. I launched a new search tool powered by Clojure last week:

<http://www.etsy.com/explorer>

It's used for the autosuggest and facet suggestion on the sidebar.

We'll be posting more about this on our tech blog sometime soon.

<comment><USER6> Your job postings mention Scala in several places. Are you using both internally or is this Clojure project more of a one-off?

<comment><USER5> We're using both, but right now this project is the first use of Clojure. We have a lot more Scala code.

</comment></comment></comment><comment><USER7> BackType is a YC (08?) company. They manage Terabytes of real time data using Clojure + Hadoop/Pig:

<http://www.backtype.com/opensource>

<comment><USER8> We don't use Pig, we use a Clojure-based query language for Hadoop that we wrote called Cascalog:

<http://github.com/nathanmarz/cascalog>

<comment><USER7> My bad. Sorry.

</comment></comment></comment><comment><USER9> I don't know if you consider this "real-life", but I used Clojure to implement and run stock strategy backtesting trials for my master's thesis project. I defend my thesis on June 29th.

The big reason I used Clojure was that it was _easy_ to parallelize my program; however, running independent trials with many different parameter- sets is one of those "embarrassingly parallel" tasks.

<comment><USER10> Very interesting. Did you consider using R? Why did you choose Clojure for this? I've been thinking of doing something similar myself and I would love to hear your thoughts considering you've already been-there-done-that.

I'd love to read your thesis and code, if they're available.

<comment><USER11> R does have quite a bit of financial libraries, yet I don't remember R has any good support on parallel computing, hmm?

<comment><USER10> True, but Matlab has good support for distributed computing. It's even possible to do this on an EC2 cluster. Pretty impressive really: <http://www.mathworks.com/programs/techkits/ec2_paper.html>

edit: Cleaned up my bad grammar.

</comment></comment></comment></comment><comment><USER12> Clojure's a decent choice for writing a cross-platform UI application, using Swing. Java+Swing sucks, but Clojure+Swing works pretty well. I wrote a dependency graph library, dgraph, which significantly reduces the amount of boilerplate required to keep UI state in sync.

<http://github.com/gcv/dgraph>

I also wrote an embedded database library for Clojure, based on Berkeley DB.

<http://github.com/gcv/cupboard>

Which specific features make Clojure a good choice? Interactive development and macros.

<comment><USER13> I've been considering writing a desktop app. I've been wanting to get into the JVM action, but dimly remember being scared off by Swing years ago. What about Clojure makes it better at using Swing?

<comment><USER14> Swing can be a lot of repetitive code. Clojure has mechanisms (functions, macros and libraries) that can help you to abstract this away to exactly the way you like to write user interfaces.

</comment></comment></comment><comment><USER15> I've used Clojure to write clj-peg (<http://www.lithinos.com/clj- peg/index.html>). I then use clj-peg everytime I've needed to process some consistent structure (RTMP/AMF0/AMF3), anytime I want to create a quick DSL (the source markup for my site), and just for fun (looking into writing a markdown grammar).

Macros were essential to what I wanted in a PEG-based system. I wanted to use as few extra characters as possible to increase readability, since fewer characters meant less clutter around the Non-Terminals. I also wanted a custom syntax that leveraged the basic approach of the parent language to minimize the learning curve. Macros allowed me to easily introduce those features inline with the rest of the language.

I've also wanted to use a language that was moving toward platform independence so that my efforts would last longer. Clojure isn't far (a year or so) from being more easily implemented on platforms other than Java. I'm fairly convinced that they'll make it and clj-peg will take advantage of that if it can.

While Common Lisp, among other languages, meets the macro feature, and I developed in Common Lisp for a while, bringing the Java ecosystem into the picture solves other problems I had had with common lisp.

In addition to clj-peg, there are other projects that are in-process, but I'd rather not bring them up here since they don't have the resources that clj-peg currently has.

To sum up: Macros and the Java ecosystem.

<comment><USER16> This project looks interesting and although I don't have much time to get into it at the moment I'm mainly commenting to create a personal bookmark for it and to thank you for sharing your project.

Please consider moving the project to a hosting site like github which would make it easier to track updates to it and easier to find in the future. Thanks again!

</comment></comment><comment><USER17> I'm using Clojure for my PhD thesis project, implementing a distributed computing framework for building P2P applications. I've also been creating an audio synthesis and musical live-coding system, available here:

<http://project-overtone.org>

Clojure has without a doubt been the most eye opening language I've learned in the last 10 years. I highly recommend giving it a try. It has powerful yet incredibly simple to use constructs for dealing with state in a multi-core world, and I think it far surpasses everything else out there today for parallel programming. The centerpiece being a built-in software transactional memory system that enables composable, deadlock free, multi-threaded coordination.

Beyond solid support for concurrency, the standard library provides an elegant set of programming tools that will make you realize how even expressive languages like python and ruby make you jump through lots of unnecessary hoops. In Clojure you represent everything with basic maps, sets and sequences, and the standard library has extensive tools for manipulating these things. (By the way, your code is also available for manipulation with these same tools.)

Macros let you peel away every last bit of boiler plate, and what you realize is that in the end all of programming is just arithmetic, iteration, branching, and assignment. Everything else is just getting in the way of your core logic. I think Clojure lets you get to the center of your problem with the least overhead possible.

</comment><comment><USER18> My friend and coworker 'wglb uses it, over my weak and pitious objections, to build network protocol fuzzing code here. Don't worry, we'll beat the Clojure out of him soon enough.

<comment><USER19> Out of curiosity, what are your objections?

<comment><USER18> It scares the crap out of clients.

<comment><USER20> (Tell them it's just another jar file deployed with the application. Unless they need to see the source code...)

<comment><USER21> Not sure how good the compiled Clojure code is. Also -- it might be too dynamic to allow any kind of obfuscation so it won't be used for stuff that's sold with licenses for example.

<comment><USER22> Bollocks. We AOT-compile and then obfuscate closed-source clojure code shipped to commercial customers.

</comment></comment></comment></comment></comment></comment><comment><USER23> Writing a baked blogging engine in Clojure, heavily using Enlive for a large chunk of it. Many fewer lines of code than doing it in Python/Ruby.

Plus, honestly, it's a lot of fun to use.

Next up is some data analysis: I'm looking into the excellent Incanter for that.

Great libs, great community and a fun, fun language that's practical and elegant.

EDIT: to expand on what I like about the language; it's a lisp, so everything that comes with that. It's also got some syntax that simply makes it more pleasant to use on a day-to-day basis. And so much more!

(excuse typos: my phone is acting up today/can't handle HN for long comments.)

<comment><USER24> Warning: irrelevant grammar nazism below.

> Many fewer lines of code than

This grammar bugs me. I feel like this should be "Much fewer" or similar, but I'm not totally sure it's wrong as posted. Opinions?

<comment><USER25> "Many fewer" should be technically okay.

"Much fewer" is definitely wrong.

"Far fewer" would be my choice.

Normally, grammar nazis at least know something about, which you clearly do not. Why does someone of such low caliber try to correct others?

<comment><USER26> "...someone of such low caliber..."? Was that really necessary?

</comment></comment></comment></comment><comment><USER22> DocuHarvest is a web application for extracting valuable data from documents (just PDFs for now):

<https://docuharvest.com>

Short reason: JVM perf/libs + persistent data structures + lisp goodness (macros etc.) is a helluva package deal.

</comment><comment><USER27> I'm building CloudHoist.com, a cross-cloud console that does node provisioning, configuration and administration.

<http://cloudhoist.com/>

Lisp in general is amazing, and being able to deploy to the JVM is a huge win for Clojure.

</comment><comment><USER6> I'm using it to verify replication between a big sybase instance and a big oracle instance. This isn't rocket science but performance is much better than it was in Python and the code is about the same size.

I'm also and to liberate data from a MeetingMaker server that's only available via a Java api and make it available in Rails apps. Obviously the superior expressiveness of Clojure makes the code base a lot smaller and makes more sophisticated processing of the data far simpler than it would be in Java.

Hopefully more soon.

</comment><comment><USER28> I used clojure to build <http://elev.at>

Clojure code services the HTTP service calls (multimethods are very nice here) and also does the job of converting spreadsheets or CSV files into XML.

</comment><comment><USER29> We're building semantic web apps for data integration. Clojure is great for it as it's all either symbolic manipulation (query translation and planning) or moving data with as little overhead as possible.

</comment><comment><USER30> We are an Indian startup and we are building a next-gen finance webapp in Clojure & Python.

We are using Clojure since the early days and we are extremely happy with it.

We used Clojure to build a finance engine which aggregates financial info from various places, stores them in the DB and serves them over a RESTful HTTP API.

Clojure's awesome concurrency semantics and the overall power of Lisp combined with the vast JVM ecosystem has helped us a lot.

We are Infinitely Beta (<http://infinitelybeta.com>). We are launching in a month, I will announce when we do.

<comment><USER10> Do you have an announcement mailing list? Or blog RSS feed?

<comment><USER30> Not yet, but you can follow the team on Twitter - <http://twitter.com/ghoseb/infinitely-beta>

</comment></comment></comment><comment><USER31> We have build a large Web-Application with Clojure. It runs on Google App Engine and we are really happy with our decision. You can find it here: <http://the-deadline.com>

We use the power of lisp to extend the language for specific tasks, like accessing the distributed key/value datastore or building an expert-system shell.

<comment><USER32> I don't normally correct people's spelling but in this case...you've got an error on your company homepage. Should be "they don't need to be as daunting as we tend to _perceive_ them."

</comment></comment><comment><USER33> Is used clojure to build a front-end to an inventory program I wrote for the Library of Congress.

There are a lot things to like about clojure, but the reason I chose it for this task was that it was the only language on the JVM that had a usable (imho) repl.

</comment><comment><USER34> I've done about 4 non trivial projects with Clojuire. (a) some fairly serious SEO related to RFS1 (b) a news aggregator (c) music-compojure <http://github.com/mhowlett/music-compojure> (d) some investment portfolio performance calculations.

I really like the language. Am I productive with it? Not really - as a guess, I'm about 3 times faster with .NET / C# (with which I'm very experienced). I might be able to get to the same level of productivity, but it'd certainly take me a while to get there.

<comment><USER35> Have you experimented with F# a bit yet?

<comment><USER34> Not really because I'm fairly keen to move away from the Microsoft platform.

</comment></comment></comment><comment><USER36> Algorithmic trading. Currently only a GUI for managing my existing trading algorithms in Java and a evolutionary algorithm I use for optimizing parameters, but I am looking at using Clojure to implement the trading algorithms themselves.

Pros: wonderful integration with Java, good support for concurrent programming, conciseness, macros.

Cons: numerically intensive code can be a bit slow (but it is going to improve significantly with 1.2, and you can always do that in Java), prefix notation can be quite hard to read if you are dealing with complicated math expressions.

</comment><comment><USER37> Can Clojure be used in Android app development? Since Android apps are JVM- based.

<comment><USER38> Android isn't jvm based. They wrote their own VM with their own bytecode format, and a bytecode translator from java bytecode. Since the translator is written in java, it is possible to run it through itself and use that to run clojure, but it's dog slow. Even when statically compiling a sample "hello world" clojure app for android the bootstrap process takes over a minute.

</comment></comment><comment><USER39> I'm hoping to port it to the CRIO for FIRST robotics, but I haven't looked into trying yet. All my other projects have been relatively minor so far.

</comment><comment><USER40> FlightCaster (YC S09) uses it in production: <http://www.google.com/search?q=flightcaster+clojure>

</comment><comment><USER41> I'm an soon-to-be-undergraduate just learning the language and Lisp.

I found this great series by Rich Hickey last night: <http://clojure.blip.tv/></comment>


Ask HN: What did I do so wrong in this coding interview - <AUTHOR> A few days ago I applied for a senior Full stack developer in a mid size company. HR interview went great, I had a quick code test on paper that went OK as well, and a quite long technical interview that went great.
The day after the HR sent me an coding test that involved creating a simple memory game in JS with a tiny back end to store high scores. So I banged out this code as fast as possible, while trying to emphasis on maintainability and testability. I sent back the result as github repo:
https://github.com/m4nuC/memGame
Didn't hear back for a few days but eventually arrived a mail stating that "this code felt far short from a senior developer standards" and obviously didn't get the job. I know I cut a few corners, no unit testing, a couple of minor bug and obviously not a production ready app but I thought that would be enough to show that I knew how to build a web app without spending 2 days on it.
I couldn't manage to get any more info from them on what they meant by "falling far short of senior developer standards" So what in your opinion went so wrong about the code? <comment><USER2> Disclaimer: I'm posting this under a new dummy account because I don't want this to be seen as feedback from my company. We didn't interview you, but I'm a senior manager and I want to help w/o implicitly dragging my team into it. (The key word is also "help"; I'm not trying to belittle you, just give my honest assessment of this project, quick as it was to create.)

tl;dr: I agree with the assessment that this doesn't look like the kind of code I'd expect of a senior developer.

The biggest issue from my POV is that you pull in a _lot_ of heavy-weight frameworks and implicit dependencies for what could be a really simple app. To actually examine the application logic of your submission, I have to flip through dozens of auto-generated PHP files, Javascript module wrappers, and empty directories.

Sometimes, calling yourself a "senior" engineer means doing less, not more. The layers of indirection, framework code, and build toolchain applied here make it harder to follow what your code is actually doing. Coupled with a lack of unit tests, it seems impossible to verify in any short amount of time that it actually works as promised.

Even with all that MVC goodness, the separation of concerns on the client isn't great. There's a mix of display logic and app state visible in lots of places. (IMHO game.js is the worst offender here, as the entire game state and DOM rendering are mixed pretty indiscriminately.)

Finally, asking a reviewer to run a bunch of code from an untrusted repo via 'sudo' is pretty much a giant red flag for me. A simple JS+PHP webapp shouldn't require me to do _anything_ as root on my machine. (I'm also not familiar with Composer, but my brief skimming of the homepage, it seems like the whole point is to not require system-wide installation of dependencies, so the sudo bit is especially weird.)

It looks functional, and if you were interviewing specifically at a shop that used these frameworks and tools, it might not be so bad. If asked to review this without that context, though, I would give similar feedback to what you received.

<comment><AUTHOR> So using abstraction is not something a senior does ? It seems to me like the contrary. The more experience I have the more I like to abstract things instead of making them from scratch. But even so it seems a bit heavy of judgement to disqualify me with such strong word over this choice.

<comment><USER3> There's nothing wrong with abstraction. But you should use the right abstraction for the job. You don't need a huge PHP web framework, tons of dependencies, an entire package manager, sudo access, and so on to have a simple memory game with a high score backend.

Remember, when you're looking for a job, you're not looking to create some build and forget application. You're going to be working as part of a team. Other people need to be able to maintain your code. For a problem that should be able to fit onto a single page, you don't want to have to browse through a 7 megabyte git repo with nearly 10,000 files in it.

An analogy might be if someone's trying to hire you as a carpenter. They ask you to build a cabinet to demonstrate your skill. You go and find a prefab house frame, an entire prefab plumbing system, and so on, and build the skeleton of a house. Within that, you build a reasonably functional cabinet, though it's kind of hard to judge the cabinet among the entire rest of the incomplete house. How do you think that's going to compare to someone who just went and build a cabinet, and spent the time getting it built really nicely, paid attention to the detail work, made sure the door hung true and opened and closed without squeaks?

Here are a few things that I note at a cursory glance; and notice that I haven't even gotten to the logic of the code, because all of these things are red flags that come up before I am even able to read it:

1\. Checking in dependencies to Git. That's not how it you do it; dependencies should be handled by a separate package manager, in which you depend on the appropriate versions of packages. You should never check anything other than your own source code into Git.

2\. Your commit messages. Commit messages in Git should follow the format of an email describing a patch. The first line should summarize what the commit does; the rest of the commit should contain a description of why you are doing it. See the following for an explanation of what good commit messages should look like. First from the Git source itself:

[http://git.kernel.org/cgit/git/git.git/tree/Documentation/Su...](http://git.kernel.org/cgit/git/git.git/tree/Documentation/SubmittingPatches?id=HEAD#n87)

And then a much more in depth guide:

[https://wiki.openstack.org/wiki/GitCommitMessages#Informatio...](https://wiki.openstack.org/wiki/GitCommitMessages#Information_in_commit_messages)

3\. Inappropriate use of frameworks. You included a lot of dependencies that are unnecessary for the problem at hand. Dependencies have real costs; every extra dependency is something that could break, could have a security bug, could be a pain to upgrade in the future. Now, that doesn't mean to never add dependencies; but do so with a certain amount of care.

4\. Simple spelling and style errors. Tabs vs. spaces. Inconsistent spacing: "var _createCell = function( color, id ) {" and "if ( el.className.indexOf('turned-over') > -1)" (note: decide whether there are spaces between parens and their contents, and stick to that choice). You spelled "RESTful" as "restFul". Things like this are seen by developers as canaries in the coal mine; if you are sloppy about the very basic stuff like tabs vs. spaces, are you really going to be mindful of other important things? Consistency of style is important for keeping code readable, if you can't even keep consistent in a simple code interview problem, why should anyone think that you'll be able to do it on a day to day basis when under real deadline pressure?

Here's my exercise for you. If you want to get better, and be able to pass future job interviews, condense this down into as small a codebase as you can, with as few dependencies as possible. I think that you should be able to do this in less than 100 lines of your own code, and only the most basic of dependencies like jQuery and some simple microframework on the server side.

Give that a shot, and then take a look at both for comparison. Which would you rather maintain? Which will be easier to make changes to? Which is easier to code review?

<comment><USER4> Regarding 1. As far as I know, npm says in it's docs you should add node_modules to your scm because there is no way to install the exact same version through npm on different machines. On the other hand, composer has a .lock file which specifies commit hashes it installed on the dev machine, so a composer install installs the exact same commit on every machine.

@OP: You didn't commit the composer.lock. That means that your code might run locally but breaks on another machine because there might be a new version of laravel 4.2

<comment><USER5> Can you provide a link to that? That's not how npm works _at all_. You specify dependencies as a dictionary: keys are package names, and values are versions. They support commit hashes, but do not require them. See: [https://www.npmjs.org/doc/package.json.html#dependencies](https://www.npmjs.org/doc/package.json.html#dependencies)

<comment><AUTHOR> [https://www.npmjs.org/doc/faq.html#Should-I-check-my- node_mo...](https://www.npmjs.org/doc/faq.html#Should-I-check-my-node_modules- folder-into-git)

</comment></comment></comment></comment></comment></comment><comment><USER6> It may have been a red flag if they asked you for a simple memory game with a tiny back end and you gave them a Laravel install with a Node.js dependency that you admittedly "cut corners" on and left "a couple of minor bugs" in.

I don't know exactly what they were expecting from you if anything in terms of efficiency or scale but there is a chance this looks like a massive, bloated chunk of unnecessary dependencies and code, which suggests you might not know how to manage a project efficiently. Just requiring Node.js to do javascript development in a PHP environment, itself, is kind of smelly to me.

I'm not saying it's fair, just that it's the impression i'm left with.

<comment><USER7> I think this is the root of it. Looking at the repo, you shouldn't have to go through 20 steps to just install the app. I believe Node is just for compiling and gulp stuff, so that's fine for front-end.

I can't say I'd pass the interview but my idea of how this would work would be:

\- simple instal.php script that would use PHP's PDO to create a DB and a table with necessary info \- simple api.php script that would take API calls in order to save scores and that's it. You could easily do this in Node as well thus keeping everything javascript \- javascript front-end with no PHP involved there. An actual index.html file with everything in it, referencing one (non-minimized) JS file and whatever images and CSS.

This is hindsight 20/20 obviously especially since we all want to show EVERYTHING we know during an interview and I'm guilty of doing things like this as well. I'm guilty of doing the opposite too, keeping things too "prototype-y" and messy.

</comment></comment><comment><USER8> I have not looked at your code but I can say with some experience that it has nothing to do with how you wrote it. There is no way for me to confirm but most likely this is what happens when you turn in a coding test. Someone who is perhaps at a debatable senior level looks at your code and often (I have seen this happening at places where I have worked) gives it to someone else for their feedback. The person your code gets handed over to is often not the person who will make hiring decision. He/she will look at your code and try to discover their own style in your code. If your code does not come close to the way they would have written it then it is bad code.

A lot of things come into play here. Often it is unclear expections. I have done coding tests where the requirement was to pull data from a dataset and cache it in memory. This requirement can be met in many ways. I chose the simplest one but the feedback I got was similar to what you got. It totally depends on where the reader of your code is in the evolutionary stage [https://medium.com/@webseanhickey/the-evolution-of-a- softwar...](https://medium.com/@webseanhickey/the-evolution-of-a-software- engineer-db854689243)

Reading code is harder than writing.

</comment><comment><USER9> 1\. When your comments are longer than your code, either you're putting in too many comments, or your code is too hard to read. (The former seems to be the case here.)

2\. Why is the spacing convention all over the place in some files? [https://github.com/m4nuC/memGame/blob/master/app/controllers...](https://github.com/m4nuC/memGame/blob/master/app/controllers/ScoresController.php#L10) [https://github.com/m4nuC/memGame/blob/master/app/database/mi...](https://github.com/m4nuC/memGame/blob/master/app/database/migrations/2014_07_03_144443_add_high_score_table.php#L13)

3\. Why are there so many folders that only have .gitignore's inside them? In fact, why are there so many folders at all?

4\. In my glances at some of your files I didn't find a single function with a lot of "meat" inside it, so it doesn't show much about your ability to write something that actually does something.

<comment><USER10> > 1\. When your comments are longer than your code, either you're putting in > too many comments, or your code is too hard to read. (The former seems to be > the case here.)

I hate this meme. There's nothing wrong with too much commentary. You are not on a comment budget. Please stop spreading this around, like the "rewriting is always a bad idea" meme that's embedded itself in young developers like dogma even though Spolsky's point is up for debate. Atwood is wrong about this one, too, and I hate that Spolsky and Atwood have so many "rules" of programming that people pass around.

I've seen this meme borne out via comment ratio rules in style guides. That's ridiculous. We all work in editors that make comments a different color. I use light gray. My eyes can look right past them, but if I want the paragraph or two explaining the algorithm I'm looking at, it's there. The underlying flaw in Atwood's claim is that it is possible to write code in a way that is self- evident to every reader. You do not know every reader.

Well-written commentary -- bordering on literate programming -- makes development much better. Even better if the code is the documentation. I don't know where this notion that we must conserve comments like water came from, but I'd be happy if it just stopped.

Note here that I'm addressing _quantity_ , not _quality._ I feel that is important to clarify.

<comment><USER9> I think you might've misunderstood what I'm saying. It's perfectly fine to have complex functions commented as much as necessary; heck, it's totally fine to have your comments be 100x as long your function when the function is _actually_ hard to understand.

What's _not_ OK is commenting _ALL_ of your code, especially not to such an extent where the comments are actually longer than the code size _on average_. (!) Some stuff just _has_ to be self-explanatory, period -- that's a fact, not a meme. If you can't make the simplest code self-explanatory, then I'm sorry but you simply _can 't_ code as well as someone who can. And if you're going to comment _everything_ , then you're also wasting valuable time that someone who didn't need to do so would've spent writing actual code and getting more done.

<comment><USER10> I understand what you are saying perfectly, but you typed "you are putting in too many comments" as a possibility, full stop. All of that context you just painted for me is not in your comment. That's how "never rewrite because rewriting is bad because reasons" gets started.

And absolutely I think commenting all your code is okay. I honestly wish literate programming had caught on.

<comment><USER9> Well, quantity can be measured in different ways. I didn't say "your (individual) comments are too long"; I said "you have _too many_ comments" (aka the total length of your comments is comparable to the _total_ length of your code... i.e., your source files are on average more comments than code). Too _many_ comments (even short ones) is generally bad; they make the code _harder_ to read, not easier. A few long comments are generally good. I feel like you were addressing a different point than I was making.

<comment><USER10> > Too many comments (even short ones) is generally bad;

That's exactly what I'm refuting, so I'm not sure why you keep talking past me. I am speaking to the crazy notion that there is a par for the comment golf course, and we all have to be Goldilocks as we write software. I don't know where that started, but I'd love it if people stopped judging software based upon the non-executable portions.

A line before every line? Maybe. Are they comments of quality? I've put a comment on every line of assembly before as a postfix. There is no hard and fast rule on this, and I wish people would stop trying to make one.

Again, literate programming. I feel like you're missing how serious I am about this by overlooking my repeated love for it.

<comment><USER9> Well in that case, there's nothing crazy about it. If I can hire someone whose code is reasonably self-explanatory vs. someone who puts comments all over their code (whether or not it's self-explanatory), I'm certainly _not_ going to choose the second one over the first one, not sure about you.

<comment><USER10> You just said if I took the same self-explanatory code and added comments to it that you deem unnecessary you'd no-hire me as a result. And yes, that is absolutely crazy, and has been my point throughout this entire thread.

Please do me the respect of researching literate programming before attempting to extend this thread, because I can tell you're unfamiliar, just based on how many ways you're trying to slice and dice a chink in my opinion on this.

<comment><USER9> Notice I never even mentioned the phrase "literate programming" when responding to you? It's because I'm not trying to debate programming philosophy here, I'm trying to address a practical/immediate concern of the OP. I can debate with you day and night about what programming methodology is best, but that's _not_ what the question here has been about, and I'm doing my best not to divert the discussion into a different direction.

The debate has been about why the OP's code was considered poor by the employer, and I think putting too many comments might have been such a reason. Whether or not you think putting too many comments is good or bad is orthogonal to whether or not it might have been a reason for rejecting the OP as a candidate. _I_ think it's a reason for avoiding hiring the OP (see my previous discussion about productivity and wasting time writing comments), and whether you feel it's actually _justified_ by some "good" coding methodology is orthogonal to whether or not the employer might have used the same rationale as me, and that's all I'm trying to address here. If you feel the employer's rationale was unjustified or crazy, then so be it; that doesn't mean the employer couldn't have had this thought process anyway.

<comment><USER10> This entire subthread for 45 minutes, me talking to you, has been me talking about programming philosophy with you. OP left my mind on this a long time ago. By your examples, I felt like you were coming along with me (two arbitrary candidates, for example), so I don't even know what we're doing here.

We're not on the same page here, clearly.

<comment><USER9> Sorry?

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER11> Without seeing the prompt they gave you and not knowing the context you would have gained from the technical interview, we're all just guessing here.

My guess is that they were expecting a much simpler application for a simple problem. Also for a JS game with a tiny backend, the Github project code is heavily weighted toward PHP (73% PHP vs 20% JS). Perhaps in their internal discussions, a word like "over-engineered" was brought up.

I'm not saying that it's bad code. It looks fine to me.

Other point is that the technical interview is a time to ask questions for the interviewee (when they allow). What is their development process? Do they iterate and prototype a lot, or is their process closer to waterfall? Assuming their stack is primarily PHP, do they use a framework? Do they follow MVC? Do they use a JS framework? Etc... Having known the answers to these questions would have helped you create an application that looked closer to their comfort zone. (Even if you don't know a coding test is coming, you still should want to know the answers to these questions so that you can know if you are getting into a situation where you might have to maintain old applications written in PHP 4, for instance.)

<comment><USER12> It's clear that their stack is not PHP from honestfeedback's comment about not being familiar with composer (though really composer does not require sudo if used properly). From briefly glancing at the code, I also think it looks fine and for a one to two hour project, IMO, is way more than any company should expect. I agree that knowing the answers to these questions is crucial regardless of coding tests, but an interviewer who can't judge code that's not in a familiar format (MVC, framework, etc.) is a junior developer and shouldn't be judging any code.

I hope the OP finds a job someplace where his skills will be appreciated, a place that doesn't ask for free work. Sounds to me that they were really too lazy to look at the whole application or didn't have the technical know-how to understand an application written in frameworks they were not familiar with.

</comment></comment><comment><USER13> Assuming you did this in a day or less I think your prospective employer kind of missed the point of the exercise. Turning out a (fairly well put-together) working prototype in this timeframe shows that you _can_ code, your first-pass level of quality, and that you know how to prioritize.

The output of this project should have been a starting point for further discussion. Instead what you describe tells me the company you interviewed with is probably a "one-pass" (it's expected to be perfect the first time) shop and likely have loads of technical debt. Competent software shops understand the long term nature of development and the tradeoffs involved. They missed an important opportunity to learn about your true depth and ability to work with others by not having you do a paired refactoring of some aspect they didn't like.

Just as people are often bad at being the _interviewees_ people can be equally as bad (or worse) _interviewers_. There are loads of jobs out there for you. Don't let things like this discourage you.

</comment><comment><USER14> I briefly took a look at the code and I'll help you out with some honest feedback (I've hired before).

The problem looks like it's on the frontend, mainly. It doesn't look like you're leveraging a framework (instead manually munging the DOM), which suggests unfamiliarity with modern framework-based frontend development flow (this may or may not be true).

Regarding the backend, it looks like mainly PHP framework copy-paste. I suspect if someone has a vendetta against PHP (I don't, but some do), that might be a black mark.

If I were to summarize this code, it looks like it was written by someone who can competently hack together a web app on their own, but doesn't have much experience with working on a modern dev team.

I have no idea if I'm right. Just offering an employer's perspective.

<comment><USER15> With all due respect, it's a memory game, not a large-scale web application. I don't understand why "frameworks" are the answer to everything these days. There's nothing wrong with interacting directly with the DOM, especially for something like this.

<comment><USER5> Perhaps framework was the wrong choice of word. I wouldn't call jQuery a framework, but it certainly would have helped. A library like Rivets.js or similar would have been great to see as well, since at that point there'd be (close to?) 0 manual DOM manipulation required (thus obviating the need for jQuery), and he could still keep the page weight easily under 10k.

<comment><USER15> But what's the point? These days, there's not a whole lot jQuery does that can't be done easily with vanilla JavaScript. Would you rather hire someone who can write lean code with minimal dependencies or someone who throws in whatever library is getting the most buzz "just because"?

<comment><USER5> I'd rather hire the guy who writes the most maintainable code. jQuery is hardly a "buzz" library, and in this case, using it certainly wouldn't be "just because". It's been the industry-standard method of non-trivial DOM manipulation for _years_. If he included Angular or Ember or some other nonsense, then I'd be concerned for the exact reasons you stated.

</comment></comment></comment></comment></comment><comment><USER5> I've never hired anyone, so take my thoughts with a bucket of salt, but one concern I'd have is that there's just way too much code here. There only needed to be one or two PHP files for the whole app (assuming you were supposed to use PHP in the first place). If they're not a PHP shop, they likely look down on PHP with severe disdain (as many do) and so this may have led to some premature judgement.

Drawing the grid with Javascript wasn't necessary at all: that could have been pure HTML/CSS.

No use of jQuery is probably a red flag - not that it's inherently bad to avoid jQuery if you don't need it, but using it would have made your code substantially cleaner/easier to maintain. If a quick and dirty project like this is your assignment, I'd be a little concerned if you didn't install a tool that would help you complete it as quickly as possible - especially one that's (for better or worse) pretty much a given on any project that involves Javascript.

Finally, while I understand that you may not be a UI designer, there's a pretty severe lack of polish on this interface. Part of being a full-stack developer is being a front-end developer; part of being a front-end developer is some sense of design; and part of being a "senior" full-stack developer is being able to set a strong example across the entire stack (including the front-end). The arrow keys for navigation was a nice touch on the interaction side, but visually it was amateur hour.

I'm not a strong PHP developer so I won't speak to your back-end skills, but hopefully this has given you some perspective on why they made the decision they did. For what it's worth, I agree with their feedback. I know that's hard to hear, but just pick yourself back up and keep getting better.

In the mean-time, I suggest applying for lower-level positions. Find somewhere that will provide a good learning environment, alongside some strong senior developers that can mentor you without expecting you to perform at a senior level. Then, in a few years (or months if you're a quick study), get back on the horse and apply for some more senior positions. You'll get there someday.

</comment><comment><USER16> This whole interview practice seems a bit odd to me. Does anyone else out there give these types of "Homework" assignments to candidates after they've already been through HR and tech interviews? If I gave out an assignment like this at all, I'd be inclined to give it before the on-site interview as a pre- screen. I thought the whole point of such a thing would be to screen out people who can't code at all before they take up valuable man-hours interviewing, with a secondary goal of creating discussion material for a technical interview. Assuming it doesn't completely suck, I'd use part of the technical interview to discuss various aspects of the solution - the merits of frameworks used, tradeoffs of design decisions you made, what would you need to do to scale to 1M users, where are the potential performance bottlenecks and security challenges, etc.

Doing it like this makes me wonder if their real motive is something else. What are they really trying to determine with this sort of test at this time? They do it at a time where there isn't much opportunity to discuss the result, so what's the real goal? Whether, without prompting, you used their favorite language/framework/database and happen to have the same coding style as them? Seems pretty silly to me.

Did you get any possible feeling that maybe they have some hidden or political reason for not wanting to hire you, and threw this test at you as a way to create an excuse for why they won't hire you? That would explain why they gave it after the interviews and don't seem to be interested in discussing why it doesn't meet their standards.

<comment><USER17> We always give some sort of programming test, usually a dumbed down version of a problem we've recently solved ourselves. You shouldn't have to spend more than two hours on it, if that. Most of the time our applicants say they spent less than an hour on it. It also weeds out a non-zero number of people who aren't really super interested in the position.

<comment><USER16> That sounds fine; it's more a question of the timing. I'm guessing you give your test before the in-person interview? That would make a lot more sense to me than doing it after, which they apparently did to OP.

<comment><USER17> Yes, it's usually "homework" (i.e., send us your resume and your code sample at the same time). I have a "problem solving" task where I expect you to bang out an algorithm (as opposed to code) for the in-person interview. That's mainly just so I can watch you think out loud.

I can teach you my project's programming language... I don't have time to teach you problem solving basics.

</comment></comment></comment></comment><comment><USER18> You seem like a sharp developer who shouldn't be spending your time doing bogus homework in today's market. Out of curiosity, whereabouts are you located?

<comment><AUTHOR> Thanks. I am a French expat in Hongkong

<comment><USER18> Cool. If you wind up in southern California hit me up.

</comment></comment></comment><comment><USER19> I see a disconnect between balance of dependencies vs. the minimum required to yield the target result. A lack of focus on the thing you are trying to show... coding skill/efficiency around the game problem. The tight piece should be a great set of game code. I see, which I see a lot when I see IoC for small jobs, inversion of focus. Lots of ceremony yielding a loss of clarity.

You know laravel. You know about libraries and can use them. It's less clear that the code you wrote was good. It's sort of buried in a fair bit of noise.

You won no favors by requiring an install of the nature you have and fumbling that a bit as well (chmod 777).

The other thing is... you can't trust a potential employer's reason for saying, "No." They said it, but you don't know if the message is garbled by the HR rep or even a flat out lie because the short answer is, "No." and they don't want to spend time explaining themselves.

They decided and moved on. They are not invested in your future. Coming here for feedback is a good practice. We care about you and have few reasons to just let you know, "No."

Soooo many dev job fish in the sea. Get your line back in. Your bait is fine.

</comment><comment><USER20> It only means they didn't deserve you. I have gone through a few interviews of this nature off late. Given the, timelines(and technology limitations) they give you to complete the assignment and return it to them and managing a day job with family, frankly speaking I had to slog through whole nights for sprints of 3 days. For nearly a month for various interviews.

At the end some companies appreciated it and some just plainly gave a very discouraging feedback.

If you can't appreciate a person who can deliver your requirements with 100% features covered and well tested to the point without wasting any time on clarifications, under crippling timelines- Then clearly you are looking for men from an another planet.

You must just wish those companies all the best and move on. They are ultimately going to hire some career cup scraper any way.

</comment><comment><USER21> Eh. These things are highly subjective. Seems competent overall: I'm not wowed, but these types of assignments are, as you surmised, about establishing baseline competency.

Some thoughts for the future:

1) PHP was a bad choice; some people have a burning, irrational hatred for it, and it leads them to judge your work in the harshest light instead of an evaluative one.

2) Speaking of burning irrational hatreds: PLEASE DO NOT MIX TABS AND SPACES. Drives me nuts--I would have dinged you for that. Not enough to make me say it is "falling far short of senior developer standards," but it makes me question your habits of development.

Tests are always nice, too: they're like the anti-PHP, and give a great deal of bang for buck in terms of coloring people's impressions of you.

<comment><USER22> (Note: the following is not criticism directed at _you_. I'm merely using your comment as a springboard for commentary about the industry on many matters you also show you are aware of.)

 _These things are highly subjective._

Yes.

 _leads them to judge your work in the harshest light instead of an evaluative one_

Should any professionals have to present apologetics for others in his procession doing such a thing? We are all human beings, but shouldn't we be _trying_ not to be this quickly and arbitrarily judgemental?

 _Speaking of burning irrational hatreds:_

Somehow the social expectations of the programming profession are that we can get away with acting these out.

 _PLEASE DO NOT MIX TABS AND SPACES. Drives me nuts--I would have dinged you for that._

Yes. This can be problematic. The fact that it is still problematic after all these decades is a good indicator of how backwards we are as a profession.

If you look at the various analyses answering the op as detection of signalling -- well, it's all about signalling. I'm not so sure this is too much more substantive than an interview where you need to have the right school name on the right degree and a properly pressed suit.

<comment><USER23> >> leads them to judge your work in the harshest light instead of an evaluative one

> Should any professionals have to present apologetics for others in his > procession doing such a thing? We are all human beings, but shouldn't we be > trying not to be this quickly and arbitrarily judgemental

Well sure. But this is php we're talking about here.

<comment><USER22> _Well sure. But this is php we 're talking about here._

I'm not sure this is any more substantive than an interview where you're supposed to have the right names on everything and show up in a pressed suit.

</comment></comment></comment></comment><comment><USER24> All the other comments so far are valid, but I have something else to add - did they indicate a time frame you had to have it done by, and did you use all of it? Because they may not have been looking for fast turnaround time, they may have been looking for quality.

In the future if you get something similar, you may want to ask what they're looking for (gathering requirements, you might say), and optimize accordingly. Ultimately, it may be completely unrelated, but I've had both kinds of coding tests, ones where I had an hour and had to cut corners as such, and ones where I had an entire weekend and was explicitly told to make it production quality, whatever I felt that entailed.

</comment><comment><USER25> Agreed w/ honestfeedback.

\- Overall project structure seems a bit unorganized IMO (no centralized build process, gulpfile inside subfolder). Overall this makes it fairly hard to dive right into the project. It might be my lack of experience in PHP project structure.

\- I think pulling in a server & a db might be an overkill. Local storage will do the job perfectly.

\- Mix of tabs & spaces is also very messy.

\- Styling is pretty sloppy too I believe. No clear organization/reusability in the stylesheets.

\- Vendor scripts/generated scripts should not be committed to the repo IMO. There're already bower & CDNjs & a bunch of other services.

\- Your JS is also very module/singleton-based although some of them are clearly object-oriented. Also seems to be a mix of jQuery usage & DOM directly, why not 1?

I think what they're looking for is a couple of simple JS that's easily tested, maintained & expanded which IMO is more important for senior candidates. Less senior ones can always bang this out quickly but senior ones care way more about other attributes of a project than just getting it done asap.

<comment><USER26> > \- Overall project structure seems a bit unorganized IMO (no centralized > build process, gulpfile inside subfolder). Overall this makes it fairly hard > to dive right into the project. It might be my lack of experience in PHP > project structure.

This was what I noticed the most - and I can easily see this as a big part in the discussion, since seniors should lead and bootstrap projects.

I'd have expected something like ./server and ./client and a README toplevel, client eventually having a public folder which can be served as-is (i.e. doesn't contain any build/dependency management files), potentially with a second public-minified around. Instead I end up with a src-folder hidden like 3 folders deep and another one toplevel for asymmetry.

Beyond that, the folders in the php app follow the package-by-kind antipattern. There is no value in grouping all controllers in one place. There's value in grouping all the highscore handling in one place, though.

</comment></comment><comment><USER27> When developers assess the code of developers, the assessments can often be entirely arbitrary and utterly meaningless. It's one of the worst possible ways of assessing people because almost no-one does it in a scientific, quantifiable way at any level. The assessments are purely subjective.

</comment><comment><USER23> FWIW instructions dictate "1) Use directional arrows to select a card. 2) Use "Enter" or "left click" to flip a card"

In the demo I can use arrow keys. But only left click can flip a card. [enter] does nothing (using Chrome Version 35.0.1916.153 m on Windows 7).

If they tried it and it failed (and if they had a big pile of submissions to get through) this would've definitely counted against your submission.

\--

More generally, having looked at what this game actually does vs number of lines of code I would use one word to describe it - overkill.

\--

Let me add. It was very helpful of you to post this question. Informative (I hope) for you, but also for everyone else, as we contemplate what coding mastery is really about.

</comment><comment><USER28> Your game looks generally fine, they're being weird.

Is it possible that you misunderstood and they (a) wanted you to use a different language than PHP (perhaps because they're a Rails shop or something), or (b) wanted you to do this in pure JS, with e.g. localStorage?

Also, the block indentation/braces look deeply messed up on github, any idea what happened?

[https://github.com/m4nuC/memGame/blob/master/app/controllers...](https://github.com/m4nuC/memGame/blob/master/app/controllers/ScoresController.php)

<comment><USER29> > Also, the block indentation/braces look deeply messed up on github, any idea > what happened?

Combination of using spaces and tabs for indentation. Looks like it'd look fine with tab size set to 4, but it should of course only use one method of indentation.

<comment><AUTHOR> Yes it seems like it. Gotta find VIM script to catch those

<comment><USER30> listchars works pretty well. I have this in my .vimrc:

        set list
        set listchars=tab:>=,trail:~,extends:>,precedes:<,nbsp:.

Edit: you can also configure it to use one type of indentation. I use "set expandtab" so that my files are always indented with spaces.

<comment><AUTHOR> Thanks for that

</comment></comment></comment></comment></comment><comment><USER31> Thanks for posting this, the whole thread was a learning experience and congrats for having the guts to "Ask HN".

I won't really comment on the code but I think that the company could have come back with something like: "Hey, can you make this much smaller? with only minimal use of frameworks?"

An explanation like "Falling far short of senior developer standards" sounds like an absolutely pointless comment and I feel someone had a bit of a childish reaction when seeing the code (their comment could fit them just as well).

</comment><comment><USER32> The code didn't scream senior developer, but given the constraints it looks like you're an able developer and worth the time to at least interview.

Sorry for the bad experience, hope it turns out better.

</comment><comment><USER33> The key to all things is "Keep it Simple".

</comment><comment><USER34> >Run sudo chmod -R 777 app/storage.

Certainly opening up write access to everyone isn't going to win you any points.

<comment><AUTHOR> I would have made it 755 on my environment but I wanted to make sure the install work properly as I know this is often a friction point during install of Laravel

<comment><USER35> Then clearly you don't understand how to use your framework, or you don't understand how to run a webserver. Saying "I would have made it.. but..." is certainly not something i'd let fly in my dev team.

I've taken a look at your code and you do not appear to be senior-level material. You managed to turn a relatively small game into 40+ files and 15+ directories of mostly useless framework fluff just to make what appears to be a mostly-javascript game.

\- Trying to review your code, I have to navigate a nested tree of framework php and nodejs includes to actually discover what the heck is going on. \- Why do you need nodejs for development? That just introduces yet another framework to install and deal with packaging and deployment. Why not just stick to backbone or some other minimal framework tool in javascript? You're not even importing that much useful stuff to warrant using npm. \- You're doing a lot of manual dom manipulation which looks sloppy \- You've committed a minified css file

Maybe some of the code you wrote might be okay, but your choice of setup and prep for a project seems pretty junior. Get some experience working with veteran developers on more complex projects (i.e. not simple web dev).

</comment></comment></comment><comment><USER36> I'm trying to figure out how much effort went into this. I ran cloc, and here's what I got:

      </comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>--
      Language                      files          blank        comment           code
      </comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>--
      Javascript                     1803          66480          85484         423029
      HTML                             57            847             79          20374
      SASS                             19             21              8          12114
      C++                              38           1011            763           7700
      C/C++ Header                     45            816            713           5165
      CSS                              16            133             27            777
      PHP                              36            330           1048            597
      CoffeeScript                     14             72             44            326
      make                             13             91              3            255
      YAML                             39              8              0            227
      Bourne Shell                     16             49             42            197
      Python                            1             32              7            125
      m4                                1             12              0             61
      Bourne Again Shell                5             15             16             38
      XML                               1              0              0             18
      Ruby                              1              0              2              4
      </comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>--
      SUM:                           2105          69917          88236         471007
      </comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>--

Most of this is obviously third party code, but it looks like you wrote thousands of lines of PHP, plus a bunch of frontend code?

I'm not a web developer, but this seems like a day or two of work? That seems unreasonable to me, and I probably wouldn't have agreed to that level of commitment, especially if they were still interested in me after an interview.

Side note: in the webdev world, is it normal to have third party code mixed with stuff you wrote yourself? In C++ land most of the third party stuff would have gone in a contrib directory or something before being built into a library of some sort.

<comment><USER37> TIL about cloc! Thank you good sir. It seems as though this is because he had node_modules checked into source control on the frontend part. npm basically likes to download the whole internet when you run npm install, so these stats do not suprise me. Checking in that directory is generally discouraged, but its possible he wanted to avoid adding the node dependency in order to ease installation.

<comment><USER36> You are correct. Here are the revised numbers after excluding public/scripts/node_modules:

      </comment></comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>-
      Language                     files          blank        comment           code
      </comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>-
      PHP                             36            330           1048            597
      Javascript                       9            101             86            362
      SASS                             6              4              4            127
      XML                              1              0              0             18
      CSS                              1              0              0              1
      </comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>-
      SUM:                            53            435           1138           1105
      </comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment></comment><comment>-

</comment><comment><USER38> Personally, I'm impressed by your work. These folks are missing out.

<comment><AUTHOR> Thanks Adriand, much appreciate.

</comment></comment><comment><USER35> Can you let us know what company this is?</comment>


OXO, Crooks and Robbers? - <AUTHOR> http://www.oxo.com/quirkyresponse.aspx <comment><USER2> Aside from the "Some important lessons" section (which seemed very patronizing, although OXO seems to be in the right here considering the expired patent aspect), it seems that OXO handled themselves pretty well. It pointed out Quirky's side of things, and then presented their own side. With quite a bit of citation where appropriate.

Quirky[1] went straight for the "justice" aspect in their post without presenting much info or even a cursory discussion of related patents.

[1] [http://www.quirky.com/blog/post/2013/01/rise-up-quirky- seeks...](http://www.quirky.com/blog/post/2013/01/rise-up-quirky-seeks- justice-for-bill-ward/)

<comment><USER3> I actually loved that part. Even better was showing the many obvious quirky rip-offs from OXO products.

Very gentleman like response and correction, well done OXO.

<comment><USER4> Both companies end up winning here, for different reasons. OXO is the voice of reason that calmly explains what's what while Quirky looks like the protector who goes to bat for their inventors and community.

<comment><USER5> To me, Quirky looks like the crazy person who escalates in a big way without even bothering to talk to the supposed wrongdoers. Not someone I want to do business with.

<comment><USER6> My thoughts exactly. They also look like hypocrites and thieves. They should be ashamed of themselves.

</comment></comment></comment></comment></comment><comment><USER7> Digging deeper into the "protest" linked from the OXO site: [http://www.quirky.com/blog/post/2013/01/rise-up-quirky- seeks...](http://www.quirky.com/blog/post/2013/01/rise-up-quirky-seeks- justice-for-bill-ward/)

And the whole thing feels cheap and desperate. I like the idea of being scrappy and unorthodox, but one corporate entity protesting another? It just smells terrible.

<comment><USER8> What feels even cheaper are the public protesters (assuming they are in fact real unpaid people). It's bad enough when people go all frothy over iOS vs Android, but over household product brands? I mean time to re-evaluate your priorities people.

<comment><USER9> I think the protestors were just the company staff, who took the day off to participate in a publicity stunt.

<comment><USER10> "That's exactly what happened ... Quirky staffers took to the streets to protest ..."

</comment></comment></comment></comment><comment><USER11> I don't care about the rivalry between two companies producing similar products... but this line really hit me hard:

> Ideas are limitless and patents expire for a reason: to encourage > competition, innovation, and the evolution of new ideas that ultimately > benefit the end user. If patents never expired, we would have only one car > company, and the cars they develop would likely not be readily available and > affordable to so many people all over the world. Imagine that.

Good show.

</comment><comment><USER12> OXO has ~100 people. The parent company has a market cap of 1.6B (including Pur water filters and a few other brands). Quirky has ~80 people and $91 million in VC funding. Assuming Quirky is operating under the normal VC rules, they want to soon be a billion dollar company - larger than OXO.

I find it strange that Quirky is playing up the "david vs goliath" angle. If you've been in both of their offices, Quirky actually feels like they have more money.

More importantly, if Quirky wants to be a billion dollar company, they are going to have to do something a whole lot more innovative than a better dust pan.

<comment><USER13> _> OXO has ~100 people_

The crazy thing is that they make eight and a half different products per employee. When you think about the fact that you're talking about physical products, that's crazy.

<comment><USER14> Indeed, and decent products at that. I've enjoyed all but a few of the OXO products I've bought, which is more than I can say for a few of the Quirky products I've bought (pivot power for one).

</comment></comment></comment><comment><USER9> OXO is one of my favorite companies. They seem to have the same quirky creative culture as much of the tech industry, except maybe even friendlier, plus a great design philosophy.

<http://www.oxo.com/AboutOXO.aspx>

<http://www.oxo.com/UniversalDesign.aspx>

<comment><USER15> I was just really confused. Is it or isn't it the same OXO who have been producing stock cubes since the 19th century (and built the highly-visible OXO tower in London)?

On searching, it appears not to be, and the US OXO brand was 'invented' in 1990.

<comment><USER9> Hah, yeah, no relation to the famous OXO cubes.

</comment></comment></comment><comment><USER16> I found the Broom Groomer on Quirky's site [1], and what do you know?--the product description says, _Patent pending_. Well, that must mean there's a patent application in the USPTO system! Sure enough, Quirky's patent application, dated September 7, 2011 (provisionally filed April 18), titled _Waste receptacle_ [2]. Bill Ward is one of the inventors. I am not qualified to judge this patent against the one mentioned by OXO, so I invite others to compare the two.

[1] [http://www.quirky.com/products/36-Broom-Groomer-Broom- Cleani...](http://www.quirky.com/products/36-Broom-Groomer-Broom-Cleaning- Dustpan)

[2] <http://www.google.com/patents/US20120260453>

<comment><USER17> Patent pending or not, there's clear evidence of prior art, and the patent will most likely be rejected. I can file a patent on about anything from the wheel on up, and for the period between filing and rejection, I can claim that the wheel is patent pending - it still doesn't give me much further protection.

<comment><USER18> Apparently, Bill Ward earned $15k for re-appropriating a design from 1919.

[http://www.quirky.com/products/36-Broom-Groomer-Broom- Cleani...](http://www.quirky.com/products/36-Broom-Groomer-Broom-Cleaning- Dustpan/timeline)

<http://www.google.com/patents/US1315310>

<comment><USER19> Did he put silicone prongs on it?

That seems like a really bad idea. Silicone rubber is high friction - it's going to make cleaning the bristles hard work. And cleaning the prongs is going to be hard.

</comment></comment></comment></comment><comment><USER20> I've been in the tech industry for too long. The first few times, I read "Quirky" as "Quirk.ly".

That said, this sounds insane to me. Why would you spend money going to war with a competitor over such a trivial matter? ("OXO copied a patent that we also copied. Help, help, I'm being repressed.") Only to lose in the end? I don't get it.

One other observation: excellent application of Betteridge's Law of Headlines.

<comment><USER21> > Why would you spend money going to war with a competitor over such a trivial > matter?

I think the Quirky people genuinely thought they were ripped off. They wanted to be seen as the small company of inventors being ripped of by a much larger company. Unfortunately, they lacked enough introspection to realize they have done worse, and now they look like hypocrites.

<comment><USER20> Do attack ads ever work, even if the facts are accurate?

(All I can think of are Microsoft's attack ads against Google, or Apple's "Redmond, Start your Photocopiers" ad. Wouldn't that money be better-invested in improving the product?)

<comment><USER22> Were you paying attention during the 2012 US Presidential elections? Do those count?

<comment><USER21> In politics, attack ads work well because if it causes someone to stay home it is a win. In business, negativity can damage the entire segment enough that both sides lose. Imagine if Coke and Pepsi accuse each other of selling "poison for idiots", then people will quit drinking soda altogether. Politicians don't have to consider this dilemma.

<comment><USER23> This isn't so much "in politics" in general, as "in elections in systems which have features which strongly reinforce duopoly"; in a duopoly, getting people to stay home or to dislike the target slightly more than they dislike you for the negative attack is a "win", but in systems where driving people away from one target (whether they stay home or actively vote against) with negative ads can fail to increase your share of the vote actually cast (because there are more meaningful options than vote for target, vote for attacker, or stay home), the incentives are different.

</comment></comment></comment></comment></comment></comment><comment><USER24> I had the pleasure of meeting the father son team that started OXO a few years back. Their story is very interesting, they started out redesigning the carrot peeler, and look where they are today.

Side note: I ordered a bunch of stuff from quirky the first time I saw the site and almost all the the stuff I got is really complete crap.

</comment><comment><USER7> This makes me adore OXO even more than I did before. Very human response.

</comment><comment><USER25> I love that fact that the other company was actually recycling an idea from 1919 and thinking they were onto something new.

</comment><comment><USER26> Seems to be the both OXO and Quirky are acting in good faith here, and Quirky just went completely of the reservation instead of even considering they may be wrong. I can understand how this could happen, for instance if OXO's initially didn't take Quirky's case seriously enough to give it a decent response like they're doing now.

The ball is in Quirky's court now. If they have any shred of decency they will at the very least admit that they completely overreacted and that the case is more complicated than they claimed.

I don't expect that though. There is something horribly "off" about the lame way Quirky dressed up a PR stunt like genuine protest, the kind of people that do that are not the kind that are likely to admit mistakes.

<comment><USER19> They've riled up the Quirksters though - how do they back down and keep the forums calm?

</comment></comment><comment><USER27> I freaking love OXO products. Why? When you browse the kitchen utensil aisle at target you have a choice:

Do you go for the cheap ass $1 dishbrush or do you splurge and get the awesome OXO brush? Time and again I think OXO does a great job at delivering a quality product that puts up to all the crappy abuse I dish out.

Most large corporations wouldn't even bother with an article like this. OXO is simply trying to stay true to their roots. I respect that.

<comment><USER28> > I freaking love OXO products.

As do I until I made the mistake of buying their kitchen timer which has one redeeming feature (many hours of timing - most are limited to 90 minutes) and sucks in every other way possible: buttons that don't work well, bizarre modes (clock, timer, expired timer, repeat last time) and a hard to read display.

<comment><USER29> It has a second redeeming feature: it has a numeric keypad for quickly entering times. Most digital timers don't, which makes them harder to use than mechanical ones that you twist. Most digital timers squander their potential, but oxo gets that one right.

The modes make sense to me, so I see those as a plus. I agree with you though about the hard to read display and the hard to press buttons.

<comment><USER30> Try the Pampered Chef timer - yes, it's a multi-level marketing company (aka pyramid scheme), but they make some good basic tools. I have one that I've been using on a weekly basis for 3+ years on the original battery, dropped frequently and still works.

</comment></comment></comment></comment><comment><USER31> Wow. A direct response with just the right amount of "snark" that's backed up by generous citation.

It's slightly juvenile, but you know what? Quirky swung first; they don't get to complain when somebody swings back.

Kudos to Oxo.

</comment><comment><USER32> Quirky got served. Must be shameful to work there this morning.

</comment><comment><USER33> It's a shame that Quirky would take to the streets like that. It comes off as childish and combative rather than as scrappy and willing to go to bat for their inventors.

<comment><USER34> It also comes off as a cheap publicity stunt (because that's what it is).

</comment></comment><comment><USER35> It's impossible for us to know all the facts of this dispute, but from the outside it looks like a childish move on Quirky's part, and a mature response from OXO.

</comment><comment><USER36> This seems pretty obviously a calculated publicity stunt. And it worked. I'd certainly never heard of Quirky before. Now I know not only who they are but that they stake their brand on protecting small inventors. That message will probably outlast any remembrance that they essentially smeared a beloved company. From that point of view, I say congratulations.

But OXO handled it brilliantly and turned it into a PR coup of their own.

<comment><USER37> I've heard of neither Quirky or OXO before reading this. Now I know that OXO make cool designed products, while Quirky are the sort of company I would rather not do business with.

</comment></comment><comment><USER38> Good marketing by everyone involved, honestly. Everyone wins!

</comment><comment><USER39> The Quirky CEO was on Jay Leno's show last night. Interesting.</comment>


Show HN: Read My Book Notes - <AUTHOR> https://www.readmybooknotes.com/ <comment><USER2> Thanks for sharing this!

I've always wanted to do something like this but find it to be too disruptive to my reading process. It makes reading feel more like work and less like fun.

Curious to know how you go about writing these out? Do you write them out while reading (say after a chapter or two?) or do you jot from memory after the read?

<comment><AUTHOR> I take notes using a Livescribe Echo pen as I am reading. It gets OCRd about 90% correctly. I fix the last 10% manually. The whole point of taking the notes is because I have a horrible memory :).

<comment><USER3> wow, I never heard of this Livescribe pen. It looks amazing, How well does it work? I love to scribble on paper but refrained from it as I want my notes in digital form and scanning or something like that would be too much hassle.

I always wanted to build something better for taking notes (many ideas from social, to comparing notes etc.), I think that could be very useful.

I wish at least the Kindle had an API to get my highlights out.

<comment><AUTHOR> The notes are scanned as an image, so everything depends on your handwriting. The image looks exactly like what you typed on the notebook. The scanning/OCR process to extract the text out depends on your handwriting. My handwriting is pretty bad, but I get 80-90% accuracy in the OCR

</comment></comment></comment></comment><comment><USER4> Always wanted to do something like this.

I thought 'ah nice there exists a service for it' and than 'ah no its just one blog'

But i still like it. It would help myself to browse over my own notes. i think i should try doing this instead of just thinking about it...

</comment><comment><USER5> I love the animation of the books as they turn, appreciate the time and effort this took to get working, let alone all the great reviews you have written!

<comment><AUTHOR> Thanks! Appreciate the kind words

</comment></comment><comment><USER6> This is a great idea! Would love a contribution feature, as I have some annotated notes from some books I highly regard

<comment><USER7> This! Annotation and discussion would bring a lot of value to this site! Would be awesome to be able to start a discussion (thread?) from a single note and drill down to the really specifics.

<comment><AUTHOR> I'll try and add support for comments soon. Thanks for the input.

</comment></comment></comment><comment><USER8> Thanks for this! These notes are incredibly useful and makes me want to read some of these books I haven't read before. It's also a great reminder of books I have read in the past and need a quick refresher on.

</comment><comment><USER9> Nice of you to offer both affiliate and non-affiliate links, though I wish everyone would click the affiliate links so you are rewarded for the effort.

</comment><comment><USER10> Is this a template or app I could use as well?

<comment><AUTHOR> I cobbled it together using GatsbyJS and one of the starter themes. The rotating book effects are from tutorials from [https://tympanus.net/codrops/](https://tympanus.net/codrops/)

</comment></comment><comment><USER11> Thanks!</comment>


Elm's Time-Traveling Debugger - <AUTHOR> http://debug.elm-lang.org/

<comment><USER2> A brief survey of time-travelling debuggers[1]. What [1] does not note is that it was _heavily_ studied in relation to Prolog in the late 80s and early 90s. Some very fancy shenanigans were possible including scripts watching variable bindings and actions. Some of this becomes evident if the Pancake bibliography is scanned[2].

It's exciting seeing the dream of the 70s come alive. :-)

[1] [http://jakob.engbloms.se/archives/1554](http://jakob.engbloms.se/archives/1554)

[2] [http://web.engr.oregonstate.edu/~pancake/papers/biblio/](http://web.engr.oregonstate.edu/~pancake/papers/biblio/)

</comment><comment><USER3> I'm a big fan of Chronon[1] for Java. Run a program and record everything about it. Use the same eclipse debug interface as always, but also have the ability to re-wind to an earlier point. Check out the state of any variable in the code, at any time. It knows about threads, can reproduce inputs/outputs, etc.

I believe it is now integrated with intellij as well.

No connection to the product, other than the fact that I paid for it. Unfortunately it doesn't seem to be very well marketed.

From what I recall (last few months I've been away from Java), you can't modify anything and re-run it (which Elm's debugger seems to be able to do).

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

<comment><USER4> I'm not sure about it, but AFAIR it comes for free for Intellij Idea Ultimate users.

<comment><USER5> Yes, it was added in 13.1. And only in the Ultimate version, as you mentioned. [http://blog.jetbrains.com/idea/2014/03/try-chronon- debugger-...](http://blog.jetbrains.com/idea/2014/03/try-chronon-debugger- with-intellij-idea-13-1-eap/)

</comment></comment></comment><comment><USER6> This is some incredible work. I am writing a game engine and Elm has been a major influence. I've written a functional reactive programming API, but I'm far away from having such awesome interactive debugging. Thank you, Elm, for the awesome software and providing such good learning material. I was struggling to understand FRP until I came across Elm's "What is FRP?" page. [http://elm-lang.org/learn/What-is-FRP.elm](http://elm-lang.org/learn/What-is- FRP.elm)

</comment><comment><USER7> At the Elm Workshop 2013 ( [https://www.youtube.com/channel/UCzbnVYNyCwES9u3dqYZ-0WQ/vid...](https://www.youtube.com/channel/UCzbnVYNyCwES9u3dqYZ-0WQ/videos) ) several interesting features like this one were demonstrated. Many of which were brought to proof-of-concept level in 1-3 man-weeks each.

<comment><AUTHOR> That was a really fun and inspiring workshop! If you are interested in concurrency in browsers, there were two interesting talks about that ( [https://www.youtube.com/watch?v=PBDJYkSwVFs](https://www.youtube.com/watch?v=PBDJYkSwVFs) and [https://www.youtube.com/watch?v=JQeqfSGc9q0](https://www.youtube.com/watch?v=JQeqfSGc9q0) ).

I'm hoping more people in the browser world come around to the idea that concurrency and parallelism aren't so tricky if you start with language design. Passing immutable objects cheaply between web workers would be a huge deal for projects like Elm!

</comment></comment><comment><USER8> If you're interested in this sort of code editing with live feedback of results, checkout Choc [http://www.fullstack.io/choc/](http://www.fullstack.io/choc/) \- a project we worked on earlier this year.

You can use vanilla javascript, step through the execution of each line of code, get a human readable description of what the line is doing, scrub constants, etc.

There's even a minecraft-like demo building a tower in voxel.js.

</comment><comment><USER9> One improvement that this has over most of the "conventional" reversible debuggers mentioned in the comments is the ability to instantly see the effect of your change over time. For example, with Mario example, after jumping up and down, you can adjust the gravity parameter to see what paths Mario _would have taken_ with different gravities and the same input stream.

<comment><USER2> I'm loathe to say with confidence, but you're right, that does seem to be a relatively novel contribution. It's certainly unusual!

I spent some time reading Hewitt's PLANNER paper recently. I am tempted to think that something drawing from his ideas on hypothetical explorations could be implemented for debugging (more than just numerical adjustments). But it's been a while since I reviewed the debugging literature to say with confidence if such a thing once existed.

<comment><USER10> Strobing and scrubbing, retroactive update have been done since the 70s. The problem has been scaling up beyond toys.

<comment><USER2> I'm not familiar with the strobing/scrubbing terminology. I don't think my memories have decayed _that_ badly. :-) I don't suppose you have a paper you'd mind linking to about this?

<comment><USER10> It is terminology that the live coding and live programming communities (well, at least Alex McLean and myself) are just adopting, and related to analogous capabilities in tools for video editing (like FinalCut Pro, AfterEffects). The terminology is meant to help us describe older work and the newer experiences like those illustrated by Bret Victor.

I use these terms a bit in my recent papers, but I don't go into much detail:

[http://research.microsoft.com/apps/pubs/default.aspx?id=2112...](http://research.microsoft.com/apps/pubs/default.aspx?id=211297)

[http://research.microsoft.com/apps/pubs/default.aspx?id=1898...](http://research.microsoft.com/apps/pubs/default.aspx?id=189802)

For the first paper, here is an annotated video that perhaps shows it better:

[http://youtu.be/xmWJsTTOvkU](http://youtu.be/xmWJsTTOvkU)

You would be correct in thinking they are hardly standard. Time travel is such a sexy term alternative that most people just use that, even if it isn't very descriptive.

<comment><USER2> _Programming with Managed Time_ takes an fairly novel approach to the semantics of time. I can't say that I've ever really run into a system very much like that before (my MS was on distributed debugging and I did a fairly deep dive into the history and literature).

Anyway, the strobe/scrub terminology I think is worth using, IMO. It describes it well. Time travel is pretty fun to say though. =)

ah well, it inspires me to continue on with my research. :-)

<comment><USER10> Nice that you like it. We will try to promote it more later with a web essay, many people on HN don't like reading academic papers. Good luck with your research, I'm also involved in some similar distributed systems work (I'm a PL researcher who works in a systems group).

</comment></comment></comment></comment></comment></comment></comment><comment><USER11> If you are interested in this, check Factor's toolchain it's a great environment.

See: [http://factorcode.org/](http://factorcode.org/) & [http://concatenative.org/wiki/view/Factor/Features/The%20env...](http://concatenative.org/wiki/view/Factor/Features/The%20environment)

</comment><comment><USER12> Is Elm production ready or is more of a hobby kind of project?

I would invest some time in learning this if it's good for production ready applications.

<comment><AUTHOR> The project is supported by Prezi with the aim of making it production ready ( [http://engineering.prezi.com/blog/2013/05/21/elm-at- prezi/](http://engineering.prezi.com/blog/2013/05/21/elm-at-prezi/) ) and all development effort is focused on that.

With the two most recent releases ( [http://elm- lang.org/blog/announce/0.11.elm](http://elm-lang.org/blog/announce/0.11.elm) and [http://elm-lang.org/blog/announce/0.12.elm](http://elm- lang.org/blog/announce/0.12.elm) ) it is really easy to drop an Elm component into an existing JS application, which we are experimenting with both at Prezi and in the general Elm community.

So I'd (biasedly) say to give it a try. Even if it's still too young for you, I think you'll come out of it writing way better JS :)

</comment></comment><comment><USER13> How does it compare to OCaml's time-travelling debugger? Is the feature set and the debugging experience basically the same?

<comment><USER10> There are about 50 or so time travel debuggers in existence. I want detailed comparisons now. Just joking.

Really, you can examine both systems and make your judgments. It's not like this is a paper with a comprehensive related work section.

<comment><USER14> Now? They are time travelling, I want a comparison _yesterday_.

</comment></comment></comment><comment><USER15> Is this a souped-up version of Visual Studio Ultimate's[1] IntelliTrace[2]?

[1] retailing for over $10,000: [http://www.microsoftstore.com/store/msusa/en_US/pdp/Visual-S...](http://www.microsoftstore.com/store/msusa/en_US/pdp/Visual- Studio-Ultimate-2013-with-MSDN/productID.284832100)

[2] [http://msdn.microsoft.com/en- us/library/dd264915.aspx](http://msdn.microsoft.com/en- us/library/dd264915.aspx)

<comment><USER10> More like live programming:

[http://research.microsoft.com/apps/pubs/default.aspx?id=1793...](http://research.microsoft.com/apps/pubs/default.aspx?id=179365)

[http://research.microsoft.com/apps/pubs/default.aspx?id=2112...](http://research.microsoft.com/apps/pubs/default.aspx?id=211297)

The former (2007) applies live programming to an FRP language; the latter is newer and supports imperative update along with time travel and retroactive update via a concept we call managed time. It is quite easy to do this with FRP, but harder to scale up to richer languages.

Videos are linked into the last paper (and embedded in the first...) but I haven't tried releasing a language yet.

</comment></comment><comment><USER16> How much overhead does this add and how difficult would it be to implement in another language like Python or even C? I imagine implementing it for an interpreted language would be much easier if you could save and recover states at any given point.

For example, in a project I just completed where we implemented Scheme in C, perhaps we could just memcopy everything and add it to a stack upon each expression evaluation (much easier in Lisp dialects since expressions are nested and you could 'edit as you go' by just changing an inner expression).

<comment><USER17> As they note in the section entitled "How Elm Makes this Possible", the design of the language lends itself to this feature.

Functional purity and immutability mean that functions can be evaluated speculatively, as demonstrated in the video where Mario's jump trajectory is altered as the gravitational force is weakened or strengthened. There is no need to save any state beyond the user inputs (mouse position and clicks, keys pressed) and the time at which they occurred. Once saved, they can be reevaluated safely (due to the purity and immutability), and live-modifying the code or adjusting the time is a simple matter of rerunning. It's a wonderfully designed feature, but the ability to implement with relative ease is a natural consequence of strict FRP.

In an impure, mutable, stateful language this would be quite challenging, and potentially dangerous. Given a line of code that spawns a thread, for instance, how would it be made clear that the inverse of this state is shutting the thread down? What if the thread has already modified shared memory - how will you track that? If you were to attempt to preserve the entire state of the running program (threads, open files, etc.), how would you quickly reproduce it upon modification?

</comment></comment><comment><USER18> Any resource in how made a debugger? This is a step where I can't find a simple explanation (ie: for a self-made language: how make a debugger for it?)

</comment><comment><USER19> intellij and many java IDEs do something similar with utils like mvl to change stack-history ,replay and to a minimal extent hot-swap byte-code in all standard-JREs. With JVMs like Zing , however a lot more of hot-swap seems possible!

</comment><comment><USER20> What is the limitation of this? I mean if I'm reading a text file that is a map, and I delete part of it, I'm guessing this is quite impossible to reverse debug correct?

<comment><USER7> The second half of the presentation vid (at the bottom of the page) is largely spent discussing limitations of the system.

<comment><USER20> Thanks!! I haven't had time to check it out yet.

</comment></comment></comment><comment><USER21> gdb already has had reverse debugging for 5 years. [http://sourceware.org/gdb/wiki/ReverseDebug](http://sourceware.org/gdb/wiki/ReverseDebug)

<comment><USER22> What's your point?

<comment><USER21> My point was that the first paragraph of the post is simply misleading.

Now that I understand Elm is an esoteric system and these results are irrelevant outside its solution domain, I don't really care.

<comment><USER17> Surely the fact that such a valuable tool can be implemented due to Elm's "esoteric" nature (not sure I agree) is of interest?

</comment></comment></comment></comment><comment><USER23> Seriously? This is essentially a static HTML page, why is it completely useless unless JavaScript is enabled?

EDIT: Useless meaning there is 0 content that can be seen. It's not that it's ugly w/o JS, there is nadda, zilch, nothing without it.

<comment><USER24> Because who made it decided he liked to do it with js instead of serving static html. There is nothing wrong with that. It's not an api, it's designed to be consumed by browsers. And browsers have js enabled by default and make it very difficult to disable it. It's a problem only for you because you willingly decided to browse in crippled mode.

<comment><USER23> > And browsers have js enabled by default

Not all of them. It's just disturbing that people move so far away from the basics for such simple tasks as static HTML. What about those with disabilities and use screen readers or braille displays? I guess the author doesn't care about the blind or those who choose not to execute arbitrary code on their computers.

<comment><USER25> Since Elm is a system for creating interactive, visual things that run on javascript... the author probably doesn't care about the blind or those who choose not to execute arbitrary code in this case. Why would he? They wouldn't be able to use Elm anyway.

<comment><USER26> Why did you mention the blind? Some can certainly create visual things [1] and run Javascript.

Having a limitation sucks at least two times, the first when you find you can't do something and the second time, after learning to do that thing, when people assumes you can't even try.

[1]: [http://www.armagan.com/](http://www.armagan.com/)

<comment><USER25> I simply quoted what GP said. (S)he stated that the author doesn't care about the blind, my argument is that the author doesn't _have_ to.

But you're right - I shouldn't have said that as I what I _really_ meant is that the author decided that the blog post working the way it works is fine for people who can run Elm and therefore one shouldn't really expect that he'd cater to others.

While I'm pretty far from _blind_ , I don't have all that great eyesight myself, so I can (at least the smallest little tiny bit) relate. I should have said what I said in the previous paragraph instead of what I said in my previous comment and I apologise. Thanks for calling me out on it.

</comment></comment></comment></comment></comment></comment><comment><USER27> What do you mean, "finally implemented"? I thought that Bret Victor himself was doing it using his own Tangle.JS library?

[http://worrydream.com/Tangle/](http://worrydream.com/Tangle/)

<comment><USER28> I believe they meant finally implemented in Elm. The title has since been changed to clarify.

<comment><USER29> Also, for what it's worth, Tangle is more of a DOM/UI binding library that you might use to build something like Elm's debugger into your own JS app.</comment></comment></comment>


Risk of coronavirus spreading in schools is 'extremely low' study finds - <AUTHOR> https://www.yahoo.com/news/risk-coronavirus-spreading-schools-extremely-194143983.html <comment><USER2> Of course, but we knew that weeks ago from various research studies.

This is why closing schools is an extremely poor idea. I suspect with the number of countries in Europe reopening schools, this will put pressure in the US on states still blindly refusing to do it despite all the facts.</comment>