Using Time Well
Time is certainly critical enough to warrant keeping your eyes open for warning signs like these. However, here are some key tips to use when prioritizing your project list.
Err on the Side of Big Projects
The consequences of ignoring small projects are usually measured in the irritation of stakeholders, especially clients. This encourages the perception that you don't care about the little things, or that you're sloppy. Left unchecked, it creates the perception that you don't care at all. None of these are good things. However, the consequences of ignoring large projects can be project failure, and even organizational failure. These are not balanced consequences, and your priorities when determining the final project list should reflect that. All else being equal, take on the bigger things first.
Design should also consider the larger situation of change and the interfacing modules which already exist in the current project and those on the project list for the future. Working on a small focused design is unquestionably easier, small projects really are easier and more efficient than large ones. It is certainly possible to manage your time more efficiently by breaking larger projects down into smaller ones... for construction. However, if you fail to design with the big picture in mind, you will have to come back later to recode the system when its poor integration becomes a problem. Or worse, there are organizations which simply ignore this lack of integration which is the quick and easy path to maintenance hell.
Build Incrementally / Iteratively
Design a little, build a little, test. The longer it takes for you to get around to testing something, the more code you have to look through to find the error / oversight. During detailed design, you should identify increments which you can build and test complete. These will become important checkpoints for more thorough testing. Individual developers benefit from testing a few lines of code, but your team should always systematically hit checkpoints during construction. The site can then be pushed to a test site for more detailed evaluation; if you have a QA department this is a logical place for them to take over while still being able to work with the development team throughout project construction to identify issues as early as possible. That way you can avoid writing new code that's based on bad code. This is why incremental development is so valuable.
A corollary to this is to use iterative development methodologies. Smaller projects are more efficient to build because they are easier to understand. Abstraction helps you break a large problem down, but dealing with a fundamentally smaller problem is even better. Iterative development identifies small projects that you can build to grow an application piece by piece. This can be accomplished by breaking a big project into modules, with each piece adding different functionality. You can also build the core of a large project and then progressively extend it into a larger project piece by piece. Either way, it is more efficient to build small than to build large, and this is why iterative development is a best practice.
There is another less than perfect advantage of iterative development, but one that is no less significant. Sometimes you can take a large project and break out a smaller project which incorporates an especially difficult, complex, or otherwise risky module. Risk Management operates by front loading the most difficult tasks; this minimizes the effort lost if a project fails. Using a small project like this effectively moves key risk management portions of the large project before its own development even begins. Developing a small application which fails loses you only a small amount of time and code but still demonstrates a make or break flaw in the large project; this is fantastic compared to losing lots of time and code on a large project.
Build on the Code You've Already Written
You built it, take advantage of it. 3rd party software can cause problems because it keeps useful helper functions hidden away, and doesn't integrate nicely in other ways with your application. This is one of the big strikes against it. There is no such down side to extending your own code base. On the contrary, using your own existing architecture ensures good reuse of functions which decreases your time of construction. Using the same helper functions rather than writing them over prevents WET "Write Everything Twice" code. DRY "Don't Repeat Yourself" code minimizes maintenance time. Reusing your code base also does more than anything else to force developers on the team to work in similar ways. Similar coding techniques gives the team freedom to assign anyone to work in any portion of the application on any author's piece of code, and they will still have a basic familiarity with the code they are working on.
Prefer Saving Time on Maintenance to Saving Time on Construction
Coding an application is a long term issue. Research has consistently shown that despite the huge amount of work which may go into construction, maintenance is still the phase of the SDLC that requires the most development time and monetary expense. The percentage for iterative development projects is even more extreme. This is the other big reason that 3rd party software can be an "illusionary" benefit. 3rd party software by its nature sacrifices maintenance time to save construction time. If a 3rd party application or a framework makes maintenance more difficult, you are probably creating more work than if you used custom code.
Further, maintenance is a viciously sneaky phase. If you look at the SDLC, maintenance looks like it's very well contained, something that happens following deployment. The problem is that construction does not happen in the snap of a finger. The fact is that construction takes time, frequently more time than any other phase except maintenance. Here however is the dirty little secret. Once you create the first function, or class, or module for the project, that piece is now effectively under maintenance. While universally treated as "construction" resources and expenses, in terms of how you are required to approach the continuing development of these pieces, they are fundamentally maintenance issues. If you have sacrificed maintenance considerations to "speed" construction, you begin paying for it as soon as you've typed in the last character. This can have a devastating impact on construction and has caused more than a few project failures.