In the 1980s, personal computers fueled a desktop publishing revolution. Software let people create documents with powerful flexibility from their desktops. Yet before these creations could have impact on the real world, they had to be printed on paper, magnetic tape or film. The Internet connected only the scientists and hackers — the majority of computers were isolated with software transmitted on physical disks.

hands on keyboard in sunlight The Internet began as a communications medium: a way to send messages across networks. The need for human-to-human communication across institutional boundaries led to standardization of a resilient messaging protocol (TCP/IP) in the 1970s. By the mid 1990s, email was common, but not universal; the web popularized the Internet as a new publications platform. Initially technical papers were linked across dozens, then hundreds of computers. Then, digital retail brochures dominated the landscape and billboard sported web addresses for the first time.

Blogging started as a simple way to update web pages using date-stamped content. The format became standardized with software that helped people write in a way that they had been writing online for a decade, and on paper for centuries. I started this blog in 2002, and I remember when SixApart introduced a new feature that connected blog posts to each other, establishing patterns for readers as well as authors. “Trackbacks” allowed me to easily see who linked to a post I had written, and for the first time, I experienced a social network forming through interactions fostered asynchronously by words written, read and referred to. It felt like a new digital realm.

Now we have so many ways to self-publish, to reach audiences instantaneously across the world, to find the people who want to hear what we have to say. We’re still empowering a subset of the population: young, urban, wealthy, educated Americans are much more likely to use the internet (according to a 2015 Pew Research Report). It is no surprise that the 15% not yet online are not evenly distributed. Nevertheless, this new generation has emerged who feel entitled to a voice. In this online realm that is as imperfect, biased, and broken as the physical world, we have created the potential for a new kind of democracy, where we can choose the voices who represent us through following and sharing.

For the past year, I’ve been working on a small social network focused on culture change within the US government: Open Opportunities is a deceptively simple system allowing federal employees to post projects that other employees can sign up to work on for their own professional development. We’re mirroring actual collaboration that happens (rarely) in the real world by people who have well-developed networks, allowing them to find and collaborate with others across this huge organization with 2.7M employees. Participation requires supervisor approval, yet we allow the individual to confirm rather than requiring a byzantine series of forms that is more typical for government software. Federal employees are already held to high standards for ethics and must be responsible and knowledgeable about the legal implications of their actions, which allows us to instill a respect for individual responsibility into the design of the software service. Less software can sometimes offer more power as we seek to facilitate interactions that take place outside of software, empowering people to create impact in the real world.

As software designers and developers, it is our opportunity and responsibility to create a medium that will amplify the best of us and moderate the forces that threaten to tear apart our society. In the private sector, Twitter, Facebook, Instagram, Tumblr, Reddit, Imgur, Pinteret, Medium, Github and others provide new capabilities for communication and social interaction. Software design influences the way we interact, creating emergent behavior that is changing our culture.

In 1961, Dr. Martin Luther King, Jr. noted that “we have allowed our civilization to outdistance our culture.” I think our culture might just be starting to catch up, now that our technology is starting to reach a wider spectrum of the population. His call-to-action when jet planes were new is even more urgent in today’s globally connected society:

Through our scientific genius we have made this world a neighborhood; now through our moral and spiritual development, we must make of it a brotherhood. In a real sense, we must all learn to live together as brothers, or we will all perish together as fools.

The power of transparency in business, government and non-profit organizing was a key theme from 2015. In Sept, I gave a keynote talk (see RubyConf Taiwan video) called “Transparency Wins.” The title was a play on words, where “win” in English can be both a verb and a noun: how transparency as a methodology causes us to win, and also the story of three wins.

All the disparate threads of my work came together in this presentation, which was my fourth tech talk of 2015. I had been speaking on two quite different themes: two talks focused on game design and theories of play and fun, and this was my second talk on transparency.

sunlight through treesI feel like it is important to convey how and why transparency really works. For many people, it is counter-intuitive to release something that you know has flaws… some would even call it disrespectful to your audience, your community or your customers, but when done right it is the opposite. Transparency can fuel creativity and amplify success.

Reflecting on what it takes to win at something, I realized that a theme from the game design talks applied here, as well. I had presented the definition of an epic win: that extraordinary outcome that feels impossible, until it happens. I was inspired by Jane McGonigal’s TED Talk (see notes on transformative power of games). That same concept is needed when you do something new. Conveying the outcome you intend is the key to making transparency lead to effective participation. Participation increases the size of your team and accelerates learning. We need to make software not just for people, but with people.

