Wednesday, November 19, 2014

Baltimore Hackathon After Action Report

Last weekend's Baltimore Hackathon project to help Thread was a lot of fun! Several people from Baltimore's PHP and mobile web communities reached out to help me, as did a good friend from New England who put us in touch with some Salesforce experts. Two people came to the hackathon to participate. Everyone else couldn't make the weekend but expressed interest in helping later.

We focused on documenting the app and making it ready for easy improvements. Here's what we accomplished:

  • Setup a private bitbucket git repository where we could share code changes
  • Created a setup README file explaining how to use MAMP to quickly create a development environment that mimics what runs on Thread's application server (this is what took up most of the time as we had to learn the intricacies of CodeIgniter)
  • Made minor changes to CodeIgniter settings so the app could be run locally in a development mode
  • Added a Neighborhood field to the application UI and underlying MySQL table so that volunteers can document the locations where they work.
The next steps include:
  • Connecting Thread's data analyst with the Salesforce experts (should happen later this week)
  • Adding a simple leaderboard that shows the number of interactions per volunteer.
  • Deploying our changes to Thread's staging server and rehearsing the database migration
  • Deploying to the production application server
  • Drafting suggestions for long-term upgrades and maintenance to avoid software rot

Monday, November 10, 2014

Help Thread Help Baltimore at the Baltimore Hackathon

Update 11/12/2014: Added an FAQ at the bottom and more problems and projects. You don't have to be present at this particular weekend to help!

This weekend I am planning to work on a service project at the Baltimore Hackathon and I would love to form a group to work together! I have been working with Thread, an excellent local nonprofit group that helps students in Baltimore. I'm interested in working with them because of their unusual, comprehensive approach, and because they are already fairly tech-savvy.

Details below. Please e-mail me if you'd like to team up!


Thread, formerly the Incentive Mentoring Program (IMP), has a volunteer base of 700+ volunteers who are providing continuous daily support to 150+ students, who live and go to school in neighborhoods all across Baltimore. These volunteers work in teams called Thread Families to provide each student with everything they need to succeed in school as well as increased access to community resources. Because of the diverse range and sometimes urgent nature of interactions, Thread has struggled to capture the full depth and breadth of their efforts and impact. Thread works in every part of the city, 365 days a year, and commit to working with students for 10 years.


According to Thread (emphasis mine):
"Up until 2013 we tracked most of our activities via volunteer logs using Google Spreadsheets and Forms, but at year-end the hours that were logged were always far short of what we know had actually happened in Thread Families. We think the barriers had to do with poor ease of use and lack of feedback from the system. It was difficult to log things from a smartphone, and you never received any feedback from your interactions, which essentially went into a black hole (a Google Spreadsheet that was inconvenient to access and check). In 2013, we applied for a grant with NextJump to help create a website optimized for mobile devices that would make logging significantly easier.
"A small team of developers at NextJump donated two weeks of time to create ThreadShare, which is both aesthetically pleasing and easy to use. However, ThreadShare is still missing two critical components, a more comprehensive feedback loop and increased engagement functionality. While interactions are now posted for Thread volunteers to see, the overall app is still relatively limited in its functionality. You can't post pictures, you can't location track and see a map of your impact in Baltimore, and you don't know how you fare as compared to your fellow volunteers.  Understanding the impact of their hard work and connectedness to a larger movement is critical in encouraging volunteers to continue and increase their commitment.  
"I truly believe that with a few small tweaks, like the ones mentioned above, ThreadShare v2.0 could be more than just an administrative tool, but a key engagement strategy as we fully transition from a small non-profit to a movement within Baltimore. I also hope that, since Thread is all about facilitating connection, the app would be something that we can then share with other nonprofits for their use in engaging volunteers." 
"A common criticism of Thread is that because we serve 150+ students, our impact is small. The Thread vision is not about just tutoring underperforming high school students facing significant challenges outside of the classroom, however; it is about creating “intentional families” with strong relationships and weaving a new social fabric. It is about ending the sense of social isolation that many students and volunteers within the community feel, and it is about facilitating relationships that transcend barriers of race and class. Our current metrics highlight student achievement and our ability to accomplish our mission, but fall short of telling the full story of the overwhelming comprehensive and extensive nature of what we do and the impact that it also has on the lives of our volunteers and the Baltimore community. Only the day-to-day actions of our volunteers paint a complete picture of what individualized support and relationship building really means.”


