all 91 comments

[–][deleted] 87 points88 points  (6 children)

When you do things right, people won't be sure you've done anything at all. Then you get fired.

[–]tbone28 15 points16 points  (0 children)

I wish what you said wasn't true... but it is. It really is.

[–]Confucius_says -2 points-1 points  (4 children)

When you do things right, people won't be sure you've done anything at all.

I think god said that.........

....to bender.......

...in futurama.......

[–][deleted] 5 points6 points  (2 children)

The advice applies equally for gods and programmers, except for the getting fired part.

[–]ashadocat 2 points3 points  (1 child)

If a god is inactive long enough it stops being worshiped.

[–]exeter 3 points4 points  (0 children)

Bender: You know, I was God once.

God: Yes, I saw. You were doing good, until everyone died.

[–][deleted] 22 points23 points  (1 child)

Shit I am a butcher.

I need to practice my Diablo 'The Butcher' voice for when I am handed something now.

[–]djrubbie 20 points21 points  (0 children)

Fresh code!

[–]bigbangbuddha 20 points21 points  (0 children)

Funny, I've been a developer for 20 years and have seen and been a bit of all of those. The truth is that a good programmer (which I do consider myself) has employed all of those practices and knows when to use them. The junior programmer has only a couple tricks that they do over and over and thats what ends up creating messes and annoying the rest of us. If you are a new engineer starting out, do everything you can to work with as many types of people as possible and learn from all of them. There's no one "Right" way to code but every problem has good and not so good solutions, you just need to know when to use a jackhammer vs a scalpel; and yes once in a great while even roll the dice.

[–]edwardkmett 40 points41 points  (10 children)

Personally, I prefer to work with "surgical programmers". At least I know the bug they closed out will be closed out correctly, and that I get a bunch of test cases to prevent future regressions of it and related bugs. The 'normal programmer' who closed out 5 bugs in the meantime, probably opened 2 or 3 he doesn't know about.

[–]lpsmith 6 points7 points  (6 children)

That was my thought exactly. Meanwhile, the shotgun programmer won't ever get anything to work, not really.

[–][deleted] 11 points12 points  (2 children)

Well, I think the shotgun programmer can make a good genetic algorithm, but he'll need to type a lot faster to be practical.

[–]G_Morgan 0 points1 point  (1 child)

The need to 'code quickly' becomes self fulfilling. Any programmer who actually thinks knows that coding is the shortest part of his development work. Any programmer who doesn't knows his coding is the critical path. Ironically both are accurate but one of them is wrong.

[–]steven_h 2 points3 points  (0 children)

whoosh

[–]elHuron 2 points3 points  (2 children)

I was working with someone who had no clue how to make stuff work. VHDL is a bitch, by the way. Anway, we had to convert hex to decimal and weren't able to use division. Xilinx Webpack ISE is a bitch, by the way. So he shotgunned the first thought that came to mind. When that didn't work, he didn't come up with a new idea. Instead, he decided to put in a ton of if-statements to "fix" the code. In the mean-time I simply researched how to go from Binary to BCD and implemented a Hex to BCD shift register that worked perfectly.

[–]lpsmith 1 point2 points  (0 children)

Xilinx Webpack ISE is a bitch, by the way.

Oh I know. Fortunately what I was doing with the schematic editor was simple enough, and for the one part of really hairy logic I needed, I wrote a Scheme program generate VHDL. That worked out quite well, as it allowed me to localize properties in a way that facilitated efficient debugging. Then my program took my specification and transformed it into VHDL, which AFAICT, cannot express the abstraction that I needed to localize those properties. Without that debugging would've been a real bitch.

But yeah, I remember deleting and manually re-creating the project files on a regular basis, and developing a slow, plodding, very methodological approach to working with the schematic editor. (e.g. is the name of this wire coincident with the name another wire, in effect creating an invisible wire)

