News for hackers. Stuff that matters.
Re:Strong typing, a hill I'm willing to die on by tasn on Wednesday October 04, 2023 @09:18AM (#37764675)
Author here. I ended the post with:

> I can see both side of the arguments on many topics, such as vim vs. emacs, tabs vs. spaces, and even much more controversial ones. Though in this case, the costs are so low compared to the benefits that I just don't understand why anyone would ever choose not to use types.

> I'd love to know what I'm missing, but until then: Strong typing is a hill I'm willing to die on.

I genuinely want to know what I'm missing. I also outlined in the post all of the arguments I usually see in favor of not having types and why I disagree with them.

I'm happy, willing, and excited to hear what I'm missing.

Re:Strong typing, a hill I'm willing to die on by insanitybit on Wednesday October 04, 2023 @09:24AM (#37764764)
Hey, I hear you, and I commend you for your good faith position of "I want to hear both sides". I'm just not there anymore. The arguments put forth ("the cost is worth it, it makes up for itself", etc) are arguments I've had a million times and I just no longer will engage.
Re:Strong typing, a hill I'm willing to die on by tasn on Wednesday October 04, 2023 @09:30AM (#37764859)
Oh, apologies, I misread your comment. I thought you were saying that you won't engage in this discussion because of my strong stance on the topic. I'm a big fan of "Strong beliefs, weakly held".
Re:Strong typing, a hill I'm willing to die on by junon on Wednesday October 04, 2023 @09:57AM (#37765265)
Same here. Been doing this for too long that I refuse to even bother anymore.
Re:Strong typing, a hill I'm willing to die on by a_c on Wednesday October 04, 2023 @09:20AM (#37764703)
I think you and parent are in agreement
Re:Strong typing, a hill I'm willing to die on by randomdata on Wednesday October 04, 2023 @09:43AM (#37765064)
> I just don't understand why anyone would ever choose not to use types.

Is there a language out there that gives you that choice?

I expect you mean choose not to use strong static typing as per the original piece? Compatibility is a pretty good reason. I'd like to see Javascript die in the fiery pits of hell as much as the next guy, but its positioning means it is almost inevitable that some system will make it the only reasonable choice for you to choose if you want to build for that system.

Typescript doesn't help. It adds static typing, but not strong typing.

Re:Strong typing, a hill I'm willing to die on by junon on Wednesday October 04, 2023 @09:54AM (#37765213)
Python and PHP both have type hints that are natively ignored by the language if present, but can be checked if you have enough of them, if that's what you mean.
Re:Strong typing, a hill I'm willing to die on by randomdata on Wednesday October 04, 2023 @09:58AM (#37765273)
No, I mean it lacks strong typing. C and C++ also lack strong typing even with static typing being a core feature and checked at compile time.
Re:Strong typing, a hill I'm willing to die on by junon on Wednesday October 04, 2023 @10:03AM (#37765337)
There's no agreed upon definition of "strong" vs "weak" so you'll have to elaborate a bit.
Re:Strong typing, a hill I'm willing to die on by randomdata on Wednesday October 04, 2023 @10:04AM (#37765370)
The only other use I'm familiar with where strong types are used to describe the equivalent of static types, but we've made clear distinction between the two here. What other definition is there?

Usually: A strong type system does not allow types to change after being established. A weak type system allows types to change. This is also described in the original article.

Re:Strong typing, a hill I'm willing to die on by 1-more on Wednesday October 04, 2023 @10:43AM (#37765913)
How is that different from static typing?
Re:Strong typing, a hill I'm willing to die on by AnimalMuppet on Wednesday October 04, 2023 @11:03AM (#37766211)
C++ has casts. I don't regard those as making it a "weak" type system. I regard it as "strong type system with escape hatches", which is not the same thing. A strong type system should not be a straightjacket. (Languages that try to make types bulletproof tend to get used less than languages that allow escape hatches, and rightly so. The language designer never knows what the union of all use cases will be. Good language designers know that the user may have a case the designer didn't think of, and allow some flexibility to hopefully handle it.)
Re:Strong typing, a hill I'm willing to die on by zabzonk on Wednesday October 04, 2023 @11:04AM (#37766220)
>A strong type system does not allow types to change

so... like in c++?

