Slashdot Mirror


The Duct Tape Programmer

theodp writes "Joel Spolsky sings the praises of The Duct Tape Programmer, who delivers programming teams from the evil of 'architecture astronauts' who might otherwise derail a project with their faddish programming craziness. The say-no-to-over-engineering attitude of the Duct Tape Programmer stems not from orneriness, but from the realization that even a 50%-good solution that people actually have solves more problems and survives longer than a 99% solution that nobody has because it's in your lab where you're endlessly polishing the damn thing. Like Steve Jobs, Duct Tape Programmers firmly believe that Real Artists Ship."

551 comments

  1. So, does the Duct Tape Programmer... by K.+S.+Kyosuke · · Score: 3, Funny

    ...also protect you from sellers of snake oil and fake gems?

    --
    Ezekiel 23:20
    1. Re:So, does the Duct Tape Programmer... by goombah99 · · Score: 4, Funny

      ...also protect you from sellers of snake oil and fake gems?

      No but I have a one-line perl script for that.

      --
      Some drink at the fountain of knowledge. Others just gargle.
    2. Re:So, does the Duct Tape Programmer... by Ukab+the+Great · · Score: 4, Funny

      Not really. I've seen way too much duct tape python and ruby code.

    3. Re:So, does the Duct Tape Programmer... by Big+Hairy+Ian · · Score: 4, Interesting

      My experience is the Duct Tape Programmer writes the worst kind of spaghetti code in the world. The best way to deal with someone who is over engineering the system is for his project manager & team leaders to do their job and shoot him down to size!

      --

      Build a Man a Fire, and He'll Be Warm for a Day. Set a Man on Fire, and He'll Be Warm for the Rest of His Life.

    4. Re:So, does the Duct Tape Programmer... by FooAtWFU · · Score: 1
      My office does duct-tape programming (well, Agile / "Extreme Programming") in Perl. When you do something new, the objective is basically "do the simplest thing possible... that doesn't completely suck".

      The result could turn into a mess quickly, but the key is managing your transition to the awesomely-architected 99% solution. You need a boatload of automated tests so that it's actually relatively safe to go back and refactor things without breaking everything.

      --
      The World Wide Web is dying. Soon, we shall have only the Internet.
    5. Re:So, does the Duct Tape Programmer... by Lord+Ender · · Score: 3, Interesting

      Are you referring to duck typing?

      http://en.wikipedia.org/wiki/Duck_Type

      (For the uninitiated, this is one of the reasons Ruby and Python programmers can deliver code in a tiny fraction of the time it takes Java or C# programmers.)

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    6. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 4, Funny

      No, that is because nothing important is done in Ruby or Python.

    7. Re:So, does the Duct Tape Programmer... by gladish · · Score: 2, Funny

      Build a Man a Fire, and He'll Be Warm for a Day, Teach a mean to build his own fire and ruin a perfectly good business opportunity.

    8. Re:So, does the Duct Tape Programmer... by VisceralLogic · · Score: 5, Funny

      Build a Man a Fire, and He'll Be Warm for a Day, Teach a mean to build his own fire and ruin a perfectly good business opportunity.

      Set a man on fire, and he'll be warm for the rest of his life!

      --
      Stop! Dremel time!
    9. Re:So, does the Duct Tape Programmer... by urbanRealist · · Score: 5, Insightful
      FTA:

      forgive them if they never write a unit test, or if they xor the next and prev pointers of their linked list into a single DWORD to save 32 bits, because they are pretty enough, and smart enough, to pull it off.

      No, I don't forgive them for writing obfuscated spaghetti code and leaving it for me to maintain. Also FTA:

      Duct tape programmers tend to avoid C++, templates, multiple inheritance, multithreading, COM, CORBA, and a host of other technologies that are all totally reasonable, when you think long and hard about them, but are, honestly, just a little bit too hard for the human brain.

      I laughed out loud when I read this. I write in C++. It's my favorite language. But I can't stand these Duct Tape Programmers who are the ones casting to void * because they can't be bothered with templates. Now I know nothing of COM or CORBA, but multithreading is generally not something you have a choice about. Avoid it if you can, think very carefully about when you need to use it because of the application requirements.

      --
      I've seen a lot of things, but I've never been a witness.
    10. Re:So, does the Duct Tape Programmer... by computational+super · · Score: 5, Insightful
      the Duct Tape Programmer writes the worst kind of spaghetti code in the world.

      That may be true... although personally, I find that when I'm really cursing some other programmer's name and wishing disease and misfortune upon him and his family, it's the work of a "ten-levels-of-inheritance deep wrappers around wrappers that wrap wrappers that generate code on the fly" overengineerer, rather than a spaghetti coder. At least with spaghetti coding, I can walk through it mentally and figure out what's going on (although it may take a while) - with "clever" code, I can't make heads or tails of it without a debugger.

      --
      Proud neuron in the Slashdot hivemind since 2002.
    11. Re:So, does the Duct Tape Programmer... by Jesus_666 · · Score: 2, Insightful

      Until you run into a 150 KB ten-line behemoth of a file that mixes three different languages complete with conditionals in one language containing blocks of another language with their own conditionals that contain blocks of the first language. You know you deal with a pathologically planning-averse coder when you need to draw a map on a sheet of paper just to figure out how many conditionals deep you currently are.

      Extra bonus when they somehow manage to implement an O(n^2) problem in O(n^4).

      --
      USE HOT GRITS WITH STATUE OF NATALIE PORTMAN (NAKED AND PETRIFIED)
    12. Re:So, does the Duct Tape Programmer... by jizziknight · · Score: 1

      I second this. I hate programmers that use inheritance and polymorphism simply for the sake of using it. For the love of God, if you don't actually need it, or if it doesn't make everything simpler, don't use it!

      However, depending on how the spaghetti code has been done, it can be just as annoying. If they're using GOTOs at all, or returning from functions in odd places that aren't obvious, it's not fun to debug, but I'd still prefer this to overengineering.

      If they've combined overengineering with spaghetti code, it takes all my strength to keep from stabbing them in the face.

      I also love people that use clever ways of causing functions to get called automagically. Like using the get/set of a property to call some method that's only slightly related to that property, but also does something incredibly important for the functionality of whatever class that property is in.

      --
      Everything I say is a lie. Except that... and that... and that, and that, and that, and that... and that.
    13. Re:So, does the Duct Tape Programmer... by K.+S.+Kyosuke · · Score: 1, Flamebait

      But I can't stand these Duct Tape Programmers who are the ones casting to void * because they can't be bothered with templates.

      I didn't notice anyone mentioning casting anything to void*. Perhaps your imagination is too constrained by spending too much time in C++? Perhaps he meant that it is better to avoid using C++ with its strange quirks altogether and to use languages with saner type systems?

      --
      Ezekiel 23:20
    14. Re:So, does the Duct Tape Programmer... by oldhack · · Score: 2, Insightful

      And also a big difficulty doing big projects with Python - it becomes too damn unwieldy.

      Nevertheless, noodle monster bless Python. Right tool for the right job, etc.

      --
      Fuck systemd. Fuck Redhat. Fuck Soylent, too. Wait, scratch the last one.
    15. Re:So, does the Duct Tape Programmer... by dgatwood · · Score: 1

      Don't forget Objective-C, which on the Mac platform is the most important one of all.

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

    16. Re:So, does the Duct Tape Programmer... by El_Muerte_TDS · · Score: 4, Funny

      What!? You can have multiple lines in a perl script?

    17. Re:So, does the Duct Tape Programmer... by dgatwood · · Score: 0

      I have to disagree with you about templates. In C++, IIRC, templates bring with them limitations and restrictions that can really cause problems down the line. Worse, their memory footprint is an abomination. You can generally assume that for each different template type you pass to a template class, you've duplicated a significant portion (and possibly all) of the executable code for that class. They also clutter up the syntax every time you declare the class, though one might reasonably argue that void casting does the same for every use, so that's not a very strong argument.

      If you really don't like casts, add extra wrapper methods for each type, thus confining the void casting to a limited number of places in the class itself without causing a significant amount of code bloat. Or use macros to do the casting for you and remove all the code bloat.

      I agree with you about multithreading, though. One should not eschew it because it is hard. Bolting it on when you realize you're only taking advantage of 12.5% of that eight core CPU is much harder than designing your app right to begin with.

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

    18. Re:So, does the Duct Tape Programmer... by dgatwood · · Score: 1

      I would argue that goto is great when used correctly---for jumping to a cleanup routine at the end of a complex function that you jump to when anything goes fatally wrong. This makes the code much more readable and concise, reduces code bloat, and generally makes debugging easier. It's rare that goto is acceptable anywhere else, though. :-)

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

    19. Re:So, does the Duct Tape Programmer... by Joce640k · · Score: 4, Insightful

      I bet Joel doesn't drive to work in a duct-taped go-cart .... and I bet he wouldn't drive over bridges or work in a building which wasn't designed by a proper, qualified engineers/architects.

      Out in the real world his "duct tape" programmer would be called a "cowboy builder".

      As for his ranting on C++: He's demonstrated his C++ ignorance enough times for C++ programmers to just ignore his opinion - he still thinks it's just C with added bloat. I agree that multithreading is harder than it looks but templates and multiple inheritance...? Puh-lease.

      The final nail in the coffin of the rant is in the last line where he says it's ok to avoid unit testing but that xoring two pointers together is somehow cool. If you weren't ignoring him before you should be by now.

      Summing up: Joel has jumped the shark, every article just confirms it more

      --
      No sig today...
    20. Re:So, does the Duct Tape Programmer... by Shillo · · Score: 0

      He was refering to ATL. This is a basic example of ATL (Active Template Library), when used to define a COM object:

      class ATL_NO_VTABLE CDocumentChecker : // multiple inheritance
              public CComObjectRootEx,
              public CComCoClass,
              public ISupportErrorInfo,
              public ISpellChecker
      { ... more abomination here ...
      }

      I kid you not.

      --
      I refuse to use .sig
    21. Re:So, does the Duct Tape Programmer... by Lord+Ender · · Score: 3, Insightful

      Bad programmers can write "unwieldy" code in any language. High-level, dynamic, duck-typed languages are not unique in this respect.

      The difference is, the app is up and running, ready to ship with the duck-typed languages, whereas people using lower level static languages are still writing converters and reconverters which don't add anything to the actual functionality of the app.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    22. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 0

      ...it's the work of a "ten-levels-of-inheritance deep wrappers around wrappers that wrap wrappers that generate code on the fly" overengineerer...

      This isn't a case of overengineering, this is a case of poor architecture. Ten levels of inheritance is almost never a good idea, and every decent architect knows that. TFA's beef really isn't with "'architecture astronauts' who might otherwise derail a project with their faddish programming craziness", it's with people who don't actually know how to properly architect an application. Unfortunately, the solution offered is to throw away all architecture entirely, rather than just do it freakin' right.

      Good architecture is always the right answer. Spaghetti architecture takes forever to build in the first place, and then is hell to support. Duct tape programming takes less time to build in the first place, but ends up either being hell to support or getting rewritten properly later, in which case it should've just been done that way in the first place.

    23. Re:So, does the Duct Tape Programmer... by Stevecrox · · Score: 1

      I can sort of understand the idea of coming up with new programing methodologies but this one sounds like a weird justification for crappy code and managers ticking boxes. Even the idea that 50% there is better than never getting to 99%.

      I'm currently working on a piece of functionality for a prototype which is roughly 80% done but has no GUI, without the GUI the rest of the code might as well not be there and without a properly designed and laid out GUI the whole point of the functionality comes into question.

    24. Re:So, does the Duct Tape Programmer... by Xordin · · Score: 2, Insightful

      No, I don't forgive them for writing obfuscated spaghetti code and leaving it for me to maintain.

      "Spaghetti code" is just a term used by programmers to describe someone else's work.

    25. Re:So, does the Duct Tape Programmer... by ultranova · · Score: 5, Insightful

      The difference is, the app is up and running, ready to ship with the duck-typed languages,

      Except that it isn't. Sure, it starts, runs for a few seconds, and then exits due to typing error.

      All duct typing does is move type errors from compile time to runtime, which also means that you can never be sure if you've actually squashed them all. I truly hate that aspect of Python.

      --

      Forget magic. Any technology distinguishable from divine power is insufficiently advanced.

    26. Re:So, does the Duct Tape Programmer... by spitzak · · Score: 1

      I agree with this, it is making unmaintainable write-only code.

      A rule I try to follow: unless you actually have, right NOW, two or more derived classes, DON'T MAKE A BASE CLASS! Just make one class that does what you want and stop trying to be clever or so conceited that you think your code is valuable enough to "reuse".

      I certainly see systems where the inheritance diagram is a straight line far too often.

    27. Re:So, does the Duct Tape Programmer... by ciggieposeur · · Score: 1

      In C++, IIRC, templates bring with them limitations and restrictions that can really cause problems down the line. Worse, their memory footprint is an abomination. You can generally assume that for each different template type you pass to a template class, you've duplicated a significant portion (and possibly all) of the executable code for that class.

      Modern C++ compilers have known how to remove duplicate template code for quite a few years.

      They also clutter up the syntax every time you declare the class

      That's true if you're used to pre-TR1 C++, what I call "Older C++". I call "Modern C++" the stuff that uses and looks like Boost (e.g. functors, templates, metaprogramming). To me they are really two different languages, even though "Modern C++" compilers will often compile "Old C++" source. I try to avoid mixing these two languages in source.

      I agree with you about multithreading, though. One should not eschew it because it is hard. Bolting it on when you realize you're only taking advantage of 12.5% of that eight core CPU is much harder than designing your app right to begin with.

      Depending on my app designs, if they are "embarrassingly" parallelizable I'll generally split them into discrete processes using the filesystem as glue (e.g. intermediate files between stages, named pipes between parallelized parts, fork()/exec()/kill()/wait4()). This makes it really easy to test individual "threads" (processes) and lets me use whatever language for each part that makes the most sense for that job. For things that need to be highly-threaded, I lean toward languages with well-tested thread support like Clojure/Java.

      My $0.02. YMMV.

    28. Re:So, does the Duct Tape Programmer... by Lord+Ender · · Score: 3, Interesting

      To be fair, you must concede that while the static languages catch some errors at compile time which might not be caught until runtime (or ideally, QA) with a dynamic/duck language, the static languages also "catch" a great deal of non-errors which the programmer is forced to deal with even though they never would have caused problems at run-time, while having the side-effect of reducing code re-use.

      Having to fuss with every little inconsequential detail has an advantage as far as testing goes, but it does come with a great cost as well. Some would argue that dynamic/duck + extra testing has the same effect with less cost than static + less testing.

      Ruby and Python have only been "mainstream" for a few years, while static languages have been around since the ancient days. We have yet to see how high they can rise, but I'm betting they'll go pretty far--especially considering the fact that QA teams are far less expensive to business than programmers are.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    29. Re:So, does the Duct Tape Programmer... by jgrahn · · Score: 2, Interesting

      I have to disagree with you about templates. In C++, IIRC, templates bring with them limitations and restrictions that can really cause problems down the line.

      Such as ...?

      Worse, their memory footprint is an abomination. You can generally assume that for each different template type you pass to a template class, you've duplicated a significant portion (and possibly all) of the executable code for that class.

      Yeah, that's probably going to take up a few kilobytes of your gigabyte of RAM. Seriously, I believe this is very, very rarely a problem. I'm more concerned about the bloat effect of inlining (which has little to do with templates).

      They also clutter up the syntax every time you declare the class, though one might reasonably argue that void casting does the same for every use, so that's not a very strong argument.

      You mean the < and > are clutter, or what other information in e.g. map<string, int> do you feel is clutter and not vital parts of the type name? Or are you talking about the definition of the template? I'm not sure I understand.

      If you really don't like casts, add extra wrapper methods for each type, thus confining the void casting to a limited number of places in the class itself without causing a significant amount of code bloat. Or use macros to do the casting for you and remove all the code bloat.

      *Boggle* Do people still *do* things like that?

      I somehow get the feeling that you see templates as just a way to define the C++ standard containers: list, map, vector and so on, and that you dislike them so you define your own lists, maps and vectors using void pointers and casts. That is not at all how I use templates (someone has already written, tested and documented those containers for me). Mine tend to be tiny utilities, like accumulator (some integer type which starts out at 0 and can only be incremented) or small function templates which do stuff to similar but unrelated types. I use them mostly to make my code simpler and easier to use, by removing tedious duplication.

      I agree with you about multithreading, though. One should not eschew it because it is hard. Bolting it on when you realize you're only taking advantage of 12.5% of that eight core CPU is much harder than designing your app right to begin with.

      And yet again, the argument for multithreading boils down to "I must max out my CPU resources using no more than a single process"! The situation you describe is bad only if (a) more performance from the program would be nice, (b) a multiple-process design isn't easier and safer, (c) you can handle the extra development cost for a multithreaded design (as you said, it's hard), and (d) you have no other use for the other seven CPUs. That situation can happen, but it's rare. Most threading is due to stupidity, not a real need.

    30. Re:So, does the Duct Tape Programmer... by shutdown+-p+now · · Score: 2, Insightful

      For the uninitiated, this is one of the reasons Ruby and Python programmers can deliver broken code in a tiny fraction of the time it takes Java or C# programmers.

      Fixed that for you. Static typing is a safety check. Get rid of it, you also get a higher chance of runtime bugs that slip through undetected, and lie dormant until you trigger the exact condition that leads to the bug.

      "But", you hear the adherents of dynamic languages saying, "this is what unit tests are for! Just make sure you have 100% coverage, and you'll be fine!". But that's the point - to truly get to that 100%, especially in a reusable framework, it means you have to test things such as someone passing an object of a wrong type to your method - something that is simply impossible in, say, Java. So Java developers may lose on the amount of code because of all the extra type annotations, but win on not having to test type safety violations that the language checks for them.

      Of course, in an article about "duct tape programming", this point is probably moot - "duct tape", as described in TFA, strongly implies "no unit tests".

    31. Re:So, does the Duct Tape Programmer... by marcosdumay · · Score: 1

      Yes, automated tests are essential for the long term viability of any program. But they are also a sgnificative delay for the first few iterations. There is a time when it makes sense adding them, but it not alsways at the begining of development.

    32. Re:So, does the Duct Tape Programmer... by KZigurs · · Score: 1

      shouldn't have fired him, then.
      (oh, and multi-threading is one of most useful tools you can have in your arsenal. When applied properly it can solve rather large amount of problems or edge cases just by decoupling different parts of the system. Especially in the UI development.)

    33. Re:So, does the Duct Tape Programmer... by jgrahn · · Score: 3, Interesting

      I laughed out loud when I read this. I write in C++. It's my favorite language.

      Mine too, but I identify with Spolsky's duct tape programmers (not the term, but the idea).

      But I can't stand these Duct Tape Programmers who are the ones casting to void * because they can't be bothered with templates.

      We all set the limit somewhere ... Spolsky, JWZ, ESR and a whole lot of slashdotters think C++ is on the wrong side of that limit. I like to think they're basing that on old information, from the hype days in the 1990s when everyone had to pretend that they were developing abstract general reusable libraries rather than Getting Work Done. I think that sick attitude is mostly gone from C++ today (although some (not all) Boost libraries give me nasty flashbacks ...)

      Now I know nothing of COM or CORBA

      That is something to be grateful for,

      but multithreading is generally not something you have a choice about. Avoid it if you can, think very carefully about when you need to use it because of the application requirements.

      Sure you have a choice. You can pick a task which has no need whatsoever for multithreading, and add threads. Lots of people do this, when a sane select() loop would have been enough.

    34. Re:So, does the Duct Tape Programmer... by marcosdumay · · Score: 2

      I usualy think he's quite locked into the Microsoft way of thinking, but this one is an article that makes a lot of sense. If you didn't pay atention, both avoiding unit test and xoring the pointers leaded to the same "feature" on the software, it shipped. Yeah, it would be great if you could do unit tests, refactor everything until you fit at the intended memory footprint and still ship on time. Problem is, it isn't possible. You can add unit tests later, when they are really needed, you can also remove the xor, once you realize a way of reducing the overall size of your data, or may never touch it later, if the first programer did it right the first time (yes, that is a characteristic of some hacks, they tend to stay there untouched, and are only removed when the functionality they enabled is made obsolete). What you'll never be able to fix are all the oportunities you lost because you were polishing your code, and couldn't ship it.

      But hell, Here am I again, posting on /. instead of hacking away...

    35. Re:So, does the Duct Tape Programmer... by Lord+Ender · · Score: 2, Informative

      I realize you're joking, but here's a list of organizations that make serious use of Python:

      http://wiki.python.org/moin/OrganizationsUsingPython

      I don't know if a list like this is being maintained for Ruby, but where I work, most of our internal business web apps, and some of our external apps, are done in ruby. Metasploit, a major app I and many others rely on for security testing, is written entirely in ruby. The folks at Engine Yard (http://www.engineyard.com/) also do serious web app hosting entirely in jruby.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    36. Re:So, does the Duct Tape Programmer... by Lord+Ender · · Score: 1

      You are correct that having the programmer specify every little detail and do extra conversions manually can potentially reduce bugs, but that comes at the expense of code re-use and development time. That's called a trade-off.

      Less code re-use also means more code... which can mean more bugs, obviously.

      Personally, I would much prefer a little extra testing and a lot less development time to putting up with the tedium of Java. The dynamic languages are just recently surging in popularity, so we'll see which wins out in the long run.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    37. Re:So, does the Duct Tape Programmer... by LifesABeach · · Score: 1

      Not really, the Duct Tape Programmer, DTP, will actually start the program and run it to verify that the change is working, and then moves on without regret. All hale the DTP!

    38. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 0

      That's not duck typing, that's runtime type checking.

      For example, O'Caml has duck typing, but it fully checks programs at compile time.

    39. Re:So, does the Duct Tape Programmer... by Just+Some+Guy · · Score: 0, Troll

      Except that it isn't. Sure, it starts, runs for a few seconds, and then exits due to typing error.

      Except that you're full of shit and this tired old troll needs to die.

      I've never seen a type error in production. In development? Sure, just as I've accidentally tried to pass a char instead of a *char when programming C until the compiler complained and I fixed it. But never once in a live environment, ever, in programs I've written or gotten from someone else, have I ever seen a type error in a duck-typed program. I know this is a popular Slashdot meme among the inexperienced ("WHAT IF I GIVE AN INT INSTEAD OF A FILE READER HAR HAR HAR!") but it just doesn't jibe with reality.

      Seriously, find another hypothetically possible but never seen in the real world problem to harp on. This one's expired.

      --
      Dewey, what part of this looks like authorities should be involved?
    40. Re:So, does the Duct Tape Programmer... by shutdown+-p+now · · Score: 1

      You are correct that having the programmer specify every little detail and do extra conversions manually can potentially reduce bugs, but that comes at the expense of code re-use and development time. That's called a trade-off.

      It doesn't have to come at the expense of code re-use if the type system is expressive enough. See Scala for a good example of that. It also doesn't have to come at the expense of development time (spend by developer writing type annotations), if sufficiently advanced type inference is used - see Haskell for an example of that.

      Personally, I would much prefer a little extra testing and a lot less development time to putting up with the tedium of Java.

      Note that I specifically spoke of unit testing there, and writing those unit tests is still "development time".

      The dynamic languages are just recently surging in popularity, so we'll see which wins out in the long run.

      Surging, really? One of the first two OOP languages - Smalltalk - was a dynamic language, and it was pretty popular in its time, but its popularity faded, and dynamic typing was a part of that (and the disadvantage was understood by its creators clearly enough that they came up with Strongtalk). On the other hand, Perl has been around and actively used for, what, over 20 years now? Python, 15, and Ruby over 10.

      Don't get me wrong - there are definitely cases to be made for dynamic and duck typing, which is why you see existing static typing languages acquire opt-in dynamic typing as an extension (e.g. see C# 4.0). Rapid prototyping with dynamic typing makes perfect sense. On relatively small amounts of code, so does actual development. But on the whole, further researches into type theory to improve the existing type systems and type inference is a better future path.

    41. Re:So, does the Duct Tape Programmer... by JAlexoi · · Score: 1

      (For the uninitiated, this is one of the reasons Ruby and Python programmers can deliver code in a tiny fraction of the time it takes Java or C# programmers.)

      If you add to that the number of additional unit tests required to release really quality piece of software, you end up roughly similar amount of time. At the end it all boils down to other things and least of all is the language choice.

    42. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 0

      I must say, I've never encountered a type error in a dynamic language after the delivery of the application. That's called testing and planning for bad input. Duck typing largely involves tests that the corresponding object is capable of responding in the correct manner to the call being issued. So, the type doesn't matter, only that the object is capable of responding properly. Therefore, you're enabling a wide class of data types as input while ensuring the call works. As far as I'm concerned, that's a good thing.

    43. Re:So, does the Duct Tape Programmer... by ruewan · · Score: 1

      I am the opposite. I usually want to send people to programming jail when they have 2000 lines of code in one method, lots of nested if statements and a whole bunch of comments saying with this piece of duct tape is here. I say do it right the first time instead of trying to patch it till it works. Duct tape programming is a maintenance nightmare.

    44. Re:So, does the Duct Tape Programmer... by Kjella · · Score: 1

      but I'm betting they'll go pretty far--especially considering the fact that QA teams are far less expensive to business than programmers are.

      Only if you get nice and reproducable errors, those you can squash in any language fairly easy. Chasing ghost bugs usually takes lots of programmer time even if the QA guys can tell you the application is crashing...

      --
      Live today, because you never know what tomorrow brings
    45. Re:So, does the Duct Tape Programmer... by BenoitRen · · Score: 1

      If all that matters is that the software gets shipped, sure. But I doubt that the quality of the program doesn't matter at all.

      It's this attitude that leads to unfinished and buggy software getting shipped.

    46. Re:So, does the Duct Tape Programmer... by Tweenk · · Score: 2, Insightful

      the static languages also "catch" a great deal of non-errors which the programmer is forced to deal with even though they never would have caused problems at run-time

      The solution is templates and type inference, not moving type errors to runtime.

      --
      Those who would give up liberty to obtain working drivers, deserve neither liberty nor working drivers.
    47. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 0

      Only because their mothers keep bringing them pizza and coke. C programmers have to walk to the cafeteria

    48. Re:So, does the Duct Tape Programmer... by dgatwood · · Score: 1

      Such as ...?

      Among other things, templates tend to lead to problems debugging, designs that aren't well thought out, etc.

      http://www.ski-epic.com/templates_stl_rant/index.html
      http://www.informit.com/articles/article.aspx?p=26017

      You also can't safely use the STL classes as base classes because they have no virtual destructor, so if you end up using them and need to do interesting stuff on top of them later, you can be in for a world of hurt.

      Finally, if you use STL classes with mixed types that are polymorphic and expect them to behave reasonably, you're in for a world of hurt.

      http://www.oonumerics.org/tmpw00/kuehl.html

      Yeah, that's probably going to take up a few kilobytes of your gigabyte of RAM. Seriously, I believe this is very, very rarely a problem.

      In large pieces of software coded with heavy use of templates, it can bloat code pretty dramatically. RAM isn't free.

      Most threading is due to stupidity, not a real need.

      I guess it depends on what you're doing. If you are writing something that doesn't need multiple threads for performance, though, you usually don't need more than about a two core CPU, either, in which case you probably have already bought the last computer you will ever need. If we're focusing most of our coding effort on those folks, we're mainly wasting time because they've also probably bought the last version of the app they will ever need. :-)

      Let's face it, CPUs aren't getting any faster, for all practical purposes. Performance is reaching a plateau. This means that if software continues to grow larger and more complex at the current rate, the user experience is going to get exponentially slower. The most promising way to improve upon this is with multiple cores, but only if the software can take advantage of it. Single threaded apps need not apply.

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

    49. Re:So, does the Duct Tape Programmer... by dgatwood · · Score: 1

      Modern C++ compilers have known how to remove duplicate template code for quite a few years.

      Last I checked, the most popular C++ compiler, G++, still is not "modern" by that definition. The linker may reduce the mess at the end, but it's still likely to be a significant compile time hit. (No, I haven't benchmarked this.)

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

    50. Re:So, does the Duct Tape Programmer... by Lord+Ender · · Score: 1

      If you think ruby was "mainstream" 10 years ago, you're looking at a different history than I am.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    51. Re:So, does the Duct Tape Programmer... by statusbar · · Score: 1

      Yes this blog posting of his was disappointing because he showed his opinions in areas of technology where he has willful ignorance.

      --jeffk++

      --
      ipv6 is my vpn
    52. Re:So, does the Duct Tape Programmer... by Tired+and+Emotional · · Score: 1
      I think SmallTalk introduced duck typing rather than Perl. But anyway, there is a real difference here that is important from a theoretical viewpoint.

      If you think about the inheritance tree (in C++ if you like) then all methods are inherited. There are no synthesized attributes. On a general tree, attributes can be both inherited (they flow away from the root) and synthesized (they flow towards the root). These terms were original introduced by Knuth, I think, a long time ago in a context far far away.

      In a language like C++ you have to know what type has the synthesized attribute to do a dynamic cast, so you cannot write a routine that will work with any type that has a given (set of) method(s). So you end up forcing all the methods used by some set of classes down into a common ancestor (perhaps, in C++ as pure methods), which is a nightmare or even impossible if the common base class is not in a subsystem you own or can convince someone to change.

      One way to handle this in a statically typed language is with interfaces. You define a parameter as supporting an interface. This can be (partially) checked at compile time at the call point and assuming your language allows checking at runtime, never converts a compile time fail into a runtime fail because you would otherwise have had to do a dynamic cast that would itself only fail at run-time.

      --
      Squirrel!
    53. Re:So, does the Duct Tape Programmer... by inKubus · · Score: 1

      Yeah, the FA is breathless hagwosh. What a fucking 25 year old. You only get a few chances to ship shit and then only if your product is truely groundbreaking. If you ship a shitty text editor, you aren't going to have a customer left.....

      --
      Cool! Amazing Toys.
    54. Re:So, does the Duct Tape Programmer... by Spy+der+Mann · · Score: 1

      I would argue that goto is great when used correctly---for jumping to a cleanup routine at the end of a complex function that you jump to when anything goes fatally wrong.

      This is where the duct tape programmer fails: Design Patterns. What you just described is called RAII (Resource Acquisition Is Initialization - look it up in wikipedia), and it SIMPLIFIES programming while also saving you coding and debugging time.

      Clean up code should go in the destructors, so they can be called when an exception is thrown. Oh, I guess duct tape programmers are masters at writing exception-safe code, right? ...right?

    55. Re:So, does the Duct Tape Programmer... by KagatoLNX · · Score: 1

      Actually, we support JRuby, classic Ruby (a.k.a. MRI), and we're working awfully hard to get Rubinius out the door, too.

      --
      I think Mauve has the most RAM. --PHB (Dilbert Comic)
    56. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 0

      Pretty good moderation for quoting the GP's signature.

    57. Re:So, does the Duct Tape Programmer... by shutdown+-p+now · · Score: 1

      My apologies for ambiguous wording - "mainstream" applied to Perl, not Python/Ruby. However, I'd say that Python is mainstream for the last 9 years or so, PHP for about the same time period, and Ruby for about 5 years (since RoR). It's still quite a long time - Java got from 1.0 to most used programming language in less than that.

    58. Re:So, does the Duct Tape Programmer... by oldhack · · Score: 1

      ... but multithreading is generally not something you have a choice about. Avoid it if you can, think very carefully about when you need to use it because of the application requirements.

      A well-known lesson took a long while to get through my thick skull. If you're gonna do threading, try to design it to be async with message passing. Except in extreme simple cases, mucking around with locks and shared (among threads) resources will screw you over. And over. And over.

      --
      Fuck systemd. Fuck Redhat. Fuck Soylent, too. Wait, scratch the last one.
    59. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 0

      If you didn't pay atention, both avoiding unit test and xoring the pointers leaded to the same "feature" on the software, it shipped.

      Except that it's clear that he's talking about unit tests without any real-world experience using them. He's probably heard from people that unit tests add a lot of extra time which I've found is only really true when you try to create a rich suite of tests that handle most error conditions...that's something you should aim to do eventually, but it's not necessary to get a lot of the benefits from tests. But if you're rapidly prototyping, I've found that implementing just the success case tests adds almost zero overhead.

      The reason for this is that running unit tests usually takes dramatically less time than deploying/building the application and testing it manually. At some point, you always have to do that manual testing to confirm that the code works as you expect it to. But the longer you can delay that and the more you can reduce the number of manual testing iterations, the faster you can ship the software.

      There's other reasons why it's desirable too. In my experience, designs that aren't testable are usually not very good. If I'm forced to think about how I'd write a unit test, my designs get better. And unit tests allow big refactoring operations to go fairly smoothly which is especially important in cases where you don't want to plan out your design ahead of time as would be the case when you want to ship something as soon as possible. Programmers who can blindly code "by the seat of their pants" without making serious missteps are exceedingly rare. Those who think they can are much more common. Those who know they can't write tests.

    60. Re:So, does the Duct Tape Programmer... by buchner.johannes · · Score: 1

      For lols (and wtfs), take a look at http://github.com/domdorn/Jake/raw/master/generateDao.sh
      It generates Java proxy code using Bash and Python :-) quick-and-dirty ... very dirty.

      --
      NB: The message above might reflect my opinion right now, but not necessarily tomorrow or next year.
    61. Re:So, does the Duct Tape Programmer... by jonadab · · Score: 1

      Personally I like the inheritance model that Inform uses. Rather than being designed around some kind of theoretical purity, it's designed to facilitate code re-use to the greatest extent possible. It's a bit different and takes some getting used to, but it's amazingly convenient. So a class or object can inherit properties (including code as well as other data) from multiple classes, and any conflicts are resolved based on the declared order. Like I said, it's a bit different (a C++ programmer would probably be hopelessly confused at first), but it's amazingly *practical*. Being able to alter an individual object's properties at runtime, including code (the code has to pre-exist, but you can assign a different routine to a property than the one it started with), is also quite useful.

      --
      Cut that out, or I will ship you to Norilsk in a box.
    62. Re:So, does the Duct Tape Programmer... by WarlockD · · Score: 1
      FTA:

      They have to be good enough programmers to ship code, and weâ(TM)ll forgive them if they never write a unit test, or if they xor the âoenextâ and âoeprevâ pointers of their linked list into a single DWORD to save 32 bits, because theyâ(TM)re pretty enough, and smart enough, to pull it off.

      THAT scared me more than anything I know. I mean, what the hell, its not even "easyer"? if you need to shave off 4 bytes a record THAT badly, use a damn array.

    63. Re:So, does the Duct Tape Programmer... by ralphdaugherty · · Score: 2, Interesting

      You need a boatload of automated tests so that it's actually relatively safe to go back and refactor things without breaking everything.

            I know it's a fad for you guys to go on about refactoring things, but it's hard for me to believe that there are very many of you that aren't already breaking task interfaces down enough in initial coding, so I don't believe in reality refactoring even makes sense despite the constant talk about it, and two it's hard to believe the ones of you that mention this refactoring business as some sort of given work for a business unit of any appreciable size that uses the software.

            Making a change to any software in production is a disruption to business, essentially a forbidden disruption for anything that isn't broke. And as I read the /. posts through the years referring to this refactoring state of mind, the theme is that of improving maintainability, which as I've posted through the years is complete hogwash. By changing the code and requiring complete retesting and signoff by the business, the time, effort, and disruption to the business that is alleged to be prevented has alrteady taken place, much more than any actual required business logic changes that eventually will be made.

            Although I'm sure most of you must work for businesses of appreciable size, it's a very strange scenario indeed being touted that most certainly is unacceptable to any business.

            I am sorry that I unload this on one random post mentioning refactoring as some given, it's just one of many in any /. programming thread.

        rd

    64. Re:So, does the Duct Tape Programmer... by fractoid · · Score: 2, Informative

      The person who modded this flamebait exhibits the Dunning-Kruger effect in context of his code-reading skills.

      --
      Rampant carbon sequestration destroyed the Dinosaurs' tropical paradise. I'm here to help repair the damage.
    65. Re:So, does the Duct Tape Programmer... by MagikSlinger · · Score: 3, Interesting

      To be fair, you must concede that while the static languages catch some errors at compile time which might not be caught until runtime (or ideally, QA) with a dynamic/duck language, the static languages also "catch" a great deal of non-errors which the programmer is forced to deal with even though they never would have caused problems at run-time, while having the side-effect of reducing code re-use.

      Um... no. I work with a proprietary duck type language and Java at work. Java does not catch non-errors, IMHO. On the other hand, we have to test the hell out of the duck type language because we can only find the bugs at run-time, and with the complex code we write at work, that takes a LONG time!

      Duck typing is nice and has some nice features. I think it makes remoting such a painless thing to implement. But in practice, I do not find it is better or faster than statically typed languages. In fact, if you are working in a large team, static typing is faster because if goober over there on the other side of the floor changes his interface, he is the one who notices it and has to fix it. In the duck-type language mentioned above, I find out about it when the next nightly dev build happens and I spent half the morning fixing problems he caused.

      Duck typing is simply different. It has certain strengths in certain situations, just as statically typed languages. I know this in an unpopular view but: the right language for the right task. Seriously, just because Python/Perl/Ruby is your Dremel motor tool doesn't mean you should remodel your kitchen and build your own cabinets from scratch with just a Dremel!

      --
      The bitter lessons of a veteran coder: http://bitterprogrammer.blogspot.com
    66. Re:So, does the Duct Tape Programmer... by socha23 · · Score: 1

      Ever heard of try-finally?

    67. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 0

      The difference is, the app is up and running, ready to ship with the duck-typed languages,

      Except that it isn't. Sure, it starts, runs for a few seconds, and then exits due to typing error.

      All duct typing does is move type errors from compile time to runtime, which also means that you can never be sure if you've actually squashed them all. I truly hate that aspect of Python.

      ...that plus those silly indentations!

    68. Re:So, does the Duct Tape Programmer... by GileadGreene · · Score: 1

      Ruby and Python have only been "mainstream" for a few years, while static languages have been around since the ancient days.

      Right. But Lisp, which is dynamically typed, has been around since the late 50s (second oldest high level language). And Smalltalk, which was a strong influence on Ruby, dates from the early 70s. Erlang has been around since the mid 80s. So "dynamic" languages have been around since the ancient days too. There's a place for both in the modern development environment. Horses for courses.

      Some would argue that dynamic/duck + extra testing has the same effect with less cost than static + less testing.

      Indeed. Others would argue that (good) static + more testing gives you the best of both worlds. This is a time-worn debate, and is unlikely to be resolved any time soon. Ultimately, the choice will come down to a combination of developer preference, and the cost/benefit/reliability issues associated with the specific domain you're working in. The biggest problem with debates like the static/dynamic one is that everyone seems to assume that the way software is developed in their specific application domain is suitable for every other application domain too. In practice, that's hardly ever true.

    69. Re:So, does the Duct Tape Programmer... by Big+Hairy+Ian · · Score: 1

      When there's no need for the inheritance it qualifies as spaghetti code

      --

      Build a Man a Fire, and He'll Be Warm for a Day. Set a Man on Fire, and He'll Be Warm for the Rest of His Life.

    70. Re:So, does the Duct Tape Programmer... by dgatwood · · Score: 1

      Yes, that's one way to accomplish the same thing, if your language supports it. It also means that you end up using exceptions, which IMHO are evil. The entire notion of program execution jumping out of a context is just plain wrong. It is goto times a thousand because it isn't constrained to dropping you elsewhere in the same function. In fact, exceptions remind me of the old setjmp and longjmp instructions in procedural C, and earn no less disdain from me. They make debugging harder and make it harder to return precise error messages to the user, all to save a mere handful of lines of code per function for proper error checking. Exceptions are the ultimate example of duct tape programming, and are the primary reason that I refuse to program in Java. Ever.

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

    71. Re:So, does the Duct Tape Programmer... by Anonymous Coward · · Score: 0

      Python is great for a lot of things (and fun in that twisted way most of us here enjoy) - but I agree with you 100%, Python forces you to do code-coverage for any change in data representation. Some would argue this is a feature, but the computer should do this work for you.

    72. Re:So, does the Duct Tape Programmer... by computational+super · · Score: 1
      unless you actually have, right NOW, two or more derived classes, DON'T MAKE A BASE CLASS!

      Amen, brother. I actually (try to) take this a step further and say - unless I can write a function that can operate on the base class, without EVER downcasting, don't make a base class.

      --
      Proud neuron in the Slashdot hivemind since 2002.
    73. Re:So, does the Duct Tape Programmer... by aloshbennett · · Score: 1

      Why would anyone mistake Duct Taping for Duck Typing?

    74. Re:So, does the Duct Tape Programmer... by DragonWriter · · Score: 1

      Yes, automated tests are essential for the long term viability of any program. But they are also a sgnificative delay for the first few iterations.

      If you can't understand a behavioral requirement enough to write an automated test that would verify that code meets the requirement, you certainly don't understand the requirement well enough to write code that meets it, either.

      There is a time when it makes sense adding them, but it not alsways at the begining of development.

      It would seem to me that it would be at (or, really, just before) the beginning of writing real code to meet real, defined requirements. Its conceivable there might be some benefit do some prototyping aimed at exploring and nailing down ambiguous requirements before that, though even there you might want to have basic automated tests to verify the code being used as a prototype behaves correctly in terms of what it is intended to demonstrate.

    75. Re:So, does the Duct Tape Programmer... by DragonWriter · · Score: 1

      Ruby and Python have only been "mainstream" for a few years, while static languages have been around since the ancient days.

      Dynamic languages have been around for a long time, too. Lisp is more than a decade older than C.

  2. True that by gestalt_n_pepper · · Score: 5, Insightful

    Agile, scrum, patterns, unit tests, etc.
    .
    Interesting ideas, but can anybody show me *any* significant, quantitative, comparative proof of improved ROI?
    .
    Software is about money guys.

    --
    Please do not read this sig. Thank you.
    1. Re:True that by Anonymous Coward · · Score: 1

      You'd be surprised how many money generating services run on top of really sloppy code that you wouldn't want anybody else to see.

      Nice, structured and clean code is appreciated, but this is the real world we're talking about where deadlines are everything. Getting it up and running is the goal. Nobody cares if it's ugly and stiched together.

    2. Re:True that by Chrisq · · Score: 5, Insightful

      Agile, scrum, patterns, unit tests, etc. . Interesting ideas, but can anybody show me *any* significant, quantitative, comparative proof of improved ROI? . Software is about money guys.

      From experience yes to unit tests. The number of times regressions have been picked up by a test bank before deployment to the UAT (user acceptance testing) system it pays for itself many times over. Patterns save time when an experienced group discusses design, but with developer turnover I get the feeling I have spent at least as much time explaining patterns to new developers as I have saved.

    3. Re:True that by Jurily · · Score: 2, Insightful

      According to TFA, there are times when you have to choose between unit tests and staying ahead of the competition. What would you do?

    4. Re:True that by geekoid · · Score: 5, Insightful

      From eperson experience, I ahve seen all you list work extremely well.

      the projects took anywhere from 10 - 20% longer to go live, but all of them went out with huge success and barely any bugs. In fact one million line project went out and only had 2 bugs. Not a single one had a complaints about missing features or bloat.

      Anecdotal, yes; however I ahve been programming for a long time and I was amazed at how well it worked out. Freaking amazed.

      The problem s not that they don't work, the problem is most places don't actually implement them correctly, or have on partial buy in.

      If your turd never gets out the door, that's a people problem, not a problem with the method of development.

      Yes, software is about money in business; however management needs to begin to understand how to quantify it better. Taking 20% longer but have almost no fixes or down time after release isn't easily quantifiable, as such in is seldom considered.

      A good accountant will find away to make it quantifiable, and good management will look at the overall projects vs project done via other development methods.

      I just wrote an application, almost all of the function were just reuse of previous projects I ahve done. How does an account quantify the value of reuse?

      If you write database classes more then once, you are doing something wrong.

      --
      The Kruger Dunning explains most post on /. http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
    5. Re:True that by plalonde2 · · Score: 3, Interesting
      I'd avoid the false dichotomy.

      Only unit test what needs to be unit tested. If it needs to be tested the testing will pay for itself. If it's simple enough that it doesn't need testing, then you're wasting your time writing those tests.

      Half the benefit of the unit tests/test-first methodology is that they force you to design even your internal interfaces in a reliable way. The other half is knowing you didn't introduce regressions in that oh-so-clever code.

      For most projects you don't need a whole lot of tests but there will be a couple of subsystems that you almost can't manage without them.

    6. Re:True that by oldspewey · · Score: 5, Insightful

      Nobody cares if it's ugly and stiched together

      ... except the guy who has to go into it six months down the road because a new requirement came up or a new system must be integrated

      --
      If libertarians are so opposed to effective government, why don't they all move to Somalia?
    7. Re:True that by bcmm · · Score: 5, Insightful

      If somebody shipped a browser as crash-prone as Netscape was today, it wouldn't matter if it was three years ahead of the competition. People would play with it for a bit, and then use something stable. It's possible that the type of programming he's talking about works only in the specific situation that there isn't reasonable competition, yet.

      --
      # cat /dev/mem | strings | grep -i llama
      Damn, my RAM is full of llamas.
    8. Re:True that by moranar · · Score: 1

      You could also hire better new developers. Or at least, ones that have design patterns experience.

      --
      "I think it would be a good idea!"
      Gandhi, about Internet Security
    9. Re:True that by mcgrew · · Score: 3, Interesting

      Software is about money guys.

      Which is exactly what is wrong with software. Software should be about creating a useful tool. When you have a blacksmith who cares more about money than his craft, you have a poor blacksmith indeed. When you have a musician who cares more about money than music, he produces crap.

      No wonder Linux is less insecure than Windows. Linux programmers are about making tools, Windows programmers are about making money.

    10. Re:True that by gestalt_n_pepper · · Score: 1

      Prove it.

      --
      Please do not read this sig. Thank you.
    11. Re:True that by h4rm0ny · · Score: 5, Insightful


      I'm probably a "duct-tape programmer" in some ways. How did I become one? By learning everything I could about being an "architecture astronaut" first.

      You learn how to do things properly and then you know when and when not to step back from that. If anyone RTFS and says to themselves they don't need to have a good solid understanding of the principles of software design or even a grounding in some of the popular modern methodologies. The linked article is full of colourful metaphors about go-karts and WD-40. Making your argument by metaphor is usually a bad sign - you use them for people who would have trouble understanding the subject if you just stated the case plainly. I hope that's none of us. The article writer seems to see some great division between those who "wield their WD-40 and duct tape elegantly even as their go-kart careens down the hill at a mile a minute" and those who "are still at the starting line arguing over whether to use titanium or some kind of space-age composite material". Well the division between those two groups isn't normally one between two sets of people, but between two environments and resource levels. In an ideal situation, I'll create a rigorous specification and use that as the formal basis for my unit tests and do things by the book. Sometimes I find myself "careening down the hill" because I'm suddenly dumped a big, live system and told "make these vaguely described modifications by yesterday". And I'm the same individual. I'll tell you what I want to see if you're in that latter environment - I want to see someone who understands what corners they are cutting and when to do so and when they can't. Same goes for some of the project management methodologies. You don't have to do things by the letter of the law of Agile development or whatever, but if everyone in the group understands the principles, it can streamline things.

      Being better than the rest at anything doesn't come easy. This stupid article has some metaphorical "duct-tape programmer" who doesn't need to bother with the "achitecture astronaut" stuff because they're a whiz with their "WD-40". Enough with the metaphor. Show me the real instances of people who are better than others because they don't know about the theory.

      Some articles are stupid. This is one. It's a load of overblown metaphor and hypotheticals. Ironically enough, it falls into the trap of dealing only in hypothetical and idealised situations that it lambasts some programmers for. Sure - if you're up against a tight deadline and in the midst of a melee of programmers, don't waste two weeks drawing UML diagrams and Gantt charts. But that sort of judgement has nothing to do with not knowing the principles of software design or project management. Banging out a quick website might be a case of shifting images left and right from day to day based on customer feedback. But real programming is most definitely not a "downhill go-kart race". It's about producing maintainable, reliable code that meets the customers' needs. And if you see someone who looks like they're gluing brilliant code together on the fly with "duct tape", you'll probably find they're someone with a lot of experience and who understands the theory well enough that you don't notice them using it. As Ovid said: "Thus by art, is art concealed." In other words - they make it look easy, because they're good.

      --

      Aide-toi, le Ciel t'aidera - Jeanne D'Arc.
    12. Re:True that by Jurily · · Score: 1

      People would play with it for a bit, and then use something stable.

      Exactly. Then you come out with the stable version, and win. Early releases aren't products, they're marketing.

    13. Re:True that by tepples · · Score: 1

      You could also hire better new developers. Or at least, ones that have design patterns experience.

      If none of the local schools do a good job of teaching patterns, that could get very expensive very fast.

    14. Re:True that by ChienAndalu · · Score: 5, Insightful

      Software is about money guys.

      Which is exactly what is wrong with software. Software should be about creating a useful tool.

      For some people writing software is also about paying the rent and buying food.

    15. Re:True that by NewbieProgrammerMan · · Score: 4, Insightful

      You'd be surprised how many money generating services run on top of really sloppy code that you wouldn't want anybody else to see. ... Nobody cares if it's ugly and stiched together.

      I think this is true of many things in life outside the realm of software development: most people would be horrified if they knew the real story about how most things are made, and how thin the veneer of "quality" is sometimes. Over the years I've just come to accept that the universe is fairly forgiving of mediocrity.

      I don't think this is a valid reason to intentionally do shitty work, but it's probably good to remember that if you make a good faith effort at building something in a non-sloppy manner, it's going to fare pretty well most of the time.

      --
      [b.belong('us') for b in bases if b.owner() == 'you']
    16. Re:True that by moranar · · Score: 1

      You could also incorporate 'experience working with design patterns' into the interview process. Just a thought.

      --
      "I think it would be a good idea!"
      Gandhi, about Internet Security
    17. Re:True that by NewbieProgrammerMan · · Score: 5, Insightful

      I'd say at least write tests while you're closing bugs. Having an easily detectable bug pop up again two or three releases after you "fixed" it seems to indicate (even to non-developers) that you don't know what you're doing.

      --
      [b.belong('us') for b in bases if b.owner() == 'you']
    18. Re:True that by moranar · · Score: 1

      Because hiring _good_ developers is otherwise inexpensive, right?

      --
      "I think it would be a good idea!"
      Gandhi, about Internet Security
    19. Re:True that by cmiller173 · · Score: 4, Insightful

      "Those who love sausage and obey the law should not watch either being made." -- Otto von Bismarck

    20. Re:True that by Tablizer · · Score: 1

      Agile, scrum, patterns, unit tests, etc.
      Interesting ideas, but can anybody show me *any* significant, quantitative, comparative proof of improved ROI?

      "Software Engineering" sorely lacks scientific tools and techniques to propel it into a "real" discipline. There's too many variables to isolate in a lab-like setting. Instead of being like chemistry and physics, it's more like psychology, economics, journalism, and history.

      It will either take tons of money and/or new thinking to fix this situation. Until then, the void is often filled by snake-oil salesmen and exaggerating zealots. Most fads will only change productivity and reliability by about 10% at best, and often do nothing or make it worse.

      In my opinion, the best improvements come from decent standards (real or de-facto) that allow one to not have to reinvent or relearn the wheel for each new shop one works at. Everywhere you go, there's still SQL, HTML, HTTP, etc. If each shop invented their own from scratch, things would take longer to get done and some would do it really badly. This is partly why MS is popular as a de-facto standard despite having mediocre products.
                   

    21. Re:True that by pla · · Score: 4, Insightful

      If somebody shipped a browser as crash-prone as Netscape was today, it wouldn't matter if it was three years ahead of the competition. People would play with it for a bit, and then use something stable.

      Um, no, you just disproved your own point.

      Netscape did deliver a browser years ahead of the competition... And in all its crash-prone, flawed glory, people loved it. It took the web from a geeky novelty to a mainstream phenomenon. Not until MSIE 5 came out, a full five years after the first version of Netscape Navigator, did Netscape finally fall below 50% usage.

      So the moral here? Beating your competition matters more than elegance - But having a viable business plan matters even more. ;)

    22. Re:True that by russotto · · Score: 1

      Design patterns are just a formalization of what was going on anyway. Unit tests... well, if you can get your software to work consistently without unit testing, more power to you. I'm not that good. As for the various faddish software development methodologies, I'm with you there... just write the damned software.

    23. Re:True that by MikeBabcock · · Score: 2, Interesting

      According to TFA your reputation doesn't matter, just your ability to ship now now now.

      In other words, how to be Electronic Arts. No thanks.

      --
      - Michael T. Babcock (Yes, I blog)
    24. Re:True that by EastCoastSurfer · · Score: 5, Insightful

      Actually you've touched on the running theme in all of Joel's articles. Good developers are good developers. A good developer can get away with being a duct tape programmer, because they are good. Chances are that good developer could use almost any methodology and/or tool and ship working software. While it's interesting to look at the tools and methodologies good developers use, I would rather see ways to make mediocre developers better.

    25. Re:True that by h4rm0ny · · Score: 2, Insightful

      Exactly. Then you come out with the stable version, and win. Early releases aren't products, they're marketing.

      I have a one-word rebuttal to that: Vista.

      --

      Aide-toi, le Ciel t'aidera - Jeanne D'Arc.
    26. Re:True that by TheCowSaysMooNotBoo · · Score: 1

      Amen to that. I'm in that situation for two years now, and seriously considering raping my predecessor's face with a chainsaw.

      In my experience, duct tape programmers come in two kinds: a project lead who thinks along the lines of "Oh, I was in my previous life a dba, I can do everything myself and they just have to work with what I give them without complaining because I get payed more" and the "oh hi, I am an ex-marketing guy and I know some vba so I obviously know how to program in .net"

    27. Re:True that by EastCoastSurfer · · Score: 3, Interesting

      Exactly. All of Joel's articles about about good to expert developers. More than likely the people he describes could use any tool or methodology and ship correct, working software.

      This reminds me of when people try to copy a particular athletes workout or diet. Most professional athletes are genetic wonders and many succeed at their sport not because of their workout and diet, but in spite of it.

    28. Re:True that by corbettw · · Score: 2, Insightful

      Which is exactly what is wrong with software. Software should be about creating a useful tool.

      A truly useful tool either makes or saves money. If you build a hammer that has perfect balance and pounds in a nail with one hit every time, someone will pay you money to have one like it.

      No wonder Linux is less insecure than Windows. Linux programmers are about making tools, Windows programmers are about making money.

      More like: no wonder Windows is more popular than Windows. Linux programmers are about making cool hacks they like, Windows programmers are about making tools people actually use, and thereby make money for their efforts.

      --
      God invented whiskey so the Irish would not rule the world.
    29. Re:True that by adisakp · · Score: 3, Insightful

      In fact one million line project went out and only had 2 bugs. Not a single one had a complaints about missing features or bloat.

      Anecdotal, yes; however I ahve been programming for a long time and I was amazed at how well it worked out. Freaking amazed.

      I'm amazed you can ship a million lines with only two bugs (found that is) when you misspell "have" as "ahve" three times in a single post. There are plenty of spelling "bugs" in your post and when I get through them, you have enough grammar "bugs" that it's hard to understand half of what you're trying to say -- that fact that it's logically inconsistent doesn't help as well. Please tell me you are not a native English-speaker and that all this craziness is just "lost in translation".

      I just wrote an application, almost all of the function were just reuse of previous projects I ahve done. How does an account quantify the value of reuse?

      Reuse of code does not mean it's bug free -- sure you've had some testing on the previous code but using it in new and different ways is bound to expose bugs in any non-trivial piece of code.

    30. Re:True that by Coren22 · · Score: 1

      Were the bugs due to your poor typing skills? I didn't get past the second sentence because there were so many typing errors...

      --
      APK likes to ask for responses to the same things over and over. Maybe he just likes the responses?
    31. Re:True that by PouletFou · · Score: 1

      More like: no wonder Windows is more popular than Windows.

      Is windows really more popular than windows? I always thought that windows was clearly left behind by windows not the opposite. Gee, the it world is so confusing, but as they say : windows is to windows what windows is to windows.

    32. Re:True that by msuzio · · Score: 1

      Do fewer unit tests. Stick to the absolute minimum, well-known, easy to test scenarios. Write a bunch of comments noting all the stuff I'm not testing, and why I didn't have time to test it (something like "cannot test this functionality, the logic is too deeply embedded in private code"). I'd at least do something so I have a tiny bit of reassurances that I didn't miss obvious stuff (asserts inside the code can do this too, if you don't want to write dedicated, separate tests) and so I have a basic structure to add better tests in later.

      At this point, I wouldn't ever skip some sort of testing in my code. I've just seen too many things caught early enough in the release cycle for me not to believe it's a reasonable investment. I'm leery of getting overly navel-gazing and searching for some perfect testing Nirvana where no production bugs ever occur, but double-checking yourself and making some effort to test early just makes sense in terms of risk reduction.

    33. Re:True that by nlawalker · · Score: 1

      If a browser as crash-prone as Netscape shipped today, it *wouldn't* be three years ahead of the competition.

    34. Re:True that by dintech · · Score: 2, Funny

      when you misspell "have" as "ahve" three times

      Maybe he's French...

    35. Re:True that by msuzio · · Score: 1

      Well, yes. No doubt that JWZ is a wizard programmer. I mean, the guy earned his bones writing LISP, he knows the theory and the basis for what he is doing. He also knows when to throw elegance out the window and just get the job done as best you can in pressing circumstances. The ability to choose the right course and not get bogged down at either end between cruft and elegance is what makes for a good "duct tape" programmer. You can only throw out the bits you already understand well; otherwise you are operating out of ignorance.

    36. Re:True that by Anonymous Coward · · Score: 0

      Rebuttal: 7

    37. Re:True that by Anonymous Coward · · Score: 0

      Unit tests have been with us since the early days of systems development (hard+soft). The practices have taken us to the Moon, among the other things. Proving the benefits of a piece of engineering culture or proving the contrapositive is a job best left for an anthropologist, a practical philosopher or a mathematician. Too bad that those kinds of people are not normally interested such proofs concerning an unfamiliar and "geeky" fields, even if the money would be there.
      So lets start doing it ourselves. Derive from the risk analysis of the system the risk of partial failing and the risk of the consequences of the partial failing of the system. Define the risk of partial failing of the system as the risk of failing of the subsystem. Compare the difference between the cost of building necessary devices and software to test the subsystem to the cost of an insurance covering the ultimate consequences of the failed subsystem (including the costs of get-out-of-prison cards and failed companies) or to the cost of debugging unit level faults from the integrated system at the customer premises or at the student condo (no party of you!), which ever cost is the greatest.
      Admittedly the pseudo-proof here rests on the work and the prices of an insurance company (mathematicians), lawyers, significant and not so significant friends and beer, so it might not be a convincing argument for some.

    38. Re:True that by somersault · · Score: 1

      Vista isn't anywhere near being "three years ahead of the competition" though so it doesn't really fall into the topic they're discussing.

      --
      which is totally what she said
    39. Re:True that by tshak · · Score: 1

      Here are some Test Driven Development studies.

      Anecdotally, my 13 year career is split almost exactly 50/50 TDD/!TDD. While I kicked and screamed initially, I'm confident that TDD has had the most positive impact on my effectiveness as a software developer.

      --

      There is no longer anything that can be done with computers that is nontrivial and clearly legal. -- Paul Phillips
    40. Re:True that by Anonymous Coward · · Score: 0

      Indeed, people don't care if it fails sometimes, as long as you provide them the toy ! Then you produce Toy 2.0 and you're even bigger in their mind because you were the first and then you have an improved version of the first.
      Others that come after, even if they don't have 20% of your flaws, as second and have to prove their protential BY BEING BOUGHT AND USED.

    41. Re:True that by somersault · · Score: 1

      I understood him fine. TBH I stopped paying attention to the spelling errors too - you simply have to these days if you want to read any form of communication without the urge to stab yourself (or others) in the eyeballs.

      First of all, he didn't claim he was using bug-free code, but nevertheless: if you're reusing already pretty-much-proven code in a wide variety of applications, you're much more likely to find and squash any remaining bugs that are in it. Then you can patch up the previous projects too, seems like a highly beneficial practice to me.

      --
      which is totally what she said
    42. Re:True that by HangingChad · · Score: 1

      Interesting ideas, but can anybody show me *any* significant, quantitative, comparative proof of improved ROI?

      I can't. I watched a very large organization replace a duct tape model that worked with a service based architecture that never delivered a single working service in 3 years of massively increased spending.

      Use the duct tape apps to prove user acceptance and usability. Then take the apps that work and rebuild them on a more solid code foundation. If all your apps are using a common database back end, they'll all be able to talk to one another. Where companies really dork themselves is when half their user apps are using Access as a back end, some using SQL Server, a couple OSS mods using MySQL and then a dozen different hosted apps like SalesForce.

      In my experience it's better to have a bunch of duct tape apps that provide an 80% solutions while more long term development is going on than having your data scattered around in hosted applications outside the company.

      --
      That's our life, the big wheel of shit. - The Fat Man, Blue Tango Salvage
    43. Re:True that by idontgno · · Score: 1

      I have a four-word rebuttal to that: Microsoft is marketing only.

      --
      Welcome to the Panopticon. Used to be a prison, now it's your home.
    44. Re:True that by AVryhof · · Score: 1

      It's not a bug. It's a feature.

    45. Re:True that by thePowerOfGrayskull · · Score: 4, Informative
      How do you determine what "needs" unit testing?

      Unit tests are only as good as the programmers who make them. And if the programmer can think of a unit test... chances are that his code has already accounted for it; after all it's the same person, and he will be in the same mindset as he was when writing the code in the first place.

    46. Re:True that by fermion · · Score: 1
      It is about money. Which is why some of these make good sense.

      Patterns allow one to write in a standard form, which can save time and increase the ability to debug. If you don't think patterns make money, just look at The Simpsons. The downside is that patterns can result in some complex code that some may feel is not justified, at least in the short term. This is where experienced coders can help, but they cost money.

      Unit testing is another judgement call. I have built very few unit tests, usually only for critical low level routines that have few other dependencies. Mostly what I find useful is code that detect and diagnose issues while the function is part of the larger applications. I can't tell you the number of weird bugs that are detected just by writing data to a file. I leave the code in but commented out. It is the same secondary benefits of unit tests. It documents expected behavior.

      Agile programming is a matter of personality and style. forcing it onto people is just as bad as the more traditional cubicle model. Many of these ideas are good, but pushed by people who are trying to maximize the use to maximize profit. Just like SUVs were.

      I think back to the advent of the IDE. In most ways it is a wonderful idea, and has increased efficiency. I am sure a number of people, though, think it made programmers dumb and cost more than it is worth.

      --
      "She's a scientist and a lesbian. She's not going to let it slide." Orphan Black
    47. Re:True that by bertoelcon · · Score: 2, Interesting

      For some people writing software is also about paying the rent and buying food.

      Do a job good enough that people want to pay you and you will be payed, but do shitty work and nobody will want to see you again. My dad always told me that about his construction but it applies here too.

      --
      Anything can be found funny, from a certain point of view.
    48. Re:True that by johanatan · · Score: 1

      Bless you, son.

    49. Re:True that by Anonymous Coward · · Score: 0

      Vista was marketing for Windows 7. Release something REALLY bad so they'll be happy when the next is only mildly bad.

    50. Re:True that by lwsimon · · Score: 2, Insightful

      Money provides the motivation to do good work. A blacksmith who cares so much about his work he redoes everything 6 or 7 times until it is perfect is a blacksmith who will soon be begging for food.

      A programmer who produces shitty code for money was never capable of producing quality code.

      --
      Learn about Photography Basics.
    51. Re:True that by ChienAndalu · · Score: 1

      The problem is that the people who can pay you often have a different definition of "good" than most programmers.

    52. Re:True that by Anonymous Coward · · Score: 0

      Software is about money guys.

      Which is exactly what is wrong with software. Software should be about creating a useful tool.

      For some people writing software is also about paying the rent and buying food.

      Yeah, but there are lots of things you can sell to pay the rent and buy food.

      The key question in commercial software is whether you're creating something useful that people will buy. The most beautifully-crafted app in the world won't pay your rent if your customer base is 10 people (unless you're writing an enterprise app for a handful of customers willing to pay big bucks - you can either sell lots of low-priced things, or a few high-priced things. If you're selling a handful of low-priced things, you'd better find a new trade)

    53. Re:True that by h4rm0ny · · Score: 1

      Except that he's not writing about "good to expert developers". His examples are people who don't even understand what they're rejecting. From TFA:

      You see, everybody else is too afraid of looking stupid because they just cant keep enough facts in their head at once to make multiple inheritance, or templates, or COM, or multithreading, or any of that stuff work. So they sheepishly go along with whatever faddish programming craziness has come down from the architecture astronauts who speak at conferences and write books and articles and are so much smarter than us that they dont realize that the stuff that theyre promoting is too hard for us.

      Sorry, but multithreading is not "faddish". And COM is just an antiquated example that makes him sound like it's a very long time since he did any programming if he's using it as an example of what 'trendy' people are doing. His argument is that this theory stuff is - and I directly quote from the above - "too hard for us". The whole article just sounds like he's got a massive chip on his shoulder. It's a massive rant about some hypothetical programmers that produce wonderful code without getting bogged down "design patterns" and such. It's weird to be the one defending this, because a lot of the time, I fall into what he would call a "duct tape programmer". I get thrown into work with too little time to do things by the book and yes - I do bang out code without formal specifications or unit tests because someone comes into my office and says "actually we want it to do X right now". BUT that's because I have to. And though I'm usually the first to rant about hype in the world of programming, I can't feel anything but disgust for the wrong thinking in this article. I've seen a number of methodologies and technologies go through their over-hyped bubbles. When I started programming it was all Yourden and SSADM (kids - Google it). I watched UML appear and get frantically added to everyone's CVs, I saw XML appear with all its over-fat text books straining the bookshop shelves (people still just about needed text-books back then). More recently I've had people charging around shouting Agile and Scrum. And I decried the hype at each stage, but I didn't and I don't think these are all stupid things and I certainly don't write web-articles proudly boasting about my ignorance of them and exalting programmers who don't understand them.

      Let's take Design Patterns which he mocks people for "all being at conferences on". Well firstly, I dislike argument through mockery. I don't know anyone who has gone to a conference on design patterns - that tends to be the area of academics. But I do know people (and I am one) who have taken the time to read up on the subject. Like many things, it's not something radically new, just a slightly more dressed up and formalized consolidation of a lot of existing knowledge. So it may not deserve a great deal of hype but people (particularly less-experienced programmers) can and have benefited from reading up on it.

      "Duct Tape Programmer" sounds like a derogatory term to me. If you find yourself improvising functionality on the fly, that should be because you need to, not because you have an aversion to planning. If you choose not to use multithreading, that should be because it's not applicable to your work, not because you think (and again I directly quote) "that stuff is too hard for us". I tell you, when I watch one of my four cores maxed out by a MySQL for several minutes whilst the other three do nothing, I don't sit there thinking, "Wow! I'm glad they had some Duct Tape Programmers working on this who were real programmers, not those pussy faddish types with their parallel programming theories".

      The whole article is nothing but laughing and mockery of some caricature of "architecture astronauts". It's the laughter of the kid in the bottom maths set deriding those getting A's for being good at it. The caricature is doubly stupid seeing as astronauts are actually very skilled people

      --

      Aide-toi, le Ciel t'aidera - Jeanne D'Arc.
    54. Re:True that by jc42 · · Score: 1

      Nobody cares if it's ugly and stiched together

      ... except the guy who has to go into it six months down the road because a new requirement came up or a new system must be integrated

      Well, yeah, but that guy typically has very similar problems with a carefully-architected system. The problem in that case is that the architected system was carefully designed to implement a specific structure, which matched the original requirements. But the new requirements don't match that structure, so the new guy has a choice: Implement a series of ugly kludges to bend the structure to what's now needed, or design a new structure and re-implement the whole thing from scratch.

      I've seen any number of tasks that amounted to adding a new feature to a structure that was fundamentally designed to not allow that feature. Not intentionally, of course; the original designers just weren't thinking about the new requirement. Modifying the basic structure can easily destroy the old code, introducing subtle bugs nearly everywhere in the code.

      OTOH, if the structure is a lot of separate, independently-designed pieces, with the software equivalent of duct tape (or steel I-beams) holding them together, it's often straightforward to build yet another well-designed module for the new requirement, and graft it into the existing structure in such a way that the old code isn't bothered by presence of the new module.

      --
      Those who do study history are doomed to stand helplessly by while everyone else repeats it.
    55. Re:True that by CrashandDie · · Score: 1

      James is that you?

    56. Re:True that by Anonymous Coward · · Score: 0

      When you have a musician who cares more about money than music, he produces crap.

      No, when you have a musician who cares more about money than music, he produces rap. But I guess that is no different from what you said.

    57. Re:True that by DaveAtFraud · · Score: 1

      After being a QA manager for several years, I can promise you that EVERYTHING needs to be unit tested. I got way too many piles of crap from the development group that were dead on arrival because the developer(s) didn't think some change warranted bothering with a unit test. Even worse, the problems were usually trivial errors that even the most minimal level of unit testing would have exposed.

      My thought is that the same programmer hubris that leads a developer to believe something "isn't even worth testing" leads them to not pay enough attention to what they're doing and then make stupid mistakes. Sadly, this doesn't seem to be restricted to junior level programmers who haven't gotten burned before and remembered the lesson. I've seen some fairly senior level people (usually the ones with the worst cases of hubris) continue to do this in spite of all evidence to the contrary.

      Cheers,
      Dave

      --
      They that can give up essential liberty to obtain a little temporary safety deserve neither safety nor liberty.
      Ben
    58. Re:True that by HandleMyBidness · · Score: 2, Interesting

      Does that mean if I like kids I shouldn't watch pron?

    59. Re:True that by Chris+Burke · · Score: 5, Insightful

      Unit tests are only as good as the programmers who make them. And if the programmer can think of a unit test... chances are that his code has already accounted for it; after all it's the same person, and he will be in the same mindset as he was when writing the code in the first place.

      Uh-huh, and then a year later, he needs to add some new and complicated functionality, but needs the old functionality to work too. He thinks he's preserving the old logic, but it has been a while and he is not in the same mindset anymore, and prior to committing the change to the repository, he runs the unit tests and -- woops! -- it fails. He goes and fixes it, now both the new and old functionality tests pass, and he checks in working code.

      And by "he" I mean "me".

      Unit tests do wonders for myself and my group. We develop a large and constantly evolving code base. And we have a saying/rule-of-thumb: There are features that are automatically tested in our check-in procedure, and there are features that are broken. How do you determine what needs testing? Well what do you want to still work a year from now? There's your answer.

      It's not appropriate for every situation, but it works for us.

      --

      The enemies of Democracy are
    60. Re:True that by FishOuttaWater · · Score: 1

      Wow. Yes. The best thing I can suggest is to expose them to good developers, good code, and bad code.

    61. Re:True that by cr_nucleus · · Score: 1

      Man, i wish i could mod you up !

    62. Re:True that by osu-neko · · Score: 1

      Only unit test what needs to be unit tested. If it needs to be tested the testing will pay for itself. If it's simple enough that it doesn't need testing, then you're wasting your time writing those tests.

      ...and writing the code to begin with. There is no such thing as code that was worth writing but is not worth testing.

      if ( a >= 90 && a < 10 ) printf("You're right.");

      --
      "Convictions are more dangerous enemies of truth than lies."
    63. Re:True that by Zarf · · Score: 1

      The ROI for this would look like:
        M = cost of maintenance coder (M-coder) 1 hour
        H = number of hours average M-coder spends grokking amazing Duct Tape guys answer
        T = number of hours testing fix by M-coder to verify it works "right"
        R = cost of tester per hour
        S = average number of cycles spent between M and R
        D = cost of duct tape coder per hour (D-coder)
        h = number of average hours spent by D-coder on initial feature

        C = cost of feature
        O = maintenance cost of feature
        T = total cost of feature

      C = hD
      O = S(HM + TR)

      T = hD + S(HM + TR) ..
      Our optimization efforts would be scalars on h, H, and T expressed as rh, rH, and rT. So from this ROI can be summarized as:

      ROI = T - ( rhD + S(rHM + rTR) )

      Assuming no reductions can be made on the costs of D, M and R and that S cannot be effectively limited to reduce costs without incurring penalty to T. Solve for each 'r' independently. Most invariant cost appears it can be controlled on hD but in reality hD is inversely proportionate to the cost of HM.

      --
      [signature]
    64. Re:True that by oldspewey · · Score: 1

      a carefully-architected system ... designed to implement a specific structure ... new requirements don't match that structure

      I'd argue this solution was either poorly architected, or poorly scoped and managed. Building system requirements without looking at the nearby landscape (which systems might eventually participate in the workflow? any relevant business plans coming down the pipeline?) is generally what leads to these kinds of isolated systems that everybody hates but nobody can get rid of.

      --
      If libertarians are so opposed to effective government, why don't they all move to Somalia?
    65. Re:True that by Rue+C+Koegel · · Score: 1

      money is nothing more than an imagined value and what we call some pieces of paper and coin, people are convinced they can gain from these things what they instead condemn to mere daydreams by continuing to sustain and inflate their misconceived value: freedom can not be bought.

      what does this say about software, if software is about money? i disagree. i think software is about innovation, however due to the faulty convention of our times money is required to support our innovation.

      after all, how can something that requires so much thought and energy be 'about nothing?'

      --
      DON'T CAPITALIZE! CO-OPERATE! AND FREE EVERYTHING!
    66. Re:True that by binary+paladin · · Score: 1

      As someone with no formal education in coding, is there some definitive guide on unit testing?

      Particularly for the Python/Ruby camp? I'm working on a project right now that, while documented, I know is going to need some tests on a few things once it's deployed. It'd just be nice.

    67. Re:True that by poopdeville · · Score: 1

      Nice, structured and clean code is appreciated, but this is the real world we're talking about where deadlines are everything. Getting it up and running is the goal. Nobody cares if it's ugly and stiched together.

      You would be surprised. Bad code means big problems if there is a service failure. It is more difficult to debug bad code. And in a world where deadlines are important, it is nice to be able to write clean code for a few hours and go home early, because of all the time you've saved by not writing shitty code.

      --
      After all, I am strangely colored.
    68. Re:True that by Hurricane78 · · Score: 1

      That's because unit tests are the only piece in that box of shit candy, that is actually making sense. Ok, patterns can be used with caution, if you don't just slap them on every problem like a cookie cutter, and never feel any urge to stay close to the pattern for no reason. But the rest? Try it in my team, (don't stop doing it,) and you're fired.

      --
      Any sufficiently advanced intelligence is indistinguishable from stupidity.
    69. Re:True that by Zarf · · Score: 1

      This is to say that if a unit test can reduce the cost of test resources TR and the cost of HM is lower based on the fact the code uses "known patterns" that requires less H (developer time to comprehend) then the value inside each "iteration" S(rHM + rTR) becomes smaller allowing for higher through put of features which should ostensibly increase the value of the software. Cost of rhD (hourly rate of initial developer) is inversely proportional to the cost incurred by HM during maintenance phase. The result is that cheaping out early on your initial developer yields a ball of shit that your HM guy hates and grumbles over causing his rHM value to climb costing more per feature. Eventually you will COMPLETELY fucking eclipse the cost saving found in using a cheap ass developer who doesn't know what a design pattern is or why they suck when they do suck and why they rock when the do rock (for design patterns simultaneously rock and suck depending on context... for example MVC ala Ruby on Rails totally rocks but sucks for messaging applications like Twitter).

      Thusly most business managers usually create negative ROI by hiring cheap ass developers who screw over the HM and TR guys later who you manager types hire to keep the shit the hD guy created running because now your company is worth 25 majillion dollars and you can't have that application going down three times a day anymore. Later they continue to sky rocket the multiplier S buy calling bullshit on development practices intended to maximize the ROI of the system and okaying stupid ass development methods that waste developer time keeping them from actually adding to the value of the total system by reducing the total cost expressed in T.

      In summary:
        Managers don't understand code, they understand results, they understand quick results and they do not understand why eating a salad is preferable to eating a cheeseburger because the cheese burger is fried and gets to the table *now* and this design/salad bull crap takes too long. Then the managers get pissed at the developers because the cheeseburger/crappy code made them fat.

      --
      [signature]
    70. Re:True that by Darinbob · · Score: 4, Insightful

      A good "duct tape" program would allow you to peel off the tape shift the part slightly, then tape it back up. Duct tape code can be maintainable, depending upon how much tape is used. As opposed to spaghetti code which involves painfully disentangling everything, or just hoping that you're cutting the right wire.

      One of the important things I learned awhile after leaving school, was that no one really cared how elegant or perfect my programming was, they really just wanted the work to get done. Missing the deadline just to make things look better didn't help anyone. Of course it was nice to get code that was easily maintainable later on, but it shouldn't be your primary goal. I've seen some overengineered architectures that looked like someone was trying to make things easy to maintain, but the result was a nightmare to modify because no one understood all the layers and abstraction, and a "simple" porting job where the team took so much time creating the perfect portability layer that the product never finished.

    71. Re:True that by mcgrew · · Score: 4, Interesting

      Indeed. I have a friend who works in construction. His boss is a stickler for quality and tries to keep costs down as well. As a result, he has more business than he can handle while his competetitors are cutting corners, charging high prices, and going out of business right and left.

    72. Re:True that by poopdeville · · Score: 1

      If there's anything like a formal specification for the program, it's a good idea to write tests to ensure the program meets it. Writing more tests than that is pretty pointless, and is presumptuous of the programmer. At worst, the tests will have to be removed, when a feature incompatible with the programmer's assumptions is requested.

      If you're working on a personal or open source project, this is a good way of thinking about test writing. Write up a spec for your program or module, and tests to make sure it satisfies it. It's not hard.

      --
      After all, I am strangely colored.
    73. Re:True that by Darinbob · · Score: 3, Insightful

      And in software "good work" often means "shipping on time". If you have have perfect code that ships on time, that's great. If it's late though, it causes a ripple of problems down the line; your feature gets dropped from the release, customers stop waiting for that feature and buy from competitors, revenue comes up short, business units get canceled, and people get laid off, no one really cares that it would have been great code or that it was almost done.

    74. Re:True that by Hurricane78 · · Score: 1

      That does not necessarily mean what you are implying.

      If I write the test, I always have a clear interface definition of the module's interface I'm testing. And I'm specifically writing the test in a way, that it fills all possibilities in the range of possible input for that interface. Even if they make no sense at all. As long as the data type supports it, oh yeah, you can expect me to fire it at your code!
      Ofter I write some kind of fuzzer, with some fixed input data for special cases (like all extremes of a data type / structure), and a good load of fuzzing in-between.

      So on the long run, any bug, even when using the interface in a nonstandard way, is pretty quickly found. Usually I often already find bugs in the definition- or implementation-dependent range of allowed interface input data while I'm writing the test. Now that I think of it... I actually do switch my mindset... to a cracker mode. Trying to break the interface and bring it down to its knees.
      In a multithreaded environment, I also fuzz the timings, and intentionally try if I can do them in the wrong way.

      A proper interface should make all this bad implementations impossible, or at least go into a defined state.

      P.S.: The best way to find holes in an interface, is to look for "undefined state" in the specification. In big things, there are tons of those.

      --
      Any sufficiently advanced intelligence is indistinguishable from stupidity.
    75. Re:True that by kigrwik · · Score: 1

      I remember being *glad* to switch away from NS4 *to* IE5 ! And telling everybody about it...

      Oh the irony...

      --
      -- don't discount flying pigs until you have good air defense
    76. Re:True that by Anonymous Coward · · Score: 0

      Money is a system. Software is a system. While different in scope and organization, both are largely imaginary.

      Money too is about innovation, or it can be, sometimes with disastrous results, just like software.

      Freedom is also imaginary. You are constrained in thousands of different ways by your body, your culture, your thoughts. Freedom can never be obtained in our lifetimes by the likes of us.

    77. Re:True that by adisakp · · Score: 1
      You though his post was not only intelligible but also highly beneficial ??? I actually thought it was a troll when I read these lines.

      The problem s not that they don't work, the problem is most places don't actually implement them correctly, or have on partial buy in.

      If your turd never gets out the door, that's a people problem, not a problem with the method of development.

    78. Re:True that by J.+J.+Ramsey · · Score: 1

      "Then you come out with the stable version, and win."

      If you can. If the program is unstable because of lots of little niggling bugs that are hard to find because the code is a bunch of spaghetti, then coming out with a stable version may be a tall order.

    79. Re:True that by Migala77 · · Score: 1

      I'm amazed you can ship a million lines with only two bugs (found that is) when you misspell "have" as "ahve" three times in a single post.

      So you can imagine how many bugs have been caught by his unit tests before shipping.
      No unit tests for Slashdot posts though...

    80. Re:True that by Anonymous Coward · · Score: 0

      He's obviously NOT a native English speaker, and you're being a jerk. More to the point, your petty little critique is rebutted by his +5, interesting rating. Jealous much, native?

    81. Re:True that by KZigurs · · Score: 1

      But that's the whole point. You cannot do things 'on the fly' if you don't understand why, how, and the risks associated. 'Duct-tape' guys are not just trowing stuff together. They are throwing stuff together that will get the job done without involving three weeks of design meetings, reviews and delegation to an off-shore team for implementation. They just Get The Job Done. And yes, it is an art.
      (nowhere in the article it was said that anyone can be one, au contraire, it was rather implied that only good ones can affort to try to be ones).

    82. Re:True that by Anonymous Coward · · Score: 0

      That guy loves it. Spaghetti Joe is literally putting food on his table.

    83. Re:True that by Anonymous Coward · · Score: 0

      He is freaking dyslexic cant you tell (eperson, ahve). All vowel character shift 1 to the left. Wow, nice job picking on the disabled. While I agree that it may be a stretch that their are only 2 bugs in millions of lines of code that are just being released. A dyslexics inability to sequence characters into the correct pattern have nothing to do with his ability to (or not to) write quality software. To him ahve is have and it will always translate like that. If he write a variable of ahve it is immaterial. Written communication is difficult for most dyslexics and nearly impossible for the most extream. Hence the logical inconstancy but code and written communication are reasoned by complexity different portions of the brain.

      And yes I am dyslexic, and yes I have worked on it because I am an extremely intelligent person that works with other extremely intelligent people and as soon as I write something to someone, I get embarrassed because, I know no matter how hard I try, that I will fuck up something and some fucking grammar NAZI will fucking come along and fucking say that my argument is irrelevant because of some fucking grammar or spelling mistake. Something that has no fucking bearing on my creativity or my ability to reason two of the greatest indicators of above average intelligence. And so help me god if some god damned grammar nazi comes along and dings me on this post, I am going to fucking kill a cat or something.

    84. Re:True that by KZigurs · · Score: 1

      some of the greatest works of art in the history have been commisioned - for a price. Oh, wait, most of them. And if you have a blacksmith who cares not to be paid, you are looking at a blacksmith who will be on the street soon.

    85. Re:True that by drpentode · · Score: 1

      Misspelling words won't break your code as long as you misspell consistently. Once "orginal", always "orginal". :D

    86. Re:True that by Rich.Miller.6 · · Score: 1

      A good place to implement unit tests is in the stuff that you observe to break over time, especially if it breaks over and over again. This happened to me with a collection of interfaces to APIs that a BIG vendor changed periodically - totally outside our control. The automated unit tests saved us multiple times.

    87. Re:True that by adisakp · · Score: 2, Insightful

      Grammar isn't important in a slashdot post. It is important in code however. He was claiming to have written a million lines of code with only two bugs when he had a dozen spelling mistakes, two dozen grammar mistakes, and at least a half dozen formal errors in his logic.

      I wasn't picking on him because he was dyslexic, I was noting that given the quality of his post, I found his claim (of 99.9998% bug-free code) to be hard-to-believe.

    88. Re:True that by Rich.Miller.6 · · Score: 1

      I've been on multiple projects using Agile and Scrum that delivered on-time, on-budget with high quality, that would never have succeeded without these methodologies. And "design patterns" have been guiding successful programmers for about 60 years, give or take a few. Why would you think these *don't* work?

    89. Re:True that by Anonymous Coward · · Score: 0

      I'm amazed you can ship a million lines with only two bugs (found that is) when you misspell "have" as "ahve" three times in a single post. There are plenty of spelling "bugs" in your post and when I get through them, you have enough grammar "bugs" that it's hard to understand half of what you're trying to say ...

      You might have a point if he wrote his post using any of the techniques/patterns he was referring to. I doubt he was so let's lay off the ad homs huh? ;)

    90. Re:True that by PeanutButterBreath · · Score: 1

      When you have a blacksmith who cares more about money than his craft, you have a poor blacksmith indeed. When you have a musician who cares more about money than music, he produces crap.

      Well AFAIK blacksmithing is an all but dead profession and there are plenty of musicians who care more about money than their craft and do quite well (its practically axiomatic).

      Linux programmers are about making tools, Windows programmers are about making money.

      And Microsoft sells more software in several vital niches than FOSS can give away.

      Software should be about making tools, but the point of tools is to be used, not to be politically correct.

      Moreover, people make software for more than one reason. If it is your job, software most certainly should be about making money (which is attracted to good-as-in-useful software, at least in theory). If it is not your job, then it can be about whatever you want it to be.

    91. Re:True that by tngaijin · · Score: 2, Interesting

      Thank you for pointing this out. I love reading Spolsky and I think he has a lot of good ideas but he doesn't always express them very well. This second half of his closing paragraph is extremely important to put the article in context and I think should have been stressed at the very beginning in my opinion:

      Duct tape programmers have to have a lot of talent to pull off this shtick. They have to be good enough programmers to ship code, and weâ(TM)ll forgive them if they never write a unit test, or if they xor the âoenextâ and âoeprevâ pointers of their linked list into a single DWORD to save 32 bits, because theyâ(TM)re pretty enough, and smart enough, to pull it off.

      Specifically at the beginning of this article he names Jamie Zawinski as the programmer he is talking about. JWZ is a darn good programmer. There is a reason he has an entry for his name in wikipedia. Most of the people developers work with who exhibit these tendencies that Spolsky is describing in JWZ are not good developers and can't get away with it. It should be pointed out that exhibiting these traits will not necessarily make you a good developer. IMO The point Spolsky is trying to get across is that blindly adhering to a development strategy, tool, or architecture methodology will not make a person a good developer either. I too would rather see more articles about how to make the mediocre developers better.

    92. Re:True that by corbettw · · Score: 1

      Ugh. Me not proofread good. Hopefully the gist of my statement wasn't lost in my atrocious writing.

      --
      God invented whiskey so the Irish would not rule the world.
    93. Re:True that by trajik2600 · · Score: 1

      Does that mean if I like kids I shouldn't watch pron?

      *Filty amateur porn* Sexy porn stars don't have kids.

    94. Re:True that by NoData · · Score: 1

      Your comment and reply further in the thread are spot-on and brilliant. Thank you.

    95. Re:True that by adisakp · · Score: 1

      Misspellings won't necessarily break your code but they will make it much more difficult for others to maintain those million lines of code. And I'm pretty sure that bad grammar and logical inconsistencies (which are both prevalent in his comment) would not lead to bug-free code.

    96. Re:True that by Fulcrum+of+Evil · · Score: 0

      How do you determine what "needs" unit testing?

      By using good judgement.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
    97. Re:True that by plalonde2 · · Score: 1
      I also avoid categorical imperatives.

      There is testing that isn't unit testing. Knowing when it's sufficient is one of the things that separates good coders from highly productive coders.

    98. Re:True that by gestalt_n_pepper · · Score: 1

      I never said I think they don't work. What I do say is that they are unproven by any but anecdotal evidence.

      I have yet to see anything systematic or objective that says, "Yes, doing it *this* way results in an average of x% decrease in delivery time, and y% decrease in user-reported bugs one year after delivery.

      I too, like things organized in advance, effective design sessions, documentation, diagrams, timelines and weekly meetings where progress is tracked.

      I also know that this can get in the way and doesn't scale to all project sizes and requirements. A system information utility just doesn't need the same kind of development planning that an air traffic controller system requires.

      --
      Please do not read this sig. Thank you.
    99. Re:True that by Anonymous Coward · · Score: 0

      Fire mediocre developer and hire a good one - poof

    100. Re:True that by Alphasite · · Score: 1

      That's actually Slashdot fault. With a natural language compiler (programmed by a duct tape programmer of course) this would have never happened.

      Warning: Unclear statement in line 2
      Error: "ahve" undeclared identifier on line 4

    101. Re:True that by Geoff-with-a-G · · Score: 1

      And today's environment is even more forgiving of "cool new features right now, patch it later" than ever before. Nearly all mainstream products these days are self-auto-updating, so if (Google Chrome / iPhone OS / latest PS3 game) is buggy on Wednesday, most people have forgotten it by Saturday because it was patched on Thursday or Friday.

    102. Re:True that by Anonymous Coward · · Score: 0

      People didn't love Netscape. IE4 came out and everyone rejoyced.

    103. Re:True that by zach_the_lizard · · Score: 1

      In order for the blacksmith, the coder, and the musician to make money, what they produce has to be of a quality people are willing to pay for. The mere act of producing a hammer, a line of code, or a song does not guarantee any money. If people (or not enough people) do not purchase these products, the producers will either have to shape up (if the business hasn't been destroyed) or the producer will have to do something else.

      --
      SSC
    104. Re:True that by Geoff-with-a-G · · Score: 1

      Chances are that good developer could use almost any methodology and/or tool and ship working software.

      The rest of your point is correct - Joel tells us again and again: hire the best programmers, don't waste your time with mediocre programmers.

      But I think his issue here is that any good developer can write good software, but many of them become fixated with trying to turn it into great software before shipping it. His point is that once you've written some good software, SHIP IT! Turn it into great software later, if at all. Even within the subset of good developers, it takes a certain mindset to "ship good now" rather than "make it great now, ship it later".

      As much as the latter seems more admirable and pure, the former usually wins in business.

    105. Re:True that by somersault · · Score: 1

      Yes I said his post was intelligible, and no, I said reusing code was highly beneficial for squashing bugs..?

      --
      which is totally what she said
    106. Re:True that by Fulcrum+of+Evil · · Score: 1

      If somebody shipped a browser as crash-prone as Netscape was today, it wouldn't matter if it was three years ahead of the competition. People would play with it for a bit, and then use something stable.

      And back when NS came out, there wasn't 'something stable', so I don't see your point.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
    107. Re:True that by Myrddin+Wyllt · · Score: 1

      A good "duct tape" program would allow you to peel off the tape shift the part slightly, then tape it back up.

      If this is a requirement, "duct tape" is the wrong analogy - it should be "gaffer tape" programming. In fact, it makes sense on a few other levels as well, since it is generally used by professionals rather than cowboys and it doesn't leave an unsightly sticky mess when you finally get round to removing it.

      --
      [ ]Half Empty [ ]Half Full [x]Twice as big as it needs to be
    108. Re:True that by Fulcrum+of+Evil · · Score: 1

      After broadening my horizons, it would seem that half or more of the design patterns are simply language features in functional languages - seriously, visitor?

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
    109. Re:True that by Fulcrum+of+Evil · · Score: 1

      He's also learning that the SF alcohol board is petty, prone to revenge, and has a bias against homosexuals (read up on it at jwz.org), which was pretty shocking given my expectations about SF.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
    110. Re:True that by jc42 · · Score: 1

      a carefully-architected system ... designed to implement a specific structure ... new requirements don't match that structure

      I'd argue this solution was either poorly architected, or poorly scoped and managed.

      Of course. And that's a fact of life in almost all software projects. In the modern corporate world, such projects are almost always run by professional managers, not by people with software development expertise. They don't understand software, and never will. The developers have to do their best with instructions that are at best sketchy and ambiguous, and blatantly wrong much of the time. We software developers aren't going to change that; we can only learn how to work under such conditions.

      An example from a project about 10 years ago: My main assigned task was developing an SNMP server for a new network switch. Management had accepted that customers wouldn't buy a switch without it, because most of their networking software used SNMP for nearly everything. But the requirements I got included an explicit statement that I was not to implement "GET-NEXT". (I can see the look of fascinated horror on the faces of readers who understand SNMP. ;-) The group's managers, in their wisdom, had decided that it wasn't needed. So I developed an agent that didn't do GET-NEXT, knowing full well what would happen. Sure enough, when they made the first deliveries to customers (who had been promised an SNMP agent), the immediate reaction was "This isn't an acceptable SNMP agent; it doesn't do GET-NEXT." I didn't hear the arguments, but eventually my managers understood that the agent violated the SNMP standard, and wouldn't be accepted.

      So I got an urgent request: How quickly could I implement GET-NEXT? It turned out that the short answer was "One day." The longer answer was of the form "One day, but ...". I knew this would happen, so when I changed the default value of one flag from 0 to 1, GET-NEXT worked. I'd implemented it on the sly, knowing that it would be needed. But I warned them that, due to some deficiencies in the switch's lower-level software, it wouldn't have acceptable response times with requests for some tables. They sent the updated server to the customers, thinking they'd satisfied the terms of the contract - and the customers replied that it worked fine for simple variables, but rows of several tables had response times of more than a day, so it was still unacceptable.

      It's at this point that this becomes relevant to our topic here. SNMP's GET-NEXT is the tool used to discover the indexes to sparse arrays. Think "routing table", which is indexed by a 32-bit IP address, but typically has under 100 rows. How long would it take, using network round trips, to run through all possible values of a 32-bit index to discover which rows are populated? That was the only scheme my agent could use for such requests, because the lower-level software that supplied the data had no such discovery scheme. Clients were expected to "just know" the indexes for all arrays, including sparse arrays with 2^32 possible rows (2^64 in version 2). This was not possible for any customers' software. So the low-level system design had to be modified so it could maintain a list of the indexes it was using. This took several months of meetings, most of which were devoted to convincing the managers of the switch's software that something they didn't need and would never use was required to sell the equipment to anyone. They actively resisted trying to understand why, as it wasn't their problem. The actual solution finally came about because two low-level programmers understood the issue, and implemented what I needed on the sly, without telling their managers (though the team leader knew and approved). I worked with them on the redesign that was needed so that their software could collect the data and keep it up to date in an environment

      --
      Those who do study history are doomed to stand helplessly by while everyone else repeats it.
    111. Re:True that by steelfood · · Score: 1

      No, it's the other way around. You proved GP's point.

      Netscape had no competition until IE5. It was either Netscape, or AOL, and AOL wasn't a web browser in any way, it was a glorified portal. People flocked to IE when it came out. If you think people went to IE because it was on every Windows 95 machine and up, you'd be wrong. Not completely wrong, but wrong nonetheless. IE5 was the epitome of Good Enough, especially for the web as it existed back then. It was fast, reliable, lightweight, and loaded most pages without making a fuss, even pages that were poorly written (malformed HTML). There's a reason why Netscape's nickname was Nutscrape, and it's not because of some weird form of adoration.

      As for what made the web, IE made the web far more accessible than Netscape. It wasn't even Netscape that started the revolution. You can credit that to AOL (who later bought out Netscape, but that's long after Navigator 4 and into Navigator 5 territory). Netscape was a big player very briefly and only for power users on the WWW. By the time e-commerce and all the other things online people nowadays take for granted came about, IE was the only player in the market left outside of AOL (which eventually adopted IE before the Netscape buyout).

      --
      "If a nation expects to be ignorant and free in a state of civilization, it expects what never was and never will be."
    112. Re:True that by ConceptJunkie · · Score: 1

      I've found that 3/4 of them were things I either figured out myself or learned form other people before the term "design patterns" had ever been invented.

      --
      You are in a maze of twisty little passages, all alike.
    113. Re:True that by majesticmerc · · Score: 1

      Software is about money guys.

      Which is exactly what is wrong with software. Software should be about creating a useful tool.

      For some people writing software is also about paying the rent and buying food.

      Amen to this. I am all for "Free as in Speech", and when I do release my own software, its generally under a licence that promotes this. At the end of the day though, I'm a professional software developer, and I need to be paid for my work in order to keep providing for myself and (eventually) my family. Its all well and good saying otherwise, but the people that do say otherwise generally have other means of income. I create good software, regardless of whether I'm being paid for it or not, but I can't live for free, which is exactly why I can't work for free.

    114. Re:True that by Gorobei · · Score: 2, Informative

      I still we're still writing the guide. My approach (for a massive Python installation,) has evolved towards a series of unittests:

      Group 1. These test the normal behavior of the module (add an order, cancel an order, modify on order, etc.) Should be easy enough for another developer to read and get a sense of how the module is used. Gets written concurrently with the module itself.
      Group 2. Edge, error, and pathological cases. E.g. add an order with no items, race condition on simultaneous modifies of an order. Again, should be understandable by other developers.
      Group 3. Tests that catch every real bug or problem that was reported after initial release. I don't change the code until I've added a test here that fails under the old code, then I fix the code, then the test passes.

      1 & 2 form part of the documentation. 3 is the historical record of the module.

    115. Re:True that by Anonymous Coward · · Score: 0

      I know it's unusual around here to read the comment your respond to but he was talking about versions 5 and 6 of netscape (the most recent in my knowledge). They were not loved in any sense of the word.

    116. Re:True that by Fulcrum+of+Evil · · Score: 1

      Well, in all fairness, Design patterns aren't supposed to be new things, just a way of making a common vocabulary so you can talk about design more easily.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
    117. Re:True that by Gorobei · · Score: 1

      Sadly, yes. Peter Norvig felt 16/23 were "invisible or simpler" in a higher-level language (Lisp in his case.)

      A big system is going to have a couple more layers of complexity (each with its own 'design patterns'. ) A functional language is a required element at this point.

    118. Re:True that by HornWumpus · · Score: 1

      Make the new/mediocre guy do maintenance of good developers code.

      Initially make them do code reviews with the original developer (if possible, with a coder known to produce good work in any case).

      If the experienced, good developer even hints that the new developer isn't learning fire the new guy. Learning new languages/libraries/subjects quickly is the true test of a coder. The good coder has already learned many languages/libraries and hence most new ones will be soup. This is even true for the good coder kid.

      Alternatively if the good developer gives the new guy the thumbs up get him into a more challenging role quickly. That assumes maintenance is not the most challenging role in your shop. If it is then you might want to look for deeper problems.

      Bottom line is that most mediocre programmers will never be any good. Fire them and review the HR practices that got them hired in the first place.

      You want an office that is intolerant of shit work.

      You can't let even one 'shit worker' get away with it or most people in the group will lower their output to the minimum acceptable level already demonstrated. Everybody says they won't but after six months or a year of busting your ass covering for the idiot...same raise for everyone...maybe better for the idiot. What would Dogbert do?

      Exceptions for pretty young girls with big racks as _everybody_ knows they can get away with things that others just can't.

      --
      John McAfee 'It was like that time I hired that Bangkok prostitute; to do my taxes, while I fucked my accountant'
    119. Re:True that by abdulla · · Score: 1

      How do you determine what "needs" unit testing?

      You aim for 100% coverage.

    120. Re:True that by Junta · · Score: 1

      I've seen the flip side though. I've seen a project spend nearly as much time writing unit tests to a spec as they do writing to the spec.

      To make matters even worse, often times the problem is not a mistake when the programmer mistyped, but a mistake in the spec or the programmer's understanding of the spec, leading to a unit test that passes fine, but the code is spewing out garbage. I've seen fixes go into code that break unit tests, and they then have to fix the unit test.

      --
      XML is like violence. If it doesn't solve the problem, use more.
    121. Re:True that by turing_m · · Score: 1

      A professional athlete - at the very least they'll have a personal trainer working with them if not a specialist coach, either of which will bawl them out big time for sloppy diet or training programs. I have met athletes competing at a national level. Great natural potential, certainly. But the age of John L. Sullivan is gone.

      Get the macronutrients (protein, calories) right and the rest will follow. Hell, it is certainly possible to be ripped eating nothing but McDonalds if it is done right - getting the minimum protein won't be hard, you just need to limit the calories per day. If you can add and read nutritonal information panels, you can do this. Couple it with some basic exercise if you want to have some muscle or cardio along with the low bodyfat %. http://www.smh.com.au/olympics/articles/2004/08/25/1093246623182.html

      I think this is what Spolsky is getting at with his Duct Tape Programmer idea. Every problem has a different set of fundamental requirements. Provided you understand the basic requirements of what it is you are trying to achieve (one of which may include long term maintainability), nothing else matters. So then everything else is literally a waste of time/effort/money.

      --
      If I have seen further it is by stealing the Intellectual Property of giants.
    122. Re:True that by dangitman · · Score: 1

      When you have a blacksmith who cares more about money than his craft, you have a poor blacksmith indeed.

      Yeah right. What Blacksmith goes into business because he enjoys working in hot, dangerous conditions that require lots of physical effort and hardship? The only blacksmith who would become a blacksmith "for the craft" is an insane blacksmith. And I don't think you want to buy the wares of an insane person. A good blacksmith does it for the money.

      --
      ... and then they built the supercollider.
    123. Re:True that by Unoti · · Score: 2, Interesting

      Here's a great rule of thumb I use. Let's say you're writing a function to do some bit of functionality. Typically you're going to write that code, and then put together some code to check it out real quick before you proceed with the rest of your application. Usually, the cheesy little try-it-out code gets thrown away. Whenever you catch yourself starting to write a little piece of outside code to just check sanity check your method, instead write a unit test for it, and stick that unit test into the comments. I love to use doctest for this in Python, and I imagine there is some analog to it in Ruby.

      A lot of people go through the trouble of writing simple little testy code to make sure stuff works, without going through the trouble of saving that code. It takes a little effort to set yourself up so that code can be saved for posterity. But if you do it early, it really doesn't add much to the effort at all. And it makes it much easier to make changes later to the code and to do so with confidence.

    124. Re:True that by binary+paladin · · Score: 1

      Nice.

      I'll have to have a look see into that, but it's a good rule. I do unit testing all the time... I just junk the tests.

    125. Re:True that by msuzio · · Score: 1

      Yes, I've been reading about all that. Unfortunately, it's a hard lesson in the real world where logic and reason fail utterly. I've contributed to the DNA Lounge fund, hope they can squeak out a win over the bastards.

    126. Re:True that by Anonymous Coward · · Score: 0

      I know it's unusual around here to read the comment your respond to but he was talking about versions 5 and 6 of netscape

      Really?

      Can you, y'know, perhaps quote that part of his post? Because... I just don't see it.

      And given the implied contrast (that we wouldn't put up with that today, but did then), I don't see how he could mean anything but pre-1999 Netscape version.

    127. Re:True that by pla · · Score: 1

      No, it's the other way around. You proved GP's point. Netscape had no competition until IE5. It was either Netscape, or AOL

      You realize, of course, that MSIE had a v1.0? Which debuted a mere 8 months after Netscape v1.0?

      Netscape almost instantly destroyed Mosaic and everything else that came before it, and held their position for five years, despite Microsoft doing their damnedest to overthrow them for over four of those years.

    128. Re:True that by oneleggedmule · · Score: 1

      I agree!

      People take great care not to trip over the pebbles at their feet that they miss the boulder in front of them.

      PHBs have this myopic fixation on the current release cycle that they forget all the maintenance going forward. They need to appreciate the big picture and the long-term benefits of unit testing, automated builds and reusable code etc.

      Sure, skunks weasels and the like would always prefer to patch the cracks with duct tape and hide them so deep that it puts the dwarves of Moria to shame. It does not matter to them. By the time the next generation discovers the Baelrog underneath the mountain of duct tape, skunks and weasels would have already been promoted to management. And the vicious cycle continues.

      There is only one rational choice. You can't blame the skunks to cash in on short-term rewards and leave the long-term problems to others. I say, grab all the credit before all hell breaks loose in production.

      This pattern is not peculiar to the software industry. The story is even more exaggerated in the financial world.

    129. Re:True that by bheading · · Score: 1

      As Barzini said in "The Godfather", "we are not communists".

      Everything in our economy is about money, one way or another. It's money that decides in the first place what a "useful tool" is. And a good blacksmith who cares about his craft will command a higher price for his services than a poor one. It's in the blacksmith's interest to do a good job.

      The mechanics of the software engineering business are somewhat different. It's been known for decades that duck tape programming delivers short term results quickly, but expensive and painful maintenance costs later on. But time to market is everything (indeed that is Microsoft's chief advantage). When you have deployed any kind of software system it's far from straightforward to switch to another vendor, in the way that you can switch to another blacksmith.

      BTW by and large, Linux programmers - the major ones - are not about making tools, but they are about making the enhancements to the kernel that their employers pay them to do. Take away Red Hat, IBM, Novell and others, and what have you got ? Just because Linux is freely available, and volunteers can contribute to it, does not mean that it does not owe a significant proportion of its success to commercial concerns.

    130. Re:True that by bcmm · · Score: 1

      That's is my point!

      To simplify it a bit: back then, you could do development that was fast but resulting in unstable code, because there was not a nice, working alternative. Now there is, and you can't program like that anymore. Netscape is probably not a good model for who development should be done in most cases.

      --
      # cat /dev/mem | strings | grep -i llama
      Damn, my RAM is full of llamas.
    131. Re:True that by Anonymous Coward · · Score: 0

      Netscape did deliver a browser years ahead of the competition... And in all its crash-prone, flawed glory, people loved it. It took the web from a geeky novelty to a mainstream phenomenon. Not until MSIE 5 came out, a full five years after the first version of Netscape Navigator, did Netscape finally fall below 50% usage.

      And how many browsers users could practically choose from back then?

    132. Re:True that by some-old-geek · · Score: 1

      And yet, those same people keep paying for the next release, and the next, and the next...

    133. Re:True that by Anonymous Coward · · Score: 0

      ...but can anybody show me *any* significant, quantitative, comparative proof of improved ROI?

      I can certainly measure the cost of a production outage from a NullPointerException (in Java) that requires 8 people getting involved (from Unix SysAdmins, "the Business", developers and, yes for Christ's sake, PHB's) that should have been easily covered with a test case inside a test suite using JUnit.

      Btw, true story.

    134. Re:True that by Anonymous Coward · · Score: 0

      Amen to that!

    135. Re:True that by Anonymous Coward · · Score: 0

      What you call money concerns I call return on investment. I avoid funding projects that are largely exercises in mental masturbation.

    136. Re:True that by badkarmadayaccount · · Score: 1

      Yeah, FF beats it in crashiness hands down. *ducks*

      --
      I know tobacco is bad for you, so I smoke weed with crack.
    137. Re:True that by pla · · Score: 1

      And how many browsers users could practically choose from back then?

      Because "years ahead" doesn't in any way imply... Oh, I dunno, no comparable alternatives, regardless of whether talking about 1994 or today?

      If you came out with anything literally (as opposed to the "marketing-speak-BS" version of the same phrase) "years ahead of the competition", you would by definition have no other products to choose from in that market.

      If someone came out with a real human-brain-quality AI package that runs on your home PC tomorrow, would you complain that it didn't count as "successful" because Dragon Naturally Speaking didn't present enough of a market challenge to it?

    138. Re:True that by Creepy · · Score: 1

      To an extent, but where would the world be without hobbyists? Linux, the personal computer, variable intermittent windshield wipers... all hobbyists that created inventions. A job is just a way to provide a means for doing what you love - if that means building rockets, so be it, and if that means playing WoW, so be it.

      I'm not sure I completely agree with either camp - with bad design you get crap, with over engineering you show up in the market 7 years too late (and I'm sure everyone is using the OSI model vs TCP to post here right now, to give a good example - if I remember correctly, it was designed for two more years and it took 5 to get a full implementation).

    139. Re:True that by Anonymous Coward · · Score: 0

      "less insecure" = "more secure"

    140. Re:True that by mmusson · · Score: 1

      I like unit testing as a tool but I get turned off by a lot of pro-unit testing comments because people tend to describe in terms of something that must always be done or the code is of questionable quality. There are many situations where unit tests can't be made in a meaningful way.

      The system I work on depends on real-time data streams to provide the context that defines how something is processed. Yes I could make unit tests for each of the simple operations, but what is complicated is the way the real-time data can trigger those simple operations in so many combinations and permutations. It is not practical to write a set of unit tests where each has a precondition of setting the full system state. The typical response I get is 'Well at least write unit tests for the part that is unit testable.' My response is that the part that isn't unit testable is the interesting part. Any technique is a trade off between the effort to use it and value it returns. Writing unit tests for simple code that can be verified through visual inspection is unlikely to return the value that justifies the effort.

      Unit tests are great where they can be applied effectively but like any technique should not be applied slavishly to every situation.

      --
      SYS 49152
    141. Re:True that by Chrisq · · Score: 1

      100% coverage is usually overkill. You end up testing getters and setters, which really aren't necessary.

      Also to test some exceptions might take more effort than the code itself and only cover something that will happen once a decade. For example coding to test an IOException in a read could be done by writing a mock File object that will throw an exception after a certain number of bytes are read, but then you have to parameterise your file type or use IOC or something and the extra complexity just isn't worth the benefit.

    142. Re:True that by mcgrew · · Score: 1

      What programmer goes into business because he enjoys working in a cubicle that requires eighty hour workweeks and hardship? I actually took a blacksmithing workshop back in the late '70s, and it was hard work, yes, but it was fun as hell. I enjoyed it immensely.

      It did hurt like hell when I stepped on a piece of burning steel that melted my tennis shoe, but then sometimes my back hurts like hell after I've been at the computer too long, too. And I shouldn't have been wearing tennis shoes, that was stupid of me. But blacksmithing isn't inherently dangerous. I don't see why anyone would want to be a construction worker or logger -- now THOSE are dangerous jobs the require back breaking labor.

      These days blacksmithing is no longer a craft, it's an art. The only people who would do it at all enjoy it.

    143. Re:True that by Rue+C+Koegel · · Score: 1

      freedom need not be all encompassing. i'm free to type both the letter t and p in this box. but u are right, i can't turn the p upside down can i?

      d

      --
      DON'T CAPITALIZE! CO-OPERATE! AND FREE EVERYTHING!
    144. Re:True that by Rue+C+Koegel · · Score: 1

      u're so wrong, money can't be 'about' anything really, it has no opinions, goals, intentions, it's a freaking concept first and foremost; it's a fleeting thought, a non-thingamajig.

      saying money is about anything is like my neighbor deciding what college my son is going to go to... it's not something they can do, try as they might they can't decide for him, they can only influence his decision.

      and that's exactly how the concept of money is used, to influence. what it influences is controlled by it's barer. so in retrospect if money was to be 'about' anything, it'd be about control. but it's still just a concept we allow to manipulate us (if we disregard it's valueless physical form; coin and paper bills).

      i use a similar concept to encourage my son to go to bed when i tell him to.

      and although software like all man made things  can be imagined, actual software is not imaginary... while the concept of money, the perceived value of it, can only be.

      omg, ur attempt to devalue all things, and relate their characteristics to money, is totally valueless. i'll pay u ten dollars to delete ur comment.

      --
      DON'T CAPITALIZE! CO-OPERATE! AND FREE EVERYTHING!
    145. Re:True that by DragonWriter · · Score: 1

      How do you determine what "needs" unit testing?

      "Is it code?"

      Unit tests are only as good as the programmers who make them.

      Yes, tests are only as good as whoever builds them.

      And if the programmer can think of a unit test... chances are that his code has already accounted for it

      Not really. Most programmers I have known were quite capable of understanding that a piece of code they are writing should produce certain values in certain cases and yet writing code at times which would not do that.

      Knowing what the code should do in concrete cases is a prerequisite to being able to write code that does it other than by pure coincidence, but it certainly doesn't guarantee you that it will work.

      Nor does it guarantee you that when the requirements change (or someone else has to refactor your code), the correct behavior on the requirement taht didn't change won't get broken because you won't remember the behavior that should have been seen in the particular edge case or because the person refactoring the code is someone else.

      Having a unit test that preserves the present understanding of what the code should do, OTOH, does guarantee that, even if you are someone else does forget (or remember but code improperly to account for) the behavior in that particular edge case in the future, there'll be a big red flag hanging out telling them they need to fix it.

  3. my employer's fault by rubycodez · · Score: 3, Interesting

    my employer knows I can whip out a fast 4,000 line (but ugly, no artistic talent) web portal or e-commerce app in a month when it should be a 20K line project done by a team, so that's what we do. dangerous I think, we handle real money with that shit.

    1. Re:my employer's fault by Anonymous Coward · · Score: 0

      wow, i could write your 4000 lines of code in 3 days.... why does it take you a month?

    2. Re:my employer's fault by Anonymous Coward · · Score: 0

      Somehow I doubt 4000 lines of "hello world" is what his employer is looking for.

    3. Re:my employer's fault by rubycodez · · Score: 3, Informative

      hahaha. you know, I once had a boss that would make stupid statements like that, how he could have done xyz in minutes. one day I threw the keyboard at him and said, "you are full of shit, show me!" that stopped his b.s. bragging to me at least, though he continued to b.s. everyone else.

    4. Re:my employer's fault by K.+S.+Kyosuke · · Score: 1

      Comments don't count! (And neither does autogenerated code. And I will only accept "MyInsanelyLongClassName i = MyInsanelyLongClassNameFactory.getInstance()" as, say, twenty chars. Don't try to look *that* important.)

      --
      Ezekiel 23:20
    5. Re:my employer's fault by Anonymous Coward · · Score: 0

      yeah, but i am not full of shit and would take your challenge any day, just to crush you and make you look stupid.

    6. Re:my employer's fault by geekoid · · Score: 1

      Software isn't art, it's engineering.

      It's YOUR fault, you are the engineer. Learn how to do engineering.
      When was the last time you wrote a risk analysis of releasing a quick and dirty app to management? when was the last time you got an actual design sign off?

      Youa re nothing more then the type of hack that holds this industry back.

      --
      The Kruger Dunning explains most post on /. http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
    7. Re:my employer's fault by fridaynightsmoke · · Score: 4, Funny

      "I will crush you!" says man hiding behind anonymity on Internet. More news at 11.

      --
      This is a substitute for a clever sig that fits within the maximum number of characters.
    8. Re:my employer's fault by thepooh81 · · Score: 1

      Somehow I doubt this Mr. Anonymous Boy. Money, meet mouth?

    9. Re:my employer's fault by mksql · · Score: 3, Insightful

      wow, i could write your 4000 lines of code in 3 days.... why does it take you a month?

      Because there is a lot more to developing an app than writing code.

      --
      I should have been a Geologist.
    10. Re:my employer's fault by corbettw · · Score: 2, Insightful

      Your employer measures the utility of a program by how many lines are in it. That's all that's needed to know that your management are clueless and are proud of pushing crap out the door.

      --
      God invented whiskey so the Irish would not rule the world.
    11. Re:my employer's fault by Anonymous Coward · · Score: 0

      Because his boss isn't interested in risk analysis? His boss won't be held back by a signature on a design document and will make changes at the last minute without any kind of change management?

      You've clearly never worked in that kind of environment. I would guess you're an ivory tower programmer, perhaps in the education field?

      Also, if you're a software engineer I'd love to see your certification from the software engineer's society.

    12. Re:my employer's fault by Anonymous Coward · · Score: 0

      Well, maybe it's because his actually works?

    13. Re:my employer's fault by Rhaban · · Score: 1

      I can write 4000 lines of code in ~10 hours.

      I can write a 4000 lines app from scrach, that works and is almost bug-free in about a month.

    14. Re:my employer's fault by TheRealMindChild · · Score: 1

      Yeah. Now imagine that situation where you boss is a salesman/the owner and has never written a line of code in his life. All of a sudden all problems become "You didn't put in enough effort" and any kind of attempt at reasoning the situation becomes "excuses".

      --

      "When life gives you lemons, don't make lemonade. Make life take the lemons back!" -- Cave Johnson
    15. Re:my employer's fault by beelsebob · · Score: 3, Insightful

      I can write 4000 lines of code in 3 days too... Or alternatively, I can write 60 useful lines in the 3 days, and be 60 useful lines of code ahead of you.

    16. Re:my employer's fault by thePowerOfGrayskull · · Score: 1

      yeah, but i am not full of shit and would take your challenge any day, just to crush you and make you look stupid.

      ... sayeth the nameless, faceless person on the Internet.

    17. Re:my employer's fault by Anonymous Coward · · Score: 0

      You, sir, know nothing of the Montgomery Scott School of Deliverable Estimation.

      - T

    18. Re:my employer's fault by davek · · Score: 1

      sometimes I wish I had the balls to do that. I get that all the time from the higher-ups who think the EMR system is so simple because its "just a patient and procedure database"! People who think they can re-write 300,000 LOC in a weekend because they figured out to format a myspace page. Problem is, if I challenged them, they'd just fire me and hire some monkey who would take twice as long to do half the work. I'd be proven right. I'd be unemployed... but I'd be proven right!

      --
      6th Street Radio @ddombrowsky
    19. Re:my employer's fault by rubycodez · · Score: 1

      well, you have two situations there. if boss is a salesman, you've agreed to work for the kind of person who is generally a lying sack of shit who blows sunshine up people's asses for a living. you shouldn't complain then, but also shouldn't take anything that comes out of their mouth seriously either, they're blow-hards.

      if boss is owner, their business will fail if they have unrealistic expectations of miracles.

      anyway, the healthy attitude is not to fear job termination or threats of same.

    20. Re:my employer's fault by rubycodez · · Score: 1

      you know nothing of engineering if you think engineering is making risk analysis or (hahaha) getting design sign-off by the ignorant.

      At least I do regression and unit tests, that's a part of real engineering.

      And I do come from engineering background, of real objects. Maybe that's why my quick and dirty wares actually perform function reliably.

  4. Bad Mischaracterization by smack.addict · · Score: 5, Insightful

    The "duct tape programmer" is just as dangerous as the "astronaut architect".

    What distinguishes good architects from these fools is this:

    A good architect is someone with the experience to know when to cut corners and when to enforce rigid discipline.

    1. Re:Bad Mischaracterization by Jurily · · Score: 2, Insightful

      A good architect is someone with the experience to know when to cut corners and when to enforce rigid discipline.

      Which is entirely subjective by definition, so we're back to the basics: a good programmer writes working programs.

    2. Re:Bad Mischaracterization by Xest · · Score: 1

      Spot on.

      I can't think of anything more disasterous than having either an architect astronaut OR a duct tape programmer, well, except perhaps having both.

      The problem is that architecture in itself helps speed up application development. An application that is just an unorganised mish-mash of code is going to cause massive delays when something needs to be changed and that's a key point - over-architecting means something will be extremely slow to produce, but likely be extremely easy to maintain, under-architecting means it'll be extremely quick to produce, but an absolute nightmare to maintain. A good developer can get the middle ground and enjoy the best of both worlds, ultimately ending up with a much better program, in a reasonable timeframe and that remains maintainable, saving massive amounts of time over the duct tape programmer's monstrosity in the long run.

    3. Re:Bad Mischaracterization by Oriental_Hero · · Score: 1

      Heh, Joel in the article says a similar line for "Duct Tape Programmers"
      "Duct tape programmers have to have a lot of talent to pull off this shtick"

      Anyone got a more succinct way of putting this like the above for architects?

      --
      Oriental Hero "I want to live in a city where the Police don't shoot you" Jean Charles de Menezes
    4. Re:Bad Mischaracterization by Jurily · · Score: 4, Insightful

      After reading the article, there's nothing we didn't know before: release early, release often. But here's the killer quote all of you need to duct tape somewhere in your office right now:

      Duct tape programmers dont give a shit what you think about them. They stick to simple basic and easy to use tools and use the extra brainpower that these tools leave them to write more useful features for their customers.

    5. Re:Bad Mischaracterization by WinterSolstice · · Score: 1

      I happen to have firsthand experience in a shop where the astronautical architecture teams (yes, several dozen of them, with 10-15 people each) come up with rigid and overengineered concepts that they then throw over the wall onto piles of outsourced contractors who are sub-duct tape level.

      This results is crazy weird decisions with awful execution.

      Yes, you are right. Having both is a freaking nightmare. I had to sit in the middle, attempting to preserve database and system uptime while developers wrote code to store massive PDFs of every single EDI transaction inside a database, then killed appservers writing code to parse the PDFs and turn them in XML on the fly at the other end.

      Worthless. Just utter crap.

      --
      An operating system should be like a light switch... simple, effective, easy to use, and designed for everyone.
    6. Re:Bad Mischaracterization by khakipuce · · Score: 4, Interesting
      It's all about the people, a good developer (and a good architect) can use anything from a duct tape approach to a full-on methodology based life-cycle depending on the scale, complexity and critcality of the job in hand. You cannot use the same approach for building a sky scraper that you might use for building a garden shed.

      Several issues cloud this mix:

      • Non technical management really struggle to tell genuinely good developers from braggards and people who must be good because they are weird
      • Architects and analysts want fashionable things on their CVs as much as developers do, so they push towards the newest buzz because their next job may depend on it

      At the bottom of every successful development are a few people who just get on and write the code, it's where it actually happens. Ever see a hole in the road where one guy is down the hole with a shovel, and 4 others are stood around the top? I'm the guy down the hole, have been down coding holes for 20 years and pretty much every project I have started coding, I have finished and delivered, some where big methodology driven things, some where me against the world with a couple of weeks to deliver. But get keen interested and pragmatic people on the shovel and the job gets done

      --
      Art is the mathematics of emotion
    7. Re:Bad Mischaracterization by Anonymous Coward · · Score: 0

      True, but not all authors of working programs are good programmers. For evidnce, see any pile of unmaintainable, but working shell scripts. Programming is an engineering discipline, and as such it has practical concerns like maintainability, suitability to the task, scalability and adaptability. Balancing those factors and still shipping a working result on time is really quite hard, and requires a skilled individual.

    8. Re:Bad Mischaracterization by Trails · · Score: 1

      Additionally, a good architect will discuss and collaborate with the Duct Tape Programmer.

    9. Re:Bad Mischaracterization by geekoid · · Score: 1

      A good architect is someone who knows how to lay out the archetecture reasonable WITHOUT cutting corners.

      The can write up a doc t present to management in a day outline the plan.
      The know how to deal with management push back by delivering risk analyst.

      Christ people, it's time to come out of the basement and be professionals.

      --
      The Kruger Dunning explains most post on /. http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
    10. Re:Bad Mischaracterization by Jurily · · Score: 1

      Balancing those factors and still shipping a working result on time is really quite hard, and requires a skilled individual.

      Yes. However, merely blurting out truisms will not help anyone. It's not what they achieve that's important, but how. More precisely, what can I do to achieve the same level of success.

      GP: "Write good programs fast, and ship on time."
      TFA: "If someone proposes an architecture that's way more complicated than it is necessary for the task, just say no and stop caring what they'll think."

      See the difference?

    11. Re:Bad Mischaracterization by camperdave · · Score: 1

      Except when a program falls over it rarely kills people or costs tens or hundreds of thousands of dollars, you either end task it or reboot the computer. There's practically never an investigation done as to why it crashed. Code is never inspected by government regulators. A programmer will not lose his or her job if their program crashes.

      Architects are engineers. They are held to quality and safety standards, and face severe penalties for non-compliance. These standards have been developed over time by investigating failure modes of materials and structures. These standards are neither subjective nor arbitrary.

      --
      When our name is on the back of your car, we're behind you all the way!
    12. Re:Bad Mischaracterization by xleeko · · Score: 3, Insightful

      Duct tape programmers dont give a shit what you think about them. They stick to simple basic and easy to use tools and use the extra brainpower that these tools leave them to write more useful features for their customers.

      Exactly. Many posts will go on about how having a good architecture will make it easier to maintain in the long run, and other such things, but it all comes down to one thing:

      TIME

      If your code is useful, it will be used, you will get revenue (hopefully!), and you will have the TIME to improve things, clean up code, write unit tests, and all of the other things that are good and proper in life, but which only indirectly benefit the end used. This is the fundamental opportunity cost for software.

    13. Re:Bad Mischaracterization by Anonymous Coward · · Score: 0

      There's a lot more to it then that. I spent a summer working for a lumber company that had all of their programs written by an electrical engineer who taught himself C. There was no formatting, an obscene usage of goto's, global variables labeled x and y, and 90% of the program was around 15,000 lines of code in one file.

      The program worked, but nobody except the guy who wrote could make any sense of the code, and if something broke it would take weeks to fix instead of hours.

      A program needs to work, but it also needs to be serviceable, and that is where the rigid discipline comes into play.

    14. Re:Bad Mischaracterization by johnlcallaway · · Score: 2, Insightful

      What a bunch of bs...putting labels on things and trying to force people into tiny boxes.

      I've been writing code for 30+ years. I've seen all of these disciplines come in and out of favor.

      Each started with a simple concept, and was then perverted into something so that people who couldn't code could design and run projects and get paid more than the coders. Agile programming was the closest to anything useful, then it too was perverted with a bunch of useless rules and methodology structures that everyone had to be sent off to class to learn.

      The top percentage of coders are already architects without the label. All they need is a software request and a rough diagram of system components in order to get started. They understand how to write code so it interacts nicely with other code.They know how to write code the traps and handles errors properly. They know how to write code that doesn't blow up because some unknown data crept into the system. They know how to write efficient code and do performance testing. They don't need to sit down and design an entire system down to each module, they can pick a spot to start and just begin coding. Sure, they might have to change a few things as they go, but I've never seen a system designed by architects that didn't need some tweaking along the way either.

      What it all comes down to is we still do modular programming and design with flowcharts, there just called different things and have different rules now.

      Architects are needed for developers with poor design skills. Developers are needed for architects with poor coding skills. Take the time to find employees with both and just get the work done. Let your competition spend too much money hiring too many people and follow fads.

      Gotta go .. I got shit to do.

      --
      I rarely read replies, it's my opinion and if you thought about your opinion a little more, I'm OK with that.
    15. Re:Bad Mischaracterization by rcuhljr · · Score: 1

      That's not at all universally true. Writes software for defense and medical purposes some time.

    16. Re:Bad Mischaracterization by MadKeithV · · Score: 1

      All you need to do is vary the definition of "working", and suddenly everyone is a good programmer.
      And I WISH I was kidding, but you all know it's true. You just tone down what "working" means and feel you have an excuse to ship steaming piles of shit.

    17. Re:Bad Mischaracterization by Anonymous Coward · · Score: 0

      Ergo, people who write software are not engineers.

    18. Re:Bad Mischaracterization by radtea · · Score: 2, Insightful

      The killer (literally) quote for me was:

      When you are done, you might have a messy go-cart, but itâ(TM)ll sure as hell fly. ..ONCE.

      I guess the last word got edited out.

      I'm all for the least formal processes consistent with the production of reasonable quality software shipping on schedule using the resources you have available. But anyone who has had to maintain the code written by cowboys (which is what DTP's are) knows how much damage their unbridled attitude can do to a company.

      The article acknowledges this at the end: DTPs are pretty boys. They make it all look so easy, because they can make excellent and refined judgments on the fly about what corners to cut and what bits are genuinely critical. But the reality is that anyone who thinks they are a DTP isn't one, and they'll cut too many corners, and produce something that is the equivalent of a go-cart that makes it through one race and then falls to bits, because duct tape just isn't that durable, and people who rely on it in production environments are dangerous idiots.

      --
      Blasphemy is a human right. Blasphemophobia kills.
    19. Re:Bad Mischaracterization by MikeBabcock · · Score: 1

      Unfortunately we haven't yet developed the social and legal framework to require the equivalent of a professional engineer to sign off on software projects yet, like we do with physical structures.

      Without such requirements, building contractors would act just the way described in this article and we'd have chaos.

      Luckily, a lot of programmers avoid that paradigm all on their own because they have ethics and don't believe in shipping at all costs.

      --
      - Michael T. Babcock (Yes, I blog)
    20. Re:Bad Mischaracterization by Comatose51 · · Score: 1

      I would say a good architect is someone who designs something that can actually be built on time and within budget. Architects who don't code much run the risk of being an astronaut.

      --
      EvilCON - Made Famous by /.
    21. Re:Bad Mischaracterization by MadKeithV · · Score: 1

      For me the kicker was the last paragraph, where Joel admits that only developers that have the innate ability to make the right short-cut decisions are actually good duct-tape programmers.

    22. Re:Bad Mischaracterization by 5pp000 · · Score: 2, Interesting

      A good architect is someone with the experience to know when to cut corners and when to enforce rigid discipline.

      Agreed. I have a guy on my staff who is constitutionally unable to cut corners. The upside is, when he says the feature he's working on is done, by god, it's done. I can't remember the last time we found a bug in his code. The downside is, it takes him a long time, and sometimes we would really like to have the first 80% of the functionality done quickly so that other people could start to build on it. Don't get me wrong, this guy is really good and I'm very glad to have him, but he would be even better if he cultivated a sense of what corners to cut when.

      --
      Your god may be dead, but mine aren't!
    23. Re:Bad Mischaracterization by Abcd1234 · · Score: 1

      Exactly. Many posts will go on about how having a good architecture will make it easier to maintain in the long run, and other such things, but it all comes down to one thing:

      TIME

      While that's certainly true, let's face it: if people put even a *little* thought into longer-term design and extensibility, software would be far easier to maintain.

      Here, a simple example: at our organization, we needed a very simple reporting solution very quickly... like, 3-4 calendar weeks from conception to release to QA. Of course, we initially looked at pre-packaged solutions, but after an initial evaluation, it was clear that we could roll a basic solution in less time than it would take to develop the in-house expertise to use those tools.

      Now, with that decision made, we could've easily gone forward and hacked something extremely simplistic very simply. But instead, the first thing we did was step back, consider a few additional use cases, and then we proceeded to design something that, while a bit overly flexible given our initial requirements, we knew would be able to grow as our requirements grew. That done, myself and another developer put together the initial implementation, from zero to completed product, in around three weeks, give or take.

      A year later, and that design has held up exceedingly well. We've easily added new features as new requirements have popped up, refactoring and reworking as we go, and never has it felt like we've had to use this "duct-tape" approach. And why? Because we put just a couple days of extra thought into our approach before we marched ahead.

      Long story short, the lesson here is simple: over-engineering is bad, yes, but under-engineering is just as bad, if not worse, and it takes very little effort to put together a simple design that will hold up well over time.

      As an aside, another interesting point: having more than one person work on a given project is a great way to ensure that your software is at least somewhat modularized, as you're absolutely forced to break the project out into independent modules that can be developed and tested separately. As such, I'd also say that, along with a modicum of up-front design, having at least two people work on any given project is better than having a single, lone gunman hack away until he/she has something that works.

    24. Re:Bad Mischaracterization by Anonymous Coward · · Score: 0

      You don't think bad software has ever cost a company tens of thousands of dollars? Bad software is not software that crashes. That's easy to detect and fix. Bad software is software that looks like it's working and it's only after several months of operation that someone in accounting realizes it was calculating something incorrectly and has been costing the company millions.

    25. Re:Bad Mischaracterization by 0xdeadbeef · · Score: 0

      Damn straight. Take it further: there's no such thing as a good architect who can't code. It's a false dichotomy, one that serves the interests of the incompetent, both the charlatan who talks the talk and rakes in the consultancy fees, and the ditch-digger who got his CS degree from a diploma mill and doesn't understand how a compiler works.

      This stuff reminds me a lot of right-wing politics. It's all about propping up people's self-esteem, placating status anxiety. One the one hand, pundits excuse the graft of the talking class by promoting the myth of their superior leadership, and on the other, they praise the folk-wisdom of the common man and the nobility of their get-r-done attitude, but misdirect their justifiable anger by laying all blame on those who are merely affluent, educated, and skilled professionals.

      Architect astronaut... sounds like limousine liberal to me. Duct tape programmer is the Real American. I was wrong, Joel isn't Dvorak, he's the Glenn Beck of programming.

    26. Re:Bad Mischaracterization by American+Expat · · Score: 2, Interesting

      A good architect is someone with the experience to know when to cut corners and when to enforce rigid discipline.

      Couldn't agree more. A good architect making informed decisions (including when to break out the duct tape) is what separates the cowboy shops from the successful companies.

      It amazes me that there are a ton of experienced people that are applying for architecture positions that think that coding is somehow beneath them. When I am applying for a job as an architect, I always tell the employer that I will need at least 6 months of "real programming" on the product before I will be able to do any significant architectural changes. You need concrete knowledge of where the bodies are buried to know how to proceed.

      Without the trust of the developers (which is only gained by demonstration of competence) or knowledge of the underlying idiosyncrasies of the system, any change an architect makes is destined to fail.

    27. Re:Bad Mischaracterization by HalifaxRage · · Score: 2, Insightful

      Look up Therac-25. Actually, here I'll do it for you: http://en.wikipedia.org/wiki/Therac-25 tl;dr: Radiation therapy machine had buggy software, existing code was used on new hardware which allowed a previously-unnoticed bug to engage a high power beam without shielding. Patients experienced severe pain and burning; three died.

      --
      bomb the us up set someone
    28. Re:Bad Mischaracterization by Anonymous Coward · · Score: 0

      I've gotta rant here, please forgive me.

      I don't think of myself as a duct tape programmer, but man do I ever have a problem with the astronaut architect bullies.

      This is what I do know, I write applications that customers use and makes my corporate masters money. When I am judged on the quality of my applications, the number of bugs and customer acceptance of my product I am rated as an outstanding developer. (And that is for more then slap something together and walk away. I maintain these applications for years, through many releases. And work with a team of developers.)

      But every so often I run into one of these architect assholes and it makes my life hell for about six months. Because I am not good at arguing and avoid confrontation these jerks make me look stupid, and convince management that its a miracle they have made it this far with me developing for them. (For some reason my argument of my stuff works, this guy is just selling snake oil seams to fall short.)

      So for the next six months all of my work gets critiqued buy this guy, and this whole crap load of templates, designs, frameworks is rammed into the product, breaking everything. At first they are able to blame the new bugs on me and the pain of making things right, but after six months with nothing but a bugs to show for there work they are generally shown the door. If they stay longer than that I leave.

      I am alone here?

    29. Re:Bad Mischaracterization by Sudheer_BV · · Score: 1

      I have seen two engineers write an application for about a year. They managed to deliver the project with great difficulty. No comments, no code formatting, no version control, no tests, no docs. After they completed the said project, they learned a whole lot of software engineering. Now these engineers use version control, adhere to coding standards, have API documentation, maintain end user documentation in docbook, write unit tests, use design patterns, read security books, attend lot of conferences, etc. They are now so much more confident about the quality of the software they develop.

      They are scared as to when the old customer will come back and ask for a feature addition. The only choice they have is to rewrite the application.

      --
      Sudheer Satyanarayana
      www.techchorus.net
    30. Re:Bad Mischaracterization by Saint+Stephen · · Score: 1

      I don't agree. I've seen people "duct tape" copies of the same code literally 10,000 times, with slight variations. I've seen people "duct tape" using old crappy technology just because it's the first thing they thought of.

      I've seen people write sloppy code because "it's not important what the code layout looks like."

      I've seen people spend ages getting stuff to work because they didn't do it right the first time.

      I think the problem here is people are complaining about crappy architecture and rather than do their job RIGHT just make fashionable whatever they were going to do anyway.

    31. Re:Bad Mischaracterization by Xordin · · Score: 1

      [quote]But the reality is that anyone who thinks they are a DTP isn't one, and they'll cut too many corners, and produce something that is the equivalent of a go-cart that makes it through one race and then falls to bits, because duct tape just isn't that durable, and people who rely on it in production environments are dangerous idiots.[/quote]

      Netscape transformed the face of IT; maybe even of humanity.

      What kind of impact do your programs have?

    32. Re:Bad Mischaracterization by jellomizer · · Score: 1

      Thank god too. Engineers write horrible code. They just think they are good.

      --
      If something is so important that you feel the need to post it on the internet... It probably isn't that important.
    33. Re:Bad Mischaracterization by Sebilrazen · · Score: 1

      Yep, writing medical device software is an exercise in death by paper cuts.

      --
      "There are no facts, only interpretations." --Friedrich Nietzsche.
    34. Re:Bad Mischaracterization by jgrahn · · Score: 1

      I'm all for the least formal processes consistent with the production of reasonable quality software shipping on schedule using the resources you have available. But anyone who has had to maintain the code written by cowboys (which is what DTP's are) knows how much damage their unbridled attitude can do to a company.

      Hey, Spolsky just used "duct tape programmer" as a catch-phrase in some blog post, people are already capitalizing and TLAing it ... I want to mention here that it's an unfortunate overloading of a term. I've always associated duct-taping to glue, as in building programs quickly by combining other programs, with pipelines, shell scripts, and Perl. Or maybe that's just me?

      Spolsky is also a bit vague with the definition. Are these duct tape programmers people who: (a) whip together unmaintainable crap just to get something onto the market, or (b) refuse to accept overengineering, defined as work which is not needed, solving problems which do not need solving, and releasing unmaintainable crap 6 months too late? His "messy go-cart" is (a), but then he's talking about refusing to use CORBA, which is clearly -- to him and to me -- in the (b) category.

    35. Re:Bad Mischaracterization by some-old-geek · · Score: 1

      A good architect is someone with the experience to know when to cut corners and when to enforce rigid discipline.

      And a good manager can tell the difference between a good architect and bad one just as easily as they can between a good programmer and bad one, which is to say not at all. And so we end up with good architects being outnumbered by bad ones, and a broad brush being used to paint them all.

  5. You can't measure Synergy by Dareth · · Score: 4, Funny

    You can't measure Synergy man, you just have to feel it!

    --

    I only look human.
    My mother is a halfling and my dad is an ogre, so that makes me an Ogreling
    1. Re:You can't measure Synergy by Anonymous Coward · · Score: 0

      well, this is a paradigm shift ... i para-dig it!

  6. Oh no. Now all the numties have an excuse! by freddled · · Score: 5, Insightful

    I agree with most of Joel's post. What bothers me with this kind of thing is that there are a lot of idiots out there just waiting for an excuse for their poor standards. For every real Duct Tape Programmer there are ten buffoons who will now take that label for themselves. But hell they shoudln't be hard to spot.

    1. Re:Oh no. Now all the numties have an excuse! by demachina · · Score: 1

      "I agree with most of Joel's post." ..excepting that:

      A. He plugged a book to the point you start to suspect either he has a financial interest in it, or he has friends who do, I'm guessing the latter.
      B. He went so over the top hero worshiping Zawinski he further damaged his credibility. Zawinski is just a guy and just a programmer whose main claim to fame is he got in to Netscape at the right time and profited off it mightily and has been milking it ever since. Netscape wasn't exactly ground breaking. The World Wide Web and Mosaic were ground breaking, Netscape just tried to profit off them before anyone else did, and they were quickly destroyed by Microsoft, though most of them got rich first thanks to the first phase of the internet bubble. Firefox is pretty much only thing that survived out of it and its several generations removed. Netscape was in most respects a team ripping off Mosaic so they could profit off it.....
      C. He suffered from a classic case of generalizations

      In particular claiming you should NEVER use C++ or threads is purely silly. Yes you can abuse C++ and threads.

      C++ is like most languages, you can use it well or you can abuse it. It has more power tools so it is easier to abuse it. I've seen plenty of horrible C code abuse over the years, some it makes your eyes hurt, and if the project/code base gets very big C++ actually helps keep and restore order as long as someone architects it well and enough and not too much.

      Threads certainly can be a reliability curse but there are most definitely places where they are the RIGHT tool to use and if you don't the consequences can be bad in their own right. For example when you end up with a program that is sluggish because its letting some task that should be running in a background thread hogging the foreground and UI.

      I wont argue that multiple inheritance is USUALLY bad though it can be used to good effect in some cases, you just need someone who knows when a case arises where it should be used. Since OO languages like Java get by without it you probably can too.

      I wont argue that templates are OFTEN bad because people overly proud of their ability to write obfuscated code abuse them and create unreadable garbage. I usually avoid STL because it is ugly, hard to debug code. Same can be said for overriding operators. But there are some instances where they are very useful.

      COM being bad, probably no argument from me. Microsoft got mileage out of it but the down sides pretty much compensate for its successes.

      Bottom line to me is duct tape programmers aren't inherently better than any other kind of programmer. Only thing that matters at the end of the day is if they got the job done, and done well. I'm pretty sure there are more structured programmers who are just as successful if not more so than many duct tape programmers, and if the application is inherently going to be big and relatively complex someone with some structure, some, not to much, will probably fare better. If its a one man team... use whatever works for ya.

      The important thing isn't really what kind of programmer you are, its whether you make the right decisions at the right time in order to succeed. People who make knee jerk generalizations about tools and refuse to use them are just increasing their chances of not making the right decision.

      --
      @de_machina
    2. Re:Oh no. Now all the numties have an excuse! by Fulcrum+of+Evil · · Score: 1

      In particular claiming you should NEVER use C++ or threads is purely silly. Yes you can abuse C++ and threads.

      He never claimed that. He said that using c++ and threads would've added complications that would make them not ship. Remember, this is mid-90s, so pthreads and C++ with STL were far from mature, and C++ compilers were still frequently buggy.

      Threads certainly can be a reliability curse but there are most definitely places where they are the RIGHT tool to use and if you don't the consequences can be bad in their own right. For example when you end up with a program that is sluggish because its letting some task that should be running in a background thread hogging the foreground and UI.

      And the alternative is using different threading libraries across 8 platforms and dealing with the bugs from each.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
  7. False dichotomy by ciggieposeur · · Score: 5, Interesting

    I'm plagiarizing a point I saw on Reddit and I'm too lazy to find the original article, but I agree with the author of it: there doesn't have to be a choice between "crappy duct tape" programming and "crappy over-architected" programming. A decent programmer can get both: a small program that does its job well, AND can be extended in unplanned-for ways for new functionality.

    1. Re:False dichotomy by Anonymous Coward · · Score: 1, Funny

      there doesn't have to be a choice between "crappy duct tape" programming and "crappy over-architected" programming.

      Indeed. I do crappy over-architected duct-taped bodgecode every day.

    2. Re:False dichotomy by SoopahMan · · Score: 1

      Yeah, Joel sometimes has useful things to say; this is not one of them. It's a very knee-jerk "as a manager I like to save money" response, and it isn't helpful.

      The Duct-Tape Programmer is the programmer whose work I get paid to come in and fix.

      The programmers that do a good job up-front and leave code that's easy to maintain have a real irony to them - they leave the door open to Duct-Tape Programmers. There's not much incentive to write maintainable code at most organizations, especially if you have one of these Duct-Tape types in your organization or looming ahead - because the results to a manager who doesn't ask any questions will always be the same: "The 3 months programmer 1 spent got me 30%, the 3 months Duct Tape spent got me 70%. Duct Tape is my guy." Well he got there by throwing maintainability to the wind and leveraging what that good programmer set out as a foundation.

      Unlike this article, what would actually be insightful is legitimate information about the relative maintainability of code at a given point. There's no industry-standard way to assess code for how maintainable a code base is. Perhaps we need one.

      The most obvious potential method that comes to mind is to have 10 programmers (probably Duct Tape) attempt to write 10 very small features in a few days. The relative success or failure of this would indicate to you the flexibility of the code as it was when this experiment was begun. This would be a fairly expensive way to assess code, but with 10 programmers actually digging in and having to deliver, you avoid the high-level "barely read the code/have an opinion anyway" opportunity, and you average out a lot of the obviously subjective nature of the results.

      You would have to select your 10 small features carefully so that they ideally capture either a broad picture of the code, or a narrow picture around the kind of flexibility your organization cares about/expects to leverage soon. The strength of the results would rest largely on how well you selected the features tested.

      In any case, I assure you, the Duct Tape Programmers of the world would get a very low score on any such assessment. It's something the industry could really use - without it it's only logical you'll keep seeing counter-productive opinions from decision-makers like the one stated in this article.

      There's probably cheaper ways to do this than paying 10 programmers for 10 days. In Open Source projects you could hold contests with prize money for implementing the 10 features, and see what people gravitate towards and what they avoid - Feature A gets 1000 entries and Feature B gets just 1, and it failed - found a code maintenance problem. But maybe people here have even better ideas, that work for closed and open projects.

    3. Re:False dichotomy by MrFriday · · Score: 1

      Exactly. I was on board with the "just stop the ridiculous abstraction, let's get the job done" until the 50% / 99% point. It isn't one or the other. If we insist on a dichotomy, a better one might be idiots vs. "experienced, talented developers who know what they're doing". I too have seen the projects with walls full of UML diagrams and not a line of code written. The self-perpetuating thing about these projects is that the developers who are itching to get the job done eventually give up and go somewhere else, leaving the UML-ites (or pick the latest fad) to keep it up until the project dies.

    4. Re:False dichotomy by Anonymous Coward · · Score: 0

      I could not agree more. I've run into a lot of programmers that write what they think is extensible code but is actually just over-engineered to accommodate any possible scenario _THEY_ could think of.

      Truly extensible code does what it needs to do, and only what needs to, but is designed in such a way that it can be extended to accommodate _ANY_ possible scenario.

      Writing code like this is kind of like duct-tape programming where you're simply writing code to get it done. But it also takes a lot of thought, knowledge and experience with what designs are extensible and which ones aren't.

  8. Well... by Anonymous Coward · · Score: 2, Insightful

    One month to write and years to debug and get right.

  9. Industry Software by Jazz-Masta · · Score: 2, Insightful

    Wow....praises for everything that is wrong with programming.

    I believe in a 100% good project, and somewhere around 97%+ good project. If it can't be delivered, then you're not smart enough, or it's not possible.

    Of course, I think he means something along the lines of industry software.

    I work in the auto repair industry as a system administrator. We have 20 industry specific programs. They fall into two categories:

    1. Programs developed by companies within the industry with no real programming experience. IE. Auto Shop gets smartest guy to learn how to program - builts program...these are the programs that are 50% good. Poor programming practice, unstable, but overall, on a good day, works well enough to increase efficiency beyond that of a pen/paper.

    2. Programs developed by professional programmers with no industry experience. These programs are polished, stable, run fast. The problem is, since the programmers have little or no industry experience, there is an obvious disconnect in the work process within the program. This results in features we don't need, or things we need that are absent.

    Overall, as a system administrator, #2 are better for me, because they work. #1 are better for the workers themselves.

    We have one program that "tracks changes" by polling every file on the hard drive constantly. Starts at the top and works through every file and starts again. We have a server dedicated to this, chews up a 4-core processor. When asked about it, they said there was no other way to do it...uh huh...this is the #1 approach.

    1. Re:Industry Software by Anonymous Coward · · Score: 0

      Please show them

      http://msdn.microsoft.com/en-us/library/aa365261%28VS.85%29.aspx

      And/or

      http://msdn.microsoft.com/en-us/library/aa365721%28VS.85%29.aspx
      http://msdn.microsoft.com/en-us/library/aa364583%28VS.85%29.aspx

      Each of these should let you 'watch' for file changes in a system. Mostly the second one is what you really want. It 'marks' when something in some file changed and what file changed (not the change itself). Its pretty cool.

    2. Re:Industry Software by geekoid · · Score: 1

      #2 is better for both, becasue if they are they are good developers the engineer there software, adding new features should be a lot easier.

      "We have one program that "tracks changes" by polling every file on the hard drive constantly."

      hahaha, excellent. Those developers should be removed from the industry.

      There is only one problem with the industry:
      You are not required to be a certified engineer to write apps. If that was the case a lot of problems in the industry would go away becasue the developer would be liable, and it would give them power over management when management tries to force q dead line down their throat.

      --
      The Kruger Dunning explains most post on /. http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
    3. Re:Industry Software by Tablizer · · Score: 1

      Or, use a database with triggers or change-join detection instead.

    4. Re:Industry Software by russotto · · Score: 4, Insightful

      You are not required to be a certified engineer to write apps. If that was the case a lot of problems in the industry would go away becasue the developer would be liable, and it would give them power over management when management tries to force q dead line down their throat.

      Liability doesn't mean power. Liability just means liability. Personal liability and sign-off for developers just means he has to choose between bankruptcy and a life of "Would you like fries with that?" if failure occurs, or losing his income now (and possibly having trouble finding a job because he's got a reputation for being difficult) because he won't sign off.

    5. Re:Industry Software by david_thornley · · Score: 1

      And me without mod points.

      What would make a potential difference is if a company couldn't ship an app without signoff from a professional software engineer, who would be at least partially liable. This is, I believe, the model in quite a few industries.

      Then, of course, the PSE who wouldn't sign off would get fired, and would have problems for a while, but the PSEs who would sign off would eventually be bankrupted and stripped of their PSE certification. Eventually the rest would get cautious, but I don't know what would happen to the early ones with principles. Probably nothing good.

      You know, that's depressing also.

      Not to mention that I won't sign off on any assurance that code I've written is bug-free. There may be a handful of readers who have written a lot of varied code and not made any major bugs, but no more than that. I could sign off on carefully following standard and industry-accepted promises, or something about .having legitimately tried to get the bugs out, but not that there were no significant bugs.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
    6. Re:Industry Software by Impy+the+Impiuos+Imp · · Score: 1

      > 2. Programs developed by professional programmers with no industry experience. These programs are
      > polished, stable, run fast. The problem is, since the programmers have little or no industry
      > experience, there is an obvious disconnect in the work process within the program.

      Worked on car radios back in the Windows CE day with "Apollo", Microsoft's car radio variant of Windows CE.

      Was on a phone call with MS engineers, when our guys got in an argument about how a...radio button should behave. Some MS guy said, literally, "I don't want to get into a discussion of who's smarter..."

      I'm sorry? Whose software "radio button" is modeled after actual physical radio buttons that car makers have been making for 80 years?

      There's a reason "radio buttons" (as opposed to check boxes) are freakin' called radio buttons.

      Un-freaking believable.

      They had a very tough time getting the notion that, in car radio hardware, the tuner hardware defines the end ranges of the band as well as the inter-station step size. It tells the control software, not the other way around. Hence 90%+ of Microsoft's structures, which included ways to specify things like that, were completely bass-ackwards.

      --
      (-1: Post disagrees with my already-settled worldview) is not a valid mod option.
    7. Re:Industry Software by Migala77 · · Score: 1

      #1 is better for both, because #1 pays the bills. Developers that waste their time on features nobody uses should be removed from the industry. They should talk to users, and find out why users like #1 better.

    8. Re:Industry Software by Mafia$oft · · Score: 1
      Yup, on a universally open system that tracks your every move, chews your left finger and kills your dog on moonless nights.

      On systems that are worth coding for, these things might be called inotify or dnotify or some such.

      Anyway, thanks for documenting the way to do it on a certain platform.

      And I'd say people who go ahead implementing it in such a low-bottom miserable way without any second thought still have lots and lots and lots more things to learn still.

    9. Re:Industry Software by Mafia$oft · · Score: 1

      Yup, by now it should be well-known that they are unable to design anything worth any crap. That M company somehow managed to spoil and mentally disrupt decades of programmers. See http://www.flounder.com/guiowner.htm etc. for radio button stuff and many other scary things.

    10. Re:Industry Software by shadowofwind · · Score: 1

      You use Reynolds & Reynolds software? Seems to be badly managed, by people without technical skills, and with many mediocre programmers.

  10. WD-40 by maxume · · Score: 1

    WD-40 is never the right lubricant, and it probably isn't the penetrating oil you are looking for.

    --
    Nerd rage is the funniest rage.
    1. Re:WD-40 by ceoyoyo · · Score: 1

      But there is a can of it over there and I need to get this bolt out in the next five minutes.

    2. Re:WD-40 by PvtVoid · · Score: 1

      WD-40 is never the right lubricant, and it probably isn't the penetrating oil you are looking for.

      Word. WD-40 is a water displacer, and a pretty good solvent. You use it for removing lubricant.

      Tri-Flow is godlike.

    3. Re:WD-40 by Anonymous Coward · · Score: 0

      WD-40 is never the right lubricant, and it probably isn't the penetrating oil you are looking for.

      That's true-- in fact, WD-40 isn't really a lubricant; it's a "water displacement" ("WD") agent to free up stuff that's stuck. If you actually want to lubricate, you need an actual lubricant.

      (old quote: the only two tools you really need are duct tape and WD-40. If it moves, and it shouldn't, use the duct tape. If it doesn't move, and it should, use the WD-40).

  11. Pay me now or pay me later ... by chazman00 · · Score: 1

    ... which is what "Duct-tape programming" amounts to. Sure some solutions can be over engineered. But as you have a number of projects under your belt and see a number of pitfalls, it pays in the long run to avoid some problems upfront. That said, I understand and have worked with programmers who have wanted to add clustering to an application with 15 users. The key is knowing your requirements and your goals.

    1. Re:Pay me now or pay me later ... by Tablizer · · Score: 1

      That said, I understand and have worked with programmers who have wanted to add clustering to an application with 15 users.

      I call these "resume programmers". They want to use your shop as their training ground in order to fill up their experience quiver and resume with buzzwords.
           

  12. Litigation by Anonymous Coward · · Score: 0

    Your Honor, the Vehicle Control System works over half the time. We are not responsible for this tragedy.

  13. Donald Knuth? Writing programs is easier than ... by Anonymous Coward · · Score: 0

    Writing programs is easier than debugging them. So if you write a program in a way that takes all your intelligence, you won't be smart enough to debug it.

  14. Yeah but... by Alanis+Morissette · · Score: 2, Funny

    They don't even hold a candle to gaffer tape programmers.

  15. "Don't forget to ship your software!" by afree87 · · Score: 4, Insightful

    Why is it that whenever I read an article by Joel I feel like I'm being talked down to?

    1. Re:"Don't forget to ship your software!" by D+Ninja · · Score: 1

      Interesting observation. I will admit that I like Joel's articles. But, as to your comment, it really has to do with your own perceptions for the most part. I can't find the study, but I did some research on people's perceptions of e-mails that they receive, and one corresponding study showed that people misinterpret the voice of textual information (e-mails, blogs, texting) about 90% of the time. How they perceived the messages appeared to come from things such as their own mood, past experiences with the author of the message, and their own personal view on the world. (I apologize for not being able to find the study.)

      So, while Joel may be talking down (he has to consider a relatively wide audience, too), your perceptions might be a reflection more of yourself.

    2. Re:"Don't forget to ship your software!" by geekoid · · Score: 4, Insightful

      Becasue Joel is an ass.

      Seriously, he is an ass, and is often wrong.

      --
      The Kruger Dunning explains most post on /. http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect
    3. Re:"Don't forget to ship your software!" by Tridus · · Score: 4, Funny

      Hey, it's a great piece of advice if ex Duke Nukem Forever programmers read the article!

      --
      -- "So they told me that using the download page to download something was not something they anticipated." - Bill Gates
    4. Re:"Don't forget to ship your software!" by H0p313ss · · Score: 1

      So, while Joel may be talking down (he has to consider a relatively wide audience, too), your perceptions might be a reflection more of yourself.

      Crap... that must mean I'm a raging ego-maniac. I always feel like Joel is talking to me peer-to-peer!

      --
      XML is a known as a key material required to create SMD: Software of Mass Destruction
    5. Re:"Don't forget to ship your software!" by Taevin · · Score: 5, Insightful
      In this case, I'm left wondering what the fuck just happened? like when someone from marketing comes by my desk with a slurry of buzzwords and technical jargon they don't understand, but it's sure to make my code rock solid. Seriously, I usually like his articles, but what the fuck is he on about?

      He starts out with a good premise, that as programmers we tend to want to over-engineer stuff and that is something we should try to avoid because it adds unnecessary cost to a project. Then he apparently has a brain hemorrhage and starts dumping on a whole host of invaluable software tools that actually increase productivity and reduce errors, both of which help you ship your code faster.
      • C++ is too hard? I admit it's no longer my first choice of language, but seriously? How much software (enterprise-class, even) is written and continues to be written in C++? I'd wager quite a bit.
      • Templates are too hard? I sincerely hope he's referring to jackasses that try to write an entire program solely out of templates and not the code reuse and simplification they offer. If he's actually supporting the kind of jackass that copy-pastes everything so there are a dozen different copies of a file with 1 change each (previously, I've referred to this kind of programmer as a Duct Tape Programmer in my head)... then fuck you, Joel, that guy is in the cubicle next to mine and I'm the one that has to fix his shit!
      • Multithreading is too hard? When you first heard about it, maybe. Yes it requires a bit of a mental shift from blowing through your whole process in one god-awful, huge, slow loop but asynchronous processes are not rocket science.

      And what the hell is he talking about with "those breathtakingly good-looking young men"? Homoeroticism aside, what does this have to do with anything? The only thing I can see is that he's saying these guys can get away with horrific things (e.g. not writing unit tests, pointer voodoo--wait, I thought we weren't using C++-like languages because they're too hard and you can't ship quickly enough), simply because they are pretty and/or smart. I thought this was also how people got away with over-engineered projects too? The smart, charismatic guy proposes a solution that's over-the-top but everyone is too busy being in awe over his intelligence or their desire to fellate him that no one notices.

      Am I way off-base here? As I said, I usually like reading Joel's stuff and I feel like I've learned a few things from his articles but after this I'm left wondering where he's getting access to such fine recreational drugs and hot, smart programmer guys.

    6. Re:"Don't forget to ship your software!" by thePowerOfGrayskull · · Score: 1

      Why is it that whenever I read an article by Joel I feel like I'm being talked down to?

      Oh, no reason really....

      You, my friend, cannot go out in public without combing your hair. It will frighten the children. Because youâ(TM)re just not that pretty

      ... nope, I don't see it.

    7. Re:"Don't forget to ship your software!" by johanatan · · Score: 1

      Funny! And, COM & multithreading on Windows are not "too hard" either. This is truly a ridiculous article.

    8. Re:"Don't forget to ship your software!" by nobodyman · · Score: 1

      I disagree. I've listened to the StackOverflow podcast and read several of Joel's articles, and I've come to the conclusion that while unapologetic and outspoken at times, he is also right-on-the-money.

      After you've read too many mealy-mouthed, passive aggressive essays that dance around the point they're trying to make, you really start to appreciate Joel's plain, straight-forward manner of speaking.

    9. Re:"Don't forget to ship your software!" by Rycross · · Score: 1

      It seems to me that he's raging against architect astronauts or coders who like to stuff 50 billion design patterns in their code just because they've been told that they should. And I agree, to some degree.

      Adding in abstraction, patterns, and architectural features adds time and complexity. The idea is that by adding some well-understood complexity you can compartmentalize and simplify the overall problem. But that requires that you actually understand why you are doing so. Often times its better to just get the work done, and then clean up the code on a second pass.

      That being said, I think he's taking this too far. Calling out templates is being problematic seems short sighted. Skipping unit testing is only really acceptable if the opportunity cost of not shipping to tighten up testing is high enough to warrant pushing out a potentially-buggy program with high maintenance costs.

      What Joel seems to be missing here is balance: your development process should be in-line with business needs. And you should always, always include support in that analysis. I find that most issues with bad products and lost business are, at their root, because a decision is made to ship a product without realizing that doing so will make the ongoing support issues expensive for you and terrible for the end user.

      As far as multiple inheritance goes, I agree that its bad, but not for the same reasons as Joel. The issue is that multiple-inheritance tends to result in the blob anti-pattern and violation of the single-purpose principle. (Hah, anti-patterns an architect-speak! Take that Joel!)

    10. Re:"Don't forget to ship your software!" by scamper_22 · · Score: 1

      What's even more interesting is how he finishes the post.

      "we'll forgive them if they never write a unit test, or if they xor the "next" and "prev" pointers of their linked list into a single DWORD to save 32 bits,"

      Excuse me? If you're a duct tape; get the job; done programmer, what the hell are you doing micromanaging bits and bytes to save a few bytes.
      The real duct tape programmer just adds another member variable, so they don't waste time or effort or bugs needlessly complicating code.

      The rest of the article is great. I just don't get anything in the last paragraph.

    11. Re:"Don't forget to ship your software!" by marcosdumay · · Score: 1

      That is funny, when I read that, I assume he's talking about himself (as in he's not as good as needed to do duck taping, and that is why he admires it). He can't really know what every reader "looks like"...

    12. Re:"Don't forget to ship your software!" by Anonymous Coward · · Score: 0

      I would rather say that he is an astronaut-publicist.

  16. Balance needed by RogueWarrior65 · · Score: 1

    This concept, like so many others, is a double-edged sword. I personally have seen some brilliant programmers show me some amazing stuff but refused to release it or sell it for nebulous reasons. That having been said, releasing a product that is poorly designed under the hood makes it a nightmare to maintain and can quite easily paint you into a corner. For example, IMHO, nobody should build their own application framework nor should anyone use only what Microsoft or Apple creates. Qt is the right solution because you can concentrate on developing the application and not have to worry about the plumbing. IMHO, this is one major reason why Quickbooks sucks. Intuit should have switched to Qt long ago. The product would have been much better and they'd have the added benefit of true feature parity between the Windows and Mac versions.

    1. Re:Balance needed by thePowerOfGrayskull · · Score: 1

      I'm ... struggling here. If I could summarize: "Sometimes this doesn't work. Oh while I'm on the subject, Microsoft, Apple, and homegrown frameworks suck, use Qt. " I'm just trying to see the point here, or the relation to the actual article...

  17. even better than the duct tape programmer by circletimessquare · · Score: 5, Funny

    is the duct tape manager

    trying to hop in his chair to the phone, arms bound to the armrests with duct tape, screaming MMMMPH MMMMPH through the glorious dull shiny grey of...

    what were we talking about?

    --
    intellectual property law is philosophically incoherent. it is your moral duty to ignore it or sabotage it
  18. How do you program duct tape? by Anonymous Coward · · Score: 1

    I have to admit, I looked at this headline "the duct tape programmer," and thought, how do you program duct tape?

  19. Different approaches for different problems by readin · · Score: 2, Insightful

    Scenario 1: Your client needs an application that will accept data input for approximately 400 different forms, allow those forms to be validated using some rules that are simple and others that are very complex, and put those forms through a fairly standard work flow.

    Scenario 2: Your client needs an application that has 5 different forms used for very different purposes whose data will be processed in very different ways.

    In Scenario 1, you had better do some engineering up front to save you from custom coding the parts of those 400 forms that could have been "over-engineered" into templates, base classes, and interfaces.

    In Scenario 2, it makes sense to duct-tape.

    --
    I often don't like the choices people make, but I like the fact that people make choices. That's why I'm a conservative.
    1. Re:Different approaches for different problems by bjourne · · Score: 2, Insightful

      No. In scenario 1, what should be done is trying to get the customer to reduce the problem. It is unlikely that the customer regularly deals with 400 different forms, much more likely is that at most 5 forms stands for 99% of the traffic and the other 395 are one-off's much to rare to spend time on. The correct approach is to identify those 5 forms, implement the processing for those forms as quickly as possible and then evaluate if the client is happy.

      Then when the system has been delivered, you may refactor the code to add support for the more common of the 395 remaining formats. Trying to implement parsers for all those 400 formats at once is a recipe for disaster. You will get architecture astronauts discussing "what if"-scenarios endlessly while building X layers of abstractions without getting anywhere.

    2. Re:Different approaches for different problems by Ramley · · Score: 1

      Scenario 1: Your client needs an application that will accept data input for approximately 400 different forms, allow those forms to be validated using some rules that are simple and others that are very complex, and put those forms through a fairly standard work flow. Scenario 2: Your client needs an application that has 5 different forms used for very different purposes whose data will be processed in very different ways. In Scenario 1, you had better do some engineering up front to save you from custom coding the parts of those 400 forms that could have been "over-engineered" into templates, base classes, and interfaces. In Scenario 2, it makes sense to duct-tape.

      For me, It makes sense to duct-tape if Scenario 2 is a one-time, non-scaling set of forms. Depending on some circumstances/requirements: if I know that additional forms are going to be required in the future, it makes sense to me to spend a little more time up-front creating a solid framework for easy addition(s)/modifications, thus saving much time in the end.

    3. Re:Different approaches for different problems by Anonymous Coward · · Score: 0

      Nah, for scenario 1, duct tape programmer will simply generate all forms, with custom config includes if file is present (ie: that way everything is generated, and stuff that needs customization gets customized by "if present, then include" file).

      Same for scenario 2 as well.

      Nobody said duct tape stuff is badly designed. In fact, it's usually much better designed, since it can be tweaked and rebuilt with little effort.

      I've yet to meet a "business class" software project that isn't better solved by quick-and-dirty approach. Over-engineering doesn't just cost dev time, it costs flexibility down the road---sort of a difference between Windows GUI approach and unix's shell utilities approach---I can recombine those small programs in a billion different ways to solve any file processing problem in minutes---doing the same in the GUI world would be either impossible or would require actual programming.

    4. Re:Different approaches for different problems by Anonymous Coward · · Score: 0

      Your description seems to be roughly:

      If it's a big project, you should design the solution.

      If it's a small project, you should just write the damn thing.

      Forgive me if I'm misunderstanding.

    5. Re:Different approaches for different problems by Anonymous Coward · · Score: 0

      For me, It makes sense to duct-tape if Scenario 2 is a one-time, non-scaling set of forms. Depending on some circumstances/requirements: if I know that additional forms are going to be required in the future, it makes sense to me to spend a little more time up-front creating a solid framework for easy addition(s)/modifications, thus saving much time in the end.

      The problem is almost every time I've tried such future proofing, either the future requirements never came or they were different enough that my future proofing didn't work. While I won't pass up a flexible design if it doesn't cost too much, I've given up on trying to guess future requirements. It's hard enough figuring out what the current requirements really are.

  20. In Other Words, Agile by tres · · Score: 1

    'Ship early and ship often.'

    But it's definitely no silver bullet; it's not for every project, nor every developer, I've been disappointed to see how integration of Agile via scrum derail projects and upended a department where inexperienced / low skilled developers got overwhelmed by the shift in focus from doing it 'perfectly' to shipping. There's a subtle but significant shift in responsibility from the project manager to the developer. Lots of guys don't like it and really can't handle having things so visible; they're used to being able to hide behind the complexity of their work for days or even weeks without really having any accountability. Agile gives them nothing to hide behind.

    --
    Notes From Under *nix: blas.phemo.us
    1. Re:In Other Words, Agile by Anonymous Coward · · Score: 0

      I think it's a matter of perception and whether you've implemented Agile correctly for your environment.

      In our case, when a developer has nothing to test, he/they lets us know so the rest of the team can plan/act accordingly. The Project Manager should have an understanding as well, and should adjust the plans or ask if this story A belongs in this sprint or should we move it, and bring in Stories B and C that can be completed on time.

  21. Shipping is a feature... by Globally+Mobile · · Score: 1

    Shipping is a feature. A really important feature. Your product must have it.

    Can't really argue with that at all.

  22. Allow more re-use by readin · · Score: 1

    More engineering would be nice if re-use were allowed.

    From what I understand, many government contracts forbid the contractor from taking code written for one contract and applying it to the development of another contract. This apparently can happen even if the customer is the same for both contracts!

    --
    I often don't like the choices people make, but I like the fact that people make choices. That's why I'm a conservative.
    1. Re:Allow more re-use by zippthorne · · Score: 1

      Well, who snuck that into the contract, and which rep allowed it to be added in? If you're working on a project like that, and the reps negotiating the contract don't know that they ought to ditch that clause, you ought to educate them.

      And, if you can, spell it out for them in terms of the time savings that could be used to lower the bid and/or increase profits.

      --
      Can you be Even More Awesome?!
    2. Re:Allow more re-use by Alanbly · · Score: 1

      This is not the case. You just have to be careful how you word your contracts

      --
      -- Adam McCormick
  23. Hope he's not working on a pacemaker by bzzfzz · · Score: 1
    ... or aircraft control and navigation, or banking, or encryption, or much of anything besides consumer products where it's OK to fail once in a while. Different situations require different approaches.

    Spolski is smart and I usually like what he writes, but it's important to remember that he spent his formative years at Microsoft.

    1. Re:Hope he's not working on a pacemaker by Registered+Coward+v2 · · Score: 1

      ... or aircraft control and navigation, or banking, or encryption, or much of anything besides consumer products where it's OK to fail once in a while. Different situations require different approaches.

      I agree, but even in those cases complexity doesn't mean better or more reliable performance. Reliability and predictability is often easier to ensure in a simple solution where there are fewer potential failure modes. Better is truly the enemy of good enough in many cases.

      --
      I'm a consultant - I convert gibberish into cash-flow.
    2. Re:Hope he's not working on a pacemaker by russotto · · Score: 1

      There's only one thing you want LESS than "duct tape" code in a pacemaker. And that's the kind of fancy nonsense Joel's "duct tape programmer" abhors.

    3. Re:Hope he's not working on a pacemaker by bzzfzz · · Score: 1

      ... or aircraft control and navigation, or banking, or encryption, or much of anything besides consumer products where it's OK to fail once in a while. Different situations require different approaches.

      I agree, but even in those cases complexity doesn't mean better or more reliable performance. Reliability and predictability is often easier to ensure in a simple solution where there are fewer potential failure modes. Better is truly the enemy of good enough in many cases.

      Yes, but you probably don't want to skip the unit test, and having a carefully thought-out design might not be a bad idea.

  24. Duct Tape Cat by travdaddy · · Score: 1

    Cruel joke, but...

    A Duct Tape Programmer needs a Duct Tape Kitteh: Yahoo News, Sept. 22.

    --
    Adidas To Bring Back Sneakernet
    1. Re:Duct Tape Cat by Anonymous Coward · · Score: 0

      ....omg!? thats horrible! mr kitty!=[

  25. Netscape a victim of too much duct tape? by ansible · · Score: 4, Insightful

    Curious that JWZ and his time at Netscape were particularly lauded here.

    It's quite likely I'm being a bit snarky here... but Netscape lost the browser wars just a few years after they hit it big. And the core code of Netscape Navigator was bad enough that they eventually abandoned it around 1999 with the start of the Mozilla project.

    Now don't get me wrong, it was only through the herculean efforts of guys like JWZ at Netscape that allowed them to ship a product at all. And certainly it made him and some of the founders a lot of money, which is a valid measure of success in business.

    But to point to that particular code base as an example we all should follow? I don't think so. Certainly, choosing C++ then (or now in my opinion) is a mistake. And I've definitely seen people get overly rambunctious with architecture... especially in the Java world. But I think that's mostly the result of programming languages sucking as much as anything else. That and most people just aren't that good at design. Mostly meaning that when they've come up with a bad design themselves, they can't admit that and then really do what it takes to try and fix it. Of course, in the business world there are always severe time / money constraints, so that makes it real hard. And that's when not having unit tests hurts more... because it is harder to make significant changes to the code and have some assurance you didn't make mistakes.

    1. Re:Netscape a victim of too much duct tape? by teknomage1 · · Score: 3, Informative

      But remember, on numerous occasions Joel has stated how much he disagreed with the plan to rewrite mozilla from scratch. For example: http://www.joelonsoftware.com/articles/fog0000000069.html

      --
      Stop intellectual property from infringing on me
    2. Re:Netscape a victim of too much duct tape? by ansible · · Score: 1

      Yes, and I agree with the sentiment that you shouldn't just re-write code just because it is ugly or something. However, I also remember using Netscape Navigator during that time period. It wasn't a pleasant experience because of the crashes and such. It is quite possible that they could have concentrated and started refactoring the code, and fixing all the bugs. Maybe. We'll never know now. At any rate, even the early Mozilla browser releases were a breath of fresh air compared to Navigator.

    3. Re:Netscape a victim of too much duct tape? by Anonymous Coward · · Score: 0

      You're absolutely right. I worked at Netscape with Jamie in the browser wars heyday (though I didn't know him very well), so I saw a lot of this first-hand.

      As you said, it's to the credit of the early Netscape team that they got something novel done relatively quickly. They were proud to be duct tape programmers -- Jamie often made the distinction between "hackers" (him and the other early Netscape guys) and "engineers" (presumably the squares who wanted too much architecture).

      Subsequent events proved them both wrong. The hacker mentality was proven wrong when that duct-tape code they developed so quickly hit the wall. All those short-cuts meant that adding new features and making changes started taking progressively longer. Remember how in old versions of Navigator pages used to reload from the server when you resized the window? How plug-ins constantly crashed and interfered with one another? How godawful the HTML editor was? These problems were all caused by duct-taping their way into an architectural dead-end.

      But the over-engineering mentality was proven wrong next. Things got so bad that there seemed to be no way to salvage what existed, and so there followed several years of attempts to re-write everything from scratch. (Remember when the new version of Navigator was going to be all-Java?) It's truly miraculous (and a testament to many people's dedication) that this eventually turned into Firefox, but it took a hell of a long time.

      The lesson is of course that you need to follow a middle road. Back in 1997 or so there were efforts under way to incrementally improve things: devise a more loosely-coupled module system, come up with a sane threading model, more carefully separate the user interface from the back-end, modernize the layout engine, and so forth. The problem was that those efforts went too far for the original hackers (out of their comfort zone; seemed to waste time) and not far enough for the new architects (kept too much of that icky legacy code). The hackers won the day, more or less, and so it was duct tape on top of duct tape while Microsoft was out-engineering them.

    4. Re:Netscape a victim of too much duct tape? by Anonymous Coward · · Score: 0

      You are being too nice.
      Guy sounds like a moron who can't handle anything but K&R C written with Emacs in DOS.

      As you said Netscape was crap.

      I've seen many programs that were kicked out the door in a rush with little testing. We call these dead projects or reverse engineering projects.

  26. Certainly true for Joels world of market economy.. by amn108 · · Score: 3, Insightful

    Duct tape programmers may be invaluable tools in Joels world of overpervasive market economy and the corporate, but in some areas of application duct tape just does not cut it. Mission critical applications, like those used in health "industry", expensive satellites and other kind of space vessels, tunnel digging machines and what not - everything that just cannot fail - will not really benefit from Joels so cleverly coined "duct tape programmer" character. Not sure if Joel included these areas as applicable for the "duct tape programmer" attitude, but I just wanted to say I don't think they are. Let duct tape programmers develop Photoshop, and all those benemoths of software that runs slower the faster machines we throw at them, occupy more space for the same set of features and so on and so on - probably nobody notices that anymore, as we all are sworn to content. But the few areas where software quality makes it or breaks it, Joel is off the mark, IMO.

  27. Not that far off from the old axiom... by SixDimensionalArray · · Score: 1

    In a way, I think Joel might just be restating what I have always found to be a core axiom of software design/development:

    "Use the right tool for the job".

    I would add the corollary, if one is a master of a tool, the tool has reasonable support, and one can get a job done with that tool, then there is no need for anything else other than that tool for that specific job.

    It's when you don't have the right tool in your toolkit that things get more difficult. Knowing when you have the right tool/approach, and when you don't and you need another person, approach, or tool makes all the difference.

    I think the idea of saying 50% is good enough is about the fact that you can do a whole lot with just one tool, like using a screwdriver to hammer a nail. It's not the exact right tool for a job, but actually can also get it done too.

    IMHO, anyway,

    SixD

    P.S. Just don't get caught being a tool!

  28. "Shit and fix" coding by RingDev · · Score: 2, Interesting

    I'm completely with you on that one. What Joel is effectively lobbying for is what I've long termed "Shit and fix" coding. You write something dirty but quick to meet the minimal needs of the project. You have non-existent testing, inconsistent modularization, and a maintenance nightmare that crops up every 6 weeks as the application breaks or users request a functional change.

    After a few years the application is such a mess and original knowledge sources are so far gone (documentation? what's that?) that the only option for the company is to recreate the application from scratch. Blowing tens if not hundreds of thousands of dollars on fixing the pile of crap that has been building up.

    There is definitely a balance between over engineering and minimal effort. I've seen efforts to go in both directions. If I had a dollar for every time I saw someone put IO operations on the GUI thread in Windows, I'd be a rich man. But at the same time, I've seen people design data abstraction layers that turn a 3-tier application into a 7-tier "solution".

    -Rick

    --
    "Most people in the U.S. wouldn't know they live in a tyrannical state if it walked up and grabbed their junk." - MyFirs
    1. Re:"Shit and fix" coding by PinkyDead · · Score: 1

      And from a management level the "Shit and Fix" programmer is great because they got the product out the door.

      The "useless one" is the one who comes in to implement the simple feature that the customer wants, but can't. Not because it's beyond him, but because the original thing fails to provide the most important features for any product that is going to grow - maintainability and adaptability.

      However, if I may adapt your motto - the "Quick shit, learn and dump" model actually works quite well.

      --
      Genesis 1:32 And God typed :wq!
    2. Re:"Shit and fix" coding by Anonymous Coward · · Score: 0

      And from a management level the "Shit and Fix" programmer is great because they got the product out the door.

      The "useless one" is the one who comes in to implement the simple feature that the customer wants, but can't. Not because it's beyond him, but because the original thing fails to provide the most important features for any product that is going to grow - maintainability and adaptability.

      However, if I may adapt your motto - the "Quick shit, learn and dump" model actually works quite well.

      Or in other words, Good, Fast, Cheap, pick any two...

  29. Re:True that - NOT by garyisabusyguy · · Score: 5, Insightful

    I manage a small team of programmers. When I first started, I 'inherited' a developer, let's call him Crufty Joe, who had worked at the company for 20 years and had developed financial and hr routines on the old mainframe and spiffy new oracle apps system. Joe had developed a lot of code, but he was always having to perform updates and corrections...

    Why? Because he was a duct tape programmer! He always got it done by the deadline, but then he spent 75% of his time maintaining the huge pile of cruft that he had left in his wake over the years.

    Well, Joe retired and I had to place two developers on his projects for the next year just to clean out all of the old '50% working' routines, in some cases we just tossed the exisiting work and started from scratch. What was really frustrating about this was that the Oracle apps have a huge, nearly incomprehensible, but extremely useful architecture that he did not even bother to leverage, but just wrote around.

    This story acts like stopping to think about what you are doing means that you are going to implement huge, stupid architectures, but in reality he is just making excuses for being a sloppy hack. I feel damn sorry for anybody that has to support this crap in the future.

    --
    Wherever You Go, There You Are
  30. Technical Debt by Herkum01 · · Score: 1

    This issued has been explored before as Technical Debt but most managers and a large number of programmers like to think they are the experts of technical wizardry.

  31. Balance (Re:Bad Mischaracterization) by Tablizer · · Score: 1

    I agree. The best is a balance. It's okay to explore new techniques for making cleaner or more re-usable code, but there are those who become purists and fad zealots and get carried away. The best systems in terms of delivery and maintainability are controlled by a middle ground.

  32. George Patton, IIRC, said something like: by Registered+Coward+v2 · · Score: 1

    A poor plan vigorously executed is better than a perfect one never executed.

    To me, the real value is to know what you can cutout with negatively impacting the customer experiences. far too often people build cost and delays into projects by building in cool when cool is of no value to the customer.

    Not a new idea, and valid today academic exercises are best left to academics where they can't hurt anyone.

    --
    I'm a consultant - I convert gibberish into cash-flow.
    1. Re:George Patton, IIRC, said something like: by david_thornley · · Score: 1

      He also insisted on building planning time into schedules. He said that a battalion attack with four hours planning will take two hours to execute, while a battalion attack with no planning will take eight or twelve, and will be a lot more expensive. (Approximate figures; see one of the appendixes to "War As I Knew It" for correct ones.)

      Patton was a very intelligent and creative person, dedicated to winning with as few overall casualties as possible (regardless of what it might do to individual soldiers or units), and a good teacher.

      --
      "When you have eliminated the unacceptable, whatever is left, however improbable, must be the truthiness" - Holmes
  33. Duct tape is fine, if you throw it away quickly by Alkonaut · · Score: 5, Insightful

    Shipping is easy. Any idiot can whip something together that solves a problem, ships on time etc. That is rarely the issue. The issue is doing it in a fashion that will scale, be extensible, modifiable, understandable, high performing... the list goes on.

    Given enogh time, any idiot could also make a system that is polished and architected to the point where it is fast, modifiable and extensible, and long overdue.

    Bottom line: the whole skill of this business is delivering something that is architected enough while still meeting the deadline. In my experience, the necessary timeframe to deliver something long lasting and well architected is around five to ten times the time it would take to just solve the problem (tm). Of course many business exist today because they managed to release something to make money. The biggest mistake of many startups is probably polishing too much and not releasing early enough. The biggest mistake of those who DO make it past the first release is to not throw the first solution away and start over if it was something duct taped together.

    1. Re:Duct tape is fine, if you throw it away quickly by MBCook · · Score: 4, Insightful

      Everyone seems to be taking this article as "do anything it takes to ship" and saying that's a horrible attitude.

      Your comment is the first I've seen that seems to be more along my understanding of the piece. Duct Tape Programming is about getting what is needed done and building from there.

      "I need a website that lets people share videos".

      So what do you do? Do you make a little site that serves flash videos? That's Duct Tape Programming.

      Making a little site that takes videos and catalogs them and tries to analyze them for similarity and has editing tools and needs to be able to scale to 20 computers and... That's the problem.

      When you start your site, it's OK to have it not be able to instantly scale out to 10,000. Sometimes it's better to get the basic features there and build them up and fix them as you go. Not everything needs to be there from day one. Not everything needs 3 layers of abstraction because it's "what people do".

      As your program goes on, you clean it up, add abstractions where needed. The first version of Word for Windows didn't look ANYTHING like the current version. If you are going to make a new word processor, you go after the old version, not aim at the sky.

      Your understanding of his post agrees with mine. This isn't about a system to last 20 years, this is about a system to fix things NOW while you make it better so your users don't have to keep doing things by hand for 6 months while you try to figure out why your framework build on another framework isn't interacting correctly with some other thing.

      --
      Comment forecast: Bits of genius surrounded by a sea of mediocrity.
    2. Re:Duct tape is fine, if you throw it away quickly by Anonymous Coward · · Score: 0

      Shipping is easy. Any idiot can whip something together that solves a problem, ships on time etc. That is rarely the issue. The issue is doing it in a fashion that will scale, be extensible, modifiable, understandable, high performing... the list goes on.

      You missed the biggest one management and execs care about: money.

    3. Re:Duct tape is fine, if you throw it away quickly by DragonWriter · · Score: 1

      Shipping is easy. Any idiot can whip something together that solves a problem, ships on time etc.

      Given the number of times I've seen major pieces of software that neither shipped on time nor solved the problems the customer really wanted solved, I would contend that, in fact, "any idiot" cannot do that, and that, furthermore, it is often the case groups of individually talented people fail to do that.

    4. Re:Duct tape is fine, if you throw it away quickly by Thantik · · Score: 1

      But honestly, how many of the programs do you use on a daily basis meet the criteria of needing to be extensible, modifiable, understandable, and high performing?

      Now, how many does the average joe use that meet that criteria? In the real world, not everything needs to be extensible and modifiable, or even high performing, just understandable...from a user sense. The user doesn't give a flying you-know-what that the code underneath is spaghetti code, or uses a million gotos, as long as it gets the job done.

    5. Re:Duct tape is fine, if you throw it away quickly by 7+digits · · Score: 2, Interesting

      I really like when people make insightful comments, while shooting themselves in the foot -- hard.

      >As your program goes on, you clean it up, add abstractions where needed. The first version of Word for Windows didn't look ANYTHING like the current version. If you are going to make a new word processor, you go after the old version, not aim at the sky.

      Let me copy page 207 of Taming Wild Software Schedule, because this is just too good to be ignored (you can find the text in amazon by doing a "search in content for WinWord"):


      The development of Microsoft Word for Windows 1.0 provides an object lesson in the effects of optimistic scheduling practices. Word for Windows, aka "WinWord," spent 5 years in development, consumed 660 man-months of developer effort, and produced a system of 249.000 lines of code (lansiti 1994). The final 5-year schedule was approximately five times as long as originally planned. Table 9-1 on the next page summarizes WinWord's scheduling history.

      WinWord had an extremely aggressive schedule. The shortest possible schedule for a project of its size is about 460 days. The longest estimate for WinWord 1.0's schedule was 395 days, which is 65 days shorter than the shortest possible schedule.

      Development of WinWord 1.0 contained classic examples of the things that go wrong when a software project is scheduled too aggressively:
      â WinWord was beset by unachievable goals. Bill Gates's directive to the team was to "develop the best word processor ever" and to do it as fast as possible, preferably within 12 months. Either of those goals individually would have been challenging. The combination was impossible.

       

      No hard feeling, but that was too good to miss. Anyway, it can actually be used to prove your point: they aimed too high. But, being Microsoft, they succeeded anyway. Overall, I am almost ok with your argument. The only dark side, is that sooo many companies now deliver crappy duct tape one-shot software that hardly work, and never update it, because they go under due to pissed customers...

  34. The problem with Duct Tape Programmers by JohnWiney · · Score: 5, Insightful

    is Release 2.

    1. Re:The problem with Duct Tape Programmers by bughunter · · Score: 1

      Agreed - as in, they never get to it.

      When I worked in software QA in the 1990s, I watched our Project Managers hire young programmers who were willing to kludge a Release 1, and force us to let it out the door. As customers made our support team (often including the same young programmers) aware of the true semi-gluteal nature of the product, these young engineers would change jobs, thereby avoiding maintenance of the code.

      As a result the project manager will never fund corrections to any but the worst bugs and poorly-designed features in Version 1. Instead, when the customer wanted Version 2.0, engineering would choose to build a new app pretty much from scratch rather than try and fix the original version. Sometimes the product manager would get wise and do some systems engineering up front, but usually not...

      And worst of all, this was not commercial software -- this was software for NASA space observatories and their ground systems. Fortunately, by the end of the decade, our customers (the prime contractors) would start requiring more and more software process documentation... and I had moved on to project management.

      --
      I can see the fnords!
    2. Re:The problem with Duct Tape Programmers by Darinbob · · Score: 2, Interesting

      No, duct tape usually starts in Release 2. Release 1 usually has an architecture that does just what Release 1 needed, and is flexible enough to handle certain modifications that thought might be necessary in the future. But Release 2 adds a new feature that just can't fit into the architecture, and is something no one anticipated. Sometimes the original architecture turns out to be too rigid, or sometimes it's incredibly flexible but no one can figure it out (release 1 programmers are often not around anymore). Sometimes it's Release 3 or 4 where the duct tape first has to come out.

    3. Re:The problem with Duct Tape Programmers by marcosdumay · · Score: 1

      Or sometimes people take the worse route, and create the release 2. Rewriting a few things that you did badly on a single release ins't much of a problem (and now you have a revenue stream, and some confidence on the software's potential). But this time greed often speaks loud, and people let the rewriting for later, adding to the cluter until development almost stals, and all the revenue is spent maintaning the system.

  35. FINALLY! ENLIGHTENMENT! by oo_HAWK_oo · · Score: 0

    I have been making this point for years only to be told I was an idiot. Look. Just because you can cram data into XML files, doesn't mean you should! Why use a database when a flat file makes more sense? I don't believe his promoting bad programming habits, I think he is trying to say, don't over complicate the simple things in life. I don't need a freaking API written when I can just query the damn database myself! KISS = Keep It Simple Stupid!!

  36. Isn't this Microsoft? by Anonymous Coward · · Score: 0

    Surely they aren't release-early-release-often, but they release their products with massive numbers of features which "just work" enough that people can get some productivity out of them and keep using them until something else comes along.

    "Real artists ship" ... Yeah, and so do mega-corporations with crappy uber-apps. Can we please not follow the YC path and please stop posting blog entries that are 3 paragraphs long, expelling the virtues and personal opinions of an egomaniac?

    1. Re:Isn't this Microsoft? by mr_e_cat · · Score: 2, Insightful

      Microsoft's problem is probably that they are a weird combination of duct tape programmers and architecture astronauts. They create a massive complex architecture which they can't complete and then ship it. Google seem to be able to deliver. But they use Java, Python and C++. All heavily OO. I wonder if they use templates, multiple inheritance etc.

  37. Except.... by Anonymous Coward · · Score: 0

    "a 50%-good solution that people actually have solves more problems and survives longer than a 99% solution that nobody has because it's in your lab"

    1) Solves more problems, but creates as many as it solves

    2) Survives longer because you're too busy putting out the fires caused by #1 to re-architect (and busy holding awards ceremonies for the idiots who "fixed" the avoidable problems they caused in the first place)

  38. Lotus Notes by metamatic · · Score: 1

    This is what a lot of people fail to understand about Lotus Notes. It's not supposed to be beautiful and elegant and petite; it's a humongous roll of duct tape. It's ugly, but it gets the job done, and can often get you from nothing to "50%-good solution" in an afternoon.

    [Opinions mine, not IBM's.]

    --
    GCHQ Quantum Insert installed. If only our tongues were made of glass, how much more careful we would be when we speak
  39. Your post was not a very by Anonymous Coward · · Score: 0

    interesting comment.

  40. Joel Spolsky, meet TheDailyWTF by diamondsw · · Score: 5, Insightful

    My respect for him ratcheted down quite a lot. Yes, you must ship (who knew?). That's what milestones and deadlines are for, so keep overarchitecting and feature creep from occurring. However, I would NEVER want to let a "Duct Tap Programmer" near any project that I would ever have to modify, maintain, or extend. You know, something that isn't completely trivial.

    --
    I don't know what kind of crack I was on, but I suspect it was decaf.
    1. Re:Joel Spolsky, meet TheDailyWTF by The+Raven · · Score: 2, Interesting

      Refactoring is an art that all programmers should cultivate. It turns shitty code into nice code, without breaking it or losing all the bug-fixes that have been hacked in over the years. In most cases, ugly code needs refactoring, not rewriting.

      --
      "I will trust Google to 'do no evil' until the founders no longer run it." Hello Alphabet.
    2. Re:Joel Spolsky, meet TheDailyWTF by Anonymous Coward · · Score: 2, Informative

      Yeah, try this with an asynchronous distributed system that was hacked together by duct-tape-programmers. Any attempt to refactor the code pops up unexpectedly as a distributed deadlock, message loss, transaction failure. Good luck with that...

      I had this at SUN Microsystems and it was enough for the rest of my life...

    3. Re:Joel Spolsky, meet TheDailyWTF by Anonymous Coward · · Score: 1, Insightful

      Exactly. He seems to think that the alternative to over-architecting is not architecting. Um, what about just properly architecting?

    4. Re:Joel Spolsky, meet TheDailyWTF by Anonymous Coward · · Score: 0

      Good thing our friendly duct tape programmer wrote unit tests... oh.

  41. Steve Jobs???????? by beelsebob · · Score: 1

    The comparison to Steve Jobs is... weird.

    Steve Jobs is *famous* for holding products back because they're not polished enough. He's famous for wanting products that do not very much, but what they do, they do right. He's famous for not shipping half assed solutions.

    Rather the opposite of what the summary suggests.

  42. WTF HAPPENED TO SLASHDOT? by miknix · · Score: 1

    An /. article just disappeared into oblivion. Was it a hash collision?
    Just image the probability of that occurrence!
    Oh noes, the world is going to explode!
    WE ARE ALL GOING TO DIE!!

    Seriously, look at http://tech.slashdot.org/story/09/09/24/238251/Microsoft-Releases-Prototype-of-Research-OS-Barrelfish
    The article content doesn't match article link name. User's comments also refer to old article.

    I hate to say but slashdot is b0rken.

    1. Re:WTF HAPPENED TO SLASHDOT? by zubiaur · · Score: 2, Funny

      Calm down, they just run out of duct tape.

    2. Re:WTF HAPPENED TO SLASHDOT? by Frankie70 · · Score: 1

      I hate to say but slashdot is b0rken.

      Maybe CowboyNeal is a DuctTapeProgrammer?

  43. Architecture astronauts by Aceticon · · Score: 5, Interesting

    I don't think this guy ever worked with any software engineer with any significant amount of experience. Or maybe he just works with people that suck as software engineer.

    The typical evolution towards wisdom in Software Engineering goes like this (simplified):

    • Starting by making small programs or programs supposed to be used only once (i.e. school assignments)
    • Transition 1: Discovery of code reusability, the problems with copy & paste coding and how using methods lets you partition your code into more easy to understand blocks - this is when one transitions beyond junior developer
    • Transition 2: Discovery of the concept of software design and how it makes for more adaptable code which is easier to understand and how it helps main complexity small as the size of the program increases - this is when one transitions into junior designer
    • Transition 3: Discover that there is such thing as too much design. That over-designing decreases maintenability, makes the code harder to understand by others and by oneself in the future. That the flexibility that the real world will require from the code will rarely match one's initial idea of what should be made flexible during design and that trying to create a top-to-bottom design that covers all eventualities actually results in an inflexible system. Above all, discovery of the value of the KISS approach: don't design/implement a specific something now because you think you will need it later, it is often easier to do it then if you do actually need it and you probably won't need it and are just making for big code instead of useful code. At the same time discover that newer isn't always better when it comes to software tools, languages and frameworks and that coolness and hype are really bad things to focus in when choosing something to use in an professional IT project - this is how you get medior designers and senior developers
    • Transition 4: Discover that creating software is actually a process not an act. That a lot of things serve as feed-ins to the actual design and development of software and a lot of things feed out from it. That software isn't just made, it lives, evolves and gets changed. That making an application is easy (no mater how big and complex) and making the right application which does what's need in the right way for the users of the application is what's hard. That the quality of your feed-ins (requirements, analysis, time, people and all manner of preparations) is much more relevant to the success of a project than the code or the design. That over the long run, the true quality of the code and design is measured by how easy it is to regression test, maintain, support, extend and by how fast new designers/developers can pick up the code (which are some of the feed outs) - this is how you get senior designers and technical analysts.
    • Transition 5: Discover that the applications your develop are part of an ecosystem. That software talks to software that talks to software. That many applications need to do many of the same things, only in slightly different ways. That standardizing (up to a level) things like certain kinds of exchange of information between applications or the kind of libraries used for certain common functional areas (such as multi-system logging, single-sign-on, messaging) will make for increased overall productivity and maintenability (develop and maintain a single implementation for each and distribute it as a library). Discover that standardizing on a reduced number of mature programming languages makes it easier to find people to work with them and move people around to different projects and systems - this is how you get technical architects

    At best what the guy in the article is calling "duct-tape programmer" is somebody past the 3rd transition only and what he calls and "astronaut architect" is somebody past the 2nd transition only.

    I would hardly call a junior designer type "architect".

    1. Re:Architecture astronauts by Alanbly · · Score: 1

      I agree verily.

      --
      -- Adam McCormick
    2. Re:Architecture astronauts by Cyrano+de+Maniac · · Score: 1

      If only I could mod the parent +1 Insightful and post... but I'll choose posting.

      Most of the commenters do not realize that Joel is, at the heart of things, railing against over-complicated design more than praising lazy programming practices. Unfortunately that's not how he titled the article, and the reaction is thus predictable. I sincerely doubt he'd advocate sloppiness of code or design.

      Unfortunately there are very non-junior designers who never make transition #3 (or maybe they regressed). As a result of their seniority and presumed competence, they are placed in a position to over-engineer solutions, miss market opportunities, and starve less elegant but competing solutions of the manpower and attention which bring the 50% solution up to a 95% solution. And unfortunately when their supervisor is too busy with other business concerns and a bit out of date with their technical knowledge, the necessary checks on over-engineering don't get applied. Couple that with politics/turf/etc typical of many businesses, and the non-over-engineered solution loses out. The entire organization suffers as a result, missing deadlines, solutions that aren't, and eventually it impacts the bottom line.

      Personally I haven't made transition #4, however I'm starting to glimpse what it means. I'm not yet convinced that I care enough to make that transition, but I think that's a normal part of the process of growing.

      --
      Cyrano de Maniac
    3. Re:Architecture astronauts by Anonymous Coward · · Score: 0

      Discover that the applications your develop are part of an ecosystem. That software talks to software that talks to software. That many applications need to do many of the same things, only in slightly different ways.

      Or what he calls Duct Tape Programmer. Perhaps you just didn't like the name. Maybe you would prefer "technical architect"?

    4. Re:Architecture astronauts by Xordin · · Score: 1

      The idea of a programmer getting better in transitions is a fantasy. Programmers start out good or bad, and on average don't improve much. They move up the ladder by getting more knowledgeable about the organization; coding less, and talking more.

      You sound like you moved past the coding long ago.

    5. Re:Architecture astronauts by Anonymous Coward · · Score: 0

      I don't think this guy ever worked with any software engineer with any significant amount of experience. Or maybe he just works with people that suck as software engineer.

      <sarcasm>Yeah, Spolsky's only worked with second-rate talent. Thank goodness you're here to set the record straight.</sarcasm>

      Congratulations. You may be the only person on the planet to out-hubris Spolsky.

      I don't think you read the article. (Skimmed != read.)

      Yes, he can be wrong about things, but these comments on the article might as well be about a completely different article than the one that was actually written.

      He is not talking about people who write spaghetti code and just get the app out the door. I can understand why someone might think that, if the only words they read from the article were "duct-tape programmer".

      He is talking about very talented people that, as he notes in the conclusion, are exceptionally rare. Most people who might *think* they're good duct-tape programmers are lazy programmers making excuses for their bad practices. As he makes clear, these are not the people he's talking about.

    6. Re:Architecture astronauts by 7+digits · · Score: 1

      > I don't think this guy ever worked with any software engineer with any significant amount of experience

      He designed Excel Basic, and did quite a lot of work on VBA, so you can't wipe his experience away. Also, I beleive that there are some experienced engineers at FogCreek

      Anyway, the guy is an ass, and loves making outrageous statements. I guess it is because he have to rationalize about how could it be that, being as smart as he think he is, he ended-up with a nice looking web application written in the most evil kludge one could envision. Of course, his inner coherence is getting slowly shredded into pieces after that...

    7. Re:Architecture astronauts by Anonymous Coward · · Score: 0

      Just because you have not been able to "transition" or can't see it it possible does not mean others don't do it.

      Sad to see that comment from a low id, but experience does bring continuous reassessment and refining of one's ideas.

    8. Re:Architecture astronauts by Aceticon · · Score: 1

      For me some of the transitions where "awakenings" while others just slowly dawned on me.

      They might be different for others, the borders I defined are illustrational, some stages overlap and the order might be different (I did transition #4 before #3).

      That said, I know plenty of people with lots of years in the industry who never did go through the later transitions (it's often hard to turn around from a "code oriented view" into a "what-does-my-software-achieve oriented view").

      I still do a lot of coding. The difference is that nowadays long before I start coding I'm making sure that me (and others) will be doing the right coding to achieve the right objectives.

  44. Does it all mean that by schreiend · · Score: 1

    Duct Tape Programmers produce Fog Bugz?

  45. programming is not architecture by Anonymous Coward · · Score: 0

    would you drive on a bridge that only went 99% of the way across?

    1. Re:programming is not architecture by turgid · · Score: 1

      would you drive on a bridge that only went 99% of the way across?

      If the missing 1% were of the order of one centimetre, I might.

  46. Ruel of Thumb by cmiller173 · · Score: 5, Insightful

    Always write code as if the guy who has to maintain it is a sociopath who knows where you live.

    1. Re:Ruel of Thumb by gestalt_n_pepper · · Score: 5, Funny

      Well yes, but it's me and it's usually my own code. Perhaps this explains why I keep meeting myself in the halls.

      --
      Please do not read this sig. Thank you.
    2. Re:Ruel of Thumb by elfprince13 · · Score: 2, Funny

      and I always thought "if you can't read my code you just aren't 1337 enough" was the proper rule of thumb for software development.

    3. Re:Ruel of Thumb by Anonymous Coward · · Score: 0

      Perhaps this explains why I keep meeting myself in the halls.

      That's fine as long as you don't start beating yourself up when you meet yourself.

    4. Re:Ruel of Thumb by Anonymous Coward · · Score: 0

      Always write code as if the guy who has to maintain it is a sociopath who knows where you live.

      To keep him stuck working late and unable to go after you?

    5. Re:Ruel of Thumb by oldspewey · · Score: 3, Funny
      --
      If libertarians are so opposed to effective government, why don't they all move to Somalia?
    6. Re:Ruel of Thumb by some-old-geek · · Score: 1

      Unfortunately the current strategy seems to be "don't maintain, rewrite." Regardless of the quality of the original code.

  47. LOLWUT? by 0xdeadbeef · · Score: 1

    People who know better don't listen to Joel Spolsky. He's the John Dvorak of programming.

  48. Re:True that - NOT by avandesande · · Score: 1

    My idea is that a good duct tape coder does mostly procedural code that is well named, strongly typed and designed by contract. I don't think that is what you are describing here.

    --
    love is just extroverted narcissism
  49. It is good (for the programmer) by presidenteloco · · Score: 1

    Delivers fast, gets paid, walks away, starts running to avoid being hit by the shrapnel.

    Not so good for those who are left to pick up the pieces.

    --

    Where are we going and why are we in a handbasket?
  50. Masking Tape Programmers by flyingfsck · · Score: 1

    Sooo, if DucTape Programmers work at Apple, do Masking Tape Programmers work at Microsoft?

    --
    Excuse me, but please get off my Pennisetum Clandestinum, eh!
  51. Multiple Inheritance Is Duct Tape by Ukab+the+Great · · Score: 1

    I've always viewed multiple inheritance as the hallmark of duct-tape programming. Being (correctly) forced to do single inheritance forces you to do proper architecture (but not architecture for architecture's sake), abstraction (within reason), and seriously think about the structure of your program.

    There's nothing more duct tape then slamming a bunch of random classes together into one class.

    1. Re:Multiple Inheritance Is Duct Tape by Alanbly · · Score: 1

      Ah, a Java programmer...

      --
      -- Adam McCormick
    2. Re:Multiple Inheritance Is Duct Tape by Ukab+the+Great · · Score: 1

      Objective-C, actually. Were I a Java programmer, there wouldn't have been the second and third qualifiers between parentheses in my original post.

    3. Re:Multiple Inheritance Is Duct Tape by Alanbly · · Score: 1

      We are what we code. When you've coded in enough languages you realize that the language doesn't matter, but you can still tell where the biases come from.

      --
      -- Adam McCormick
    4. Re:Multiple Inheritance Is Duct Tape by DragonWriter · · Score: 1

      I've always viewed multiple inheritance as the hallmark of duct-tape programming. Being (correctly) forced to do single inheritance forces you to do proper architecture (but not architecture for architecture's sake), abstraction (within reason), and seriously think about the structure of your program.

      Its quite possible to do duct-tape programming in languages that force single inheritance, and its quite possible to architect things well in languages that feature multiple inheritance. (Even resulting in designs that use multiple inheritance.)

      Its also possible to do both in languages that don't feature inheritance at all (because, e.g., they don't use class-based OOP as a their main paradigm.)

    5. Re:Multiple Inheritance Is Duct Tape by Anonymous Coward · · Score: 0

      Not really: consider this example: SpecialCustomer extends Customer implements Cloneable, Comparable: is multiple inheritance: SpecialCustomer is a Customer, can be cloned, and be hashed. The above is an example utility multiple inheritance.

      There is a corollary: repeated inheritance: DoublyLinkedList extends LinkedList (rename as left), LinkedList (rename as right): where the link manipulation is abstracted and inherited repeatedly with appropriate syntactic sugar so that the compiler does not do some "virtual base" classumptions!!

      Now for the real diamond (pun intended): A TeachingAssistant is a Teacher, and Staff and both Teacher and Staff are Person. Of course this example is quite common and in Java, Objective-C perhaps this would be implemented as an interface.

      Many more examples actually lend themselves to multiple inheritance than the Gang of four would like to admit, unfortunately. FWIW, I thought Eiffel had an elegant language proposal to address this.

  52. Re:True that - NOT by AnotherUsername · · Score: 1

    It's almost like he is in full support of spaghetti code. This guy probably would've had Duke Nukem Forever out already, but only the first level would've actually worked the way it was supposed to...until patches 1.01 through 6.8 came out. But hey, it mostly kinda works...on Sundays...during full moons...

    --
    I don't like Linux. This doesn't make me a troll.
  53. Re:True that - NOT by Aceticon · · Score: 2, Insightful

    The duct tape programmer represents those developers that "just want to do it".

    Their comfort zone is coding so they really what to start coding and "see things moving" asap. They'll work really hard, go down coding/design dead-ends and back, re-write whole sections of the code, work long hours and eventually deliver something .... that doesn't do what's actually needed (say, because a requirement wasn't double checked with the users, or the format of the data being exchanged with some other system wasn't properly hammered-down with the guys developing the other system or the chosen technology can't deliver the needed performance or any other of a million reasons). Crazy last minute adjustments and re-writtings follow and what comes out is a "not exactly what we needed app", from start held together with spit and chewing-gum.

    Compare this with somebody that works smart and takes some time to prepare up front before starting coding (things like checking requirements, hammering down message formats, making sure the chosen technology can deliver) and at the end delivers something that not only works but also does what is needed and, just as important, keeps on working without requiring constant baby-sitting.

  54. Re:True that - NOT - RTFA by garyisabusyguy · · Score: 1

    FTA:
    "Zawinski didn't do many unit tests. They "sound great in principle. Given a leisurely development pace, that's certainly the way to go. But when you're looking at, 'We've got to go from zero to done in six weeks,' "

    Oh yeah, abandoning unit testing to get code out the door!

    Maybe you got confused by his depiction of the architecture idiot at the beginning, but the core idea of this article is to abandon anything that slows delivery...

    Seriously, no Unit Testing???

    --
    Wherever You Go, There You Are
  55. Productivity. by sitarlo · · Score: 1

    From 20+ years experience I can confirm that my personal productivity is greater when developing in "Anarchy" mode. When I work on a team that employs rigid methodologies I find that development output slows down significantly and that the resulting software is of no greater quality for the extra time spent building it. I also find that creativity is greatly reduced, and in many cases, devalued completely when using cookie-cutter techniques. This observation doesn't mean I don't see the value of discipline or patterns, but do I think programmers need to balance creativity and organization. It is the balance between power and control that allows something to navigate at high velocities. I suppose the same could be said for programming.

  56. Maintenance sucks... by stacybro · · Score: 1

    A problem with duct tape programming can be that after each delivery you spend a little more time each week doing maintenance on the code that you "delivered". Not that this doesn't also happen with over-engineered apps but more so with under engineered apps. Eventually you have delivered so much that you are spending 100% of your time doing maint and it is time to get a new job.

    on time, on budget, all functional ---- choose two.

  57. It comes down to the Business Need by BlueBoxSW.com · · Score: 1

    What we are all here to solve, at the end of the day, is a Business Need.

    And your design document can never be more accurate than the definition of the business need.

    If your solution is well written and matches the design document, yet is unable to solve the business need, you've missed the mark.

    If your solution has some flex in it, and maybe ever some performance issues, but solves the business need, it's a win.

  58. As a duct tape programmer, I strongly disagree. by dunkelfalke · · Score: 2, Interesting

    Well, I am - more or less - a duct tape programmer, coming from the embedded field of work.

    Two months ago I took a Java training course, never bothered to learn the language right before. One of the students at the training was a woman in her mid-forties, former quality assurance, with a wish to develop software. Last time she has written real code by her self was at the university 20 years ago. After that she only has read other people's code, tested it, found bugs there.

    After a couple of days of introducing Java and the whole OOP concept, the teacher gave us some exercise. I don't remember what it was exactly now. What I do remember is that I hacked some code together, not bad at all, with lots of features, much more than it was needed, but since I was so fast, I was very smug about it.

    Then the teacher showed my code to all students first, said it was a pretty nice solution with some tricks he never had thought of. Then he showed us her code. That woman had neatly written the task down first, planned everything carefully on paper and then implemented it, with lots of comments and an extremely clean and well-engineered code. Her solution wasn't quite as sophisticated as mine, but the code was so much more readable...

    The teacher said that such code was the way to go, and as smug as I was over my solution, I had to admit that her job was much better done. Sure, features are great but clean, maintainable and well-planned code trumps in long term.

    --
    "It's such a fine line between stupid and clever" -- David St. Hubbins, Spinal Tap
  59. Re:True that - NOT by Tablizer · · Score: 2, Insightful

    I'm working on slop-bucket code like that now that I inherited. It's frustrating, but having seen this odd phenomenon before, I realized something: Reactionary programmers develop better reactionary skills to compensate. Sure, they are fixing things often, but they are also fairly proficient at digging around in spaghetti and fixing it. Cleaner approaches atrophy one's skills at ad-hoc repair such that you *have* to rely on cleaner approaches. You become a less-skilled trouble-shooter.

    I'll still take the cleaner approach over the ad-hoc approach (barring over-engineered red-tape code), but for some reason the ad-hoc approach is "good enough" in the hands of a good ad-hoc-er. It's an odd thing to witness.

    I've also seen another guy type (keyboard) at 100-miles-an-hour as he kept reinventing the wheel. He expressed no interest in further automation and abstraction to simplify the process. I think he had a kind of A.D.D. that made him want to be moving all the time. It's almost as if the guy with tweezers can mow the lawn almost as fast as a guy with a lawn-mower because he tweezed so damned fast. It may work as long as he doesn't get repetitive motion injuries.

    I'm not endorsing ad-hoc-ism and mass repetition, but only saying that the down-sides may not be as big as one would think. Those who engage in the practice are often determined and resourceful survivors who find a way to work with what they know and are good at.

  60. Duct tape is an all time favorite topic by rcolbert · · Score: 0

    I love the duct tape analogy here. I can't help but recall that duct tape itself has a history loaded with irony. Duct tape is one of the most successful products in history, with thousands of uses and strong sales, decade over decade. However, duct tape is particularly bad at one thing - as tape for duct work. Yes, duct tape doesn't tolerate the temperature changes common to duct systems, and therefore is particularly bad at the one purpose it was designed for in the first place. Hopefully, duct tape programmers are good at writing portable code.

  61. Well by Alanbly · · Score: 1

    Duct tape programming has it's place and it's called the prototype. A really good programmer builds the elegant solution faster than the hack anyway, because hack never really work. Making smart design decisions corrects most of the author's complaints about "shiny" new features that are too complicated. I dispute that C++ is difficult to code, if you don't like templates then don't use them. As far as multi-threading is concerned, get a real degree, take an operating systems or programming languages course and get over it.

    IMHO if you can't build good threaded code in C++ or Java you need to stop calling yourself a Programmer and leave the software development to those of us who do it the right way.

    --
    -- Adam McCormick
  62. Re:ROI by TaoPhoenix · · Score: 1

    I'd point to the Non-Zero Return part of ROI when it ships. Someone can spend a month doing a .01 release to clean up the ugliness after it sells as a free update.

    --
    My first Journal Entry ever, in 8 years! http://slashdot.org/journal/365947/aphelion-scifi-fantasy-horror-poetry-webzine
  63. Good enough by yerktoader · · Score: 1

    is the enemy of quite a lot. Got us all of these wonderful new craptastic "killer apps" companies push these days. Have fun with your Execu-speak.

  64. Re:True that - NOT by Dallas+Caley · · Score: 1

    I think it all kinda depends on where you are. sometimes you have no choice but to be a duck tape programmer. if they want it done next week or your job is on the line then you do what you have to to make it work. the problem comes when someone doesn't realize that there is another way. I'm sure your "Crufty Joe" was at his position long enough and had enough expertise to be able to convince the bosses "hey we need to spend some time and clean up this code" but instead he just kept going on his way.

    I've had this same problem in the graphic design business. i spent a good portion of the last few years cleaning up designs made by my predecessor (and even ones made by me before i knew how to do it correctly) so i get it. but now that i'm trying to break into the programming world i find myself having to resort to duct-tape style coding just to get stuff done, what looks better on your resume? a website that you hacked together that looks like crap in the back end that someone else had to spend a year cleaning up, or no website at all?

  65. Re:True that - NOT - RTFA by avandesande · · Score: 3, Insightful

    Okay I will give you that- not unit testing is pretty stupid. I guess there is a happy medium between the astronaut and the duct tape guy.

    --
    love is just extroverted narcissism
  66. Re:True that - NOT by Anonymous Coward · · Score: 0
    Notice that Joe RETIRED. That means he was able to survive long enough to retire. He was smart enough to get priorities getting it done on time ahead of prettiness, and wise enough to realise that making it necessary to have 2 programmers around to take over for him made it very unwise to get rid of him. He spent 75% of his time correcting things with his own cruft which meant he probably fixed it in 1/10th the time it would have taken anyone else but reported that it took only 1/2 the time someone unfamiliar with the code would have spent. The difference, he pocketed in slashdot reading hours, or in low stress ( if I am behind then I can use some blogging time to catch up ). This also helped him keep his job.

    Why was Joe a Duct Tape Programmer? Because he learned long ago that being an archetecture astronaught means most programmers won't really understand what you are doing, and will contribute retarded changes that will end up making the system more complicated than it would have been without the abstraction intended to simplify things. Better not give the fucktards you work with and who will have their fingers in your project more power to fuck it up than absolutely necessary. In Joe's spare time ( some of that 75% ) he develops the high quality code which cleverly uses the latest software engineering principles to be able to ship a product all by himself that ALLOWED him to retire.

  67. Java Sucks then.... by mr_e_cat · · Score: 1

    whey hey!!!!

  68. Re:True that - NOT by avandesande · · Score: 1

    I recently had to deal with the worst of both worlds- a guy who coded like sht yet wanted to use EVERY new gewgaw released by MS for .NET.
    The code was only followable by using the debugger- and he was a debugger pro (I hardly ever use it)

    --
    love is just extroverted narcissism
  69. Re:Real artists ship... by mhelander · · Score: 1

    Modded troll? Parent is on topic and pretty insightful IMHO...

  70. Re:True that - NOT by Anonymous Coward · · Score: 0

    that isn't what I would call "duct-tape programming," it's what i would call "terrible, reckless, silly programming"

    captcha: moisten

  71. Re:Certainly true for Joels world of market econom by mr_e_cat · · Score: 1

    Duct tape programmers may be invaluable tools in Joels world of overpervasive market economy and the corporate, but in some areas of application duct tape just does not cut it.

    I agree but would add one thing. In mission critical apps, simplicity is extremely important. These guys don't go for the "classes constructed entirely from multiple inheritance from templates" approach either.

  72. Worse is better by RiotingPacifist · · Score: 1

    it is not 1989. we are not academia. oh and get off my lawn!

    Seriously how is this post new, or anything about it new?

    --
    IranAir Flight 655 never forget!
  73. No objective measurement by gestalt_n_pepper · · Score: 1

    How many shops do you know of that measure number of post-release, customer-reported bugs before and after the latest switch to [insert wonder software development method of choice here]?
    .
    There's lots of talk, but not much objective research. Scrum, Agile, Patterns, Unit Tests, et al. All can be gamed (particularly unit tests) to please management. The improvement seems to be a matter of faith more than anything.
    .
    Has anyone done meaningful measurements? If so, what did you find?

    --
    Please do not read this sig. Thank you.
  74. Except for one thing... by Erbo · · Score: 1
    Does it hurt the book's (and Spolsky's) thesis to note that JWZ isn't a professional programmer anymore?

    "But now I've taken my leave of that whole sick, navel-gazing mess we called the software industry. Now I'm in a more honest line of work: now I sell beer." (Source)

    --
    Be who you are...and be it in style!
  75. In my world by Kjella · · Score: 1

    ...duct tape code is like the bad version of glue code. Instead of adapting two things that are modular and should work together, you have two completely different things that are just duct taped together with a ton of tape, and with lots of sharp edges tearing at it. Duct tape code can take you from a complete and utter failure to a mediocre result that's shippable, but it's never a very good solution. But if you know IT, you know most of it is built on workarounds of workarounds and pretty much the one rule of software is that if you knew what you know now, you'd never build it that way.

    --
    Live today, because you never know what tomorrow brings
  76. There's a place for only Duct Tape Programmers... by eagee · · Score: 2, Interesting

    It's called the video game industry. That kind of methodology works there because you're generally not going to be maintaining the code base once it ships. There are three types of people you need to have a viable and successful team:

    1. People who can do abstractions, design, and estimation.

    2. People who can implement those designs (Duct Tape programmers are perfect for this).

    3. People who can do a little of both.

    I call bullshit on any one of these groups pointing the finger to the other and saying, "My way is best". If you had an office of nothing but designers you'd have a different but similar set of problems.

    I've seen projects run only by duct tape programmers fail miserably in the field when extensibility and maintenance are required, but when we added a designer to that same team and rewrote the same project we delivered a bug free implementation with a 10 fold performance increase, and no significant bugs. That wasn't magic, it was just taking the time to do the damn thing right (and no more time than that).

  77. Duct tape programming is bullcrap by JustNiz · · Score: 1

    Anybody that does it shouldn't consider themselves a professional.
    Its simply an excuse for doing a sloppy job and leaving your shit for other people to sort out.
    I hope I never have to be the one to support this guys hacky code.

  78. Not okay for many fields by Kagato · · Score: 1

    Duct tape programing seems apt for the silicon valley set that has to ship something before someone else eats your lunch. I accept that they do what they have to do. But the rest of us that practice our craft in banking, insurance, medical devices, etc? No way. You can't afford duct tape mistakes.

    1. Re:Not okay for many fields by rgviza · · Score: 1

      LOL yea right. Banking and insurance, no duct tape? Those places are duct tape palaces.

      --
      Don't kid yourself. It's the size of the regexp AND how you use it that counts.
  79. Fuck duct tape programmers by Anonymous Coward · · Score: 0

    Yeah, I know duct tape programmers, I've worked with too many of them. They are the guys who jump from company to company starting projects and never having to maintain the hacked up poorly thought out pieces of shit they leave behind. Fuck those idiots, I've seen two companies get crushed under the weight of maintaining applications written by guys who don't even consider maintenance when writing their code, only completing the project so they have something nice to put on their resume in order to dupe another hapless company into letting them lead another new project that will fail because it wasn't built with long term maintenance in mind.

  80. Mod parent up. However overengineering still sucks by coder111 · · Score: 1

    Well said. I agree that "architecture astronauts" are around phase 2 only, but that doesn't mean they don't get a job where they can force their ideas onto others. It's not too hard to impress whoever is interviewing your by knowing too many buzzwords and ideas of grand designs.

    However, I agree with Joel that overengineering is evil and is probably a more serious issue than underengineering. And by "Duct tape programmers" he doesn't mean programmers that wrote CRAP code. He means programmers that add code that works and doesn't introduce more complexity than is absolutely necessary. And I agree that this is a good thing. With current development tools if you have relatively clean code (preferably unit tested), you can refactor it and add abstraction layers, interfaces, flexibility etc. at a later date when that is needed.

    "Duct tape development" is actually promoted by Agile development model. You are supposed to write only the code that is needed NOW to solve THIS problem and refactor later. Unit tests are supposed to make refactoring safe.

    I guess as with all things in life there must be a balance. But I believe everyone who has ever done design can say that they have at some point designed their systems for future requirements. And then these requirements never arrived, system evolved in a different direction, and all the complexity and flexibility introduced was bloat and a waste of time and effort. OTOH developing systems without and design is also stupid.

    --Coder

  81. My approach by spiffmastercow · · Score: 1

    I'm the sole programmer on an internal app spanning about 150 web forms. My policy is to try to get each form done as quickly as possible. I have a few helper classes that I add to as needed, but generally I feel like there's something wrong if it takes me more than 2 hours to write a simple report form. So my code looks like crap, and the DBA bitches because i don't handle errors caused by him randomly deleting shit out of the database that should never be deleted. Why do I write such bad code? because I know I'll have to do it over 3 times anyway, because the users get it and then decide the specs they told me aren't what they *really* wanted. Also, in an event-driven programming model, your code is going to end up looking like shit no matter what you do.

    1. Re:My approach by urbanRealist · · Score: 1

      A good programmer writes clean code that can handle errors and accommodate typical spec changes without having to be completely re-written.

      --
      I've seen a lot of things, but I've never been a witness.
    2. Re:My approach by spiffmastercow · · Score: 1

      The key word there is "typical", and that term is relative. I'm often forced to make fundamental changes after the first review. Often the users end up wanting something completely (and I do mean completely) different. For instance, I had a project from one department where they insisted on maintaining their own employee and customer database separate from the main database. 6 months later, they want to integrate it into the main system. So now some of the customers overlap, but they want to keep the same IDs and names they entered, but they want it to correspond to the main database, where the IDs and names of the customers are different. So far I've just been stalling on the project to wait until they change their mind again.

  82. Re:True that - NOT by Anonymous Coward · · Score: 0

    Yeah, I knew someone else like this at an old job. He banged out one particular project and it was fine for all of a week - they they started asking for more things to be added. Then more things, and again more things. It would always work . . . until something new popped up. He eventually took to complaining about the group that made these requests, even for things he screwed up like lack of input validation, rather than taking any time to stop what he was doing and clean up what he had already done.

    Eventually he left and I was stuck with the project, and the thing that struck me is that if he had designed the entire thing better up front none of the additions would have been very difficult to implement.

  83. yeah good luck to you. by xmousex · · Score: 1

    in the last eight years the duct tape programmers that have worked here have cost us more money and embarrassment then we care to think about. we have had meetings where we cant help ourselves but get very angry and loud about the mess they have created. we have slowly identified and rooted them out. in one instance, the programmer gave notice that he was resigning and making a career change due to the amount of problems he caused.

    In their place are well thought out solutions that scale upward with minimal ease. where we actually map out what the solution should look like first, identify which tools should be used at each step of the solution, identify and make allowance for the potential changes that will come over the next year, and then begin building from the foundation up. after a year of investment we end up with solutions that are easily repurposed because their components are finished and clean. the ability to duplicate that again and again is where we make the money. we dont have to rebuild anymore, but we charge like we do.

    the problem with 'duct tape' programmers is the big umbrella it puts up for the young, inexperienced, fresh out of school kids to hide under and screw up your company. They want to throw in some hours and some code and hurry back outside for recess again. I bet for every 10,000 of those is a single duct tape programmer who is worth having around for the occasional emergency.

  84. Correction by microbox · · Score: 1

    Which is entirely subjective by definition, so we're back to the basics: a good programmer writes working programs.

    A good programmer writes working programs, that have an underlying simplicity to their architecture.

    --

    Like all pain, suffering is a signal that something isn't right
  85. Re:True that - NOT by Anonymous Coward · · Score: 0

    Joe?

  86. nah by Anonymous Coward · · Score: 0

    voicemode="arnie"-this is a baaad ideeuh

    Why? See this http://it.slashdot.org/article.pl?sid=09/09/25/1239236

    That's what happens when you ship a 50% polished/completed piece of software, then the "new and improved" one is again, 50% completed. this goes on for decades

    What is needed is an end to software snakeoil and insist on a warranty, suitable for purpose, and free from glaring defects, just like any other "product". When your product fails to work, even with oodles of third party expensive help, it's just time to admit reality that it is designed from the ground up "wrong" and should be removed from the market by law, and all the folks who got took get their cash back.

    It is only going to get better once they take some billion dollar hits with recalls and cash back to their victims, across the spectrum of software. All other industries have to provide a minimum quality and a warranty to ship products.

    Time to take the training wheels off this alleged industry and force them to put on big boy's pants..

    Wah, wah, wah, cry, whine, bitch, moan, complain, "we'll show you, it will cost so much you won't buy it and stuff! And my dad can beat up your dad, too! and..and..it can't be done, so there" (software "industry" sticks it's tongue out and walks off in a petulant huff)

    Uh huh Same exact BS thing all the other corporations whined about way back when they got told they were going to be having warranties applied to their products whether they liked it or not and the time for snakeoil and caveat emptor was over, and you know what? Sure, a few manufacturers went under, and it's no great loss, as demand for products was still there, so REAL, as in not just self described "professionals" took the market, responsible ADULTS. "Business" still kept making things and selling them, just the quality got better. They still have screwups, but they manage to struggle on now, don't they?

  87. Duct Tape Software by ChuckG · · Score: 1

    We bought a duct tape software to run our internet business. The sellers said (and I quote) "We don't use industry best practices." Not proudly but matter-of-factly.

    The up side is that the thing is the right price. $1.5k vs $50k.

    The down side is that it is spaghetti code, uses global data to pass information around, is not object oriented, doesn't use unit-of-work database transactions and gives error messages all day long. We manage to survive because we have somebody who is tech savy, me, but it is the source for plenty of aggravation but probably less than $48.5K worth of aggravation.

    Amazingly we have not lost any significant amount of data.

  88. Re:True that - NOT by somersault · · Score: 1

    This story acts like stopping to think about what you are doing means that you are going to implement huge, stupid architectures, but in reality he is just making excuses for being a sloppy hack. I feel damn sorry for anybody that has to support this crap in the future.

    That's what I thought too, though I myself am probably a duct tape programmer by the sounds of it. Doesn't help that I keep getting asked to add in new features to my current main project (just a web based database app written with perl/sqlite) every couple of weeks of course, but I have spent this week going back over everything and tidying a lot of stuff up, making it much more modular and coherent. It feels good :)

    --
    which is totally what she said
  89. Since when did quality become optional? by srussell · · Score: 3, Informative

    I keep seeing this "good enough" meme going around.  At a company meeting, recently, management was espousing the same crap.

    I can only hope that these people are plagued with "50%-good" products.  50%-good tires, that blow out ocassionally, causing an accident.  Maybe Joel would like some 50%-good surgery, or a 50%-good pacemaker.  How about getting to fly in 50% good airplanes for the rest of his life?

    I'm not surprised that most of this bullshit is coming out a culture in which Walmart was able to become the success it has.  We needed something for a weekend project recently and bought the materials from Walmart, because it was closest.  What poor quality crap.  It'll all need to be replaced in a year, contributing to landfill and wasted resources.  I'm not going purchase from Walmart any more, and I'm not going to spend money on half-baked, crap-quality software, either.

    Word gets around about quality.  It's the American auto-maker's nightmare right now.  Ford, Chrystler, Chevrolet... they're all struggling to reverse decades of built-up public perception about poor quality, even when some of them are actually making fairly decent cars right now.  It isn't quite the same with software; Microsoft has been making crap software for, well, ever, and they're still dominant.  But I think that if you take the monopoly factor out of it, software companies *do* suffer from delivering half-assed product to their customers.

    1. Re:Since when did quality become optional? by Pstonie · · Score: 1

      But duct tape has what plants crave.

    2. Re:Since when did quality become optional? by Krishnoid · · Score: 1

      I can only hope that these people are plagued with "50%-good" products.

      In many areas, people are plagued with these products because people shoot for 80-90%. If you shoot for 100% and have luck with you, you'll get a 80-90% or better product. And in software -- IMHO as a result of lack of merchantability or suitability-for-a-purpose guarantees -- you can market a product as 100%-good and then ship a 50%-good product without incurring any corporate liability.

    3. Re:Since when did quality become optional? by iaamoac · · Score: 2, Insightful

      This is getting late in the posting, so I don't expect many people to read this but ...

      20 years of developing software has taught me that good enough is good enough. What is good enough for one project, is overkill for another, and nowhere near good enough for yet another. As a software developer, I see my job as turning code into $$$. Good enough means that you have to perform a mental cost-benefit analysis on what you develop.

        But what is good enough? That is the variable. Sure, there are twits out there who try to argue that there is exactly one level of "good enough" for ALL projects. Clearly for the products that you cite, 50% is not good enough. But for some things, if something works only half the time, it could (does not translate to will) still be useful enough to be put to use.

      Over time, user demands, and competition will push the "good enough" bar higher.

    4. Re:Since when did quality become optional? by dominator · · Score: 3, Interesting

      Good enough means good enough. It's not 50%. It's not 80%. It's whatever is the powers that be decide is the appropriate trade-off between competing interests (i.e. time to market, cost of deployment, $ paid to developers, estimates of the cost of future bug fixes, ...). If the market doesn't accept the product, it only means that their definition of "good enough" was wrong, not that there isn't a different "good enough" that the market will embrace.

      "Good enough" for the software that runs a nuclear reactor or the space shuttle is probably near 100%. Pace-makers, surgeries, and pharmaceuticals failing? It's been known to happen. Sure, maybe only in 1/10000 cases, and only if you don't have a pre-existing condition. So, good enough is maybe five nines there. "Good enough" for that $1 umbrella you bought at Wal-Mart probably means something entirely different.

  90. Re:True that - NOT by AxelTorvalds · · Score: 2, Insightful
    I've seen these threads the last couple days about this blog. There are a couple of things that are worth putting in to perspective. Seems we've all worked with guys who get a lot done fast and generally try to keep things simple, maybe a bit too simple, and as Joel mentioned get the go kart running and it goes fast. The big big big difference with a duct tape guy like JWZ is that he's rich. He essentially succeeded, it doesn't matter what the long term sustainability of the project is, it doesnt' matter that Netscape is dead and IE is in a world of hurt (is it? I don't even know who considers that the "goto" browser any more, nobody I know really uses it) He came in, he got it done, he got paid and he moved on. Were there engineering problems that hurt Netscape? Absolutely, was that the soul and main problem they had? Probably not. Is a "duct tape" JWZ anything like Crufty Joe? Maybe in that they both could work fast, but believe me, JWZ doesn't maintain his code, it was good enough and that balance of what that meant was good enough to cash out and good enough to change the world. I simply can't remember anyone complaining about Netscape 1.1's reliability in any serious way, it was lightyears beyond Mosaic and any problems it had were completely outweighed buy all the great stuff it actually did. I think one of the benchmarks for an official "duct tape programmer" is success, the product works, or there is some financial success or some other type of success. Crappy spaghetti that needs constant maintenance is just that, crap.

    Can you emulate what JWZ did? Sure. Does that mean you'll be successful? I doubt it. THis discussion isn't about unit tests or dev methodologies in the traditional sense. It's about guys that threw that stuff out and achieved success in spite of it. It's much more subtle than being a hack that get's stuff "done." It's about being a hacker that get's stuff Done (with a big D) One you want on your team, they are rare individuals that can guide you towards riches, the other? Well you've probably got them around and they're probably paid too much and they actually cost the organization over the long term rather than help it.

  91. Re:True that - NOT by Abcd1234 · · Score: 2, Insightful

    My idea is that a good duct tape coder does mostly procedural code

    So suddenly people who favour an OO or functional approach can't be "duct tape" coders? Interesting, particularly since a good procedural coder does the exact same thing as a good functional or OO programmer: the break the code down into small, testable, reuseable modules that are highly cohesive and weakly coupled. Whether you do that with procedural modules, objects, or functions is entirely irrelevant (though some paradigms make certain types of design simpler, eg high-order functional reuse, etc).

    that is well named

    WTF does that have to do with "duct tape" coding? That's just good coding practice in general, whether or not you're over- or under-designing.

    strongly typed

    So now we can't even use Perl or Python? The duct tape of the programming world? Jebus...

    designed by contract

    Once again, that's just a good idea in general.

    Frankly, looking at your list, they're either just good ideas, or baseless prejudices, nothing more.

  92. Re:True that - NOT by tshak · · Score: 1

    ...he was a duct tape programmer! He always got it done by the deadline, but then he spent 75% of his time maintaining... in some cases we just tossed the exisiting work and started from scratch

    Maintainability costs money. The article would have been much better if it just linked to the KISS principle as a reminder that needless complexity is bad. Instead there's this apparent (unintended?) emphasis on lower quality with the use of the "duct tape" metaphor as well as an out of context reference to Gabriel's "Worse is Better" essay*. The hard problem in software is maintainability, which is usually the result of hack-n-slash code that appears "done" because it "works" (just don't ever change it).

    * There is a big difference between not developing the "perfect product" (i.e. every ideal feature) vs. code quality. The latter has a direct correlation to maintainability costs and future development velocity.

    --

    There is no longer anything that can be done with computers that is nontrivial and clearly legal. -- Paul Phillips
  93. Re:True that - NOT by Dare+nMc · · Score: 4, Interesting

    I guess in my experience, your example doesn't really go anywhere to disprove the article. IE I had a project where we followed all the correct design principles and did 2 years of work * 5 developers for a project that was to be the future of the company. Another division had started before us a similar project with slightly different goals. The sold management on their duct tape software that met some of the spec before ours. So my project got canceled. Their duct tape software had to be completely re-written to add the remaining features (8 years later they still haven't surpassed what we had almost done.) The fact that they were done (with something) first won out. The fact that duct tape allowed them to provide the solution, and buy them the time to re-write it, in my mind showed how it makes them more successful (I did replace a bunch of their code with ours, and the correctly written code spawned other projects to use its base, so not a failure.)

    So the fact that your co-worker got the jobs, seamed to show people they needed that solution, and thus seams thats the reason you got the time to re-write them. Shows that duct tape programming "works." Even if it isn't always the most efficient method in the long run. IE this is about how many projects have just been abandoned because they were stuck in doing it the right way, where you slap something together, you got your foot in the door, and may buy the time to do it the right way.

  94. Hacking code and future support by mollog · · Score: 1

    I have learned to write code in an open, easy to understand style so that future support persons will be able to hack it without too much trouble. That usually means avoiding some of the more subtle and elegant techniques that a particular language uses.

    Code can be hacked without destroying its future usability, and that is my pet peeve; it's ok to hack, it's not ok to turn code that was maintainable into a bloody unusable mess. I hate compiler directives. Are you too stupid to put platform dependent code in a separate file?

    Regardless, I do understand that shipping code is crucial. I don't hate hackers, but they get the job done. I just hate cleaning up after them.

    --
    Best regards.
  95. Re:True that - NOT by Anonymous Coward · · Score: 0

    So what do "smart" programmers do when the customer changes the requirements at the eleventh hour, or you discover that some of the information provided by a third party was incorrect? Do you say "Ohh, sorry, it'll take us six months to re-engineer. The class hierarchy is all wrong now, you see..." or do you just, you know, Get It Done?

  96. At least one reason to love TFA by istartedi · · Score: 1

    And the duct-tape programmer is not afraid to say, "multiple inheritance sucks. Stop it. Just stop."

    Thank-you Joel, for saying that. Some features just need to be ripped out, and MI is one. I'm not a huge fan of Java; but this is one thing they got right. When so many successful apps are written in something that doesn't have that feature, you need to ask yourself why it exists. That alone is not reason enough to eliminate it; but it's a start. When I learned about MI and tried it, I could tell it was a train wreck and I never used it. That was 10 years ago when I was obviously less experienced; but it's cool to see that validated by someone like Spolsky.

    --
    For all intensive purposes, "whom" is no longer a word. That begs the question, "who cares"?
  97. Front-Ahead Design by kalirion · · Score: 1

    I think I've seen this before.

  98. Perfect is the enemy of good by mr.dreadful · · Score: 1

    Perfect is the enemy of good... 'nuff said.

  99. Re:True that - NOT - RTFA by Phantom+of+the+Opera · · Score: 1

    I was thrilled with unit tests until the Puppy happened. I was lucky enough to get an early start on a project. Early on, I wrote a suite of tests that I'd run to make sure nothing broke, and that edge cases were working. Then I continued to develop and write code, making the odd entry to the unit tests, but only in cases where I thought it was needed.

    Then the Puppy came to my team. As the lead, I encouraged him to write unit tests. Those soon grew to epic proportions. I was buried in a sea of special one off requests from upper management for a period of two-three weeks and kept my eye off of him. When I finally could take a breather and get back into the swing of thing, I discovered mountains of tests - it was all he had written. No implementations!

    Then requirements change as they often do. About a third of the tests were rendered useless do to the changes. Now, I still run my unit tests from time to time, but I am a little leery of putting that much time in to testing when the situation can be so volatile. And I have to keep a closer eye on the Puppy.

  100. Mod parent up! by argent · · Score: 1

    I just want to say <AOL>Me Too</AOL>.

  101. Joel, the authority on programming? by Animats · · Score: 3, Insightful

    First off, Jamie Zawinski no longer programs much. He runs a nightclub.

    Second, Joel Spolsky isn't exactly a big name on programming. He's better known as a blogger than a developer. He runs a little company that makes a desktop project tracking tool. That's not rocket science. We're not hearing this "duct tape" stuff from people like Dave Cutler, who designed VMS and Windows NT. Or lead developers on MySQL. Or big names in game development.

    Spolsky is taking potshots at the template framework crowd. He has a point there. I've been very critical in that area myself; I think the C++ standards committee is lost in template la-la land. The real problem with C++ is that the underlying language has a few painful flaws for historical reasons, and attempts to paper those flaws over with templates never quite work. (Read up on the history of auto_ptr to understand the pain.) But that's almost a historical issue now. Newer languages such as Java and Python aren't as dependent on templates as is C++. If you get the basic language design right, you don't need templates as much.

    1. Re:Joel, the authority on programming? by hunnybunny · · Score: 1

      "He runs a little company that makes a desktop project tracking tool. That's not rocket science."

      exact-a-mundo.

      When he does something intesting i'll start listening.

  102. As Red Green would say by Yvan256 · · Score: 1

    If it ain't broke, you're not trying!

    (from The Red Green Show)

    1. Re:As Red Green would say by nervouscat · · Score: 1

      He also said that duct tape is the handyman's secret weapon.

  103. There's only one thing worse ... by rgviza · · Score: 2, Interesting

    ... than a half assed product full of bugs in your enterprise: One nobody uses that's been sitting on someone's test server for 2 years.

    It's been my experience that if your project takes more than 3 months, someone else's project to do the same job, half assed or not, is the one that will be used. There's always some busybody doing a secret project, which they will show to a VP, usually on their smart phone, while they are buying them drinks at happy hour.

    Then when it doesn't scale, they'll find a way to blame their co-workers, who will need to work overtime to make the steaming pile of dung work, while the guy that built it is gathering requirements for his next shitty project. He's a mover and shaker after all!

    Git'er done or get plutoed. People don't care if there are bugs, as long as you fix them. They get really pissed when they have to wait ; )

    --
    Don't kid yourself. It's the size of the regexp AND how you use it that counts.
  104. Unit Testing by DragonWriter · · Score: 1

    Then the Puppy came to my team. As the lead, I encouraged him to write unit tests. Those soon grew to epic proportions. I was buried in a sea of special one off requests from upper management for a period of two-three weeks and kept my eye off of him. When I finally could take a breather and get back into the swing of thing, I discovered mountains of tests - it was all he had written. No implementations!

    Then requirements change as they often do. About a third of the tests were rendered useless do to the changes. Now, I still run my unit tests from time to time, but I am a little leery of putting that much time in to testing when the situation can be so volatile. And I have to keep a closer eye on the Puppy.

    This is why there is, in agile methodologies (or at least the descriptions I've seen of them, there's a whole lot that passes under that name) the usual recommendation is write a unit test, write the code to make it pass, rinse, repeat. /b

    1. Re:Unit Testing by Phantom+of+the+Opera · · Score: 2, Interesting

      This is why there is, in agile methodologies (or at least the descriptions I've seen of them, there's a whole lot that passes under that name) the usual recommendation is write a unit test, write the code to make it pass, rinse, repeat. /b

      I agree with you. I've seen it work beautifully.
      It just works less good in chaotic situations. It may not be feasible in a time frame to write unit tests for legacy code as things get tangled (think entanglement with production database entanglements and tight schedules)

      My compromise methodology now is to add a unit test whenever a bug is found, for detecting that bug. That way, I don't wast time with testing things almost as trivial as x = 1; x++;..check if x is now 2. That way, I'm confident that the bugs unearthed by usage will not remain. Evidence that this works? Our team's bug count was 2 minor last I checked. The average for other teams (with admittedly larger code bases) is in the dozens.

  105. Re:True that - NOT by pushf+popf · · Score: 2, Insightful

    I manage a small team of programmers. When I first started, I 'inherited' a developer, let's call him Crufty Joe, who had worked at the company for 20 years and had developed financial and hr routines on the old mainframe and spiffy new oracle apps system. Joe had developed a lot of code, but he was always having to perform updates and corrections...

    Before throwing "Crufty Joe" under the bus, you should realize that his "cruft" came from an infinite stream of seemingly-minor change requests that were not part of the original design and had to be "duct-taped" on to the original application.

    And I'd be willing to bet that if you stay there for 20 years that your code will look just like his.

    "We want to handle this type of customer just like these guys, except when this happens do that." "Except if they're part of this group. Or their name is 'xxxx', in which case do this other thing."

  106. Let's classify people by Anonymous Coward · · Score: 0

    Nice post. It's great to classify people, and if you can get lots of attention by doing it it is even better.

  107. Re:True that - NOT by cyclomedia · · Score: 1

    Smart programmers having taken the time upfront to design the system in a modular and flexible manner are already aware that requirements ALWAYS change down the road. So when the eleventh hour rolls around and the requirements have shifted the code requires only minimal adjustments to meet them. Agile is more than a buzzword, it already had a meaning in the dictionary before the PHBs got hold of it.

    --
    If you don't risk failure you don't risk success.
  108. Umm, MacGyver? by Anonymous Coward · · Score: 0

    When did he become a programmer?

  109. Uncle Bob Martin's response: by hgavin · · Score: 1

    Bob Martin has posted a response to Joel's article at http://blog.objectmentor.com/articles/2009/09/24/the-duct-tape-programmer

  110. Completely and utterly retarded idiots! by Hurricane78 · · Score: 0

    My god, where do they live? In the land before time? What is described, is the age-old pseudo-dichotomy of the programmer who first plans everything, and then codes it, and the amateur, who throws together some spaghetti code that barely works, but gets the pat on the back from management, for being faster. While the planning programmer then gets negative comments, when taking so long to add functions to the 1.1 version.

    The point is, that for big projects both strategies don't work well. The first one, because management or clients are a bunch of children, who don't know what they want, until the project is done, and let you completely change directions more often then there are minor version numbers available. (A result of reactive planning, which is reversing the steps of natural planning, on management's side.) And the second one, results, as I said, in a hard to maintain mess.

    But we are long out of this dark times. I think it's pretty much standard nowadays, to work in the spiral model. A method which now is more than two decades old!
    You define the biggest risks/problems/questions, you plan and develop a prototype, using test-driven development and as little work as possible, you answer your questions, and then repeat the whole process. Until you reach the "good enough" state.

    So proper planning and "good enough" are no opposites, as made-up in the "article", but indeed an old hat, know to work best when correctly combined.

    But what did I expect from a site, where a third of the articles are advertisements in disguise, a third are made-up false dichotomies, and the other third are badly written and misinterpreted actual news.

    --
    Any sufficiently advanced intelligence is indistinguishable from stupidity.
  111. Joel Spolsky: From Coder to Manager by hunnybunny · · Score: 0, Flamebait

    it looks like joel spolsky has finally completed the metamorphosis from developer to point haired boss.

    for "duct tape programmer" read "programmer who will agree to do any old shit without complaint".
    if he wants to rationalise his crap management style let him.

    when the software finally implodes as a result of this nonsense, the manager can order a re-write and call it "agile re-factoring" or some such opaque bullshit.

    here's a new trendy software methodology for you:

    "if you don't actually write code - shut the f**k up"

  112. Re:Mod parent up. However overengineering still su by Anonymous Coward · · Score: 0

    You want an example of duct tape programming? Somebody who hard-codes values that can be gotten from a database. I don't want no more of them duct tape programmers.

  113. XP? by InsaneBoarder234 · · Score: 1

    Where does this term "Duct Tape Programmer" come from at all?

    Can we say "extreme programming" and leave the original term in place?!

  114. What you need to know about Joel by snowwrestler · · Score: 2

    His company originally coded their software in VBScript. Ok, fine, it was "back then." But over time, rather than refactor on a modern platform (and despite praising .Net to high heaven), they instead extended VBScript to create their own proprietary programming language. All this to run some bug tracking software BTW.

    He scores high on the geek cred and he's a good writer, but I don't understand how he is taken seriously as a major authority on software development. There must hundreds of companies out there producing products on the level of things like Fog Bugz or Copilot. They just don't have a founder who obsessively blogs about everything.

    --
    Build a man a fire, he's warm for one night. Set him on fire, and he's warm for the rest of his life.
  115. Group code reviews by Krishnoid · · Score: 2, Interesting

    I brought this question up informally to my coworkers. Punishment or shaming, which I'd read about, doesn't seem to have the desired effect. More of them were of the opinion and experience that code reviews went a long ways towards improving programming skills, including one recent Google hire who had good things to say about Mondrian.

  116. personality type by DriveDog · · Score: 1

    I suspect there are few MBTI type INTJ/INTP who code with duct tape, aside from prototyping.

  117. Definition of today by iYk6 · · Score: 1

    If somebody shipped a browser as crash-prone as Netscape was today, it wouldn't matter if it was three years ahead of the competition. People would play with it for a bit, and then use something stable.

    Um, no, you just disproved your own point. Netscape did deliver a browser years ahead of the competition...

    Here you go: http://www.thefreedictionary.com/today

    1. Re:Definition of today by Anonymous Coward · · Score: 0

      Whoosh!

  118. Re:Certainly true for Joels world of market econom by GWBasic · · Score: 1

    Mission critical applications, like those used in health "industry"

    I worked on medical software with duct tape programmers. They key was that we knew when to use duct tape and when to make something bulletproof. Our database was bulletproof; but we didn't care if the UI had a glitch.

  119. The road to hell is forked with single inheritance by presidenteloco · · Score: 1

    So let's say I am writing software for a factory that assembles machines.

    It has to represent various component parts:

    Some of the parts the program needs to organize and assemble are
    wheels (which have diameters), bodies (chassis or frames), and seats.
    The factory makes sit-down lawn mowers, push mowers, and bicycles.

    The parts have all been painted in different colors (a Painted thing has a color, of course).

    My program needs to tell all the red bicycle parts to go to assembly area B.
    Then it needs to attach the wheels to the bodies, and add a seat to each.
    We would like it to avoid making multi-colored lawnmowers with bicycle seats
    and bicycle wheels. Each model of lawnmower needs a different diameter
    of wheel. Each model of bicycle also needs a different diameter of wheel.
    Lawnmowers each need 4 wheels. Bicycles and push-mowers each need 2.

    Please write me an elegant single inheritance data model to represent the entities
    that the factory program needs to work with. Please avoid making any representation
    choices that my buddy the other programmer would have a 50/50 chance of choosing
    the opposite representation convention for the same thing. Because you are writing half
    of the system, and he's writing the other half, then you have to integrate them.

    Hint, he hates colored things that happen to be lawn mowers, but loves lawnmowers
    that happen to have a color.

    --

    Where are we going and why are we in a handbasket?
  120. Nothing new under the Sun by richieb · · Score: 2, Interesting

    Years ago I was an editor of a magazine about Eiffel programming language I wrote this editorial on differences between low-level and high-level of coding.

    --
    ...richie - It is a good day to code.
  121. *Sigh* Undoing moderation for this... by Anonymous Coward · · Score: 0

    Duck typing is not a dynamic vs. static thing. Ocaml has statically checked duck typing for objects.

    Why don't you people fucking educate yourselves before spouting off?

  122. Spiral model is b0rked by managers customers by presidenteloco · · Score: 1

    Everytime I've been in or led a project that attempted the noble spiral model
    (which I do believe in),
    management and/or customer always said (ordered) two self-fulfilling and fatal things:

    1. We need more features in iteration 1 (subtext: we don't believe you will ever get to iteration 2)

    2. This iteration 1 thing is good enough. You are finished. We cannot pay for more dev.

    Note how elegantly symbiotic the two positions are.

    --

    Where are we going and why are we in a handbasket?
  123. C/T: templates are useful by Anonymous Coward · · Score: 0

    Templates are important and can impact the amount of code that needs to be maintained. Of course, C++ templates were a non-starter. I like Eiffel's approach to templates and OCaml's module approach. Neither of these languages are mainstream, though, I am not entirely sure of the reasons for that.
    The article also talks about unit tests, rather not doing unit tests: I tend to agree with the approach when I am developing in say Eiffel or OCaml: in C/C++ or Java, though, unit tests are a useful safety net. There is a library called Weasel (based on Eiffel) that uses design-by-contract statements within the program to generate automated test cases, to reduce the total number of hand-written test cases. Having coverage through unit test cases certainly is a norm and I would believe that it might be a management risk to do otherwise.

  124. Re:Certainly true for Joels world of market econom by amn108 · · Score: 1

    Makes sense in the sense that duct tape programmers may certainly be people to hire for developing GUIs. Ironically though, nothing gives software such a bad reputation as because of its GUI, and we have had bad GUIs for years. But I guess people working in health sector had years to complain and by now are used to it.

    I have on several occasions peeked over the shoulder of various doctors and nurses as they used their software, and have on all occasions noticed how ugly the GUI looked and behaved.

    I would have to also argue that sometimes a GUI glitch can be fatal to a patient. A button performing a different function that it is expected to perform. After all, a GUI is just an interface, what if somebody swapped the labels for the buttons on a life support machine? ;-) You cannot rush out medical software, IMO. It should be done when it is done. Before it's done, its predecessor should be used.

  125. Re:Certainly true for Joels world of market econom by GWBasic · · Score: 1

    Makes sense in the sense that duct tape programmers may certainly be people to hire for developing GUIs. Ironically though, nothing gives software such a bad reputation as because of its GUI, and we have had bad GUIs for years. But I guess people working in health sector had years to complain and by now are used to it.

    Not in this case. We had significant UI testing. The fact of the matter was that, to our customer, the data was the most important thing. Therefore, we had to prioritize a bullet-proof database for demos and milestones. QA helped us fine-tune the UI, but at that point the database was pretty solid.

  126. Duct tape sucks by ShannaraFan · · Score: 3, Insightful

    We have a whole department full of duct tape developers, writing Business Objects reports and other BI-type code. They can't write efficient database queries to save their asses. As one of the production support DBA's, I get the pleasure of debugging/tuning their crap after it hits production and won't run. Just yesterday, after one of the production Oracle machines fell over, we discovered a query that was piping a whopping 2.4 PETABYTES of data through a SELECT DISTINCT clause. Considering the database itself is less than 300GB, we found this rather interesting. When challenged, the developer responsible for the query says "It should only return about 10 rows". True, if it ever finishes applying the DISTINCT.

    Ship first, tune later, I love that philosophy...

    1. Re:Duct tape sucks by Kjella · · Score: 1

      Oracle is the stupidest database I know anyway. I made a simple SELECT x FROM xtable WHERE x NOT IN ( SELECT DISTINCT y FROM ytable ) and it just choked for 10+ minutes and never finished. After a rewrite do to the same thing it took less than 5 seconds, but it was another case where oracle is just terrible. Why it has so much appeal I got no idea, it certainly has nothing to do with performance. In MSSQL or PGSQL or MySQL I can write things any way I want, in Oracle I have to massage it to get in on some form Oracle likes or suffer eons of execution time.

      --
      Live today, because you never know what tomorrow brings
    2. Re:Duct tape sucks by russotto · · Score: 1

      It's not the developer's fault that Oracle sucks donkey balls when it comes to "SELECT DISTINCT". I've seen it turn queries that took seconds with "SELECT ALL" into horrendous cartesian-product based monstrosities with "SELECT DISTINCT". I eventually fixed them by writing the SELECT ALL query as a subquery of a SELECT DISTINCT (forcing it to do the DISTINCT filtering last), but the optimizer should have done better than that.

    3. Re:Duct tape sucks by El_Oscuro · · Score: 1

      Oracle has an optimizer? Since when? Perhaps Oracle 12h?

      They have been advertising one for 15 years, but I am not convinced it will ever reach production. A way to ensure your queries always work is to use the -- +RULE hint. Oracle uses it themselves in the data dictionary, so you can safely ignore all of those "depreciated" warnings

      --
      "Be grateful for what you have. You may never know when you may lose it."
  127. Joel tries to invent new software management term. by Anonymous Coward · · Score: 0

    Wants to keep his name in the limelight.

    Inexplicably comes close to success because of Slashdotters theodp and kdawson, neither of whom apparently knows anything about real coding.

    Film at 11.

  128. Re:True that - NOT by shadowofwind · · Score: 1

    You just described how DTP survives where there is poorly qualified and short-sighted management. In that sense, nearly every kind of corruption is good. Its not the whole story if you're looking for long term success.

    But you make a valid point also, particularly when paying customers are in the role of your management.

  129. TotalSpaghetti : DuctTape, MadArchitect by Anonymous Coward · · Score: 0

    Good ol' alberts words saying that everything should be as simple as
    possible but not one bit simpler is violated by both
    the duct tape coder and the postal architect....
    Spaghetti is spaghetti no matter if it is made up of
    recursive class template wrappers or nested if statements. It's
    the battle of the crappy coders.

    "Multiple inheritance is bad" - now that's just the mentality
    of a crappy coder, a good coder knows when Multiple inheritance
    is bad, and when multiple inheritance is good - it's *not always* bad...
    you understand? kind of "it's not that simple"

  130. Re:True that - NOT by 7+digits · · Score: 1

    You know, I happen to think that the net is the biggest duct tape of all. Hundred of billions of dollars have been spent building apps on something that wasn't designed for that, and almost each time a new solution came, it was based on a hack that somebody did, that was glorified into some great technology (say ajax, for instance).

    That is the old Worse Is Better theory. LISP machines were fantastic, but were replaced by badly designed kludges. Smalltalk environments were amazing, but everybody used less elegantly designed languages/environment instead. The thing that get the job done NOW, with the smallest curve of learning gets the momentum and WINS.

    When you see the kind of kludge and complexity that is CSS (for instance) to get a somewhat controllable UI on the web, it is hard not to feel sorry. Now, people are developing apps in javascript, with very poor development environments, getting extremely fragile systems, that run hundred of times slower than a normal desktop application would. And buggy as hell (for instance, getting proper drag and drop behavior in web apps is currently impossible).

    I can't avoid thinking that a properly designed web technology would make all those issues moot, but of course, that "perfect" system would never have been able to get momentum. Maybe the great designer is the one that knows how to design a system just badly enough to be successful....

  131. Re:True that - NOT by garyisabusyguy · · Score: 1

    Whoa, there buddy, I don't throw any of my people under the bus. But if you think that I am going to sit idly by and watch a team member dig himself a hole just because it is the quickest way to deliver a product... well I wouldn't be doing my job and, imho, would deserve to be tossed under the bus myself.

    Maybe you are familiar with Oracle 11i apps, maybe not. I have seen (and been) the bright guy that just 'picks it up', but I can also tell you that most of the code I wrote early on was utter crap and may have even broken certain arcane licensing and support rules...

    The database schema is _sick_ and works into it a security model based on synonyms of views of tables that spans dozens of schemas and is necessary for sound information control. A lot of the time you can create your own tables and use them to handle changing business rules or even *shudder* hard code values and rev up the code when the values change (Joe's favorite approach). However, by merely reading the RTM's (there are many of them), learning the funtional setups and spending a few years dicking around with the system, you discover that some bright programmer within the halls of oracle already considered it and provided a really effective method to deal with it.

    I challenge anybody to convince any (in this case really nice and competent) fellow to change their ways with just a few years remaining until retirement. Joe accepted a lot of it, but that does not automagically change all the legacy code hanging out just waiting for our business people to make some changes to the setups and start screaming when stuff stops working.

    So, I take your '20 year challenge' to heart and I work daily to keep that from happening with my own code or my co-workers. IMHO, there are way too many programmers out there that will read this 'duct tape' piece and use it to justify their own shoddy methods for me to read it without my head spinning around and taking the time to spout off about taking the time to do it right.

    --
    Wherever You Go, There You Are
  132. Let me guess the laws of the Duct Tape coder by NotSoHeavyD3 · · Score: 1

    [sarcasm on] 0th Never document anything and never comment anything. (Hey, when the next guy comes through and has to reverse engineer your code he'll thank you for the fun.) 1st Don't write function. Just dump the code right in place. Hell, a function isn't really useful unless it's at least a couple thousand lines long. 2nd Don't give things good names. I is fine and what the hell, name your stack 'q'. The computer can figure it out no problem. 3rd Use GOTO's whenever possible. 4th White spaces is for chumps so don't have things line up and for god sakes skip the formatting. [sarcasm off]

    --
    Did you know 80 to 90% of the moderators on slashdot wouldn't recognize a troll even if one dragged them under a bridge.
  133. No, we need a more nuanced analysis. by Estanislao+Mart�nez · · Score: 4, Insightful

    To be fair, you must concede that while the static languages catch some errors at compile time which might not be caught until runtime (or ideally, QA) with a dynamic/duck language, the static languages also "catch" a great deal of non-errors which the programmer is forced to deal with even though they never would have caused problems at run-time, while having the side-effect of reducing code re-use.

    No, this is simply not like this. If a static type system compiler fails to compile the file because of a type error, then there is truly a type error in the program. The idea that some such programs would not have caused problems at runtime is dubious, because what programs can actually run cannot be divorced from which programs compile.

    The arguments in "favor" of dynamic typing are simply misaimed. More and better static analysis of code before allowing it to execute is a virtue; the lack of static analysis and rejection of code is not an argument for dynamic type systems, it's an argument against it.

    The sort of argument that can be made fairly against static type systems is the following:

    1. Static type systems that are too simple tend to prevent code reuse, while those that allow it better tend to be a lot more complicated (Haskell, anybody?)
    2. Even when a simple type system shouldn't have gotten in the way, programmers will tend to make very bad use of it. My paradigm example is that typical Java programmers tend to put way too many methods in their interfaces (when they use interfaces at all!). The more methods you put in an interface, the less likely somebody else is going to implement that interface, especially if they just need 1/4 of the methods in it.
    3. Languages with powerful static type systems tend to also be languages with strong "closed world" assumptions, where the compiler assumes that all code and all types that will be used at runtime are known at compilation time. This tends to make it hard to develop software that does things like load plugins, or at the very least, makes it so that such programs must forfeit a good chunk of the correctness guarantees that the type system is supposed to provide.

    So basically, static type analysis is (a) desirable, (b) hard to get right, (c) easy to misuse.

    1. Re:No, we need a more nuanced analysis. by Lord+Ender · · Score: 1

      It's pretty clear you don't understand what duck typing is. Go look it up and get back to us.

      --
      A slashdotter who didn't build his own computer is like a Jedi who didn't build his own lightsaber.
    2. Re:No, we need a more nuanced analysis. by Estanislao+Mart�nez · · Score: 2, Informative

      It's pretty clear you don't understand what duck typing is. Go look it up and get back to us.

      I know what duck typing is. I once drank the Ruby koolaid.

      Basically, the situation where you can duck type and still get a correctly typed program is when all the objects that may be arguments share a specific type: the type of objects that can respond to the message that occurs in that point of the code. The typical statically typed languages that people use don't have a type system rich enough to express that kind of type, because they don't have a concept like "the anonymous type that is inhabited by values that respond to the 'close' message with no arguments."

      To put it in somewhat more concrete terms: every instance of duck typing can be replicated in a language like Java by using a one-method interface. The problem isn't that Java has static types; the problem is that Java makes it too costly in terms of programmer effort to create and implement interfaces; and to make it worse, which interfaces are implemented by a class is determined at compilation time, so that if you have to use somebody else's code, you're stuck with whatever interfaces their code was compiled to use. If the language had anonymous interfaces which were type-checked by the VM at class-loading time, then you could have both your duck-typing and most of your static type checking (at the expense that some problems would be caught by the class loader, but that's better than having them only be triggered when the actual code runs).

  134. Let me try that again by NotSoHeavyD3 · · Score: 1

    Let's try this again

    [sarcasm on]
    0th Never document anything and never comment anything. (Hey, when the next guy comes through and has to reverse engineer your code he'll thank you for the fun.)

    1st Don't write function. Just dump the code right in place. Hell, a function isn't really useful unless it's at least a couple thousand lines long.

    2nd Don't give things good names. I is fine and what the hell, name your stack 'q'. The computer can figure it out no problem.

    3rd Use GOTO's whenever possible.

    4th White spaces is for chumps so don't have things line up and for god sakes skip the formatting.

    [sarcasm off]

    --
    Did you know 80 to 90% of the moderators on slashdot wouldn't recognize a troll even if one dragged them under a bridge.
  135. who gives a **** by chriscorbell · · Score: 1

    ...what Joel "straw man fallacies for fun and profit" Spolowsky says about it? Seriously, all this dude does is amplify his self-importance with grandiose soft(war)e stories while giving mediocre programmers pseudo-intellectual cover to do whatever the hell they want when they're not micro-managed. Ooh, yeah, that's making us all so much more practical and productive. Blog to the hand, JS.

  136. Duct Tape, WD-40, and No Unit Tests by Anonymous Coward · · Score: 0

    The original article is written from an extremely narrow point of view. I don't want anyone wielding duct tape and WD-40 to create software that is used in a life/death situation (e.g., Care delivery in the Healthcare field). That stuff better be provably rock-solid (as much as one can verify). Joel is on a rant with blinders on and making a case that ignorance is bliss. He's being foolish. Appropriate use of appropriate technology is key. And having a diverse toolbox (and knowing how/when to use the tools) is equally important. You know...when all you have is a hammer, every problem looks like a nail.

  137. Errata by Spy+der+Mann · · Score: 1

    Correction: What I meant to say was: "What you just described can be done with RAII".

    1. Re:Errata by dgatwood · · Score: 1

      You're assuming that A. this is not code that has to be written in a procedural language, and B. that the resources are being consumed long-term. What of all of the temporary resources used only during the course of a single function or method? It's incredibly wasteful to bloat the size of your objects to try to accommodate such things, not to mention that doing so would add additional choke points for concurrency.

      --

      Check out my sci-fi/humor trilogy at PatriotsBooks.

  138. Type Errors Aren't Really My Problem by weston · · Score: 4, Insightful

    Except that it isn't. Sure, it starts, runs for a few seconds, and then exits due to typing error.

    Most of the time when I have an error, it's not a typing one. Sometimes it's something else the compiler would catch -- misspelled identifier, function or method name I misremembered (or forgot to implement), whatever -- but more often than not, I don't spend a lot of time hitting my face with my palm over a typing error.

    No, most of the time, I find that it's my logic: I only *think* I've given the computer instructions that will accomplish what I want it to do. But I've overlooked something, left out a step, forgotten a corner case, whatever.

    Having a compiler make sure my types are right doesn't generally contribute much to solving this kind of problem, at least for the common meaning of typing we're usually invoking when we're discussing this issue (e.g., typing as it's supported by languages like Java). You could argue that unit testing is kindof like a big type test (do these modules exhibit certain specified behaviors for their "type"?), and maybe there's a language that treats typing like that, which would be intriguing. But having a compiler tell me something like "class x doesn't have method y"? Not generally germane to most of the issues I have while developing, really, and even when it is, I don't really care if I discover this at run time, particularly since feedback is at least as immediate as what you'd get from a compiler if not more.

    And meanwhile, as others have pointed out, I'm spending less time writing convertors/adaptors.

    There are problem domains where I probably wouldn't use an interpreted/duck-typed language, but I find I'm more productive when I can use them.

    1. Re:Type Errors Aren't Really My Problem by DragonWriter · · Score: 1

      You could argue that unit testing is kindof like a big type test (do these modules exhibit certain specified behaviors for their "type"?), and maybe there's a language that treats typing like that, which would be intriguing.

      I've never heard of one, though languages that feature built-in design-by-contract features are not-entirely-dissimilar from that. But that could be the basis of an interesting idea to build into a test suite designed for any language (at least, any OO language) -- so that a mixin or interface or superclass can have designated "heritable" unit tests associated with it, and those tests are applied against classes that use the mixin, implement the inteface, or inherit from the superclass, to validate that not only is the right "structure" provided, but that the right behavior is provided.

  139. Re:Certainly true for Joels world of market econom by Tanuki64 · · Score: 1

    Our database was bulletproof; but we didn't care if the UI had a glitch.

    Strange, I coded also medical software. I my company it was vice versa. Database had a bug? Who cares. Was invisible. But the UI had to be perfect. Pixel precision. This was what the customer could see. I quit.

  140. Re:Certainly true for Joels world of market econom by Tanuki64 · · Score: 1

    We had hours of conversation whether a red was red enough. Colours and perfect layout of the printed reports were most important. Whether the actually results were correct....since our product manager did not understand the medical relevancy no resources were available to do even a rudimentary quality control there. Oh yeah, the user manual were perfect, too. It was his highest priority to find even the last typo in it.

  141. Re:True that - NOT by HornWumpus · · Score: 1

    Many years ago I inherited a project that had obviously been used to learn C++.

    Every feature of the language was basically used once. Except the comment delimiter.

    I believe stepping through a routine is the best way to learn it, even if it's readable.

    This is especially true of crappy object onion code.

    --
    John McAfee 'It was like that time I hired that Bangkok prostitute; to do my taxes, while I fucked my accountant'
  142. My criteria by Estanislao+Mart�nez · · Score: 1

    How do you determine what "needs" unit testing?

    I can't speak for everybody, but I tend to do this by asking questions like the following:

    • What depends on this piece of code?
    • How likely are we to go back and change this function in the future?

    If it's a function that either a lot of stuff depends on (or not a lot, but really important stuff), and we are likely to go back and change it in the future, then yeah, both of those are cases for writing unit tests for it. But if it's not a relatively "core" piece of code (that other things depend on), or if I can't imagine that it's going to get modified in the future, then no unit test. (If the "no revisions" assumption is proven wrong later, then yeah, you can write unit tests then.)

    The top targets for unit tests in my book tend to be highly reusable, complex pieces of code that simplify a non-trivial problem that gets encountered in many forms, and where it is likely that you will either (a) get some functional detail wrong that is only discovered in the future, (b) discover a faster way of doing the same thing. For example, code that generically implements a search algorithm deserves to be unit-tested extensively.

  143. What I've observed by Junta · · Score: 1

    As 'nice' as a clean architecture, specification, unit tests, etc sound, in practice I have observed problems:
    -Companies *still* think good software is done by larger development teams, and that a consensus is critical to acheive quality product. Everyone sits around, gives feedback, and lets other people provide their feedback out of being civil. This takes an eternity, and without some person stepping up to be the asshole who gets his way, a lack of consistent vision leads toward everyone marching toward mediocrity. As a result, I've found that a project with fewer developers who maybe touch base briefly once a week better than teams that have 2 hour meetings to ensure they are in 'lock-step' every other day. Good developers know when to touch base and sync up, and they also know when to just shut up even when they think their idea is better (if everyone insisted on getting the 'best' idea in instead of just getting the good idea in, projects just stall).
    -People invest so much time writing specs to code for that might be as well suited just to code up a prototype and describe it as a 'reference' implementation rather than trying to plan everything without touching code at all. For me, my mind just logically realizes fault with a design when coding that I wouldn't think of when writing it up in specs.
    -Unit tests are a mixed bag. They can catch carelessness, but exacerbate the problem of developer misunderstanding/miscommunication as they gain a false sense of security seeing unit tests pass (and they take a long time to develop, and if a modules interactions are sufficiently complex, impossible to get decent coverage).
    -What I describe was hinted at (though no one dared question unit tests) when I was taking software engineering. Unfortunately, the class was wrapped in buzzwords like 'extreme programming', 'agile processes', and functional requirements were supposed to be thought of in terms of 'user stories'. Hidden behind those buzzwords were grains of truth, however, as I saw the concepts 'adopted' by some software development shops, I really saw use of buzzwords with no meaning. 'User stories' even when called that ended up being the same thing that functional requirements have always been. Words like agile are attached to processes that will expend months of planning without a single line of code, then lock into the design and say nothing can change without a miracle even if the coding demonstrates something was really wrong with the design.

    In summary, I think a *lot* of the process-heavy shops/projects have the heavy process in place to compensate for mediocre programmers. The thought is that a team of a dozen programmers is important, and impossible to afford with good talent. The reality is a typical dozen-man team can be replaced by 3 or 4 really good developers with strong vision and produce a much better product in much shorter time. Don't try to get more developers, just get fewer, better programmers and don't saddle them with trying to pull the dead weight of an unskilled team.

    --
    XML is like violence. If it doesn't solve the problem, use more.
  144. For me... by Junta · · Score: 1

    I think I trend more toward a duct tape programmer but will adjust my styles to suite the rest of the project I happen to be working on at the time. As a frequent duct tape programmer, that doesn't mean I have a free pass to write piss-poor, unmaintainable code. It means I should be disciplined in my coding without others constantly having to double-check that I'm being disciplined. Bad coders are bad coders, no matter what framework you put them in. Overly architected scenarios aim to keep a developer's ability to screw up code to a small area, but they can always make a mess of the code they write.

    My strategy is to not try to use an architecture discussion ahead of time to predict if a peer's code is going to be bad, I wait for him/her to start checking in, and scan his/her's commits. If it looks fantastic, I am pleased and move on. If it looks like absolute garbage and is going to cause major problems, I will take measures to correct. If it isn't exactly what I want to see, and I believe I have a better way, but their approach seems workable as well, I keep my mouth shut because I know the debate will not be worth it. I fully expect my code to be read by others and critiqued as well without excessive discussion ahead of time.

    --
    XML is like violence. If it doesn't solve the problem, use more.
  145. is anybody else by goosesensor · · Score: 1

    noticing an unusually large amount of type-o's in this discussion? apparently TFA motivated some of you.

  146. There are different types of duct type programmer by drolli · · Score: 1

    a) the one who does duct type because he did not understand what all "these new" programming techniques *can* do for him *iff* handled correctly. (i.e. he tried it, he failded and decided it is not his incompetence but something different)

    b) the one who does duct type because he decides that this is the best route at some point (no i dont need a design pattern to filter a text file line by line - usually).

    c) the one who uses duct type because the people around him dont have certain experiences

    That much said, let me tell you a little story. I am an experimental physicist and a -taken that into account- a quite proficient programmer. I love programming in all flavors. And while i don't ship programs -i have to ship results acquired with the programs- i and some colleagues usually use the measurement software i write. The fist approach i had was quick to write and extremely ducted. It was a C program with a graphical display in java, which could be scripted by perl. Needless to say nobody used it or wanted it (because it contained 2 language bindings to be maintained - even when done with SWIG this goes beyond the limits).

    I dropped it directly after my masters thesis. I then wrote just a quite clean c to java binding, and scripted the software in jython. In my oipinion nowadays this was the *best* (best like the guy standing besides you table and telling you how greatly jython enables solid scripting of java ignoring some *minor* problems) solution.. This way found some acceptance (i.e. i was not the only one to use it), however other social problem in the chair prevented it from being used. Moreover there are not many physicist who can write these three languages.

    Then i did a decision which saved my phd thesis. I switched to matlab (the program would run under octave, but it used the instrument control toolbox). Yes. Matlab can be a pain in the ass. Yes i curse regularly at the data structures. I curse at the non-existence of multi threading, on the strange way of programming the ui and on many things more. However these restrictions make it - after some time - really easy to write extremely predictable and easy to debug code. Yes, i am feeling like being in the 80s again when i call the drawnow function to force an update of the ui. On the other hand, no thread replotting over and over is eating the processor resources. After the thing was settled, essentially the whole group started to use it (respectively a derived version of a co-worker who stayed there longer and was more keen on GUIs).

    After that (in 2006) i joined another group as a post-doc. The guys used either labview (the duct tape language #1 - in the bad sense) or tcl. After having looked at it (i avoided tcl for a long time) i decides to jump on tcl. I looked at the old software and decided it needs a complete rewrite. I looked at the oo extensions of tcl. I asked my colleagues - none of them knew anything about oop. So i skipped oo, but kept some parts of the program like i would do in oop. Writing the program was actually wasier than i though. tcl also is a very predictable language unless you are doing nasty things. The program is accepted well - because it works - and new features are easy to add - because the interactions with the old are easy to understand.

    So, yes, i am happy that i resisted the urge to over-engineer the solution and just implemented good ideas - and i am observing that i am better the more i duct-tape (with a vast amount of thinking before where NOT to duct-tape). However i am also happy that i did not start to use or extend the spaghetti code from my colleague - whose program is covered in several layers duct tape.

  147. Good vs. productive by Unoti · · Score: 1

    So true. I know so many people who I'm tempted to call them "good coders", except for the fact that they freakin never ship anything. They'll polish, and goof off, and talk about how their implementation covers all aspects of things that don't matter in the slightest to just delivering the app to the users.

  148. Re:True that - NOT by pushf+popf · · Score: 1

    So, I take your '20 year challenge' to heart and I work daily to keep that from happening with my own code or my co-workers. IMHO, there are way too many programmers out there that will read this 'duct tape' piece and use it to justify their own shoddy methods for me to read it without my head spinning around and taking the time to spout off about taking the time to do it right.

    I really hate to sound like I'm justifying crap, however with the current economy, businesses want something that works now, not in a year or two (or even six months). Something that does pretty much what they want and takes a month is worth much more than something that does 100% of what they want and takes a year.

    For a lot of businesses, if they can't get what they need right away, next year might not come.

    In fact, lately I've been seeing a lot of businesses going for Open Source solutions that don't quite do exactly what they want, but are close enough that the cost and time difference makes it a bargain.

    Just for an example, one client was considering Exchange/Outlook/Barracuda with some custom Outlook add-ons to connect to some internal systems, however after seeing the difference in software, hardware and development costs and time, decided that Postfix, Squirrelmail, Spamassassin, WebCalendar, Apache & PHP would be just fine.

    I hope all your projects work out for you, but I really don't think you'll have all the time available that you need to do a nice, neat, documented, provably-correct job on any non-trivial projects.

    In any case, have fun and if it starts eating your brain, just leave. There's plenty of work available if you can delver a reasonable solution in a reasonable time.

  149. Oh, then this would explain... by Anonymous Coward · · Score: 0

    Cobol. Yes, all you fanatics who really reeeeaaaaallly like it. Face it! It was created in less than 6 weeks by a small group (including Grace Hopper), and collectively did not expect their little project to last any more than about 6 months. They even said so, and also included that if they though anyone would be using their stuff more than 6 months, they would have bothered to do a better job of it. They tried to cure some of the warts about 10 years after they did the awful deed. They got some of them, but not all of them. They pushed it out quick with the full expectation that the stop gap would be used for a short time till something better came along. Thats the heart of the problem. Half working, warts and all gets adopted. Unless it gets fixed quickly, use swells, and it gets harder to make changes as people develop more and more around it. This is the other side of quick-n-dirty. Pushing it out quick *MUST* be followed by fix it up quick, at least try to get 80% of the warts out quick, and let people know that its a work in progress, and give guidelines where things are likely to change.

  150. Re:True that - NOT by Anonymous Coward · · Score: 0

    This demonstrates the need to built a prototype/model (using duct-tape method) before investing large amounts of resources developing the final product for large software projects.

  151. reminds me of a true story by BatesMethod · · Score: 1

    Once upon a time, there was a project that had been underway for 19 months, but had not yet delivered anything to the users. Management was concerned, and was considering drastic measures such as pulling the plug and starting over with a new project team. At this point, management brought in a trusted developer I'll call DT to help analyze the project's status.

    After a series of meetings with different project team members, DT gained an understanding that some software components had already been developed and tested, and it should be possible for the team to deliver a workable system within a few months. Seeing this, management relented and decided to give the project team a bit more time to deliver something.

    A few weeks later, at a weekly meeting, one of the team members mentioned they were considering using message queues, but he was leaning against using them. In agreement, DT said that using message queues to handle communications between components of the app looked like overengineering. At this point, a developer sitting across the table went ballistic and started spouting semi-comprehensible technobabble about why message queues were needed and how, at a previous workplace, nobody ever would have said this was overengineering.

    To be continued?

    Perhaps DT's criticism of the message queue approach makes him a duct tape developer in this case.

  152. Vista wasn't early by rdebath · · Score: 1

    It was three or four years late.

  153. Re:Mod parent up. However overengineering still su by Anonymous Coward · · Score: 0

    You want an example of duct tape programming? Somebody who hard-codes values that can be gotten from a database.

    That is not an example of duct tape programming.

    A true example would be a programmer who, when told that hard-coded values are going to be replaced with database values, decides to implement something quickly with MySQL or another database he already knows how to work with, rather than go through endless rounds of debating design requirements and customized DB interfaces.

    Step 1. Get it working
    Step 2. Get it working right
    Step 3. Get it working fast

  154. Eh, is that list a good thing? by SmallFurryCreature · · Score: 1

    The world is a big place, if your part of it fits on a small list, then you ain't all that big. Logic, it sucks doesn't it?

    --

    MMO Quests are like orgasms:

    You may solo them, I prefer them in a group.

    1. Re:Eh, is that list a good thing? by focoma · · Score: 1

      What you said makes absolutely no sense. How exactly does being part of a small list make you "ain't all that big"? How about, for example, a small list of billionaires, will you scoff at them, too?

      If a language is being used for important things by big, credible, and important organizations, that fact is enough to refute the claim that "nothing important is done in Ruby or Python."

      --

      - Francis Ocoma

      Please wait while Sig Request is being processed...

  155. Re:True that - NOT by Martin+Spamer · · Score: 1

    What you're saying is the Duct-Tape project give the appearance of success but was in reality a failure.

    The reality is that Duct-Tape projects allways need to be re-engineered from scratch using a proper engineering approach.

    In the old days we used to call them prototypes or proofs of concept.

  156. Dumb and Screws Things Up by Anonymous Coward · · Score: 0

    Duct tape programmers tend to avoid C++, templates, multiple inheritance, multithreading, ..., and a host of other technologies that are all totally reasonable, when you think long and hard about them, but are, honestly, just a little bit too hard for the human brain.

    And so they write FORTRAN with curly braces, and waste enormous amounts of time pushing out bloated spaghetti code (6-10 times as many lines of code, full of bugs that could have been avoided) because... they're stupid. Because they can't or won't learn to use the technology effectively.

    And here Joel's the guy who wrote Smart and Gets Things Done. Where (he argues) you're supposed to hire the best brains money can buy (I agree, but I am one ;-). Maybe the PHBs finally got to him...

  157. Re:Certainly true for Joels world of market econom by Anonymous Coward · · Score: 0

    Duct tape programmers may be invaluable tools in Joels world of overpervasive market economy and the corporate, but in some areas of application duct tape just does not cut it. Mission critical applications, like those used in health "industry", expensive satellites and other kind of space vessels, tunnel digging machines and what not - everything that just cannot fail - will not really benefit from Joels so cleverly coined "duct tape programmer" character.

    Actually, that's an ideal type of programmer for mission-critical stuff. If it really really has to work, then everything in Joel's essay about using the simplest programming style is good advice. The last thing you want is some meta-meta-programming that's impossible to debug, or too-clever-by-half multithreaded code.

  158. Re:Certainly true for Joels world of market econom by amn108 · · Score: 1

    Joel also mentioned duct tape programmers XOR'ing DWORD fields to fit in "next" and "prev" pointers of a linked list element. That kind of stuff really should not go into mission critical software, because it becomes just another component viable for debugging when things do not work as they are supposed to. Add to that the general attitude of duct tape programmers - "it has to appear to work" - mission critical stuff is REALLY not their field of expertise. The concepts of OOP and meta programming were INVENTED for the sake of proving theories before applying them in mission critical software. Duct tape programmers deal on a whole another level of reality - the "software has to ship" reality. Which is what Joel always stresses, being he is an IT boss himself. Simplicity is also orthogonal to complexity - NASA uses C indeed, because it is very easy to understand, but they are known to jump ship occasionally into C++ and other langugages, because they too get tired of constantly having to think like computers, which is what lower level languages like C force you to do, more so than C++ abstractions. A C++ program can be simple too, while it has more complex overall structure because of layers of abstractions it has. "Meta meta programming" is just wrong application of a perfectly valid and good concept. Just because most programmers struggle with it, does not make it less good. We need to learn more, that is all. Joel however does not have time for that. However, Joel does not (and perhaps should not?) design orbital guidance software.

  159. Re:Certainly true for Joels world of market econom by Anonymous Coward · · Score: 0

    Joel also mentioned duct tape programmers XOR'ing DWORD fields to fit in "next" and "prev" pointers of a linked list element. That kind of stuff really should not go into mission critical software, because it becomes just another component viable for debugging when things do not work as they are supposed to.

    Yes, but he mentioned that example in the context of the "pretty boy" nature of duct-tape programmers. We let them get away with it "because they're pretty enough, and smart enough, to pull it off" - in other words, it DOES work as it's supposed to. That's the only reason we forgive them!

  160. Re:Certainly true for Joels world of market econom by amn108 · · Score: 1

    Fair enough. I don't actually have much against the pretty duct tape programmer boys, I just through my years of development experience have come to appreciate the theories of computer science, and how they MAY help us. Meta programming is a wonderful thing when it works, and so are threads and what not. I just resent the stubborness of many developers who for some higher reason refuse to f.e. switch to C++, even disregarding the fact that C++ is actually a subset of C, and since gcc can compile both, why not use it where it is due? Same goes for many theories many simply close their senses on and mumble their "lalalalala". I think we owe more to these theories - often their purpose is to liberate us from the dirty work. We just have to learn how to properly use them. I find nothing amazing in a guy who can write Netscape in C. Joel does, because Joel likes his company make money using cheapest possible labour, which excuses his motivation entirely and is understandable. We will not get very far though with the kind of attitude. Remember that while Joel and many corporate duct tapers type away their simplified code, this code they write is in turn supported by tools that had come by after years of extensive and refined research into things much deeper than "real artists ship" mantra suggests :-) We owe those researchers a lot. Of course there is space for both disciplines, but they complement each other, while Joel seems to be entirely focused on his Holy Grail of Commercial Software Development. I have been following his blog for a while now, and I have come to know his ways - he is a very practical man with a team to manage. I respect his ways, but am of a different camp myself.

  161. Why are we still listening to this guy? by kuzb · · Score: 1

    Seriouosly. Joel had a single claim to fame (fogbugz) that most people didn't even like. Why do some people consider him an authority on anything?

    Stop posting this clown on the front page.

    --
    BeauHD. Worst editor since kdawson.
  162. Remind Me Again Why to Buy Your Book by Anonymous Coward · · Score: 0

    Joel, I always respected your writing, but take this article and jam it. All I can say after seeing the pretty boy duct tape-er specials - Good luck with your business from the crap you generate - I hope it works for you.

  163. re: Duct Tape Programmers by ps2os2 · · Score: 0

    I was an applications programmer from the late 60's to the middle 70's when I moved on to a life of Systems Programming.

    I have been there trying to debug mish mosh programs like the ones talked about in the article. They are NOT fun to debug in fact they were my worst nightmare. I was a typical programmer and I was called in in the middle of the night to try and fix these "bastards". Even with decent comments trying to figure out how you got there is often not easy. The dump you have is a point in time failure and just trying to figure out where in the program it failed is at times iffy. After complaining for years about "sphegetti" code management decided that structured programming was the way to go. Nice but it took too much time and deadlines went out the window. Then they came up with another name (long time forgotten) and it was semi workable and reasonably easy to code. We started to implement it and I will admit it was reasonably easy to debug and much more it was easy to figure out how you got there with a minimum of fuss. About that time I left programming for the wonderful world of systems and never looked back.

    When I coded I used the philosophy of minimum branching and lots of comments. When somebody had to debug my code it was easily done and I got a few thanks along the way.

    One time I coded up a fix for an IBM part of the OS and it took 1/50th the amount of time to run as the IBM version. I sent in the source for my fix and it was completely ignored and as of today 40 years later the program (or variation of it) is still running on the latest Z/os systems IBM is offering.

  164. self-serving, but self-destructive by cratermoon · · Score: 1

    I can see why Joel would advocate Duct Tape Programming. Systems shipped by Duct Tape Programmers tend to "work" for some subset of what the users actually need or want. This results in a lot of bugs being filed, so there's a need to track, assign, fix, and verify bugs. As it happens, the main product that Joel's company makes is bug-tracking software. On the flip side, Joel, do you REALLY want your company associated with the attitude that throwing something out there that sorta works is better than shipping a quality product?

  165. Re:Certainly true for Joels world of market econom by GWBasic · · Score: 1

    Strange, I coded also medical software. I my company it was vice versa. Database had a bug? Who cares. Was invisible. But the UI had to be perfect. Pixel precision. This was what the customer could see. I quit.

    Our customer knew what they were doing; and due to the nature of the project clearly prioritized the data.

  166. My response: by Anonymous Coward · · Score: 0

    I wrote a response in my blog:
    http://info.rmatics.org/2009/10/06/duct-tape-programming-macho-yes-practical-rarely/