Thread is moving various business operations to a Salesforce application, and there is currently no automatic means of transferring IMPshare data to Salesforce.


There is no person or company currently responsible for the day-to-day upkeep or improvement of IMPshare and no easy way for volunteers to contribute source code to the project. There is however a staging environment where code changes can be tested. The plan should also include regular backups of ThreadShare's MySQL database.


The IMPshare app runs on a LAMP stack with the CodeIgniter framework and jQuery. The source code is currently hosted on the IMPshare server and does not appear to be version-controlled.

  • Partially address problem #3 by engaging Baltimore's PHP and mobile web communities: we can make IMPshare easy to work on.
    • Move the code to a private bitbucket or github repository. Consider making it an open source application.
    • Create a setup script that installs dependencies and allows code to be run locally
    • Write technical documentation & make diagrams, including a thorough README that explains how to run the app in a development environment
    • Create sample / test data
    • Create an app deployment procedure for the staging and production environments
    • Sign up to present the project at Baltimore PHP and Mobile and Techies For Good meet ups
    • Draft an RFP for PHP consultancies to estimate the cost for ongoing app maintenance (routine things that are harder to get volunteers to focus on, such as bug fixes, security patches, etc.)
  • Prototype a leaderboard tool. This could be a separate application that connects to IMPshare’s MySQL database, runs a SQL query, and emails a leaderboard to Thread leadership (who could then review it and forward to volunteers).
    • If Thread likes it, this report could be incorporated directly into the app’s user interface
  • Add a “Neighborhood” field to the user interface
    • Can leverage HTML5 APIs to auto-fill with the user’s current location
  • Prototype an impact map that uses various Google geocoding APIs to geocode locations using the new "neighborhood" field
  • Setup MySQL backups
  • Create a standalone reporting app that allows database gurus to create SQL reports that could be embedded in Google Docs
  • Prototype an IMPshare-to-Salesforce connector
    • Will need to gather more data about Thread’s salesforce installatio

Q: I want to help but this is pretty short notice so I'm not available this weekend? Can I still help?

A: Totally! We consider the hackathon to be a motivating/catalyzing/social occasion but I expect most of the work will occur over the next months and years. We want to help in a sustainable way, and want you to contribute in any way you can and would enjoy.

Q: I'm new / inexperienced / young / don't know PHP. Can I still help?

A: Yes! The main point of this exercise is to connect enthusiastic people to Thread to help them leverage technology as much as possible so they can get back to their core mission of helping kids.

Q: I'm a designer, can I help?

A: Yes! One of the things we can build is a nice standalone reporting tool that could be made more useful if it had a real designer behind it. Also there may be things about the current app that you think will increase engagement. Also, the "leaderboard" concept is pretty prototypical at this point. For it to be useful, it needs to look and feel right.

Q: I'm a tech writer, can I help?

A: Yes! One of our goals is to make the project easy to setup and administer for new volunteers and for Thread. The existing docs are awesome and we can build on that foundation.

Saturday, November 1, 2014

Notes from DC CTO summit

I really enjoyed the recent DC CTO summit. The talks were informative and there were so many of Baltimore-based CTOs that it also functioned as a Baltimore tech leadership networking event!

