I have a high level process that allows me to approach problems so that I can advance towards creating an elegant solution, no matter how large or complex the problem is.
When I first encounter a problem, I outline my goals and break the project down into general steps. I aim my approach by considering the needs of the users, the business, and the team building it. Additionally, I arrange my process with consideration toward the time, resources, and scope of the project.
I engage in research to gain a clear understanding of the problem domain. I seek to understand and define the context of the problem I am trying to solve. This includes researching who I am designing for, their needs, their lives, and my competitors. During this stage I create user journeys, mood maps, and utilize other research methods to truly grasp the context of the problem.
There's never just one way to solve a problem. During this stage, I create a multitude of solutions to solve the problem. Brainstorming these ideas helps me explore many options in a short amount of time, without going into full fidelity mockups. I assess and evaluate each idea until a final concept is chosen.
Depending on the project and scope, I set out to create the solution in a way that most makes the most sense. Some ideas require going into high-fidelity mockups, while others involve pen and paper or prototyping with code.
I believe a design can never be truly finished, it just becomes good enough to launch. How "good enough" is defined varies on a project-to-project basis, keeping in-step with company and project timelines. I'm a firm believer in "If you're not embarrassed by the first version of your product, you've launched too late." Once launched, data can be gathered from feedback to improve further iterations upon the design.