8 ms·
I hate cut-and-paste
- chaosfox 15y agoAnd I hate guns. No wait.. actually I hate people who use guns to kill other people.
- pilif 15y agoI understand the analogy, but on the other hand, the barrier to using a gun for killing people is nearly infinitely higher (I hope) than the barrier to using copy & paste to "just fix this little thing here". So many times, when you need a quick solution for a small problem and you know that you have fixed this exact same problem a few weeks/months ago at a different spot, there's a huge temptation to just go and copy&paste those lines. By doing so, you have just created debt. What if that code is using some API that you want to change a few years later? Whoever is going through the old code now has to fix up all instances of your copy & paste action. What if the initial code contained a bug that somebody else fixed? They might not know about the copy pasta. It's very likely that they only fix the initial instance of the code and not all other places where it was pasted to, so the bug partially remains, or, worse, is later classified as a regression (which it's not). So, coming back to your analogy, hating copy & paste is analogous for hating guns not only for their potential of killing people but also for their potential for causing accidents and for their potential to use them for any kind of potentially non-violent crime. As the guy who is usually doing the refactorings to our 7 year old codebase, I'm the guy who is suffering from copy pasta and I'm telling you: I totally agree with the original article. I've yet to see a single instance where copy & paste of more than a single line of code didn't cause me non-insignificant amounts of additional work.
- skeptical 15y agoThat is spot on. But blaming text editors and IDEs is a missed shot. If the author blames the editor I'm temped to think that he himself resources to copy paste because he as his editor to blame.
- markokocic 15y agoActually cut-and-paste is ok, since the code is moved from one (wrong) place to another (better) place. Problem is copy-and-paste, which litters codebase with duplication and lead to messy and hard to maintain code.
- frobozz 15y agoAgreed, I'd hate to write an application of appreciable size without cut-paste. I currently hate an application that I'm likely to end up working on that was authored with a generous helping of copy-paste.
- Stratoscope 15y agoThe author meant copy and paste: > Think about that ctrl-C, ctrl-V sequence next time you are about to use it. Many people use "cut and paste" as a generic term that refers to either copy and paste or cut and paste. You have to figure out which they really mean from the context.
- heyretard 15y agothat's fucking retarded.
- markokocic 15y agoI know what he mean, but that's not what he said. And it is one of the primary reasons why bugs exists, you mean something, but program something else.
- praptak 15y agoMy first programs ran on a programmable calculator. I wish I could have kept the habits I had back then. Drawing block schemata on paper before coding seemed tedious but it was in fact valuable. Damn you lord Sinclair and your ZX Spectrum for providing a full screen "editor" which let me skip the design phase. And it didn't really have cut'n'paste in the modern sense. (Edited) Also: http://clonedigger.sourceforge.net/ http://clonedigger.sourceforge.net/ Use it for great good.
- finnw 15y agoI'm not sure the original ZX Spectrum editor qualifies as "full screen" as selecting a line and visually editing that line are separate tasks. It has more in common with RegEdit than with Notepad.
- TelmoMenezes 15y agoAlthough I'm not from the punch card era, I overall agree with the sentiment of this article. I learned to code has a hobby when I was a kid and then took a CS degree. During the CS degree I was indoctrinated out of "bad habits" that I developed as a self-taught programmer. One of these bad habits was being terse. I took my degree during the golden age of createFactoryOfServerProcessGenerators() type things. Now, with more experience and wisdom, I realize I was right all along. A development environment that comfortably fits in your brain makes programming more effective and fun. And maybe I'm too idealistic, but I strongly believe the two are related.
- wccrawford 15y agoIt's poor carpenter who blames his tools. What he really hates is his lack of willpower when it comes to doing things the wrong way. Cut-and-paste enabled him to be lazy, but it certainly didn't force him to be.
- icebraining 15y agoHave you read it all? Because that's essentially what he says, despite the title and first phrase. But like any sharp tool it has the ability to cut you just as easily as it cuts the wood, so you need to apply it with care.
- samlittlewood 15y agoFor bonus points - add robust code folding to this, especially when the folding persists across edit sessions. I worked on a large embedded system where all the principal developers used such an editor (there was some occam heritage). One incautious copy and paste of 'a handful' of lines, and you had accidentally replicated a complete subsystem! It made debugging 'interesting'. Every time I think 'Oooh - code folding - what a great idea', I retrieve those memories. More generally, any time editor cleverness is interposed between the creative idea and the source code, I get a twitch. It should be possible to work on the source code without requiring anything more than a bare-bones editor - that is all I can assume about what my favourite editor shares with whatever future developers (incl. myself) happen to be using.
- gbog 15y agoYes, that's why in my previous job I simply forced all my team to use Vim, with almost the same vimrc. Before me, some were using Eclipse, jedit, even dreamweaver, that was a mess, also with encodings. But to complete Jacques' rant, I'd say that if duplication is bad in the part of the code handling logic and actions, it is not bad and often "normal", or even "better" in configuration parts or in content parts (eg templates). Factorizing a list of configs to replace some duplication with logic (loops, conds) can be a very bad idea.
- swombat 15y agoThen came the full screen editors. They were a bliss compared to line editors. Really. If you don't believe me try 'edlin' for a day or so. We'll see how you like that. Then you'll be wondering how come any software got written at all for the first 2 decades of computing. I have been wondering that, actually. On the topic of the article, luckily, the Rails community (and python, and others) seem to have embraced this idea, under the heading "DRY principle" (Don't Repeat Yourself). There might be a connection between that embrace of DRY and the fact that Ruby/Python afficionados tend to prefer "simpler" text editors (Textmate, Vim, Emacs, Sublime) rather than IDEs.
- robomc 15y agoWorth noting though that this can go too far the other way. I've definitely written things where, in my refusal to repeat myself, I've made a hard-to-read mess. Here's an example from when I was very first starting out with ruby: http://pastie.org/2749772 http://pastie.org/2749772 This is a pretty hard to read piece of code, despite my rambling comments. All done to avoid copying and pasting the same easy-to-follow method ~10 times.
- yxhuvud 15y agoBut the problem with this code isn't that there is too little duplication! The trouble wass that your grasp of the language wasn't that good and didn't have any idea of how to organize the code.
- robomc 15y agoSo, would you have solved it by a more readable form of metaprogramming? Seems to me it's either that, or copypasta. (Could still be me being a noob, but I can't see some other architectural means of avoiding a choice between either duplication or tricky-to-read metaprogramming in that case.)
- mhd 15y agoOn the other hand, the Rails community also loves their snippets. And a sufficiently advanced snippet is indistinguishable from copy-and-paste.
- mebassett 15y agoIt's gratifying to get something up and running quickly. I do a lot of "copy and paste programming" to get a functional prototype doing stuff. it's helpful when I need to show a non-technical person (e.g. my boss) in a convincing way. ctrl-c + ctrl-v is my best friend Most of it is throw-away code: just playing with ideas and different implementations. Exploratory programming is cheap these days, and I really think it's for the better. If it looks like I'm narrowing down on something I'm actually gonna use, I refactor, rewrite, simplify, and delete a lot of code. ctrl-x becomes my new best friend. (I write in natural languages much the same way.)
- jrockway 15y agoGreat article. Code expands to fully use all available editing tools. If you can see 1000 lines of code on your screen at once, you'll work with 1000 line chunks of code. If you have great tab-completion, you'll make your APIs big enough to make the tab completion useful. If you get a million lines of boilerplate every time you create a file, every file will be more than a million lines long. What's great about ed is that you keep most of the program in your mind. There is no tab completion. There is your brain. And when you keep the whole program in your brain, you write less code and the code you write is better thought out. I wish we could go back to the days of ed, but all we can do now is consciously resist the desire to work at our tools' maximum capacity.
- Autre 15y agoYeah, but would you be willing to read and develop, say Cassandra, in ed? I, for one, wouldn't. One more thing: would you be able to?
- skrebbel 15y agoI really disagree with the premise of the article that IDEs encourage copy&paste. Full screen editors do. IDEs do the opposite, by making it super-easy to reuse existing code through code completion and docblock tooltips. In a decent IDE, copy&paste is often more work than finding the right method and calling it.
- AndrewDucker 15y agoAgreed. The ability to select a chunk of code and click "refactor into new method" makes my code a lot neater.
- ssp 15y agoAs usual, there is merit to the opposite side too. Don't create some huge abstraction with class hierarchies and virtual methods and stuff, just to avoid cutting and pasting a ten-line function somewhere. Often it's a good idea to start by cutting and pasting, and then afterwards figure out what ended up being sharable.
- harto 15y agoAgreed. I recall a useful rule-of-thumb that states you should wait until the third time you need a bit of code before packaging it into something reusable. Otherwise, you might be wasting your time.
- mjbellantoni 15y agoThis sounds like a rule-of-thumb for making sure bugs get fixed in one place but not another. :) Seriously though, this article got me to thinking and I realized that why would one live with the smell of copy-and-paste when it's just so darn easy to write a singly reusable function? I agree with what you in the sense that there's no need to go from what might be a few lines of copied code to a full-blown library or subsystem. But for a small bit of common code not refactoring that out immediately seems to me a really bad practice.
- chipsy 15y agoIf you factor too early you end up with a function that takes ten parameters. Sometimes cut+paste functionality evolves into truly divergent code, and you have to have a "feel" for when it will happen.
- ajross 15y agoYou're positing a false choice; it's not either-or. The proper abstraction for a cut-and-pasted 10-line function is generally an 11-12 line function, with just enough extra complexity (i.e. an extra argument or two) to capture the differences in the two implementations. The huge abstraction with class hierarchies is an entirely different kind of idiocy. It's orthogonal to this problem. You can (and I've seen it done) cut and paste giant class hierarchies too.
- rayhano 15y agoBut, but... surely what you are suggesting is people be intelligent... why would they do that when they can be bone idle lazy???
- david927 15y agoCopy-and-paste is bad, I agree, but on the other hand, I hate it. And by 'it' I mean all of it. I have never seen a large system that could, for more than a moment in time, be seen as anything else than elephantiasis. It's shameful and I'm sick of it. I want out. Right now, I'm paid quite well as a contractor to make some enhancements to a project developed by a hundred underpaid developers in a distant land, who did a remarkable job, considering. But it's rat's nest -- they didn't stand a chance. And I can't look myself in the mirror anymore and say this is what I do. It's grotesque. I'd rather run a coffee shop (and indeed I've been talking about it) because at least I could go home at the end of the day having seen a little beauty here and there, instead spending all day staring into the face of the Elephant Man.
- 0x12 15y agoBeware, you're getting scarily close to burn-out territory if I interpret you right.
- david927 15y agoThanks for your concern but I'm not sure it's burnout. It's waking up. Here's my process: 1) Sure it's ugly, but look at what it can do! 2) Ok, it's ugly, but with good practices, good people, good management, you can ameliorate the worst of it. 3) Fuck it. I've decided that this is my last contract. I have a project called Kayia, and my wife has a site called Kongoroo. I'll continue to work on those but otherwise that's it. If I'm not coding in Kayia, I'm not coding.
- gruseom 15y agoI completely understand your #3. We keep making excuses and rationalizing, for years and years, the fact that the overwhelming majority of software projects are fucked. It doesn't sound like burnout to me either. I went through something similar. The solution was to admit that I had taken a wrong turn in my programming career, and commit to working only on things I believe in. It was either that or get out of the software business altogether.
- becomevocal 15y agoRight on. To get code shipped I usually copy and paste if it really saves me time, but make a checklist of optimizations I can do at a later date. When that time comes, find/replace does the dirty work.
- kleiba 15y agoThis is reminiscent of a classic Yegge blogpost: http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.html http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.ht...
- skeptical 15y agoThis article is just wrong. Thanks to eclipse I go days without copy-pasting. May I suggest that if you're copy pasting too much you're doing it wrong? If we take it to the extreme, why would you need to have the same code in two different places?
- tintin 15y agoEhm, the article describes what you are talking about. So in fact you agree with the article ;)
- skeptical 15y agoYes, the problem is exposed correctly. But he blames his tools rather than taking the blame himself. Or maybe he is just trying to blame his coworkers using some euphemism, still lame.
- loup-vaillant 15y agoTools have much, much more power over their users than you seem to think. Take subversion vs git for instance. How often would you merge branches with either tool? We tend to follow the path of least friction. If a tool you use changes that path, and unless (even if?) you consciously fight it, you will change your behaviour, whether this is a good thing or not.
- 45656565 15y agoSo I make a tool to make my work easy, then I go and misuse the tool to make my work shitty. Then I go around blaming the tool for my shitty code since it does not hinder me writing shitty code. I never thought a editor was supposed to hinder writing of shitty code.
- ErrantX 15y agoYep; we've just had exactly this problem with a contractor. Some functionality needed tweaking, which was done on one page - but on testing we found the exact same functionality hadn't been tweaked on all the other pages. Huh? Turned out it was a copy/paste job... which in turn became only the start of the rabbit hole. :)
- drivebyacct2 15y agoI'm confused. Isn't this just a discussion of code duplication, that most try to avoid in programming because it means it should probably be re-factored into something reusable? Isn't it more about copy/paste then than cut/past?
- staktrace 15y agoI hate people who say cut-and-paste when they mean copy-and-paste. Pet peeve of mine, I guess.
- zerostar07 15y ago... or yank-and-put
- eliben 15y ago> I blame the IDE's Please, please learn to write correctly. "IDEs", not "IDE's"
- djKianoosh 15y agocopy/paste is one of the cancers of our profession
- kstenerud 15y agoCorrection: BAD copy/paste is one of the cancers of our profession. Like all tools, it has its place, and there are people who tend to misuse it. Just because it's misused by bad programmers is no reason to deprive GOOD programmers of its benefits. You might as well ban screwdriver heads in power drills because lots of clumsy, inattentive people tend to strip screw heads with them. Similar misguided calls-to-arms have been raised over other useful tools such as preprocessor macros and goto.
- loup-vaillant 15y agoCould you give your estimate of the properly used/badly used ration of copy/paste, preprocessor macros, and goto? Mine would be "too low for me to worry about". Okay, there are some (corner) cases where they really are a good idea. But "never ever use this Chtulu Abomination" still is a damn good heuristic.
- kstenerud 15y agoGood copy/paste: Anything boilerplate such as manually initialized structures/arrays of stuff, language-specific boilerplate (Java comes to mind here) that is essentially the same repeated shit but you gotta do it anyway, unrolling loops, setting up switch statements. Anything unavoidable (or too expensive to refactor) that's repetitive. Preprocessor macros: Code generators, compile-time switchable code (such as logging) without filling your source files with #ifdefs Goto: Managing complex resource allocation/deallocation within a function: bool success = false; int fd = -1; char* memory = NULL; fd = open(filename, "rb"); if(fd == -1) { LOG_ERROR("Could not open %s: %s", filename, strerror(errno)); goto done; } memory = malloc(BUFF_SIZE); if(memory == NULL) { LOG_ERROR("Out of memory"); goto done; } for(blah blah blah) { if(failed to read or whatever) { LOG_ERROR("It's borked"); goto done; } } ... success = true; done: if(memory != NULL) { free(memory); } if(fd != -1) { close(fd); } return success; I disagree that dismissing a tool out of hand as an "abomination" is a commendable approach. If you take that attitude (or instill it in others), you'll probably never learn the proper use of such a specialized tool, leaving you ill-equipped to deal with the situations those tools handle well.
- klklklk 15y agoThere are some greate advice however its impractical in the real world. (I am not defending copy and paste, the DRY principle should be your number one rule.) Most (good) contractors work in this way however its impossible to lay out your solution to its entirety and build a beautiful solution. Without specs being changed on you or you realizing that what you are building is not something the clint wants.
- sylvanaar 15y agoGood IDE's will help you find code duplication.
- mjschultz 15y agoDoes anyone know if there are tools out there that look at a code base and find "similar" snippets of code? I would expect such a tool to parse the language into AST form and find branches that are the same except some identifiers and a few other details. It is probably intractable in general, but I think it is feasible for most code bases.
- davewicket 15y agocut-and-paste != copy-and-paste.