Tech & Work

Insights from my journey as a software engineer — from code and architecture to design systems and developer mindset.

Tech & Work

Frontend HLD: Understanding Different Types of Applications

Modern frontend applications are no longer limited to simple webpages and forms. Nowadays, they handle large datasets, complex user interactions, and intensive computations, all inside a single browser. And I believe it is a good idea to understand the basic types of applications and their nature, so that whenever you start working on an application, a problem, or even a feature, you already have some foundational understanding in place. This helps guide your intuition and enables you to architect better, more scalable applications. So, Let’s learn these types: Data Heavy Applications These are the applications that deals with massive datasets and presentation of the data in different kinds of visualizations such as charts and tables. Example: Finance trading and banking dashboards Social media feeds such as facebook, instagram, reddit and even dev.to Analytics dashboards and Log processing systems Ecommerce platforms such as Amazon, Flipkart, EBay Common problems: performance issue due to large lists of data rendering a large number of DOM elements can be time-consuming and resource-intensive for browser UI freezing issues Complexity of data structure and data management and state Common solutions: Our goal is to reduce the memory usage and page load times while keeping the UI responsive pagination infinite scroll or lazy loading for on demand data. windowing: Windowing is rendering only the visible portion of a list to the screen. react window or react-virtualized are two libraries used in react to achieve this. web workers: Offloading heavy data processing or sorting tasks to a background thread to prevent the UI from freezing Compute heavy applications Applications that require intensive data processing, calculations and heavy rendering, comes under compute heavy applications category. These are often CPU and GPU heavy. Example: video rendering: Youtube, photo editors, video editors Google Maps 3D Modeling tools such as AutoCAD web Scientific simulations apps AI/ML apps running inference with TensorFlow.js Browser games Common Problems: The primary bottleneck is often the single-threaded nature of JavaScript as it is handling both rendering and business logic Main thread blocking (intensive computations run on same thread as UI rendering) Frame drops and slow rendering DOM overload, Memory leaks due to unreleased listeners Browser and device variabilities Common Solutions: Using web workers to offload heavy computations to background thread to keep UI free Windowing Throttle and debounce Memoization of expensive functions and calculations Realtime Application Applications that process inputs and outputs instantaneously within a strict time frame and with minimum latency. Example: Chat apps like whatsapp, telegram Video conferencing apps like zoom, google meet Online games and IoT apps Transportation and logistics like Uber, Swiggy etc. Common problems: Latency issues: delay between an action and its result High CPU and memory usage due to always-on nature of realtime apps Ordering of events and state synchronization Security risks Common solutions: Optimistic updates: updating UI immediately assuming server request will succeed Using centralized state to maintain a single source of truth Throttle and debounce Web workers to offload data to background thread Content Driven Applications These are not typical applications that focus on high interactivity. Instead, these apps focus on fast delivery of content and readability of information. These employ strategies such as Static Site Generation (SSG) or Server-Side Rendering (SSR) for fast loading and SEO. Examples: Blogs and new websites and web apps E-Commerce and Product catalog apps Documentations Marketing apps, Video streaming apps (youtube), etc. Common Problems: SEO + Web Vitals for increased visibility on search engines Asset heavy nature forces you to deal with large images, videos and unoptimized media. Managing third party scripts and large frameworks, making sure you don’t choke the browser and cause slow interactivity Rendering optimizations to support display of thousands of items Unpredictable traffic, Responsive design, Accessibility, and data managements are crucial things that you need to keep in check. Common Solutions: Performance: Lazy loading for images, code splitting for reduced bundle size and use of modern formats for both images and videos such as Webp and avif. Utilizing rendering strategies such as SSG and SSR Virtualization and caching for large data sets rendering Using headless CMS and frontend application to decouple data management layer and presentation layer. Transactional applications Applications such as payment gateways, booking and banking systems are covered in this category. These require high security, robust state management and realtime updates. Example: Payment gateways like stripe, paypal, razorpay Booking systems Online banking systems Common Problems: High security and dealing with sensitive data + compliance requirements (PCI Compliance) Robust state management to maintain consistency Error handling and safe retry logics Race conditions and duplicate submissions Common Solutions: Tokenization: Instead of sending raw credit card numbers, frontends use tokens provided by the gateway. This secures the data and limits compliance scope. use of SSL and HTTPS Introducing strict validations on both Frontend and Backend Implement Idempotency Keys: Ensure the frontend sends a unique key for each transaction to prevent double-charging in case of retries. CRUD heavy applications CRUD heavy applications focus on data management through Create, Read, Update and Delete operations. They require robust form handling, data tables, validations and filtering options. Example: Admin panels and dashboards Inventory management systems, and CMS (e.g. Wordpress) Helpdesk portals, CRMs Task management and project management tools like Jira, Trello Common Problems: Rendering massive datasets in the form of grids and tables Overfetching and underfetching of data Complex form states and overall state management Validations and sanitization of form data Filtering, sorting and search requirements across app Common Solutions: Virtualization and pagination of data Debounce and throttle for search bars and inputs Using optimistic UI updates Decoupling UI and Data structures Consistency in both form validation and feedback when handling data Event Driven Applications Applications that rely on event based models such as notification systems, IoT modules, Microservices, comes under this category. Events are constantly produces and consumed in these kinds of applications and they use Pub/Sub Pattern to communicate Example: Realtime order tracking Collaborative editors like Google Docs, Figma IoT control panels Stocks and trading platforms Notification systems in social media platforms

