If you had to pick one idea one concept that’s the most important thing in all compute science world? What it is? Donald Knuth’s anser is “layer of abstraction”(watch A Philosophy of Software Design by John Ousterhout). Layer of abstraction is a powerful concept in computer science. It’s purpose is to hide the complexity of the underlying implementation and provide a clear and easy-to-use interface. One of excellent example of layer of abstraction is layer of computer architecture(Watch Computer Architecture - Levels of Transformation by Onur Mutlu). Another example is layer of computer network(Watch Computer Networks - Layering by Jim Kurose).
Jess Martin write a blog about software layers. In his article Pace Layers for Software , he thought software system as a layered structure and each layer different capability. Building upon his interesting thinking framework, I made some adjustment and addition for his work. I redraw the illustration of layers of software and give more explanation about this kind of thinking. These kind layered structure might provide you an insightful abstraction towards the software system, alouthgh it’s seems be very trivial for experienced software engineers. In this abstraction, the interesting part might be the application and application infrastructure.
Plguin/Extension
A plugin/extension is a software add-on that is installed on a program, enhancing its capabilities. Usually, they rely on the runtime of host application. The difference between plugin and extension is plugin didn’t change the host application’s functionality, while extension might modify the host application’s functionality. Following are some examples of plugin/extension. Example including Microsoft OfficeOffice Add-ins, Anki Add-ons, Obsidian Plugin, Zoom Plugins, PostgreSQL extension, Chrome Web Store, VS Code Extension, Gradle Plugin.
Script
- DSL(Domain Specific Language) Configuration
- Scripting Language
Application
Most of software development engineer work on this layer, including:
- Desktop Application
- Web Application
- Mobile Application
- Backend Service
- Machine Learning Application
- Data Analysis Application
Application Infrastructure (Library & Framework & Platform)
- Library. A collection of reusable code that provides functionality to simplify development tasks, including standard libraries and third-party libraries.
- JavaScript, NPM, https://www.npmjs.com/
- Python, PyPI, https://pypi.org/
- Java, Maven, https://mvnrepository.com/
- .NET, NuGet, https://www.nuget.org/
- Ruby, RubyGems, https://rubygems.org/
- Rust, Cargo, https://crates.io/
- Go, Go Modules, https://pkg.go.dev/
- PHP, Composer, https://packagist.org/
- Framework. A tool that provides ready-made components to simplify development tasks. It is defined by the principle of inversion of control (IoC) and offers code reusability differently from a library.
- Frontend Framework like React, Angular, Vue
- Backend Framework like Spring, Django, Express, Flask
- Microservice Framework like Spring Cloud, Dapr
- Machine Learning Framework like TensorFlow, PyTorch
- Platform
Platform Software
- Database(PostgreSQL, MySQL, Oracle, SQL Server)
- Key-Value Store(Redis, Memcached)
- Stream Processing(Kafka, Flink)
- Full-Text Search(Elasticsearch, Solr)
- Web Server(Apache, Nginx)
- Container Orchestration(Kubernetes)
Serverless Platform
- AWS S3,
- AWS RDS
- Auth as a Service
- Email as a Service
- Payment Gateway(Stripe, Paypal)
- Email Service(AWS SES, SendGrid)
Programming Language
Different programming languages provide different abstraction towards the operating system and hardware.