Software Agency Brief

Maksym Kalin

13 June

9 : 00

We are a Ukrainian IT company with a rich 12-year history in the field. Currently, our team consists of 28 experienced full-stack developers, and we continue to expand our talent pool. Our primary technology stack revolves around React and Node.js, with which we have successfully delivered numerous complex projects, allowing us to accumulate a wealth of best practices.

Additionally, we frequently utilize the LAMP stack in our projects, so if you require assistance with such projects, we are well-equipped to handle them. Many of our developers have been with us since 2011, and they have attained the status of senior-level developers. We also have a team of skilled middle-level developers.

When it comes to hiring new talent, we maintain a close partnership with Zaporizhian National Technical University and Zaporizhian State Engineering Academy. All our developers possess a Master's or at least a Bachelor's degree in Computer Science. After completing their degrees, they undergo a rigorous trial period lasting between 3 to 6 months before commencing work on real commercial projects.

We hope that the information provided aligns with your requirements, and we eagerly anticipate the opportunity to collaborate with you. Should you have any further inquiries, please feel free to reach out to us.

1. Fullstack Development Expertise:

 

Every developer in our agency is ready to handle tasks for both server and client parts. It makes us robust for any team configuration and task complexity.

ReactJS and NodeJS are core technologies that our team has been using since the 2015 year. In case you decide to choose ReactJS as a front-end framework so NodeJS is a proper choice to build a back-end because SSR (server-side rendering) requires handling JSX/TSX files from the server side.

NextJS is the main framework that allows us to join the back-end and front-end under the hood of our projects and solve SSR in an easy way.

TypeScript should be used as an extension under JavaScript to manage the stability of the source code for both back-end and front-end parts. 

The very important part of the project is the database. What is the best choice for you? NoSQL or SQL? MongoDB or MySQL? Everything depends on the type of your application, and we are ready to suggest the right choice.

The front-end is tightly related to UI/UX. To meet the custom requirements those Figma designers usually implement, we use TaiwindCSS as a powerful CSS framework that is able to handle any ideas at the pixel-perfect level. 

 

 

 2. Code Quality and Best Practices:

 

The main complexity of any project is staff turnover which can significantly affect the quality of the source code.  Each new developer brings their ideas and personal styles to the project, and the product owner should be aware that the app will work stable.

Using the OOP principles listed below allows us to manage the scalability of the source code, which can be implemented by different developers.

SOLID - principles of object-oriented programming; 

MVCS - architecture of the source code (OOP pattern);

DI - dependency injection (OOP pattern); 

Reflection - objects metadata.

We prioritize maintaining lean code for efficiency, scalability, and avoiding unnecessary complexity. To achieve the proper code formatting and improve readability and maintainability, we are using Prettier and ESLint. Using meaningful names for variables, functions, and classes enhances code clarity. Modularity and encapsulation promote reusability and maintainability. Version control systems, like Git, enable proper code management and collaboration. Comprehensive documentation, using Swagger, aids understanding and usage of the codebase.

In the examples below, you can see key parts that show how the source code looks inside our projects. 

  • The back-end: controllers, actions, validation:

  • The back-end, services

  • The back-end models

  • The front-end, entity, and actions

  • The front-end, views:

  • The source code commenting

 

3. Experience with CI/CD:

 

Our agency has extensive experience utilizing Continuous Integration (CI) and Continuous Deployment (CD)  practices, including the utilization of GitLab CI/CD as a robust platform. We understand the value of streamlined development processes and have successfully implemented CI/CD methodologies using GitLab.

In a recent project for our client, we adopted GitLab CI/CD to automate the build, test, and deployment processes. Here's a brief overview of our approach:

  • GitLab Repository: We set up a GitLab repository as the centralized version control system for the project. Developers committed their code changes to specific branches within the repository.
  • CI/CD Configuration: We defined a configuration file, commonly known as .gitlab-ci.yml, to specify the stages, jobs, and steps for our CI/CD pipeline. This file lived in the root directory of the project.

  • Automated Builds: Whenever a developer pushed changes to the repository, GitLab CI/CD automatically triggered a build process based on the defined pipeline in the configuration file. During the build stage, we utilized Docker containers for dependency management and isolation.

 

  • Testing: As part of the CI pipeline, we integrated various testing frameworks, such as PHPUnit for PHP projects or Jest for JavaScript projects. GitLab CI/CD executed the defined tests to ensure code quality and catch any regressions.
  • Docker: We containerized our application components using Docker. Each component, such as the web server, database, and microservices, was encapsulated within its own Docker container. This approach provided isolation, allowing for independent scaling and updates.  On each code commit, Docker images were built, and the corresponding containers were updated or replaced as part of the deployment process. This streamlined the release process and ensured consistency across different environments.

  • Deployment: Upon successful build and tests, we configured GitLab CI/CD to deploy the application to staging or production environments. We leveraged GitLab's deployment capabilities, including SSH, Kubernetes, or custom scripts, depending on the project requirements
  • Monitoring and Feedback: We integrated GitLab with monitoring tools like Prometheus and Grafana to gather insights into the application's performance and stability. This allowed us to proactively address any issues and ensure continuous feedback to the development team.

