Professors' unprofessional programs have created a new profession - <AUTHOR> https://www.economist.com/news/science-and-technology/21695377-professors-unprofessional-programs-have-created-new-profession-more <comment><USER2> I do this kind of work. It's frustrating how awful most of the code is. You'd think people smart enough to pursue stem phds would understand basic programming abstractions, but that is often not the case. Another issue is that researchers don't normally use good software engineering practices. I have yet to be given any code that has even a single unit test. Source control is being used these days, but the repositories are usually unorganized messes with unhelpful commit histories. No one keeps track of system dependencies, and few understand build systems. I can spend a week just trying to get some software to build.

I could keep complaining, but I don't want to give people the impression that I don't like what I do. It beats the hell out of writing CRUD apps.

<comment><USER3> Agree with everything except for unit tests, they're something of a cargo-cult fad. Any of my developers caught wasting their time on these would get a stern talking to.

<comment><USER4> As a physics PhD spending most of my time on writing code for numerical simulations, I generally agree that unit tests are a waste of time for most things. Unfortunately, most people nowadays seem to think you either fetishize unit test coverage percentages or don't care about code quality at all.

In practice, at least for simulation code, functional, integration and regression tests are useful when employed judiciously. Most importantly, you verify your results using published benchmarks in the scientific literature or analytic results where possible. Obsessively covering every trivial bit of code with a unit test of its own has always struct me as rather a weird fad.

<comment><USER5> "Obsessively covering every trivial bit of code with a unit test of its own has always struct me as rather a weird fad."

The advantage unit tests have over regression tests is that the time between the moment developer implemented a change and finding out they broke something is as small as possible. When tens of people work on the same codebase this saves enormous amount of effort.

Fethisizing over some rule for it's sake is silly of course. My org would waste a lot of money and time without unit tests.

Another feature unit tests provide: Think of the unit tests as a living documentation. Breaking something leaves a breadcrumb trail to the invariant which was sullied.

<comment><USER4> I'll happily grant the point that unit tests are, to a considerable extent, the price you pay for putting more developers in charge of the same parts of the codebase. In my line of work that's usually not a concern, but I can see merit in the idea for large teams. I also think that statement scales down in the sense that unit tests rarely make sense for code written and maintained by one or two people.

<comment><USER5> "I also think that statement scales down in the sense that unit tests rarely make sense for code written and maintained by one or two people."

I am maintaining several end user critical projects related to data transform and transport, mostly by myself. I have no idea how I could develop them as efficiently without unit tests to verify my changes don't brake some corner case as new features are added.

The cadence for changes can be fairly low - I might return to some component after doing something else for six months, and I probably need to add some feature without breaking something in the process.

Sure, we have integration testing and smoke testing, but the further a bug travels the release pipeline from the developer the more expensive it is to fix. This cost cascade is quite easy to visualize - the work of whomever caught the bug is stopped, and depending where they are located in the product ecosystem their stall can cause lots of work for other people. If they are a tester they need to file a report. If they are a customer, their work is interrupted, they contact local sales, who then contact global helpdesk, who then identify and log the bug.

Much simpler and easier if there is a unit test to catch the bug in the first place.

Now, there can be domain specific flavors to this. My domain is computational geometry and transport of 3D modeling data between domains. But in my domain anyone _not_ securing their code with unit tests is wasting their employers money and setting their end users at risk by increasing the likelihood of bugs.

There is lot of cargo cult nonsense in software engineering. Unit testing is not one of them. It saves time and effort by catching a range of bugs not caught by e.g. compiler for statically typed language and it secures the program logic for future changes.

</comment></comment></comment></comment></comment></comment><comment><USER6> Something that goes against the grain of the contemporary "reproducibility" mindset but worth keeping in mind: that's always the option of reading the paper, extracting the core ideas (but not necessarily the exact algorithm) then sitting down and writing your own. To me, that seems like what "replication" should really mean -- not downloading a Docker image and re- running someone else's analysis verbatim.

This is far from an original thought:

 _In the good old days physicists repeated each other 's experiments, just to be sure. Today they stick to FORTRAN, so that they can share each other's programs, bugs included._

             -- E. W. Dijkstra, 1975 apparently

<comment><USER7> So you re-write the code from core ideas and get a different result. Now what? Did you make a mistake? Did the original author make a mistake?

If you have original dataset and .Rmd file, you can then bisect both analyses to find the bug.

</comment></comment><comment><USER8> One big problem with software developed in academia is that there is almost no incentive for continued development and maintenance.

Grants are time-limited, and at some point usually the money for developing the software runs out. The PhD students working on the software move on to something else, and you have yet another abandoned piece of scientific software.

There are of course exceptions, but in general it's much harder to get money for maintaining and improving software over a longer timeframe than for building something new.

<comment><USER9> Software gets maintained (somewhat) by those who make a career out of it. Build something in your PhD, get a postdoc where you can add some more of your own things to it, and get funding for follow on work in which you get your own PhD's to work on it. That's the only model I've seen work, but it's usually very implicit, because when you get to the tenure track stage (or even beyond), you have an incentive to make it look like you're not yet again re- using that thing you were doing 10 years ago. So it's not called 'maintenance' or even 'upgrading' \- you call it something else that sounds new, yet has enough links to the old thing to give you validation because people have heard of it, and in this way drag this mutant bastard code through 5 or 10 iterations over 25 years until your career is 'done' and you can finish off the last years in standby mode.

This sounds negative but I don't mean it that way; it's just how it is, no judgement meant. But it's not something you really hear anyone teaching new PhD students as an option, and even if they would, it's highly uncertain and success depends on many factors out of your control. So I wouldn't call it a career path, or even viable career advice.

<comment><USER10> > Build something in your PhD, get a postdoc where you can add some more of > your own things to it, and get funding for follow on work in which you get > your own PhD's to work on it.

Dear God how do you manage to do this?!

<comment><USER9> It's usually not planned, just something that happens to come together. I know several professors who build their careers this way.

<comment><USER10> Sooo, luck?

<comment><USER9> Well yes, but luck favors the prepared of course.

