My Photo

Your email address:


Powered by FeedBlitz

May 2008

Sun Mon Tue Wed Thu Fri Sat
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Blog powered by TypePad

April 24, 2008

Rapid Application Development: Fast Car No Map and 50 Laps to a “Who House”

[If you have never been involved in a custom software engagement (i.e., on the software builder side, customer buyer side, contract lawyers, etc.), there is no need to read this post.]

Rapid application development and prototyping have their place. One of these places is not the creation of complex, mission critical, ultra-high performance systems (i.e., space shuttles not mash-ups) – where it is essential that in hindsight the system appears well thought out, explainable, maintainable, etc. The simplest post-project assessment being, “Knowing what I know now, I would have built it exactly this way!”

The only method I am aware of that has a reasonable chance of making the above claim involves building a system based on stable, pre-defined, well-conceived blueprints. When operating off tight specifications, what you end up creating is virtually no different that what you were envisioning at the start … including the very first brick laid.

If you start building something without a precise road map, every time you have a design revelation, resource conservation drives one to make compromises. It is in this way that the air conditioning unit ends up on the roof of the car, the stereo mounted to the back of the driver’s seat, and so on. What rapid application development environments can lead to is the fast, iterative (50 laps) construction of a  Dr. Suess "Who House" or a Rube Goldberg-like contraption.

My primary issue with rapid prototyping, rapid application development, iterative development, and the like is the creation of valuable artifacts that one is hesitant to later discard at a whim. On this path, it becomes more prudent to perform a least-effort modification of A to become B. This compromise is compelled by the urge to preserve earlier investment … even if the best tact involves utterly discarding A and constructing B from the ground up.

It is therefore my belief that the most valuable prototyping tools, rapid application development environments, etc. are those that leave the designer with a sense of “as close to zero investment.” Radical changes to the design, complete rethinking of a whole component, big shifts in database schema, wholesale rework to the GUI, etc., need to be absorbed in the design phase without an iota of grief.

[One of these days maybe I’ll blog about Computer Aided Software Engineering (CASE) technology. During one era of my life I spent eight years building such technology to automate the blueprint process; hence this subject remains very dear to my heart.]

RELATED POSTS:

Super Consultants

Custom Software Scope Changes (Not)

Scalability and Sustainability in Large Information Sharing Systems

April 21, 2008

Custom Software Scope Changes (Not)

[If you have never been involved in a custom software engagement (e.g., on the software builder side, customer buyer side, contract law side, etc.), there is no need to read this post.]

I spent roughly 22 years of my life building somewhere between 150-200 custom software systems ranging from accounting systems, llama genealogy systems, labor reporting systems, airport profitability systems, huge consolidation consumer data warehouses, and sewer flow modeling systems to the first versions of NORA.

There was one particularly interesting lesson from these days:

“Custom software change orders CLAIMED by builders … are actually more often changes in understanding that come to light as the visions between parties are forced to reconcile.”

Here is how this goes: The buyer describes what they want to the builder.  The builder captures this vision in the form of requirements, features, design layouts, etc.  This exchange of vision continues until the builders and buyers think they are in synch.  The builder starts to build.  The buyer starts to see the system come to life.  The buyer notes that what he sees is not quite what he had in mind and calls for some adjustments.  The builder calls this a change order.

What is really happening is the visions between parties are being forced to reconcile as the system takes shape in the real world.

In my book, this is not a scope change.  This only demonstrates that both parties had something different in mind on day one.

There is only one way to safely avoid this all too frequent problem and that is blueprints.  And I am not talking about a few screen sketches and report headers.  I am talking about robust architectural plans: complete screen layouts with error messages, full report mock-ups containing realistic data and sub-totals.  I am talking about a degree of design completeness that the specifications could be used to simulate (e.g., in paper form) the use of the whole system by each type of user.

No one builds a high-rise building let alone a doghouse without blueprints.  Otherwise, there is an extraordinary risk of a) an abandoned project or b) the creation of a Dr. Seuss “Who House.”

On a related note: some think that rapid prototyping of big complex systems can shortcut a comprehensive design phase.  With few exceptions, I think this is ridiculous.  [I will elaborate on this is a coming post.  But in the mean time, as a teaser, I have a single test question that determines if a custom software system has been well-conceived.  Once the system is all done, knowing what you know now, would you have built it the same way?]