Throughout the project, we made use of GitLab's extensive CI/CD features, including parallel jobs, caching, and environment variables, to optimize the pipeline's efficiency and flexibility. We also incorporated code review processes to maintain high code quality standards.

In addition to GitLab CI/CD, our team has experience with other CI/CD platforms like Jenkins, CircleCI, and AWS CodePipeline. We understand the importance of selecting the right tools and methodologies that align with the project's specific needs.

 

 4. Extensive Expertise with GitHub and Jira

We carefully approach the organization of our work. We use Jira as our project management tool. Each task in Jira has a type (such as bug or task) and additional labels to indicate whether it is a backend (BE) or frontend (FE) task. We also assign priorities to tasks, ranging from lowest to highest, to help our developers understand their importance. Each task includes a detailed description of what is expected as the outcome.

In addition, we use various status categories for our tickets, including "To Do," "In Progress," "Ready for Review," "Ready for QA," and "Done." This allows us to track the progress of tasks throughout the development process. Moreover, our Jira system is integrated with Git, enabling us to easily monitor pull requests (PRs), commits, and other related activities.

 

5. Technology Expertise

We can highlight a lot of libraries and technologies our team is using to build applications. The list provided below is the most used by us:

    • TypeScript - adds additional syntax to JavaScript to support strong types.
    • Next.JS - a powerful framework for building react js apps with SSR
    • Typegoose - ODB for MongoDB. The best choice for projects that collect and track a lot of information and data.
    • Sequelize - ORM for MySQL. The best choice for projects that work with finance and transactions.
    • React Native - the framework to build mobile apps for cross-platform applications.
    • I18next - internationalization library for multilanguage support
    • Moment.js - powerful library to work with time, timezone, dates, etc
    • Lodash.js - magic library to manage collections and objects.
    • Socket.io - for transferring data between clients and servers in real-time.
    • Express.js - powerful NodeJS server
    • Nodemailer -  for sending emails via SMTP
    • JWT / Passport.js  - for user authentication and token encryption
    • Redis - to store sessions and data cashing.
    • Redux-Saga - redux middleware to handle actions and manage the redux store in a project
    • Formic - form builder
    • aws-sdk - powerful library to use most AWS services.
    • ajv.js - JSON schema validator
    • Material-ui - UI library for quick UI/UX building
    • migrate-mongo - migrations for MongoDB
    • Multer is a node.js middleware which is primarily used for uploading files

This is the list of some services we are used in our projects:

  • Stripe / PayPal - payment gateways
  • DHL / UPS - shipping services
  • Google Maps / OpenStreetMap - geolocation and maps services
  • Elasticsearch - for searching withiin texts  
  • OAuth2 - service for authentication users.

and many, many other libraries and technologies

 

6. Agile Development Methodology

 

We follow the Scrum framework, organizing work into time-boxed sprints. Sprint planning meetings set goals and select user stories or tasks. Daily stand-up meetings keep the team aligned and address obstacles. Sprint review meetings showcase completed work and gather client feedback. Sprint meetings are held to reflect on the process and identify improvements. Jira is used to manage tasks, prioritize user stories, and monitor progress.

 

7. User Experience (UX) and User Interface (UI) Design

 

We fully cover all design process stages - from simple mapping to detailed wireframing and final UI design concept, including company branding, to ensure all design elements are unified. We constantly follow the latest design trends to make sure our solutions are compelling, modern, and engaging to users. And we don't use templates, creating unique concepts for each case due to its needs and target audience. Our experience covers design projects for different types of businesses - health, e-commerce, sports, entertainment, crypto, finance, etc. 

