Para mí, ayuda dividir una pieza de software más grande en trozos más pequeños. Y luego rompa esos trozos en partes aún más pequeñas y así sucesivamente. Cada programa de software es una colección de pequeñas piezas de lógica.
Considere un blog, por ejemplo. Desea poder crear y editar publicaciones que otros puedan leer. Inmediatamente puede dividir el proyecto en secciones administrativas y públicas. Como mínimo, el administrador requerirá usuarios administradores, una página de inicio de sesión y una sección para administrar el blog. La sección para administrar el blog se puede dividir en una interfaz CRUD (Crear, Leer, Actualizar, Eliminar). La creación de una nueva publicación de blog requerirá una verificación para asegurarse de que el usuario administrador tenga los privilegios correctos, un formulario, un formulario de validación y la capacidad de guardar en la base de datos. Y así.
Cuanto más desgloses un problema o una característica, más manejable se vuelve. Es dividir y conquistar. Una vez que haya podido mapear su software de esta manera, puede ver cómo interactúan las diferentes partes entre sí. ¿Dónde podrías repetir el código? ¿Qué se puede abstraer? Este debería ser un proceso iterativo tanto como planificas como cuando escribes el código.
Recomendaría averiguar cuál es su conjunto mínimo de características para comenzar e implementarlo antes de agregarle otras piezas. Querrá codificar a la defensiva para que los cambios futuros no sean demasiado difíciles, pero al mismo tiempo, no desea implementar medias características que tal vez nunca se completen. Es una línea difícil caminar entre mantenerse flexible y estar dispuesto a matar sin piedad a sus seres queridos, pedir prestada una referencia literaria. Ser bueno en ese acto de equilibrio en particular solo proviene de la experiencia.
Y a eso se reduce, como han mencionado las otras respuestas: experiencia. La única forma de obtenerlo es simplemente comenzar. No se preocupe tanto por hacerlo perfecto desde el principio. Primero haga que el código funcione, luego hágalo hermoso, luego hágalo rápido.
Además, a diferencia de este párrafo, no agregue seguridad al final como una ocurrencia tardía. Debería tener una idea sobre las formas en que su software podría verse comprometido, pero, para empezar, nunca confíe en las aportaciones de los usuarios.