Is the custom software world still this way?

RELATED POSTS:
Super Consultants

Scalability and Sustainability in Large Information Sharing Systems

March 09, 2008

Photosynth / Infosynth

Photosynth is the coolest technology I have seen in recent memory. It is also the most graphic example I know of that demonstrates the power of context accumulation.

As I noted in this post last week, the only way to make any real sense of the big picture is to first stitch together all of the atomic-level observations (puzzle pieces) into context (pictures).

With this in mind, take a look at this exceptional video about “Photosynth” presented by Blaise Aguera y Arcas at a TED conference.  

Now imagine the process of stitching together not just digital images … but all available data – across disparate data types (e.g., structured, unstructured text, images, video, audio, etc.).

When I speak of Context, this is exactly what I mean.  

So after seeing Photosynth ... this made me think “n” sensor context accumulation could just as easily be called “Infosynth.”

These context engines will be used to deliver laser-precise relevance in support of next generation: user search; customer service; risk mitigation; ultra-weak signal detection; and so much more. 

PRIVACY RAMIFICATIONS? Big time. Nonetheless, consumers are going to love the new industry offerings that context engines will enable. Stay tuned for a forthcoming post on my Responsible Innovation thread about what technologists might want to "design in" to these next generation systems in hopes of making these future systems more palatable from the privacy and civil liberties perspective.

RELATED POSTS:

Algorithms At Dead-End: Cannot Squeeze Knowledge Out Of A Pixel

Context: A Must-Have and Thoughts on Getting Some …

Federated Discovery vs. Persistent Context – Enterprise Intelligence Requires the Later

To Know Semantic Reconciliation is to Love Semantic Reconciliation

More Data is Better, Proceed With Caution

Accumulating Context: Now or Never

Big Breakthrough in Performance: Tuning Tips for Incremental Learning Systems

Responsible Innovation: Staying Engaged with the Privacy Community

February 21, 2008

Algorithms At Dead-End: Cannot Squeeze Knowledge Out Of A Pixel

Have you ever heard the expression “climbing trees to get to the moon”?  This means that while one can make progress inching along (up a tree in this case) … if one stands back to look at the big picture … no matter how successful one is at climbing trees … it is quite obvious they are never going to get to the moon.