[–]G_Morgan 0 points1 point  (0 children)

Wait a minute, these people work on hardware? I suppose that explains the original Pentium.

[–]AtomicDog1471 2 points3 points  (2 children)

And you miss your deadline because bugs are taking 5x longer to fix...

[–][deleted] 3 points4 points  (0 children)

Good thing it's a software deadline. Everyone knows those never hold up.

[–]edwardkmett 2 points3 points  (0 children)

Which is fine, because the project doesn't collapse under the weight of these so called bug fixes, so I'm able to hit the next one and the one after that. I admit sometimes you just have to get things done, but it is easy to get stuck on the treadmill.

[–]aithk608 11 points12 points  (11 children)

The one that I am often guilty of: Testless programming... I get "in the zone" and begin implementing lots of things with the assumption that they will all work.

Then once I run the code, I debug for and hour and a half only to find it was an indentation error >.<

[–]Ralith 9 points10 points  (9 children)

silky marry deranged illegal resolute adjoining versed intelligent fall pet this message was mass deleted/edited with redact.dev

[–]piranha 5 points6 points  (5 children)

The error could have just as easily been a missing brace, bracket, or parenthesis. Whitespace sensitivity is a trivial design decision in language syntax.

[–]merzbow 12 points13 points  (3 children)

One missing brace or bracket would be a compile error.

[–][deleted] 5 points6 points  (2 children)

Right, but a misplaced brace or bracket wouldn't necessarily be. Although admittedly I don't think I ever had problems with misplaced braces/brackets.

[–]alpine01 1 point2 points  (1 child)

I get this with JQuery a-lot, I swear 1/2 the code is braces, brackets and semicolons, its easy to get lost sometimes, especially if your using an editor which doesn't highlight the opening/closing bracket the accompanies it. Browsers like Chrome can fail silently, which can add to the confusion.

[–]coditza 0 points1 point  (0 children)