Re:Strong typing, a hill I'm willing to die on by neverartful on Wednesday October 04, 2023 @01:30PM (#37768652)
No. C++ does allow types to change. That's exactly what casts are for.
Re:Strong typing, a hill I'm willing to die on by zabzonk on Wednesday October 04, 2023 @02:23PM (#37769453)
no. c++ allows you to convert a value of one type into a value of another type (in a very limited number of cases) but you cannot change the type of an object.
Re:Strong typing, a hill I'm willing to die on by gpderetta on Wednesday October 04, 2023 @11:10AM (#37766315)
You can't change the type of an object in C++ so I'm not sure how your definition applies.

Generally "strong" vs "weak" typing[1] is an ill-defined an mostly useless definition.

[1] as opposed to static vs dynamic or safe vs unsafe.

Re:Strong typing, a hill I'm willing to die on by syndicatedjelly on Wednesday October 04, 2023 @11:46AM (#37766881)
Re:Strong typing, a hill I'm willing to die on by gpderetta on Wednesday October 04, 2023 @12:01PM (#37767137)
Casts don't change the type of an object. They might create a new object of another type from the first one.

edit: I guess what you want to say is that implicit casts make a type system weak. But even there there is plenty of wiggle room: I think that everybody agree that implicitly converting the string "1" to an integer is bad (which is not allowed in C++). Narrowing conversions are arguably bad (they are sometimes allowed in C++), but some other implicit conversions are hard to argue against (int to long for example, or derived to base).

Re:Strong typing, a hill I'm willing to die on by nyssos on Wednesday October 04, 2023 @12:59PM (#37768124)
> A strong type system does not allow types to change after being established. A weak type system allows types to change.

For dynamic types, sure, that's a reasonable enough definition. But it doesn't really make sense for static types: they're attached to expressions in your source code, not runtime values.

Re:Strong typing, a hill I'm willing to die on by SkyMarshal on Wednesday October 04, 2023 @01:35PM (#37768738)
My personal notion of a strong type system is one built around function type signatures.

In order to have that, you need static typing of variables and constants, like most statically typed imperative languages have. But you also need a method to specify required input types and expected output types of all functions.

In a purely functional language like Haskell where there are only functions, and functions are first class and can be both inputs to or outputs from other functions, then the entire operation of the program is encapsulated in its function type signatures.

The entire flow of data and logic through the program can be type-checked by the compiler, and function implementations checked against their type signatures.

Re:Strong typing, a hill I'm willing to die on by pavlov on Wednesday October 04, 2023 @10:03AM (#37765350)
C++ lacks strong typing? I'm curious what the type system is missing to qualify.

Or do you mean that the C-based escape hatches like casting pointers make the type system inherently weak? You don't have to use them though...

Re:Strong typing, a hill I'm willing to die on by robertlagrant on Wednesday October 04, 2023 @10:29AM (#37765737)
You don't have to make type errors either :-)
Re:Strong typing, a hill I'm willing to die on by AnimalMuppet on Wednesday October 04, 2023 @11:06AM (#37766265)
Sure. But you have to deliberately use a cast; people rarely make deliberate type errors.
Re:Strong typing, a hill I'm willing to die on by JonChesterfield on Wednesday October 04, 2023 @11:18AM (#37766437)
C++ has chosen a special place in the hellscape of language design by allowing you to silence the compiler using casts, where almost anything you do with the resulting object is undefined behaviour no diagnostic required.

Said UB is observationally indistinguishable from miscompilation under some toolchains under some optimisation controls.

It also has various bolt on weirdness like const doesn't mean the thing won't be changed by some other pointer so you can't constant propagate based on it, unless it's written on the global, at which point attempts to mutate it anyway may succeed under the usual UB challenges.

Maybe that's a "strong" type system, but you'd only define it like that if you started by taking C++ as axiomatically reasonable.

Re:Strong typing, a hill I'm willing to die on by prewett on Wednesday October 04, 2023 @12:40PM (#37767787)
Static typing is already quite a help, as it makes whole categories of errors compile-time errors.

> I'd like to see Javascript die in the fiery pits of hell as much as the next guy

Part of the problem is that some of those "next guys" don't have the experience and/or vision to realize that it needs to die. Perhaps we should emulate Cato in our subsequent HN posts:

And furthermore, I consider it necessary that Javascript be replaced with WebAssembly so that we can use well-designed languages in the browser.

