Crafting Successful Applications For Startups

srinivasarao aleti
EverestEngineering
Published in
7 min readFeb 18, 2024

I‘m fortunate to work on greenfield projects, which gives me valuable insight into bringing an application to life. I’d like to share some practices that can be followed when working on completely new products from scratch or in the early stages of a project.

First, let’s delve into the advantages of implementing effective practices right from the start. In my childhood, my father used to share a saying: Bend a tree while it is young, because when it is old it will break. This means fixing things early is easier. Like a tree needs care from the start, projects need strong practices early on for success.

For example, imagine you’re building a house. If you notice a small crack in the foundation at the beginning, fixing it is much easier than waiting until the entire house is built. It’s the same with projects — implementing good practices, addressing issues early saves time, money, and stress down the road.

Also, starting with good practices shows everyone we’re serious about doing things right. It makes work go smoother and everyone focuses better on success.

Understand Goals:-

Before diving into development, it’s crucial to fully understand what the application needs to achieve. This means knowing the purpose of the app, who will use it, and what problems it solves. Clear goals help guide the development process and ensure the final product meets the client’s or startup’s needs.

Additionally, considering factors like scalability and future growth potential ensures that the solution remains viable and adaptable in the long run. Ultimately, a solid understanding of the application’s goals lays the groundwork for a successful development journey.

Define MVP (Minimum Viable Product):-

One important thing many people overlook is what you can deliver within a set time frame and how much it benefits users

Think about Amazon. It took years to become what it is today. When you’re working on a project, you need to be realistic about what you can achieve in a certain time. That’s where the Minimum Viable Product (MVP) comes in.

The MVP is the basic version of your project that delivers value to users. For Amazon, it could be letting people see products and buy them. This is something you can do in a few months.

To stay focused and not get overwhelmed with new ideas, talk to your clients often. Write down all the ideas and decisions in a place like Miro or Notion. This helps everyone remember what was agreed upon.

It’s important to keep the project scope in check. If new features are requested, go back to the MVP definition. Remind your clients of what was decided and how adding new features might affect the timeline and budget. This way, everyone stays on the same page and the project stays on track.

Architecture:-

When starting a new project, especially with a startup, the choice of architectural style is crucial. There are various options like Monolithic, Microservices, Serverless, or SOA ..etc. each with its own strengths and weaknesses.

For startups with tight deadlines and limited resources, keeping things simple is crucial. That’s why I recommend starting with a Monolithic architecture. It’s centralized and easy to manage with a small team. A basic 3-tier setup provides scalability and flexibility without making things too complex.

Choosing a Monolithic architecture doesn't mean giving up on scalability later. It lets startups move fast and deliver value without getting stuck in complex decisions. As the project grows, you can always switch to a different architecture if necessary, if needed.

Tech stack:-

Selecting the right tech stack is always a challenge, especially with the constant influx of new options. The chosen tech stack should support scalability and facilitate the addition of new features seamlessly.

I recommend opting for popular frameworks and libraries rather than reinventing the wheel. Additionally, it’s crucial to choose technologies that you feel comfortable working with, as speed is often of the essence in delivering results.

Consider the following options:

  • Frontend: ReactJS, Vue, AngularJS
  • Backend: Golang, NestJS (Node framework), Spring Boot, Django
  • Database: SQL (Postgres), NoSQL (MongoDB, DynamoDB, Cassandra, etc.)

By leveraging these established technologies, you can streamline development and ensure your product remains adaptable and robust as it evolves.

Organize code efficiently:-

Version control tools like GitHub are widely used and offer many benefits for projects. They act as a storage for all our project files, allowing anyone to access or update the code anytime.

Even if we use a monolithic architecture, we might still want to separate our backend and UI code into different projects. Additionally, there are other things like infrastructure setup, CI/CD setups, etc. One important consideration is how to organize our code in the repositories. Should we use a Monorepo or multiple repositories?

I personally believe that Monorepos are great, especially for small teams. They make it easier to manage because everything is in one place. This helps everyone understand what’s happening across the project. It also offers simplified management, consistent environment, ease of collaboration, streamlined CI/CD. Overall, Monorepos provide a convenient way to organize and collaborate on projects, especially for small teams.

Clean Code:-

Writing clean code is essential for a smooth development process and long-term maintenance of the application. It’s all about keeping the codebase organized, readable, and easy to understand. This not only benefits the original developers but also anyone who needs to work on the code in the future.

It’s important to remember that other people will likely need to work on the code you’ve written. That’s why clarity and simplicity are key.