We use Figma as the main design tool and deliver a ready design mock-up for developers with all necessary assets, components, and a UI kit. We also design any responsive versions if necessary and prepare an interactive prototype to click through all the features. When creating the design we share three main stages:

  • Road map. At the first stage, we study the documentation and the main idea of the project. We show the information about the project in the form of approximate mockups and the main navigation between the application screens.

  • UX (user experience) - at this stage, we work out in detail the navigation on all screens of the application and draw the information content of all screens. You will see how the user will move from screen to screen and how much information will be provided on the screen.

  • UI (user interface) - this is the last stage in which we work out the styles and colors, draw the view of all screens and components. As a result, the customer sees how the application will look on the screen of a computer or phone.


 

8. Security and Data Privacy

 

Our agency places a strong emphasis on security and data privacy throughout the entire development process. We understand the critical importance of implementing secure coding practices, protecting sensitive data, and adhering to relevant regulations and industry standards

  • Secure Coding Practices: Our team follows industry best practices for secure coding, such as the OWASP (Open Web Application Security Project) guidelines. We conduct thorough code reviews to identify and address potential security vulnerabilities early in the development cycle. By implementing secure coding practices using ACL (access control list), we ensure that the software we deliver is resilient against common threats and attacks.
  • Data Protection: We have extensive experience in protecting sensitive data across various stages, from storage to transmission. We utilize encryption algorithms and techniques to secure data both at rest and in transit. Additionally, we leverage secure protocols and frameworks (such as SSL/TLS) to ensure secure communication between components and external services.
  • Infrastructure Security: In a DevOps context, we extend our focus on security to the infrastructure layer. We implement security best practices for cloud environments, leveraging features provided by cloud providers like AWS, Azure, and GCP. This includes secure network configurations, proper identity and access management, and continuous monitoring for potential security incidents or vulnerabilities.

  • Security Testing and Auditing: We conduct thorough security testing, including penetration testing and vulnerability scanning, to identify potential weaknesses in our applications and infrastructure. Additionally, we regularly perform security audits to ensure that our systems and processes align with the latest security practices and comply with relevant standards.

 

9. Scalability, Performance, and Infrastructure Expertise.

 

Our agency has a proven track record in designing and executing scalable, high-performance infrastructure using leading cloud platforms such as AWS, Azure, and GCP (Google Cloud Platform). We understand the importance of robust infrastructure in delivering reliable and scalable solutions. Our expertise spans various aspects, including architecture, serverless computing, load balancing, and security best practices.

  • Infrastructure Design: We leverage cloud-native services and design principles to ensure high availability, resilience, and elasticity. Whether it's designing a microservices-based architecture, utilizing containerization with Kubernetes, or implementing a serverless approach, we tailor our solutions to meet the unique needs of each project.
  • Cloud Platform Proficiency: We have extensive experience in deploying applications on major cloud platforms such as AWS, Azure, and GCP. Our knowledge extends to the various services provided by these platforms, including compute instances (EC2, VMs), serverless functions (AWS Lambda, Azure Functions, GCP Cloud Functions), databases (Amazon RDS, Azure Cosmos DB, Google Cloud Spanner), and more. We are well-versed in leveraging these services to create scalable and performant applications.
  • Serverless Computing: We are proficient in building serverless architectures, where compute resources are automatically provisioned and scaled based on demand. We utilize services like AWS Lambda, Azure Functions, and Google Cloud Functions to achieve event-driven, cost-effective, and scalable solutions. By leveraging serverless computing, we enable our clients to focus on their core business logic while enjoying the benefits of automated scalability and reduced operational overhead.

  • Load Balancing: We have expertise in implementing load balancing techniques to distribute incoming traffic across multiple instances or containers. We utilize cloud-native load balancing services, such as AWS Elastic Load Balancer, Azure Load Balancer, and GCP Load Balancer, to ensure optimal performance and fault tolerance. This allows us to handle increased traffic and scale horizontally as the application demand grows.

Our expertise extends across multiple cloud platforms, allowing us to select the most suitable platform based on the project's requirements. This flexibility enables us to provide reliable and scalable solutions while maximizing the benefits offered by each cloud provider.

 

10. Collaboration and Communication

 

Effective communication is crucial, and we adapt our channels to meet client preferences. Slack is our primary communication tool, with different channels for various topics. Channels are used for daily updates, engineering discussions, leave dates, and code reviews. Daily and weekly reports make you aware of your project's developing life.

Share this article in