Kenneth Ballenegger

Angel Investor, Engineer, Startup Founder

This blog is no longer updated and remains online as an archive.
Maybe we should always show pictures. Bin Laden, pictures of our wounded service people, pictures of maimed innocent civilians. We can only make decisions about war if we see what war actually is — and not as a video game where bodies quickly disappear leaving behind a shiny gold coin.
Jon Stewart

Armin Vit on Khoi Vinh’s argument that sending well-crafted print promo is worthless and wasteful, because they inevitably end up tossed out:

Designers send out printed promos to get your attention OUTSIDE of the internet. They want you to look at the piece of work as an actual physical specimen that demands a different kind of interaction than a webby thing. Whether you toss it or not is not the point, just as it’s not the point whether you ignore an e-mail or Tweet or not. It’s about saying “Stop, look at this. Got it? Okay, carry on.” There is nothing wrong with throwing things away (or recycling them).

[…]

I bet you have dozens of design books on your bookshelf that you haven’t seen in years. I know I do. I have them because they give me a weird sense of joy in knowing that I have them in my collection and accessible at any moment. Which is the same reason I, personally, hoard designers’ promotions and things. I have a bookcase filled with them and there is stuff I haven’t looked at in more than ten years. But every now and then I want to remember what a piece looked like either for reference or just for pleasure and I know that it’s there, not in some landfill.

To conclude: Designers, please don’t stop making things or refrain from sending them out. Those things play an important role in the way we consume design material. If everything becomes JPGs, GIFs, and PNGs served on a browser then we are screwed—anyone can create things that look good on the screen, it takes real mettle, vision, and investment to produce something that has physicality and presence. Even if it’s fleeting. For that one moment you have the ability to evoke a response from someone, and that’s not worth tossing out.

I couldn’t agree more. Khoi’s post is interesting and raises some valid concern—but I fully disagree with him. There’s something wonderful about a well-crafted print piece that digital media can never achieve. A pop-up will will never obscure a print poster to notify you of an incoming tweet or email. For the seconds (or perhaps even minutes) that you’re looking at the work, you’re fully engaged and responding to the designer’s intended experience. That’s worth much more than an email can ever get you.

I do not pride myself in my skills as a programmer. Complex algorithms scare me, and I stay away from them as much as I can. Rather, what I am good at is creating elegant solutions to problems. I’m good at imagining how things could work together, how something could be improved through programming. I’m good at building real-life products and streamlining processes. Breadth, rather than depth.

I also do not pride myself in knowing a language fully. I am good at understanding concepts, code and documentation, and when asked a specific question in a job interview I am not afraid to say that I don’t know, but could easily figure it out with 5min and access to the internet.

What I’m getting at is that I value resourcefulness, scrappiness and creativity more than knowledge and intelligence. This is why I’m not taking a computer science course, but rather am instead studying alternate approaches to problem-solving in the world of design. I think it will be a lot more valuable in my life in building an intellectually well-rounded personality, and an ability to pick up new skills quickly and bend them to suit my purposes. In the end, what truly matters is what I’m able to create, not how intelligent I may be.

I’m sick of charities telling me that by not giving them £10 a month I’m indirectly clubbing poor children to death with dolphins. Show me something positive for once and just maybe I’ll open my wallet and break my long-held embargo on sending perfectly good cash to people I don’t trust to scratch a moral itch I don’t have.

New Apartment

I’ve just moved into a new apartment, and took the opportunity to act upon my love for minimalism in furnishing and designing it.

Running a Modern Startup on PHP

I originally wrote this for the ChartBoost Blog.

In the modern world of agile startups and silicon valley, the buzz is all about Ruby, Python, and whatever the latest cool programming language or framework to come out is. Older technologies don’t get much love, and PHP especially has a bad reputation. In this post, I’m gonna go over why and how we use PHP as a modern technology, and the various other tools, techniques and development methodologies we employ to run as agilely and elegantly.

PHP

PHP is regarded as a clumsy and amateurish technology, best left to development newbies and $5-an-hour consultants. It’s almost bad enough to make me feel shame when I tell people we run on PHP. However, I don’t think this reputation is entirely deserved.