Re:Strong typing, a hill I'm willing to die on by user3939382 on Wednesday October 04, 2023 @09:49AM (#37765151)
There's a specific scenario where I have more sympathy for weak typing, which is: I'm writing a small, focused utility by myself whose scope can never expand and whose code will never be collaborated on. I do have these, little shell scripts. I write them, they work, I move on and use it for 10 years. No types in there, fine whatever.

As soon as there's any complexity at all or another person involved that exception stops.

Re:Strong typing, a hill I'm willing to die on by racked on Wednesday October 04, 2023 @10:18AM (#37765569)
Indeed this. There are benefits. Less code, faster to write.
Re:Strong typing, a hill I'm willing to die on by AnimalMuppet on Wednesday October 04, 2023 @10:57AM (#37766110)
You are the other person. Come back in six months needing to make a change, and it's almost like you're new to the code.

Now, in general, I agree with you. If it's a one-off (or if it's really never going to need maintenance), and if it's small enough that you don't need types while writing it, then sure, do whatever is easiest at the time. But "never going to need maintenance" often turns out to be a lie, and when that time comes, you may be happy for some types as signposts to give a hint of what you were thinking all those months or years ago.

Re:Strong typing, a hill I'm willing to die on by BobbyJo on Wednesday October 04, 2023 @11:07AM (#37766269)
This is the trojan horse dynamic types use to get into your castle :P
Re:Strong typing, a hill I'm willing to die on by SAI_Peregrinus on Wednesday October 04, 2023 @11:19AM (#37766457)
I want a shell scripting language that allows a max line length of (for example) 128 characters and a max script length of (for example) 128 lines, with no `source` equivalent. If the script expands to not be a "small, focused" single-file script it should just fail to run at all. Just enough for small utilities, but unusable for giant monstrosities.
Re:Strong typing, a hill I'm willing to die on by KMag on Wednesday October 04, 2023 @12:07PM (#37767211)
... and unable to call external programs or communicate with external programs via pipes / sockets / etc.?

Otherwise, if you're unable to source another script, you could just have another script return a normal result in addition to a JSON blob of the environment variable changes the caller should make, which is probably worse than just allowing sourcing.

Pipes allow arbitrarily complex networks of communicating sequential processes. In some cases, networks of tiny CSPs are cleaner, but without discipline, they can rapidly become worse than huge monoliths.

Re:Strong typing, a hill I'm willing to die on by SAI_Peregrinus on Friday October 06, 2023 @09:54AM (#37790833)
I suppose I should just say "any sourced file counts against the length limits".
Re:Strong typing, a hill I'm willing to die on by KMag on Friday October 06, 2023 @11:20AM (#37791971)
That doesn't prevent the problem of length limits encouraging users to break their programs into networks of smaller programs communicating over pipes. I'm sure that sort of thing can be done well, but it certainly takes discipline.

Particularly as programs start out simple and organically grow, once they start hitting length limits, they're going to start evolving into locally-distributed computation. Maybe you get something nice like composable small unix-like utilities. However, I suspect there's a large overlap between the set of developers who would do that well and the set of developers who would still keep things nice and modular within a single process if they didn't have size limits.

Re:Strong typing, a hill I'm willing to die on by KMag on Wednesday October 04, 2023 @12:00PM (#37767105)
Note that weak typing and dynamic typing are orthogonal. I believe you're expressing sympathy for strong dynamic typing: types are checked an enforced by the runtime, but there's no static type analysis done at compile / load time. Python, JS, Ruby, etc. are strong dynamically typed languages.

The C runtime, on the other hand, will gladly (with UB nasal demon caveats) allow you to treat an int as a pointer. There are static type checks, but no hard limits on the type-confused nonsense it will attempt to execute. C is weakly statically typed.

Java, C#, etc. are strong statically typed. There are static checks at compile time, and the runtimes do their best (modulo escape hatches) to use dynamic runtime type checks to plug the gaps in the static type systems. (For any sufficiently complex sound/consistent type system, as per Godel, there will be some type-correct programs that cannot statically type-check. So, in practice, there will always be escape hatches in the type system. Hopefully most of these escape hatches are backed by dynamic runtime checks.)

Of course, these categories are a partially-ordered continuum, not clear binary distinctions. Also, type weakness is more a property of the runtime than the language, but for those languages with specifications, the language specification usually also specifies a large amount of behavior for a compliant runtime.