I have news … for those waiting for big breakthroughs in algorithms to better make sense of transactional data (e.g., to lower false positives/negatives), they are going to be waiting a long time (actually, it's worse, forever).

Using algorithms to analyze transactions is like analyzing a single pixel.  No matter how much computing power, time and sophistication of algorithms … determining if the “red pixel” is a fire versus a fire engine simply isn’t a precision activity.

Next generation, real-world aware systems are going to FIRST apply inbound transactions (i.e., pixels) to earlier observations in order to construct context (i.e., pictures).  Then, and only then, will algorithms be able to more accurately determine the relevance of new transactions.  There are no short cuts.

Assembling pixels into pictures is the story of Context Accumulation

But how do pixels get assembled into pictures?  There is only one way to accomplish this and that starts with “feature extraction” and I wrote a bit about this in my post called “Context: A Must-Have and Thoughts on Getting Some …”  Just to be clear, algorithms are, of course, required on pixels to perform “feature extraction” and there is room for extraordinary improvement in this area (e.g., see point #5 in the above blog post).

Persistent Context and Perpetual Analytics are the most significant hurdles necessary to deliver the next generation of intelligent systems.

AND FOR THE RECORD: Don’t expect Google’s search analytics to get much better as this technology is near the end of its road as well.  The reason being is; they are applying analytics to documents … which are really just context-less pixels.  Quantum leaps forward in search are going to come from context accumulation.

RELATED POSTS:

Context: A Must-Have and Thoughts on Getting Some …

Accumulating Context: Now or Never

Sensing Importance: Now or Never

Enterprise Intelligence – My Presentation at the third Annual Web 2.0 Summit

Federated Discovery vs. Persistent Context – Enterprise Intelligence Requires the Later

Streaming Analytics vs. Perpetual Analytics (Advantages of Windowless Thinking)

Enterprise Intelligence: Conference Proceedings from TTI/Vanguard (December 2006)

Intelligent Organizations – Assembling Context and The Proof is in the Chimp!

It’s All About the Librarian! New Paradigms in Enterprise Discovery and Awareness

To Know Semantic Reconciliation is to Love Semantic Reconciliation

More Data is Better, Proceed With Caution

February 18, 2008

Virtual Reality: There Is No Place Like Home

Increasingly over the last year, I have been asked to share my thoughts about virtual worlds (e.g., Second Life and World of Warcraft).  After repeated provocation, I took a peek into these interactive 3D La-La-Lands to see what is up.  Here are a few of my core conclusions:

1.    Virtual realities will end up consuming the attention of a substantial number of humans and this will happen more quickly than most may think.
2.    Data synchronization between the real world and virtual worlds will increase the relevance of virtual worlds.
3.    Along with the eyeballs of transacting consumers will come increased corporate investment thus driving more relevance and more growth.
4.    Investors in virtual world physics re-engineering will possess a distinct advantage in virtual worlds.
5.    As with any tool, a very small percentage of the population will use virtual worlds for criminal activities.

Here are a few details related to these points.

Virtual reality: soon serving the masses.  As these alternate worlds become more immersive (i.e., ability to hold ones attention when in the virtual space) and accessible (think One Laptop Per Child), I think it is possible that a half billion people show up.  How soon?  In six to ten years – maybe faster.  Why?  Because there are a lot of people on Earth that would rather exist in a synthetic world as opposed to their real world.  Hmmm … shanty town, nagging spouse, or insurmountable odds versus a stimulating environment with near limitless potential to reinvent oneself.

Cross-reality synchronization.  Imagine taking heat sensors in a real-world data center and publishing these into a virtual space which is physically configured like the real data center.  The difference being that the immersed person can now physically visualize the temperature distribution in the data center.  This is already being done.  Then move something in the physical world and it moves in the virtual world at the same time, automatically.  I wouldn’t be surprised if this is already happening in some context, somewhere.  As well, the inverse: There is supposedly a fellow who has an island in Second Life with a surveillance mechanism implemented that sends him a real-world email or text message whenever someone steps foot onto his island.  Long story short, if one wants to look at something specific, if the real and virtual worlds are synchronized, it’s going to be cheaper, faster and will burn less carbon if one takes the virtual option.

Real economic growth in unreal worlds.  Have you heard about the real estate developer in Second Life that has made $1,000,000 (real) US dollars?  True.  Linden dollars, the monetary unit in Second Life, have their own currency exchange to US dollars called the LindeX – a currency market apparently moving millions of dollars a month between the virtual and real worlds.  Point being, if a billion people show up in virtual spaces, each on average spending only eleven cents ($0.11) a month – this amounts to a real growth market which will trigger further industry investment.  Consequently: more people arrive. 

Virtual world physics re-engineering.  Through serendipity, careful study, and/or experimentation it is possible to develop capabilities within virtual reality that other participants, or in some cases even the creator, cannot fathom.  The first such instance I heard of five or six years ago involved a player who figured out he could climb walls by mounting deactivated explosive devices on a wall.  Placing one above the other, the avatar cleverly scaled the wall.  He climbed so high that he moved beyond the rendered space … into a region of the game where all that was visible was texture-less grid lines.  In a more recent example, in Second Life an individual created a covert listening device the size of a single pixel -- then placed this pixel inside some object.  Later when the object was near a conversation, all communications were echoed to a third party unbeknownst to the victims.  Prior to this event many players in Second Life would not have considered this possible.  Game physics re-engineering is also happening in World of Warcraft (where it is called "Theorycraft").  In this virtual world, one expert explained it to me this way “[we are] unwrapping the mathematics and developing a perception of space and time in relation to the virtual world, that determines which combination of attacks or defenses have the greatest efficacy.”  This info is then shared with colleagues in password protected chat rooms.  Using this knowledge delivers extraordinary advantage, namely lethality per second optimizations, hence the importance of keeping this specialized knowledge to a privileged few as long as possible.  By the way, let’s not forget that we are re-engineering the physics here on Earth in a similar manner.  Heck, ten thousand years ago, who would have conceived of the possibility that spaceships could be devised to take man to the moon and back! 

Tools are tools.  Are virtual spaces dangerous?  Well, is a phone, the Internet and email dangerous?  Nope, not for the most part, in fact the opposite, as the social and economic values of these technologies far outweigh the consequences of misuse.  Sure bad actors will continue to use the best tools they can get their hands on too.  And with this behavior, as more bad actors show up … the folks paid to “protect” us will venture into these virtual spaces in an effort to detect and preempt.  Hence some of my quotes in this recent Washington Post story “Spies Battleground Turns Virtual.”

And finally, how will you know virtual worlds are starting to collide with your own real world?  Watch for this sign: someone wants to chat with you while showing you something and they explain the best way to do this efficiently is for you to “step in” [to the virtual world that is].

RELATED POSTS:
Ghost in the Machine?

January 05, 2008

Data Decommissioning – Destruction of Accountability

Having designed a lot of systems over the years – more often than not the customer says they plan on performing periodic purges of historical data. This always seems logical at the time. But, it turns out once you have data it becomes hard to justify its destruction. And if anyone actually destroys data … one is at the same time eliminating any accountability whatsoever (not to mention other adverse consequences).

Data decommissioning is a double-edged sword.

After a number of personal missteps over the years, I have revised my think about data decommissioning. Today I imagine a process where accountability is maximized while the risk of unintended disclosure, misuse, and repurposing are minimized. The goal being to write accountability data into storage de-optimized for information retrieval … therefore rendering retrieval practical only for infrequent, forensic inspection. In simple terms, think paper tape, think hard copy reports, or think microfiche. Alternatively, in more sophisticated settings, I suspect immutable audit logs optimized only for investigative/forensic-specific information retrieval might be useful too. [More detail about this line of thinking available in this paper that Peter Swire and I penned on behalf of the Markle Foundation.] Obviously, at some point in time when there is no longer any reasonable expectation of information accountability, repeatability, etc. wholesale data decommissioned makes sense (burn the microfiche).

How I arrived at this revised thinking in part came about from this series of events.

Many years ago, I deployed a system designed to address a single, very specific threat. Then, several years later I concluded that long after that threat was over, the aggregated data set had probably lived on. I would not have thought twice about the privacy and civil liberties implications of this had I not started to engage in conversations with privacy advocates. Following these conversations, I decided that there are some scenarios in which data decommissioning should be "baked in."

Subsequently, with this in mind, when a pro bono opportunity to assist with a humanitarian disaster relief effort presented itself, I proposed a data destruction caveat for the contract. While the customer didn’t seem to care much one way or another, I was excited to learn the customer agreed to the wholesale destruction of the aggregated data set upon project closure. And delete it all we did.

A small victory for privacy it seemed – that is, until a few years later when I realized that I could no longer prove what was done, right or wrong. In fact, had there been any after-the-fact disputes about incorrect action taken based on the recommendations of the technology, I would have had to say, "We destroyed the evidence!"

In summary, when designing systems which require strong audit, accountability and repeatability processes … very careful consideration must be given to delete processes.

Deeper Technical Points:

1. Much like the challenges that come with processing deletes, record changes can have the same issues. This occurs when a system overwrites changes rather than keeping each incremental record state and its temporal relevance. When overwriting changes – one is deleting previous values; it is this de facto deletion that compromises audit and accountability processes.

2. A further complicating factor is that not all changes are the same. Some changes are corrections, i.e., the earlier value was incorrect, e.g., wrong driver’s license number or a missing apartment number in an address. Another type of change is one where a value supersedes a previous value, e.g., when recording a married name, new email address, or new cell phone number. Further complicating matters, most systems of record do not have a mechanism to capture the difference between corrections and updates – forcing system designers to make some assumptions.

3. When synchronizing data across information sharing environments, propagating deletes through this ecosystem forces each receiving party into this same accountability dilemma.

Related Trivia:

1. When data actually does get purged it is often prompted by a forcing-function. The three purge scenarios I have seen are: (a) all the ancient history is compromising performance; (b) there is no interest in paying for more storage; and (c) "oops - we shouldn’t have been collecting that!"

2. With all the countless copies of data being made, how can one be sure it is ever all deleted anyway?

RELATED POSTS:

Data Tethering

Out-bound Record-level Accountability in Information Sharing Systems

Information Incontinence

Immutable Audit Logs (IAL’s)

How Many Copies of Your Data? Is Somewhat Like Asking: How Many Licks to the Center of the Tootsie Pop?

December 30, 2007

Out-bound Record-level Accountability in Information Sharing Systems

If you can’t remember to whom you told what; how could you possibly know who to inform if an earlier fact you reported needs to be revised?

When organizations transfer information between systems, they sometimes fail to retain the details about which records were transferred where and when.

What happens today in many systems, especially batch-oriented data transfers, is this: a selection process (e.g., males over 40 with account balances under $20,000) is run against a system of record. This process produces a specific number of output records. These output records are then transferred to the intended recipient. The original data holder, for billing purposes, often retains a record of the selection criteria used, date/time, quantity of records transferred, recipient of the data, etc. Notably, the original data holder does not record exactly which records were transferred.

Unlike Source Attribution which has more to do with the recipient of shared information retaining the pedigree/attribution of the information received, out-bound record-level accountability refers to the detailed logs of what records were sent to whom, when, etc., as maintained by the originating party.

Without out-bound record-level accountability … ensuring data currency across information sharing ecosystems can be problematic. The challenge being when a record changes in the originating system, how will one be certain which recipients of the original record need to be notified?

What’s the fuss?

What if a consumer says to his service provider, please stop using my data for bulk mailings AND anywhere you may have sent my data … either get it back or at least notify them of my wishes? Good luck! Many organizations have no way to account for which records they have transferred to whom.

While out-bound record level accountability is generally a good thing, not every mission will warrant the cost. On the other hand, some missions really should have this degree of accountability. In healthcare systems, for example, if a correction is made to a patient’s known allergies, any earlier dissemination of allergy data should trigger an immediate re-broadcast of the corrected values.

Systems engaged in transferring personally identifiable information (PII) as well as financial systems and surveillance systems are also great candidates for out-bound record-level accountability.

Without well-synchronized data … count on lots of poor outcomes as smart systems are not going to be so smart.

[BTW: One example of out-bound record-level accountability is how the US credit bureaus track inquiries on your credit report. Thanks to the Fair Credit Reporting Act (FCRA), this type of accountability makes it possible for consumers to enjoy transparency as to who has accessed their credit report.]

RELATED POSTS:

Data Tethering

Source Attribution, Don’t Leave Home Without It

How Many Copies of Your Data? Is Somewhat Like Asking: How Many Licks to the Center of the tootsie Pop?

November 10, 2007

Found: An Immutable Audit Log

An immutable audit log is a tamper-resistant recording of how a system has been used – everything from when data arrives, changes, departs, to how users interacted with the system. Each event is recorded in an indelible manner - even the database administrator with the highest level of system privileges cannot alter the past … kinda like the paper tape on an adding machine tape, etched in stone … only more high-tech.

I think (and hope) tamper-resistant audits will become common place in settings ranging from health care patient records to government surveillance systems. The primary value being twofold:

a) Accountability. Enable policy folks charged with oversight and accountability to validate that a computer system has been used within policy and law: and,

b) Deterrence. The "chilling effect" caused by the knowledge that a tamper resistant audit log is in place – deterring a corrupt person or two from bad behavior.