The language itself is, after Perl, the oldest language to be adopted en-mass as a web technology. Its roots are as a text pre-processor, and over the past 16 years it has evolved from that into something much broader. Many of its fault stems from the way it has evolved, rather than being designed the way it is today from the ground up.

I’m not going to argue PHP is the best language—it clearly isn’t. Frankly, it’s a mess. There’s no consistency in function and class names, even within the core library itself. The Object-Oriented features were tacked on at a later point and, while they’re getting better, are somewhat fragile. Here at ChartBoost, the core requirement is that we run on at least PHP 5.3, which introduced Late Static Bindings. Before that, building serious object-oriented code in PHP was impossible.

Even for all its faults, PHP remains a major player online, and some of the most impressive technology companies (like Facebook) are using it. PHP remains one of the fastest language to code with, deploy and execute. Lastly, while this is mostly due to personal preference, I find its C-inspired syntax to be one of the best in the web development world. Braces, parenthesis and semicolons make it extremely clear what the code is doing, as opposed to Ruby’s mess of symbols, implied parenthesis and lack of statement endings.

MVC

It’s paramount for a modern web app to run on an MVC (Model-View-Controller) architecture. Unfortunately, PHP offers very little in terms of modern and agile MVC frameworks. The big ones (CodeIgniter, Symphony, etc.) are extremely bloated and actually tend to get in your way more than help. Also, most impose their vision of what the model & database layers should look like.

Paraglide

Fortunately, one framework stands out from the pack. Paraglide is a minimalist framework that takes care of routing requests to controllers, rendering views, and little else. It offers the basics in terms of setting up the environment, providing basic helpers and organizing your code. It also works on the command line and from a shell (more on this later.)

Believe me when I say this, but Paraglide in mind-blowingly cool. It makes coding in PHP as elegant, and in some ways even more elegant, than the equivalent in Rails. It’s faster and lighter weight than Rails, but is easily extensible and works with pretty much any other code or package you throw its way.

MongoDB

Another decision core to our design ideals was the choice of MongoDB as our main model layer. Mongo is an incredibly powerful and scalable database system. It’s fundamentally different from MySQL in that it is at its core a key-value store. Mongo is so incredibly efficient that we have in fact completely skipped the usually required step of using Memcached. Mongo also offers greater reliablility and safety than MySQL with features such as failure-proof replica sets, and a querying interface that’s invulnerable to injection attacks. Avoiding SQL altogether has also been extremely pleasant. One of Mongo’s biggest advantages is easy and powerful scaling through replica sets. When a node goes down, or is added, Mongo will automatically recognize it and rebalance itself, without causing any downtime. There is no single-point-of-failure.

MongoModel

A pet project of mine has been MongoModel, and it is what we use as the third leg of our architecutre. MongoModel is an ORM which uses Mongo as its datastore, and adds features vital to a full-featured web application. It provides object-mapping, relationships, validations and is extremely elegant to use. Much like with Rails’ ActiveRecord, sensible defaults are deduced, and it’s schema-agnostic. You do not need to setup or even define what your database looks like. Rather, you just use the objects and MongoModel takes care of everything else.

Unit Testing

While we don’t practice Test-Driven-Development, we do have unit tests in place. PHP does not provide an elegant test library, so we built our own (soon-to-be open-sourced.)

Shell Development & Scripting

Paraglide is, to my knowledge, the only PHP framework that works in command-line scripts and from an interactive shell. Script functionality is extremely important in order to run cron scripts and various other maintenance and administration tasks. Interactive shell access is a boon for quick development and debugging. We use PHP-Shell to interact with our code directly from the command line. This is quite similar to Rails’ script/console.

Git

Everything we do is stored in Git. Git’s virtues are well-known within the community, so I will only say that git has been incredibly useful in keeping track of our code, the history, and for collaboration. We even use git as a wiki, to keep track of our documentation and various other internal documents.

GitHub

All our git repositories are hosted on GitHub. The main value of this, besides the hosting and gorgeous user interface, has been to use the social features to keep track of who’s been doing what. GitHub makes it really easy to have an overview of what’s happening. It also manages user accounts and rights beautifully.

Capistrano