Re:Strong typing, a hill I'm willing to die on by user3939382 on Wednesday October 04, 2023 @03:47PM (#37770635)
I’m aware of the difference, I was contemplating bash in my comment. Some people construe it as strongly typed though it’s a little ambiguous, here’s another discussion about it https://news.ycombinator.com/item?id=12704050
Re:Strong typing, a hill I'm willing to die on by packetlost on Wednesday October 04, 2023 @09:54AM (#37765218)
I'm also a pretty die-hard type-system user, but I've been programming a lot of Lisp and FORTH lately. FORTH is just bad at safety period. Lisp, on the other hand, I can see why there really isn't a need for types. The macro system means you can create arbitrary "compile-time" safety checks which is, IMO, more powerful than just a type system. That being said, I would still love a strongly, statically typed Lisp, or at least one with a strong macro type system (before y'all mention it, I'm not a fan of typed Racket).
Re:Strong typing, a hill I'm willing to die on by qazwse_ on Wednesday October 04, 2023 @10:03AM (#37765354)
I haven't used it, but I know that Coalton adds static typing to Common Lisp, might be something you're interested in.

https://github.com/coalton-lang/coalton

Re:Strong typing, a hill I'm willing to die on by packetlost on Wednesday October 04, 2023 @10:21AM (#37765631)
I'm more into Scheme than CL, but am aware of Coalton. My current lisp is Gerbil: https://cons.io which already has a type annotation system and will be enhancing it for the next major release (v19).
Re:Strong typing, a hill I'm willing to die on by Zambyte on Wednesday October 04, 2023 @10:04AM (#37765362)
> Lisp, on the other hand, I can see why there really isn't a need for types.

What Lisp are you using that doesn't have types?

Re:Strong typing, a hill I'm willing to die on by packetlost on Wednesday October 04, 2023 @10:20AM (#37765615)
Well, every programming language must necessarily have types to some degree, but they aren't necessarily static or strong type systems. Most Lisps do not have a static type system and even fewer have a "strong" type system.
Re:Strong typing, a hill I'm willing to die on by Zambyte on Wednesday October 04, 2023 @10:36AM (#37765819)
> Well, every programming language must necessarily have types to some degree

The vast majority yes, that's why I was a bit confused :D

There some languages that have no types. The only thing I can think of though is a POSIX shell minus arrays.

> Most Lisps do not have a static type system

True

> and even fewer have a "strong" type system.

Common Lisp, Emacs Lisp, Scheme, Hylang, Clojure, and Racket all feature strong typing. I'm curious where you have found this trove of weakly typed Lisp dialects

Re:Strong typing, a hill I'm willing to die on by packetlost on Wednesday October 04, 2023 @11:03AM (#37766216)
Lisps are not statically typed typically and "strongly" typed is poorly defined. I would not consider most Lisp's type systems to be strong or particularly expressive, but they don't need to be because it would hurt the main benefit to the language: meta-programming. I don't think a "strong" vs "weak" type system argument is particularly valuable here, yes most prevent you from inadvertently changing how a particular series of bytes is interpreted, but their aggregates do not have any type identity besides their own typically. This means you cannot typically express and enforce an aggregate's covariance or contravariance properties. There may be ways to do so, but most do not provide utilities for it.
Re:Strong typing, a hill I'm willing to die on by gpderetta on Wednesday October 04, 2023 @11:14AM (#37766372)
Why dynamic typing is required for metaprogramming? D (and rust and c++ to a significantly lesser extent) for example has extremely strong metaprogramming capabilities while being statically typed.
Re:Strong typing, a hill I'm willing to die on by packetlost on Wednesday October 04, 2023 @11:21AM (#37766474)
I didn't say it was required, I said it hurts it in Lisps case. One of Lisps strongest features is extreme flexibility and homoiconicity. Strict typing would make it clunkier, though maybe it's worth it for some scenarios.
Re:Strong typing, a hill I'm willing to die on by Zambyte on Wednesday October 04, 2023 @01:25PM (#37768561)
> I don't think a "strong" vs "weak" type system argument is particularly valuable here, yes most prevent you from inadvertently changing how a particular series of bytes is interpreted [...]

I think that interpretation of the "strong" vs "weak" scale is a valuable one within the context of the blog post. The post is at least partially about how type systems can help the programmer by making them aware of certain kinds of errors (it is also about when: static vs dynamic).