Here are some quick notes I took on things I want to tell my Staq colleagues about. There was a lot of other good stuff; this is me focusing on the things that apply to our company at this moment in history.
  • Joshua Szmajda showed off a really impressive use of a whiteboard for kanban. I think informal, analogue-based systems like this could make a huge difference in our team's ability to self-manage, just from being able to better visualize what projects are in progress and when they get stalled.
  • Joshua cited the kanban book Lean from the Trenches which sounds good. An audience member recommended for an online version of the whiteboard.
  • Quote: "Working software is the only metric"
  • A speaker cited unpublished but credible-sounding research showing that around the world, some software teams can complete the same project 50 times faster than others. 
    • Paul Barry pointed out to me that this doesn't mean that those "50X" teams are better at all facets of software development; all we know is they were 50X better at this one particular task.
    • Reminds me of Derek Sivers's advice on how to hire programmers
  • Edward Kim gave a great talk called "Hats are the new management", describing how he distributed small but important manager jobs to each member of his team. 
    • One job we definitely could use is "Bugs Captain": a person who monitors a Bugs chat room and ensures a first responder is assigned, and monitors the quality of the response. I definitely want to stand up a separate Bugs chat room.
    • Another job: rotating responsibility each week for manual QA. Edward's team forward-deploys someone from the dev organization to help the QA testers each week. Good way to get to know all parts of an app.
    • They have a dev blog hosted on medium - supervised by a person wearing the "Blog master hat"
    • It reminded me of how the Navy divvies up collateral duties: there's a whole separate structure within each chain of command to take care of all kinds of jobs that aren't formally part of a Sailor's billet.
  • Paul Barry recommended using Optimizely for A/B testing, and encouraged us to use A/B testing as a devops tool: use it to measure the impact of new features by rolling them out to subgroups of users
    • He also recommended using "canary" tools such as measuring the exit rate of certain pages: can help you find out when a certain group of users is having problems with a certain page
  • Andrew Montalenti presented an inside look at the daily routines of the parsely remote team. I like the idea of syncing every developer to a familiar weekly rhythm
    • Start the day with a #standup chat message explaining what you're planning to work on
    • End the day with a #sitdown message explaining what you accomplished, what you're stuck on
    • Monday: bug fixing and planning day
    • Tuesday: 30 minute (virtual) staff meeting to kick off the week
    • Tuesday noon through Friday noon: uninterrupted flow time. No meetings. All coding.
    • Friday at noon: demo time
    • Friday afternoon: tie up loose ends
    • No weekend work / rest and recover

Wednesday, October 29, 2014

Building talent the old-fashioned way at DC CTO summit

Yesterday I gave a talk at the DC Startup CTO summit called Building Talent the Old-Fashioned Way about last year's Staq Ruby Apprentice Program

It was my first time using showoff and  the results are a little mixed! But I used a lot of links and included a reading list, so if you're interested check 'em out!

Thursday, October 16, 2014

AWS Redshift Presentation Notes + CTO Summit

On Tuesday I spoke about our experiences using the Redshift database at Staq. I experimented with using mdp to present the visuals, with mixed results (it's definitely good for writing presentations quickly, especially if you're conversant in Markdown syntax).

I posted my outline which includes links to additional reading on Github. Hope it's helpful!

Also, I've been accepted as a speaker at the DC CTO Summit on 10/28. If you use the code mike_online when registering you get a $200 discount. (For that talk I'm thinking about trying tpp though I am having some ncurses issues on OS X)

Tuesday, September 9, 2014

Baltimore Innovation Week Kicks Off Friday

Baltimore Innovation Week 2014 starts on Friday. The schedule is pretty spectacular - if you care about cities and technology and innovation, you gotta be there!

Our event Ignite Baltimore is one of the events; tickets are sold out but we release a lot of waiting list tickets.

Monday, May 12, 2014

Fixing "SocketError: getaddrinfo: Name or service not known" with Ruby's resolv-replace.rb

Update 6/3/2014: there are other advantages to using a pure-Ruby DNS implementation.

Recently we had a problem with DNS lookups for a particular API that only afflicted our Heroku-based workers (host name changed to protect the innocent):

irb(main):009:0> Socket.gethostbyname("")
SocketError: getaddrinfo: Name or service not known

That line of code works fine in other places I tried, like my dev machine. The specific error had to do with a call that Ruby's net/http library was making. I filed a ticket with Heroku support using the above example, and they suggested I try using Ruby's Resolv library, something I had not encountered before. This post is a little breadcrumb to help others who may have the same problem.

Resolv uses Ruby code to do DNS lookups, instead of relying on the system's libc installation like gethostbyname does. Rather than having to monkeypatch net/http, all I had do to was add require "resolv-replace.rb" to our startup code which automatically added this fix. I never found out why the normal lookup process wasn't working on Heroku, but this worked. Thanks to the thoughtful soul who wrote resolv-replace.rb!

Friday, May 9, 2014

Looking for a Rubyist

Staq is growing fast. There is so much demand for our products that we need to add another developer to our team to keep up. If you are a Ruby programmer who has experience building large web apps, who is excited about working in a culture of delegated responsibility, who can help coach the rest of the team and help with system design, please get in touch!

