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."

132 of 551 comments (clear)

  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 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.
    5. 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.

    6. 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.

    7. 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!
    8. 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.
    9. 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.
    10. 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)
    11. 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.
    12. Re:So, does the Duct Tape Programmer... by El_Muerte_TDS · · Score: 4, Funny

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

    13. 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...
    14. 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.
    15. 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.

    16. 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.

    17. 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.
    18. 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.

    19. 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".

    20. 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.

    21. 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...

    22. 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.
    23. 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.
    24. 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

    25. 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.
    26. 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
  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 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.

    2. 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?

    3. 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
    4. 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.

    5. 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?
    6. 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.
    7. 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.

    8. 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.
    9. 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.

    10. 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']
    11. 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']
    12. 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

    13. 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. ;)

    14. 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)
    15. 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.

    16. 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.
    17. 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.

    18. 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.
    19. 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.

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

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

      Maybe he's French...

    21. 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.

    22. 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.
    23. 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.
    24. Re:True that by HandleMyBidness · · Score: 2, Interesting

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

    25. 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
    26. 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.

    27. 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.

    28. 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.

    29. 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.

    30. 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.

    31. 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.

    32. 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.

  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 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.

    2. 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.
    3. 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.
    4. 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.
    5. 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.

  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 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.

    3. 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
    4. 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.

    5. 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.
    6. 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.
    7. 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!
    8. 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.

    9. 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
  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
  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.

  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.

  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 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.

  10. Yeah but... by Alanis+Morissette · · Score: 2, Funny

    They don't even hold a candle to gaffer tape programmers.

  11. "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 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
    2. 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
    3. 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.

  12. 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
  13. 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.

  14. 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
  15. 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.

  16. "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
  17. 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
  18. 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 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...

  19. The problem with Duct Tape Programmers by JohnWiney · · Score: 5, Insightful

    is Release 2.

    1. 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.

  20. 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...

  21. 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".

  22. 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 oldspewey · · Score: 3, Funny
      --
      If libertarians are so opposed to effective government, why don't they all move to Somalia?
  23. Re:WTF HAPPENED TO SLASHDOT? by zubiaur · · Score: 2, Funny

    Calm down, they just run out of duct tape.

  24. 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.

  25. 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
  26. 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.

  27. 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
  28. 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).

  29. 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.

  30. 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 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.

    2. 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.

  31. 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.

  32. 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.

  33. 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.

  34. 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.

  35. 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.
  36. 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."

  37. 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.

  38. 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.
  39. 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.

  40. 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.
  41. 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...

  42. 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 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).

  43. 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.