Development: From signals to software

From signals to software

Earlier there used to be specific hardware circuits to perform the particular operation, and they weren't capable of performing a general-purpose task to accommodate a variety of use cases.

After that, an era came where there was generalized hardware (computers), but there was a lack of compatibility with software.

The software developed on one computer doesn't always work on another due to a lack of an operating system and generalized data formats. Then the operating system was developed that allowed cross-computer software compatibility.

Still, the market was flooded with so many different operating systems based on different kernels that, once again, computer compatibility issues occurred as each company tried to develop its hardware, kernel, operating system, and software. With time only a few kernels survived and became the basis for most operating systems.

The kernel is a type of software that manages the communication, allocation, and deallocation of resources between the operating system and hardware. Parallel to all this network of computers across the globe was being developed that later became the internet.

Still, there were issues with data formats used by different applications, and data processed on one computer needed to be compatible with another.

Hence standards were developed for different types of data and files, such as text, video, audio, graphics, CSV, txt, mp3, wav, JSON, XML, and more.

Right now, we are in a period where most organizations build software products compatible with the standards and protocols to cater to their use cases rather than making the whole tech stack on their own.

What is software development?

Developing any software from kernel to the operating system to the compiler to programming languages to task schedulers to databases to web applications to mobile applications to games to web3 apps to AI applications lies in the categories of development.

Certain trade-offs, abstraction, and engineering principles must be fulfilled while developing a certain type of software that leads to different terminologies and various nomenclature for software development.

How to learn software development?

Learn computer science fundamentals to gain the ability to think like a computer scientist by going through abstract thinking, mathematics for computer science, programming, algorithms and data structures, computer architecture, operating systems, languages and compilers, databases, computer networking, and distributed system.

Then learn web development, mobile development, game development, artificial engineering, IoT, robotics, or whatever seems interesting.

One can learn to develop a specific type of software first, then go through computer fundaments or learn both things in parallel depending upon interest and constraints.

All pathways have tradeoffs; hence one should not bother about which is the best.

How to build software products?

Write down your requirement, constraints, audience, and platform, then do high-level system design of the product, UI/UX engineering, develop backend and frontend or use low code tools or no-code tools, do unit testing, develop CI/CD pipeline if required, use version control, deploy and test it out.

Each phase/component requires proficiency, but to build a minimum viable product or a side project, one can make it in whatever way he/she wants.

How to not overengineer a software?

While developing software, getting lost in the loop of having the best tech stack is easy, but it can be avoided by knowing your requirements and constraints.

Every software has three layers frontend, backend, and API.

Frontend: Platform where customers will be consuming the application.

Backend: Data processing, storage, scalability, and pipelines.

API: Instead of building everything from scratch, we can use API to perform certain functions, such as payment processing, authentication, notifications, and a lot more.

An over-engineered tech stack:

Frontend-stack: Javascript, Typescript, React.js, JotAi, TailwindCSS, SaSS, PostCSS, web pack.

Backend-stack: Postgresql, Neo4j, Redis, Node.js, Next.js, TypeORM, Nginx, Docker, Kubernetes, Google Cloud Platform, Terraform, GitHub Actions.

API: GraphQL, Apollo, Stripe, Auth0, Twilio, and much more.

The user doesn't care about the tech stack; the user cares about user experience only.

A simplified tech stack:

Frontend: React.js, Bootstrap5

Backend: Firebase and Google Cloud functions

API: Stripe and other required.

Check out stackshare.io to find out the tech stack of software companies.

Does the user care about the tech-stack?

Software engineering and product development are two different domains and require different mindsets while working on each of the domains; each part has multiple sub-roles to handle each aspect of development, such as product manager, agile coach, software engineer, AI engineer, interaction designer, UI designer, and a lot more or less depending upon the specific kind of product and requirements.