My understanding of the terms covariance and contravariance are a bit shaky. Could you provide an example in another language that you think cannot be expressed using the provided utilities of most Lisp's?

You also mentioned that you don't think most Lisp's have "expressive" type systems. What do you mean by that? When I think of a type system as being expressive, I think of it as having explicit rather than implicit types, which is unrelated to the issue of strongly vs weakly typed and static vs dynamic types. Do you mean more like how you can describe / constrain the relationships between types in certain strongly typed languages?

Re:Strong typing, a hill I'm willing to die on by packetlost on Wednesday October 04, 2023 @01:53PM (#37769027)
> I think that interpretation of the "strong" vs "weak" scale is a valuable one within the context of the blog post. The post is at least partially about how type systems can help the programmer by making them aware of certain kinds of errors (it is also about when: static vs dynamic).

Sure, agree. That's also the real point: type systems primarily exist to make semantically impossible computations unrepresentable in the language (at least, without some extra song and dance). To this end, Lisps have rather lackluster type systems, but they don't try to encode much of the languages semantics into a type system.

> My understanding of the terms covariance and contravariance are a bit shaky. Could you provide an example in another language that you think cannot be expressed using the provided utilities of most Lisp's?

The wikipedia article on the topic is a great source: https://en.wikipedia.org/wiki/Covariance_and_contravariance_...

I'm actually mostly concerned with type invariants (ex. List[int]), which don't really have much for representation in Lisps from what I've seen. Further, see above about using types to make compile-time assertions/checks about the behavior at runtime.

> You also mentioned that you don't think most Lisp's have "expressive" type systems. What do you mean by that? When I think of a type system as being expressive, I think of it as having explicit rather than implicit types, which is unrelated to the issue of strongly vs weakly typed and static vs dynamic types. Do you mean more like how you can describe / constrain the relationships between types in certain strongly typed languages?

"Expressive" is a nothing word that doesn't have concrete meaning in-context, similar to "strong" type system. That being said, I would say Rust, OCaml, and TypeScript have expressive type systems: the behavior of the language is largely encoded as types. The implicit vs explicit nature of types is not super consequential IMO, it has more to do with how you primarily represent semantic meaning. In lisp, it's symbols. In Rust, it's traits, enums, and structs (+ the affine types, but that's not relevant here).

Re:Strong typing, a hill I'm willing to die on by kazinator on Monday October 09, 2023 @02:05AM (#37817359)
In Lisps, and other dynamic languages, two or more objects that are not related by inheritance can be substitutable. This is very useful.

That makes inheritance-based covariance and contravariance largely moot.

