My favorite story about this comes from my first job, in 2000. We were working in C++, and we were turning a program designed to run in one machine into a client-server system, because nobody made machines big enough to run what we needed. The plan to do that involved replacing the old function calls with code that serialized the data, sent it over a wire, deserialized it on the other side, and call the actual function. In essence, a small bit of smart code, surrounded by a lot of boilerplate, slightly different for each function. Months of boredom looming for a team of 5.
But I said: Why do all that serialization and deserialization manually? What If I can just read the headers for the function calls, and generate the code that would run it all? Way too hard, our dev lead said: It'll take us longer to write a code generator that read C++ header files than the months of boredom. I disagreed, and asked for two weeks of my time to show it could be done, with less bugs than if we did it by hand. And then when functions changed, all that we needed to do was add a step to a make file, to regenerate the whole thing. Ultimately he decided it was OK to let me try. After all, nobody expected any real output from the guy right out of school, and failure might teach him to respect his elders.
But it was all done in two weeks, by one person right out of school, because building a lexical analyzer,a parser, and a simple generator is easy. Instead of a team bored for months, we had fun work for two weeks, and then on to better things, without that dev lead.
So if you are doing something long, and slow, and boring, always wonder: Is there a way to just eliminate that entire set of boring tasks? You'll be surprised by how often, the answer is yes.