Computer Science & Software (Part II):

Written by Alexander Christian Greco

With the Help of ChatGPT

Abstraction, Architecture, and the Hidden Systems Behind Modern Software


https://www.tutorialspoint.com/operating_system/images/os_microkernel_structure.jpg

Abstract

The first article in this series introduced software as the structured execution of logic on physical machines. This follow-up deepens that foundation by exploring how software evolves from isolated programs into complex, long-lived systems. It examines abstraction, architecture, operating systems, compilers, runtime environments, concurrency, distributed systems, and correctness—concepts that determine whether software remains functional, scalable, and maintainable in real-world conditions. Together, these ideas form the conceptual bridge between introductory programming and professional-grade computer science practice [1][2].


Disclosure

This article was developed with the assistance of ChatGPT, an AI language model, as a drafting and research support tool. All structural decisions, topic selection, synthesis, and final editorial judgment were performed by the author. Readers are encouraged to consult primary academic and industry sources before applying these concepts in production environments.


Table of Contents

  1. From Programs to Systems
  2. Abstraction as the Core Idea of Computer Science
  3. Software Architecture: Organizing Complexity
  4. Operating Systems as the Silent Partner
  5. Compilers, Interpreters, and Runtime Environments
  6. Data, State, and Time
  7. Concurrency and Parallelism
  8. Distributed Systems and the Network Illusion
  9. Correctness, Reliability, and Failure
  10. Software as a Human System
  11. Where This Leads Next

1. From Programs to Systems

Introductory computer science often concludes with writing standalone programs—scripts or applications that take input, perform computation, and return output. Real-world software development begins when those programs must interact with other programs, persist across time, scale across hardware, and tolerate failure [3].

A single program executes logic.
A system coordinates many programs, machines, and humans.

Systems introduce challenges that do not appear in small examples:

  • Multiple components executing concurrently
  • Hardware limits and partial failures
  • Security boundaries and permissions
  • Long-term maintenance by changing teams

Computer science, in practice, is the discipline of managing complexity under real constraints, not merely producing correct output [4].


2. Abstraction as the Core Idea of Computer Science

Abstraction is the central organizing principle of computer science. It allows humans to reason about complex systems by hiding unnecessary detail while preserving essential behavior [5].

Examples of abstraction layers include:

  • Programming languages abstracting machine instructions
  • Functions abstracting repeated logic
  • APIs abstracting system behavior
  • Operating systems abstracting hardware
  • Cloud platforms abstracting physical infrastructure

Each abstraction layer enables productivity while introducing dependency. When abstractions fail—or leak—developers must understand what exists beneath them [6].

Effective software engineers are defined less by tool familiarity and more by their ability to reason across abstraction layers when systems behave unexpectedly.


3. Software Architecture: Organizing Complexity

Software architecture describes how a system’s components are structured and how they interact. It is concerned not with individual lines of code, but with system-level decisions that shape long-term behavior [7].

Architectural considerations include:

  • Separation of responsibilities
  • Data flow and control flow
  • Failure isolation
  • Performance constraints
  • Security boundaries

Common architectural patterns include:

  • Monolithic systems
  • Layered architectures
  • Microservices
  • Event-driven systems
  • Client–server models

Architecture always involves trade-offs. Improving scalability may reduce simplicity; increasing flexibility may reduce performance. There is no universally “correct” architecture—only designs that align with specific goals and constraints [8].


https://media.geeksforgeeks.org/wp-content/uploads/20250920114635603424/seven_state.webp

4. Operating Systems as the Silent Partner

Every software system runs atop an operating system, which mediates access to hardware and enforces execution rules.

https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/images/Chapter9/9_01_VirtualMemoryLarger.jpg

Operating systems manage:

  • CPU scheduling
  • Memory allocation
  • File systems
  • Device access
  • Security permissions

When a program executes, the operating system determines when it runs, how much memory it receives, and what resources it can access [9].

Understanding operating systems explains:

  • Performance variability
  • Program crashes
  • Resource exhaustion
  • Security vulnerabilities

Even high-level software behavior is shaped by low-level operating system policies.


5. Compilers, Interpreters, and Runtime Environments

Most source code is transformed extensively before execution.

https://media2.dev.to/dynamic/image/width%3D800%2Cheight%3D%2Cfit%3Dscale-down%2Cgravity%3Dauto%2Cformat%3Dauto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7dlps29vwzbuskebux0b.png

Key execution models include:

  • Compiled systems, which translate code into machine instructions
  • Interpreted systems, which execute code incrementally
  • Hybrid systems, which compile to intermediate representations

Runtime environments manage:

  • Memory allocation and garbage collection
  • Thread scheduling
  • Exception handling
  • Interaction with the operating system

