News for hackers. Stuff that matters.
Re:Why bad scientific code beats code following “best practi... by modeless on Sunday August 28, 2016 @01:43PM (#12377475)
I think there is a growing rebellion against the kind of software development "best practices" that result in the kind of problems noted in the article. I see senior developers in the game industry coming out against sacred principles like object orientation and function size limits. A few examples:

Casey Muratori on "Compression Oriented Programming": https://mollyrocket.com/casey/stream_0019.html

John Carmack on inlined code: http://number-none.com/blow/john_carmack_on_inlined_code.htm...

Mike Acton on "Data-Oriented Design and C++" [video]: https://www.youtube.com/watch?v=rX0ItVEVjHc

Jonathan Blow on Software Quality [video]: https://www.youtube.com/watch?v=k56wra39lwA

Re:Why bad scientific code beats code following “best practi... by quotemstr on Sunday August 28, 2016 @02:09PM (#12377620)
For ages now, I've been telling people that the best best code, produced by the most experienced people, tends to look like novice code that happens to work --- no unnecessary abstractions, limited anticipated extensibility points, encapsulation only where it makes sense. "Best practices", blindly applied, need to die. The GoF book is a bestiary, not an example of sterling software design. IME, it's much more expensive to deal with unnecessary abstraction than to add abstractions as necessary.

People, think for yourselves! Don't just blindly do what some "Effective $Language" book tells you to do.

(For starters, stop blindly making getters and settings for data fields! Public access is okay! If you really need some kind of access logic, change the damn field name, and the compiler will tell you all the places you need to update.)

Re:Why bad scientific code beats code following “best practi... by saint_fiasco on Sunday August 28, 2016 @02:33PM (#12377759)
>the best best code, produced by the most experienced people, tends to look like novice code that happens to work

Could it be that best practices are designed to make sure mediocre programmers working together produce decent code?

After all, actual novice programmers write code similar to the best programmers except that it doesn't work.

Re:Why bad scientific code beats code following “best practi... by mavelikara on Sunday August 28, 2016 @03:01PM (#12377917)
"It took me four years to paint like Raphael, but a lifetime to paint like a child." - Picasso
Re:Why bad scientific code beats code following “best practi... by coliveira on Sunday August 28, 2016 @07:20PM (#12379017)
> Could it be that best practices are designed to make sure mediocre programmers working together produce decent code?

Yes, it is, but the issue is that the industry should move away from the idea that software can be done in an assembly line. It is better to have a few highly qualified people capable of writing complex software than a thousand mediocre programers that use GoF patterns everywhere.

Re:Why bad scientific code beats code following “best practi... by saint_fiasco on Sunday August 28, 2016 @08:02PM (#12379170)
Why? The assembly line doesn't need elite hackers, and there aren't that many elite hackers around. There is a place for cost-effective development.
Re:Why bad scientific code beats code following “best practi... by phaus on Monday August 29, 2016 @01:58AM (#12380275)
I'm a security analyst, not a developer so please forgive my ignorance, but how do you become one of the highly qualified coders without first spending some time being a mediocre developer?
Re:Why bad scientific code beats code following “best practi... by quotemstr on Monday August 29, 2016 @02:13AM (#12380324)
You don't. There's no way around having to spend some time in the trenches --- but we can at least minimize the amount of time developers spend in the sophomoric architecture-astronaut intermediate phase by not glorifying excess complexity. Ultimately, though, there's not a good way to teach good taste except to provide good examples.
Re:Why bad scientific code beats code following “best practi... by delazeur on Monday August 29, 2016 @12:05AM (#12379944)
"Best" practices may be a misnomer, but I don't believe it's possible to execute large projects without some kind of standardization. It is inevitable that in some cases that standardization will hinder the optimal strategy, but it will still have a net positive impact. Perhaps if we started calling it "standard practices" people would stop acting like it's a groundbreaking revelation to point out that these practices are not always ideal.
Re:Why bad scientific code beats code following “best practi... by Retra on Sunday August 28, 2016 @02:50PM (#12377855)
I think it's more that the best practices were adopted for specific reasons, but they are not understood or transmitted in a way that makes those reasons very clear. That is, a 'best practice' tends to solve a specific kind of problem under a certain set of constraints.

Nobody remembers what the original constraints are or if they even apply in their current situation, even if they are actually trying to solve the same problem, which they might not be.

Re:Why bad scientific code beats code following “best practi... by RobertKerans on Sunday August 28, 2016 @06:54PM (#12378927)
This spirals as well: I've spent quite a lot of time recently helping people at the early stages of learning programming, and it's taken me a while to stop becoming frustrated with their misunderstandings. Sometimes it is just because something basic isn't clicking for them, but a lot of the time it's down to me trying to explain things through a prism of accumulated patterns that are seen as best practise/common sense, but stepping back and viewing objectively are opaque and sometimes nonsensical outside of very specific scenarios. There's a tendency to massively overcomplicate, but you forget very quickly how complicated, then you build further patterns to deal with the complexity, ad infinitum
Re:Why bad scientific code beats code following “best practi... by JamesBarney on Monday August 29, 2016 @12:21PM (#12382943)
Yep the biggest issue we have with software is every developer knows Single Responsibility Principle, and no developers know why. Everyone knows decouple and increase cohesion, but few any know what cohesion is.
Re:Why bad scientific code beats code following “best practi... by ArkyBeagle on Sunday August 28, 2016 @07:13PM (#12378997)
That's it. "Best practices" is, essentially, coding bureaucracy. That's not a pejorative; bureaucracy is quite necessary.

I have a rough idea of "why OO?" but in practice, it can be pretty hard on things like certain kinds of scaling, projects that require a goodly amount of serialization/configurability and the like.

Re:Why bad scientific code beats code following “best practi... by jjn2009 on Sunday August 28, 2016 @04:01PM (#12378237)
There is a spectrum of "it just works" to "I've applied every best practice" bad programmers who spend huge amounts of time on best practices will end up wasting a lot of time over optimizing but it may have the benefit of reducing risk where they may have a lack of deep understanding or it may shine light on that risk, that is if they apply practices correctly.
Re:Why bad scientific code beats code following “best practi... by quotemstr on Sunday August 28, 2016 @04:08PM (#12378266)
You're ignoring how "best practices" frequently add negative value. Design style isn't a trade-off between proper design and expedience. It's a matter of experience, taste, and parsimony.
Re:Why bad scientific code beats code following “best practi... by sanderjd on Sunday August 28, 2016 @04:44PM (#12378434)
Those "Effective $Language" books make arguments for their advice, which you are free to find compelling, or not. Back when I first read Effective Java, maybe about a decade ago, I thought it was over-complicated hogwash that I knew better than. When I read it again starting about a year ago, I found the arguments for most of its advice very compelling, based on problems I've run into time and again in my own, and other people's, code, and not just in Java. YMMV I suppose!

The backlash against "engineered" software definitely seems real, and I think that's great - questioning assumptions is critical - but I think a lot of the insinuations about peoples' motivations and talents are unnecessary and honestly kind of silly. Most of us are just trying to find ways to avoid issues we've seen become problems in other projects in the past, it's not some nefarious conspiracy against simple code.

Re:Why bad scientific code beats code following “best practi... by tigershark on Sunday August 28, 2016 @02:47PM (#12377842)
Are you seriously saying that the best code is an untestable mess of big God classes? Because in my experience this is by far the type of code written by inexperienced programmers. Abstractions and interfaces are the best way to make a system testable and extensible and it has nothing to do with using a pattern just because you read about it in the gof book 5 minutes ago. And using public fields in a non trivial project is a sure receipt for disaster.
Re:Why bad scientific code beats code following “best practi... by et1337 on Sunday August 28, 2016 @04:13PM (#12378293)
> using public fields in a non trivial project is a sure receipt for disaster.

This is just dogma. Every Python project in existence has 100% public fields. Some are disasters, some are beautiful. Only a Sith deals in absolutes.

Re:Why bad scientific code beats code following “best practi... by eximius on Sunday August 28, 2016 @04:44PM (#12378437)

  Better than ugly, beautiful is.
  Better then implicit, explicit is.
  Better than complex, simple is.
  Better than complicated, complex is.
  Better than nested, flat is.
  Better than dense, sparse is.
  Counts, readability does.
  Special enough to break the rules, special cases are not.
  But beaten by practicality, purity is.
  Silently passed, an error should never be.
  Unless explicitly, is it silenced.
  In the face of ambiguity, the temptation to guess, refuse you must.
  One, preferably only one, way to do it, there should be.
  Not obvious, it might be. 
  Better than never, is now.
  But often better than right now, is never.
  If hard to explain, bad it is.
  If easy to explain, good it may be.
  Namespaces are a honking good idea - more of them we should do!
-- The Zen of Python, Yoda
Re:Why bad scientific code beats code following “best practi... by kazinator on Sunday August 28, 2016 @07:39PM (#12379086)
> Namespaces are a honking good idea - we should do more of them!

That should be:

   english.namespaces english.verbs.are english.articles.a american.english.vernacular.adjective.honking ...
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @08:55PM (#12379335)
No, that's Java. Flat is better than nested: no self-respecting Python programmer would write hierarchy that deep.
Re:Why bad scientific code beats code following “best practi... by ubernostrum on Monday August 29, 2016 @06:31AM (#12381030)
No, Java looks like the famous quotation about the nail and the horse from:

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom...

Re:Why bad scientific code beats code following “best practi... by joesb on Monday August 29, 2016 @03:08AM (#12380486)
So which rule take precedents here? Namespace is obviously not flat, at least it's more nested than one without namespace.

That's the problem I have with people praising Zen of Python as if it means anything. It's like a bible you just pick the verse you like to justify your action even if it might conflict with other rules. Then you praise the whole thing for being so wise.

Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Monday August 29, 2016 @07:03AM (#12381128)
It means a lot: good python code follows it. However, yes, some of the verses conflict, because it turns out that good advice sometimes contradicts itself. All I can say is don't go too far in either direction.
Re:Why bad scientific code beats code following “best practi... by LyndsySimon on Monday August 29, 2016 @12:11PM (#12382869)
Much of the point of the Zen of Python is that it's self-contradictory.
Re:Why bad scientific code beats code following “best practi... by eximius on Friday September 02, 2016 @02:33AM (#12411271)
Balanced, you must be.
Re:Why bad scientific code beats code following “best practi... by pyre on Monday August 29, 2016 @02:52AM (#12380431)
You would prefer PHP[1] where the standard library has no namespaces?

[1] I refer to "classic" PHP. No clue if anything PHP5+ fixed this, though I doubt that they would make such a breaking changed even across major revisions.

Re:Why bad scientific code beats code following “best practi... by kazinator on Monday August 29, 2016 @10:28AM (#12382030)
Yes, I would. And though PHP is widely agreed to be piece of shit (it seems: I don't work with PHP so I'm here only relaying this popular sentiment), that doesn't tarnish the idea by association (which is what I sense you might be trying to do).

ISO C and POSIX also have a flat library namespace, together with the programs written on top. Yet, people write big applications and everything is cool. Another example is that every darned non-static file-scope identifier in the Linux kernel that isn't in a module is in the same global namespace.

Namespaces are uglifying and an idiotic solution in search of a problem. They amount to run-time cutting and pasting (one of the things which the article author is against). Because if you have some foo.bar.baz, often things are configured in the program so that just the short name baz is used in a given scope. So effectively the language is gluing together "foo.bar" and "baz" to resolve the unqualified reference. The result is that when you see "baz" in the code, you don't know which "baz" in what namespace that is.

The ISO C + POSIX solution is far better: read, fread, aio_read, open, fopen, sem_open, ...

You never set up a scope where "sem_" is implicit so that "open" means "sem_open".

Just use "sem_open" when you want "sem_open". Then I can put the cursor on it and get a man page in one keystroke.

Keep the prefixes short and sweet and everything is cool.

I was a big believer in namespaces 20 years ago when they started to be used in C++. I believed the spiel about it providing isolation for large scale projects. I don't believe it that much any more, because projects in un-namespaced C have gotten a lot larger since then, and the sky did not fall.

Scoping is the real solution. Componentize the software. Keep the component-private identifiers completely private. (For instance, if you're making shared libs, don't export any non-API symbols for dynamic linking at all.) Expose only API's with a well-considered naming scheme that is unlikely to clash with anything.

Re:Why bad scientific code beats code following “best practi... by zackmorris on Monday August 29, 2016 @05:55PM (#12385724)
PHP namespacing in many ways ruined the language. I'm not just talking about the poorly chosen use of the backslash '\' path separator or the fact that namespaces aren't automatically inferred which causes me to have to write "use" endless times at the top of the file which destroys my productivity when working outside an IDE.

I'm talking about the heart of PHP which is stream processing. Why in the world would you destroy the notion of simply including other source files in order to wedge in this C++ centric notion of a namespace? Before "namespace" and "use", the idea was that all of the files included together can be treated as one large file, and sadly that conceptual simplicity has been lost.

Also the lost opportunity of having objects be associative arrays like Javascript, combined with namespacing, have convinced me that perhaps PHP should be forked to a language more in-line with its roots. I haven't tried Hack or PHP7 yet but I am apprehensive that they probably make things worse in their own ways.

I think of PHP as a not-just-write-only version of Perl, lacking the learning curve of Ruby, with far surpassed forgiveness and access to system APIs over Javascript/NodeJS. Which is why it's still my favorite language, even though the curators have been asleep at the wheel at the most basic levels.

Re:Why bad scientific code beats code following “best practi... by jwdunne on Monday August 29, 2016 @05:39AM (#12380900)
The standard library isn't namespaced. If you want to use a stdlib function inside an NS, you can without issue. If you want to use a stdlib class, or any top level class, it needs backslash before its name or you need to import it.

There is a community move towards a standard namespacing with PHP-FIG. This is useful and we are seeing lots of progress on internals thanks to the work by the community.

Like a lot of things, PHP name spaces are or were a big mess. Lots of progress is being made to improve though I think a lot must remain.

I've thought about creating a project that packages up various categories in the stdlib into namespaces with consistent inputs and outputs. That would be nice but the process isn't a lot of fun.

Re:Why bad scientific code beats code following “best practi... by balnaphone on Sunday August 28, 2016 @07:00PM (#12378947)
(an attempt to translate to standard english grammar, for the benefit of other non-native English readers, who may also struggle to parse this)

  Beautiful is better than ugly.
  Explicit is better then implicit.
  Simple is better than complex.
  Complex is better than complicated.
  Flat is better than nested.
  Sparse is better than dense.
  Readability counts.
  Special cases are not special enough to break the rules.
  But purity is beaten by practicality.
  An error should never be silently passed.
  Unless it is silenced explicitly.
  You must refuse the temptation to guess in the face of ambiguity.
  There should be one, preferably only one, way to do it.
  It might not be obvious. 
  Now is better than never.
  But never is often better than right now.
  It is bad if it is hard to explain.
  It may be good if it is easy to explain.
  Namespaces are a honking good idea - we should do more of them!
Re:Why bad scientific code beats code following “best practi... by cariaso on Sunday August 28, 2016 @08:37PM (#12379281)
instead of offering your own translation, we can instead go back to the original english. Run 'python -m this' and you will see

The Zen of Python, by Tim Peters

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

Special cases aren't special enough to break the rules.

Although practicality beats purity.

Errors should never pass silently.

Unless explicitly silenced.

In the face of ambiguity, refuse the temptation to guess.

There should be one-- and preferably only one --obvious way to do it.

Although that way may not be obvious at first unless you're Dutch.

Now is better than never.

Although never is often better than right now.

If the implementation is hard to explain, it's a bad idea.

If the implementation is easy to explain, it may be a good idea.

Namespaces are one honking great idea -- let's do more of those!

Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @04:52PM (#12378470)
Now those are some best practices I can live by.
Re:Why bad scientific code beats code following “best practi... by kilink on Sunday August 28, 2016 @07:54PM (#12379140)
I think the advice is more relevant in the context of the specific language; it's not universal.

In python you can go from attribute access to using a property (getter/setter) without breaking anything.

The same is not true in a language like Java where obj.foo is always a direct field access distinct from calling a method like obj.getFoo(), so going from public fields to getters is not backwards compatible and can be painful.

Re:Why bad scientific code beats code following “best practi... by superbatfish on Sunday August 28, 2016 @09:22PM (#12379418)
>In python you can go from attribute access to using a property (getter/setter) without breaking anything.

True, but that should be avoided if possible. Python 'properties' violate the principal of "explicit is better than implicit". Once you realize "Oops, I need an accessor function here", the lazy programmer says "Aww, grepping for all uses of .foo and replacing them with .getFoo() will take 20 minutes. Instead, I'll just redefine it as a property and no one will notice." If you care about quality, go the extra mile: make it clear to the people reading your code that a function is being called.

Properties are a kinda nice language feature, but they are so frequently misused that I think the language would have been better off without them. They encourage bad habits.

Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @08:59PM (#12379351)
However, it's still a simple enough change that you shouldn't build getter/setters unless you're already pretty sure it'll be changed. OTOH, if you're using a language with generated getter/setters (ruby, smalltalk, lisp), just do it.
Re:Why bad scientific code beats code following “best practi... by sbov on Monday August 29, 2016 @01:00AM (#12380103)
Using find & sed is not painful.

I use getters and setters, but still think you will waste more time arguing about this issue, than leaving it be and finding out you have to change them down the line.

Edit: also, especially for getters, I like my accessors to be simple accessors. Hiding too much code behind them can be unpleasantly surprising, so as they deviate further from accessors I like to rename them - e.g. CalculateXxxx rather than GetXxx. Fewer surprises. Given that, I potentially have an issue with continuing to call it GetXXX or SetXXX in the face of certain changes.

Re:Why bad scientific code beats code following “best practi... by pitay on Monday August 29, 2016 @02:40AM (#12380395)
Using find & sed is not painful.

Using an IDE with an understanding of the language you have is even less painful. Having the IDE automatically refactor a public field to use getters and setters is a breeze with managed languages like Java and C#.

Re:Why bad scientific code beats code following “best practi... by imtringued on Monday August 29, 2016 @05:35AM (#12380890)
The same can be said about interal interfaces with only one implementation. If there is really a need for an interface then why not add it later until it's actually needed it instead of creating additional overhead for something we may never need?
Re:Why bad scientific code beats code following “best practi... by tigershark on Sunday August 28, 2016 @05:48PM (#12378706)
If there are inexperienced programmers working on it, as in my preamble, then almost surely it is in whatever language that doesn't prohibit to mutate objects indiscriminately. In F#, Haskell and other languages that enforce immutability obviously it isn't a problem, in Python most surely it is.
Re:Why bad scientific code beats code following “best practi... by et1337 on Sunday August 28, 2016 @10:31PM (#12379615)
Eh. Inexperienced programmers will find a way to screw things up somehow. Probably by over-engineering, like the original article describes.
Re:Why bad scientific code beats code following “best practi... by MaulingMonkey on Sunday August 28, 2016 @05:10PM (#12378549)
Code can be underabstracted, but it can also be overabstracted - and abstracted with the wrong abstractions. And fixing the latter sometimes involves a temporary stay at "untestable mess of big God classes" when you remove the bad abstractions to clear the way for creating better ones. Not because it's the best code - far from it - but because it's slightly less terrible code.

> And using public fields in a non trivial project is a sure receipt for disaster.

Ergo, all non trivial C projects are disasters? Well, maybe, but I disagree on the reasons.

Language enforced encapsulation is a useful tool, but some people take it to the deep end and assume that if their math library's 3D vector doesn't hide "float z;" in favor of "void set_z(float new_z);" and "float get_z() const;" (one of which will probably have a copy+paste bug because hey, more stupid boilerplate code), they'll have a sure receipt for disaster. Which I suspect you'd agree is nonsense - but would also follow from reading your words a little too literally.

Re:Why bad scientific code beats code following “best practi... by tigershark on Sunday August 28, 2016 @05:44PM (#12378696)
In my experience, in quite big projects, people had a tendency to mutate objects in the wrong place and in the wrong reasons. A field encapsulated in a getter without setter certainly helps.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @09:09PM (#12379385)
But if it has to be able to be mutated in some cases, you're stuck. This is a place where Scheme's parameterize may be useful: Define a closure with the setter in scope, and write it so that when it's called with a lambda as an arg, it will raise an error unless those certain conditions are met, in which case, it will use parameterize to make the setter available in the lambda's scope. Or I suppose it could pass it in, which would be slightly simpler...
Re:Why bad scientific code beats code following “best practi... by chopin on Sunday August 28, 2016 @05:59PM (#12378740)
That would be a final field. But generally I agree with you and its by far the pattern I use most.
Re:Why bad scientific code beats code following “best practi... by kuschku on Sunday August 28, 2016 @07:51PM (#12379132)
The issue is, for example, if you have for example a class encapsulating a bunch of flags, and allowing the user to either set each flag seperately, or a bitfield representing all of it.

In C, you might be able to do some magic, but in Java, you’ll need setters and getters there – you can’t even do final fields there.

Luckily, in C#, you can just use accessors, and maybe in Java with Lombok, too.

Re:Why bad scientific code beats code following “best practi... by blablabla123 on Sunday August 28, 2016 @03:43PM (#12378142)
I think he is rather referring to cascades of function calls/types and "custom solutions". Of course abstractions are a great tool when used properly. Thinking of a best practice from Object oriented design: low coupling but high cohesion.

When you use abstractions, you get low coupling. But like everything in life, also this has a price: you may need an extra line of code to instantiate the abstraction and sometimes have to write an extra getter because it's not perfect yet. That's a fine price to pay unless go you use way too many abstractions and they are nested deeply. It may have some aesthetics but it can be hell to debug and overly complicated to extend code.

So that's why one must also focus on high cohesion. I really like the modern JavaScript way, the imports/requires are for low coupling and the build automation is for cohesion. Anyways, these things are best practices as well but not sure if the author took those into account... ;)

Re:Why bad scientific code beats code following “best practi... by bartread on Sunday August 28, 2016 @05:26PM (#12378635)
I don't think that's seriously what he's saying. You've over-interpreted to project the "logical" extreme of the POV expressed on the author. This is a trope in online debate that needs to die.
Re:Why bad scientific code beats code following “best practi... by ArkyBeagle on Sunday August 28, 2016 @07:22PM (#12379026)
I've returned recently ( for domain-specific reasons ) to sets of (opaque) god-classes with good interfaces when needed. No state in a god-class is visible except through the interface.

Since the domain requires a great deal of serialization, the interfaces are usually strings over that. In cases, it's even easier to just open a socket to the serialization interface.

So far, I'm able to pub/sub periodic data streams, but it'd be pretty easy to add "wake me when" operators and such.

It forces the use of one central table of names cross callbacks ( which can be grown dynamically ) but it's very, very nice to work with.

YMMV. The domain is instrumentation and industrial control, which just fits this pattern nicely. All use cases can and are specified as message sequences.

Re:Why bad scientific code beats code following “best practi... by flukus on Sunday August 28, 2016 @08:20PM (#12379237)
I've been using the delegation pattern a lot lately as a nice way to combine the best bits of god classes (few dependencies) with the best of SRP (small easy to test parts).

This way A, B, C (and many others) only depends on X, the delegator (which exposes a number of interfaces for practically everything), but X depends on everything and the kitchen sink, X contains no real functionality.

Re:Why bad scientific code beats code following “best practi... by ArkyBeagle on Sunday August 28, 2016 @08:59PM (#12379353)
"Delegator". Now I know what to call it :)
Re:Why bad scientific code beats code following “best practi... by andrepd on Sunday August 28, 2016 @05:42PM (#12378682)
>And using public fields in a non trivial project is a sure receipt for disaster.

Why, though? Surely it's the programmers' job to access what they need and leave alone what the don't. As someone else said, Python has no concept of public/private and it works okay.

Re:Why bad scientific code beats code following “best practi... by jedmeyers on Sunday August 28, 2016 @08:05PM (#12379180)
If you make the statically typed field public you lose the ability to change the implementation without breaking the clients. (Getters/setters have the same problems, but not as pronounced). And no, you don't always have the ability to recompile everything that's using your code.
Re:Why bad scientific code beats code following “best practi... by lmm on Monday August 29, 2016 @04:10AM (#12380664)
Python doesn't really "work okay" for ongoing projects. Framework updates become a 6-month migration job.
Re:Why bad scientific code beats code following “best practi... by colejohnson66 on Monday August 29, 2016 @01:07AM (#12380131)
An argument for properties are to hide the implementation details. It keeps idiots from changing variables they shouldn't (if they really want to, there's sometimes reflection), and it hides implementation detail variables from the autocomplete box.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @04:52PM (#12378469)
Make your code testable, but public fields are fine.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @04:49PM (#12378457)
Blind application needs to die in general. SOLID is a good idea (it should just be SID, IMHO, but anyways), so are design patterns... when they make sense. When you think "I need to delegate object construction to different subclasses contextually" use a factory. Don't use a factory when you don't think that. When you need to chose an approach that should be given by the caller, no, for the love of god don't use the Strategy pattern. The strategy pattern is a hack that belongs in the past, and you should use lambdas instead because it's the 21st freaking century, not 1996, and we all have lambdas now. So don't use strategy, unless you're stuck behind, and if you do, feel bad about it.

/rant

Anyways, yeah, just use your brain, insist on defined interfaces, and if something might be suboptimal, allow for it to be changed, and you'll be fine.

Re:Why bad scientific code beats code following “best practi... by quotemstr on Sunday August 28, 2016 @04:55PM (#12378482)
> The strategy pattern is a hack that belongs in the past, and you should use lambdas instead

In that case, your lambda object is your strategy. One of the good points that the "Design Patterns" authors make and that everyone else ignores is that these patterns are names for recurring structures that pop up independently of implementation language and environment. Some silly functor object is one way of implementing the more abstract "Strategy" pattern. Your lambda is a better one in many cases. It's the same high-level concept.

Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @05:05PM (#12378528)
Well, yes, but if you every write a class for C#, modern Java, or pretty much any language save C++ or Python (and even then you should write functions) that has the word "strategy" in it, you're doing it wrong, and should be punished for reinventing language features using OO methodology.

Was it Steve Yegge who menationed the Perl community calling Design Patterns "FP for Java"?

Re:Why bad scientific code beats code following “best practi... by quotemstr on Sunday August 28, 2016 @05:28PM (#12378642)
I don't know, but this Yegge essay is one of my favorites ever: http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom...
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @06:06PM (#12378768)
I hadn't read that one. The line about the meaning of lambda is hilarious. Anyways, yeah the line was in "Singleton Considered Stupid."

https://sites.google.com/site/steveyegge2/singleton-consider...

Re:Why bad scientific code beats code following “best practi... by willtim on Monday August 29, 2016 @03:31AM (#12380564)
There is a name for "strategy pattern" that existed long before the GoF book: higher-order function. But what's worse, in that it causes confusion, is when names are repurposed, "Functor" is a useful abstraction in programming, but is not related to your usage above.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Monday August 29, 2016 @09:45AM (#12381773)
Well, a Functor isn't an HOF, and an HOF needn't be an implementation of Strategy.
Re:Why bad scientific code beats code following “best practi... by willtim on Monday August 29, 2016 @06:05PM (#12385810)
I never said a Functor was a HOF, but it's not far wrong. The implementation of the morphism-mapping part of a functor is a higher order function. Show me an example of Strategy that is not essentially a HOF.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Tuesday August 30, 2016 @08:15AM (#12389292)
All strategy is HOF, not all HOF is strategy: Observe:

  (define (make-counter n)
    (lambda (c)
      (set! n (+ n c))
      n))
This is a HOF, but not an instance of Strategy.
Re:Why bad scientific code beats code following “best practi... by willtim on Tuesday August 30, 2016 @10:43AM (#12390592)
I asked for an example of Strategy that wasn't just a HOF, but I now see you do agree with this. Yes your example is technically a HOF as it returns a function. So I guess your point is that HOF is not specific enough, although one might argue that in general usage it usually does imply function-value arguments.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Tuesday August 30, 2016 @08:41PM (#12395099)
I mean, that's not the general use I see, so we clearly have different social circles. The thing is, a HOF is a mechanism, the Strategy pattern is an intent. I would in fact argue that there is at least one HOF that takes functions as arguments and isn't an instance of strategy: call/cc.

call/cc does not actually use the passed in function to determine how any action should be done. All it does is provide a capture of the current continuation as an argument. That's it. So it's not a strategy, it's just a HOF.

Re:Why bad scientific code beats code following “best practi... by willtim on Wednesday August 31, 2016 @02:08AM (#12396314)
Well Java didn't add lambdas to write make-counter, it was map and fold that got them envious. In fact, IIUC mathematically make-counter is first-order, counting the nesting of funtion types. In other words, I don't understand why many describe it as a HOF at all. Map and fold are second order. Callcc, ignoring its Scheme implementation as a macro, would be third order. One could argue that the second order argument to callcc is strategy, with the continuation being the strategy.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Wednesday August 31, 2016 @11:06AM (#12398845)
Call/cc isn't a macro. It's actually a special form, although in CPS-based schemes, it could probably be implemented as a function if there was a lower level continuation primitive.

And semantically, a continuation is pretty much never a strategy.

As for make-counter not being higher-order, that's just not true. A higher-order function takes and/or returns a function. make-counter returns a function: it's higher-order.

Re:Why bad scientific code beats code following “best practi... by willtim on Wednesday August 31, 2016 @01:35PM (#12400038)
No its disputed, for the reasons I gave. But I've already accepted that many regard make-counter to be a HOF. I was careful and said make-counter is not a second-order HOF, which Strategy is.

Callcc can be implemented as a function, no continuation primitives needed. Haskell has examples in its libraries.

Lastly, regarding semantics, I see no difference between Strategy and a second-order HOF. Yes the scope of Strategy is supposed to much more limited, but I don't see value in this. I concede that others might do.

Re:Why bad scientific code beats code following “best practi... by willtim on Thursday September 01, 2016 @01:29PM (#12407216)
Having thought about this further, I think it is probably only correct of me to talk about the "order" of "functionals" as in functions to scalars in mathematics. The term "rank" is better suited here. Category theory supports the popular definition of higher-order function and gives a different meaning to "order". So make-counter is rank-1 but still higher-order. Apologies for the previous post.
Re:Why bad scientific code beats code following “best practi... by tigershark on Monday August 29, 2016 @03:28AM (#12380560)
Automatic factories are extremely useful to kill the ServiceLocator anti-pattern.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Monday August 29, 2016 @06:58AM (#12381118)
The ServiceLocator anti-pattern seems a bit silly: either just depend on the object directly, or if there may be different objects used throughout the system, pass one in.
Re:Why bad scientific code beats code following “best practi... by jcoffland on Sunday August 28, 2016 @02:14PM (#12377653)
One of my guiding principals as a programmer is to never add code because I might need it some day.
Re:Why bad scientific code beats code following “best practi... by quotemstr on Sunday August 28, 2016 @02:17PM (#12377674)
Still, apply common sense. Sometimes the probability of adding something is so high and the cost of making an extension point so low that it makes sense to design with extensibility in mind. These extension points are rare, though, and usually occur at major module boundaries (e.g., plugins), and don't need to be scattered through random bits of your code.
Re:Why bad scientific code beats code following “best practi... by sbov on Sunday August 28, 2016 @02:52PM (#12377870)
You also have to factor in the cost to maintain your extension which you currently have no use for, which most people forget.

It also might be easy to include now, but your extension might complicate a new feature request. Or the new feature might complicate your previously simple extension. If it's still unused, don't be afraid to throw it away then either.

Re:Why bad scientific code beats code following “best practi... by Gibbon1 on Sunday August 28, 2016 @03:43PM (#12378136)
I find that unneeded functionality also complicates refactoring efforts.
Re:Why bad scientific code beats code following “best practi... by jcoffland on Sunday August 28, 2016 @02:23PM (#12377716)
Still, why not wait to add it?
Re:Why bad scientific code beats code following “best practi... by Bahamut on Sunday August 28, 2016 @02:46PM (#12377837)
Because sometimes those choices have a large effect on the amount of work/mental tax in the future - for example, if you know that a new feature will have to interop with yours in the near future and the cost is low to implement the right extensibility point now, it would be absolutely stupid not to - I would call that bad engineering that costs time & effort.

Obviously one doesn't want to go down the rabbit hole too early, but the other extreme is just as bad.

Re:Why bad scientific code beats code following “best practi... by ArkyBeagle on Sunday August 28, 2016 @07:25PM (#12379043)
Waiting is good when the cost model for the added code is much more in focus later.
Re:Why bad scientific code beats code following “best practi... by cle on Sunday August 28, 2016 @02:44PM (#12377821)
The cost to add it is often much higher, once the code has high fan in (lots of code paths depend on it).

I am definitely a fan of not over engineering, but I'm more of a fan of thinking. Think about your problem and your use cases, and about your own ability to predict the future. If you can predict future changes with high probability, then go ahead and design for those. If you're not a domain expert, you probably can't predict the future at all (and you probably grossly underestimate how bad your predictions are), so you should stick to the bare minimum.

Re:Why bad scientific code beats code following “best practi... by jcoffland on Sunday August 28, 2016 @03:00PM (#12377910)
It's a slippery slope.
Re:Why bad scientific code beats code following “best practi... by jwatte on Sunday August 28, 2016 @02:36PM (#12377786)
The GoF book is a dictionary. When it came out, we all got names for patterns we use when appropriate. The thing that must die is over-reliance on formalisms where they don't add value. (Because there absolutely are places where they do.)

Having the taste to use the right approach for each job is what sets experience apart!

Re:Why bad scientific code beats code following “best practi... by rattray on Sunday August 28, 2016 @05:54PM (#12378722)
Sorry, what is the GoF book?
Re:Why bad scientific code beats code following “best practi... by detaro on Sunday August 28, 2016 @05:57PM (#12378735)
Design Patterns: Elements of Reusable Object-Oriented Software, whose four authors are sometimes called the Gang of Four (GoF). It established a vocabulary of common patterns.

https://en.wikipedia.org/wiki/Design_Patterns

Re:Why bad scientific code beats code following “best practi... by rattray on Sunday August 28, 2016 @06:14PM (#12378796)
Thanks very much!
Re:Why bad scientific code beats code following “best practi... by ScottBurson on Sunday August 28, 2016 @07:45PM (#12379109)
For ages now, I've been telling people that the best best code, produced by the most experienced people, tends to look like novice code that happens to work --- no unnecessary abstractions, limited anticipated extensibility points, encapsulation only where it makes sense.

I love this.

"Perfection is reached, not when there is nothing left to add, but when there is nothing left to take away." -- Antoine de Saint-Exupery

Have to disagree a little on getters and setters though. They're tremendously useful as places to set breakpoints when debugging. Well, setters are, anyway; I guess it's rarer that I'll use a getter for that. Anyway, perhaps we can agree that the need for these is a design flaw in Java; C# has a better way.

Re:Why bad scientific code beats code following “best practi... by userbinator on Sunday August 28, 2016 @06:35PM (#12378864)
For ages now, I've been telling people that the best best code, produced by the most experienced people, tends to look like novice code that happens to work --- no unnecessary abstractions, limited anticipated extensibility points, encapsulation only where it makes sense.

In other words, the best code is the simplest code that works. It usually tends to be very flexible and extensible anyway, because there is so little of it that understanding it all and modifying it becomes easy. The most experienced programmers are the ones who can assess a problem and write code to capture its essence, and not waste time doing that which isn't necessary.

I've observed that there is a "spectrum of complexity" with two very distinct "styles" or "cultures" of software at either end; at one end, there is the side which heavily values simplicity and pragmatic design. Examples of these include most of the early UNIXes, as well as later developments like the BSD userland. The code is short, straightforward, and humble, aptly described by "novice code that happens to work".

At the other end, there's the culture and style of Enterprise Java and C#, where solving the simplest of problems turns into a huge "architected" application/framework/etc. with dozens of classes, design patterns, and liberal amounts of other bureaucratic indirection. The methodology also tends to be highly process-driven and rigid. I don't think it's a coincidence that the latter is heavily premised on and values "best practices" more than anything else.

Here's another one of the "rebellion" articles against "best practices": ttp://www.satisfice.com/blog/archives/27

Re:Why bad scientific code beats code following “best practi... by bartread on Sunday August 28, 2016 @05:24PM (#12378623)
^^^This. The tendency for a certain type of software engineer to go around telling everyone else they're doing it wrong reminds me strongly of this scene from Justified: https://www.youtube.com/watch?v=LG4hOjJ9tEs.
Re:Why bad scientific code beats code following “best practi... by crististm on Monday August 29, 2016 @12:01AM (#12379935)
The problem with their advice is that they are not master Foo. They could tone it down a little for their wisdom is not absolute. Some rules works for some people in some situations and other rules are just practical conventions.

One good advice I found is to just plain ignore status quo, and follow common sense when the context demands it.

Re:Why bad scientific code beats code following “best practi... by jimmaswell on Sunday August 28, 2016 @05:41PM (#12378677)
The getter/setter problem is solved very nicely by C#. You can change a field to a property at any time without changing the rest of the code, and a lot of the use cases for get/set can be handled compactly like public int X{get; private set;} instead of having to have 2 variables.
Re:Why bad scientific code beats code following “best practi... by jwatte on Sunday August 28, 2016 @02:41PM (#12377808)
Getters/setters are important when the data structure is used from a different linkage unit than where it is defined, and binary compatibility across versions is important.

That doers happen, but usually in fewer cases than most intermediate programmers realize. Instead, they see cases where it is used for real (like winforms or Direct3D) and cargo cult it into all code they write.

Re:Why bad scientific code beats code following “best practi... by blahedo on Sunday August 28, 2016 @03:11PM (#12377970)
> they see cases where it is used for real (like winforms or Direct3D) and cargo cult it into all code they write.

And a lot, a lot, of my CS prof colleagues believe it is deeply important, for reasons most of them are unable to articulate, that in an intro CS1 class all instance variables be private and accessed only through getters and setters. This is actually baked into the College Board's course description for AP CS A, and a point or two (out of 80) often hinges on it in every exam, so it is near-universally taught in high-school level CS classes (in the US). Sigh.

Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @04:56PM (#12378488)
So I have to write BS for AP CS A, and I have to do it in a bad language, and we'll never get Python or Lisp?

Okay, College Board, I warned you...

smack

this is for the above.

smack

and this is for teaching CS poorly in general.

smack

and this is for making us all by overpriced graphing calculators, thus keeping demand high...

Re:Why bad scientific code beats code following “best practi... by quotemstr on Sunday August 28, 2016 @03:32PM (#12378082)
The kinds of things you need to do in order to maintain a stable ABI are not the kinds of things you should apply to all parts of your program. That way lies madness.

BTW, you don't need accessors even for public ABIs. stat(2), for example, doesn't need "accessors" for struct stat and it's been stable for decades. The same idea applies to Win32 core APIs.

Re:Why bad scientific code beats code following “best practi... by the_af on Sunday August 28, 2016 @02:14PM (#12377648)
Not a disagreement, but it's interesting that at least 3 of 4 of the people you mentioned are game programmers (not sure about Mike Acton because his name doesn't ring a bell). Some, like Carmack, are definitely brilliant programmers. But game programming has very specific constraints, doesn't it? Speed and size are comparatively more important than in bussiness/enterprise software, and maintenance is comparatively less important.

That said, I welcome anyone trying to knock OOP off its pedestal.

Re:Why bad scientific code beats code following “best practi... by modeless on Sunday August 28, 2016 @02:35PM (#12377778)
Mike Acton is also a game programmer. Maybe it's just because of the sources I tend to read, but I do think the game industry is leading the way here and I hope others will follow. Perhaps it's because of the focus on performance, but I think any industry could benefit from that. I curse the lack of attention to performance in modern software development every time the Twitter app takes multiple seconds to load on my 2 GHz smartphone.

> maintenance is comparatively less important

I don't agree with this. Certainly maintainability is less of a concern for the gameplay code specific to each game, but game development also encompasses engines and tools which span multiple titles and are used for many, many years. Also, the trend toward free-to-play and subscription games is making maintenance more of a concern even for single titles. World of Warcraft, Team Fortress 2, League of Legends, Clash of Clans; these titles are going to be maintained for years to come. Valve Corporation recently transplanted an entire game (DotA 2) from one game engine to another, while people continued to play.

Re:Why bad scientific code beats code following “best practi... by andrepd on Sunday August 28, 2016 @05:47PM (#12378705)
>I curse the lack of attention to performance in modern software development every time the Twitter app takes multiple seconds to load on my 2 GHz smartphone.

I strongly agree with the sentiment, but also it should be noted that the load time of applications is related more to the storage speed, which is often abysmally bad in phones.

Re:Why bad scientific code beats code following “best practi... by userbinator on Sunday August 28, 2016 @06:01PM (#12378748)
If they didn't have so much code (and data) to load in the first place, a lot of it probably unnecessary, applications would certainly load much faster.
Re:Why bad scientific code beats code following “best practi... by oldmanjay on Monday August 29, 2016 @12:51AM (#12380075)
People who aren't performance obsessed programmers enjoy detailed graphical interfaces, and those tend to require lumps of code and data. It's fine to decry it I guess, but it won't be changing any time soon.
Re:Why bad scientific code beats code following “best practi... by andrepd on Monday August 29, 2016 @10:50AM (#12382195)
The point is that you can have those without the fluff and layers of inefficiency that modern programming introduces.
Re:Why bad scientific code beats code following “best practi... by ben_jones on Sunday August 28, 2016 @06:12PM (#12378790)
They're allowed to do it because of the emphasis on "shipping" and the complete lack of "maintaining" that they have to do afterwards. Most games on release are complete shit for a reason, with very few modern exceptions. Hell it isn't uncommon for a studio to outsource ports and expansions. Making their code someone else's problem is not something non software devs should aspire to.
Re:Why bad scientific code beats code following “best practi... by vvanders on Sunday August 28, 2016 @06:22PM (#12378827)
Except there's these things called game "engines" that have can have lifecycles of 10+ years(Unreal and ID comes to mind).
Re:Why bad scientific code beats code following “best practi... by ben_jones on Sunday August 28, 2016 @07:30PM (#12379062)
"Give a man a game engine and he delivers a game. Teach a man to make a game engine and he never delivers anything."

Most game developers do not build game engines.

Re:Why bad scientific code beats code following “best practi... by yoklov on Monday August 29, 2016 @04:19AM (#12380682)
All of the cited developers do, however.
Re:Why bad scientific code beats code following “best practi... by pandaman on Sunday August 28, 2016 @03:30PM (#12378070)
Maintenance as in "changing the behavior of code on demand" in games is not solved by modifying the code but in the data. As a game programmer I'd terrified if I had to change the code every time requirements change because the requirements in games change dozen times a day. I'd rather give the tools to the game designers so they could implement their own requirements themselves.

Maintenance as in "keeping the code around and reusing it for other projects" is quite important with the games. We go extra length to make code reusable by isolating it from 3d party libraries, compiler features and such.

Re:Why bad scientific code beats code following “best practi... by the_af on Sunday August 28, 2016 @04:46PM (#12378443)
But this goes to reinforce the idea that the principles involved in coding games are very different than those for other software, doesn't it? Therefore, what works in games is not necessarily a good idea for business software, and viceversa.
Re:Why bad scientific code beats code following “best practi... by pandaman on Sunday August 28, 2016 @05:14PM (#12378568)
I am not sure that modifying code instead of data is a good principle for anybody.

I do agree that it depends on the goal you are trying to achieve. E.g. if I had been running a custom software shop or an embedded IT department developing some internal software I'd too make maintenance as complicated as possible so I could bill for more engineers/QA or have more reports to increase my profit/bonuses/political weight etc.

Re:Why bad scientific code beats code following “best practi... by the_af on Sunday August 28, 2016 @07:19PM (#12379012)
> I am not sure that modifying code instead of data is a good principle for anybody.

In my experience, for in-house software, modifying (or adding) code happens all the time. It's so common I'm puzzled that you don't consider it a good principle. In fact, the alternative -- making software so flexible every possible behavior can be customized by modifying data alone -- leads to the "enterprise software" antipattern (as often mocked in The Daily WTF), where everything is needlessly flexible and complicated. Or maybe even the "inner platform effect"!

Even for game development, I've read teams (often?) hack the engines they buy, like it was famously the case for Half-Life, which used a heavily modified Quake engine.

Re:Why bad scientific code beats code following “best practi... by pandaman on Sunday August 28, 2016 @07:49PM (#12379125)
Look at how many people make a game and how many people make in-house software (if you don't know how many people make a game - go to mobygames.com and look up credits for it). Consider functional complexity of one and another then consider the actual complexity of the code. John Blow, quoted above, gives few examples too (e.g. Facebook's client requiring a change in the OS because of running out of the class limit).

Game teams sure hack the engines and modify the code all the time but these modifications are not in response to changing requirements. It's 99% bug fixes, optimizations and planned feature implementation and 1% behavior changes requested by design.

Re:Why bad scientific code beats code following “best practi... by the_af on Sunday August 28, 2016 @11:44PM (#12379879)
I honestly don't understand where you're going re: number of people. Care to elaborate?

I won't argue with you about the 99% data, 1% behavior changes thing. I can't argue with unreferenced statistics :) I seriously doubt your percentages, though. In any case, for business/enterprise software development it's definitely NOT the case. Software changes are both very common and a reasonable activity, so common in fact that if you disagree with this I have to ask (if you don't mind me asking): do you work in software development, and if so, what kind of software?

Edit: and to answer a previous remark of yours: writing new code for feature/change requests has little to do with "making software as complicated as possible". It's likely the opposite: software that does just one thing is easier & faster to write and maintain than needlessly "flexible" and "customizable" systems. If I wanted to make a mess -- and myself indispensable -- I'd definitely go the "extremely customizable, this thing does everything you want sir!" route ;)

Re:Why bad scientific code beats code following “best practi... by pandaman on Monday August 29, 2016 @12:03AM (#12379942)
There are several orders of magnitude of (man hours)/(functional complexity) difference between game companies and enterprise. Changing code is incredibly expensive compared to changing data.

>Software changes are both very common and a reasonable activity, so common in fact that if you disagree with this I have to ask (if you don't mind me asking): do you work in software development, and if so, what kind of software?

I do work in software development, as I said above I am a game programmer.

Re:Why bad scientific code beats code following “best practi... by the_af on Monday August 29, 2016 @10:15AM (#12381951)
Thanks for the reply!

Changing code is indeed expensive, but not prohibitively so. It's so reasonable an activity, in fact, that it's what I do in my day job, and what many others in the business/enterprise software industry also do (especially for in-house tools!). It's making "flexible" software that often turns out to be the costly option. YAGNI and other mottos apply (not blindly of course, but they often do apply). I've never seen in-house software that could be controlled entirely by data. Change requests most often require code changes, and it's not the end of the world.

I suspect your opinions are colored by the fact you're a game programmer. This ties back to my initial assertion: that game programming is different to other kinds of software development; that ease of maintenance, modularity and changing code are comparatively less important, and therefore some practices of the software engineering world are less relevant for game development, while others (raw speed, memory footprint, clever hacks to produce an interesting effect, etc) are more important. This means one has to take the advice of developers from the games industry with this in mind: that what works for games is not always best for the software industry at large, because the constraints & requirements are very different!

Re:Why bad scientific code beats code following “best practi... by pandaman on Monday August 29, 2016 @12:34PM (#12383064)
As I said above, requirements for games change dozen times a day, every day. This is a solved problem in the games industry. Good for you if you can afford code changes but it doesn't make such a solution better.

As of now there is no financial back pressure against the enterprise practices. It may stay like this forever. However, it's not entirely unlikely the situation will change in the future. For instance, in 80-90s people used to be paid handsomely for developing things like in-house email or spreadsheet. Now these jobs are gone because it's much cheaper to configure an off the shelf office suite than keep developers on payroll.

Re:Why bad scientific code beats code following “best practi... by the_af on Monday August 29, 2016 @09:23PM (#12386744)
Let me ask you this: have you ever worked in anything but games development?

The rest of the industry is very different, and it's naive to dismiss it as caused by "lack of financial back pressure". The actual goals and constraints are different, even the program's life cycle, and it's only natural the development principles differ in turn! You'll notice a vast amount of literature about modularity, patterns, programming paradigms, encapsulation, etc. -- some of it misguided, some not. All of this literature is an attempt to cope with change and complexity in the software world; if the answer was "just modify data and never touch the code" I think someone might have noticed.

Do you by any change consider modifying game scripts as "modifying data"? If so, this would explain our disagreement on this matter :)

Re:Why bad scientific code beats code following “best practi... by pandaman on Monday August 29, 2016 @09:59PM (#12386923)
>Let me ask you this: have you ever worked in anything but games development?

I sure did, wrote and supported in-house software. Even though I don't see how it's relevant. It's not like 99% of programming information available is not in reference of enterprise and custom software development since these industries employ so many programmers.

> The rest of the industry is very different,

I am in complete agreement with this.

> and it's naive to dismiss it as caused by "lack of financial back pressure"

How do you explain the difference in cost then?

> The actual goals and constraints are different, even the program's life cycle, and it's only natural the development principles differ in turn!

Let me ask you this: have you ever worked in games development? If not then how do you know it's different? From my experience the only difference is in the financials. Game studios sell their programs and have to make profit from it to stay afloat. In-house developers don't sell anything and are financed by the actual main business' profits. Custom software developers are one step removed from the in-house: they need to sign a customer first but it's done by sales people, after the customer has started paying it's the same smooth sailing. The actual programming in any case is the same - specs go in, code comes out.

> Do you by any change consider modifying game scripts as "modifying data"?

No, scripts are also code. I personally oppose scripting on principle and see the need of scripting as a failure of the programmers but even teams relying on scripts do not spend much effort on the scripting because, as I said above, modifying code is incredibly expensive

Re:Why bad scientific code beats code following “best practi... by the_af on Monday August 29, 2016 @11:22PM (#12387283)
I asked the question because what you're arguing is completely at odds with the reality of software development outside the games industry. Surely you agree your position (I'll restate it here, just so we're in the same page: that it is a bad idea to modify code and a good idea to implement most changes as "changes in data") is completely non-mainstream? Can you grant me that?

I've never worked in the games industry (though I wrote my own naive videogames, starting with my C64; like many of us, I got into computers because I wanted to make games). However, I have many friends who either work or worked in that industry, and they told me how it is. I know enough about death marches to know I mostly don't want to work in videogames (other jobs I'll never take if I can help it: consulting / "staff augmentation" companies). I also know many games programmers don't write automated tests -- I'd be scared of changing anything too if that was the case!

I'm very curious now about your position. I'm sure I must have misunderstood it. If you don't believe in changing code and you don't believe in scripting, then how do you propose stuff like changes in unit behaviors in an RTS are implemented? Say you have to change the enemy AI, or add a new unit that behaves differently, or even fix the path-finding algorithm. How do you change that by modifying only data? I understand tweaking your game by changing data (new sprites, changing the max speed of a unit or the geometry of a 3D level, etc), but actually changing behavior? And what if you're the one who's actually building the game's engine?

> How do you explain the difference in cost then?

I don't follow. Are you arguing games are less or more expensive? The economy of making games is different to business software. Games are hit based. If I read all those articles correctly, most games sell a lot of units near release, then taper off and are forgotten. Yes, some games have multiplayer and the most successful of them may last many years, and some others get add-ons, but still. Business software is completely different, especially if it's in-house: you don't need a "hit", you don't get "sales" and because it's usually not a product in itself, it gets modified constantly as the end-users (who may or may not be programmers) discover new features they need. Software like this usually lasts years, and must therefore be designed using engineering principles which will help a team of (possibly changing) programmers to alter its source code over the course of many years.

Re:Why bad scientific code beats code following “best practi... by pandaman on Tuesday August 30, 2016 @12:28AM (#12387537)
>Surely you agree your position (I'll restate it here, just so we're in the same page: that it is a bad idea to modify code and a good idea to implement most changes as "changes in data") is completely non-mainstream?

It's been mainstream in the games industry for the past 10 years or so. Obviously it's not in the enterprise software.

>If you don't believe in changing code and you don't believe in scripting, then how do you propose stuff like changes in unit behaviors in an RTS are implemented? Say you have to change the enemy AI, or add a new unit that behaves differently, or even fix the path-finding algorithm.

You are conflating two things. Bug fixing obviously requires code changes to repair the defective code. Implementing a new unit or AI is better be setting up flags or adding components from a set. It's no different from the business software recording transactions or entities into a database. Hopefully you don't write new code for each new order or a new SKU in the warehouse?

>I don't follow. Are you arguing games are less or more expensive?

As I said above, games show orders of magnitude less cost per functional complexity. A game with much more different complex behaviors than a typical enterprise system takes much less man/hours to code and test.

Re:Why bad scientific code beats code following “best practi... by Ralfp on Sunday August 28, 2016 @02:21PM (#12377699)
It is, but every once in a while when game engine or library gets posted on, say, HN, you get the usual arguments how code is not unittestable, functions pack boatload of different behaviour into themselves or take in 20 arguments, because if it works for me in my rails app, why shouldn't it work for game engine?
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @04:40PM (#12378417)
A poor programmer uses the first abstractions and ideas to come into their head, and runs with it.

A mediocre programmer uses ideas and abstractions they've heard about being good ideas for this scenario, and just runs with it, occaisionally rewriting as needed.

A good programmer carefully figures out what abstractions and ideas are appropriate for the job at hand, studying and rewriting until they're sure they've gotten them right, and uses them.

A master programmer uses the first abstractions and ideas to pop into their head: they've been at this long enough to know the right approach.

Re:Why bad scientific code beats code following “best practi... by jtrtoo on Sunday August 28, 2016 @05:58PM (#12378738)
Yes. Unfortunately, as with driving, the vast majority of us think we're better than we are. It's good to have confidence, but near impossible to know when we're over estimating our own capabilities ... until it's too late.

In this case it's also more difficult because one doesn't always see the end results of their output, which may also be years down the road (no pun intended).

Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @07:26PM (#12379048)
That's why becoming an master requires experience: you need experience to know what's good and bad, down the line.
Re:Why bad scientific code beats code following “best practi... by jcoffland on Sunday August 28, 2016 @02:11PM (#12377638)
Ridiculously long functions are a maintainability problem but so is a ton of really small functions that do not provide a logical separation of concerns.

OO code can provide modularity which can greatly improve the ability to make changes without breaking other code. On the other hand, when applied poorly it can have they opposite effect.

It's not the concepts, it's how they are applied.

Re:Why bad scientific code beats code following “best practi... by quotemstr on Sunday August 28, 2016 @02:15PM (#12377656)
A swarm of small functions is a worse maintainability problem --- it's not obvious how they interact to solve a particular problem, and the amount of plumbing you need to ship state between these different functions is frequently brutal. Sometimes it's easier to stick things in local variables and just have a long function.

Languages that make it easy to define "local" functions that operate on implicitly captured state can help --- e.g., C++, Lisp, sometimes Java --- but only where it makes sense. I don't believe in splitting functions solely because they're too long.

Re:Why bad scientific code beats code following “best practi... by majewsky on Sunday August 28, 2016 @02:41PM (#12377810)
> Languages that make it easy to define "local" functions that operate on implicitly captured state can help

You don't even need that. In many languages, you can have {}-delimited blocks which cause variables inside of them to go out of scope when control flow exits them. I've used that to great effect in Perl to keep intrinsically large functions maintainable.

Re:Why bad scientific code beats code following “best practi... by runT1ME on Sunday August 28, 2016 @02:53PM (#12377873)
>- it's not obvious how they interact to solve a particular problem, and the amount of plumbing you need to ship state between these different functions is frequently brutal

this is a problem with the architecture, not a problem with small functions.

Re:Why bad scientific code beats code following “best practi... by taneq on Sunday August 28, 2016 @08:48PM (#12379316)
Not to mention that the more small functions you have, the worse your locality of reference (in terms of programmer cache, not CPU cache). In absurdum, software composed of 1-2 line functions which are then composed into higher and higher level 1-2 line functions is no better than software composed of one giant function with internal gotos for flow control.

Agreed that you should never split functions due purely to length, but a super long function smells bad because it suggests poor separation of concerns (if a function's super long then it's probably doing a lot more than one thing). Sometimes this is a problem, sometimes (like the case of Carmack's big main loop function) there's just a lot of small things to do sequentially and one big function is as good a way to represent that as any other.

Re:Why bad scientific code beats code following “best practi... by eecks on Sunday August 28, 2016 @03:06PM (#12377947)
Small functions (less dependencies) are easier to test
Re:Why bad scientific code beats code following “best practi... by quotemstr on Sunday August 28, 2016 @03:29PM (#12378065)
Here's another bit of heresy: testing isn't everything. Very fine-grained test suites frequently break when the structure of code under test changes even when the new code still does its job. In the limit, it's the equivalent of just breaking if SHA256(old_code) != SHA256(new_code).

Very short functions, I've found, encourage this kind of over-testing and just add friction to code changes without actually improving system reliability.

You're better off testing at major functional boundaries, and if you do that, the length of functions matters less than the interface major modules provide to each other.

Re:Why bad scientific code beats code following “best practi... by Swizec on Sunday August 28, 2016 @03:45PM (#12378152)
> You're better off testing at major functional boundaries, and if you do that, the length of functions matters less than the interface major modules provide to each other.

Otherwise known as integration testing, which is far more useful than unit testing because bugs, especially regression bugs, more often occur in the system, than in specific functions.

You can have as many unit tests as you want, but until you have integration test, you have zero coverage for the really complex part of your code.

Unit tests are great for algorithms though.

Re:Why bad scientific code beats code following “best practi... by JulianMorrison on Sunday August 28, 2016 @04:51PM (#12378465)
Small functions are generally uninteresting to test. As smallness approaches "one liner", you're just verifying the compiler. Yes, 1+1 == 2.
Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Sunday August 28, 2016 @04:59PM (#12378506)
It depends on how small, and how swarm-y. If the function is hilariously simple, and improves readability (like a premade getter for an alist or cons based structure in lisp), just do it. If it's pretty big, and you'll never reuse it... No. If you must, keep it local.
Re:Why bad scientific code beats code following “best practi... by optforfon on Sunday August 28, 2016 @11:34PM (#12379845)
Even if you don't reuse a function it still encapsulates certain things. By looking at the name you know what it does (self-documenting-code). The interface tells you what variables it depends on. And finally it logically segregates your code.

I think the real reason people don't like small function is simply code navigations - which honestly is a poor excuse. That's an editor/IDE problem

Re:Why bad scientific code beats code following “best practi... by qwertyuiop924 on Monday August 29, 2016 @06:50AM (#12381091)
Yes, but encapsulation isn't always a good thing: it lessens your awareness of what's happening within the encapsulated environment. This can lead to bugs.
Re:Why bad scientific code beats code following “best practi... by jcoffland on Sunday August 28, 2016 @02:21PM (#12377701)
Agreed, but really long functions are an indication that the code could benefit from some judicious refactoring.
Re:Why bad scientific code beats code following “best practi... by staticautomatic on Sunday August 28, 2016 @02:37PM (#12377787)
And yet invariably it's refactoring into a ton of small functions. Round and round we go...
Re:Why bad scientific code beats code following “best practi... by jcoffland on Sunday August 28, 2016 @03:02PM (#12377918)
Why? I've been recommending the middle ground all along.
Re:Why bad scientific code beats code following “best practi... by smitherfield on Sunday August 28, 2016 @02:30PM (#12377746)
The 90's and 00's fetishization of OO as magic incantation that makes your code better did generate a lot of anti-patterns, some built into the languages. Multiple/deeply-multilevel inheritance, singletons, constructors with side effects, IO objects, and all the more trivial code-bloating boilerplate like "put everything in a class" and getters and setters.
Re:Why bad scientific code beats code following “best practi... by cjfont on Sunday August 28, 2016 @04:47PM (#12378448)
In regards to the length of functions, to me it comes down to whether it is preferable to have the entire content of the function visible to the programmer at the time any changes need to be made, or if there are multiple things going on that can be assessed independently of each other. The idea of setting a hard rule that a function can only be as long as your screen height ignores the context is what is being done within the function, and encourages the programmer to make breaks in places where it may not make sense to do so.
Re:Why bad scientific code beats code following “best practi... by pkroll on Sunday August 28, 2016 @02:23PM (#12377715)
Was it Atwood who said, modifying someone else's quote: "The two hardest problems in programming are cache invalidation, naming things, and off-by-one errors?"

Aside from separation of concerns when you make many, many functions, you have to come up with So Many Names.

Re:Why bad scientific code beats code following “best practi... by Gibbon1 on Sunday August 28, 2016 @04:12PM (#12378291)
A lot of those names will end up being the equivalent of nasty old assembly comments.

  add 10   ; add 10 to accumulator.
becomes

  int AddTen(int x) { return(x+10);}
Re:Why bad scientific code beats code following “best practi... by dibanez on Sunday August 28, 2016 @02:03PM (#12377580)
Muratori's compression-oriented programming and Acton's data-oriented design have really helped me in writing HPC code. Carmack's arguments make sense for apps that have a clear main function, although they're less applicable to libraries.

I consider these also "best practices", they are just better for performance than object-oriented practices applied to many small objects.

Re:Why bad scientific code beats code following “best practi... by yumaikas on Monday August 29, 2016 @01:44AM (#12380224)
One other important thing to keep in mind when considering that crowd is that all of them are game programmers, which face a very different set of constraints than web developers (which is what I think a lot of people here are) face. That being said, I do like a lot of what they have said in the past.

Not to say that the above aren't all examples of skilled programmers, and likely much more practical than a lot of people, just that they have a very different experience in the world than say, Uncle Bob or Martin Fowler. (Some of the more "best practices" developers).

I think an overarching trend is that programmers in general are realizing that "best practices" like all the OOP design patterns (like the flyweight or adapter patterns) are better if you don't have to go out of your way to accommodate them, but they fit into the language well.

The movement of languages like Rust, Go and Elixir (what I've been able to investigate lately) away from class-based OOP by splitting it up into its various pieces (subtyping, polymorphism, code sharing, structured types) is a good trend for the programming industry IMO. I'm looking forward to more improvements in the ability to statically verify code a la Rust. Also exciting is the improvements that C# is getting from Joe Duffy's group to help it reduce allocations and GC pressure.

It's an exciting time to be in software development and to be following PTL development, some meaningful progress seems to be happening.

Re:Why bad scientific code beats code following “best practi... by GrumpyNl on Sunday August 28, 2016 @03:02PM (#12377921)
I do so agree with that. Me, i am a old school programmer. Started with basic, pascal, cobol, clipper, dbase, Vb, C++, php, javascript, java. Always created the framework i needed and the libraries i needed. Straight forward piramid structure software. Everything was functions ( its coming back ). Hardly any testers other then the client and yourself. Lots of that stuf is still running. Now i'm lost a of times in the complexity of the frameworks and the use of endless classes. Debugging takes ages because some class in a total different environment is badly written. My advice, KEEP IT SIMPLE.
Re:Why bad scientific code beats code following “best practi... by gens on Monday August 29, 2016 @11:25AM (#12382482)
A sony dev on "Pitfalls of Object Oriented Programming": http://harmful.cat-v.org/software/OO_programming/_pdf/Pitfal...
Re:Why bad scientific code beats code following “best practi... by alanbernstein on Monday August 29, 2016 @02:45AM (#12380408)
Casey Muratori's article really hits home for me. That's how I've felt for a long time, and I'm glad to have a coherent article to point to, to explain this to others.
Re:Why bad scientific code beats code following “best practi... by kazinator on Sunday August 28, 2016 @07:35PM (#12379078)
"The code has bugs and segfaults" is a clear, objective problem.

"I don't understand the code" isn't ... quite the same type of problem.

Re:Why bad scientific code beats code following “best practi... by virmundi on Sunday August 28, 2016 @02:25PM (#12377725)
I think a lot of this could be covered by two principles that are often quoted but over looked. The first is, KISS, keep it simple stupid. The second is single responsibility.

When I design software, I apply both of these to every facet of the system (though I admit sometimes not as well as I should). The end result is I might not have a ton of interfaces and hierarchies. It might not handle curve balls as well as an abstract MachineFactoryFactory could. It does handle everything that we've thrown at it however.