Want to read Slashdot from your mobile device? Point it at m.slashdot.org and keep reading!

 



Forgot your password?
typodupeerror
×
Programming IT Technology

Outstanding Objects (Developed Dirt Cheap) 397

Mark Leighton Fisher writes "Some readers might be interested in Outstanding Objects (Developed Dirt Cheap); or "Why Don't Developers Search the Literature?" It seems like I still see a lot of wheel reinvention going on, even with the wealth of code and information now available on the Net."
This discussion has been archived. No new comments can be posted.

Outstanding Objects (Developed Dirt Cheap)

Comments Filter:
  • Simple explanation (Score:5, Informative)

    by rickms ( 535706 ) on Friday June 06, 2003 @04:28PM (#6134977)
    It's because all us developers think our way is the better way :P

    Rick
    • by ERJ ( 600451 ) on Friday June 06, 2003 @04:42PM (#6135155)
      Well, of course, my way IS better.
    • Re:legal issues (Score:5, Insightful)

      by Anonymous Coward on Friday June 06, 2003 @04:46PM (#6135201)
      I develop in Delphi and I use a lot of stuff from the net (if you want to learn how to create reusable components, and use already made components, this is THE development environment, and there is even a free linnux version! and it is PAscal, not this joke of a language called C or C++).

      anyway, as I work that way (for my company), I then get nailed down by the legal team because most stuff on the net doe not have a licence attached to it, or has a wrong licence, or the company wants to kee 100% copyright on stuff, but we can not contact the authors or something like that.

      ie: if you develop for a company, you do not have the choice, you have to re-invent the weel (or hide it from your superior and legal teams). what a shame....

      • and it is PAscal, not this joke of a language called C or C++

        Pascal is a girly-man's language...strong typing is for people with weak minds. If I want to shoot myself in the foot, I don't want my language telling me I can't shoot myself in the foot, dammit! :-)

    • And some of us developers know and can demonstrate our way is better, quite frankly.

      Especially when it comes to perl, where the more times you use "use", the slower your code runs per instance.
    • by vladkrupin ( 44145 ) on Friday June 06, 2003 @05:07PM (#6135382) Homepage
      It's because all us developers think our way is the better way :P

      No, it's because re-inventing the wheel is a lot easier than customizing someone else's utra-cryptic-spaghetti-coded "wheel".

      For instance, I was just looking a good SMTP AUTH solution (aka roaming SMTP) that would integrate well into our customized version of qmail. There were a few solutions that almost did the job, but not quite, while offering a ton of extra bloat that we didn't need. A few hours and a hundred or so lines of C code later I had a working solution. Yes, I re-invented the wheel, but it was a whole lot quicker than figuring out and fixing someone else's code, and without all the bloat attached.

      My point: Often re-inventing the wheel is good, and sometimes is the only way to go.
  • A few reasons (Score:5, Insightful)

    by kin_korn_karn ( 466864 ) on Friday June 06, 2003 @04:28PM (#6134983) Homepage
    1) There's no pride in using someone else's code.

    2) GPL'd code can't be used in commercial apps (blah blah, technicalities, yeah yeah, just try to get it past your boss)

    3) If you're paid by the hour, what's the rush?
    • 4) You may get sued by SCO.
    • Re:A few reasons (Score:3, Insightful)

      by cp5i6 ( 544080 )
      1) You waste alot of time

      2) Since when can't GPL'd code be used in any commercial application?

      3) I'd have to agree with you on this one tho :)
    • Re:A few reasons (Score:5, Insightful)

      by Xzzy ( 111297 ) <sether@@@tru7h...org> on Friday June 06, 2003 @05:03PM (#6135357) Homepage
      4) Other's people's code is documented by monkies, if at all.

      5) Integrating foreign code can be more work than just writing it yourself.
    • 4) the documentation invariably sucks. I'm working on my first major C++ project. The system involves a deeply embedded Python interpreter, and a large amount of STLport. By most accounts, these are well-documented libraries.

      I am quickly losing my mind trying to track down poorly written documentation through conflicting and dated sources. And nobody puts any friggin' useful comments in their code. Hell, it took me the longest time to find out that auto_ptr's aren't meant to go in container objects, w
      • Re:A few reasons (Score:3, Informative)

        by be-fan ( 61476 )
        Maybe you should learn the use the STL first. One of the first things they teach you when learning the STL is that auto_ptr cannot be put in containers (try boost::shared_ptr for that). Its one of the most well documented libraries I've ever used. Try the SGI STL site, as well as Dinkumware's STL reference. Anyway, Google is your friend. A search for auto_ptr nets this article, on using auto_ptr effectively, [www.gotw.ca] as the first hit. It has an entire section titled "Things Not To Do, and Why Not To Do Them".
    • The tedium factor (Score:5, Interesting)

      by jtheory ( 626492 ) on Friday June 06, 2003 @05:07PM (#6135391) Homepage Journal
      Yes, I'm paid by the hour, but I also care about the quality of that hour. If the problem is interesting, I tend to research other solutions (to scope out the pitfalls and features I might not have thought of), then I'll often implement my own solution, because learning someone else's code tend to be pretty high on the tedium scale.

      If the problem is NOT interesting, I have a lot more motivation to find someone else's code that I can use; if I find a quality solution, I can plug it in, spend hopefully minimal time debugging and testing it, and move on.

      And there CAN be pride in using someone else's code, actually; I really get a kick out of using libraries and sending back elegant enhancements or bugfixes back to the authors ("Your library was excellent. I improved it.").

      Also, if the code you found is really good stuff, it might help you to finish up a complex feature in record time, which also feels nice ("Oh, I almost forgot to mention it, but that new report we scoped out yesterday is out on the test server").
  • AC/DC (Score:5, Funny)

    by blackmonday ( 607916 ) on Friday June 06, 2003 @04:28PM (#6134985) Homepage
    I wasn't aware that AC/DC was involved in software development till now.

  • by Cally ( 10873 ) on Friday June 06, 2003 @04:30PM (#6135005) Homepage
    If it's generic enough to be scratch your particular itch, you'll need to do a lot of work to implement the specifics of your case. If it's very highly specialised, you'll need to do a lot of work to adapt it to the specifics of your case.

    Given the choice, would you rather work on adapting someone else's code for your situation - or would you rather write your own from scratch [sourceforge.net]?

    (it's a rhetorical question ;)

    • By your argument, why even use standard APIs? I mean, isn't CPAN just a bunch of domain-specific APIs put on the web?
    • by etcshadow ( 579275 ) on Friday June 06, 2003 @04:48PM (#6135216)
      This is honestly very often the case. I think that the best comprimise (from my own experience) is to take overly-flexible packages and write your own middle-layer that glues together the powerful but too flexible to be useful code with your own specific needs.

      Of course, the humor is that you find yourself writing wrapper layers for wrapper layers.
      • Of course, the humor is that you find yourself writing wrapper layers for wrapper layers.

        And that leaves you with an application having an efficiency similar to that of a big SUV. OK, so I do it too, but that's no excuse. ;)

        • Yeah, but one of the ironies of software development in this day and age is the concept of total cost:

          It used to be the computation cycles were incredibly expensive things, and programmer work-hours were relatively inexpensive in comparison (well... I don't mean literally cycles compared to hours... but say billions of cycles compared to hours or some such). Of course, in today's world, the time of a *good* programmer can be fairly expensive, whereas big fast computers are fairly cheap. When you look at
    • Amen, brother!

      Just a simple example: I was looking for a good C++ class that would encapsulate the mess that is the Windows Registry. There are several out there, but they all manage to drag in massive functionality or frameworks that I am not currently using and would prefer to avoid. I am not going to start using MFC just to read a few registry values.

      The C++ string mess in Windows makes me cry every time I have to deal with it. I'm sick to death of converting between BSTR, TCHAR, WCHAR, char, CComBSTR,
    • Templates rule, and C++ will never die. (unless people stop understanding the usage of templates).

      I personally am firmly against object reuse. Unless it's really plain simple objects like smart pointers.

      Unfortunately, I am working right now, and can't go in depth about what I think of this... if you wanna flame me, go ahead, maybe it'll summon up the courage in me to explain better. If on the other hand you know what I'm talking about, please explain to the rest of the world on my behalf... =)

  • It seems like I still see a lot of wheel reinvention going on, even with the wealth of code and information now available on the Net.

    SCO
  • by delirium28 ( 641609 ) on Friday June 06, 2003 @04:33PM (#6135051) Journal
    ... but I could have wrote it better, using my own hybrid authoring algorithm.

    ---
    I read your email...

  • Three Words... (Score:3, Insightful)

    by angst7 ( 62954 ) on Friday June 06, 2003 @04:33PM (#6135053) Homepage
    I still see a lot of wheel reinvention going on...

    Not Invented Here.
    • Sometimes it's even worse than that.

      Sometimes it's Not Invented by Me.

      The trick is knowing when to reuse and when to reinvent. Neither approach is the best one the majority of the time.
  • by Anonymous Coward on Friday June 06, 2003 @04:33PM (#6135055)
    but I always look to see if the problem has already been solved by some one else first. The only thing that I have encountered is when I share the facts I find, people usually respond "that's not the same thing." then 5 months later they come back and say, "you know, this is like that problem you mentioned a while back."

    some times it's not appreciated. but hopefully people eventually come around.

  • by truth_revealed ( 593493 ) on Friday June 06, 2003 @04:34PM (#6135061)
    Here's some of the issues I've run into with a lot of the free software libraries out there:

    library uses wrong language

    library has the wrong license

    library pulls in too many external dependencies

    library not threadsafe

    But it's worth the search - occasionally you find a real gem.

    • Quit blaming the excellent code out on CPAN. Blame the idiots who can't properly decompose their programs or even properly install what they find.
    • # library pulls in too many external dependencies

      BINGO!

      i cant count how many times I tried to use a "library" that had 4-5 dependancies that made it 100% useless.

      and then you get some that are a Dep hell going 3 to 4 levels deep.

      no thanks.
      • by realdpk ( 116490 ) on Friday June 06, 2003 @05:18PM (#6135485) Homepage Journal
        Not to mention how much CPU time each of those takes. For example, check out the "tinyurl.pl" example in CPAN. It uses:

        use POE;
        use POE::Component::IRC;
        use LWP::UserAgent;
        use HTTP::Response;
        use HTTP::Request::Common;
        use URI::Find;

        Each of which probably use a good number of libraries themselves. Running perl -wc on the script takes .6 user CPU seconds alone - an approximation of how much CPU time it takes to start up (and by my measurement, a pretty accurate approximation).

        Hell, check this out:

        $ time perl -e "use POE"
        0.23s real 0.21s user 0.01s system

        Sick.
        • $ time perl -e "use POE"
          0.23s real 0.21s user 0.01s system


          If you can reimplement what you need, and never be more then a quarter of a second less effiecent, and never crash or abort where the original wouldn't have (because a crash or abort takes minutes and pisses off the user much more then waiting for the program to start up), and justify spending the time reinventing the wheel over .6 seconds of startup time, then go for it. But unless you writing MacOS or Mozilla or X, it's just not worth it
  • by TheFlyingGoat ( 161967 ) on Friday June 06, 2003 @04:34PM (#6135063) Homepage Journal
    It's far easier for me to spend time recreating code that exists already than to hunt down what's out there, read the documentation, figure out what drugs the developer was on, and customizing it. I make use of perl modules and bits of code on Usenet, just to save time, but that's the extent of it.
    • It's far easier for me to spend time recreating code that exists already than to hunt down what's out there, read the documentation, figure out what drugs the developer was on...

      Yeah...it's always a pain when you guess the drugs wrong too. If you don't take the exact same drugs, you still can't understand the dude's code.

      I was *really* unproductive in my job when I spent a long time taking the wrong drugs...darn, that was a crazy week.

    • Finding it is HARD (Score:5, Interesting)

      by m11533 ( 263900 ) on Friday June 06, 2003 @05:07PM (#6135385)
      I have been involved in software reuse since the mid-1980s and possibly even earlier. There has been lots of energy expended on the problem of making existing implementations extensible, one of the strengths of OO technology, though not requiring OO. The big piece that has always been missing has been a major concerted effort focused on facilitation matching a developer's needs with existing software.

      There are many mechanisms that can assist such as:

      1 - technical reviews. When these happen, you get a number of co-workers together to review your work. Not only does this assist in ensuring that direct work (architecture, design, code) is correct, but it also provides an opportunity for all those involved in the review to search their knowledge of pre-existing "parts", be they architectural, design, or actual code, and to suggest you investigate them. Of course, if you're like me, then actual review meetings where a number of people sit down and examine your work just do not happen any more. Thus this form of identifying existing work that can be reused no longer functions.

      2 - CASE tools ... I have long felt that CASE tools, yup those tools that are totally out of vogue right now, would be of greatest value if they had a dual function. Their primary function would continue to be as a means of describing architecture, design, or code, but a secondary function would be to, in the background, perform a continuous search of existing work looking for matches. I have never seen a tool that does this, yet this seems a tremendously valuable function.

      3 - personal memory - only works for those items you already are familiar with, which frequently gets voided when changing jobs.

      4 - institutional memory - this is similar to the technical review mechanism, yet is less well defined. The real question here is HOW does an individual tap into an institutional memory? Documentation search? This is far less than perfect even if all work was well documented. Code search? Even worse at turning up matches to needs.

      So... the bottom line is that it truly is VERY difficult to match up needs of a software development effort with the existing software that is available.

      Once case in point... I worked on a very large project for an FAA (Federal Aviation Administration) contract. One mechanism I needed was a circular buffer/queue. These seem very straight forward to implement, and an obvious place to use an existing piece of design/code. Well, even after extensive search and review I could not find such a part and built my own. Later, I discovered there were at least six independent implementations of a circular buffer/queue in this single project team. All of them were general enough to meet the other implementation's needs, yet somehow none of us knew of the others' overlapping work. If we couldn't coordinate the reuse of these six independent efforts (and that means we all built the same basic algorithm, found the same set of bugs... and yes, using our code management tool I was able to see the same bugs being fixed in each implementation... and thus a total and unnecessary duplication of effort), how in the world will we ever solve the problem of reusing work outside the single project team, or outside a company?

      There are some examples of wild success with reuse... though they seem to me to be more success though definition. All of those shell scripts that are built from individual command line tools are examples of reuse, where each command line tool represents a unit of software available for reuse. But, I think we all think of reuse more at the code module level... a function, or class, or small library. And it is at this level that I think we fail miserably, and it is my contention that we fail because we can't easily find the candidates for reuse.
  • by Gaxx ( 76064 ) on Friday June 06, 2003 @04:34PM (#6135072)
    I always hit the net before emarking on coding. There's no way I'm gonna spend 6 hours throwing together code that someone else has spent 20 lovingly moulding for me :-) I just too damn lazy... What can I say, Wally is my hero :-)
  • Dirty Code (Score:5, Funny)

    by bplipschitz ( 265300 ) on Friday June 06, 2003 @04:36PM (#6135085)
    Done Dirt Cheap.

  • It doesn't matter if the code is available from somewhere "out there", from inside your company, or even from inside your group. The reality is that developers in general don't play well with others. Why? For a number of reasons.



    First, it is no fun to use someone elses code. This is why at one time Apple computer (many years ago) had 13 different (yes, I counted them) memory managers being written. It was fun to write a memory manager, to solve the problems involved, etc.



    Second, people don't trust one another. How do I know that you have implemented this code correctly? How do I know that you will deliver the modifications that I need? That you will deliver them on time? I can't, so it is better to do it myself.



    Bottom line, we don't play well with one another, because we want all the fun for ourselves and because we don't trust the other folks (called flipping the bozo bit in some corners).

  • Are you projecting? (Score:5, Interesting)

    by Ars-Fartsica ( 166957 ) on Friday June 06, 2003 @04:41PM (#6135138)
    My organization makes extensive use of CPAN, PEAR, etc to great benefit.

    Most developers probably don't even know how to search CPAN or install a module from it (or PEAR for PHP). So they roll their own inferior solution. Those who have spent the three minutes reading the docs are getting an incredible benefit.

    • Most developers probably don't even know how to search CPAN or install a module from it (or PEAR for PHP). So they roll their own inferior solution. Those who have spent the three minutes reading the docs are getting an incredible benefit.

      I think this is true. Add Java to that list -- which is ironic because Java was supposed to make code reuse so much easier. Better, more descriptive, more searchable docs would help. Not that I'm any better. I wish I knew better how to find what I need.
      • by Monkey-Man2000 ( 603495 ) on Friday June 06, 2003 @05:16PM (#6135473)
        Apache Jakarta has some really great libraries for Java. I use them extensively. That allows me to worry about high-level issues as opposed to being bogged down with the details of XML-parsing and validation, translation, etc. Additionally, Jakarta Commons has a number of useful tools that I would find myself re-implementing if they weren't already available, like the HttpClient. I've been really impressed with the stuff they've produced. However, it certainly adds to the bloat. Also from what I've used of it, Struts is awesome.
  • Much of the time I like to reinvent the wheel. There are several reasons. First, it's a learning exercise, second Iown the code I write and third I do it my way. This may seem petty, but if there are bugs, I'm the only one to blame, and I learn by doing. If I was doing something in the course of my paid work, then I would use the conventional resources.
    • Except that your training yourself to reinvent the wheel every time, which means you won't know where to look for "conventional resources" when you need them.

      Which is pretty much what happens everywhere...
  • by peterpi ( 585134 ) on Friday June 06, 2003 @04:44PM (#6135173)
    When was the last time one car had exactly the same wheels as another? (Stop; I don't actually care for the answser).

    We reinvent the wheel because new wheels look sexy, not because they roll any better.

    I have absolutely no idea whether there's a point to be proved with that, but it's kinda interesting.

  • by cpparm ( 239276 ) on Friday June 06, 2003 @04:45PM (#6135177)
    If your problem is trivial, it's faster to write your own code. If your problem is not that trivial, it takes a lot of time to try to understand someone else's non-trivial solution. More than it would take to write your own code.

    • Because you're just as smart as that other guy, right? And your code will always be better than his is.
    • Plus, if you wrote the solution, then when something goes wrong, you actually understand the solution, and can therefore attempt to sort it out. On the other hand, if you didn't write it, then you'll have to figure out somebody else's solution in order to find what went wrong.

      Sometimes, that's simple. I think a lot of developers just don't even want to have to try to understand somebody else's solution.

      Oh ya, and then there's that ego thing.

  • by jj_johny ( 626460 ) on Friday June 06, 2003 @04:45PM (#6135186)
    1. Lots of students don't even listen in class about the reuse stuff.

    2. They are taught the complete spectrum of software development from function to complete program. So they think that they can do it all reallllly well.

    3. They don't get in the habit when they start.

    4. They get paid by the hour not the thought. (sorry thats an old lawyer joke.)

  • Library bloat (Score:5, Interesting)

    by Stiletto ( 12066 ) on Friday June 06, 2003 @04:46PM (#6135197)

    I write a program, and part of it needs to simply read a .PNG file from disk and draw it on the screen. That's all. This should require a short and simple executable.

    Do I _REALLY_ want to pull in libpng and libSDL just to do this? What kind of risks does pulling these libraries in add to my project? How much will this bloat my code? Will users be confused from the different versions of these libraries? What if I one day want to port to a platform that these libraries work on?

    Turns out it's usually simpler, easier, and less risky to just roll your own.
    • Re:Library bloat (Score:5, Insightful)

      by kma ( 2898 ) on Friday June 06, 2003 @05:19PM (#6135493) Homepage Journal
      Do I _REALLY_ want to pull in libpng and libSDL just to do this?

      Yes.

      What kind of risks does pulling these libraries in add to my project?

      The risk that you will hit a bug in the library. Which is much smaller than the risk that there will be a bug in your one-off k-spiff png display engine (hence, OOKSPDE).

      How much will this bloat my code?

      It will bloat your code by the additive inverse of the code size of your OOKSPDE. The user already has the library on their disk. If it is dynamically linked to your executable, they pay nothing to use it.

      Will users be confused from the different versions of these libraries?

      Would you rather they lose data because your broken OOKSPDE doesn't handle transparency properly?

      Turns out it's usually simpler, easier, and less risky to just roll your own.

      It sounds like you either have a delusionally high estimation of your own abilities relative to those of your library-writing peers ("Of course the code I write will be faster, more correct, and less bloaty than the specialised code that those people who really understand the problem and spend time solving it well!") or you place very little value on your time. Oh well. Have fun writing png-frobbing code for the rest of your life.
    • Re:Library bloat (Score:5, Informative)

      by Balinares ( 316703 ) on Friday June 06, 2003 @05:34PM (#6135599)
      #!/usr/bin/env python
      import sys
      from qt import *
      a=QApplication(sys.argv)
      img=QLabel(None)
      img .setPixmap(QPixmap("my_image.png"))
      a.setMainWidg et(img)
      img.show()
      a.exec_loop()

      9 lines.
      You're welcome.
      It would probably have been even shorter in Perl.

      'Bloat' is not knowing the right tools for the task.
    • Re:Library bloat (Score:3, Informative)

      by dvdeug ( 5033 )
      Do I _REALLY_ want to pull in libpng and libSDL just to do this?

      You're going to write your own code to read PNG files?!? Just how much time do you have to write code and fix bugs?

      How much will this bloat my code?

      You think that rewriting the code will take less space then interfacing to an existing library?

      Will users be confused from the different versions of these libraries?

      Much less then the users will be confused when they run into a file that you can't read and all their other programs can. All
  • Think of it this way (Score:3, Informative)

    by Iron Monkey543 ( 676232 ) on Friday June 06, 2003 @04:46PM (#6135198)
    Let me make an analogy between using someone else's code vs. writing your own and buying a (not custom) PC vs. building one yourself (a few years ago).

    First, the PC came with this video card I didn't like, so I went out and bought a different one. The OS that came with this OS don't use, so I have to reformat the hard drive. The case was also ALL plastic and it was hard for me to drill some clean holes into it for my modding. I had to go out and buy a different case. In fact, i spent my time reassembling the whole darn thing just to make it fit my needs. I should have just built it from scratch and save alot of time!

    That's why I don't like to use someone else's code. Now, I would LOOK at their code and see how it works, and then write my own to work the same way. If I am lucky, their code is already the exact way I want it, but it's very rare.

    Very modular codes however, are useful at times. THe only problem is that it comes with other crap u dont need and takes up coding space, but that's just nitpicking when you dont have any time.
  • ... they could not pretend they invented something and patent it
  • by Lendrick ( 314723 ) on Friday June 06, 2003 @04:47PM (#6135209) Homepage Journal
    Ever tried to work a library that does something very similar to what you need it to do, but not exactly? You end up writing more code to get it to work with your program than you would have written just implementing it from scratch. That code tends to be bulky, difficult to maintain, and prone to bugs. Sometimes it's better just to start with a clean slate.
  • by dpbsmith ( 263124 ) on Friday June 06, 2003 @04:48PM (#6135215) Homepage
    ... then to find a wheel, see whether the documentation states how many spokes it has, give up and count the spokes, determine what the rights status of the wheel is and, if it's not open source, what the royalty agreement is, convince your boss to license the wheel, compile the wheel, fix the compile errors due to your compiler vendor not implementing the language standard properly, build an adapter to allow the metric wheel to fix on your U. S. Customary hub, test the wheel, discover that it vibrates dangerously at 16.5 mph, try to balance the wheel, and finally give up and build a wheel.
  • That's nice (Score:3, Insightful)

    by The Bungi ( 221687 ) <thebungi@gmail.com> on Friday June 06, 2003 @04:48PM (#6135218) Homepage
    But not all languages have the luxury of having a CPAN or PEAR available. Even then it doesn't always make sense. Most of the lower-level stuff (i.e., HTTP) can be pulled in, but higher level "solutions" are almost always not applicable to the problem you're trying to solve.

    That's why patterns are all the rage. It's much more efficient to code within a pattern than it is to hunt down, examine and adapt code written by someone else.

    And of course, as others have pointed out, the Not Invented Here syndrome is quite prevalent. It's always more fun to code your own stuff, and it's a learning experience.

  • For all of the idiotic posts claiming to be able to write superior code to what you would find in mature CPAN modules, I recommend a challenge.

    Try to rewrite LWP or DBI yourself with no peeking. If you have something even 50% as good as these modules in two months of full time coding I will be amazed.

    Its exactly the best coders who make heavy use of CPAN.

  • Often the problem is that the libraries or code fragments have poor documentation. The amount of time you spend trying to integrate this algorythm to yours is sometimes about the same amount of time it takes to figure out what it does and recode it yourself. Further when debugging that makes it easier to track down.

    Obviously this will vary depending upon how complex the stuff is. But for a lot of simple stuff that's why. Those of you who haven't had the joy of debugging someone else's code might not r

  • If and when I borrow a code, it's usually a library at a time. Anything smaller that 10 or 20 thousand lines of code will take longer to figure out how it works than it would to simply recode from scratch.

    A lot of my projects are AI and/or web based. Web based apps are too damn terse to be bothered. (Anything more sophisticated than a pretty database query ought to simply message pass to something beefier.) AI programmers think that every project require writing their own custom database engine. I general

    • Back in my day I had to write games in BASIC, on a 4.7Mhz computer with no hard disk and 128K of RAM. And I was grateful

      This is the first time I have ever seen a tagline of this form that I could agree with and feel was a reasonable statement. Aren't these supposed to be ridiculously overstated?

  • Code reuse is a great idea. In theory. Where everyone wants to live, cause everything works in Theory.

    Quite often it is easy to pull in someone elses library to work with your code. Though note, libraries. Libraries are designed to have some reuse to them. But the library has to have a static API that isn't going to change, which isn't always a safe assumption.

    Another aspect is refactoring. Here at my current job I have spent the last month refactoring one of our applications. I used a lot of conce
  • The time it takes to fully understand other code is often as large as the time to create code in-house. For code created internally, there's someone who understands everything about the module being used. Because of this, if there's a bug in internally developed code, it can often be easier to find and fix than third party code.
  • ...is Monday morning quarterbacking, then doing things your own, "better" way. The other half is having someone pay you to do this.
  • Granularity (Score:3, Interesting)

    by jfengel ( 409917 ) on Friday June 06, 2003 @04:56PM (#6135286) Homepage Journal
    Well, I would RTFA if I could RTFA, but I'll try to give you an answer anyway.

    The problem is granularity. I interpret from the title (and nothing else, since I can't RTFA) that they want to reuse individual classes rather than entire projects.

    I _hate_ the fact that every UML diagram begins with a blank sheet of paper and that individual classes are almost never reused.

    Individual classes, however, are even harder to reuse than whole libraries. In theory you could take somebody's generic model of, say, a Person, and extend it with the extra things you need. As long as Person were well-written it might actually be reusable.

    But in practice, it won't extend the classes you need it to extend, and it'll probably be tied in to a vast array of other classes that you simply don't need, making your life very complicated. Since requirements gathering is far harder than code writing, people who have to gather their own requirements generally just end up writing the code to match, since it's a trivial effort.

    You lose a lot when that happens: you can't reuse a lot of other processing code that you want. However, how long will it take to find that code? Days, plus the time it takes to adapt? How long would it take you to write it yourself?

    The lower the granularity, the harder reuse is. I'd like to see better, but with present programming languages it's not going to happen.
  • by Lord Grey ( 463613 ) on Friday June 06, 2003 @04:56PM (#6135291)
    Much of the time, the problem I'm trying to solve is either not exactly solved by others' libraries or those libraries do far more than what I need.

    I do, however, try to find those libraries before reinventing the wheel. Occassionally I do find one that will work, and then I'll be faced with integrating it into the project. At that point, I've always found it beneficial to go through and edit the source, for two reasons: 1) a consistent coding style throughout the project makes it easier to maintain, and 2) I tend to learn a hell of a lot by actually trying to understand what I'm editing. Then, maybe, next time I can reinvent the wheel all by myself.

  • by Anonymous Coward
    Case in point: I spent a week searching for C++ source code for a math expression parser (put in x+5*y, get result). I found ZIPPO, except for 3rd party libraries, and ONE crappy C code from 1997 and ONE C++ code written in German that has a ton of subtile bugs.
    So unless the code is EASILY FINDABLE, WELL DOCUMENTED, and USEABLE, then it's MUCH faster to do it yourself.
  • The intro implies that only OOP can make reusable components. I don't want to start yet another paradigm war, just point out that there are non-OOP component solutions to a lot of things. I used to use extensive math and graphics FORTRAN libraries as an intern long long ago. They were surprisingly useful and easy-to-use in most cases. I am not promoting FORTRAN here in any way, for there are a lot of nasty things about it; but it still allowed extensive component usage before OOP was the thing.
  • by LinuxParanoid ( 64467 ) * on Friday June 06, 2003 @04:58PM (#6135311) Homepage Journal
    I'm not sure I that the 3 reasons Mark Fisher gives for lack of code-reuse are the main issue. Usually I think programmers are just too lazy to search. I had one predecessor that I always suspected had this disease. I've noticed in myself at times too. Usually you think that if you (re)write it, it'll be easier than trying to understand someone else's code (often but not always, you are wrong. :).

    That said, let me pass on a little practical story. Having built solutions myself that were quick and dirty, for version 2.0 of a recent project I worked on, I decided to dump most of my code and try building on an existing, well-known open source project in my area. I've spent 4-6 weeks trying to take a well-known piece of open source code that performs a similar function better than my quick&dirty approach. I'm not finished, but with the deadline past and with significant obstacles remaining, I'm really questioning my well-intentioned attempt at re-use.

    So let me toss out some more reasons why developers may not "search the literature":

    1) the (time)-cost of doing the search,
    2) the cost of figuring out the implementation details of what you do find so that you can effectively use it (which can be anything from understanding perl module documentation to understanding the concepts behind lex/yac or some protocol),
    3) the time/development-cost of integrating the open source codebase into your codebase; this includes porting or handling dependency chains
    4) the risk that, because of some detail that you won't understand until you fully invest in #2 (above), it may end up that this tool you are reusing actually doesn't solve your problems for some unexpected underlying implementation reason (something you can avoid if you fully develop your own solution with methods you *know* will work)
    5) the risk of choosing the wrong alternative (e.g. picking one templating system out of the dozen alternatives that then gets orphaned)

    I'd like to reuse code more, but rationally there are a bunch of reasons why I don't do more. These need to be addressed more satisfactorily for more code sharing to flourish.

    --LP
  • Firestone, Goodyear, Michelin, Continental etc all redesign the wheel every year. They try new designs with varied rubber thickness, sidewall materials, traction depth, doping materials. There are plastic wheels that prevent shopping carts from leaving the parking lot, airless rubber wheels in public bicycles in Prauge, castor wheels that come in pairs and run on carpet. There are wheel bearings in the axles of your car, wheels used to roll the drum in your drier, wheels that hampsters like to play in.
  • by zipwow ( 1695 ) <zipwow@gmail . c om> on Friday June 06, 2003 @05:01PM (#6135333) Homepage Journal
    I think there's also the perception that looking for a library to do what you need isn't work, while writing a solution is.

    If you've solved it by finding a library that does it, but it took you a while to find the right library and figure it out, you may find yourself in the hole. Your dept manager may ask "Why aren't you finished? You didn't have to write that component..." and be unhappy with the (accurate) reply of "Well, no, but it took me a while to evaluate the libraries available..."

    I'm blessed to be avoiding these at my current position though, so I'm thankful.

    -Zipwow
  • by nuttyprofessor ( 83282 ) * on Friday June 06, 2003 @05:02PM (#6135351) Homepage
    Back in 1990 I worked for a small company that built
    graphics boards and my first task was to debug
    the "polygon fill" routine in their firmware.
    It turns out they use their own "home brewed"
    algorithm that was slow, memory hungry, and didn't
    handle degenerate cases correctly. If anyone in
    the company would have taken the time to pull
    any one of the graphics textbooks off their shelf
    (e.g., Foley, van Dam) they would find a much better
    solution.

    I ended up rewriting the module myself using
    the classic solution -- it was faster, used little memory,
    and handled degenerate cases reasonably.

    It was my experience that everything was a badly
    reinvented wheel when I worked there.
  • Blah (Score:2, Interesting)

    by CommieBozo ( 617132 )
    Some or all of these things happen:

    The library is under a license other than the MPL or LGPL.

    We try to make the library work for hours, only to find it doesn't do exactly what we need, or is horribly broken.

    We try to use the library, but it's broken, and the developer lives in France and only responds to emails while we're asleep.

    It would be faster for us to write our own then to decipher someone else's code.

    The only real third party library we use mostly does the job, but we had to wrap it and impleme
  • by revbob ( 155074 ) on Friday June 06, 2003 @05:07PM (#6135392) Homepage Journal
    I remember a task I had to convert a set of World Toolkit NFF files to Inventor, or to some file format where we already had a converter that would turn them into Inventor, like DXF.

    I spent a fun week exploring through the computer graphics repositories of the time (it was some years ago), but I finally decided I'd had enough fooling around, so I hacked out some quick C and converted the files.

    The converter I wrote and debugged in a couple of hours was virtually guaranteed to crash and burn on any WTK NFF files but those, but I didn't care. What I needed was those files in Inventor so I could get on with the job of lighting and animating them.

    That's the problem with the Booch Components and a good percentage of the things I see out there in the repositories today: they solve the general problem with such elegance that they're really optimally useful only for people who want to understand the general problem instead of knowing exactly enough to solve the specific problem they have.

    Well, here's a news flash: a good part of the time I'm to busy to learn how to solve the general problem. What's more, I know I'll never need this knowledge I acquire again, so a quick in-and-out of my brain is all I need.
    --
    The end

  • Tool makers... (Score:3, Informative)

    by rusty0101 ( 565565 ) on Friday June 06, 2003 @05:08PM (#6135402) Homepage Journal
    My grandfather was a Tool and Die maker. If GM mechanics were having problems tightning down the distributer cap after adjusting the timing, GM would send him a car, explain the problem, he would take a look, make a couple of different wrenches along the idea of what he thought would do the job, then send back the wrench that did the job best.

    The knowledge required to get the wrench to work best required understanding several mechanical principles that he was particularly good at, and I am sure that there are others these days as well, mostly working directly for the automotive companies. (Either that or they have much better engine designers who have made it simple to get to all nuts and bolts without special tools. Looked under your hood lately? Which do you think is most likely.)

    In any case, the common idea is that if you are going to make something that fits a custom need, you are unlikely to be able to do it with off the shelf components and tools. Occasionally there may be a nice general tool that would suffice for the job, in software it might be a component of MSfts .NET tool set, that you have personal reasons for not using (can't stand msft, can't afford .NET, can't follow the msft licence requirements, don't like that Craftsman sold someone's pattented idea to Snap-On without paying royalties to the inventor) and so you make your own tool to do what ammounts to the same job.

    That's my thought, I could be wrong.

    -Rusty
  • Two Reuse Stories (Score:5, Interesting)

    by weston ( 16146 ) <westonsd@@@canncentral...org> on Friday June 06, 2003 @05:24PM (#6135544) Homepage
    I often don't reuse for reasons described very well by other posters, but I wanted to mention some cases where I either did reuse or wanted to.

    Two years ago I was developing online courseware for a company that trained/certified future medical transcriptionists. We needed to develop a typing test. Now, a typing test is all about doing two things -- (1) noting when someone types something the shouldn't be there and (2) noting when someone doesn't type something that should. So you're comparing for absensces or additions between a given text and a key. Sound like anything else? My first thought was 'diff'. My second thought was Perl (after all, this is text slinging). My third thought was CPAN. And sure enough, Mark Jason-Dominus' excellent Algorithm::Diff saved me at least days of time and quite possibly weeks.

    Now, this was possible in part because I was working as a contractor, and so was probably trusted a bit more, and also, in part because my supervisor/contact with the company was pretty savvy. I can contrast this with some other experiences. Like the company I worked for that wanted a webserver log file analysis package. Again, lots of text slinging, but perl or any other scripting language was out because we wanted the source as closed as possible. Nope, it had to be in C, and I was discouraged from trying to find a regex library to use. I essentially ended writing my own regex engine. It was buggy. It needed optimization. The syntax was less powerful . The stats package itself was good, especially for 1997 (it could do things I've only seen other log analyzers do in the last two years), but because it all ran on top of this flaky regex engine, it couldn't fly. I think it got canned after I left... nobody wanted to touch it. I seriously think I lost months of my life on this, and the company lost a good product. All from trying to reinvent the wheel...

  • Leaky! (Score:3, Interesting)

    by t'mbert ( 301531 ) on Friday June 06, 2003 @05:36PM (#6135605)
    Why don't we use more available code? Leaky abstractions [joelonsoftware.com] for one. And look at the DLL and .so hell we're in now, where we have libraries that depend on libraries which depend on libraries...yik...all that to save a tiny bit of work, ain't worth it. Write your own.
  • I use libraries (or modules). However, I don't think I've ever used available source code as a starting point for anything.

    Reason 1: Most free source code is crappy. When looking for C code, for instance, you'll hardly ever find any that bothers to check the return value of malloc() and other functions that might fail.

    Reason 2: Even when the code isn't crappy, it's usually not adequately commented.

    Reason 3: Even if you find that rare piece of code which is both well-written and adequately commented, chances are it's not documented.
  • by axxackall ( 579006 ) on Friday June 06, 2003 @06:02PM (#6135788) Homepage Journal
    Coders should not decide to reuse or not. That's the decision a software architect should make. Some (few) good coders are good architects as well - and they often study someoneelse's code. But most of coders think they are the best (and they are not because they think they are the best) and they don't want to study anyoneelse's code ("It's easy to re-write than to understand!"). Remember, the smarter you are the less you think that you are smart!

    I think I made it clear: it's a job of system architects (or technology evangelists) to study the sources, to look for patterns, to evaluate patterns, using pattern knowledge to evaluate the source code, and, working very closely with software requirements, design and specs, to decide that some code is good to be reused or not.

    Decision to reuse the code requires another style of thinking than most of coders have. Don't assign such job to coders unless coder's and architect's skills are combined in the same brains.

  • Risk. (Score:3, Insightful)

    by AnotherBlackHat ( 265897 ) on Friday June 06, 2003 @06:15PM (#6135854) Homepage
    Using "their" wheel is usually cheaper than inventing your own.

    But sometimes, it's a disaster.

    How can you tell if their wheel is any good?
    Including it with out evaluating it is a huge risk.
    It's not even easy to guess at the risk.
    Testing helps, but a good evaluation can be as hard if not harder than recreating it.

    How can I know if Net::::Hesiod is the best thing since sliced bread,
    or buggy garbage that should have been fixed long ago?
    Maybe if some fitness/correctness/bugginess evaluations were made by someone
    (even say, comp. sci. students as a homework assignment... )

    -- this is not a .sig
  • An analogy (Score:3, Insightful)

    by Anonymous Coward on Friday June 06, 2003 @06:21PM (#6135892)
    When Ford Motor Co. is designing the body for a new model of car, why do they "roll their own" new front fender design instead of just using the front fenders off the '92 Taurus?

    I'm not trying to troll, but I thought this article was way too preachy. The author talks about people "reinventing the wheel," but the fact is (to carry the car analogy further) that you can't use the exact same wheel on every type of vehicle. That doesn't mean that you "reinvent" the wheel for each vehicle, but often you'll have to produce a variation on the basic design. Quit agonizing about it already!

    So he's been able to find third-party code on the web to reuse in his projects. Good for him. His attitude seems to be though, that if he does it, it must be the Right Way, and therefore everyone should do it.
  • Fear. (Score:4, Interesting)

    by nurb432 ( 527695 ) on Friday June 06, 2003 @07:37PM (#6136269) Homepage Journal
    Simple, a lot of coders are afraid of being sued later on.

    Or get caught in some strange license restriction they didnt understand. Since few coders are lawyers its easy to quickly 'get into trouble'.

    Not many things worse then having your work ( or your job if you are a captive coder ) deemed useless due to an 'oversight'.

    While it sounds simple, with the current state of affairs in the world ( example SCO ), for some its just not worth the liability risk.

  • by sien ( 35268 ) on Friday June 06, 2003 @08:13PM (#6136404) Homepage
    Sheesh, I mean the Wright Brothers invented flying fixed wing aircraft about 100 years ago and I hear Boeing and others keep reinventing this.


    Just don't get me started on Pirelli or Michelin.

  • by MyHair ( 589485 ) on Friday June 06, 2003 @08:21PM (#6136426) Journal
    Some of the best code reuse I've seen is in Microsoft products. On my Win2k PC I have about 20 copies of 5 different versions of MSVCRT*.DLL. Previous versions of Windows had similar reuse of VBRUN*.DLL.
  • learning to read? (Score:5, Insightful)

    by technoCon ( 18339 ) on Friday June 06, 2003 @09:36PM (#6136667) Homepage Journal
    when programmers are taught to a computer language, we're taught to write. When everybody else is taught any other kinda language, they're taught to read. If I learn Russian, I'll read great literature.

    Trouble is twofold.
    1) we con't have a corpus of great computer code we can show folks howto read.

    2) reading code is most often associated with Maintenance and maintenance programmers aren't highly regarded.

    call it NIH.
  • My opinions (Score:3, Insightful)

    by Tomster ( 5075 ) on Saturday June 07, 2003 @12:28AM (#6137274) Homepage Journal
    Lots of good thoughts expressed already. Here's my list of reasons we don't reduce, reuse, recycle code well:

    1. It goes against the unwritten rule of "elegance". Using someone else's code often means it just doesn't fit quite right into your program. We'd rather write our own solution that fits "perfectly" into our program than find and use someone else's solution that isn't quite perfect.

    2. Trust. If I'm going to use someone else's code, can I trust that it is (relatively) bug-free? Can I trust that it does what it says it'll do? Without unseemly side effects?

    3. It's more fun to write code than to search for code.

    4. Hubris: I can do it better.

    5. I know I can write my own solution. I don't know that I can find another solution, and that if I do it will work well enough for me (or won't require extensive modifications) and there won't be some other issue with it that will keep me from being able to use it. In short, I know I can develop a solution in n time... but if I spend time looking for and integrating another solution it's a crapshoot -- I might spend n/10 time or 10*n time.

    Now let's look at some cases where reuse is working:

    - Standard libraries. Popular languages come with a fairly large library of standard code. Reuse works here because (1) there's usually little/no choice and (2) being a standard library, there is a degree of trust given to it that is not granted other code.

    - Popular add-on packages. Whether it's Log4J, a CPAN module, or a well-used bit of Javascript. Reuse works here because of trust: if lots of people are using it, it must be good.

    - Really complicated things. Regex. Who wants to write regex code? Reuse works here because of the belief that you /can't/ do it better than has already been done.

    - Really big things. Graphics libraries. Reuse works here because at some point a job becomes too large to tackle, compared to finding and using an existing solution -- even if the existing solution stinks.

    In short, in order for code to be reused, it must be findable, usable, trustable, and valuable. The last meaning the time/effort spent in finding and learning existing code will be less than the time/effort spent coding a new solution.

    That's 2c off the top of my head, I'm sure I can do better but it's late and I'm tired and I'm going to bed shortly.

    -Thomas

Work is the crab grass in the lawn of life. -- Schulz

Working...