You have substitutability-based covariance and contravariance (you can't get away from those) but they cannot be subdued declaratively.

E.g. if you're passing a callback function somewhere, which you know will pass widget objects to the callback, it's okay to use a function that was written to handle gadget objects, if widget objects are designed to substitute for gadget objects.

That's contravariance of substitutability.

Substitutability is the only thing that matters in the end. Declared inheritance doesn't ipso facto guarantee substitutability, and therefore declared covariance or contravariance, which are inheritance based, do not guarantee actual substitutability-based covariance or contravariance.

Re:Strong typing, a hill I'm willing to die on by gpderetta on Wednesday October 04, 2023 @11:12AM (#37766349)
wait, are you saying that any sufficiently complicated lisp program contains an ad hoc, informally-specified, bug-ridden, slow implementation of a static type system?
Re:Strong typing, a hill I'm willing to die on by packetlost on Wednesday October 04, 2023 @10:06PM (#37774136)
No. I'm saying you can build almost whatever static analysis tools you want right into the compiler
Re:Strong typing, a hill I'm willing to die on by PrimeMcFly on Wednesday October 04, 2023 @09:56AM (#37765240)
In my experience whenever you put effort into making a post like this, outlining the common arguments you hear and your attempt at refuting them, people don't really pay attention and will just repeat the arguments you already addressed, ignoring your refutations.
Re:Strong typing, a hill I'm willing to die on by stratigos on Wednesday October 04, 2023 @10:17AM (#37765550)
Youre missing the perspective of a business owner and operator that has to hire many people with diverse patterns of thoughts and beliefs who will most likely work for their organization for less than 24 months.
Re:Strong typing, a hill I'm willing to die on by AlanYx on Wednesday October 04, 2023 @10:26AM (#37765703)
If you have a considerable amount of staff turnover, strong typing is a godsend for a large codebase.

Having an order of magnitude more unit tests is another option, but that undermines the alleged "less code" benefit of weak typing.

Re:Strong typing, a hill I'm willing to die on by 1-more on Wednesday October 04, 2023 @10:42AM (#37765896)
What does "strong" mean as regards typing. I've heard a few different definitions so I'm curious what yours is in the context of this article.
Re:Strong typing, a hill I'm willing to die on by bigstrat2003 on Wednesday October 04, 2023 @10:59AM (#37766148)
As far as I'm aware, the generally accepted definition of strong typing is: some object in memory has a type, and the compiler (or interpreter) will not let you treat it as another type without some kind of explicit instruction to do so. This is in contrast to weak typing, where the compiler/interpreter will happily try to treat a Bar object as a Foo object if you do some Foo operation on it.
Re:Strong typing, a hill I'm willing to die on by gpderetta on Wednesday October 04, 2023 @12:21PM (#37767430)
That's the definition of type-safety (or memory safety that is pretty much equivalent). "strong typing" has no generally accepted definition.
Re:Strong typing, a hill I'm willing to die on by bigstrat2003 on Wednesday October 04, 2023 @06:51PM (#37772828)
Memory safety is definitely not equivalent. Memory safety is more like not going past the end of an array, not doing use after free, etc. I agree that what I said is pretty much also the definition of type safety. But in my experience it is also the generally accepted definition of strong typing.
Re:Strong typing, a hill I'm willing to die on by 1-more on Wednesday October 04, 2023 @04:21PM (#37771142)
That seems to be a subset of static typing. Is there an example of this that does not involve non-static typing?
Re:Strong typing, a hill I'm willing to die on by bigstrat2003 on Wednesday October 04, 2023 @08:03PM (#37773343)
I think you mean "involves non-static typing"? If so, Python. You can't (for example) do something like '1 + "2"', because those types aren't compatible. It's dynamically, but strongly, typed.
Re:Strong typing, a hill I'm willing to die on by ndr on Wednesday October 04, 2023 @11:13AM (#37766371)
Consider reading/watching Rich Hickey's talk Effective Programs [0][1] and Maybe Not [2][3]

In [0] in particular there're slides 22/23, here is part of the transcript but makes more sense with the slides on:

> And you can call them problems, and I'm going to call them the problems of programming. And I've ordered them here [...] I've ordered them here in terms of severity. And severity manifests itself in a couple of ways. Most important, cost. What's the cost of getting this wrong? At the very top you have the domain complexity, about which you could do nothing. This is just the world. It's as complex as it is. > > But the very next level is the where we start programming, right? We look at the world and say, "I've got an idea about how this is and how it's supposed to be and how, you know, my program can be effective about addressing it". And the problem is, if you don't have a good idea about how the world is, or you can't map that well to a solution, everything downstream from that is going to fail. There's no surviving this misconception problem. And the cost of dealing with misconceptions is incredibly high. > >So this is 10x, a full order of magnitude reduction in (?) severity before we get to the set of problems I think are more in the domain of what programming languages can help with, right? And because you can read these they'll all going to come up in a second as I go through each one on some slide so I'm not going to read them all out right now. But importantly there's another break where we get to trivialisms of problems in programming. Like typos and just being inconsistent, like, you thought you're going to have a list of strings and you put a number in there. That happens, you know, people make those kinds of mistakes, they're pretty inexpensive.

[0] Video: https://www.youtube.com/watch?v=2V1FtfBDsLU

[1] Slides and transcript: https://github.com/matthiasn/talk-transcripts/blob/master/Hi...

[2] Video https://www.youtube.com/watch?v=YR5WdGrpoug

[3] Slides and transcript https://github.com/matthiasn/talk-transcripts/blob/master/Hi...

Re:Strong typing, a hill I'm willing to die on by sumtechguy on Wednesday October 04, 2023 @02:09PM (#37769256)
Weak typing has its uses in one use case. Transition between systems. Even then you usually want to know what the type is (unless you really do not care about validation errors).

The reality is I never get to choose. I prefer strong typing. But the projects I am on that ship sailed long ago 2 developers back who used this project as a resume builder.