We offer all of the usual startup perquisites: salary, plenty of equity, autonomy, and the opportunity to grow your career along with the company.

PS We also write a lot of JavaScript and even a smattering of Python.

Tuesday, March 25, 2014

How I Work

Technically Baltimore just did an interview with me about how I work. It was fun because I got to namecheck some of my favorite apps and practices. Check it out if you like to nerd out on tools and productivity! Excerpt below.

When you need to take a break, what are you turning to? 
My main escape is reading a lot of novels, especially science fiction. I also try to play a couple of the really immense AAA video games that come out each year (Arkham Origins was my winter obsession). Besides being really fun, there’s just so much creative stuff happening in games right now, I don’t want to miss out on the cultural moment (see my essay on the subject if interested and also Tom Bissell’s book “Extra Lives“). 
Oh also, if I get sick of reading, I try to get past level 15 of “Pixel Dungeon,” a truly excellent casual Android “roguelike” game. 
When driving or doing monotonous chores, I listen to a lot of comedy podcasts. My current favorites are Nerd Poker, Thrilling Adventure Hour, and The Andy Daly Podcast Pilot project.
The full interview is at Technically Baltimore.

Tuesday, March 4, 2014

Requiem for

I'm a little late to write about this, but it's taken awhile to get my thoughts together. I'm so crazy busy with Staq right now that I'm going to write fast.

Last month we learned that, one of my favorite Baltimore institutions, is going "on hiatus".  This news filled-me with sadness and I don't want the event to go by without remarking on it. brought a lot of vitality to the city. It felt like a uniquely Baltimore institution, something that other cities would eventually import from us. I can't think of another institution that cares about helping Baltimore develop innovative industries and people. There are plenty of foundations and non-profits around town that could argue with that statement, I suppose, but my answer to all of them would be: "yes, what you're doing is important, but you're only focused on this one small piece of the puzzle", or "you are too slow-moving and focused on top-down solutions to ever make much of an impact". That, to me, was the special competency of the - harnessing the grassroots/bottom-up energy of technologists and helping organizing it into a force for good in the city.

The general sense I get from my peers is "the tech community is self-organizing, so we didn't really need what those guys were doing" which I think is flat-out, dead wrong. It's true that Baltimore has many interesting, vibrant events, they're for the most part labors of love done by people who have other priorities besides making the city great, and they depend on the force of personality of a small group of hard-working volunteers. There still ought to be a team of people committed to growing these events and ensuring we don't lose momentum (something I called for back in 2011). For example, I helped run the first (and so far, only) RailsGirls event in Baltimore. I think we need to be doing 2 or 3 of those per year, given how long the waiting list for that event was...I just don't have the bandwidth to do it. Who is going to pick up that mantle? (Fortunately, Girl Develop It has come to Baltimore, but look at all the time that went by between RailsGirls and Girl Develop It). also developed deep relationships with different parts of the city - no one else was trying to connect the more entrepreneurial part of the tech community with the public sector, as exemplified by "Hack for Change Baltimore" which had strong city support. The city would not be trying to support more hackathons this year if not for's efforts. They've also provided free startup mentoring,  the "Baltimore Weekly" podcast, amazing "Tech Crawls", and many other valuable services.

I'm not sure if I'm making sense here. Maybe go read that Innovation Community Manager post I wrote in 2011 to get a sense of what we've lost.

It sounds like Betamore is going to try to provide a soft-landing for I feel skeptical of the idea but I really want it to succeed - I just think there's an inevitable mismatch between the mission of a for-profit company (even a mission-driven company like Betamore) and the social-good mission of the

Thank you to Jason Hardebeck, Andrew Hazlett, and Sharon Paley for all of their hard work over the past few years (along with all of the other people who built into what it was before their tenure). Your efforts made Baltimore a better place to do creative things, and we're poorer without you.

Thursday, February 20, 2014

Slides for Writing Clean, Concise, and Confident Ruby Code

Today I will be giving a talk at NET/WORK called Writing Clean, Concise, and Confident Ruby Code. Since it's very code-focused, I once again used Stefan Otte's presenting.vim. The slides (which include links to all of my references) are all up on Github.

