Technical Assessment For Developers
How do we begin the process of building a new project once we know what to build? How do we assess the right technologies for the goals, lifecycle, and technical requirements it needs? From educational-driven personal projects to new company products: there are various means of establishing reasoning and rationale of knowing how to start off.
Recently, someone at Reactiflux posted an interesting question:
"For production apps, do you recommend start a project using create-react-app or is it better to have your own boilerplate?"
Naturally, I responded with:
"I build from scratch. The reasoning was (knowledge of a) build system + I know exactly what everything is."
But after some thinking, I realized how my answer was a bit short-sighted. What if we were to do a simple Todo app for example? Would it make sense to write out an entire
webpack.config.js to build it out in React? Not really.
But what if our Todo app is going to have various features like the ability to draw in each note, geolocation-based notes, cross-platform compatibility, the ability to record audio into a note, or a built-in social media network for them? We may need something a bit more custom than a boilerplate in that instance.
Let's explore some possibilities around this from large projects to small ones.
In the same vein, would it make sense to build from a large boilerplate for a project that could last for several years? What happens if your project's requirements change mid-way through that need a major overall of internal core code?
With a boilerplate, you are purposefully forfeiting knowledge of the internal workings of your project. This notion implies you trust that core code to work without you understanding why it does. If you end up doing a major rewrite with a large boilerplate for a massive project, you may need to end up rewriting a significant portion of that project since the boilerplate still follows old requirements presently different from your own. At that point you've basically already started a new project wasting a lot of time.
If you end up writing everything from scratch for a small application, you've wasted a lot of time writing what I call Darkware. Creating lost hours that is not spent building the project. Darkware is code written that doesn't provide any immediate improvements to user experience or your project. Small projects are more prone to the negatives of Darkware versus larger sized projects, where some Darkware may be written for meta-development purposes.
Though sometimes even for small projects, Darkware can be written for educational purposes. Darkware has more benefits when applied to more ambitious projects if one has experience utilizing it. Learning to build a project with Darkware may pay off in other projects in the future.
With these concerns in mind, the technologies or approaches to building out project should ideally effect the following qualities of your project:
- Minimizing time spent writing Darkware. Do you immediately benefit from your Darkware? Is writing Darkware part of your goals? How does writing Darkware help you move forward reaching the goals of your project?
- Maximize productivity to reach your goals or project requirements. Are you learning? How much time do you think you need to dedicate to this project to complete it? Would using existing frameworks or boilerplates meet the majority of project requirements to justify their use? If not, why use them?
- Long term consideration of potential deviation from planned architecture. Does the design need to be flexible if a change of scope is expected? Do you plan to not work on the project beyond a certain point? The idea of flexibility refers to the ability to deviate from existing project requirements or goals. Time estimate to develop the project must be considered.
With these considerations, we are in a position to ask thoughtful questions to ourselves about what should go into our project in the most practical way possible. And are in a better position to immediately have an idea of how to start building something new.
There's no real strict answer in this; it all depends on your ability to assess the needs of a project and coming up with the best solution for it. I hope this piece helps guide that decision making processes and better illustrate the kind of mindset or things to consider when you start building.
(This post will be updated further in the future.)