News for hackers. Stuff that matters.
Re:Diminishing returns of static typing by macspoofing on Monday October 02, 2017 @12:21PM (#15385136)
I'm so happy to see the pendulum swing the other way, because when JavaScript was becoming popular, and Ruby and Python had a popularity renaissance (around mid to late 2000s), I had a lot of online arguments about the value of static typing.

People were complaining about static typing for the dumbest reasons (it's too 'wordy'). It started as a backlash against old-school enterprise Java development (which was fair, EJB2 world sucked) but then it went completely off-the-rails. Typing in Java could be better, sure, but even with its quirks it's way better than the nothing you get with dynamic languages. There are a class of bugs you just never need to worry about when the compiler does some compile-time checks for you ... like worrying that you passed the wrong type into a function, or the wrong number of arguments.

Thank God people are coming to their senses.

Re:Diminishing returns of static typing by KMag on Monday October 02, 2017 @02:15PM (#15386341)
I've worked with, statically typed languages, dynamically typed languages, and my day job involves a dynamically typed language with optional annotations (dynamically enforced) and static analysis tools.

In my experience, the cost of static typing feels roughly constant per line of code, while the benefits of static typing feel roughly O(N log N) in lines of code or O(N) in number of cross-type interactions. These are just wild guesses based on gut feelings, but they feel about right. The constant factors are affected by individual coder preference, experience, and ability, but also specifics of thy type systems involved and the strength of type inference in the tools being used.

In any case, I think often times dynamic typing proponents and static typing proponents have vastly different notions of what a large code base is, or at least the size code bases they typically use.

One problem is that many code bases start out where the advantages of static typing aren't readily apparent, but re-factoring into a statically typed language is often not realistic, even/especially when a project starts groaning under its own weight.

I'd love to see more mainstream use of gradual typing/optional typing/hybrid typing languages, especially something like a statically typed compiled subset of a dynamically typed interpreted language, where people could re-factor portions of their quick-and-dirty prototypes into nice statically typed libraries.

Re:Diminishing returns of static typing by andybak on Monday October 02, 2017 @06:28PM (#15388512)
There are no large codebases - just insufficiently modular ones. :-)
Re:Diminishing returns of static typing by icebraining on Monday October 02, 2017 @01:39PM (#15385980)
Typing in Java could be better, sure, but even with its quirks it's way better than the nothing you get with dynamic languages.

I disagree; that Java was the standard example of statically typed languages is what convinced me for a long time that I didn't want anything to do with it. Having to pollute my code with all that crap, deal with a lot of dumb restrictions and still have NPEs left me with a sour taste.

Only after I discovered Haskell (and more recently Idris), did I realize that static typing can actually be worthwhile.

Re:Diminishing returns of static typing by mattnewton on Monday October 02, 2017 @02:01PM (#15386215)
Agreed, every time I had to patiently explain to javac that shockingly, my new ArrayList<T> was a List<T>, my new FooBar was a FooBar, and always would be, it drove me slowly mad. Still, I was thankful for the static types when trying to understand where this strange object came from and what it was supposed to do. I’m glad we have modern languages that have the potential to do an even better job of that without a lot of the verbosity.
Re:Diminishing returns of static typing by breischl on Monday October 02, 2017 @03:42PM (#15387250)
Those things are indeed obnoxious, but they are truly _Java_ issues rather than static typing issues. For instance, C# will figure that stuff automatically in many cases using the _var_ keyword. The Lombok plugin can add something like that into Java, although it's only about 80% as good because of other Java limitations, primarily type erasure.
Re:Diminishing returns of static typing by mattnewton on Monday October 02, 2017 @06:36PM (#15388570)
I agree. While I have never used C# in anger I have played with enough other (non-Java staticky typed) languages to know that it doesn’t have to be this bad :D
Re:Diminishing returns of static typing by nradov on Monday October 02, 2017 @03:07PM (#15386894)
While it may be frustrating to novice programmers, the distinction between interfaces (List) and implementation classes (ArrayList) is quite valuable, especially when dealing with huge code bases that have to be maintained over decades. Those declarations help to establish an internal design contract and clarify the developer's intent. In this particular case, a future maintenance programmer could switch from ArrayList to any other class which implements the List interface without breaking the program.
Re:Diminishing returns of static typing by nicoburns on Monday October 02, 2017 @06:32PM (#15388544)
True, but there are more elegant solutions. For example, Rust's traits allow you to define a trait (somewhere in between an interface and an abstract class in Java), and then methods can be generic over any object that implements that trait. And structs and traits have a many-to-many relationship.

This allows you implement patterns like duck typing which are idiomatic in languages like javascript, but impossible to implement in java.

Re:Diminishing returns of static typing by x0x0 on Monday October 02, 2017 @05:56PM (#15388305)
Which happens exactly how often? I've been writing java code for the better part of two decades and basically never needed to swap my list/set/map types around. Also, one of the purported benefits of java's typing is your editor can find and refactor / swap all usages, so it doesn't seem to me like this distinction has much value. It instead makes me think it's a fetish for object orientedness...

In fact, the only cases I've ever swapped even a HashMap has been to trove, which implements data structures for builtin types rather than reference types. In which case using interfaces everywhere doesn't help.

Re:Diminishing returns of static typing by mattnewton on Monday October 02, 2017 @03:43PM (#15387267)
It’s not about having the difference, it’s about having to explain to Javac what I am using because it’s incapable of doing meaningful type inference.
Re:Diminishing returns of static typing by vkou on Monday October 02, 2017 @04:37PM (#15387709)
Only in the case of generic erasure, which is a Java wart that we will, sadly, never eliminate.
Re:Diminishing returns of static typing by macspoofing on Monday October 02, 2017 @03:02PM (#15386841)
Generics in Java have well known limitations stemming from type erasure (a design decision made to preserve backwards compatibility). Things aren't quite as dire as you made them out to be and in the general case, they work quite well.
Re:Diminishing returns of static typing by macspoofing on Monday October 02, 2017 @02:47PM (#15386674)
>Having to pollute my code with all that crap

What crap? Types?

>deal with a lot of dumb restrictions

Like what?

Re:Diminishing returns of static typing by icebraining on Monday October 02, 2017 @03:42PM (#15387248)
What crap? Types?

Types, especially those that could easily be inferred and that provide no value to the programmer. Writing types down can be useful - Python programmers do it too. Having to tell the compiler every little thing is crap.

Like what?

Type erasure. Having to treat primitives and arrays differently from other types. No first class functions or classes. I won't go on, the arguments are easy to find.

Re:Diminishing returns of static typing by macspoofing on Monday October 02, 2017 @04:32PM (#15387675)
I won't deny that Java had some quirky design decision that the language is paying for (though some of those have been mitigated). But I can't find your criticisms very persuasive in a world where languages like JavaScript and PHP are popular. Even C and C++ have their own idiosyncrasies to contend with.

I am surprised though that you were completely ignorant of the benefits of static typing outside of Java. I would think that simply out of curiosity you would do a language survey just to get an idea of what else is out there.

Re:Diminishing returns of static typing by icebraining on Monday October 02, 2017 @05:32PM (#15388145)
II can't find your criticisms very persuasive in a world where languages like JavaScript and PHP are popular.

Persuading you on the general demerits of Java wasn't really my intention; my point was that if you want get more people on the static typing train, Java is a bad ambassador and might work against you.

I am surprised though that you were completely ignorant of the benefits of static typing outside of Java. I would think that simply out of curiosity you would do a language survey just to get an idea of what else is out there.

Well, back then (early 2000s) I was a self-taught teenager with a poorer grasp of English (I'm not a native speaker), so while my curiosity did lead me to discover a few languages (JavaScript, PHP, Python, Lua and C), anything remotely approaching "academic" - Haskell, OCaml, Oberon, etc - was out of bounds for me.

Since C was the only other statically-typed language I knew, and I also knew it was much older and designed for much slower machines, I assume static typing was mostly for efficiency, like manual memory management.

Re:Diminishing returns of static typing by hellofunk on Monday October 02, 2017 @01:58PM (#15386177)
> Thank God people are coming to their senses.

There are no senses to come to. Static and dynamic typing each have their own benefits, and there are genuine tradeoffs to choosing one over the other. That we are even having this debate in 2017 shows that the world of typing is not a "solved problem" and there are still good reasons to use one over the other for various reasons.

Re:Diminishing returns of static typing by macspoofing on Monday October 02, 2017 @03:16PM (#15386990)
>Static and dynamic typing each have their own benefits,

I struggle to think of any benefits of dynamic typing on a reasonably sized code-base (e.g. 50k+ LOC).

Re:Diminishing returns of static typing by lordCarbonFiber on Monday October 02, 2017 @03:25PM (#15387069)
Cheap and plentiful dev talent. Grab any random guy (and at these shops it's always guys) off the street and bang you've got a python dev.

There's always going to be an agility multiplier so long as VC is flowing and getting an mvp and a high head count is worth more than any kind of sustainable product.

Re:Diminishing returns of static typing by macspoofing on Monday October 02, 2017 @04:20PM (#15387561)
>Grab any random guy (and at these shops it's always guys) off the street and bang you've got a python dev.

I expect any programmer to be able to transfer their skillet to a new programming language - especially when we're talking about mainstream languages with a GC.

>There's always going to be an agility multiplier so long as VC is flowing and getting an mvp and a high head count is worth more than any kind of sustainable product.

What kind of agility multiplier? Maybe it makes a difference during a hackathon where you have 24 hours to put something together or maybe if you're putting together shell scripts ... but taking something to MVP takes weeks or months - mainstream dynamic languages simply don't have any edge in development speed in those instances.

Re:Diminishing returns of static typing by crdoconnor on Monday October 02, 2017 @04:05PM (#15387447)
>I struggle to think of any benefits of dynamic typing on a reasonably sized code-base

Being able to define and initialize types at runtime offers more flexibility and it's quicker to develop in.

I'm frankly surprised nobody brings it up more often but the prototypical example of "static typing done right" - Haskell - is talked about nearly constantly but when I look for actual software I might use that's written using it.... there's so little it's almost embarrassing. One obscure window manager, one obscure VCS, facebook's spam filter and some tool for converting markup.

Given a sprinkling of asserts, a decent linter and a high level of test coverage I don't see much of a benefit to adding static typing.

Re:Diminishing returns of static typing by macspoofing on Monday October 02, 2017 @04:35PM (#15387700)
>Being able to define and initialize types at runtime offers more flexibility and it's quicker to develop in.

Quicker if you're writing shell scripts or a small single-purpose applications. Not quicker if you're adding to a codebase of any significant size.

Re:Diminishing returns of static typing by crdoconnor on Monday October 02, 2017 @05:23PM (#15388084)
Decent programmers compose code bases of "significant size" from many small, loosely coupled single purpose applications.

Yes, IME it's still quicker.

OTOH, if you're using "codebase of significant size" as code for "big ball of mud", static typing certainly helps, but integration tests are the real lifesaver.

Re:Diminishing returns of static typing by macspoofing on Tuesday October 03, 2017 @05:32AM (#15391215)
>OTOH, if you're using "codebase of significant size" as code for "big ball of mud", static typing certainly helps, but integration tests are the real lifesaver

No. I mean when the codebase is of a certain size, new features require some thought and planning. Features may span multiple-modules. They may require partial or full rewrites or the refactoring of any number of sub-components to support the new behaviour. This means that you proceed carefully because you may not want to introduce regression bugs. This costs time. At that point, you're not limited by your typing speed as you may be putting in net 10 lines of code a day. There is just no benefit to dynamic typing at that point. Worse for dynamic languages, this is where improved tooling and static type constraints start paying extreme dividends.

Re:Diminishing returns of static typing by crdoconnor on Tuesday October 03, 2017 @07:51AM (#15391738)
>No. I mean when the codebase is of a certain size, new features require some thought and planning. Features may span multiple-modules. They may require partial or full rewrites or the refactoring of any number of sub-components to support the new behaviour. This means that you proceed carefully because you may not want to introduce regression bugs. This costs time.

Yes. And all equally true for statically typed languages.

Refactoring without tests is easier in a statically typed language, but still stupid. If you assume a decent body of tests, the benefit dissipates quickly.

If you prototype faster, as you usually will in a dynamically typed language, your design mistakes cost less. Since in large software systems I tend to find that the two biggest sources of bugs are a) errors in specification and b) poorly designed APIs, not obscure edge case bugs, quicker prototyping helps in large projects too.

And, if your design is solid, you can still achieve similar benefits as static typing by "locking down" your boundary code with asserts so that future development that interacts with that boundary code will fail quickly if it interacted with in the wrong way.

>At that point, you're not limited by your typing speed as you may be putting in net 10 lines of code a day. There is just no benefit to dynamic typing at that point.

This is fallacious. You're never limited by your typing speed in any language at any point. The cost of "extra typing" is cognitive, not a finger speed limitation.

The benefit of dynamic typing is more flexibility in the code you write (especially useful for writing frameworks and such) and quicker turnaround when prototyping because you do not have to prespecify as much up front.

Re:Diminishing returns of static typing by macspoofing on Wednesday October 04, 2017 @06:42AM (#15399490)
>Yes. And all equally true for statically typed languages.

>Refactoring without tests is easier in a statically typed language, but still stupid. If you assume a decent body of tests, the benefit dissipates quickly.

We're not arguing whether dynamic language+extensive integration/unit test is better than static typing and no tests.

>And, if your design is solid ...

Yes, if you have a very solid architecture, strict coding guidelines, extensive integration and unit test coverage, experienced developers (etc. etc. etc.) you will mitigate a lot of problems with dynamic typing. So if you do everything right, avoid the pitfalls, you can have something solid. A similar argument is made to me when I assert JavaScript is a terrible language. I don't disagree with either but it doesn't prove anything.

>The cost of "extra typing" is cognitive, not a finger speed limitation.

Exactly.

Re:Diminishing returns of static typing by crdoconnor on Thursday October 05, 2017 @12:58PM (#15410679)
>We're not arguing whether dynamic language+extensive integration/unit test is better than static typing and no tests.

I am, because that's the way I'd work in any language, because I'm not a hack.

>Yes, if you have a very solid architecture, strict coding guidelines, extensive integration and unit test coverage, experienced developers (etc. etc. etc.) you will mitigate a lot of problems with dynamic typing.

Eliminate.

>A similar argument is made to me when I assert JavaScript is a terrible language.

No, javascript is different. The weird and fucked up implicit type conversions render even a high level of testing insufficient to achieve a high level of confidence in the code. There's way too many edge case behaviors where it should be throwing exceptions and it does something weird instead. C suffers from this problem too despite being statically typed.

Re:Diminishing returns of static typing by golergka on Monday October 02, 2017 @05:03PM (#15387923)
"Quick to develop in" doesn't sound as a very good thing to me - because it usually means "slow and hard to maintain for the next guy".
Re:Diminishing returns of static typing by hellofunk on Monday October 02, 2017 @06:01PM (#15388334)
> I struggle to think of any benefits of dynamic typing on a reasonably sized code-base (e.g. 50k+ LOC).

And yet, it's done all the time with great results.

Re:Diminishing returns of static typing by metaphorm on Monday October 02, 2017 @01:47PM (#15386063)
The type systems of Java and C/C++ are the most commonly encountered ones and by far the most widespread in industry programming (as opposed to academia/research) and they are actually awful and really add a lot of friction and inertia to developing. Being free of that kind of type system when using a language like Python really does feel like a big upgrade.

There is a different problem with the more powerful and useful type systems in more modern statically typed languages though: learning curve. Haskell is dysfunctionally hard to learn and other languages do a little bit better but there's still friction in the learning curve that gets in the way of widespread adoption in projects that want to be able to hire rapidly.

Re:Diminishing returns of static typing by breatheoften on Monday October 02, 2017 @08:43PM (#15389163)
I think Typescript is significantly easier to learn than JavaScript.
Re:Diminishing returns of static typing by wiremine on Monday October 02, 2017 @12:44PM (#15385396)
> EJB2.0 world sucked

This is the #1 reason I leaned away from static typing. Typescript and Swift have changed my mind. I now see typing as a helpful tool that can solve a lot of problems.

Re:Diminishing returns of static typing by enraged_camel on Monday October 02, 2017 @01:24PM (#15385840)
>>There are a class of bugs you just never need to worry about when the compiler does some compile-time checks for you ... like worrying that you passed the wrong type into a function, or the wrong number of arguments.

People always say this and it baffles me. Bugs like that should be caught immediately by your test cases. You shouldn't rely on the compiler to catch them for you.

Re:Diminishing returns of static typing by rbobrowicz on Monday October 02, 2017 @02:11PM (#15386300)
Personal anecdote:

I worked on a small Python project some years ago and we had a type error in production despite having tests.

We traced it back to a call to a third party library. It was supposed to return a list of results, and all of the test cases around it worked and always got a list back. In production however we encountered an error because if there was only one value to return, the library would not return a list of one element, as we expected, but a scalar value. So the rest of the code was expecting a list and when it encountered a scalar it blew up.

You can blame it on us for having insufficient test cases, or not coding defensively enough, or not reading the source code of the library we used, or the author of the library for bad design, but ultimately, this bug would not have been possible in a statically typed language.

So just saying "have test cases" is not good enough. Your test cases can be not exhaustive, but a good static type system and type checker is.

Re:Diminishing returns of static typing by berdario on Monday October 02, 2017 @05:11PM (#15387999)
I cannot reply to cdoconnor (probably some downvotes), so I'll write here:

That's the whole point: as it's often said "type checking keeps you honest"

I stumbled time and time again upon badly designed libraries... With a static type system, the painfulness will be obvious and felt the first time you'll try to build your code

with dynamic types, the pain might not be felt at all, until a crazy bit of code will be invoked, sometimes at the most unfortunate of times

Re:Diminishing returns of static typing by crdoconnor on Monday October 02, 2017 @04:11PM (#15387494)
>or the author of the library for bad design

That's the one. That's a damned stupid decision.

Re:Diminishing returns of static typing by UncleMeat on Monday October 02, 2017 @05:43PM (#15388216)
Yeah and a static type system refuses to let you make such a stupid decision. When interoperating with code I didn't write, knowing that the code is guaranteed to conform to some specification is valuable.
Re:Diminishing returns of static typing by andrewaylett on Monday October 02, 2017 @01:34PM (#15385934)
Why would I write test-cases for something the compiler can catch for me? Yes, I need to write tests for all the correctly-typed cases, but there are a whole class of bugs that I don't need to test for any more because I can't even write the failing case.
Re:Diminishing returns of static typing by crdoconnor on Monday October 02, 2017 @04:23PM (#15387585)
>there are a whole class of bugs that I don't need to test for any more because I can't even write the failing case.

By adding sanity checking asserts in a dynamically typed language you can achieve more or less the same result.

Re:Diminishing returns of static typing by wstrange on Monday October 02, 2017 @04:48PM (#15387809)
If you are going to add a bunch of asserts, why not just use types?
Re:Diminishing returns of static typing by crdoconnor on Monday October 02, 2017 @05:14PM (#15388029)
I don't particularly see the need to extend this approach to every single variable in my code base. I usually just stick it on boundary code.
Re:Diminishing returns of static typing by enraged_camel on Monday October 02, 2017 @01:42PM (#15386009)
You don't write test cases specifically to check types. Your existing cases, if they are robust and thorough, will simulate your runtime and check those for you as a side effect.
Re:Diminishing returns of static typing by andrewaylett on Monday October 02, 2017 @05:12PM (#15388005)
My existing test cases, robust and thorough though they are, only test what happens when I feed in a correctly typed object. Because I can't write a test that exercises my code on an incorrectly typed input: the type system prevents that.
Re:Diminishing returns of static typing by metaphorm on Monday October 02, 2017 @01:49PM (#15386084)
you're already writing the test cases to ensure correct behavior with typical input, and predictable exceptional input. putting in one more assert for predictable exceptional input (wrong type) doesn't really add a noticeable amount of overhead to writing the tests you were already writing.
Re:Diminishing returns of static typing by macspoofing on Monday October 02, 2017 @02:52PM (#15386739)
>putting in one more assert for predictable exceptional input (wrong type) doesn't really add a noticeable amount of overhead

Yes. We call that 'typing'.

Re:Diminishing returns of static typing by discreteevent on Monday October 02, 2017 @05:58PM (#15388315)
And it takes less typing (keyboard) than the assert, and you get free documentation inline with the code!
Re:Diminishing returns of static typing by cm2187 on Monday October 02, 2017 @02:30PM (#15386464)
If you have to write a test for every line of code you write, the "chatty" argument against static typing goes away.
Re:Diminishing returns of static typing by senorjazz on Monday October 02, 2017 @03:03PM (#15386845)
and not just that, but for every possible case for the line you can think of. Like the post above, testing the results of a function returns a list for 1 item, or many items...

I see all too often, java bad, just look at how many lines you need to write to get "hello world". Who cares, the IDE generates that for you, but if you don't understand static void main as a beginner... again who cares, just put it in and ignore it until you need to understand it. Also read that dynamic languages are so productive, but they never mention you need to then write tests to detect what the compiler would catch for free. Yes good code needs tests, but the compiler IMO is a damn good built in test suite for catching many classes of errors

Re:Diminishing returns of static typing by Silhouette on Monday October 02, 2017 @04:02PM (#15387421)
Bugs like that should be caught immediately by your test cases. You shouldn't rely on the compiler to catch them for you.

What's wrong with relying on the compiler? Bugs like that will be caught immediately by a good static type system, so you don't have to rely on your test cases to catch them for you.

Relying on a test suite to verify basic properties that could be enforced automatically through a type system means you're only checking some cases instead of all cases. It also means you're cluttering your test suite with boilerplate about language mechanics instead of writing high value tests that verify the real operational behaviour of your system.

There are pros and cons to static vs. dynamic typing in general, but in this particular respect, static typing is strictly more powerful, less verbose and more efficient.

Re:Diminishing returns of static typing by dep_b on Monday October 02, 2017 @01:39PM (#15385985)
Well if you don't need to write that particular test you have more time writing tests that are actually useful, like validating your logic (and dare I say: more fun to write).
Re:Diminishing returns of static typing by AsyncAwait on Monday October 02, 2017 @06:44PM (#15388623)
Having a compiler catch this for you means having to write less test cases.
Re:Diminishing returns of static typing by 201709User on Monday October 02, 2017 @01:28PM (#15385871)
Yes, why do something automatically when you can do manual work!
Re:Diminishing returns of static typing by icebraining on Monday October 02, 2017 @01:32PM (#15385915)
I think the idea is that you have to write tests anyway.
Re:Diminishing returns of static typing by whyever on Monday October 02, 2017 @01:40PM (#15385992)
No, you don't have to write tests for invariants enforced by the type system.
Re:Diminishing returns of static typing by ubernostrum on Monday October 02, 2017 @02:05PM (#15386254)
I think the bigger idea is that people who've never actually written serious code in a dynamically-typed language assume that people who do always write a bunch of extra unit tests to assert correct types, assert behavior on incorrect types, etc. etc., and that programs crashing due to type errors is a super frequent occurrence.

None of those things are true.

Re:Diminishing returns of static typing by tome on Monday October 02, 2017 @05:01PM (#15387919)
And yet there are dynamic language proponents in this very subthread suggesting that's exactly what everyone should do.