---
title: "Inner-platform effect"
type: "antipattern"
slug: "inner-platform-effect"
url: "http://localhost:3000/en/antipatterns/inner-platform-effect.md"
description: "Tendency of software architects to replicate their development platform"
---
# Inner-platform effect

> Tendency of software architects to replicate their development platform

The **inner-platform effect** is the tendency of software architects to create a system so customizable as to become a replica, and often a poor replica, of the software development platform they are using. This is generally inefficient and such systems are often considered to be examples of an [anti-pattern](https://en.wikipedia.org/wiki/Anti-pattern "Anti-pattern").

## Examples

Examples are visible in [plugin](https://en.wikipedia.org/wiki/Plug-in%5F%28computing%29 "Plug-in (computing)")\-based software such as some [text editors](https://en.wikipedia.org/wiki/Text%5Feditor "Text editor") and [web browsers](https://en.wikipedia.org/wiki/Web%5Fbrowser "Web browser") which often have developers create plugins that recreate software that would normally run on top of the operating system itself. The [Firefox](https://en.wikipedia.org/wiki/Firefox "Firefox") add-on mechanism has been used to develop a number of [FTP](https://en.wikipedia.org/wiki/File%5FTransfer%5FProtocol "File Transfer Protocol") clients and [file browsers](https://en.wikipedia.org/wiki/File%5Fbrowser "File browser"), which effectively replicate some of the features of the [operating system](https://en.wikipedia.org/wiki/Operating%5Fsystem "Operating system"), albeit on a more restricted platform.

In the [database](https://en.wikipedia.org/wiki/Database "Database") world, developers are sometimes tempted to bypass the [RDBMS](https://en.wikipedia.org/wiki/RDBMS "RDBMS"), for example by storing everything in one big [table](https://en.wikipedia.org/wiki/Table%5F%28database%29 "Table (database)") with three [columns](https://en.wikipedia.org/wiki/Column%5F%28database%29 "Column (database)") labelled entity ID, key, and value. While this [entity-attribute-value model](https://en.wikipedia.org/wiki/Entity-attribute-value%5Fmodel "Entity-attribute-value model") enables the developer to break out from the structure imposed by an [SQL](https://en.wikipedia.org/wiki/SQL "SQL") database, it loses out on all the benefits, since all of the work that could be done efficiently by the RDBMS is forced onto the application instead. Queries become much more convoluted, the [indexes](https://en.wikipedia.org/wiki/Index%5F%28database%29 "Index (database)") and [query optimizer](https://en.wikipedia.org/wiki/Query%5Foptimizer "Query optimizer") can no longer work effectively, and [data validity constraints](https://en.wikipedia.org/wiki/Data%5Fvalidation "Data validation") are not enforced. Performance and maintainability can be extremely poor.

A similar temptation exists for [XML](https://en.wikipedia.org/wiki/XML "XML"), where developers sometimes favor generic element names and use attributes to store meaningful information. For example, every element might be named _item_ and have attributes _type_ and _value_. This practice requires [joins](https://en.wikipedia.org/wiki/Join%5F%28relational%5Falgebra%29 "Join (relational algebra)") across multiple attributes in order to extract meaning. As a result, [XPath](https://en.wikipedia.org/wiki/XPath "XPath") expressions are more convoluted, evaluation is less efficient, and structural validation provides little benefit.

Another example is the phenomenon of [web desktops](https://en.wikipedia.org/wiki/Web%5Fdesktop "Web desktop"), where a whole [desktop environment](https://en.wikipedia.org/wiki/Desktop%5Fenvironment "Desktop environment")—often including a [web browser](https://en.wikipedia.org/wiki/Web%5Fbrowser "Web browser")—runs inside a browser (which itself typically runs within the desktop environment provided by the [operating system](https://en.wikipedia.org/wiki/Operating%5Fsystem "Operating system")). A desktop within a desktop can be unusually awkward for the user, and hence this is generally only done to run programs that cannot easily be deployed on end user systems, or by hiding the outer desktop away.

## Effect

It is normal for software developers to create a library of custom functions that relate to their specific project. The inner-platform effect occurs when this library expands to include general purpose functions that duplicate functionality already available as part of the programming language or platform. Since each of these new functions will generally call a number of the original functions, they tend to be slower, and if poorly coded, less reliable as well.

On the other hand, such functions are often created to present a simpler (and often more portable) abstraction layer on top of lower level services that either have an awkward interface, are too complex, non-portable or insufficiently portable, or simply a poor match for higher level application code.

## Appropriate uses

An inner platform can be useful for portability and privilege separation reasons—in other words, so that the same application can run on a wide variety of outer platforms without affecting anything outside a [sandbox](https://en.wikipedia.org/wiki/Sandbox%5F%28computer%5Fsecurity%29 "Sandbox (computer security)") managed by the inner platform. For example, Sun Microsystems designed the [Java platform](https://en.wikipedia.org/wiki/Java%5F%28software%5Fplatform%29 "Java (software platform)") to meet both of these goals.
