views:

469

answers:

9

Does doing "good enough" software take anything from you being a programmer?

Here are my thoughts on this:

Well Joel Spolsky from JoelOnSoftware says that programmers gets bored because they do "good enough" (software that satisfies the requirements even though they are not that optimized). I agree, because people like to do things that are right all the way. On one side of the spectra, I want to go as far as:

  1. Optimizing software in such a way as I can apply all my knowledge in Math and Computer Science I acquired in college as much as possible.
  2. Do all of the possible software development process say: get specs from a repository, generate the code, build, test, deploy complete with manuals in a single automated build step.

On the other hand, a trait to us human is that we like variety. In order to us to maintain attraction (love programming), we need to jump from one project or technology to the other in order for us to not get bored and have "fun".

I would like your opinion if there is any good or bad side effects in doing "good enough" software to you as a programmer or human being?

+12  A: 

As a programmer I want to write excellent software that's defect-free. I'm not particularly interested in gold-plating, the act of adding unnecessary features that "improve" the software, though we all do it to a certain extent. In that sense, I'm satisfied with "good enough" software, if by good enough you mean that I've done what the customer asked and, at the same time, crafted it well and ensured that it is high quality.

What bothers me is when I take short-cuts and write crappy, untested code. I hate writing code that is buggy or where I've failed to refactor it into a better design as I've gone along. when I let a lot of technical debt creep in -- getting too busy writing new features instead of consistently improving old features as I'm adding new ones -- then I know that eventually I'll have something that, while the customer may be happy with it, I won't be.

Fortunately, in my workplace, management knows the value of keeping the code clean and I know the value of not obsessing over the elusive goal of perfection. No code is ever perfect, but "good enough" has to mean that the code is well-crafted. I've learned, and am still learning, to be happy with code that meets the customer's requirements and that the best feature is the one that doesn't need to be implemented. Fortunately, I have enough work to do that dropping features because they're not needed is a good thing.

tvanfosson
+20  A: 

I actually consider good-enough programmers to be better than the blue-sky-make-sure-everything-is-perfect variety.

That's because, although I'm a coder, I'm also a businessman and realize that programs are not for the satisfaction of programmers, they're to meet a specific business need.

I actually had an argument in another question regarding the best way to detect a won tic-tac-toe/noughts-and-crosses game (an interview question).

The best solution that I'd received was from a candidate that simply checked all 8 possibilities with if statements. There were some that gave a generalized solution which, while workable, were totally unnecessary since the specs were quite clear it was for a 3x3 board only.

Many people thought I was being too restrictive and the "winning" solution was rubbish but my opinion is that it's not the job of a programmer to write perfect beautifully-extendable software. It's their job to meet a business need.

If that business need allows them the freedom to do more than necessary, that's fine, but most software and fixes are delivered under time and cost constraints. Programmers (or any profession) don't work in a vacuum.

paxdiablo
Excellent answer
JD
I think one only looks from the "only meet the business need" aspect and never to the "satisfy the programmer" aspect, the good programmers will leave and the copy-paste programmers will stay. There has to be a balance.
FeatureCreep
@FeatureCreep, if a programmer wants satisfaction, that's something they should be doing on their own time, not having the company pay for it. The wage (or rate) you receive is a compensation for doing what the company wants. This satisfaction (if the company doesn't want it) is no different to the satisfaction I would get for a nice day of golf, but I don't expect my employee to pat for that.
paxdiablo
You were exposed to "bussiness" a bit too much I think since you have accepted a "real" rubbish code in an interview. Why I say rubbish is because it lacks of intelligence. I mean, if the guy suggested this have, though of the other possibilities and THEN decided that this was the fastest and the simplest solution I migh not object(though it is still not robust and modular) but I don't think so. I actually think that guys thinking like you may bring the end of the "quality software". I'm not a perfectionist but I'm not a total pragmatist either.
BYK
@BYK, I'm not going to get into that argument again, it spanned many pages of comments. I will say that I don't believe the code was rubbish at all. It did exactly what it was meant to do and no more (YAGNI). It didn't need to do any more. Any more would have been added cost with NO added benefit, which is NOT a decision programmers should be taking, it's a business decision.
paxdiablo
@Pax, I still do not agree with you but I do understand you. You choice, your style ;)
BYK
Cheers, @BYK and thanks. That was a lot less stressful than the last time I put this view forward. It's a pleasure to find someone here who can agree to disagree.
paxdiablo
You must have great requirements stability at your shop.
moffdub
@Pax, what you say does not contradict my comment. I am just saying that -good- programmers will probably not stay very long if they have a choice. And if the economy is bad they will leave as soon as the economy turns good. So I just think it is a bad strategy. That's all.
FeatureCreep
I think programming has the same problems as cinema. The producer wants money, the director wants beauty, the spectator wants entertainment. And since the producer is the one who holds the cash, the director has to convince him that spectators would want his work as he intends to do it.
tarek
The obvious issue from the business perspective it then whether you consider 3x3 tic-tac-toe to be the only types of problems this person is going to be needed to solve. If so, then great for you. However, if he is the kind of person who will approach every problem as if it were 3x3 tic-tac-toe, then the decision to hire him will cost more than the benefit of hiring him over the course of his time with the company.
Sinan Ünür
Forget the tictactoe, bods. The issue here is following specs without all the blue sky some coders want to do. without asking permission. Everything that doesn't serve a business need is wasted effort. The business need is dictated by the business, not by what a coder thinks is right.
paxdiablo
+4  A: 