Program performance and behavior depend as much on the runtime as on the source code itself [10].


6. Data, State, and Time

Programs operate over time, not in isolation. State represents stored information that persists across execution steps.

State introduces complexity:

  • It must be initialized correctly
  • It must be updated consistently
  • It must survive failures
  • It must remain synchronized

Stateless systems are easier to reason about, but stateful systems enable persistence, interaction, and continuity [11].

Much of software engineering focuses on controlling and constraining state, rather than implementing new algorithms.


7. Concurrency and Parallelism

Concurrency refers to multiple tasks in progress. Parallelism refers to multiple tasks executing simultaneously.

Concurrency introduces risks such as:

  • Race conditions
  • Deadlocks
  • Inconsistent state
  • Non-deterministic bugs

These problems are difficult to debug because timing changes behavior. Concurrency is essential for servers, user interfaces, real-time systems, and modern processors [12].


8. Distributed Systems and the Network Illusion

Most modern software systems are distributed across multiple machines connected by networks.

Distributed systems must operate under the assumption that:

  • Networks fail
  • Messages are delayed or duplicated
  • Clocks disagree
  • Machines crash independently

Designers must trade off consistency, availability, and fault tolerance. Distributed systems are powerful precisely because they accept imperfection as a design constraint [13].


9. Correctness, Reliability, and Failure

In practice, software cannot be perfectly correct. Instead, systems aim to be reliably imperfect.

Strategies include:

  • Defensive programming
  • Automated testing
  • Monitoring and observability
  • Graceful degradation

Failure is expected. Robust systems fail predictably and recover quickly rather than attempting to eliminate failure entirely [14].


10. Software as a Human System

Software is written by humans, for humans, over long periods.

Human-centered concerns include:

  • Code readability
  • Documentation
  • Team collaboration
  • Knowledge transfer

Most software costs are incurred after initial development, during maintenance and evolution [15].

Readable, understandable systems outperform clever but opaque ones.


11. Where This Leads Next

This article prepares the ground for deeper study in:

  • Algorithms and complexity
  • Programming language design
  • Databases and storage systems
  • Computer security
  • Machine learning systems
  • Large-scale infrastructure

Computer science is ultimately the study of how systems survive reality.


Conclusion

As software systems grow, abstraction becomes essential—but dangerous. Architecture, operating systems, concurrency, and distributed behavior shape software far more than individual code fragments. Understanding these invisible layers marks the transition from learning to code to learning to engineer systems.


References

  1. Brooks, F. P. (1995). The Mythical Man-Month. Addison-Wesley.
  2. Abelson, H., & Sussman, G. J. (1996). Structure and Interpretation of Computer Programs. MIT Press.
  3. Sommerville, I. (2016). Software Engineering. Pearson.
  4. Denning, P. J. (2007). Computing is a natural science. Communications of the ACM.
  5. Wing, J. M. (2006). Computational thinking. Communications of the ACM.
  6. Spolsky, J. (2002). The law of leaky abstractions.
  7. Bass, L., Clements, P., & Kazman, R. (2013). Software Architecture in Practice. Addison-Wesley.
  8. Richards, M., & Ford, N. (2020). Fundamentals of Software Architecture. O’Reilly.
  9. Tanenbaum, A. S., & Bos, H. (2014). Modern Operating Systems. Pearson.
  10. Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools. Pearson.
  11. Fowler, M. (2002). Patterns of Enterprise Application Architecture. Addison-Wesley.
  12. Herlihy, M., & Shavit, N. (2012). The Art of Multiprocessor Programming. Morgan Kaufmann.
  13. Kleppmann, M. (2017). Designing Data-Intensive Applications. O’Reilly.
  14. Avizienis, A., et al. (2004). Basic concepts and taxonomy of dependable systems. IEEE Transactions.
  15. Lehman, M. M. (1980). Programs, life cycles, and laws of software evolution. Proceedings of the IEEE.

Further Reading & Learning Pathways

Foundational

  • MIT OpenCourseWare – Structure and Interpretation of Computer Programs
  • Harvard CS50 – Systems & Software Modules

Systems & Architecture

  • Google SRE Book
  • Netflix Tech Blog
  • AWS Architecture Center

Concurrency & Distributed Systems

  • Distributed Systems – van Steen & Tanenbaum
  • Jepsen Consistency Analysis Blog

Human Factors

  • Clean Code – Robert C. Martin
  • A Philosophy of Software Design – John Ousterhout

Comments

Leave a Reply

Discover more from Fifthwall Mag

Subscribe now to keep reading and get access to the full archive.

Continue reading