News for hackers. Stuff that matters.
Re:JavaScript Modularity Shaming by imslavko on Wednesday January 07, 2015 @04:14PM (#8853356)
Same people who shame other's work for not being modular enough for their taste, would worship a one-line module[0] that is modular down to every subroutine.

[0]: https://github.com/blakeembrey/is-upper-case/blob/master/is-...

Re:JavaScript Modularity Shaming by mattdesl on Thursday January 08, 2015 @12:08AM (#8855082)
To illustrate the problem: my dom-css module[1] needs a method to convert to camel case.

I could copy-paste from stack overflow, but I would have to maintain/test that function. I'd rather depend on something.

I could depend on a big "string-utils" library, but that would probably carry some useless baggage, and its scope may change or grow over time. Further, maybe it has a competitor module with a vehement following (like lodash vs underscore), which makes my module less appealing to them. This sucks for my module because I just want that one function.

The better alternative is just to depend on the exact, clearly named "to-camel-case" function which is very unlikely to ever change or grow in scope.

[1]https://npmjs.com/package/dom-css

Re:JavaScript Modularity Shaming by nostrademons on Thursday January 08, 2015 @02:05AM (#8855320)
If the to-camel-case function never changes or grows in scope, then you don't need to maintain or test it.

If it does change, then you need to integrate & test your dependencies, same as if it were part of your own codebase.

I think this point is often overlooked by the "I'll use someone else's code because I don't want to maintain it" folks. Code that is frozen doesn't rot: if you never change a piece of code and don't change its dependencies, it will continue working. Similarly, usually the reason you'd in-source a library is so you can change it at-will without getting some other maintainer to accept your patches. Most of the time, the effort that you save by using 3rd-party code is exactly equal to the time it would take to write & debug the library to get it to its current state, minus the time spent hunting for, learning, and integrating the library. Both of these are pretty easy to estimate when it's a one-line function; does it take you longer to find and npm install that one-line function than it does you to write a line of code?

Re:JavaScript Modularity Shaming by williamcotton on Thursday January 08, 2015 @08:21AM (#8856217)
There's a cohesive social element to "many small modules" that fosters a community.

Module authors work with and respect each other.

Most of the time, the effort that you save by using 3rd-party code is exactly equal to the time it would take to write & debug the library to get it to its current state, minus the time spent hunting for, learning, and integrating the library.

There are plenty of small functions that might be a little trickier than is first imagined. Time isn't the only issue. There's also much less cognitive overhead in the two minutes it takes to search npm, figure out the interface, install the module, and use it. I'd much rather outsource my yak shaving.

Re:JavaScript Modularity Shaming by mattdesl on Thursday January 08, 2015 @09:12AM (#8856397)
I wouldn't copy paste some random blog or SO code without first writing a test for it.

My dependencies already have tests, so I have no need to re-write them. When my tests do fail it is usually immediately clear where the problem lies since things are isolated.

In regards to time; it might take 1-2 minutes to find a module, and then 0 minutes the next time I need the same module. Compared to 1-2 minutes of writing/copy-pasting, a lot of time spent refining/fixing the code as edge cases are found, and then more time spent the next time that function is needed in another module.

This workflow has evolved through my own experiences with modules over the last couple years. I used to do a lot of copy-pasting and "kitchen sink" libraries, but now I find it much more efficient and better in the long run to isolate code. Just a few examples that would be a pain to maintain and rewrite in each project that uses them (potentially dozens):

https://github.com/bunnybones1/load-json-xhr/blob/master/ind... (was much smaller before edge cases!)

https://github.com/mattdesl/webgl-context/blob/master/index....

https://github.com/mattdesl/is-clockwise/blob/master/index.j...

https://github.com/mattdesl/point-circle-collision/blob/mast...

https://github.com/mattdesl/is-webgl-context/blob/master/ind...

https://github.com/mattdesl/lerp/blob/master/index.js

You also get the benefit of code that builds on its dependencies, like "lerp-array" which depends on lerp, and "line-circle-collision" which depends on "point-circle-collision".

https://github.com/mattdesl/line-circle-collision/blob/maste...

Re:JavaScript Modularity Shaming by jesstaa on Thursday January 08, 2015 @01:12AM (#8855213)
so you're just manually doing with a linker is supposed to do for you? I guess it goes along with manually doing what a scheduler does for you.
Re:JavaScript Modularity Shaming by mattdesl on Thursday January 08, 2015 @01:48AM (#8855286)
Linking functions; but also minimizing scope creep, API changes, opinionated libraries with a questionable lifespan, bit rot, and versioning woes (eg. a major change in to-dash-case may not represent a major change in to-camel-case).
Re:JavaScript Modularity Shaming by theverything on Wednesday January 07, 2015 @07:48PM (#8854383)
Re:JavaScript Modularity Shaming by gdi2290 on Thursday January 08, 2015 @01:17AM (#8855223)
you realize each one of those modules are download rank top 1% of NPM
Re:JavaScript Modularity Shaming by cmpb on Wednesday January 07, 2015 @04:49PM (#8853527)
That's intense and really quite silly. It makes sense to modularize large or complex (or some better modifier?) portions of the code base, but there's a point at which it just becomes too deep of a rabbit hole. I don't believe there is a formal definition of how deep down the rabbit hole that mark is, but I'm sure it would be a function of the module's (and the project's) size, readability and complexity.
Re:JavaScript Modularity Shaming by mkal_tsr on Wednesday January 07, 2015 @05:48PM (#8853870)
When the rabbits become turtles, you've gone too deep.
Re:JavaScript Modularity Shaming by vog on Thursday January 08, 2015 @06:42AM (#8855955)
Lewis and Fowler provide a nice definition in their Microservices article. [1]

They drive modularity through the pattern of change, so their judgement is based on the development, rather than the code itself.

"You want to keep things that change at the same time in the same module. Parts of a system that change rarely should be in different services to those that are currently undergoing lots of churn. If you find yourself repeatedly changing two services together, that's a sign that they should be merged."

Although that article is about services, believe it can be applied to any type of modules.

[1] http://martinfowler.com/articles/microservices.html

Re:JavaScript Modularity Shaming by geetee on Wednesday January 07, 2015 @05:46PM (#8853865)
I thought this was a joke library. Then I checked the NPM stats.

6,597 downloads in the last day

28,883 downloads in the last week

134,084 downloads in the last month

Re:JavaScript Modularity Shaming by brandonbloom on Wednesday January 07, 2015 @08:00PM (#8854433)
I thought https://github.com/ljharb/is-object was a joke too, but... 37k downloads in the last month. Here's the full source code:

    'use strict';

    module.exports = function isObject(x) {
      return typeof x === 'object' && x !== null;
    };
Frankly, copy/paste is a superior code reuse mechanism at this scale.

The part that really blows my mind? This project has had 57 commits to it! That's basically proof that the project management overhead exceeds a sane cost/benefit tradeoff.

Re:JavaScript Modularity Shaming by willyg302 on Wednesday January 07, 2015 @08:47PM (#8854587)
> Frankly, copy/paste is a superior code reuse mechanism at this scale.

The one advantage I see to having borderline-ridiculous packages such as this is that they do One Thing Well [1]. Yes you may copy/paste an isObject() function or roll your own, but then it becomes your responsibility to make sure it works for your project, and arguably far fewer eyes on it when it doesn't. As long as the project's maintainer is dedicated to making this the best way to determine whether a variable is an object, I have no problem using it.

Although, I do find the 57 commits irksome. Most of them are just upgrading dependencies (code style checkers, etc.), "fixing" indentation, and in one case 7 separate tweet-sized diffs to the README on the same day, as if this guy has git commit/push bound to Ctrl+S in his editor.

[1] http://www.catb.org/esr/writings/taoup/html/ch01s06.html

Re:JavaScript Modularity Shaming by saurik on Thursday January 08, 2015 @12:39AM (#8855152)
In my experience, if these kinds of things break (whether due to a very esoteric corner case, a buggy browser that needs to be worked around, or a new version of the language specification), the person who discovered that it didn't work doesn't get it fixed upstream: they instead push a new module that they try to get people to switch to, talking about how much better theirs is (this happens partly due to the glory, but also partly due to it seemingly legitimately nonsensical to submit a patch to someone else's project that is "subtract your file and add mine", given that it is seriously a single line of code). Meanwhile, the original developer was usually part of the same community-bereft modern GitHub-era open source culture (where publishing code is the victory condition, as opposed to building culture), and isn't around to fix their library even if someone did submit a patch, so it becomes your responsibility anyway, only now it is to realize that the module you are using is "so last month" and figure out which replacement is the correct one. This is not much better than just copying and pasting code from Stack Overflow, yet frankly more infuriating as at least when you copy/paste it was more clear what you walked into.
Re:JavaScript Modularity Shaming by mattdesl on Thursday January 08, 2015 @01:07AM (#8855200)
Has any of this actually happened to you with focused modules like to-dash-case?

There is no reason for such a focused module to go out of style. As with many other small modules, the API and major version is locked barring some catastrophic event. Maybe there is a rare edge case that will break, and then you end up with two modules which are both useful in their own regard (like point-in-polygon and robust-point-in-polygon).

Re:JavaScript Modularity Shaming by xamuel on Thursday January 08, 2015 @03:43AM (#8855531)
They don't even do One Thing Well. The is-upper-case example checks uppercaseness by converting the entire string to uppercase and checking whether the result equals the original. What if the string in question is "xxx...x" (lowercase x repeated a million times)?
Re:JavaScript Modularity Shaming by josteink on Thursday January 08, 2015 @04:08AM (#8855578)
Doing "One thing well" can be defined in several things depending on what you consider of utmost importance for wellness.

I think that function does what it's supposed to "well" in the sense that 1. it works, 2. the code is clean and obvious and 3. it doesn't try to be clever and do "complex" things which can introduce bugs.

I'm guessing from your complaint that you think it doesn't do things "well" because you prefer code to computationally efficient over conceptually and declaratively clear?

You can argue that "But for -this- little thing I can afford to be a clever and throw the obvious-looking code out the window!", but then everyone else also gets to do the same judgement too.

And then suddenly you're all using "clever" code all over the place with new ingenious ways to break everywhere in your code-base. And just like clockwork, your application will start breaking and nobody will know why without spending hours, days or even weeks debugging.

Let's say I generally don't think computationally efficient code is worth that cost. I'll make exceptions for specific code-portions which needs to be fast, but for my bread and butter code? Make it plain and simple!

Re:JavaScript Modularity Shaming by xamuel on Thursday January 08, 2015 @04:32AM (#8855642)
If I'm importing a module for is-upper-case, it had better be for a reason: that someone actually did something significant on that problem and I don't want to reinvent their work.

The module in question is nothing but a #define macro. Javascript lacks a preprocessor and this community's response is apparently to outsource #define macro's to a centralized server.

>And just like clockwork, your application will start breaking

The alternative is that just like clockwork, your application grinds to a crawl and practically freezes the browser. Because you outsourced every last thing to someone who doesn't care about performance. Sure, it's fine for the static-html-page-that-you're-doing-in-node-for-some-inexplicable-reason. Just hope you know what you're doing when you do something more complicated.

Re:JavaScript Modularity Shaming by esailija on Friday January 09, 2015 @04:47PM (#8864734)
If I am going to add a dependency for some shit like this, it better at least be exceptionally well optimized and have no bugs.
Re:JavaScript Modularity Shaming by blakeembrey on Thursday January 08, 2015 @04:57PM (#8859283)
That's a great point! Maybe you should log an issue or make a PR and fix it for everyone (except those who copied and pasted). This is exactly why it's a good thing for smaller modules that do one thing well, because when a tiny bug pops up everyone can automatically apply the patch.

I did do some tests a around this, but it showed nothing substantial. The comparison solution is much faster overall, the only point it falls down is with all lowercase strings where an early return would obviously be faster. Even a regexp was faster in some cases. It's highly subjective.

Re:JavaScript Modularity Shaming by js2 on Wednesday January 07, 2015 @10:19PM (#8854841)
Probably the README was edited via github's web UI.
Re:JavaScript Modularity Shaming by kyllo on Thursday January 08, 2015 @12:42AM (#8855159)
The one advantage I see to having borderline-ridiculous packages such as this is that they do One Thing Well

Sure, but one function per package is silly. Why not just put all the related utility functions in one package? Underscore does One Thing Well too. And if I really, really care about optimizing for small JS file size, I can just go in my Underscore.js file and remove all the functions I don't want to use.

Re:JavaScript Modularity Shaming by insin on Thursday January 08, 2015 @07:37AM (#8856110)
Or you could use Lo-Dash and require() the specific functions you actually used instead of the whole thing, after you're done: https://www.npmjs.com/browse/keyword/lodash-modularized

It's nice to have the option.

Re:JavaScript Modularity Shaming by vog on Thursday January 08, 2015 @06:47AM (#8855965)
Or, use something like the closure compiler to remove unused code automaticaly.
Re:JavaScript Modularity Shaming by slavik81 on Wednesday January 07, 2015 @10:51PM (#8854915)
It seems harder to verify that the module maintainer is competent and trustworthy (and to keep up-to-date on maintainer changes).
Re:JavaScript Modularity Shaming by mattdesl on Wednesday January 07, 2015 @11:40PM (#8855026)
In the case of is-object the api is frozen, and with any module it's assumed that any breaking changes would come in via a major version (ie not break your code).

Yeah, sure, if the maintainer becomes evil overnight he can break a lot of apps. If you live in fear then you probably won't enjoy npm very much.

Re:JavaScript Modularity Shaming by m_mueller on Wednesday January 07, 2015 @09:04PM (#8854640)
It's not even very useful is it? shouldn't there be another check for !(Array.isArray(x)) ? Otherwise, checking for isObject(foo) will still not guarantee that foo.bar won't fail.
Re:JavaScript Modularity Shaming by ajanuary on Thursday January 08, 2015 @02:53AM (#8855436)

    var foo = [1, 2, 3, 4];
    foo.bar = "I exist";
    console.log(foo.bar);
    foo.baz = function() { return "So do I"; }
    console.log(foo.baz());
Arrays are, to most practical purposes, just special objects.
Re:JavaScript Modularity Shaming by imslavko on Wednesday January 07, 2015 @06:25PM (#8854022)
Re:JavaScript Modularity Shaming by mattdesl on Wednesday January 07, 2015 @11:36PM (#8855020)
I replied in another thread about some of the reasonings behind it: https://news.ycombinator.com/item?id=8830058

It's an alternative approach to software design which may feel alien if all you've ever used is copy-pasting for code re-use, or relying on large standard libraries and utility grab-bags.

Re:JavaScript Modularity Shaming by williamcotton on Thursday January 08, 2015 @09:08AM (#8856377)
First, you've purposefully picked the smallest module that you could find. And can you back up your claim that "the same people who shame other people's work worship and publish one-line modules"? Can't you see how using terms like "shame" and "worship", which poor Blake never used no accused anyone of, is inflammatory?

Second, so what? So it's alright to copy and paste the function? It is alright if a coworker wrote the function and presented you with an interface? Would you have a problem if a single module that was "designed in isolation, documented in isolation and can be used in isolation" but was published internally?