Well, good news. I stumbled onto a software company in Spain called Kinamik which has been dedicating its technical resources towards the creation of … a tamper-resistant audit log!

Now what? What if no one wants to pay for one? Will tamper resistant audit logs need to be built-in to commercial off-the-shelf systems to reach the market? If so, will organizations actually pay for the additional disk space and processing requirements to turn such a log on? Or, will they simply turn the feature off?

This is important technology and one that really needs to see the light of day, especially in conjunction with non-transparent government systems.

If any of my readers have thoughts as to what kind of incentives or levers will be needed to make such audit logs a reality, I would love to hear from you. As well, if you discover any other companies selling tamper-resistant logs, please let me know. I would like to compile a list.

RELATED POSTS:

Yesterday’s Technology Review Story: Blinding Big Brother, Sort of

Immutable Audit Logs (IAL’s)

November 05, 2007

The Triadic Continuum

I spend a bit of time blogging about the importance of Persistent Context – this being a data store that contains up-to-the-second contextualized information. Each new observation is Semantically Reconciled, and its relationship is evaluated against all previous observations. What is learned incrementally builds on the historical context and if a contextualized observation warrants action, this insight is published. Persistent context is absolutely essential to delivering real-time situational awareness – something I have been calling Perpetual Analytics. This is not window-based Stream Processing.

