OOP is Not What You Think It Is

OOP is Not What You Think It Is
Object-Oriented Programming (OOP) has become one of the most popular paradigms in modern software development, yet it’s often misunderstood. When most people hear “OOP,” they think of classes, inheritance, and the rigid hierarchy of objects—features that languages like C++ and Java have made standard. But this wasn’t the original vision.

The roots of OOP lie in the groundbreaking work of Alan Kay, who introduced the world to the concept in the 1970s through the creation of Smalltalk. For Kay, OOP wasn’t about objects in the way we think of them today—it was about message passing, a way for software components to communicate seamlessly without getting bogged down by the internal structure. In this vision, objects were secondary to the messages they exchanged, which encouraged flexibility, modularity, and dynamic behavior.

Smalltalk: A Different Kind of OOP
Smalltalk wasn’t just a programming language—it was a philosophy. Unlike C++ and other modern OOP languages that focus on complex class hierarchies, Smalltalk treated objects as living entities capable of sending and receiving messages. This idea of message passing was central, allowing objects to respond in ways that weren’t strictly predefined. The focus was on behavior over structure, encouraging experimentation and evolution within a system.

Smalltalk’s version of OOP was lightweight, adaptable, and far less rigid than what we see today. Alan Kay’s emphasis was on how objects collaborate rather than how they inherit from one another. This made systems designed in Smalltalk inherently more flexible, allowing for changes without the fear of breaking the underlying architecture—a stark contrast to the tightly coupled systems often seen in C++-based projects.

What Went Wrong: The Rise of Modern OOP
As languages like C++ gained popularity, the industry’s perception of OOP began to shift. Object-Oriented Programming became synonymous with class-based design, encapsulation, and inheritance. Message passing was sidelined in favor of method invocation, where functions are called directly on objects, leading to more rigid and complex systems.

The shift from Smalltalk’s dynamic message-passing model to the static class structures of C++ marked a fundamental change in how we build software. It wasn’t long before terms like polymorphism, encapsulation, and inheritance became the buzzwords of OOP, but the simplicity and elegance of Kay’s original ideas were lost in the process. Modern OOP became more about managing structure than about fostering communication between entities.

Introduction to Code Pages: Legacy Character Encoding Systems

Introduction to Code Pages: Legacy Character Encoding Systems

Code pages were once the backbone of character encoding in computers, providing a way to map binary values to text in different languages. However, they had significant limitations, particularly when dealing with multiple languages at once. This article explores the history of code pages, how they were used, and why they have been largely replaced by the modern Unicode standard, which offers a universal character set for all languages.

The Need to Separate Model Aviation from Drones: A Call for Distinction

For those of us deeply invested in model aviation, the rapid rise of drones has brought new challenges that could impact the future of our beloved hobby. This article explores the need to separate model aviation from drones, using line-of-sight control and limited autonomy as guiding principles. We also discuss how flexible regulations can support both rural flyers and those at AMA fields, ensuring the hobby remains accessible to all.

Beware of Fake Chips: A Hard Lesson in Electronics

If you’ve been following my blog for a while, you know that I love tinkering with electronics. Recently, I encountered a situation that has driven home the importance of sourcing components carefully, especially when dealing with critical parts like EEPROMs. A couple of weeks ago, I decided to purchase ten AT28C64B-150PU EEPROM chips from Amazon

Words of Encouragement and Acknowledgement of Impostor Syndrome for Developers

Impostor Syndrome, as articulated by this retired engineer, offers a profound insight into the evolution of expertise within one’s field. It delineates a trajectory familiar to many: the initial surge of confidence upon completing a CS course or bootcamp, swiftly followed by the humbling experience of entering the professional sphere and encountering individuals of greater experience and wisdom.

Unraveling Markup Languages: A Comprehensive Guide

Explore the diverse world of markup languages, from HTML to YAML, and discover their applications in web development, data interchange, and documentation. Understand the differences between markup and programming languages, and learn when to use a custom markup language for specialized requirements.

Title: What Every Software Developer Should Know About Unicode

Understanding Unicode is essential for software developers to ensure their applications can handle diverse languages, characters, and text encodings effectively.

A Comprehensive Journey through Character Encodings: From Legacy to Modern Standards

Discover the journey of the Unicode Standard, from its humble beginnings to its pivotal role in shaping global communication. Learn how Unicode addressed the limitations of existing encoding schemes, introduced a vast repertoire of characters, and adapted to include emojis in its universal character encoding scheme.

An Introduction to C–: A Dive into an Intermediate Language for Compiler and Language Research

Explore the evolution of C– – an intermediate language designed for compiler and language research. Delve into its origins, syntax, and the significance it holds in the realm of programming languages and compiler development.

DRY WET Code, Only!

Explore the delicate balance between adhering to the “Do Not Repeat Yourself” (DRY) principle and allowing a bit of code repetition in software development. Learn when to implement DRY for optimal code maintainability and efficiency, and discover scenarios where code repetition might be justified. Striking the right balance is essential for creating scalable, adaptable, and high-performing code.