{"action":"created","issue":{"url":"https://api.github.com/repos/npm/docs/issues/507","labels_url":"https://api.github.com/repos/npm/docs/issues/507/labels{/name}","comments_url":"https://api.github.com/repos/npm/docs/issues/507/comments","events_url":"https://api.github.com/repos/npm/docs/issues/507/events","html_url":"https://github.com/npm/docs/pull/507","id":124145815,"number":507,"title":"Correct history, and my name","user":{"login":"isaacs","id":9287,"avatar_url":"https://avatars.githubusercontent.com/u/9287?v=3","gravatar_id":"","url":"https://api.github.com/users/isaacs","html_url":"https://github.com/isaacs","followers_url":"https://api.github.com/users/isaacs/followers","following_url":"https://api.github.com/users/isaacs/following{/other_user}","gists_url":"https://api.github.com/users/isaacs/gists{/gist_id}","starred_url":"https://api.github.com/users/isaacs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/isaacs/subscriptions","organizations_url":"https://api.github.com/users/isaacs/orgs","repos_url":"https://api.github.com/users/isaacs/repos","events_url":"https://api.github.com/users/isaacs/events{/privacy}","received_events_url":"https://api.github.com/users/isaacs/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":2,"created_at":"2015-12-29T00:44:13Z","updated_at":"2015-12-29T14:18:55Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/npm/docs/pulls/507","html_url":"https://github.com/npm/docs/pull/507","diff_url":"https://github.com/npm/docs/pull/507.diff","patch_url":"https://github.com/npm/docs/pull/507.patch"},"body":"I like fame as much as the next CEO.  However, the facts of history are\r\nsuch that it's very hard for me to take sole credit for 'originally'\r\nwriting the module system.\r\n\r\nPrior to Node 0.4, npm 0.2 used to manage dependency hell with an nearly\r\nequally hellish rats' nest of symbolic links and JavaScript shims.  As\r\nlong as all your `require()`s were on the first tick, it worked just\r\nfine, but debugging was kind of a nightmare, and the abstraction leaked\r\nmore than anyone would've liked.\r\n\r\nThe module system itself (ie, `require` and `module` and `exports` and\r\nsuch) is the main bit of \"CommonJS\" that has survived to our modern age\r\nof JavaScript.  The most involved designers of that system, if I\r\nremember correctly, where Kris Kowal, Kevin Dangoor, and Kris Zyp.  I\r\nhad a hand in writing the implementation in Node.js, but it was just\r\ncoding to a spec.  That module spec was originally called the\r\n\"securable module\" specification, not because it was \"secure\" per se but\r\njust that it could in theory _be_ secured, given an appropriately\r\nsandboxed environment.  (NB: Node.js is not such an environment.  It is\r\ninsecure as all hell, but it's on the server side so you wrote that\r\ncode, so YOLO.)\r\n\r\nA month or so before the release of node 0.4, Ryan ran into an issue\r\nwith node_redis, and tried to track down the bit of code that was\r\nmisbehaving, and stormed into my office at Joyent with a head full of\r\nsteam.  (Plain old software devs at Joyent had offices with closing\r\ndoors back in those days.  The SF office was still brand new.)\r\n\r\n\"This is unacceptable\", he said.  \"There has to be a way to not have\r\nshims and symlinks all over the place.\"\r\n\r\nHe and I worked together to figure out a way that Node.js could meet the\r\nrequirements of avoiding dependency hell, without symlinks and shims,\r\nand I wrote the implementation, which he carefully reviewed and landed.\r\n(This was back when Node.js had exactly one committer.)  The result was\r\npretty close what we're left with today, minus a few clever performance\r\nenhancements that have come along since.\r\n\r\nSo, I'm happy to be credited as a significant/primary author, but\r\n\"originally written\" sounds like I did it all myself, which is\r\nincorrect.\r\n\r\nAlso, correct the spelling of my first name :)"},"comment":{"url":"https://api.github.com/repos/npm/docs/issues/comments/167798976","html_url":"https://github.com/npm/docs/pull/507#issuecomment-167798976","issue_url":"https://api.github.com/repos/npm/docs/issues/507","id":167798976,"user":{"login":"nexdrew","id":1929625,"avatar_url":"https://avatars.githubusercontent.com/u/1929625?v=3","gravatar_id":"","url":"https://api.github.com/users/nexdrew","html_url":"https://github.com/nexdrew","followers_url":"https://api.github.com/users/nexdrew/followers","following_url":"https://api.github.com/users/nexdrew/following{/other_user}","gists_url":"https://api.github.com/users/nexdrew/gists{/gist_id}","starred_url":"https://api.github.com/users/nexdrew/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nexdrew/subscriptions","organizations_url":"https://api.github.com/users/nexdrew/orgs","repos_url":"https://api.github.com/users/nexdrew/repos","events_url":"https://api.github.com/users/nexdrew/events{/privacy}","received_events_url":"https://api.github.com/users/nexdrew/received_events","type":"User","site_admin":false},"created_at":"2015-12-29T14:18:55Z","updated_at":"2015-12-29T14:18:55Z","body":"LGTM :+1:"}}