Introducing the Triadic Continuum.

Ever heard of the Triadic Continuum? Probably not. Me either, until a few days ago that is … when this article in DMReview: "The Best New BI Invention You’ve Never Heard Of" made its way into my inbox.

This article describes what appears to be a pretty similar concept to persistent context … and thus I got somewhat excited. While reading this article, I tried to imagine what Jane Mazzagatti and her team are doing. It is great news that work of this type has received some attention.

Here are some excerpts of interest to me and related thoughts:

[… instead of data and information being "found," "analyzed" or "discovered," it is already there waiting to be "realized."] [… discover more complex, less easy-to-find relationships in vast amounts of real-time data … answers to queries may change as more and more data are introduced into the structure - similar to how we are able to change our perceptions and decisions based on … new facts.]

I wonder if they have started thinking beyond assembling data for future recall … but also performing data finding data and relevance finding the user processing at ingestion. The principle being: at the exact moment new observations (data) are ingested into a persistent context data store … also happens to be the cheapest moment computationally to detect relevance (insight). [More here: Sensing Importance: Now or Never]

[… theoretically, each individual particle of data occurs only once within the structure …]

I wonder if they have been playing with the concept of also making disambiguation assertions during the ingestion process. [More here: Entity Resolution Systems vs. Match Merge/Merge Purge/List De-duplication Systems]