Frontend HLD: Understanding Different Types of Applications Read Post »

Tech & Work

Checklist for Engineers Joining a New Project

Goal: A quick-reference checklist of dos and don’ts when you’re new to a team or project – technical, cultural, and strategic. Bookmark this for future reference Mindset Listen and absorb as much as you can from discussions, meetings and conversations. Ask a lot of questions from different people in your team such as engineers, PMs, QA, designers. Do not limit yourself to just your domain. Clear assumptions: It’s good to clarify your assumptions even if they are obvious. Focus on “why X is like that” instead of “why we are not doing Y instead of X”. Understanding the context matters more than proposing alternatives early on. Start small: Ship a tiny fix or feature to learn the end to end flow. Take notes where required to have a reference for next time. Ramp up smartly Learn ✅ How to build, run, test and debug the project locally. ✅ Where docs live (internal wikis, Notion, READMEs, Slack pins) ✅ What is the API setup, data flow, and connection between frontend and backend ✅ Project structure, conventions, auth, permissions, and environment variables Release process Understand the release process — what happens after you push code? How can you verify your changes? Is there a post-deployment checklist or test plan you need to follow? This helps you build confidence in the full development lifecycle. Get familiar with GitHub workflow (branches, PRs, reviews) Jira / PM tool workflow (tickets, estimations, priorities) Know the Business + Team Culture Understanding the “why” behind decisions and the way your team works helps you navigate smarter and contribute meaningfully. This helps you get the bigger picture. What business value does the tech serve? Which business goals are driving the current direction? Why not switching tech is often a conscious, valid choice Understand legacy: it exists for a reason, even if it looks messy Learn the team’s communication norms, review style, meeting rituals Expectations Over Time Have realistic expectations for yourself based on the project’s size and complexity. A project is a marathon, not a sprint. Ramp-up: 3–6 months to be confident, especially in large/legacy projects Efficiency: 1–2 years to become fast and intuitive Proficiency: 3–5 years to develop deep technical and domain depth Final Tips Take your time learning — there’s no rush to “prove yourself.” Ship something small, build confidence. Have fun and bring your unique value to the team.

Checklist for Engineers Joining a New Project Read Post »

Tech & Work

A React Starter Template for the Impatient Developer

I recently created a starter template and wanted to share the process behind it. If you’re not interested in the process, here’s the link: paras594/react-starter-template For those who are interested, read ahead. The Problem I like building projects for fun and experimentation, but I always had one main problem: project setup. I’ve become well-versed in it and have no fear of getting started, but it’s inefficient and damn slow. It slows me down that I have to spend a chunk of my time on setup instead of actually building the project. Sometimes I used Next.js for its defaults with routing, data fetching, and optimizations out of the box. Other times I went with custom setups and Vite. In the past I was dabbling with webpack and custom configurations, but with time it all changed and I never finalized one single approach. Even though I always thought of building templates I could reuse, I either didn’t get the time or was too focused on the project that I let the templating part slip—until now. The Solution I found degit out of nowhere. I knew about it but never gave enough thought to it. But this time I understood my goal: have a template setup and add degit to the whole thing. I quickly sat down, used the Vite + React default template, and invested time in a few key decisions on what to include. My Goals with the Template Flexible and extensible – Should adapt to different project needs Reliable folder structure – Something you get familiar with over time Formatting and linting support – Without requiring tons of configuration Styling and components – Easy to get started with What Made the Cut Vite + React – Fast builds and development server TanStack Router – File-based routing with better type safety TanStack Query – Data fetching & server state management Tailwind + DaisyUI – Utility-first styling with ready-to-use components Biome – Linting and formatting TypeScript – Type safety PWA support – Progressive web app features The goal was simple: clone the repo and start building features on day one. Why These Choices? Vite is fast, TanStack Router provides a cleaner approach to handling routing than React Router, TanStack Query takes care of all the boilerplate that comes with data fetching, Tailwind + DaisyUI gives great default components without writing tons of classes, Biome avoids the hassle of keeping ESLint and Prettier updated while eliminating config bloat. How It Evolves I actually use this template for my own projects, which means it stays current with my real-world needs. Dependabot keeps the dependencies updated, and I add or remove things as I encounter them in actual development. I’m also considering branches for different use cases – maybe a minimal version, or branches with specific additions like authentication or database integration. The idea is to have options without bloating the main template. The template is on GitHub: paras594/react-starter-template Follow the steps in README and you are good to go. Final Thoughts This template isn’t revolutionary – it’s just a collection of tools that work well together and let you focus on building features instead of configuration. Feel free to use it if it matches what you usually reach for, or ignore it if your stack is different.

A React Starter Template for the Impatient Developer Read Post »

Scroll to Top