Our site is very customized. As site ID 1, we have had a long time to develop to our own needs. So much so that, when I find a standard widget in use, I'm a little impressed. However, I am often surprised at how frequently I don't need to start from scratch when creating something new. There is often a standard widget that I can extend just a little. Even if I can't find a widget that quite meets my needs, I am usually able to leverage the existing Customer Portal API methods and information in the Connect PHP API developer's guide when I make new functionality.
Making new functionality is like making pizza. My favorite pizza, actually. The absolute best pizza has a crust so thin that you can fold it like a taco. I add extra cheese, black olives, mushrooms, and most importantly, eggplant sliced and breaded. Now eggplant is fairly non-standard for a pizza (at least here in Montana), so I have two options:
1. I could try to make the entire pizza (a multi-hour venture if you give the dough time to rise) as close as possible to my ideal pizza using my own skills, or
2. I could order a pizza with the cheese, olives, and mushrooms and then add the eggplant myself. In essence, extending the pizza.
Truth be told, it is easier to just order the pizza.
Now, compare this process to development. There is an image that we developers have of ourselves. We are able to take an ask, perhaps it's hashed out in a meeting on a whiteboard with arrows pointing this way and that, or perhaps it's just a simple picture of what the finished product should look like with all of the "under the hood" capabilities left to the technical experts who will make it work. We can build anything from scratch. Spending hours slouched toward our screens, we know how every single piece works and why it was needed. And when we are done, it is beautiful. But so many times, we are reinventing the wheel, or in this case, the pizza. So why do we do it?
One reason, explained succinctly by Joel Spolsky is that, "It's harder to read code than to write it." I think this is a resounding call for all of us to get better at commenting our code (as an aside, I keep a list of other developer's funny comments that were written under duress while developing for a browser that will remain unnamed, but I digress). Another reason is that we see the limitations of what exists to meet our specific needs, and think that we can whip something up quickly from start to finish rather than tinkering with what is present. In this case, I would argue that the time you spend tinkering is not wasted. Especially since, the next time you need a new tool, you will have a better understanding of what exists. The time after that, you will be able to deliver your project wicked fast. Maybe even pizza-delivery fast.