Our main server-side code lives in a Git repository. We have dedicated branches for production code. We use Capistrano for deployments. The git repository has a dedicated branch for production code, which we merge to as we deploy stuff. A script will automatically run unit tests on anything that is pushed to production.

Amazon Web Services

ChartBoost relies on Amazon Web Services’ many products, including EC2 for cloud servers, S3 for data storage, SES for emailing and various other smaller services. This lets us pay for how much we use only, and allows for simple and fast scaling. We have an image ready to be deployed to new nodes, so we can handle any traffic thrown at our app.

Communications & Internal Tools

Last but not least, there’s the tools we use internally to keep in sync. Lighthouse takes care of our bug-tracking needs, while its companion, Tender handles support. We use Campfire for group chats, and AIM for one-on-ones. Google Apps & Gmail take care of our emails. Also check out companion Mac apps Lighthouse Keeper for Lighthouse, and Propane for Campfire.


If you read this far, you now have a good overview of the various tools and techniques we use to code agilely at ChartBoost. Even though we chose an unpopular language to base our technology on, I think it has helped us tremendously. With this post, I hope to spread the love again for PHP and these various ways of using it in a modern environment.

Stop Panhandling your Ideas

When most people see panhandlers on the side of the road, we condescendingly think “Why don’t they get a job? You’re not going to get anywhere begging for money. Get to work!” Yet, this is what so many people do with their ideas - they put their fate in the hands of passerby’s hoping someone cares enough to give them a chance. It’s the equivalent of standing on an off-ramp holding a cardboard sign that reads “I have good ideas. Please pay me for them.”

We hesitate to do the actual task of shipping work out the door because it’s scary. The last question we want to ask ourselves is “Now what do I do?” It’s more comfortable to always be on the journey instead of arriving at the destination. If you’re always “working” on something you never risk failure or embarrassment. Save Draft will always get more clicks than Publish.

(Source: bennesvig)

The Cosmonaut: A Minimal, Wide-Grip Stylus

A few months ago, right after the Glif Kickstarter campaign ended, I wrote a blog post about how most iPad styluses on the market today follow an incorrect cognitive mapping, in that they try to resemble a pen. The right shape to mimic — to match the low fidelity nature of capacitive touch screens — is a dry erase marker. I of course didn’t know it at the time, but this was the beginning of Studio Neat’s second product.

Tom and I have been researching, prototyping, and designing for the past few months (in synchrony with Glif work) and have come up with a solution that we think is pretty great. And now, once again, we are calling on Kickstarter to help make this idea a reality.

Pledge while you still can, they’re almost sold out.

MongoModel

MongoModel is a simple and lightweight ORM for MongoDB and PHP. I finally got around to posting it on GitHub. It’s a simple piece of code, but it’s the backbone for many of my recent projects, including ChartBoost's entire backend.

The Azure License: Meaningful Attribution

I’m updating and re-releasing this from my old blog. Feel free to use the license in any project. No need to attribute me, the license itself is released into the public domain.

Open-source licensing can be a real pain. Some licenses are nearly impossible to decipher, while some (namely—the GNU GPL) are just pure evil.

I have been trying to find a software license which, like the Creative Commons Attribution license, would let the licensee do pretty much anything with the software, except it would require attribution in a meaningful way. That is to say, a non-intrusive mention in the documentation or about box.

The MIT license came closest to this, and it is the base on which the Azure License was written.

A good way to give attribution, as required by the license, would be a friendly “Contains code by Copyright Holder [linked]” or “Special thanks to Copyright Holder [linked]” in the about box.

The Azure License

Copyright (c) {Year} {Copyright Holder}

Attribute to {Copyright Holder} - {url}

You (the licensee) are hereby granted permission, free of charge,
to deal in this software or source code (this "Software") without
restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, and/or sublicense this
Software, subject to the following conditions:

You must give attribution to the party mentioned above, by name and
by hyperlink, in the about box, credits document and/or
documentation of any derivative work using a substantial portion of
this Software.

You may not use the name of the copyright holder(s) to endorse or
promote products derived from this Software without specific prior
written permission.

THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THIS SOFTWARE OR THE USE OR OTHER DEALINGS IN THIS
SOFTWARE.

http://license.azuretalon.com/