Here are a few tips to achieve clean code:

  1. Establish Guidelines: Define coding standards and guidelines as a team. Consistency in coding style and practices makes it easier for everyone to understand and work with the codebase.
  2. Code Reviews: Incorporate code reviews into your development process. Peer review helps identify potential issues, encourages collaboration, and ensures that code meets quality standards before being merged into the main codebase.
  3. Use Tools: Utilize tools like linters, formatters, and spell checkers to maintain code quality automatically. These tools can catch common errors and enforce coding standards, saving time and reducing the chances of introducing bugs.

Design & Develop:

Before diving into development, it’s important to get everyone’s input on how to solve a problem. For bigger features, I recommend discussing ideas with the team first.

In my project, I write a document outlining my ideas and share it with the team for feedback. This helps us all understand the plan and often leads to great suggestions from teammates. Plus, it makes reviewing code easier later on. And if someone wants to know what happened with a feature, they can always look back at the document.

I highly recommend this process — it adds a lot of value.

Testing:-

Writing tests is often overlooked, especially in startup projects where delivery pressures are high. However, it’s crucial to prioritize writing tests for your code. Tests serve as proof that the code you’ve written is correct and help identify and fix bugs quickly. They become particularly invaluable when undertaking large refactoring tasks.

I recall a project where we had to deliver the application within a tight 4-month timeframe with just 4 team members. Despite the time constraints, we didn’t allocate enough time for writing tests. When we eventually had to do a significant refactoring, it turned out to be a nightmare. Without tests, we encountered numerous bugs, and the refactoring process became extremely challenging. If we had written tests beforehand, the outcome would have been different. Later we realize the importance of the tests, and started adding it.

There are various testing strategies, such as unit tests, integration tests, and end-to-end tests. Starting with unit testing is a practical approach, as it allows you to test individual components in isolation.

Automate infrastructure & Local development:-

Deploying applications to cloud providers like AWS, GCP, or Azure is essential for making them accessible to users. However, manually setting up infrastructure and deploying code can be time-consuming and error-prone.

Imagine your application requires an EC2 instance, a PostgreSQL database, and S3 buckets for storing images. Setting up this infrastructure manually might take around 30 minutes. But what happens next? Every time there’s a new code change, you’ll need to redeploy it, which can be time-consuming. Plus, if your infrastructure breaks, fixing it can be challenging. Additionally, managing different environments like development, QA, and production becomes complex as your infrastructure grows.

That’s why automating infrastructure is vital. It saves time, reduces errors, and improves efficiency. Tools like Terraform help manage infrastructure as code, allowing you to define and provision resources easily. For CI/CD, tools like GitHub Actions automate the build, test, and deployment process, ensuring code changes are deployed quickly and reliably.

Moreover, automating local development is crucial for onboarding new developers. In my current project, we use Docker and Make scripts to create a simple setup tool. With one command, make up, developers can set up their local environment quickly and start working.

Documentation:-

Lastly, I want to emphasize the importance of documentation. Taking the extra time to write thorough documentation pays off as the application grows. Few advantages I can see:-

  • Clarity: Documentation ensures everyone understands the project’s goals, requirements, and how it’s supposed to work.
  • Onboarding: It helps new team members get up to speed quickly by explaining the project’s context, code, and design decisions.
  • Knowledge Sharing: Documentation captures important information and lessons learned, ensuring continuity as team members come and go.
  • Collaboration: It facilitates teamwork by providing a central source of information for everyone involved.
  • Maintenance: Well-documented code is easier to maintain and update over time, reducing future headaches.
  • Client Communication: Documentation keeps clients informed about the project’s progress and milestones, building trust and transparency.

Summary

Here are some tips for starting fresh with a new project.

  1. Begin with clear goals: Understand the purpose, target users, and problems the application aims to solve.
  2. Define MVP: Establish the minimum viable product to deliver value within a set timeframe, focusing on essential features.
  3. Choose architectural style wisely: Opt for a suitable architecture (e.g., Monolithic, Microservices) considering scalability, resources, and team size.
  4. Select the right tech stack: Leverage popular frameworks and libraries to streamline development and ensure scalability.
  5. Organize code efficiently: Consider Monorepos for simplified management and collaboration, especially in smaller teams.
  6. Prioritize clean code: Maintain codebase readability and organization to facilitate ongoing development and maintenance.
  7. Design before development: Discuss and document ideas with the team to align on solutions and streamline the development process.
  8. Implement comprehensive testing: Include unit tests and other testing strategies to ensure code quality and minimize bugs.
  9. Automate infrastructure and local development: Utilize tools like Terraform and Docker to automate setup and deployment processes.
  10. Document thoroughly: Provide clear documentation to aid onboarding, facilitate knowledge sharing, and ensure project transparency and continuity.

--

--