IMO there is a big difference between "good enough" and crappy code. For me "good enough" is all about satisfying the requirements (both functional and non functional). I think it is dangerous for people to assume that "good enough" means taking short cuts or not optimzing code. If the non functional requirements call for optimized code then that is part of my definition of "good enough".

JD
Indeed, the point of an Agile process is to prioritize the needs so that each release is "good enough" to satisfy the next piece of the overall problem. The software can be technically outstanding, but also just good enough to add some value and be released on time.
S.Lott
+3  A: 

The key to your question is how one defines "good". To a business person, "good" software is software that solves the business need. In that case it is more about insuring that the specifications were well understood and properly implimented. The business person may very well not care if the program is not as fast or memory efficient as it could be.

Think about the commercial software you use, is it perfect? I really don't know anyone, including my friends at Microsoft, who would argue that the code in Windows is "perfect" or anything close to it. But it is undenyable that Windows is (and always has been) "good enough" to get millions of people to use it on a daily basis.

This issue goes back long before programming. I'm sure you have heard "If it ain't broke, don't fix it" or the original in French "Le mieux est l'ennemi du bien." It may have been Voltaire that wrote about the "good being the enemy of the great".

ANd consider what would happen if hiring managers decided to stop hiring "good" programmers and insisted that every applicant had a perfect 4.0 average in college, I for one would never have gotten a job as a programmer ;-)

So for me it is a case of do the best you can given the time and budget constraints. With more time and or more money I could always do better.

JonnyBoats
+3  A: 

"Good enough" is in the eye of the beholder. Far too often, "good enough" is the refuge of incompetent people who write something which creates the impression of satisfying the requirements of a job. My "good enough" is unlikely to be the same as their "good enough".

Ultimately, everything we do must involve trade-offs. Some people will make the wrong trade-offs and deliver crappy software and some people will make the wrong trade-offs and fail to deliver. Rare are the ones who can make the right trade-offs and deliver software that really is good enough.

Sinan Ünür
A: 

Depends what you mean by "good enough". I can see some risk at the design level, if you make it good enough you may find maintaining and extending your applicataion painful.

ya23
+1  A: 

There are at least two aspects of quality that we have to take into account:

  • software quality: does the software meet the desired goals/requirements? do we deliver builds which have critical bugs? is it easy for end users to operate?
  • code quality: how hard is it to maintain the code? is it easy to implement new features?

If you're building a productized software, I think it is good to assume that it's never good enough in both aspects. Every little feature counts and if the users will not find what they need or the product is not stable enough, they will take a look at the competition. You also want to implement new features as quickly as possible, so that you have a competitive advantage in the market.

The situation gets interesting if you're building custom business software, where the end users and decision makers are usually not the same people, then the features/quality/money trade off becomes part of the negotiation process. What we usually do is we put "good enough" constraint on these three aspects: we have a set of requirements to meet, a quality to maintain and usually not enough time to keep both.

What is usually forgotten in this process is the second point: code quality or maintainability. We, programmers understand that sooner or latter crappy code will take its revenge and result in critical bugs or maintance costs. Decision makers don't. The problem is, the responsibility and risks are taken by you (your company, your division etc.) and you will be first to blame if something goes wrong.

My opinion is: for software quality do what the client tells you to do, they know best which features are critical for them, how many buggy the software can be etc. For code quality and maintainability: do as best as you can, learn to do more and teach others to do the same. This is where I get the fun from.

bbmud
+3  A: 

In my experience, "good enough" always includes hacks, sloppiness, bad commenting, and spaghetti hell, thus leads to lack of scalability, bugs, lagginess, and prevents others from being able to build effectively on your work.

Pax, while I recognize your points about business needs and pragmatism, doing things "by the book" is for the business side. "Good enough for now" and "just get something working right quick" always leads to far more work-hours later on fixing everything, or downright redoing it when it comes to that, than would be spent doing it right the first time. "The book" was written for a reason.

thePuck
A: 

I think of programming as an Art. An art that requires efficiency. Is efficient code incompatible with beautiful code ? I doubt that. In fact, i think that when you solve a problem creatively it may mean multiplied performance. I don't think that programming should only be about learning a new libraries for each new needs, nor about bug tracking and fixing. I think it should be about beauty. Of course code cannot be always art, and sometimes one should be pragmatic about the encountered problems.

tarek