Wednesday, November 19, 2014

Baltimore Hackathon Thread.org 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!

BACKGROUND

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.

PROBLEM 1: CAPTURE MORE INTERACTIONS AND LOCATION OF INTERACTIONS

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.”

PROBLEM 2: SALESFORCE INTEGRATION

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

PROBLEM 3: MAINTENANCE PLAN TO PROTECT AGAINST CODE ROT

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.

TECHNOLOGIES

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.

POTENTIAL HACKATHON PROJECTS
  • 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
FAQ

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 kanbanery.com 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("example.net")
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!