Through this framework for explaining effective techniques of transparency, I realized that part of the magic of Bridge Foundry is that we present the vision of a software industry that is reflective of our society. This vision can feel like a bit of a fantasy to newcomers, but then we let them experience a little bit of this future we seek to create. They participate in a workshop where a diverse group of people get together to teach and learn, and they know that their work will take a clear step in the right direction and definitely help a few people. Since the software industry was created by women, this really shouldn’t be so hard, but it’s weird how history gets forgotten so quickly. We need transparency into the past too — understanding history helps us shape the future.

Much of the open source movement in government is focused on accountability, and that is important; however, when we are transparent about our intention as well as the steps we are taking to execute on that intention, we create a space for participation. We have an unprecedented opportunity to create a new kind of participatory democracy. In addition to citizens participating by voting, where they have limited ability to express their intent, where complexity is too often boiled down to binary decisions, we can involve people in the creation of policy and its implementation. In my work on College Scorecard with the Department of Education, I saw first hand how the implementation of policy using technology can be transformative. The US Government released data by releasing an API and a website, making that data immediately useful to students, colleges and the organizations that serve them. We also built the software with the help of individuals who felt that the work was important, which let us do more with a limited budget.

Lastly, in business, the lean startup movement has created a discipline called “customer development” where we develop relationships with customers in advance of creating the product, increasing the chance that the product will actually work for the customers. At Mightyverse, we used a paper-prototype to engage language learners and created a real-world card game that helped us validate our theories of social learning, while building a community that may someday use our mobile app. Business folk might say we’re creating a market (or tapping into one), although I think it is more accurate to say that the market is creating us.

You can watch the whole video here: Transparency Wins, RubyConf Taiwan 2015

Xcode playgrounds are a delightful way to explore the Swift language — once you get them set up. I admit that I’ve grown to love environments where I can code with simple text files, however, I also love to develop iOS apps and so I find myself digging once again thru the byzantine Xcode GUI. It seems I always forget the magic incantations!

Here are the notes for my future self and other intrepid explorers:

Experimenting with in Swift 2, Xcode 7.2, OSX 10.10.5 (Yosemite)

note: cocoapods 0.39.0 has issue with Ruby 2.3 ( — likely fixed in the 1.0 beta, but I stuck with older ruby and released cocoapod for this exercise.

rvm use ruby-2.2.4
gem install cocoapods

Make a new Xcode project, and add a new Empty file to your project called Podfile (New > File… > Other > Empty), with the following contents:

platform :ios, '8.1'
xcodeproj 'ParsePlayground'
target :ParsePlayground, :exclusive => true do
  pod 'Parse'

back on the command-line:

pod install

This creates a new Xcode workspace, so we need to close the project in Xcode, then re-open Xcode with the file named something ending in .xcworkspace.

This new workspace should have both the original project and a new one called Pods. Now we can create the Playground, by selecting the menu: File > New > Playground… Then we save it in the root of our project directory, then add it to the project with the menu: File > Add Files To “ParsePlayground”

Now this code should compile:

import Parse
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true

We want to set needsIndefiniteExecution so that the async commands will work.

I made a new Parse app to experiment, then in the parse docs, in the QuickStart Guide, they set up some sample code already customized with the app ID and client key, it should be something like:

clientKey: "morelettersandnumbers")

Then we can start coding! I made an item class in Parse with a string property “info.” Here some code that worked for me:

let testObject = PFObject(className: "TestObject")
testObject["foo"] = "bar"
testObject.saveInBackgroundWithBlock { (success: Bool, error: NSError?) -> Void in
print("Object has been saved: (success)")
var query = PFQuery(className: "item")
var items = try query.findObjects()
print("got some items")
for item in items {
var info = item["info"]
print(" item #(item.objectId!) info:(info)")
print("not the end... wait for the sync call to finish")

When I run the above code it works fine, but I do get some of the following errors. Not sure why…

Failed to obtain sandbox extension for path=/var/folders/hz/vnvkxt7x4236fp6nqt5zy2wr0000gn/T/

I’ve posted the full ParsePlayground project on Github with some notes on how to set up the Parse app if you want to jump right in!