The Non-Engineer’s Ultimate Guide to Software Technology
How to be technical without learning to code
There’s a huge communication gap between “technical” and “non-technical” people in industry, even in Silicon Valley.
Non-technical professionals are constantly told that the path to “technical fluency” is through learning to write code or some other kind of intense education. That’s terrible advice. It’s useful for people trying to switch careers, but not if your goals are different.
Nobody tells you that the “become a pseudo-engineer” route does surprisingly little to improve your technical communication and ability, unless you spend 6–12 months on dedicated practice.
That advice is popular to pass around simply because it’s an easy task to teach people how to code. Teaching people to develop technical intuition and systems-thinking is much harder, so nobody does it.
That’s exactly what we’ll be doing today in this essay. If you’re an entrepreneur, product manager, executive etc who doesn’t have a software engineering background, read on.
In this essay, we will lay the foundational concepts you need, without having to write a single line of code.
By the end of the essay, you can expect that:
- Given a software system — such as the Mars Rover, or Netflix’s site or Doordash’s service, you can visualize and talk about the main functions and components of the system, and the trade-offs involved. You’ll be able to build much better rapport with your technical customers/colleagues.
- If your Uncle Benji came up with an idea for a website/mobile app, or wants to use technology to improve or transform his business, you can translate the idea into a real technical project. You can see if it’s feasible, explain how it would work and figure out rough ballpark cost estimates.
- Given a system, you can understand and imagine all the different ways it could be attacked by hackers.
Whether you work in design, law, marketing, finance or what else, let me help you achieve a minimum level of technical fluency.
A moment for my intro:
Hi I’m Aman. I’m an engineer, and my work has ranged from safety for self-driving trucks, to AI-enabled brain-computer interfaces. I’ve also been a business executive, studied film making, and once even sold roses on the street. I like to teach to make hard things simple — simplicity is underrated. I enjoy being the bridge between technical and non-technical people.
I’m the founder of SANPRAM Transnational, which you’ve got to check out after reading.
Let’s begin. As you can imagine we will cover a lot of ground and your humble teacher is not known for his taciturnity, so I want you to take it slow. I will prompt you to take a break after every section, and provide summaries throughout. Let’s go!
We’re going to cook a meal.
Foma and Lusha are having dinner tonight. You are the chef responsible for making it happen.
The following high-level things are required for this dinner:
- Someone to cook the meal
- Space (for storing food, and for cooking)
- A recipe
- Tools, equipment and maybe fuel, for cooking and serving etc
A quick visual representation:
None of these things alone would be sufficient, and each one is critical. Here’s the kicker: Every computer system is a kitchen, and all software/computing is essentially a way to achieve these 5 things and tailor them to different kinds of “meals”.
We need to start with the basic building blocks of a computer. This cooking analogy will serve you well for even the most complex software systems you ever see in future.
In any computing system, you have information and inputs (or data) that acts as ingredients, and based on that data you have to generate a result which can be consumed by someone else, like a meal.
Every computer has a processor, or a processing unit (CPU) as part of its physical hardware, that acts as the cook. This processor works with the ingredients (data).
The cook also needs space. First, this is where you can store things permanently, like the fridge etc. This is the storage space. In your personal computer, this is the disk space in your hard drive.
Storage space is not enough by itself. There needs to be counter space for cooking. It’s extremely hard to cook a meal if you only have your fridge and a stovetop, and no space to work on! This space in computing is referred to as memory. The RAM (random access memory) is this working space. RAM is not occupied by an item permanently — it can be used for different meals as the need arises, but usually it’s a limited amount of space.
Over the years as technology has developed, processors have become faster and both the storage space and working memory of computers has greatly expanded.
Now, ingredients can come from the storage, and they can also be new ingredients coming fresh from outside, or even pieces of information that act as commands, eg: Lusha telling you that she is allergic to basil. Or even the order itself, eg: “Poutine for my dog please (Just kidding, Canadians I love you)”. From a software point of view, all these inputs are just different kinds of data (ingredients).
Finally, there needs to be a recipe for the dish that the processor must execute with the data. This recipe is called software (or “code”, “software program”, “program” etc). We will talk about recipes/software in more detail later.
There are also various appliances and equipment. A kitchen also has some rules and protocols for how things work — and this is especially true for professionally run kitchens. This collection of kitchen rules is the “operating system”, and these things have an impact on what kind of recipes can be executed in a given kitchen.
For example, a kitchen designed only for brewing beer may not be able to handle an order for spicy barbecued pineapple pizza. I’m sorry if you don’t like pineapple pizza because you were not gifted with an elevated sense of taste. Operating systems come in families of varieties like Macintosh, Windows, Linux etc — each is unique in some way.
Anyway — as a recap, your computer has a processor that does all the work, it has space of two types: disk space (permanent) and memory/RAM (working space), it has inputs and outputs of data, and it stores computer programs that act as recipes. Depending on the operating system of the computer (tools and rules of the kitchen), some recipes/software can be executed and others cannot.
Did you know that baby penguins sneeze louder than most dogs can bark? Actually this is not true but I had to put a little joke here to force you to take a break.
All software is very much like a food business.
Now that you have at least a fuzzy intuition about computers, we’ll move on to an overview of the modern tech “stack”. Let’s learn about servers, back-ends, front-ends and databases. This is to prepare you for the next section, system design, which is what we’re leading up to.
Before the internet got popular, to use a software application, you had to buy it on a CD or floppy drive and install it on your computer. You were using only your computer’s resources (processors, memory and storage) to do everything. Recall that software applications are recipes followed by the computer hardware. In culinary terms, if you lived on the other side of a big town, you couldn’t get food delivered to your home from a restaurant — you had to buy their recipe and cook it in your own kitchen all by yourself, because delivering it fresh and hot would be impossible.
But what if there was a dedicated motor highway allowing food to be transported to your customer’s home in less than 10 minutes? Wow. Now, if customers just want a good meal of a recipe at their home, they don’t have to cook the thing themselves. (The average home kitchen is not sophisticated enough to cook fancy recipes anyway.) Through food delivery, now the preparation of the food (the back-end) and the plating & eating (the front-end) can be separated by great distances.
Enter the internet! Now that computers can directly connect with each other and share data at great speeds, heavy computation can occur on one computer, and it can send only the results of that computation to another computer. Now, one company (say Google) can invest in massive, powerful computers that crunch millions of web pages every second, and you with your little laptop can benefit from their computation power by only getting the search results served on a platter through your web browser.
Here Google has the back-end of the search application, and the page you see when you open google.com is just the front-end.
The constraint here is internet speed. Faster the internet, the more things can be done over the internet in remote kitchens. Engineers always have to play with this internet speed constraint while designing a system.
A good example is Netflix. While 15–20 years ago it was impractical to play movies online without buffering (for people too young to remember dial-up connections, look up “buffering” :)), today’s laptops don’t even need a slot for DVDs. It’s a testament to how many things can now be delegated to the “back-end”.
Modern devices are quite varied — laptop computers, smart watches, mobile phones, tablets. So a good web service (say Facebook) has to accommodate all these possible clients on the front-end, and be easy to use for everyone.
The buzzword some people use to describe web-based software is the cloud. “Cloud-based applications”, “cloud computing” and what not — it’s just someone else’s computer. It simply means that much of the heavy computation doesn’t happen on your own computer.
The computers on the back-end are called servers. They basically run copies of the same software application, one for each client. These servers often share one huge common storage space, but have a lot of individual RAM (or working memory). The more copies of your software you can create, the more users your product can support at the same time. This is called scaling — just think about how you would ‘scale’ a food business to serve more and more customers.
The data storage (database) is extremely well organized so that servers can retrieve and deposit data to it as efficiently as possible. Depending on the nature of the application, there are different kinds of databases which organize and store data differently. Databases let you easily have consistency of information across distances. This is not trivial. The development of these modern software databases truly changed the world in an unthinkable manner.
Buying something online, reading Wikipedia, social networking, using an ATM— databases are the backbone of our modern digital world.
If you, gentle reader, should ever find yourself on the journey to become a software engineer yourself, then the day you learn more about databases, I hope you feel the same awe and wonder that I did. If you don’t, come back and contact me.
Each individual component of the distributed system/food business performs a unique function, and has different software/code running on it.
If you work closely with engineers, you may hear the word stack. Although the word itself has several meanings, in this context it is just a description of the particular brand or flavor of each of the things that make up the back-end and front-end. Just like you describing your kitchen to a friend. Engineers love having conversations and debates about stacks. It’s akin to a nerdy discussion about kitchen appliances and grocery brands, and some can even get cultish about it.
Consider too that the more things you add to your stack and the more unique it is, the more engineers (and salaries) you need to put into the project.
If you’re interested, here’s an article about Medium’s tech stack. An engineer who can write software programs running across the stack (back-end, front-end, database, etc) is known as a Full Stack Engineer. Such an engineer is capable of building an entire application all by herself. (Though most engineers typically specialize in one area more than the others.)
By the way, talking about innovation, 5G internet is coming quickly. That’s like having warp-speed connections between devices, so the systems you see will likely become even more fragmented and distributed.
Summary: It’s possible and sometimes necessary to separate the different functions of a software system (food business) and create a complex network. Modern communication technology allows these separations to span huge distances — giving birth to the internet.
The internet is essentially a complex network of people cooking, storing, serving and eating each other’s food. It feels like the internet is a “thing”, but it’s just like a large intertwined economy.
Take a break if you’re tired.
This essay is actually a combination of small excerpts taken from my book, Tech Fluent CEO: Build and Lead Extraordinary Digital Companies, Without Being a Tech Nerd. You can get it here.
Now let’s exercise our intuition around system design. This is the most essential part of the essay.
A food business has to consider things such as the following:
- What’s on the menu
- The target customers and their preferences
- The source of ingredients, their price and quality
- Packaging and delivery mode of the food prepared
- Efficiency and scalability of the kitchen
- Costs of producing the food and delivering it to the customer
Depending on the above 6 factors, your business could vary widely. It could look like a McDonalds franchise, a 3 star Michelin sushi restaurant, Domino’s Pizza, or the company that only makes soy sauce.
Same for software/hardware. Let’s exercise our intuition a little.
- What does the software need to accomplish? Does it control an industrial robot, or a spreadsheet application like Microsoft Excel, or an application like Skype?
- Who are your users and what do they care about? A software that controls a robot surgeon would need to focus on sharp precision and low delay time between calculations, movements and so on, but doesn’t need to have a cute user interface. Therefore, you would ideally want the critical data processing to happen directly on the robot and not on a server elsewhere on the internet, because saving even microseconds of lag time is essential. However, a computer game for 5 year old munchkins would 100% need more effort on the cute user interface than on precision and lag time.
On the other hand, Netflix automatically reduces the video quality when your internet is poor instead of stopping play, because they believe you care slightly more about being able to watch something at all, than about high-definition quality. They designed their system to reflect this belief.
- What kinds of services or information does the software need to do its job? Does it need to tell the weather, know about your hotel bookings, the latest stock prices, or your bank balance? And how does your software get that information? Is it available easily on the internet, or do you have to form a digital partnership with all the large banks of the world to get it? (More on this later).
- Packaging and distribution. Your food business could serve ready-to-eat meals on tables and chairs, or deliver the food to be unpacked at home, or even deliver a meal kit that the customer will use to prepare their food.
A service like Netflix can either stream videos over the internet or mail DVDs to homes. A spreadsheet application could be completely offline like Microsoft Excel: 5 years ago when you’d have to download it on your computer. Or like Google Spreadsheets which can simply be accessed online (no download required), or a hybrid of both.
- What are the capabilities of the computer on which your software program will run? A Mars Rover cannot connect with the internet directly, but it has wheels, sensors and other apparatus that your software can (and needs to) control. On the other hand, Microsoft Paint can access inputs from a mouse and keyboard, and a video player can use the computer’s screen and speakers.
- Cost — self-explanatory. Economics is often the overriding factor.
A good exercise to practice intuition would be to draw up your own vision of a system you find interesting. Here I’ve made a quick barebones design for an online food delivery company’s system. Start with the customer and go clockwise.
If you want to take a break, I recommend you watch this wonderful 4-minute video about the “Brigade System” used in all luxury restaurants of the world, developed by Auguste Escoffier (1846–1935), a revolutionary French chef who also led the way for many modern cooking methods and ergonomic kitchen plans. He was known as “The King of Chefs, and the Chef of Kings”. As a systems engineer, I applaud the genius of this man.
This section will be short and quick. Let’s do a naughty thought experiment.
Say you wanted to do something bad to a food business. Remember that whatever you do, it would cost you time, effort and maybe even money, so you want to profit from this operation if possible.
Naturally the first question is, what should you do? It depends on your goals. Examples:
- Infiltrate the kitchen and spoil ingredients, damage equipment etc.
- Steal their secret recipes.
- Plot with someone to steal money from their cash registers.
- Impersonate a customer and steal the pre-paid food delivery.
- Hire people to crowd the restaurant before peak hour and waste their time, so that their real target customers can’t get service.
- Intercept a food delivery and switch the food with candied chicken.
- Shut down their power abruptly during peak service hours.
It’s also not possible to do anything you want, so usually you’d first need to do a recon mission — go and poke around the restaurant to look for vulnerabilities. For example, when they’re receiving new supplies, is there a small window of time when nobody’s paying attention and you could sneak into the back? Are the locks new or old? Etc etc. The vulnerabilities you find will also dictate what crimes you can pull off.
But you get the idea — any part of the system can be attacked. You can apply the same creativity to software systems. All of the above (and many more) count as valid attacks to a system, and the whole field of cybersecurity is about reducing the risk of each of these. Once again, depending on the nature of your application, some of these attacks are much more damaging than others.
These can be Denial of Service or “DDoS” attack (=crowding the restaurant), Man in the Middle/Eavesdropping, Phishing/Stealing, Malware (=spoiling someone’s kitchen) etc. That’s what people usually mean by “hacking”. It’s not like in the movies where someone takes control of your entire system — that, though theoretically possible, is usually surprisingly hard to pull off even for a simple system, unless the person who built it is a complete dummy.
It’s the same with food safety — people throughout the ages have come up with creative ways to adulterate food for profit, and the world’s food scientists and law enforcement are always in a race against them.
Along the same lines, even if someone’s not trying to hack you, things can go wrong in a food business by mistake. So while developing a system, one should think about other ways the system could fail, define the seriousness of different kinds of failures and figure out a way to increase resiliency against those failures.
The more you separate the parts of a software system and spread them over distances, the more things can individually go wrong and the more things you have to keep track of. But sometimes, keeping things separate can also make them more safe, because then a tiny attack can’t bulldoze through the whole system. There are always trade-offs that engineers work with.
This brings me to another fun fact — computers that controlled US nuclear missiles were, even until 2 years ago, not connected to the internet, and used good old 8-inch floppy disks for sharing information. Fairly un-hackable unless you pulled off a Mission Impossible and physically infiltrated heavily guarded facilities!
I don’t want to go into any more specific details of cyber security — as you can see it is a creative, almost artistic field more than it is technical, and keeps evolving rapidly. What’s important for you is the ability to step back and think like a mischief-maker. It will get better with practice, so keep your naughty hat on at all times. :)
I haven’t covered machine learning and autonomous robots here, but it’s important that you understand them. I have talked about them in another essay. In the future I may write another essay that focuses on technical fluency and systems thinking around AI.
Congratulations, you’ve reached the end of this lesson! Understanding technology always begins with understanding the world you live in — remember that, gentle reader.
As a teacher I like to make a human connection with learners, so I encourage you to leave a comment and share how it helped you — your stories and feedback give me the energy to keep writing.
Until next time, my friend!
(Once again, this essay was a combination of small excerpts from my book, Tech Fluent CEO: Build and Lead Extraordinary Digital Companies, Without Being a Tech Nerd. You can get it here.)