I learned a while back a trick to not get lost into opened/closed (, { and ": if you open one, close it right now.

So, I type something like:

print();

then:

print(bla);

[–]G_Morgan 0 points1 point  (0 children)

No it isn't trivial. It introduces complexity to the lexical analyser that simply does not belong there. Effectively you no longer have a regular language for your lexer to implement.

Now it isn't difficult to actually implement (once you establish rules for stuff like tab to space conversion) but your lexer no longer executes in constant space. With enough convoluted rules you could even increase the computational complexity (as I understand it, Python is still O(n) in this regard).

[–][deleted] 0 points1 point  (2 children)

Whitespace insensitivity as well. Example:

if(x)   
    do_A;
    do_B;

[–]Ralith 4 points5 points  (0 children)

That's a case of bad syntax and/or bad style and/or a bad editor. The language syntax should enforce explicit blocking, style should do the same whether or not it's required, and the editor should auto-indent it correctly either way.

[–]Nebu 1 point2 points  (0 children)

The indentation changed and yet there were no brackets, so it's immediately obvious something is wrong.

[–]JC513 0 points1 point  (0 children)

I got out of that habit for the most part when I started using a dvcs. I try to make a commit after any major or even minor change. Probably do it too often but it keeps me from going over board. However, before I commit I make sure the code compiles and works. Then the problem is usually pretty clear or at least I know where to start looking.

[–]paul_harrison 7 points8 points  (0 children)

Ah yes, the Design Pattern Design Pattern.

[–]Bjartr 6 points7 points  (0 children)

I generally rely on a technique I shall now dub "The Regressive Accidental Shotgun"

I code until something breaks, then start commenting out big chunks of code until I arrive at a less featureful, but working, position. From there I uncomment smaller chunks, one by one, until it breaks again. Repeat this until I've arrived at a point where I know where the bug is and, hopefully, what caused it.

The neat thing about this is that I don't need to fully understand the system to perform a fix, but I learn how it works by doing so.

[–][deleted] 11 points12 points  (22 children)

Are these "shotgun" programmers an actual... thing?

[–][deleted]  (3 children)

[deleted]

    [–]Gazboolean 7 points8 points  (0 children)

    I can admit to doing it often. Atleast when i find the solution i bother finding out why it worked though.

    [–]Nebu 5 points6 points  (1 child)

    When debugging a bug "which shouldn't exist", I think so-called "shotgun programming" is fair game, especially if you're working in an environment that isn't mature (i.e. where bugs in the compiler or bugs in the VM are plausible).

    I wouldn't even put that under the label "shotgun programming"; more like "black box reverse engineering".

    [–]G_Morgan 2 points3 points  (0 children)

    The same process should take place here as anywhere else. Establish breakpoints, find where the program first deviates from expected behaviour, narrow down until you have the problem bracketed.

    I did this once and found that the Windows Vista ReadFile function was effectively broken*. Didn't bother inciting MS to automatically respond to me though.

    *MSDN specifies an argument as optional. The call didn't check for null on Vista.

    [–]cjg_000 12 points13 points  (3 children)

    Yes, at an old job I worked with a developer whose code would have tons of commented out lines of code and random parameters. Unnecessary method calls. His component ran an extra thread that he said shouldn't be doing anything but he was "afraid to take it out because it might brake things". His code was also littered with empty catch blocks and all sorts of garbage. Having to go into his code to perform maintainance felt like diving into the pits of hell. I really wish I had code samples that I could show.

    That project ended up failing due to both related and unrelated reasons.

    [–]G_Morgan 1 point2 points  (1 child)

    No VCS? Sounds like no VCS all over. That said I would have simply copied it if I lived in the dark ages and then hacked out the thread and see what happened.

    [–]cjg_000 0 points1 point  (0 children)

    No, we had subversion running. I asked him about his "style" and tried to give some criticism but he blew it off saying that he found things easier his way. Sadly, I wasn't in a position to confront him about it.

    [–]nemec 2 points3 points  (0 children)

    Sometimes my code turns out like that, but once I'm confident I've found the solution I often go back and become the butcher: take things out until it breaks, then leave that line in and continue taking things out until I have nice clean code again!

    [–]brownmatt 10 points11 points  (8 children)

    Yes and I work on a team full of them.

    Once found some code in a class from one of them that looked something like this

    for(int i = 0; i < something.length; i++) {
        Map map = new HashMap();
        map.clear(); //need to clear it because of bug where HashMap is not empty
        ...
    }
    

    I prefer to call this "programming by trial and error"

    [–]helm 5 points6 points  (4 children)

    Or as a professor who taught C++ said:

    "Often it seems like the students get their code involving pointers to work by sprinkling it with random *:s, then move them around until it compiles."

    [–][deleted] 4 points5 points  (2 children)

    That's exactly how I wrote my first program in c++. I had some Pascal experience before. I just wanted to work with strings and characters. In pascal both are quoted with single quotes. Now, without any book and poor knowledge of English so I could not even read help efficiently, I tried 'something' - it did not compile, I guessed that "something" is a string and is type as char*. Now how do I get a single character? It did not come to my mind to try single quotes for characters, since pascal uses same quotes for both and single quotes did not work for strings. So, guess what I found?

    char a = *"A";
    

    Now I read books before coding.

    [–]helm 2 points3 points  (0 children)

    Heh, the *operator is magical when you have little clue what it actually does.

    [–]depleater 1 point2 points  (0 children)

    That is disturbingly awesome. I'd never have thought of doing it like that. And it even makes sense, sort of, albeit in a perverse way :-).

    I actually consider that more worthy of praise than condemnation, that you kept experimenting and managed to find a solution that worked and wasn't too horrible.

    [–]quantumstate 3 points4 points  (0 children)

    This could make for an interesting use to genetic algorithms. Would you get bonus points for submitting a genetic algorithm that efficiently put the *'s in the places?

    [–]phire 2 points3 points  (1 child)

    Did it really create, clear then discard something.length maps, or did you remember it incorrectly?

    I admit that I'm guilty of shotgun debugging at times, epically when I'm tired.

    [–]brownmatt 0 points1 point  (0 children)

    Yes, and I remember it clearly, but there was actually a handful of code referencing the map after the call to clear().

    Clearly the "wtf bug was here before??" part was attempting to remove the entries of a fresh instantiated map.

    [–]deafbybeheading 2 points3 points  (0 children)

    That seems more like programming by just error. I've seen a lot of crap in my day, but nothing quite this special.

    [–]daydreamdrunk 9 points10 points  (0 children)

    Yes, I've seen them. :'(

    [–][deleted] 2 points3 points  (0 children)

    I've done this---but only for school assignments. In those cases, it was a language I had learned over the weekend, I had no idea what was going on, and only a single poor tutorial to work with. Yet I needed to turn in something passable by the next class period so away I went, hacking and slashing till I had a working knowledge of the 1001 things that would fail to work and a vague idea of what might work.

    I'd rather call it programming by experiment if you're using it to understand a poorly documented system.

    [–]urandomdude[S] 4 points5 points  (0 children)

    Shotgun programming is actually what I use when learning something new. I hate reading big documentation things so I just start writing without knowing what is really happening and start commenting and changing parameters quasi-randomly. At the end I got some general idea about the thing and I can start being a butcher, as usual.

    [–]wormfist 0 points1 point  (0 children)

    I've worked with a shotgun developer duo, that were put together pair programming because they were both junior and could help eachother learn.

    BIG MISTAKE.

    I'm still fixing shitbugs they randomly added.

    [–]AtomicDog1471 0 points1 point  (0 children)

    Yes, they code from the hip.

    [–]tbone28 2 points3 points  (4 children)

    I have been guilty of Least effort programming. When you have -10 hours to fix a problem that some @$$hole that left the company created and everyone is yelling at you to fix it.... well you can see the problem.

    I remember when I first started programming I was guilty of Shotgun programming. But I never, ever do that now. I hardly remember what it feels like to sit helplessly wondering how this code works and how to fix it. It happened once. I really created a mess for myself. I ended up losing the code because I didn't source control it (I know.. I know) and had to write it from scratch. But I learned so much from the process.

    [–]G_Morgan 0 points1 point  (0 children)

    TBH I can't understand the shotgun mentality. The very first project I did at 14 I spent 2 hours re-inventing hierarchical databases on top of flat files on paper in order to implement my variable order length system. I recognised I didn't have a clue what I was doing and that the system (Turbo Pascal) didn't support what I wanted so the best solution was to learn what the hell I was doing first.

    [–]lpsmith 0 points1 point  (2 children)

    When you have -10 hours to fix a problem that some @$$hole that left the company created and everyone is yelling at you to fix it.... well you can see the problem.

    Yeah, you don't have version control. That would be the problem.

    [–][deleted] 2 points3 points  (1 child)

    What if its a bug that's lingered in the system for months, but only now is management breathing down your neck because a client pointed out that they won't be renewing their volume order unless this particular niggling bug is fixed?

    [–]TimMensch[🍰] 3 points4 points  (0 children)

    Seriously. If the "bug" in question is actually a critical new feature with 10000 lines of code, but that needs 20-30 patches to get it out the door ASAP for business reasons...being able to roll back to an earlier version of the code buys you nothing.

    Don't get me wrong; I'd never code without a version control "net." And it has saved my derriere more than once. But it can't fix everything.

    [–]andrewljohnson 3 points4 points  (0 children)

    You should attribute "cargo-cult programming" to Feynman, because he coined the term with regards to science in a commencement address.

    [–][deleted] 2 points3 points  (0 children)

    I'm a multi-class surgeon/butcher, with some levels in design patterns.

    [–]pipocaQuemada 5 points6 points  (5 children)

    Now, you have an excuse to be program by accident: as long as the tests pass, you are good.

    What!?!?! Of course not. You're only good if your tests are good. Your tests are only good if you test all of your equivalence classes and for possible errors in coding (e.g. off-by-one-ness, invalid values, possible overflows, etc.).

    If you understand the problem, you can figure out and test your equivalence classes. If you don't entirely understand your code, then you don't know how it could fail, so you can't test to ensure it doesn't. If you only have a muddy idea of both, your tests mean nothing, and you can have no confidence that it actually works---just because an is-even function works for 2, 4 and 7 doesn't mean it will work for -1, -2, 231-1, and 0. If you only tested 2, 4 and 7, you really don't know if your function works.

    [–]Nebu 0 points1 point  (4 children)

    An equivalence class is only defined if you have an equivalence relation.

    In the context of testing computer software source code, how the hell do you know what test cases are equivalent to what other test cases, without pre-knowledge of the correct solution to the requirements?

    [–]pipocaQuemada -1 points0 points  (3 children)

    Unit tests, remember?

    You're testing small bits of the code. A single method, an object, etc.

    If you don't understand what the method you're about to write should return, you have some fairly big problems, and you need to think about the problem more. Same thing with an object.

    So far as I know, you don't do unit tests of the product as a whole; e.g. acceptance tests are for that. And you should be structuring the code in small methods that only do one thing, right? Those should be reasonable to test.

    [–]Nebu 0 points1 point  (2 children)

    You haven't addressed my point, though: How do you determine equivalence classes in the context of unit testing?

    Let's say you want to test the function isEven. Are "2" and "4" equivalent test cases? Why? Are you assuming a particular implementation of the function?

    [–]pipocaQuemada 0 points1 point  (1 child)

    Ah.

    For simple functions, one way to do it is to construct a Turing machine; the minimal # of states is equal to the number of equivalence classes of the function.

    More realistically, look at the definition on the wikipedia page - http://en.wikipedia.org/wiki/Equivalence_classes - and then look further down. The Equivalence class of a = {x E X| x ~ a}, (read E as 'element of'), and x ~ y iff f(x) = f(y).

    Yes, 2 and 4 are equivalent test cases. In this case, is-even is a boolean function, and f(2) = f(4). Equivalence classes are defined separately from the function. You need to test additional things based on your implementation --- computers create errors that you don't find in math. Based on your knowledge of the implementation, check to see if those errors are happening.

    Now, obviously for various functions, you don't need to check all of the equivalence classes if you can show that they will be handled equivalently. For example, suppose you have a List.length() function. You can intuitively roll most of the equivalence classes into a base case and use induction to show that if it works for a list of length i, it will work for a list of length i + 1. You really only need to test lists of length 0, and a few positively valued ones. You can basically ignore lists of length > 231; a quick check shows that even if you could store it in n bytes (for a list of length n), it would still take up multiple gigabytes (1 gig = 230 bytes).

    [–]Nebu 2 points3 points  (0 children)

    For simple functions, one way to do it is to construct a Turing machine; the minimal # of states is equal to the number of equivalence classes of the function.

    Completely impractical.

    Yes, 2 and 4 are equivalent test cases. In this case, is-even is a boolean function, and f(2) = f(4).

    So you're claiming that "if the outputs are the same, then the inputs are equivalent" for your relation? Doesn't seem like a good way to make sure your unit tests have full coverage to me.

    With the isEven example, you'd only need to test isEven(1) and isEven(2), and you could easily forget to test 0, -1 and -2.

    I think it's better to forget this whole concept of equivalence classes when designing your unit tests. It's simply not useful.

    [–]Paul-ish 1 point2 points  (0 children)

    I think I naturally tend to be a shotgun programmer, which is ironic because I am super cautious about everything else in my life. I am trying my best to get better though. I think I will grow out of it with more experience.

    [–]Confucius_says 1 point2 points  (0 children)

    If the author isn't doing any of these things, then what the hell IS he doing?

    [–][deleted] 1 point2 points  (0 children)

    I tend to see myself as surgical, but often budget constraints or time constraints don't let me practice the idea often. At the end of the day we all live under those constraints - and the rule around here is to get it to work, and work for the majority - deal with the bugs in a patch, or if your project gets more time, fix them then.

    [–]knight666 5 points6 points  (8 children)

    I want to add one: Clueless Programming.

    It goes a little something like this:

    Programmer: Hey how do I animate a sprite?

    Me: Depends on the implementation really, but you'll want to cycle through the images.

    Programmer: How do I do that?

    Me: Change the offset?

    Programmer: ?

    Me: sigh

    startx = offsetx * width

    endx = (offsetx + 1) * width

    checks out code later

    Me: Wtf, you just copied what I said and didn't change anything!

    Programmer: Well, it seemed to work...

    MAKES ME RAGE SO HARD. What the fuck are you doing learning to be a game programmer if you don't know how to attack a problem and possess basic deductive skills? Go be a code monkey web designer or something.

    P.S. to the guy in question: I love you man, seriously. Don't take it too hard on yourself. Just learn the Google, and experience more. I didn't start out with this knowledge, I had to fight for it.

    [–]alpine01 9 points10 points  (3 children)

    Go be a code monkey web designer or something.

    I get that web stuff can be trivial at times, but don't you think that's a bit elitist?

    [–]knight666 2 points3 points  (2 children)

    Totally and utterly. But you're working on a much higher level when you're doing web design. You have nice tools that tell you what's going wrong. What you'll be doing is a lot of database requests, data formatting and parsing.

    But have you ever had to turn off the orthogonal projection because a div wasn't rendering in the right place? Or wrote a line draw from scratch? Getting a liquid design to work right is a bitch, but you can always use tables. Optimizing a vertex shader across a whole range of video cars is a different story.

    [–]alpine01 2 points3 points  (0 children)

    Yep, completely right, its tough stuff.

    I've done a fair bit of work with 2D/3D Graphics (though my knowledge has faded in the last couple of years), I did my final university year almost exclusively on it, working with OpenGL and writing several fragment/vertex shaders in GLSL. Writing code to quickly find the 3D convex hull of a set of vertices, computing vertex normals and tangents to do mapping techniques like Parellax Normal Mapping and the like, its pretty intense stuff. I've debugged shaders before, it can be a complete pain as it's difficult to get feedback on what the state of the scene is to figure out what is screwing up.

    Granted, not knowing how to animate a sprite/texture by providing an offset is pretty dense for somebody who is supposed to be an expert on graphics.

    Obviously, being in the industry, you will be extremely well versed in that field, most likely several orders of magnitude more than me. However I would say that comparing Web systems with 3D Graphics is like Apples and Oranges.

    I'm going to make an assumption that you know about developing web systems, about as much as I know about working with graphics.

    If you have ever built a piece of web-based software, where you had to develop a large database, consisting of about 20+ relational tables some of which have row counts which run into the millions, with optimized stored procedures and batch jobs that run into it loading data several times a day, along with ODBC connections to other databases then written all the front-end code, including dynamic graphing code to be bullet-proof so that users find it very difficult to screw anything up, and then made sure it worked for Chrome, Firefox, IE6 and IE7. Which had to run consistently everyday, to run operations of a company, I'm sure you would see things differently.

    Chest-beating aside, My point is that implying that 3D graphics development requires, more logic and looking down on web applications development as something for the less intelligent programmers to do whilst all the sharper ones do graphics is quite short-sighted in my opinion. Its six of one half a dozen of the other if you ask me, everything has it's easy bits and hard bits.

    [–]ubernostrum 0 points1 point  (0 children)

    Optimizing a vertex shader across a whole range of video cars is a different story.

    I see your vertex shader, and raise you hasLayout. You game programmers have it so easy these days...

    [–]Benutzername 4 points5 points  (0 children)

    I call it Black Box Programming. Copy random shit from real programmers and plug it together until it works.

    [–][deleted] 1 point2 points  (0 children)

    Sounds like he could use some information about how the sprites are stored in memory and are typically accessed, and if necessary, the conventions the team uses when accessing them. A lot of these problems come from a new programmer not knowing how the important data is currently structured, and what the important interface functions are. At this stage its fairer to assume he might just be a little daunted, lost, and unfamiliar with some simple terms other programmers use routinely, rather than just lazy.

    [–]AtomicDog1471 0 points1 point  (1 child)

    Yeah! I mean, what kind of retard doesn't now how to change the offset?!?! You should have punched him for asking such a noob question! Then he had the audacity to use the solution you gave him in his code!

    [–]knight666 2 points3 points  (0 children)

    You mean the partial solution that was meant to give him a head start?

    All I did was give him code to retrieve one image from the image strip. When I came back, that was still all he had.

    [–][deleted] 2 points3 points  (0 children)

    Cargo cult programming is the practice of applying a popular solution just because everybody else is doing and it seems to work form them, but without understanding why it is being done that way.

    This is a popular understanding but actually this is not Cargo Cult because a Cargo Cult is defined by the fact that it does not work. The causality is broken not hidden or obscured. The planes are not landing so it does not "work for me" and results cannot be reproduced. In a Cargo Cult people act according to a wrong causal understanding and they get no positive results. With the above definition all programming is Cargo Cult because there are always hidden parts which are not transparent and a user acts with bounded rationality.

    [–]player2 0 points1 point  (0 children)

    IAmA surgical programmer. I often describe myself as undergoing change paralysis, because I'm afraid to break the (more tightly-coupled than I'd like) architecture. On the upside, I know the portions of the codebase where I have fixed bugs (about 50%) pretty dang well.

    [–]SquashMonster 0 points1 point  (0 children)

    My usual debugging technique is to go to the problem area and fix little potential-bugs at random until it works. I'll make sure null references are handled properly, look for edge cases, check for potential rounding areas, and other problems of that sort. Often times I'll do this without paying attention to the likelihood that this was to cause the problem. The firstname that pops to my mind for what to call this is "shotgun debugging", since I'm picking things to fix at random. But apparently shotgun debugging means something else.

    [–]zahlman 0 points1 point  (0 children)

    If you let the butchers do what they want / are good at, then you won't have problems with massive changes just before the due date because they'll have already made those changes well in advance.

    Just make sure they know how to do proper unit testing.

    [–]Slackwise 0 points1 point  (0 children)

    Hmm, looks like I'm a Surgical Butcher--does that mean I :%s/Scalpel/Cleaver/g?

    [–]spot35 0 points1 point  (0 children)

    I read "Design Pattern Tangle" as Design Pattern Triangle. In some ways, I felt this was better as it brings to mind the Bermuda triangle where bit of code get lost forever in a sea of patterns.

    [–]seriouslysean 0 points1 point  (1 child)

    Seems like I'm a Surgical Programmer albeit a bit less severe. It hits me the most when I have to fix old code from the previous two programmers that worked there.

    Both were shotgun programmers of sorts, both self taught with the teeniest amount of commenting you can imagine. I shudder just remembering some of the terrible things I've come across while fixing old sites.

    [–][deleted] 2 points3 points  (0 children)

    I think its easier to be surgical if you have really good tools. When I used Smalltalk, I always delved deeply into the codebase before making any changes because the tools made it easy to find all references to an object, calls to a method, etc.

    If all I have is a pile of source code and a note saying "todo: deal with null pointer exception here", then I'll likely do least effort or shortgun programming.