[… a computer data structure that is self organizing - in other words, a data structure that naturally organizes new data by either building on the existing data sequences or adding to the structure as new data are introduced.]

This makes me wonder if they have been working on the ripple effect that can happen when a new observation invalidates an earlier disambiguation or relationship assertions.  [More here: Sequence Neutrality in information Systems]

[… the format and organization of the Triadic Continuum not only hold the representation of the data, but also the associations and relations between the data and the methods to obtain information and knowledge.]

First, it appears they are thinking of context in the same light as I do. [More here: Context: A Must-Have and Thoughts on Getting Some …]

Maybe I am reading too much into this, but I also wonder if the words "relations between the data and the methods to obtain information" have anything to do with commingling new observations and user queries into the same data space. [More here: What Came First, the Data or the Query?]

[… has developed and patented a new data structure …]

Having thought a lot about how data structures govern function, I do sometimes think about persisting the data in something other than an SQL database engine to get even higher throughput rates. Although, then I ponder how to make up for the freebies that come with industry standard SQL engines like transaction consistency, restartability, and a large community of trained DBA’s. So I wonder what thoughts this team has in this area. [More here: Big Breakthrough in Performance: Tuning Tips for Incremental Learning Systems]

No matter where these folks are in their evolution – first or tenth generation – I am real excited to hear about their work.

Hopefully, one day, I will have the chance to chat with these folks. Kindred spirits I suspect.

RELATED POSTS:

Accumulating Context: Now or Never

The Phone Call is Coming From Your House! Context is King

Enterprise Intelligence – My Presentation at the third Annual Web 2.0 Summit

It’s All About the Librarian! New Paradigms in Enterprise Discovery and Awareness

How to Use a Glue Gun to Catch a Liar

Intelligent Organizations – Assembling Context and The Proof is in the Chimp!

It Turns Out Both Bad Data and a Teaspoon of Dirt May Be Good For You

There Is No Such Thing As A Single Version of Truth

More Data is Better, Proceed With Caution

October 27, 2007

Feature/Function Innovation: Inventing Left-Hand Columns

Innovation does not mean listening to what a user is asking for and building it. Heck, the way I see it, by the time a user starts asking for something, they are most likely asking everyone for the same thing.

Real innovation is what I refer to as "inventing left-hand columns." What I mean by this is that once users hear what is now possible, they not only realize they must have it … they now consider it a requirement. As a requirement, they place this newly discovered functionality in the left hand (vertical) rows of their spreadsheet. Across the top (horizontal) columns of the spreadsheet, they place the products/solutions being evaluated. Buyers use this matrix to evaluate market offerings … thus the more unique features, you offer the more the X’s appear in your in your column … and this is a good thing.

New left-hand columns cause users to start asking everyone else for such capabilities.

The competition is now forced into reaction, all the while the innovators are working on next generation left-hand columns!

RELATED POSTS:

Getting Big Things Started