I'm indebted to Avdi Grimm for providing much of the inspiration for this approach to Ruby, and to my Staq colleagues for letting me try out my armchair programming philosophy on them!

Monday, February 17, 2014

Web programming notes newsletter

I'm a voracious reader and student of programming. Being mostly self-trained, I consider myself very much a life-long journeyman programmer. So every week I send the dev team at Staq a few links I've come across in my researches along with a few links here and there that inform my leadership philosophy. I also throw in occasional commentary.

I decided to create a mailing list where anyone else who is interested in these links and thoughts could signup. The content will mostly involve web programming and startup life, with a focus on Ruby, JavaScript, and cloud-based services.

I promise you'll get one email per week, at most, usually on a Friday, and I'll never do anything with this list other than send you web programming notes. (My first startup was after all an email overload management company!) You can signup using this form:

powered by TinyLetter

I will also occasionally post the links to this blog (easy to do since TinyLetter makes a nice archive page of past emails). Below is a collection of the links I've sent to the team over the past year.

Monday, February 3, 2014

Staq's Ruby Apprentice Program Was a Great Success!

Back in September 2013 we announced Staq's apprentice program, where we offered paid work to novice Ruby programmers. Today we're announcing that we just completed the program by hiring four of the apprentices who went through the program as full-time software developers at Staq!
Me, my partner James (2nd from left) and the new developers
Over the fall and winter we fielded many questions about how the training went, whether we will do it again, and so on, so I thought the Internet might like to find out how everything worked out.

We received over 100 applications from around the world, many of which were from very well-qualified candidates. I was very surprised at the number of people who had a strong computer science and engineering backgrounds, who saw this a chance to jumpstart their careers or re-engage with programming after a period of time doing something else.

We selected 12 candidates to attend in-person training sessions at our office in Hampden. We conducted four sessions of two hours each where we dived right in and showed the students the guts of how Staq's data extraction technology works, along with the basics of Ruby and rspec. In retrospect, our syllabus was far too ambitious; the next time we do this we will just focus on using Ruby to write web-and-API scrapers using mechanize and typhoeus, along with a gentle introduction to CasperJS. I should have introduced Staq's proprietary framework later in the process.

This experience also opened my eyes to the importance of good documentation: we have written a lot of specialty code that would be a lot easier to understand with good in-line documentation. So now everything we write includes extensive YARD annotations.

I regret not having more resources and time to devote to the training, since we're still a small company at this point. The next time we do this, I want to involve a professional Ruby trainer who could give more structure and rigor to the program (are you reading this, Jeff Casimir?). It would also be cool to coordinate our efforts with Betamore Academy. I wish I had been able to prepare a more thoughtful syllabus, or present in a less harried, rapid-fire manner, but such are the exigencies of startup life.

We chose five students to become Ruby apprentices, based on their performance during the training classes. The apprentices started out as hourly, part-time employees, who scheduled their work hours around other commitments. We started weekly training sessions for them (which every programmer in the company began attending), but most of the training was hands-on. The apprentices made many heroic contributions to our company, cleaning up messes, digging into details, writing critical revenue-generating code, and exhibiting great professionalism in a demanding, low-supervision work environment.

The apprentices graduated in January and we made full-time job offers to all five of them. One graduate decided to move to New York, and got a great job offer with a well-known, successful software company.  The other four accepted.

We absolutely will do this again, but we've got to grow the business some more first. Watch this space for details!

Thursday, January 9, 2014

Rockstars, ninjas, and silent technical privilege

Technically Baltimore did a nice write up of my recent appearance on the podcast. One of the things we touched on was the continuing difficulties of tech companies with recruiting people and with attracting a more diverse set of people to the software industry. I think the best solution to both problems is for software companies to spend a lot more time and money on training people instead of trying to find the perfect person who's incredibly experienced. I plan to write more about the outcome of our own training program very soon (short answer: it worked out awesomely).

The Technically Baltimore article focuses on my off-the-cuff critique of passé, potentially harmful recruiting terms like "rockstar" and "ninja". I think that terminology unintentionally contributes to a culture of silent technical privilege that repels smart people who don't identify with those labels. The reporter also links to some further analysis of this problem, so please check out the writeup! And start using better recruiting language if you want to cast the widest net possible for talent.