</comment></comment></comment></comment></comment></comment><comment><USER11> In my experience there is only little money to be made in scientific software. Perhaps it depends on the field (I worked in design-automation for electronic circuits). Scientists often have difficult budgets (depend on funding), and they often expect software to be free (it's not budgeted for). I'm curious about the experience of others.

PS: I couldn't read the article, presumably because of some anti-adblocker mechanism.

<comment><USER12> One good example that I know of (since I studied in this direction) is POLARIS ([http://www.graphics.stanford.edu/projects/polaris/](http://www.graphics.stanford.edu/projects/polaris/)), which turned to the now pretty well-known Tableau Software.

> I couldn't read the article, presumably because of some anti-adblocker > mechanism.

That is so stupid of news sites to do. They only thing that makes me do is leave your site immediately.

<comment><USER13> >That is so stupid of news sites to do. They only thing that makes me do is leave your site immediately.

It's almost as if they don't want anyone to read the content without also viewing the ads...

<comment><USER14> I was able to read the page fine in Firefox with javascript disabled in the about:config settings. No ads visible on this particular page, but many sites have 'calm' banner style ads visible with javascript switched off.

I keep Chromium in 'full fat' mode for sites with rich content and for coping with those public wifi connections where you have a javascript based terms and conditions page.

<comment><USER15> Did you know you can set up multiple profiles for Firefox and run one in no-JS mode and another in "full fat" mode (at the same time!)?

(I think it's "firefox -profileManager")

<comment><USER14> Yup and I had a go at that but it got weird with the javascript state appearing to be the same on both profiles. Might look at it again.

</comment></comment></comment></comment></comment></comment><comment><USER16> I'm as guilty of this as anyone, but I'll tell you how to fix it:

Make code review part of peer review.

I think the next generation of scientists at least understand that things like unit tests are useful, but passing peer review is the only incentive to do anything, and reviewers don't read code.

<comment><USER17> Beyond impractical. Besides it taking 10x as long to peer review something, I can't even imagine my advisor willing to do this. Most professors don't even touch code, they leave it to the graduate students. Hell, I know professors (in EE) who teach code heavy classes that don't even know how to run a single line of the code that they teach; but that's another topic.

</comment></comment><comment><USER18> I did a project like this to get three body physics for an iOS/Android app Three Body. ([http://nbodyphysics.com/blog/2015/12/](http://nbodyphysics.com/blog/2015/12/)). Converting Fortran from 1973 into C# for Unity. This code (only 1000 or so lines) is very dense.

I also cleaned up my own mess from 1996, when I recently re-released a General Relativity package for Maple, GRTensorIII ([https://github.com/grtensor/grtensor](https://github.com/grtensor/grtensor)) that was part of my PhD work. The 1996 code is not _that_ tragic, but is far from my best work - although I did earn my PhD.

</comment><comment><USER19> People usually respond to how they are measured and rewarded. This applies to software written by graduate students. (Most professors code in English using students.)

</comment><comment><USER6> A bit of a counterpoint:

[http://yosefk.com/blog/why-bad-scientific-code-beats-code- fo...](http://yosefk.com/blog/why-bad-scientific-code-beats-code-following- best-practices.html)

<comment><USER20> So, I'm a professor and, like a lot of things, think there's truth to both sides.

Computer science is something that seems underrecognized in the field I work. People clearly acknowledge its importance, but then turn around and basically ignore it when talking to potential grad students or mentoring undergrads in prep for grad school. We don't offer any kind of course like "programming for X" even though most of the students need it.

My experience closely parallels the "why bad scientific code beats code following best practices." I've had comp sci students come in and what happens is they clearly understood python and java, but had difficulty understanding the problems with inheritance, and wrapping their head around other more functional languages we were using. They also were unfamiliar with the statistical/content areas, so had difficulty implementing things. I had thought it would be great to have comp sci students involved (and still do) but it didn't solve my problems like I thought--so instead of having students who understood the concepts but not the programming, now I had students who understood the programming but not the concepts.

When you're dealing with really intense math and statistics, it's difficult to separate out the programming from the math. It's not like web development where you have an "insert text here" kind of approach that works often; the algorithms and the problems are really wrapped up in one another. This might all be changing with data science DL and AI and that kind of stuff infiltrating comp sci's assumed territory, but I'm not really seeing it much so far.

It seems the prototypical situation in software design is some software that's team-developed for mass consumption. In science, you have the reverse often, which is software designed by small units that might be a one-off thing. These constraints put different kinds of pressures on the process, such as intense pressure on getting something to work correctly at all costs, including elegant design.

Also, the unit testing thing is kind of confusing to me. Every time discussion about a new language comes up in the context of numerical/scientific computing, one of the big questions is "does it have a REPL"? It seems one of the big reasons for doing this is basically unit testing. It might not be unit testing in the formal sense that you might have at some software design companies, but anything someone complicated involves feeding each tiny separable part of the code something with known expected output, sometimes in strange, boundary-testing ways, so that seems pretty similar to me. There's also a plethora of test-case datasets out there for this very purpose.

To me the bigger problem is homogenization in software in science, that is, a domain being dominated by a single piece of software. I think it leads to unrecognized errors due to lack of replication across implementations, and problems typical of monopolies (even when something is open source). There's a kind of development benefit:cost supply:demand problem that leads to dominance of single works of code that is really unhealthy for science (replicating with standardized methods is good too, but to me that's a slightly different issue).

<comment><USER6> Thanks for the in-depth reply, a lot here that I agree with, particularly on the homogenisation/monoculture issue (which I wish I could offer a compelling answer to -- telling people not to share their code would clearly be throwing the baby out with the bathwater).

Unit test _vs_ REPLs is an interesting one. Agree that there are similarities there (although I'd argue that your tooling needs to be pretty damn good for unit tests to offer the responsiveness that a good REPL can). For me, I think part of the difference is that a REPL session is personal and nobody sees the blind alleys, while unit tests are an enduring part of the product and something others will see, use, and potentially critique. So while they can address the same kinds of questions, I'm not too shocked that people feel differently about them.

</comment></comment></comment><comment><USER21> Over the course of my career, I've had the job of working with environmental models of lake ecosystems, aided environmental/civil engineers in debugging the then state-of-the-art flood water analysis programs, given (brief) guidance to Ph.D. graduate engineering students on the programing for their dissertations, and worked with mechanical engineers that insisted on doing the real-time machine control programming themselves because the software guys took too long.

In each case, the people being given responsibility for the programs where in way over their heads. They were smart and educated and generally viewed programming as a skill somewhat akin to typing, something anyone could learn to do adequately, if not quickly, in a few days of practice.

The ecosystem simulation made unnecessary oversimplifications (assuming that an exponential relationship could be modeled as a linear one because the engineers didn't know how to handle the integration of an exponential(!!!) and how that should be handled in a program).

The flood control modeling program, used by the Federal government, was some of the worst code I had ever seen. It was written in a fashion where variables were treated a bit like a small finite set of registers. Ten or twelve global variables in the program were reused over and over for different purposes, sometimes to return computed answers, sometimes as temporaries inside of some function, and sometimes as iteration counters. It was a complete mess.

A graduate student that had never learned C or C++ was being given a previous grad student's C++ simulation code to use as the basis for his dissertation work. That code was pretty useless and poorly documented. Software engineering principles played no part in the work these students were doing, they were from a different discipline.

In the case of the real time machine control, programs were written in thousands of lines of assembly code and would control perhaps a dozen asynchronous activities though a combination of interrupt handlers, polling loops, and time outs. They were frustrated that the machines would simply hang every day or two. What a mess.

</comment><comment><USER22> I think there is a perspective that has been overlooked in these comments. It is that the "professors' unprofessional programs" are probably very understandable to someone who deeply understands the science/engineering concepts the programs represent. Especially, if you get some history about what was developed first and what order features were added, the spaghetti starts to become much more understandable. Of course, after passing through the hands of multiple grad students the code should probably be refactored, but how many of you recode a big framework just because it isn't perfect for your situation.

<comment><USER23> I'm not a professor, but I started my career as an industrial engineering grad (MS, not PhD) who was writing code to build and solve a linear program for a supply chain application.

It was definitely one of those programs that does this, than that, the sometimes the other thing, and it went on forever. I had trouble understanding it myself.

I didn't end up rewriting it because, well, startups. The whole thing went kaput, and nah, didn't have much to do with the code.

I would agree with you that these programs are _more_ understandable to someone with expertise, and that can be why it's so hard to refactor them. It's difficult to become this expert in a branch of science and also take the time to learn good software design and programming practices.

But overall, I'd say that these programs could become vastly more manageable and easier to understand through better programming practices.

</comment></comment><comment><USER24> Pretty much this is the problem:

> _" Those who do put effort into producing good code risk being seen by their > colleagues as time-wasters."_

Producing good code takes time and effort. It would seem a complete culture shift is required before any significant changes will happen.

</comment><comment><USER25> Interesting to me (tho I can't view the article) as I'm doing work on the side to train mathematicians in git.

I wrote this course as a basis:

[http://learngitthehardway.tk/learngitthehardway.pdf](http://learngitthehardway.tk/learngitthehardway.pdf)

Finding the right pitch point for someone to learn in the right way is really hard. People come to things like git and build systems from all sorts of angles.

</comment><comment><USER26> I have a lot of sympathy for this. My first job out of school was working in a lab, writing a lot of software for them that was for cortical mapping. It was the kind of job where they expected you to joint a PhD program. You got to co- author papers. It was the first time I programmed a lot. I'm sure everything I wrote was pretty ugly.

</comment><comment><USER27> You think this is just in academia? Can I direct you to the Libreoffice codebase?

</comment><comment><USER28> [https://news.ycombinator.com/item?id=11359181](https://news.ycombinator.com/item?id=11359181) dupe

<comment><USER29> I wouldn't consider it a dupe after more than a year and a half.

But maybe a (2015) in the title would be a good idea.

<comment><USER30> True, but happy he pointed it out. The older thread basically covers everything there is to be said about that article.

</comment></comment></comment><comment><USER31> Refactoring professor's code could be compared to fixing MVP's.

Both appear to be hyper focused on solving the problem that little else matters.

</comment><comment><USER9> I do exactly this, AM(A)A.

<comment><USER32> > I do exactly this, AM(A)A.

Thanks! Do you do this kind of work as a contractor, presumably?

Do you also typically write documentation for the projects you're working on (inside from inline comments)?

How did you get started in this line of work?

<comment><USER9> Technically as a contractor, yes - but I'm not like 'most' contractors where I go in and out for a few months at a time. Rather, I'm part of the research grant and as such work alongside the scientists to make their prototypes into something more robust (sometimes market ready, sometimes not yet, depends), usually in years-long projects.

No I don't usually write docs - I get the authors or maintainers of the models I work on to do that. I do guide them, provide templates and examples, and ask for clarification when they're missing parts. I have standardized methodologies ready for that, which I developed myself mostly (this is one of my USP's, as long as I manage to convince people of the value, which is quite hard and which I often fail at). I don't think it's good practice or very efficient for programmers to reverse-engineer the whole thing because you have to become a domain expert to do so. I also think that this is why it's not for everybody - too many people let themselves get sucked in too deep, making it very time intensive. I understand the temptation, it's much more intellectually satisfying to go deep yourself. But I think you need to be as much project manager as programmer, so that you can get the actual domain experts to figure out the complicated (domain knowledge) parts, and limit yourself to factor out/replace the plumbing and introduce good software engineering practices. Those usually don't last after you (I) leave though, so it's also important not to get too worked up about that.

I started out at a research group that found itself accidentally too heavy on software people, the group got into projects doing software stuff because of that, developed a reputation for being 'the software guys' and failed as a research group because of that (it's a lot more complicated than that, this is the Cliff's Notes obviously). Through many coincidences that can't be replicated on purpose, I'm now hyper-specialized in doing the thing the OP describes in a tiny, narrow field.

The 'trick' (well it's not a trick really) to get work is to be very well connected and work hard to remain that way (being well connected is not something you find yourself in, it's the result of many years of thankless, feedback-less grinding), make your work visible to the outside (i.e. marketing, although obviously the 'buy Adwords' type of marketing is 100% useless here) and to know the science funding processes very, very well to understand incentives of all parties involved. This last part is vastly underestimated; not just for what I do, but also for researchers themselves. For example, the reason I'm usually in is when the project asks for something with demonstrable real-world application (this is a very common requirement the last decades, even for highly theoretical fields). So knowing how to put a veneer on theoretical work is a very non-obvious but highly valuable skill. ('veneer' is not 'hiding things' or 'faking', which will work maybe once or twice - I'm talking about (essentially) science communication more than 'writing papers' science).

Furthermore, being realistic is also important. I'm never going to be rich doing this, nor will I ever employ large amounts of people (or any people at all apart from the occasional 1 or 2 day freelance subcontractor). It's also something for the long haul - 10 years to become established. Other downsides are the sometimes infuriating academic politics, the eternal 'I'm a mathematician/physics/CS PhD so I'm God's gift to mankind and everything that cannot be distilled down to a theorem is 100% useless' characters you run into (they're not that common tbh but they still annoy me endlessly), and not having clear goals or even goals at all. It's like being a PhD student except worse, and with no end in sight or even a thesis to work towards. The upsides are long-term contracts, lots of freedom, intellectually more stimulating work than writing marketing websites or CRUD apps, and being respected as an expert at something even if it's a tiny sliver you're considered to be an expert at.

<comment><USER33> Wow this sounds really great! I'm impressed that you managed to navigate this area. It sounds like you have a very intelligent approach.

It's something I'd like to do, but the networking/politics might keep me out of it. (My family are in the sciences, so I'm familiar with how academia works.)

It's a shame it doesn't pay more. On the other hand, getting exposed to a lot of different things is more valuable long term than specializing in corporate niche.

I left a pretty high-paying job to work on open source (for $0) so I can relate.

<comment><USER9> "I'm impressed that you managed to navigate this area. It sounds like you have a very intelligent approach."

To be honest, it's likely more survivor bias than skill or successful execution of a preconceived plan. This is important to recognize as I'm asked a few times a year how to end up in the place I'm in, but I don't think there is a solid path to do so, nor am I in a position to give advice beyond the standard 'think hard, work hard, keep your eyes out for opportunities, pay yourself first'.

Just saying - in case anyone is reading this in the hope of steering their career one way or the other, don't take the answers I gave here as anything more than an anecdote :)</comment></comment></comment></comment></comment>


Ask HN: Why the Hate? - <AUTHOR> I was wondering, and i dont really understand the logic or the purpose of it. Why there are still haters in our world, even if we're spreading love, peace, kindness, ect...
I mean, i dont understand the psychologic side of these people.
Do you now where i can find some studies or articles which explain that phenomenom ? I found nothing on the net.. <comment><USER2> No cited references. Here's a stream of consciousness to provoke a troll or some solumn person who knows better.

Sum it up in one word: Fear. Sense of threat. The unknown is scary. The not- same is scary. Lack of familiarity. People are terrified. Of something. Anything.

Other aspects and similar mental distortions:

Anonymity shows the real core because of the apparent lack of known self versus the usually hidden one. Along with the ability to be anonymous is the ability to explore the usually unknown.

Trolling is the perceived absence of impact and the simulation of importance through thwarting others' natural progress. This is one source of their hate _and_ their fun. They receive accomplishment through the roadblocks they create for others because of the trolling interference. Any social validation is still validation in their mind. In reality the ones who are trolled are progressing regardless and the troll is the one who gets further left behind.

Probably one or more of these. The usual suspects of jealousy etc should not be overlooked but I'm out of beer.

Bonus observation: The nervous people are scary. What are they afraid of? What if they know something? Maybe I should be afraid of THEM? Now the nervous person is a threat just by being "too" nervous or not nervous enough (he's too "aloof" so he doesn't care). This is why some people get attacked by a group. A similar example is the person not sure of themselves: they are a threat because if they are unsure of themselves they are perceived to unsure of and incapable of everything else. "They might do _anything_. We can't trust them. Better attack them now and find out." This is the basis for at least three different variants of bullying, including mobbing. Difference from the group norm, group cohesiveness reinforcement etc etc.

</comment><comment><USER3> > we're spreading love, peace, kindness, etc

Do you realize a lot of people have to grow up or live in environments where none of these are present? When all you see around you is injustice, it's kinda hard to not want to make 'justice' with your bare hands.

Besides, creating an "us vs them" mentality in whatever subject you choose is a great way to manipulate people, and that generates hate.

</comment><comment><USER4> I guess you couldn't ask a more hippy question. The psychology behind it is that not everybody is born in a fairy tale and plenty of people have good reasons to really dislike certain aspects of life or people, simple as that.

</comment><comment><USER5> Judgement and criticism of others is a way of distracting one's self from your own life struggles and personal failings.

It's very common, and a big business too; it's what drives much of the media.

But a caution: criticising others for being too critical/hateful can be another version of the same tendency.

I used to do this a lot, and have worked hard to learn not to worry about others and focus on just being/doing good myself.

</comment><comment><USER6> Hate is as natural as love for humans (perhaps more so) and is adaptive. Consider:

1\. In-group bias, which shows up in babies

2\. Pecking orders/social status hierarchies, which arise pretty much everywhere from birds to humans; they create a somewhat stable social structure but encourage animosity between those who peck and those who are pecked

3\. Communities defining themselves by excluding others (see 1)

4\. Scarce resources leading to fights for survival; people who threaten your very survival are easier to hate

5\. It's hard to fight people you empathize with, so demonizing/dehumanizing them is necessary if you want to win/survive

</comment><comment><USER7> What planet are you from? Are you high? This is a joke? I tell you this. Some things put hate in your heart. And you go forward 10 years, 5 deployments, divorced, kids are no where near you. And your alone. I am the hater. I hate what I have become. I used to be so different. And I forced myself to enlist. Then saw my country "win hearts and minds" and come back and listen to the mob say there shit. I hate because I am not you.

<comment><AUTHOR> Calm down man, i'm just very interested by this subject because i'm doing a lots of music where im trying to spread some love because when i was in college i was used to be bullied, so im trying to help kids who are in the similar situation. But even when im trying to spread that kind of messages, there are haters so YEAH im looking for some studies or elements which explain the psychologic side of these people, im not high or crazy, i just want to learn more about the human nature.

<comment><USER7> I think you should take a look at the Dalai Lama. Seriosuly not trolling. I used to read alot of his books. But, Standford does studieson it. [http://ccare.stanford.edu/video/his-holiness-the-dalai- lama/](http://ccare.stanford.edu/video/his-holiness-the-dalai-lama/)

</comment></comment></comment><comment><USER8> I think there are few important keywords that could facilitate OP's research on this:

\- moral relativism and ethical subjectivism: [https://en.m.wikipedia.org/wiki/Moral_relativism](https://en.m.wikipedia.org/wiki/Moral_relativism) \- In-group vs. out-group

<comment><AUTHOR> Thank you for this

</comment></comment><comment><USER9> In my experience, there is no "we" and "them". People can spend years apparently spreading love, peace, kindness, etc., and then for whatever reason become generally vicious and cruel.

Someone mentioned fear--I think that's part of the reason.

</comment><comment><USER10> Because the world, for the most part, is (and always has been) a dangerous place and hate has proven to be a very useful (highly conserved through evolutionary time) adaptation to help keep small and delicate bands of our ancestors safe for one more day.

You can see this bias towards negativity easily in the structure of basic emotions. There is one positive affect (happiness) and waaaaay more negative affects (fear, anger, disgust, sadness) and only one neutral (surprise). And those negative emotions are all very distinct.

If you want more detail I can recommend over 120 hours of learning in the following (which I've watched and digested). They'll walk you through the details from the bottom to the top.

-

Watch Robert Sapolsky's lectures:

[https://www.youtube.com/playlist?list=PLD7E21BF91F3F9683](https://www.youtube.com/playlist?list=PLD7E21BF91F3F9683)

Watch Jordan Peterson's Personality lectures:

[https://www.youtube.com/watch?v=kYYJlNbV1OM&list=PL22J3VaeAB...](https://www.youtube.com/watch?v=kYYJlNbV1OM&list=PL22J3VaeABQApSdW8X71Ihe34eKN6XhCi)

and his Maps of Meaning Lectures:

(or read the book or listen to the audio book)

[https://www.youtube.com/watch?v=I8Xc2_FtpHI&list=PL22J3VaeAB...](https://www.youtube.com/watch?v=I8Xc2_FtpHI&list=PL22J3VaeABQAT-0aSPq- OKOpQlHyR4k5h)

<comment><USER11> Jordan Peterson suuuuucks.

<comment><USER12> Ok, but would you please stop posting unsubstantive comments to HN? You've done it a lot, and we're trying for better than that here.

[https://news.ycombinator.com/newsguidelines.html](https://news.ycombinator.com/newsguidelines.html)

</comment></comment></comment><comment><USER13> Honest question. What is a "hater"?

<comment><AUTHOR> If i had to define whats a hater is i would say that its a person who are very rude and disrespectfull towards what you are trying to defend, an idea, an ideology, etc... But he will not even try to understand what you are saying, he just hate you because, for example, your personnality will bring a lots of people to you around the world, so he can be jealous of that, and hate you but for no reasons. Its my definition of a hater.</comment></comment>


Palm Is Releasing a Mini Companion Android Phone at Verizon for $350 - <AUTHOR> https://www.droid-life.com/2018/10/15/palm-is-releasing-a-mini-companion-android-phone-at-verizon-for-350/ <comment><USER2> Wow, I've been thinking about smaller phones a lot lately. Eventually settled on using one of my old (small) phones when I go biking. iPhone 5s is great for this.

I also recently got one of the smallest 4g phones out there- the UniHertz Jelly ($100). It was impressively small, weighing in at only 80g [0]! Compare that with the latest iPhones at something like 208g.

Cons: Difficult to remove the back panel to swap the SIM without marring the plastic edges. It's made of such cheap plastic that it does not inspire confidence for longevity. Easy to envision it easily scratching and becoming trash over time.

This palm thing for $350 is way to much for a toy phone, imo. Definitely doesn't seem to have higher utility than an old iPhone or Android device.

[0] [https://i.imgur.com/Mq5OWSM.jpg](https://i.imgur.com/Mq5OWSM.jpg)

</comment><comment><USER3> Dope. I want one! And not just as a companion - I want the ability to disconnect from all the BS attention seekers on my phone.

Last year I tried to use the only "dumb phone" I could find, which was a flip phone. It was so useless because I couldn't text effectively, had a worthless camera, and I felt embarrassed when I tried to make calls with it.

I like the idea and will definitely be checking it out when it drops.

</comment><comment><USER4> Seems like an android watch would be a better solution...</comment>


Ask HN:  Why has nobody pushed for a consumer side CC processing solution? - <AUTHOR>

I live in the Midwest and will readily admit that I am WAY out of the loop of the valley but...
I LOVE buying things online.  In fact I love it so much that I do it probably 1-2 times a week.  I buy books, clothes, random gadgets, web apps etc.
I HATE having to fill out a payment form every time I want to pay for something.  And in order to not fill out a payment form every time I visit the site I have to become a "member" of the site, give them my email address, remember the password and on and on.  It's annoying.  Why can't I just swipe my credit card like I can at a store and buy something?  Why is it not that easy?
I really subscribe to the whole "Ideas don't matter as much as execution" mantra and I would surprised if this hasn't already been brought up many times.  But if it has why hasn't somebody done something about it? And if somebody has done something about it why haven't I heard about it? <comment><USER2> There is a certain amount of security in "swipe my credit card". It implies the customer has possession of a thing that hasn't been reported stolen. Now if I stick a card swipe on the side of your monitor so you can swipe from home what data do I transmit that gives that same "in possession of a thing that hasn't been reported stolen" feeling? Currently it is a raft of personal information. If we were in Europe it could be data from the chip embedded in your credit card. Until US cards catch up I am not sure how you would battle fraud.

<comment><AUTHOR> Definitely an issue. However if a card has been reported stolen wouldn't it just be deactivated and not work whether it was used at an at home swipe or swiped at a business?

<comment><USER2> The physically possesses part is an important part of that equation. If I hack the users computer and steal the swipe info then I can retransmit the data and home swipe without physical possession of the card. Since the user never lost the card he is less likely to report it lost or stolen in a timely manner. A smart credit card would generate a known nonce making retransmited data worthless, and restore the likely physically has the card factor.

</comment></comment></comment><comment><USER3> I think Chrome and Firefox are working on this. [https://wiki.mozilla.org/WebAPI/WebPayment](https://wiki.mozilla.org/WebAPI/WebPayment)

</comment><comment><USER4> The browsers all have automated form filling functionality, as do many of the password plugin providers (e.g. lastpass).

<comment><AUTHOR> Auto-form filling is cool and helps the situation but what about NON technical individuals who wouldn't understand how to use that or people who don't understand plugins? How about if your purchasing something on a company card vs. a personal card? What if you have multiple cards?

Wouldn't just being able to swipe be a whole lot simpler?

<comment><USER4> Even if you had a credit card swiper connected to your computer you'd still have to enter the CVV2 and associated address information because from the merchant's point of view it'd still be a card not present transaction. If you want to change that, you'd have to go down the road of having a piece of hardware that a third party can trust the owner hasn't tampered with. That's a really difficult problem as various DRM schemes have shown.

The there's the integration between the swiper and the operating system and the operating system and the browser. And at the end you are still left with a UX very much like the form filling software because the browser needs to guess where to put the information and have some way of fixing it if it got it wrong.

</comment></comment></comment><comment><USER5> Isn't this what Google is trying to do with Wallet?

<comment><AUTHOR> I think the whole push to go "card-less" or "wallet-less" is awesome and will eventually happen but what about the millions of people who won't do that for a really long time?? Cards maybe eventually die (I hope they do) but I still think they will be a prevalent of payment processing for at least the next 7-10 years.</comment></comment>


Microsoft eyeing Yahoo (buyout) deal! - <AUTHOR> http://news.com.com/Report+Microsoft+eyeing+Yahoo+deal/2100-7345_3-6181379.html?tag=nefd.top <comment><USER2> losers buying losers. so what. pk has good analysis on this:

<http://paul.kedrosky.com/archives/2007/05/04/microsoft_yahoo.html>

</comment><comment><USER3> Most analysts will probably say, "think of the combined power!"

I'd say: Think of the combined _inertia_.

To further abuse the analogy, it's like two huge masses colliding so now you need twice the escape velocity. We may never see another product launch from either company.

</comment><comment><USER4> "Microsoft and Yahoo in recent months discussed a possible merger of the two companies or some kind of match-up that would pair their respective strengths, say people familiar with the situation. But the merger discussions are no longer active, these people say. The two companies may still explore other ways of cooperating."

<http://online.wsj.com/article/SB117827827757492168.html?mod=home_whats_news_us>

This is just some hedge fund manipulating the market by making up a fake story that press just eats up.

</comment><comment><USER5> After all, MS will learn some Lisp by looking at Viaweb sources.

<comment><USER6> I think Yahoo rewrote Viaweb in C++. The only thing that's still remotely Lispy about it is that they kept RTML.

<comment><USER7> That's pretty Lispy, because RTML is stored on disk as s-expressions. So rewriting Viaweb in C++ literally meant writing a Lisp interpreter.

<comment><USER8> Wow, someone should give Yahoo an award for "Most literal application of Greenspun's Tenth Rule."

</comment></comment></comment></comment><comment><USER9> Even if it's true, does this really matter? I might be wrong, but to me it seems that both companies are sliding into irrelevancy anyway.

</comment><comment><USER10> The big winner in this deal would of course be Google. MS/Yahoo will spend years on integrating and infighting.

</comment><comment><USER11> I hope not :-(

</comment><comment><USER7> Another exclusive from the _New York Post_? Why should they know anything?

<comment><USER3> FWIW, The WSJ is reporting on it too:

<http://online.wsj.com/article/SB117827827757492168.html?mod=home_whats_news_us>

Reuters mentions both stories: <http://biz.yahoo.com/rb/070504/yahoo_microsoft.html?.v=9>

</comment></comment><comment><USER4> Let's hope this never materializes :( We're (startups) all screwed if it does.

<comment><USER12> Look how well the google/dodgeball, the overture/yahoo, and now flickr/yahoo did. now think how ms/yahoo will do. big, fat, fat, fat, giant. fat, fat, fat...

<comment><USER13> That would actually be good for us. The slower they become, the more nimble us startups look in comparison.

</comment></comment></comment><comment><USER14> WTF?

</comment><comment><USER5> If a software giant buys an Internet company, then an Internet giant should buy a software house. This translates to "Google is eyeing Adobe". Just my 2 eurocents :)</comment>


When Scholars Collaborate with Tech Companies, How Reliable Are the Findings? - <AUTHOR> https://www.nytimes.com/2020/07/12/business/economy/uber-lyft-drivers-wages.html <comment><AUTHOR> The city of Seattle commissioned a separate study on Uber and Lyft driver pay in Seattle (mentioned in the NYT article): [https://irle.berkeley.edu/files/2020/07/Parrott-Reich- Seattl...](https://irle.berkeley.edu/files/2020/07/Parrott-Reich-Seattle- Report_July-2020.pdf)

The authors of the Seattle-commissioned report have written up their own criticism of their report to the Cornell/Uber/Lyft report: [https://irle.berkeley.edu/files/2020/07/Comparison-of-two- Se...](https://irle.berkeley.edu/files/2020/07/Comparison-of-two-Seattle- studies.pdf)</comment>


The country breeding a generation of chess whizz kids - <AUTHOR> http://www.bbc.co.uk/news/stories-43084816 <comment><USER2> Warning: Controversial opinion ...

In a world that has the game of Go, I don't understand why countries continue to push chess. As a game, Go is far superior.

I'd love to see a proper study of colateral and transferable skills from chess versus Go, I'd even be happy to discover that my intuition is wrong, but I'd be _really_ interested to get proper, unbiased, objective data.

But Go is superior to chess.

</rant>

<comment><USER3> In terms of education, universal education in Chess reminds me of teaching all 5-8 year olds the recorder instead of cello. Mathematically, Magic the Gathering is Turing Complete, surely that is better because it helps software eat the world.

Anyway, Futbol is superior to Go. A non-controversial opinion reflected in the way people vote with their feet (pun intended).</comment></comment>


C++ Fun with(out) keyword explicit - <AUTHOR> http://arne-mertz.de/2015/03/fun-without-keyword-explicit/ <comment><USER2> This is why it's a rule in C++ that implicit conversions generate ambiguities and error messages like that. In such ambiguous situations, one interpretation has to be significantly "better" for it to be accepted without an error message. This is better than silently picking one of the possibilities when there's an ambiguity.

I would have thought that the no-conversion case (std::string vs std::string) would clearly beat the conversion case (Annie vs Annie), but I'm not really current on C++ conversion priority.

This sort of thing is why operator overloading isn't that great an idea. It seems attractive at first, but it gets complicated fast. As a rule of thumb, unless you're doing something mathematical, like matrices, for which the rules are well understood, don't overload mathematical operators.

A classic in Python:

       (1,2) + (3,4) -> (1,2,3,4).

But

       numpy.array((1,2)) + numpy.array((3,4)) -> array([4,6]).

This, combined with Python's lack of parameter type checking, can lead to strange results if a library function is called with the wrong type of numerical list object.

<comment><USER3> If one has compile time safety, operator overloading is just fine though.

In this case I'm pretty sure this was a compiler bug, "no conversions" should have priority over "conversions"

<comment><USER4> Compile-time safety doesn't protect you from being stupid when you choose the semantics of overloaded operators, just like compile-time safety doesn't protect you from giving your functions stupid names. My hypothesis is that so many C++ programmers abused operator overloading (even in the standard library, e.g. the absurdity of <<) that it made language designers remove it altogether from e.g. Java and many other languages.

<comment><USER3> The argument against operator overloading can be reduced to "programmers can't be trusted to design their classes properly".

And Java was exactly like that in the beginning, a language designed for the average developer, giving them only the basics they could be trusted with. Interestingly, Java's been busy adding back most of the things it decided against. Wouldn't be surprised if they add operator overloading in a future version.

<< is not IMO absurd, it makes streaming much nicer. The boost serialization & operator is however the kind of overloading that gives one pause when they see it.

<comment><USER4> Basically, for human-readable output << is far inferior to the alternatives that came before it and after it, and from an API perspective has nasty warts both in syntax and semantics.

* C's printf() is superior because it can be localized.

* Later formatting functions like Python's .format(), C# String.Format(), and C++ fmt::format() (from cppformat library) are far superior in normal use cases: they can be localized but they don't suffer from printf() safety problems.

* << suffers from severe problems in terms of syntax because it sits between arithmetic and comparison operators in precedence. So you can std::cout << x * 5; but you cannot std::cout << x & 0xff;

* iostream also suffers from the curse of statefulness. Unlike other formatting functions, changing the precision you want to use changes the properties of the IO stream itself, which is nonsensical. Either the properties should be bundled with the number or they should be lexically scoped.

Maybe << is nice for one or two things, but for the bread and butter of what developers do, it's absolutely terrible. I don't know how it makes "streaming nicer" because I'm not sure what you mean by streaming—the word has a few different possible contextual meanings, and I can't imagine how << makes any of those any easier.

The worst part of this is that they could have just used function call syntax and two of the major usability problems would have instantly disappeared. It would avoid problems with precedence and it would allow you to pass additional precision parameters.

Unfortunately, localization is really a hard (as in non-negotiable) requirement, and since << is so terrible at it, you are often forced to rip its usage out of a program rather than just work around it.

<comment><USER3> Sure, << has these problems and for more advanced use cases one can use Boost or the library you mentioned. For localization one has to use a non-STL solution anyway, because the supporty is rudimentary in the standard lib.

On the other hand, there's nothing easier than using << for logging and concatenating + optionally converting strings and other types.

All in all the only real problem caused by << being an operator instead of a function is the precedence one; the rest are API design issues I would argue. Luckily it's a compiler warning (unused value) and if one adds another output op to the chain it will most likely be a compile error or still a warnig. So I still don't see why we have to condemn operator overloading because of <<.

</comment></comment></comment></comment></comment></comment><comment><USER5> Implicit casts are the worst feature of C, and C++ manages to make things even worse with implicit conversions by default. Marvelous.

I should create a new subset of C++ and call it C += 0.5.

</comment><comment><USER6> The choices made by C++ are some of the reasons why I am so happy that Rust exists.

</comment><comment><USER7> I put the default constructor in private and mark the constructor I want everyone to use (typically the only one) as explicit. Seems safer than implicit conversions.

</comment><comment><USER8> In C++11 you can even have implicit conversion for multiple args constructors. But it is harder to use unintentionally than single argument implicit conversions.

</comment><comment><USER9> I wonder which compiler it was?

<comment><USER3> Embarcadero C++ 2010, formerly known as Borland C++.

<comment><USER10> FWIW, their latest incarnation uses Clang as a front-end for at least the 64-bit version.</comment></comment></comment>


Python with a Cocoa GUI on MacOS - <AUTHOR> https://dawes.wordpress.com/2017/08/17/python-with-a-cocoa-gui-on-macos/ <comment><USER2> I've used it for [https://pngmini.com](https://pngmini.com), and I regret it.

• Startup time is noticeably slower than native apps. Importing Cocoa makes Python parse a ton of code.

• Cocoa just doesn't fit Python's naming conventions. You get long method names with underscores where arguments should be, followed by many unlabelled arguments. The worst thing is that 1-arg methods, which otherwise look like normal Python methods, have to have an underscore suffix (`foo_`).

• All errors are runtime errors. It's a step back from ObjC, and the aforementioned writing of `[obj foo:arg]` as `obj.foo_(arg)` gets me every time. Python is also more sensitive about None than ObjC is about nil, so you need more checks and forgotten checks blow up more often.

• I wanted to do more advanced stuff with CoreAnimation and PyObjC couldn't figure out how long to retain stuff (or it was a bug somewhere). I know how to debug such problems in ObjC (and they're rare since ARC), but having Python's GC and a large framework sandwiched in between made it hard.

• The app breaks when users replace macOS's old Python with their own, which lacks PyObjC support. I don't know how common that is, but I've been getting bug reports about it.

In the end I ended up rewriting large parts in ObjC, and the remaining Python code is slow and brittle.

These days there's Swift which isn't more laborious to write than Python thanks to type inference and ARC, but has compile-time checks, non-nullable types and first-class Cocoa interface.

</comment><comment><USER3> Interestingly enough Kivy and Beeware are attempts to create Python mobile development frameworks:

[https://dbader.org/blog/python-mobile-development-kivy-vs- be...](https://dbader.org/blog/python-mobile-development-kivy-vs-beeware)

[https://www.youtube.com/watch?v=qaPzlIJ57dk](https://www.youtube.com/watch?v=qaPzlIJ57dk)

<comment><USER4> They are OK but I had trouble with Kivy's Python 3 support and pyenv and the apps don't look native (which is a secondary concern for most people these days, sadly, but an issue for most Mac users)

</comment></comment><comment><USER5> PyObjC, which is what is being used here, is nice, but pretty fragile. It relies pretty much on one guy, Ronald Oussoren, who is also one of the py2app maintainers. It often lags behind the pace of macOS development.

I think PyQt is a more robust solution for GUIs, and it gives you cross- platform compatibility basically for free - although packaging is probably a bit harder.

<comment><USER6> PyQt packaging is no longer hard with [https://build- system.fman.io](https://build-system.fman.io). (I'm the author.)

<comment><USER7> Any mobile option? I sort of see pythonista on ipad can do it ... just wonder any other option of packaging gui that really cross all platforms not just desktop.

<comment><USER6> It's only for desktop for now, sorry.

</comment></comment></comment></comment><comment><USER4> I've been doing this for a while now for small utilities, and got started on it in earnest with [https://github.com/rcarmo/shelf](https://github.com/rcarmo/shelf) (which I used for a long time until LinkedIn broke their APIs).

There are mainly two challenges here:

\- packaging (it's a bit tricky to sort out, and bundling a full virtualenv is the best long-term option across OS releases)

\- longevity (Ronald has been maintaining PyObjC on his own dime, and Apple seems to mostly ignore everything else in favor of Swift these days)

The JavaScript bridge also works OK (I briefly considered using that instead, but the way collections are handled is hideous due to language constraints and PyObjC is so much better).

Edit: bullets

</comment><comment><USER8> I have always been curious, what is Apple's motivation for shipping Python with macOS?

<comment><USER9> I don't believe there's any special motivation for including Python than what motivates the inclusion of any other of the common Unix tools such as Ruby, Git, grep, or awk.

<comment><USER10> not to mention ls, gcc, perl, httpd, and the rest of the BSD subsystem on which it is based

</comment></comment></comment><comment><USER11> It was great to see a one-window BitTorrent client 14 years ago on MacOS, native GUI but lots of python underneath..

</comment><comment><USER12> Off-topic Python question: is the use of "CapWords" / CamelCase for method names correct here? I assume this is the "prevailing style" of pyobjc or Objective C itself, and it therefore comes under the exception in PEP8.

I ask because I find the use of CamelCase like this for method names really off-putting.

<comment><USER13> It's a byproduct of Objective C. It's pretty common to see just about anything that provides bindings/bridges into ObjC to match the casing of the ObjC code—this is typically to help with matching and looking up relevant ObjC documentation to understand the original code better. It is off-putting, for sure.

<comment><USER12> That makes sense. It's good that PEP8 makes exceptions for such cases, I suppose, but it just looks wrong to my eye.

</comment></comment></comment><comment><USER14> Every time I see Interface Builder I cringe. How Apple thinks it is a suitable way to construct GUIs is crazy to me.

</comment><comment><USER15> How do people deal with GIL when writing GUI code in Python? Without multithreading computation will block UI.

<comment><USER16> GIL is released when a thread is waiting on a queue. One thread reads UI event queue from the OS and puts user actions into a queue, another runs your code.</comment></comment>


Evidence shows that about half of all clinical trials have never been published - <AUTHOR> http://www.alltrials.net/find-out-more/why-this-matters/the-alltrials-campaign/

<comment><AUTHOR> Link to cited paper "Compliance with mandatory reporting of clinical trial results on ClinicalTrials.gov: cross sectional study"

"Conclusion: Most trials subject to mandatory reporting did not report results within a year of completion."

[http://www.bmj.com/content/344/bmj.d737a3](http://www.bmj.com/content/344/bmj.d737a3)</comment>


Always pay your web developers - <AUTHOR> http://utilitybidder.co.uk/ <comment><USER3> As much as I like "Geek wins, hah!", I would suggest not modeling this as a good practice for self-employed folks here. It is 2011: GoogLinkedBookTwitEtc have ensured that you have exactly one professional reputation. You may think future clients will see the righteousness of your actions. Consider whether available evidence suggests that you are a good judge of the character of clients.

Come back to this post in two months if you don't buy this prediction: it is highly likely he doesn't get paid.

There are better ways to avoid nonpayment. Work with better customers - reputation works both ways. Get references if required. For projects of nontrivial length, agree to milestones and bill on successful completion. Delivery of functional code should practically always be a milestone, which would eliminate most of the downside risk here. Charge a premium, both to scare away bad clients and to cover the _numerous_ sources of risk to your ability to pay rent, of which total refusal to pay is only one.

<comment><USER4> Really only a problem for clients that don't intend to pay. I believe it is a very good thing to know if the client has grave worries about what you might do if he refuses to pay. An honest client won't even be thinking of that.

There's a long established legal principle that if you don't pay a workman he can place a lien on your property, which may even result in it being sold at auction. You can also be charged with theft of services, a real crime for which you go to jail.

If your new client is worried he might go to jail should he be committing felonies, that is also a concern.

<comment><USER5> Sorry, but I wouldn't hire these guys, and I've never screwed anyone over.

We only know one side of the story. It could be that they added a whole bunch of extra charges that weren't in the contract, and when the client balked, did this as blackmail. Or maybe the work was of horrible quality. Who knows? I don't want to work with people that could potentially go nuclear on me over a legitimate dispute.

On the other hand, I'd have no trouble working with someone that has a history of suing clients that don't pay up. Or even someone who point blank told me he'd sue me if I didn't pay up (although I'd consider it mildly offensive). Since I have no intention of doing something that'll make me lose a court case, I don't fear getting sued.

Loose cannons, on the other hand, I do fear, which these guys clearly are. Even if they're in the right, this time.

<comment><USER6> _We only know one side of the story_

That's right, and you can go in endless circles second guessing which party was in the right. If you decide that it was wrong to take the work back, you're just siding with the client. It's not hard to imagine them having done something equally drastic that we don't know about.

In many cases, contracting is effectively lawless and the stakes can be arbitrarily high. There aren't many actions I would categorically rule as out of bounds.

Keep in mind that there are people out there who are utter wrecking balls. They do nothing but damage to everyone they work with, and sometimes to themselves as well. The "professionalism" of their victims is what allows them to keep going.

<comment><USER7> I have a friend who is one such "wrecking ball". She would sacrifice pay and reputation for the satisfaction of some quick payback and cheap drama. She is however wicked skilled, but most who still deal with her do so with a grain of salt large enough to satisfy a herd of deer.

Man, it's tiring just thinking about her drama.

</comment></comment></comment></comment></comment><comment><USER8> Anybody who's done any consulting has run into this client before: Things are going great, then for seemingly innocuous reasons, invoices start taking longer to pay. Eventually you find yourself six weeks out and start asking plain questions over the phone. Things rapidly go downhill from there.

The key in situations like this is to always stay professional. Stop working immediately and make it clear that you'll start going again as soon as the check clears, but stick to the high road. The client will turn petty on you, will come up with all sorts of slanderous attacks on you, your work, and your character. That's fine. Let him vent. Then calmly explain once again the concept of "work for hire", and how you're perfectly happy to continue doing work for him, provided he pays his bills.

This may or may not work. On the off chance he pays up, you get to put him on weekly invoices payable immediately on receipt. If it doesn't, chances are you're out a bunch of money. Either way, try to suppress your natural geek sense of vengeance. You're the professional here. Never act otherwise.

Now, as a pro, you do have one option. Since your invoices are itemized and dated, and source control is itemized and dated, you're well within your rights to accurately roll back the deliverable to the state it was in after the last paid bill. Tell the client that you don't want him to pay for any work that he's not 100% satisfied with, and as such you have retracted your invoice as well as the work it covered. You'll keep the associated changes archived in case he wishes to purchase them in the future. You wish him the best of luck going forward and regret that you'll be parting ways.

<comment><USER9> _Since your invoices are itemized and dated, and source control is itemized and dated, you're well within your rights to accurately roll back the deliverable to the state it was in after the last paid bill._

Are you qualified to give legal advice? And if so, are you confident that this advice is appropriate for all jurisdictions where someone might be reading this comment?

<comment><USER8> No, and no.

If you're in this situation, chance are it's because you're working without a clear written contract. The best you can do is work in good faith and hope that your client does the same.

In my opinion, delivering the portion of the product that has been paid for is acting in good faith. As is giving the option to proceed with the original agreed transaction, should the client desire to do so.

<comment><USER9> INAL. Of course, that acronym is always followed by bad legal advice. So for entertainment purposes only...

I suggest that taking something away from a client is more trouble than it's worth, even if they haven't paid for it. So to use your ideas with mine, don't formally deliver the completed work until you are paid.

A few suggestions:

1\. Be very clear about the fact that the software is "in acceptance testing" state until formally signed off as complete and monies have been paid. It is not "In production." Agree in writing that when you are paid that you wipe any databases involved and start from scratch. This establishes quite clearly that the client is not expecting to run their business on software that is not in production yet, they are just testing it.

2\. If this is hosted software, host development code yourself until you are paid, at which point you can deploy it to their system.

3\. You're using source code control. Great! Establish a formal "production" branch separate from development. Bug fixes have to be performed in both branches. This is a good practice in any event, but when you're fighting with a difficult client later, they will often complain that the software doesn't work and you have to fix issues with software that is already in production before they will pay you for work you're doing on new features. Now you can fix issues on the production code while witholding new features until they pony up the lettuce.

JM2C. Did I mention that INAL?

<comment><USER10> I'm not a lawyer, either, but these are all excellent, excellent points. There's an underlying point:

0\. Get an explicit agreement up front about what you're doing.

Without that, you're sunk.

<comment><USER11> Even with that, I've known clients come back a while later (disclaimer - I was the grunt coder, not the boss) and insist there had been verbal agreement to put in large extra features, or that the feature they'd spent some time engaging with you to specify clearly wasn't anywhere near correct adn needed completely replacing..... In one of those cases I knew exactly where the person concerned lived. Tempation.......

A lot of clients are just fine, do what they're supposed to and pay for it. A percentage will try to scam you even with an agreement if they sense an opportunity - even with what you thought was a detailed bill of work - <USER2> they realise you need them more than vice versa, they've screwed up and need the extra to cover themselves, or because they're just plain crooks. Shouldn't happen but it does; deal with it and move on.

<comment><USER10> I guess I should have added:

0.a. Get a legally binding signature and include a written-only clause. Make it crystal clear that if something doesn't appear in that definition of services that everybody signed and that has a price tag on it, that it isn't covered by that price tag.

I've translated roughly 3.2 million contracts for services since switching from programming to translation, and I'm pretty sure I could survive as a programmer now, just from that alone.

</comment></comment></comment></comment></comment></comment></comment><comment><USER12> I have once ran into a similar situation which the man simply refused to pay the bill (of nearly $20K). I was simply not being able to reach the man on the phone or get a response by mail.

Knowing taking this into the court of justice would take around 3-4 years, I have simply set auto-redirect to random porn sites (picked the top 25 out of Google).

It took about half a day since the man have had his lawyer send me a letter saying something similar to: "we will pay you all what you asked for .... "

I am not sure this was the right thing to do, but I was quite young and enthusiast by then, and I have invested allot of money in that project (hardware and bandwidth contracts - VPS were not invented yet at that time ;-)).

</comment><comment><USER13> If one insists on this course of action, it might not hurt to throw in a little plausible deniability.

Instead of a landing page throwing your tantrum, have the site mysteriously break and just show a cryptic error message, then just be too busy to fix a problem for a client who hasn't paid anyway. Gently suggest that paying clients come before deadbeats.

When the inevitable legal backlash comes, simply shrug and say you were getting around to it and remind everyone that there might be someone in arrears with a large payment or two. Plus interest. And late fee.

<comment><USER14> What for? Just move on. Don't waste more of your life on this. These people shoot themselves in the foot all the time, there's no need to pull a trigger.

<comment><USER15> no, the sleazy conniving wheeler dealers who run companies like utilitybidder need to be excruciatingly punished for every transgression.

</comment></comment></comment><comment><USER16> Sequence of tweets:

 _anyone got any suggestions what to do when a client wont pay for increased development costs for work you have already completed? 5:01 AM Jan 18th via web

Should I change a bad clients site to a page that says they aint paid me and then change the password? 7:08 PM Jan 20th via Twitter for Android

this is what I am reduced to <http://bit.ly/badpayers> 8:34 AM Jan 21st via web_

Followed by about a dozen identical tweets, until it got picked up by HN.

Note the key section: _"when a client won't pay for increased development costs"._

</comment><comment><USER17> my dad (now retired) was an old school sign writer and had this sort of thing (non-paying clients) happen to him on more than one occasion.

One I remember was a shop where he spent a few days signwriting the entire front. Lots of work, most of it up on 14' tressels, and at the end the owner refused to pay. Said he didn't have to, and there was nothing my dad could do about it.

Except there was - dad went back one night with a roller, a long roller pole and a large tin of white paint, and painted the entire shopfront out. Still din't get paid, but it had two effects: one, the owner needed to get the job done again, and two: the next guy hired would be asking some awkward questions, like why did it look like the job had already been done but then painted over...

<comment><USER18> I guess that caused more trouble for your dad than it did for the shop owner, economically at least. Plus he would probably brag about your dad to other shop owners. (I agree that just doing the job _for free_ is no solution either, but do not have any better retaliation, except for proper contracts and court claims, in mind.)

<comment><USER19> Courts are not a solution to most problems. You spend hundreds just to get started with fees, serving the other side, then the time back and forth to court over and over with the other side continuing the case. Now it is 6 months later and maybe the court will decide in your favor or maybe the court will decide that you didn't do the work as specified by the client (even if you did).

<comment><USER20> Depending on just how big the unpaid invoice is, in some states small-claims court is an option; it's cheaper and quicker usually. Here's a list of each state's limits for a small-claims-court suit: <http://www.nolo.com/legal- encyclopedia/article-30031.html>

<comment><USER21> yeah, that really wasnt an option as I am resident in Thailand where legal proceedings are usually settled with big brown envelopes and such.

<comment><USER22> If the company is based in the UK you could have had a local representative to file a claim.

It may be of course that you have no legal recompense; however I'd exhaust all possibilities in that direction before sabotaging a site.

Perhaps what's needed is a "name and shame" list of deadbeat clients somewhere that developers can check before accepting work.

</comment></comment></comment></comment></comment></comment><comment><USER23> As a non-web developer (I'm a lawyer) I learned long ago that there is a financial point at which the balance of power switches from me to the client.

When the client owes me a trivial amount of money I can afford to walk away from the job if I want to. If the client owes me a lot of money, now I am shackled to that client (and the job) because I am chasing my own money.

The key is to never let the client owe you too much. For me this number is about $2,500.

The way I solve this problem is

(1) by getting a substantial amount of money up front; if I get ANY guff from the prospective client when I ask for money, I know how I will be treated for the rest of the project and I may choose to back off at that point.

(2) watch the invoicing very carefully and if they are slow in paying, stop work until they pay. Mr. Pavlov's ideas are in action here: the client is rewarded for slow pay by halting of work with a message "Hey you owe money."

</comment><comment><USER24> According to his website, guy's a Scot and living on a small island in Thailand, Koh Phangan to be precise. Good luck with taking legal action.

<comment><USER25> lovely place and cheep

couple of contracts a year paid in pounds/usd/euro/yen and you could sustain a happy life.

visas are a bastard, you need to skip the country every few months to renew your tourist visa.

<comment><USER21> yeah, its cheap for most, but when you have a work permit and a company setup so that you are operating legally within Thailand it can become expensive paying yearly company taxes and fees.

I have had Thai clients ask to see my work permit before and I am very proud to be able to show them it as most foreign freelancers dont have one.

<comment><USER26> Can you share the numbers please?

</comment></comment></comment></comment><comment><USER16> From the google cache:

Developer: <http://www.junglecreative.com/>

Linkedin: <http://th.linkedin.com/in/raynimmo>

Blog: <http://www.raynimmo.com/>

<comment><USER27> Amateur developer, amateur clients.

</comment></comment><comment><USER28> This seems very unprofessional and amateurish - on the part of the web developer. Yes, maybe the client didn't pay, but resorting to this type of public lynching will a) kill any remaining chance of compensation/reconciliation and b) probably damage the reputation of the web developers.

I've had my fair share of clients who didn't pay for various reasons. Sometimes, small claims court was in order. Sometimes, having patience and giving a struggling client time (literally almost 5 years) led to a payment in full (plus interest!) completely out of the blue. The guy's business picked up, and now he's still a super happy client.

What goes around comes around.

</comment><comment><USER29> "This website is in the mail. Coincidentally, the same mail that you, dear customer, used to send the payment cheque. I'm sure it will arrive, any day now."

</comment><comment><USER21> I thought I had better write an explanation as my actions here seem to have kicked up a bit of a furore, undoubtedly that was my intention, although maybe not on this scale, more of an attempt to embarass them. I am not sure of how much I should go into as I signed an NDA with this client although the contract that it was attached to ended in October; maybe someone with better contract law knowledge than me will know more, either way I will try to be vague.

A little about me: I am a freelance developer, educated as a software engineer in Edinburgh then started leaning towards web development a few years back. We quit Scotland 4 years ago to come and live on a tropical island in Thailand where I could take my time winning small jobs, enough to earn what I needed. Indeed its been quite a successfull last few years, winning many jobs for web development and graphic design, all of my clients have came back for more work. The fact I havent updated my portfolio or blog in over a year is a testament to how busy I have been.

The bare details: I very good friend asked me to help him build a website and a backend system for his staff to use in their day to day business. I quoted a ridiculously low sum of money compared to western standards but a worth that I felt I deserved for the work considering I live in Thailand where the cost of living is less.

The contract was for 6 months initially for a fixed fee split over those 6 months. With regards to the system, which has swollen to quite a full featured product, something I am very proud of, possibly my best piece of work to date, just a shame it wont appear on my portfolio now. The specifications for the sytem over the course of the development had many more additional specifications added to cover internal aspects of the system that were not originally envisaged, obviously not fully taken into account when originally quoted. My contact at the company was good, he understood the pitfalls of custom software development and when I explained to him about why the project has taken longer he understood and we carried on regardless. As I said the contract ended in October, the same month they stopped paying me when they suggested that they wanted to suspend my weekly payments and pay me a lump sum upon completion. I understood their reasons then for doing this and since the project was behind schedule I aggreed to this.

Now I find myself within 2 weeks of delivery of the full system, so I start getting my invoices together for the last 14 weeks of development. I forward them to the client and I am more or less informed that there is no way they are gonna pay that amount. Lesser amounts are then offered, tied to some crazy scheme regarding "support" over an extended period, god knows where the payment for the "support" period was coming from.

In the end it was a stalemate, I felt I deserved my meagre salary, it will cost them a lot more for a UK dev to finish this where their daily wage is more than my weekly wage, so I always thought I would win through. This is actually their second attempt at building this piece of software, the first one was a non-event with an indian company.

The company even flew one of their guys out here to help me finish off the system - my friend, the guy whose idea this all was, he wrote the 'spec' for the software. He has tried to get the UK bosses to agree to this and that but they wont budge, I feel there is apower struggle within the conpany but I wont go into that as it is pure speculation. In an attempt to help them understand software development, that sometimes you dont know all of the variables until you start, etc, etc, I forwarded a number of websites and blogs that had interesting articles regarding the development process and reasons for their failure or late delivery, I was told it was pointless sending them as they wouldnt read them as they dont care. One of them was even supposed to have said "why do we need a website?" , now how am I supposed to convince this guy about the trials and tribulations of building a customised piece of software.

So yeah, talks broke down, I felt pissed off, I then sent archives of updated files for the system to my contact, not really updates but resetting the systems development back to where it was when they last paid me over 3 months ago. I then done the same on the server system that their staff were helping bug test. I then; foolishly now I think, put their site into maintenance mode and switched the maintenance page to say "You aint paid me, you suck". The site structure that was there is still there, if somewhat unfinished, all I changed was the maintenance page; I am sure any Drupal developer knows how easy that is to switch off. I also added an extra variable with encoded content onto the $closure that would display if they managed to get it out of maintenance mode. Encoded it just to make it that bit harder to find and remove :)

I do regret doing this, not because of my actions, but as I said before, the guy whose idea this was is a friend, he is a third of the board, it was the other two thirds that swayed the vote though, and I feel bad for him. I know I am not getting paid, my money is long gone, I wouldnt have done this if there was a chance of reconcilliation, I have known that for the last few days, they wont agree to my demands and I wont agree to theirs - stuck in the middle.

I have now changed the offline message to simply say "You aint paid me" and have removed the encoded $closure and I dont intimate that "they suck" anymore, its amazing what the harsh light of day makes you see.

I see a lot of flamers and haters out there, no doubt a few of you will come back on and berate me for doing this, as I said, my actions were harsh and misguided, but if a client bumps me in the future I would probably do it again.

As a developer you learn something new every day, be it a sweet bit of javascript or some cutting CSS technique, this project taught me lots over its course. The biggest lesson I take from this though is how to handle clients that become problematic, how to word contracts to cover all eventualities during development and that rash actions are usually regretted in the harsh light of day.

So yeah, thats my 2 cents worth.

What would you have done, I would love to hear what actions others would have taken.

<comment><USER30> It doesn't sound like you put a price (both in added time and money) on the additional out of scope features. So instead it looks like your super late, and want more money. Not a good place to be with a "why do we need a website" client.

<comment><USER21> exactly, easily my biggest failing on this is intimating exactly what extra costs would be acrued when the initial contract expired and adjusting end dates. Then if they pulled the plug fine, at least I wouldnt have been working for the last 14 weeks for no money and could have moved onto another project.

<comment><USER31> I'm a business manager who knows how to code (poorly). Rather than pursue programming, I saw an opportunity for be to bridge the gap between programmer and customer, so I have a lot of experiencing guiding developers away from catastrophes like the one you suffered.

Two things to take away from this:

* If you provide a fixed price without a fixed spec, you had better be prepared to lose your shirt. Fixed work means fixed spec. Always. Any changes must be accompanied by a document (a change order) that spells out the impact to the bottom line, because that's what business managers care most about. The key is to make sure you clearly communicate the impact to the bottom line all the way up to the check signer.

* Never let a project get to 14 weeks without the check signer (not just your contact or stakeholders; the person who will sign the check) knowing that you're accruing billing. It doesn't matter how good your friend is, you don't want them in a position where they're having to act the odd-man-out in order for you to get paid. It may be the "right" thing to do, but you can prevent them from ever being in that position by setting up communication that reaches all the way to the person who pays the bills.

</comment></comment></comment></comment><comment><USER32> He's pretty bitter!

He also changed the footer of the main site!

It's a Drupal site, so you can get an idea of what it looks like non-offline by going here: <http://utilitybidder.co.uk/user/>

<comment><USER33> And that page has another footer: _"we ripped off our web developer for this site and never paid him for work he done, if we knew where he put this bit of code then we would remove it, but we cant find it, we suck. maybe its better you just go to Uswitch"_ <http://www.uswitch.com/>

This is encoded in the web page as 'we ripped...'

</comment></comment><comment><USER30> My company deals with university sports teams, so often this is a state institution paying us. Most invoices are paid net 60-90 despite the terms in whey contract being net 30 + fees after. Occasionally and predictably we have clients in the net 120 or worse camp. There is no dilute about the work or the billing, just the finance office not doing their job, not getting the correct POs etc... We have one Job right now we did in august and have not been paid for despite having a PO to start. Did I mention this is the third year we have done similar work for them?

If we did something like this we'd be out of business. At large companies the person you sell to is not the person who pays you and creates all kinds of problems. All you can do is work the system and try to plan for it in your pricing. We just give less discounts and charge more for the hassle up front. Puts a hurting on the cash-flow though. We never not been paid.

</comment><comment><USER34> You may wonder why this site is offline, if you are reading the source then you are most probably a web developer that has been paid to change this.

    					I put this here as the company in question broke our contract and left payments outstanding,
    					as a last resort I put their site offline, what else could I do.

    					Make sure you are paid up front, even if you have a contract, they aint worth shit.

\-- Source code comment, haha.

</comment><comment><USER35> I'm still not sure why I upvoted this. I think because it was surprising - high entropy. I'm not sure if I consider this "right," but you have definitely made waves.

</comment><comment><USER36> They're hiring!

[http://webcache.googleusercontent.com/search?q=cache:EkZUHRV...](http://webcache.googleusercontent.com/search?q=cache:EkZUHRVJhs8J:www.utilitybidder.co.uk/careers+site:utilitybidder.co.uk&cd=15&hl=en&ct=clnk&gl=uk)

</comment><comment><USER37> It would be kinda funny if this were all actually a viral advertisement for USwitch.

</comment><comment><USER38> That's brilliant. I didn't catch it at first, but then I returned to the page and read the copy and it's very, very clever.

<comment><USER39> In how far is this action "clever"? It isn't even original.

As far as I know, it is a common fear among small companies that some unhappy third parties like unhappy web designers misuse their server credentials to get up to nonsense.

The web designer intended to demolish the reputation of the company. (Who wants to work with a company that doesn't pay the bills?)

However, if the web designer becomes publicly known, it might be a much greater damage to him. Who wants to work with a web designer who has proven to deal with payment issues in a totally unprofessional way, and who has proven to be somewhat proud of misusing trust?

<comment><USER13> The google cache for the site has:

 _Site Content Copyright © 2010 Utility Bidder Ltd. | All Rights Reserved | Website Development by Jungle Creative (www.junglecreative.com)_

It looks like a one man act from Scotland. If its not him, but someone else later down the line, he'd better get on the stick because right now, the ugly is pointing at him.

Edit: Actually poking around, he seems like a decent fellow, rocking the nomad developer dream on a little coconut island. Doesn't seem like something he should/would have done. That might make this doubly ugly. "Utility Bidder" may have hired someone else for further work who took the whole thing down over a dispute about their little part. That would be most uncool.

<comment><USER40> Scotland? Jungle Creative mentions Koh Phangan, near Thailand, as their location. Did Earth change while I wasn't looking?

<comment><USER13> The developer is from Scotland, he lives and works on the island. Sounds like a nice life.

</comment></comment></comment></comment></comment><comment><USER41> By looking at the guys "recent work" and his blog, I tend to understand the behavior of his client...

<comment><USER33> Maybe he's getting his 235th visum? ;-)

<comment><USER41> Maybe. Nevertheless, I'm wondering, whether his web "design" and behavior is common among people living on a small remote island. I really like to see some statistics about that ;)

</comment></comment></comment><comment><USER42> You should also have a look at the comments in the HTML source of the site. :-)

</comment><comment><USER43> Hoax?

</comment><comment><USER44> The problem here is not non paying clients..

Its refusing to do proper pre-client interviewing to weed out non paying clients.

</comment><comment><USER45> kudos

</comment><comment><USER46> Groovy, I hope they don't sue your ass. What you've done is not dissimilar to what the US did to Guantanamo prisoners when they suspended habeas corpus. Sentence without trial. In future I suggest you take your lack of payment up with the relevant authorities rather than demolish the building they paid you to build.

<comment><USER47> _rather than demolish the building they paid you to build_

The problem is that they didn't pay for the building. If they had paid for it, he wouldn't have demolished _his_ own building.

Just because you ask someone to do something for you doesn't mean that you have to do it. In this case, someone asked the web developer to build a website. Instead of doing that, he just made a "this person sucks" website instead. A great business move, perhaps not, but legally questionable? Also not.

<comment><USER48> Even if his contract stipulated that he owned the website due to nonpayment, I seriously doubt that it's legal for him to put up "This company sucks" _at that company's domain and with that company's logo_. And this is in the UK which has (I believe) notoriously stringent defamation and libel laws.</comment></comment></comment>