Product Development
This page reflects my current perspectives on product development, informed by ongoing experience and learning. It will be periodically updated to incorporate new insights.
This text is still work in progress
Structuring teams and product development
In product development, the key question is ‘What to Build?’ This involves understanding user needs beyond their explicit requests and having a strong vision. Visionary thinking is crucial, especially when building a new product. Product developers must listen to users, but need to consider the feedback against their broader vision. A fast feedback loop between the developers, domain experts, and users is essential. There are many product discovery methods and frameworks that can help you to find what to build. Essentially those come down to talking to customers, good communication and fast feedback loops with all the stakeholders.
Once you have figured out how to determine what to build, you need people to build it. You should have an inspired and competent team that is cross-functional and communicates well. Usually, there are some business stakeholders, a product manager, a designer, and engineers. The team should be empowered to have autonomy and ownership of the product. That is motivating and leads to better outcomes. A good team can find processes that work well for them by themselves, but there are also some well-established best practices that you should study, because successful companies end up having very similar systems at the core.
As the company grows, the significance of its organizational structure and the management of information flow become increasingly important. For small organizations, a flat structure can work well, while it’s easy to keep everyone aligned with the company’s goals. However, with expansion, involving everyone in every aspect becomes impractical. Therefore, establishing effective strategies for information distribution is crucial. This ensures the right team members are informed and involved in crucial decisions, allowing the business to adapt to its growing complexity and maintain organizational efficiency.
As your product progresses through different stages, the approach to its development needs to adapt. In the early stages, particularly before achieving product-market fit, the focus should be on rapid implementation. Embracing technical debt is acceptable during this phase, as speed is key. If it turns out that the solution being developed is not the right one, the technical debt is discarded along with the solution. However, once the product becomes more established, priorities shift towards maintainability, scalability, and various optimizations. At this stage, technical debt adds friction to progress and must be managed carefully.
Thoughts about implementation
A good development environment enables focusing on feature implementation, and incidents can be traced in production. Deployment to production is straightforward and swift, supported by automated tests. The codebase contains no unused code, with comments clarifying the rationale for specific implementations. The code is predominantly functional, and global state is kept to a minimum. In the context of basic CRUD apps, objects primarily serve as data structures, while functions are utilized to transform the data.